SidebarItem.vue 4.71 KB
Newer Older
耿迪迪's avatar
耿迪迪 committed
1 2 3 4 5
<template>
  <div v-if="!item.hidden">
    <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
yaqizhang's avatar
yaqizhang committed
6
          <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)"/><br>
7 8
          <!-- <item :title="onlyOneChild.meta.title" /> -->
          {{onlyOneChild.meta.title}}
耿迪迪's avatar
耿迪迪 committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
        </el-menu-item>
      </app-link>
    </template>

    <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
      <template slot="title">
        <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
      </template>
      <sidebar-item
        v-for="child in item.children"
        :key="child.path"
        :is-nest="true"
        :item="child"
        :base-path="resolvePath(child.path)"
        class="nest-menu"
      />
    </el-submenu>
  </div>
</template>

<script>
import path from 'path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug'

export default {
  name: 'SidebarItem',
  components: { Item, AppLink },
  mixins: [FixiOSBug],
  props: {
    // route object
    item: {
      type: Object,
      required: true
    },
    isNest: {
      type: Boolean,
      default: false
    },
    basePath: {
      type: String,
      default: ''
    }
  },
  data() {
    this.onlyOneChild = null
    return {}
  },
  methods: {
    hasOneShowingChild(children = [], parent) {
      if (!children) {
        children = [];
      }
      const showingChildren = children.filter(item => {
        if (item.hidden) {
          return false
        } else {
          // Temp set(will be used if only has one showing child)
          this.onlyOneChild = item
          return true
        }
      })

      // When there is only one child router, the child router is displayed by default
      if (showingChildren.length === 1) {
        return true
      }

      // Show parent if there are no child router to display
      if (showingChildren.length === 0) {
        this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
        return true
      }

      return false
    },
    resolvePath(routePath) {
      if (isExternal(routePath)) {
        return routePath
      }
      if (isExternal(this.basePath)) {
        return this.basePath
      }
      return path.resolve(this.basePath, routePath)
    }
  }
}
</script>
yaqizhang's avatar
yaqizhang committed
99 100
<style lang="scss">
  #app .sidebar-container .submenu-title-noDropdown:hover, #app .sidebar-container .el-submenu__title:hover {
yaqizhang's avatar
yaqizhang committed
101 102
    /* box-shadow: inset 2px 2px 20px #5CD9D4; */
    background: rgba(0, 0, 0, 0);
yaqizhang's avatar
yaqizhang committed
103 104 105 106 107 108
}
#app .sidebar-container .el-menu-item, #app .sidebar-container .el-submenu__title {
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    background: rgba(0, 0, 0, 0);
}
yaqizhang's avatar
yaqizhang committed
109
.el-menu-item:hover {
yaqizhang's avatar
yaqizhang committed
110
    outline: none;
yaqizhang's avatar
yaqizhang committed
111 112 113 114
    background-image: url("../../../assets/logo/item-background.png");
    background-repeat: no-repeat;
    background-size: 100% 100%;
    /* background: rgba(0, 0, 0, 0); */
yaqizhang's avatar
yaqizhang committed
115 116 117 118 119 120 121 122 123
    color: #31EAEA !important;
}
.el-menu-item:focus,.is-active  {
    outline: none;
    background-image: url("../../../assets/logo/item-background.png");
    background-repeat: no-repeat;
    background-size: 100% 100%;
    /* background: rgba(0, 0, 0, 0); */
    color: #31EAEA !important;
yaqizhang's avatar
yaqizhang committed
124
}
yaqizhang's avatar
yaqizhang committed
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
.el-menu--horizontal > .el-submenu .el-submenu__title:hover {
    background-color: rgba(0, 0, 0, 0);
    color: #fff;
    background-image: url("../../../assets/logo/item-background.png");
    background-repeat: no-repeat;
    background-size: 100% 100%;
}
.el-menu--horizontal > .el-submenu .el-submenu__title {
    height: 50px !important;
    line-height: 50px !important;
    margin-top: 15px;
    font-size: 22px;
    font-weight: 600;
    color: #fff;
}
.el-menu--horizontal > .el-submenu:focus .el-submenu__title, .el-menu--horizontal > .el-submenu:hover .el-submenu__title {
    color: #fff;
}
.el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
    border-bottom: 0px solid;
    color: #fff;
}
.el-submenu__title i {
    color: #fff;
}
.el-menu--horizontal .el-menu .el-menu-item, .el-menu--horizontal .el-menu .el-submenu__title {
    background-color: #053B6A;
    float: none;
    height: 36px;
    line-height: 36px;
    padding: 0;
    color: #fff;
}
.el-menu--popup {
    z-index: 100;
    min-width: 120px;
    border: none;
    padding: 5px;
    border-radius: 2px;
    -webkit-box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
    box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
    background-color: #053B6A;
}
yaqizhang's avatar
yaqizhang committed
168
</style>