index.vue 5.62 KB
<template>
  <div class="d2-multiple-page-control-group" flex>
    <div class="d2-multiple-page-control-content" flex-box="1">
      <div class="d2-multiple-page-control-content-inner">
        <d2-contextmenu
          :visible.sync="contextmenuFlag"
          :x="contentmenuX"
          :y="contentmenuY">
          <d2-contextmenu-list
            :menulist="tagName === '/index' ? contextmenuListIndex : contextmenuList"
            @rowClick="contextmenuClick"/>
        </d2-contextmenu>
        <el-tabs
          class="d2-multiple-page-control d2-multiple-page-sort"
          :value="current"
          type="card"
          :closable="true"
          @tab-click="handleClick"
          @edit="handleTabsEdit"
          @contextmenu.native="handleContextmenu">
          <el-tab-pane
            v-for="page in opened"
            :key="page.fullPath"
            :label="page.meta.title || '未命名'"
            :name="page.fullPath"/>
        </el-tabs>
      </div>
    </div>
    <div
      class="d2-multiple-page-control-btn"
      flex-box="0">
      <el-dropdown
        size="default"
        split-button
        @click="closeAll"
        @command="command => handleControlItemClick(command)">
        <d2-icon name="times-circle"/>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item command="left">
            <d2-icon name="arrow-left" class="d2-mr-10"/>
            关闭左侧
          </el-dropdown-item>
          <el-dropdown-item command="right">
            <d2-icon name="arrow-right" class="d2-mr-10"/>
            关闭右侧
          </el-dropdown-item>
          <el-dropdown-item command="other">
            <d2-icon name="times" class="d2-mr-10"/>
            关闭其它
          </el-dropdown-item>
          <el-dropdown-item command="all">
            <d2-icon name="times-circle" class="d2-mr-10"/>
            全部关闭
          </el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
  </div>
</template>

<script>
  import {mapState, mapActions} from 'vuex'
  import Sortable from 'sortablejs'

  export default {
    components: {
      D2Contextmenu: () => import('../contextmenu'),
      D2ContextmenuList: () => import('../contextmenu/components/contentmenuList')
    },
    data() {
      return {
        contextmenuFlag: false,
        contentmenuX: 0,
        contentmenuY: 0,
        contextmenuListIndex: [
          {icon: 'times-circle', title: '关闭全部', value: 'all'}
        ],
        contextmenuList: [
          {icon: 'arrow-left', title: '关闭左侧', value: 'left'},
          {icon: 'arrow-right', title: '关闭右侧', value: 'right'},
          {icon: 'times', title: '关闭其它', value: 'other'},
          {icon: 'times-circle', title: '关闭全部', value: 'all'}
        ],
        tagName: '/index'
      }
    },
    computed: {
      ...mapState('d2admin/page', [
        'opened',
        'current'
      ])
    },
    methods: {
      ...mapActions('d2admin/page', [
        'close',
        'closeLeft',
        'closeRight',
        'closeOther',
        'closeAll',
        'openedSort'
      ]),
      /**
       * @description 右键菜单功能点击
       */
      handleContextmenu(event) {
        let target = event.target
        // 解决 https://github.com/d2-projects/d2-admin/issues/54
        let flag = false
        if (target.className.indexOf('el-tabs__item') > -1) flag = true
        else if (target.parentNode.className.indexOf('el-tabs__item') > -1) {
          target = target.parentNode
          flag = true
        }
        if (flag) {
          event.preventDefault()
          event.stopPropagation()
          this.contentmenuX = event.clientX
          this.contentmenuY = event.clientY
          this.tagName = target.getAttribute('aria-controls').slice(5)
          this.contextmenuFlag = true
        }
      },
      /**
       * @description 右键菜单的row-click事件
       */
      contextmenuClick(command) {
        this.handleControlItemClick(command, this.tagName)
      },
      /**
       * @description 接收点击关闭控制上选项的事件
       */
      handleControlItemClick(command, tagName = null) {
        if (tagName) {
          this.contextmenuFlag = false
        }
        const params = {
          pageSelect: tagName
        }
        switch (command) {
          case 'left':
            this.closeLeft(params)
            break
          case 'right':
            this.closeRight(params)
            break
          case 'other':
            this.closeOther(params)
            break
          case 'all':
            this.closeAll()
            break
          default:
            this.$message.error('无效的操作')
            break
        }
      },
      /**
       * @description 接收点击 tab 标签的事件
       */
      handleClick(tab, event) {
        // 找到点击的页面在 tag 列表里是哪个
        const page = this.opened.find(page => page.fullPath === tab.name)
        const {name, params, query} = page
        if (page) {
          this.$router.push({name, params, query})
        }
      },
      /**
       * @description 点击 tab 上的删除按钮触发这里 首页的删除按钮已经隐藏 因此这里不用判断是 index
       */
      handleTabsEdit(tagName, action) {
        if (action === 'remove') {
          this.close({
            tagName
          })
        }
      }
    },
    mounted() {
      const el = document.querySelectorAll('.d2-multiple-page-sort .el-tabs__nav')[0]
      Sortable.create(el, {
        onEnd: (evt) => {
          const {oldIndex, newIndex} = evt
          this.openedSort({oldIndex, newIndex})
        }
      })
    }
  }
</script>