| | |
| | | <template> |
| | | <div class="avue-tags" |
| | | v-if="showTag"> |
| | | <!-- tag盒子 --> |
| | | <div v-if="contextmenuFlag" |
| | | class="avue-tags__contentmenu" |
| | | :style="{left:contentmenuX+'px',top:contentmenuY+'px'}"> |
| | | <div class="item" |
| | | @click="clearCacheTags">{{$t('tagsView.clearCache')}} |
| | | </div> |
| | | <div class="item" |
| | | @click="closeOthersTags">{{$t('tagsView.closeOthers')}} |
| | | </div> |
| | | <div class="item" |
| | | @click="closeAllTags">{{$t('tagsView.closeAll')}} |
| | | </div> |
| | | </div> |
| | | <div class="avue-tags__box" |
| | | :class="{'avue-tags__box--close':!website.isFirstPage}"> |
| | | <el-tabs v-model="active" |
| | | type="card" |
| | | @contextmenu.native="handleContextmenu" |
| | | :closable="tagLen!==1" |
| | | @tab-click="openTag" |
| | | @edit="menuTag"> |
| | | <el-tab-pane :key="item.value" |
| | | v-for="item in tagList" |
| | | :label="generateTitle(item)" |
| | | :name="item.value"> |
| | | </el-tab-pane> |
| | | <div class="avue-tags" v-if="showTag"> |
| | | <!-- tag盒子 --> |
| | | <div v-if="contextmenuFlag" class="avue-tags__contentmenu" |
| | | :style="{ left: contentmenuX + 'px', top: contentmenuY + 'px' }"> |
| | | <div class="item" @click="clearCacheTags">{{ $t('tagsView.clearCache') }} |
| | | </div> |
| | | <div class="item" @click="closeOthersTags">{{ $t('tagsView.closeOthers') }} |
| | | </div> |
| | | <div class="item" @click="closeAllTags">{{ $t('tagsView.closeAll') }} |
| | | </div> |
| | | </div> |
| | | <div class="avue-tags__box" :class="{ 'avue-tags__box--close': !website.isFirstPage }"> |
| | | <el-tabs v-model="active" type="card" @contextmenu.native="handleContextmenu" :closable="tagLen !== 1" |
| | | @tab-click="openTag" @edit="menuTag"> |
| | | <el-tab-pane :key="item.value" v-for="item in tagList" :label="generateTitle(item)" :name="item.value"> |
| | | </el-tab-pane> |
| | | |
| | | </el-tabs> |
| | | <el-dropdown class="avue-tags__menu"> |
| | | <el-button type="primary" |
| | | size="mini"> |
| | | {{$t('tagsView.menu')}} |
| | | <i class="el-icon-arrow-down el-icon--right"></i> |
| | | </el-button> |
| | | <el-dropdown-menu slot="dropdown"> |
| | | <el-dropdown-item @click.native="$parent.isSearch=true">{{$t('tagsView.search')}}</el-dropdown-item> |
| | | <el-dropdown-item @click.native="closeOthersTags">{{$t('tagsView.closeOthers')}}</el-dropdown-item> |
| | | <el-dropdown-item @click.native="closeAllTags">{{$t('tagsView.closeAll')}}</el-dropdown-item> |
| | | <el-dropdown-item @click.native="clearCacheTags">{{$t('tagsView.clearCache')}}</el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </el-dropdown> |
| | | </el-tabs> |
| | | <el-dropdown class="avue-tags__menu"> |
| | | <el-button type="primary" size="mini"> |
| | | {{ $t('tagsView.menu') }} |
| | | <i class="el-icon-arrow-down el-icon--right"></i> |
| | | </el-button> |
| | | <el-dropdown-menu slot="dropdown"> |
| | | <el-dropdown-item @click.native="$parent.isSearch = true">{{ $t('tagsView.search') }}</el-dropdown-item> |
| | | <el-dropdown-item @click.native="closeOthersTags">{{ $t('tagsView.closeOthers') }}</el-dropdown-item> |
| | | <el-dropdown-item @click.native="closeAllTags">{{ $t('tagsView.closeAll') }}</el-dropdown-item> |
| | | <el-dropdown-item @click.native="clearCacheTags">{{ $t('tagsView.clearCache') }}</el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </el-dropdown> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import {mapGetters, mapState} from "vuex"; |
| | | import {clearCache} from "@/api/user"; |
| | | import { mapGetters, mapState } from "vuex" |
| | | import { clearCache } from "@/api/user" |
| | | |
| | | export default { |
| | | export default { |
| | | name: "tags", |
| | | data() { |
| | | return { |
| | | active: "", |
| | | contentmenuX: "", |
| | | contentmenuY: "", |
| | | contextmenuFlag: false |
| | | }; |
| | | data () { |
| | | return { |
| | | active: "", |
| | | contentmenuX: "", |
| | | contentmenuY: "", |
| | | contextmenuFlag: false |
| | | } |
| | | }, |
| | | created() { |
| | | created () { |
| | | }, |
| | | mounted() { |
| | | this.setActive(); |
| | | mounted () { |
| | | this.setActive() |
| | | }, |
| | | watch: { |
| | | tag() { |
| | | this.setActive(); |
| | | }, |
| | | contextmenuFlag() { |
| | | window.addEventListener("mousedown", this.watchContextmenu); |
| | | } |
| | | tag () { |
| | | this.setActive() |
| | | }, |
| | | contextmenuFlag () { |
| | | window.addEventListener("mousedown", this.watchContextmenu) |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapGetters(["tagWel", "tagList", "tag", "website"]), |
| | | ...mapState({ |
| | | showTag: state => state.common.showTag |
| | | }), |
| | | tagLen() { |
| | | return this.tagList.length || 0; |
| | | } |
| | | ...mapGetters(["tagWel", "tagList", "tag", "website", "homeFirstPage"]), |
| | | ...mapState({ |
| | | showTag: state => state.common.showTag |
| | | }), |
| | | tagLen () { |
| | | return this.tagList.length || 0 |
| | | } |
| | | }, |
| | | methods: { |
| | | generateTitle(item) { |
| | | return this.$router.$avueRouter.generateTitle( |
| | | item.label, |
| | | (item.meta || {}).i18n |
| | | ); |
| | | }, |
| | | watchContextmenu(event) { |
| | | if (!this.$el.contains(event.target) || event.button !== 0) { |
| | | this.contextmenuFlag = false; |
| | | generateTitle (item) { |
| | | return this.$router.$avueRouter.generateTitle( |
| | | item.label, |
| | | (item.meta || {}).i18n |
| | | ) |
| | | }, |
| | | watchContextmenu (event) { |
| | | if (!this.$el.contains(event.target) || event.button !== 0) { |
| | | this.contextmenuFlag = false |
| | | } |
| | | window.removeEventListener("mousedown", this.watchContextmenu) |
| | | }, |
| | | 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 |
| | | } |
| | | }, |
| | | //激活当前选项 |
| | | setActive () { |
| | | this.active = this.tag.value |
| | | }, |
| | | menuTag (value, action) { |
| | | if (action === "remove") { |
| | | let { tag, key } = this.findTag(value) |
| | | this.$store.commit("DEL_TAG", tag) |
| | | if (tag.value === this.tag.value) { |
| | | tag = this.tagList[key === 0 ? key : key - 1] //如果关闭本标签让前推一个 |
| | | this.openTag(tag) |
| | | } |
| | | } |
| | | }, |
| | | openTag (item) { |
| | | let tag |
| | | if (item.name) { |
| | | tag = this.findTag(item.name).tag |
| | | } else { |
| | | tag = item |
| | | } |
| | | this.$router.push({ |
| | | path: this.$router.$avueRouter.getPath({ |
| | | name: tag.label, |
| | | src: tag.value |
| | | }, tag.meta), |
| | | query: tag.query |
| | | }) |
| | | }, |
| | | closeOthersTags () { |
| | | this.contextmenuFlag = false |
| | | this.$store.commit("DEL_TAG_OTHER") |
| | | }, |
| | | findTag (value) { |
| | | let tag, key |
| | | this.tagList.map((item, index) => { |
| | | if (item.value === value) { |
| | | tag = item |
| | | key = index |
| | | } |
| | | }) |
| | | return { tag: tag, key: key } |
| | | }, |
| | | closeAllTags () { |
| | | this.contextmenuFlag = false |
| | | this.$store.commit("DEL_ALL_TAG") |
| | | this.$router.push({ path: this.homeFirstPage }) |
| | | }, |
| | | clearCacheTags () { |
| | | this.$confirm("是否需要清除缓存?", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }).then(() => { |
| | | clearCache().then(() => { |
| | | this.contextmenuFlag = false |
| | | this.$message.success('清除完毕') |
| | | }) |
| | | }) |
| | | } |
| | | window.removeEventListener("mousedown", this.watchContextmenu); |
| | | }, |
| | | 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; |
| | | } |
| | | }, |
| | | //激活当前选项 |
| | | setActive() { |
| | | this.active = this.tag.value; |
| | | }, |
| | | menuTag(value, action) { |
| | | if (action === "remove") { |
| | | let {tag, key} = this.findTag(value); |
| | | this.$store.commit("DEL_TAG", tag); |
| | | if (tag.value === this.tag.value) { |
| | | tag = this.tagList[key === 0 ? key : key - 1]; //如果关闭本标签让前推一个 |
| | | this.openTag(tag); |
| | | } |
| | | } |
| | | }, |
| | | openTag(item) { |
| | | let tag; |
| | | if (item.name) { |
| | | tag = this.findTag(item.name).tag; |
| | | } else { |
| | | tag = item; |
| | | } |
| | | this.$router.push({ |
| | | path: this.$router.$avueRouter.getPath({ |
| | | name: tag.label, |
| | | src: tag.value |
| | | }, tag.meta), |
| | | query: tag.query |
| | | }); |
| | | }, |
| | | closeOthersTags() { |
| | | this.contextmenuFlag = false; |
| | | this.$store.commit("DEL_TAG_OTHER"); |
| | | }, |
| | | findTag(value) { |
| | | let tag, key; |
| | | this.tagList.map((item, index) => { |
| | | if (item.value === value) { |
| | | tag = item; |
| | | key = index; |
| | | } |
| | | }); |
| | | return {tag: tag, key: key}; |
| | | }, |
| | | closeAllTags() { |
| | | this.contextmenuFlag = false; |
| | | this.$store.commit("DEL_ALL_TAG"); |
| | | this.$router.push({ |
| | | path: this.$router.$avueRouter.getPath({ |
| | | src: this.tagWel.value |
| | | }), |
| | | query: this.tagWel.query |
| | | }); |
| | | }, |
| | | clearCacheTags() { |
| | | this.$confirm("是否需要清除缓存?", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }).then(() => { |
| | | clearCache().then(() => { |
| | | this.contextmenuFlag = false; |
| | | this.$message.success('清除完毕'); |
| | | }) |
| | | }); |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | </script> |
| | | |
| | | |