| 1 | {"remainingRequest":"C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\src\\layout\\components\\TagsView\\index.vue?vue&type=script&lang=js&","dependencies":[{"path":"C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\src\\layout\\components\\TagsView\\index.vue","mtime":1647228900695},{"path":"C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\最新\\supervision-ui\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgU2Nyb2xsUGFuZSBmcm9tICcuL1Njcm9sbFBhbmUnDQppbXBvcnQgcGF0aCBmcm9tICdwYXRoJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIGNvbXBvbmVudHM6IHsgU2Nyb2xsUGFuZSB9LA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICB2aXNpYmxlOiBmYWxzZSwNCiAgICAgIHRvcDogMCwNCiAgICAgIGxlZnQ6IDAsDQogICAgICBzZWxlY3RlZFRhZzoge30sDQogICAgICBhZmZpeFRhZ3M6IFtdDQogICAgfQ0KICB9LA0KICBjb21wdXRlZDogew0KICAgIHZpc2l0ZWRWaWV3cygpIHsNCiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5zdGF0ZS50YWdzVmlldy52aXNpdGVkVmlld3MNCiAgICB9LA0KICAgIHJvdXRlcygpIHsNCiAgICAgIHJldHVybiB0aGlzLiRzdG9yZS5zdGF0ZS5wZXJtaXNzaW9uLnJvdXRlcw0KICAgIH0sDQogICAgdGhlbWUoKSB7DQogICAgICByZXR1cm4gdGhpcy4kc3RvcmUuc3RhdGUuc2V0dGluZ3MudGhlbWU7DQogICAgfQ0KICB9LA0KICB3YXRjaDogew0KICAgICRyb3V0ZSgpIHsNCiAgICAgIHRoaXMuYWRkVGFncygpDQogICAgICB0aGlzLm1vdmVUb0N1cnJlbnRUYWcoKQ0KICAgIH0sDQogICAgdmlzaWJsZSh2YWx1ZSkgew0KICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsb3NlTWVudSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsb3NlTWVudSkNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5pbml0VGFncygpDQogICAgdGhpcy5hZGRUYWdzKCkNCiAgICAgY29uc29sZS5sb2coKQ0KICB9LA0KICBtZXRob2RzOiB7DQogICAgaXNBY3RpdmUocm91dGUpIHsNCiAgICAgIHJldHVybiByb3V0ZS5wYXRoID09PSB0aGlzLiRyb3V0ZS5wYXRoDQogICAgfSwNCiAgICBhY3RpdmVTdHlsZSh0YWcpIHsNCiAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSh0YWcpKSByZXR1cm4ge307DQogICAgICByZXR1cm4gew0KICAgICAgICAiYmFja2dyb3VuZC1jb2xvciI6IHRoaXMudGhlbWUsDQogICAgICAgICJib3JkZXItY29sb3IiOiB0aGlzLnRoZW1lDQogICAgICB9Ow0KICAgIH0sDQogICAgaXNBZmZpeCh0YWcpIHsNCiAgICAgIHJldHVybiB0YWcubWV0YSAmJiB0YWcubWV0YS5hZmZpeA0KICAgIH0sDQogICAgaXNGaXJzdFZpZXcoKSB7DQogICAgICB0cnkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhZy5mdWxsUGF0aCA9PT0gdGhpcy52aXNpdGVkVmlld3NbMV0uZnVsbFBhdGggfHwgdGhpcy5zZWxlY3RlZFRhZy5mdWxsUGF0aCA9PT0gJy9pbmRleCcNCiAgICAgIH0gY2F0Y2ggKGVycikgew0KICAgICAgICByZXR1cm4gZmFsc2UNCiAgICAgIH0NCiAgICB9LA0KICAgIGlzTGFzdFZpZXcoKSB7DQogICAgICB0cnkgew0KICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhZy5mdWxsUGF0aCA9PT0gdGhpcy52aXNpdGVkVmlld3NbdGhpcy52aXNpdGVkVmlld3MubGVuZ3RoIC0gMV0uZnVsbFBhdGgNCiAgICAgIH0gY2F0Y2ggKGVycikgew0KICAgICAgICByZXR1cm4gZmFsc2UNCiAgICAgIH0NCiAgICB9LA0KICAgIGZpbHRlckFmZml4VGFncyhyb3V0ZXMsIGJhc2VQYXRoID0gJy8nKSB7DQogICAgICBsZXQgdGFncyA9IFtdDQogICAgICByb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiB7DQogICAgICAgIGlmIChyb3V0ZS5tZXRhICYmIHJvdXRlLm1ldGEuYWZmaXgpIHsNCiAgICAgICAgICBjb25zdCB0YWdQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VQYXRoLCByb3V0ZS5wYXRoKQ0KICAgICAgICAgIHRhZ3MucHVzaCh7DQogICAgICAgICAgICBmdWxsUGF0aDogdGFnUGF0aCwNCiAgICAgICAgICAgIHBhdGg6IHRhZ1BhdGgsDQogICAgICAgICAgICBuYW1lOiByb3V0ZS5uYW1lLA0KICAgICAgICAgICAgbWV0YTogeyAuLi5yb3V0ZS5tZXRhIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikgew0KICAgICAgICAgIGNvbnN0IHRlbXBUYWdzID0gdGhpcy5maWx0ZXJBZmZpeFRhZ3Mocm91dGUuY2hpbGRyZW4sIHJvdXRlLnBhdGgpDQogICAgICAgICAgaWYgKHRlbXBUYWdzLmxlbmd0aCA+PSAxKSB7DQogICAgICAgICAgICB0YWdzID0gWy4uLnRhZ3MsIC4uLnRlbXBUYWdzXQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIHJldHVybiB0YWdzDQogICAgfSwNCiAgICBpbml0VGFncygpIHsNCiAgICAgIGNvbnN0IGFmZml4VGFncyA9IHRoaXMuYWZmaXhUYWdzID0gdGhpcy5maWx0ZXJBZmZpeFRhZ3ModGhpcy5yb3V0ZXMpDQogICAgICBmb3IgKGNvbnN0IHRhZyBvZiBhZmZpeFRhZ3MpIHsNCiAgICAgICAgLy8gTXVzdCBoYXZlIHRhZyBuYW1lDQogICAgICAgIGlmICh0YWcubmFtZSkgew0KICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCd0YWdzVmlldy9hZGRWaXNpdGVkVmlldycsIHRhZykNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgYWRkVGFncygpIHsNCiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy4kcm91dGUNCiAgICAgIGlmIChuYW1lKSB7DQogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCd0YWdzVmlldy9hZGRWaWV3JywgdGhpcy4kcm91dGUpDQogICAgICB9DQogICAgICByZXR1cm4gZmFsc2UNCiAgICB9LA0KICAgIG1vdmVUb0N1cnJlbnRUYWcoKSB7DQogICAgICBjb25zdCB0YWdzID0gdGhpcy4kcmVmcy50YWcNCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsNCiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykgew0KICAgICAgICAgIGlmICh0YWcudG8ucGF0aCA9PT0gdGhpcy4kcm91dGUucGF0aCkgew0KICAgICAgICAgICAgdGhpcy4kcmVmcy5zY3JvbGxQYW5lLm1vdmVUb1RhcmdldCh0YWcpDQogICAgICAgICAgICAvLyB3aGVuIHF1ZXJ5IGlzIGRpZmZlcmVudCB0aGVuIHVwZGF0ZQ0KICAgICAgICAgICAgaWYgKHRhZy50by5mdWxsUGF0aCAhPT0gdGhpcy4kcm91dGUuZnVsbFBhdGgpIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3RhZ3NWaWV3L3VwZGF0ZVZpc2l0ZWRWaWV3JywgdGhpcy4kcm91dGUpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhaw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9LA0KICAgIHJlZnJlc2hTZWxlY3RlZFRhZyh2aWV3KSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndGFnc1ZpZXcvZGVsQ2FjaGVkVmlldycsIHZpZXcpLnRoZW4oKCkgPT4gew0KICAgICAgICAvLyBjb25zdCB7IGZ1bGxQYXRoIH0gPSB2aWV3DQogICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZSh7DQogICAgICAgICAgICAvLyBwYXRoOiAnL3JlZGlyZWN0JyArIGZ1bGxQYXRoDQogICAgICAgICAgICBwYXRoOiAnL2luZGV4Jw0KICAgICAgICAgIH0pDQogICAgICAgIH0pDQogICAgICB9KQ0KICAgIH0sDQogICAgY2xvc2VTZWxlY3RlZFRhZyh2aWV3KSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndGFnc1ZpZXcvZGVsVmlldycsIHZpZXcpLnRoZW4oKHsgdmlzaXRlZFZpZXdzIH0pID0+IHsNCiAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUodmlldykpIHsNCiAgICAgICAgICB0aGlzLnRvTGFzdFZpZXcodmlzaXRlZFZpZXdzLCB2aWV3KQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgY2xvc2VSaWdodFRhZ3MoKSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndGFnc1ZpZXcvZGVsUmlnaHRUYWdzJywgdGhpcy5zZWxlY3RlZFRhZykudGhlbih2aXNpdGVkVmlld3MgPT4gew0KICAgICAgICBpZiAoIXZpc2l0ZWRWaWV3cy5maW5kKGkgPT4gaS5mdWxsUGF0aCA9PT0gdGhpcy4kcm91dGUuZnVsbFBhdGgpKSB7DQogICAgICAgICAgdGhpcy50b0xhc3RWaWV3KHZpc2l0ZWRWaWV3cykNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGNsb3NlTGVmdFRhZ3MoKSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndGFnc1ZpZXcvZGVsTGVmdFRhZ3MnLCB0aGlzLnNlbGVjdGVkVGFnKS50aGVuKHZpc2l0ZWRWaWV3cyA9PiB7DQogICAgICAgIGlmICghdmlzaXRlZFZpZXdzLmZpbmQoaSA9PiBpLmZ1bGxQYXRoID09PSB0aGlzLiRyb3V0ZS5mdWxsUGF0aCkpIHsNCiAgICAgICAgICB0aGlzLnRvTGFzdFZpZXcodmlzaXRlZFZpZXdzKQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgY2xvc2VPdGhlcnNUYWdzKCkgew0KICAgICAgdGhpcy4kcm91dGVyLnB1c2godGhpcy5zZWxlY3RlZFRhZykuY2F0Y2goKCk9Pnt9KTsNCiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCd0YWdzVmlldy9kZWxPdGhlcnNWaWV3cycsIHRoaXMuc2VsZWN0ZWRUYWcpLnRoZW4oKCkgPT4gew0KICAgICAgICB0aGlzLm1vdmVUb0N1cnJlbnRUYWcoKQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGNsb3NlQWxsVGFncyh2aWV3KSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgndGFnc1ZpZXcvZGVsQWxsVmlld3MnKS50aGVuKCh7IHZpc2l0ZWRWaWV3cyB9KSA9PiB7DQogICAgICAgIGlmICh0aGlzLmFmZml4VGFncy5zb21lKHRhZyA9PiB0YWcucGF0aCA9PT0gdGhpcy4kcm91dGUucGF0aCkpIHsNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnRvTGFzdFZpZXcodmlzaXRlZFZpZXdzLCB2aWV3KQ0KICAgICAgfSkNCiAgICB9LA0KICAgIHRvTGFzdFZpZXcodmlzaXRlZFZpZXdzLCB2aWV3KSB7DQogICAgICBjb25zdCBsYXRlc3RWaWV3ID0gdmlzaXRlZFZpZXdzLnNsaWNlKC0xKVswXQ0KICAgICAgaWYgKGxhdGVzdFZpZXcpIHsNCiAgICAgICAgdGhpcy4kcm91dGVyLnB1c2gobGF0ZXN0Vmlldy5mdWxsUGF0aCkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIC8vIG5vdyB0aGUgZGVmYXVsdCBpcyB0byByZWRpcmVjdCB0byB0aGUgaG9tZSBwYWdlIGlmIHRoZXJlIGlzIG5vIHRhZ3MtdmlldywNCiAgICAgICAgLy8geW91IGNhbiBhZGp1c3QgaXQgYWNjb3JkaW5nIHRvIHlvdXIgbmVlZHMuDQogICAgICAgIGlmICh2aWV3Lm5hbWUgPT09ICdEYXNoYm9hcmQnKSB7DQogICAgICAgICAgLy8gdG8gcmVsb2FkIGhvbWUgcGFnZQ0KICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgcGF0aDogJy9yZWRpcmVjdCcgKyB2aWV3LmZ1bGxQYXRoIH0pDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy8nKQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICBvcGVuTWVudSh0YWcsIGUpIHsNCiAgICAgIGNvbnN0IG1lbnVNaW5XaWR0aCA9IDEwNQ0KICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLy8gY29udGFpbmVyIG1hcmdpbiBsZWZ0DQogICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHRoaXMuJGVsLm9mZnNldFdpZHRoIC8vIGNvbnRhaW5lciB3aWR0aA0KICAgICAgY29uc3QgbWF4TGVmdCA9IG9mZnNldFdpZHRoIC0gbWVudU1pbldpZHRoIC8vIGxlZnQgYm91bmRhcnkNCiAgICAgIGNvbnN0IGxlZnQgPSBlLmNsaWVudFggLSBvZmZzZXRMZWZ0ICsgMTUgLy8gMTU6IG1hcmdpbiByaWdodA0KDQogICAgICBpZiAobGVmdCA+IG1heExlZnQpIHsNCiAgICAgICAgdGhpcy5sZWZ0ID0gbWF4TGVmdA0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdA0KICAgICAgfQ0KDQogICAgICB0aGlzLnRvcCA9IGUuY2xpZW50WQ0KICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZQ0KICAgICAgdGhpcy5zZWxlY3RlZFRhZyA9IHRhZw0KICAgIH0sDQogICAgY2xvc2VNZW51KCkgew0KICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2UNCiAgICB9LA0KICAgIGhhbmRsZVNjcm9sbCgpIHsNCiAgICAgIHRoaXMuY2xvc2VNZW51KCkNCiAgICB9DQogIH0NCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/layout/components/TagsView","sourcesContent":["<template>\r\n  <div id=\"tags-view-container\" class=\"tags-view-container\">\r\n    <scroll-pane ref=\"scrollPane\" class=\"tags-view-wrapper\" @scroll=\"handleScroll\">\r\n      <router-link\r\n        v-for=\"tag in visitedViews\"\r\n        ref=\"tag\"\r\n        :key=\"tag.path\"\r\n        :class=\"isActive(tag)?'active':''\"\r\n        :to=\"{ path: tag.path, query: tag.query, fullPath: tag.fullPath }\"\r\n        tag=\"span\"\r\n        class=\"tags-view-item\"\r\n        :style=\"activeStyle(tag)\"\r\n        @click.middle.native=\"!isAffix(tag)?closeSelectedTag(tag):''\"\r\n        @contextmenu.prevent.native=\"openMenu(tag,$event)\"\r\n      >\r\n        {{ tag.title }}\r\n        <span v-if=\"!isAffix(tag)\" class=\"el-icon-close\" @click.prevent.stop=\"closeSelectedTag(tag)\" />\r\n      </router-link>\r\n    </scroll-pane>\r\n    <ul v-show=\"visible\" :style=\"{left:left+'px',top:top+'px'}\" class=\"contextmenu\">\r\n      <li @click=\"refreshSelectedTag(selectedTag)\"><i class=\"el-icon-refresh-right\"></i> 刷新页面</li>\r\n      <li v-if=\"!isAffix(selectedTag)\" @click=\"closeSelectedTag(selectedTag)\"><i class=\"el-icon-close\"></i> 关闭当前</li>\r\n      <li @click=\"closeOthersTags\"><i class=\"el-icon-circle-close\"></i> 关闭其他</li>\r\n      <li v-if=\"!isFirstView()\" @click=\"closeLeftTags\"><i class=\"el-icon-back\"></i> 关闭左侧</li>\r\n      <li v-if=\"!isLastView()\" @click=\"closeRightTags\"><i class=\"el-icon-right\"></i> 关闭右侧</li>\r\n      <li @click=\"closeAllTags(selectedTag)\"><i class=\"el-icon-circle-close\"></i> 全部关闭</li>\r\n    </ul>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport ScrollPane from './ScrollPane'\r\nimport path from 'path'\r\n\r\nexport default {\r\n  components: { ScrollPane },\r\n  data() {\r\n    return {\r\n      visible: false,\r\n      top: 0,\r\n      left: 0,\r\n      selectedTag: {},\r\n      affixTags: []\r\n    }\r\n  },\r\n  computed: {\r\n    visitedViews() {\r\n      return this.$store.state.tagsView.visitedViews\r\n    },\r\n    routes() {\r\n      return this.$store.state.permission.routes\r\n    },\r\n    theme() {\r\n      return this.$store.state.settings.theme;\r\n    }\r\n  },\r\n  watch: {\r\n    $route() {\r\n      this.addTags()\r\n      this.moveToCurrentTag()\r\n    },\r\n    visible(value) {\r\n      if (value) {\r\n        document.body.addEventListener('click', this.closeMenu)\r\n      } else {\r\n        document.body.removeEventListener('click', this.closeMenu)\r\n      }\r\n    }\r\n  },\r\n  mounted() {\r\n    this.initTags()\r\n    this.addTags()\r\n     console.log()\r\n  },\r\n  methods: {\r\n    isActive(route) {\r\n      return route.path === this.$route.path\r\n    },\r\n    activeStyle(tag) {\r\n      if (!this.isActive(tag)) return {};\r\n      return {\r\n        \"background-color\": this.theme,\r\n        \"border-color\": this.theme\r\n      };\r\n    },\r\n    isAffix(tag) {\r\n      return tag.meta && tag.meta.affix\r\n    },\r\n    isFirstView() {\r\n      try {\r\n        return this.selectedTag.fullPath === this.visitedViews[1].fullPath || this.selectedTag.fullPath === '/index'\r\n      } catch (err) {\r\n        return false\r\n      }\r\n    },\r\n    isLastView() {\r\n      try {\r\n        return this.selectedTag.fullPath === this.visitedViews[this.visitedViews.length - 1].fullPath\r\n      } catch (err) {\r\n        return false\r\n      }\r\n    },\r\n    filterAffixTags(routes, basePath = '/') {\r\n      let tags = []\r\n      routes.forEach(route => {\r\n        if (route.meta && route.meta.affix) {\r\n          const tagPath = path.resolve(basePath, route.path)\r\n          tags.push({\r\n            fullPath: tagPath,\r\n            path: tagPath,\r\n            name: route.name,\r\n            meta: { ...route.meta }\r\n          })\r\n        }\r\n        if (route.children) {\r\n          const tempTags = this.filterAffixTags(route.children, route.path)\r\n          if (tempTags.length >= 1) {\r\n            tags = [...tags, ...tempTags]\r\n          }\r\n        }\r\n      })\r\n      return tags\r\n    },\r\n    initTags() {\r\n      const affixTags = this.affixTags = this.filterAffixTags(this.routes)\r\n      for (const tag of affixTags) {\r\n        // Must have tag name\r\n        if (tag.name) {\r\n          this.$store.dispatch('tagsView/addVisitedView', tag)\r\n        }\r\n      }\r\n    },\r\n    addTags() {\r\n      const { name } = this.$route\r\n      if (name) {\r\n        this.$store.dispatch('tagsView/addView', this.$route)\r\n      }\r\n      return false\r\n    },\r\n    moveToCurrentTag() {\r\n      const tags = this.$refs.tag\r\n      this.$nextTick(() => {\r\n        for (const tag of tags) {\r\n          if (tag.to.path === this.$route.path) {\r\n            this.$refs.scrollPane.moveToTarget(tag)\r\n            // when query is different then update\r\n            if (tag.to.fullPath !== this.$route.fullPath) {\r\n              this.$store.dispatch('tagsView/updateVisitedView', this.$route)\r\n            }\r\n            break\r\n          }\r\n        }\r\n      })\r\n    },\r\n    refreshSelectedTag(view) {\r\n      this.$store.dispatch('tagsView/delCachedView', view).then(() => {\r\n        // const { fullPath } = view\r\n        this.$nextTick(() => {\r\n          this.$router.replace({\r\n            // path: '/redirect' + fullPath\r\n            path: '/index'\r\n          })\r\n        })\r\n      })\r\n    },\r\n    closeSelectedTag(view) {\r\n      this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {\r\n        if (this.isActive(view)) {\r\n          this.toLastView(visitedViews, view)\r\n        }\r\n      })\r\n    },\r\n    closeRightTags() {\r\n      this.$store.dispatch('tagsView/delRightTags', this.selectedTag).then(visitedViews => {\r\n        if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {\r\n          this.toLastView(visitedViews)\r\n        }\r\n      })\r\n    },\r\n    closeLeftTags() {\r\n      this.$store.dispatch('tagsView/delLeftTags', this.selectedTag).then(visitedViews => {\r\n        if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {\r\n          this.toLastView(visitedViews)\r\n        }\r\n      })\r\n    },\r\n    closeOthersTags() {\r\n      this.$router.push(this.selectedTag).catch(()=>{});\r\n      this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {\r\n        this.moveToCurrentTag()\r\n      })\r\n    },\r\n    closeAllTags(view) {\r\n      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {\r\n        if (this.affixTags.some(tag => tag.path === this.$route.path)) {\r\n          return\r\n        }\r\n        this.toLastView(visitedViews, view)\r\n      })\r\n    },\r\n    toLastView(visitedViews, view) {\r\n      const latestView = visitedViews.slice(-1)[0]\r\n      if (latestView) {\r\n        this.$router.push(latestView.fullPath)\r\n      } else {\r\n        // now the default is to redirect to the home page if there is no tags-view,\r\n        // you can adjust it according to your needs.\r\n        if (view.name === 'Dashboard') {\r\n          // to reload home page\r\n          this.$router.replace({ path: '/redirect' + view.fullPath })\r\n        } else {\r\n          this.$router.push('/')\r\n        }\r\n      }\r\n    },\r\n    openMenu(tag, e) {\r\n      const menuMinWidth = 105\r\n      const offsetLeft = this.$el.getBoundingClientRect().left // container margin left\r\n      const offsetWidth = this.$el.offsetWidth // container width\r\n      const maxLeft = offsetWidth - menuMinWidth // left boundary\r\n      const left = e.clientX - offsetLeft + 15 // 15: margin right\r\n\r\n      if (left > maxLeft) {\r\n        this.left = maxLeft\r\n      } else {\r\n        this.left = left\r\n      }\r\n\r\n      this.top = e.clientY\r\n      this.visible = true\r\n      this.selectedTag = tag\r\n    },\r\n    closeMenu() {\r\n      this.visible = false\r\n    },\r\n    handleScroll() {\r\n      this.closeMenu()\r\n    }\r\n  }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.tags-view-container {\r\n  height: 34px;\r\n  width: 100%;\r\n  background: #fff;\r\n  border-bottom: 1px solid #d8dce5;\r\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);\r\n  .tags-view-wrapper {\r\n    .tags-view-item {\r\n      display: inline-block;\r\n      position: relative;\r\n      cursor: pointer;\r\n      height: 26px;\r\n      line-height: 26px;\r\n      border: 1px solid #114a80;\r\n      color: #fff;\r\n      background: #114a80;\r\n      padding: 0 8px;\r\n      font-size: 12px;\r\n      margin-left: 5px;\r\n      margin-top: 4px;\r\n      &:first-of-type {\r\n        margin-left: 15px;\r\n      }\r\n      &:last-of-type {\r\n        margin-right: 15px;\r\n      }\r\n      // 设置导航栏变色\r\n      &.active {\r\n        background-color: #022845 !important;\r\n        color: #fff;\r\n        border-color: #022845 !important;\r\n        border-radius:  5px 5px 0px 0px ;\r\n        &::before {\r\n          content: '';\r\n          background: #004d86;\r\n          display: inline-block;\r\n          width: 8px;\r\n          height: 8px;\r\n          border-radius: 50%;\r\n          position: relative;\r\n          margin-right: 2px;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  .contextmenu {\r\n    margin: 0;\r\n    background: #fff;\r\n    z-index: 3000;\r\n    position: absolute;\r\n    list-style-type: none;\r\n    padding: 5px 0;\r\n    border-radius: 4px;\r\n    font-size: 12px;\r\n    font-weight: 400;\r\n    color: #333;\r\n    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);\r\n    li {\r\n      margin: 0;\r\n      padding: 7px 16px;\r\n      cursor: pointer;\r\n      &:hover {\r\n        background: #eee;\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n\r\n<style lang=\"scss\">\r\n//reset element css of el-icon-close\r\n.tags-view-wrapper {\r\n  .tags-view-item {\r\n    .el-icon-close {\r\n      width: 16px;\r\n      height: 16px;\r\n      vertical-align: 2px;\r\n      border-radius: 50%;\r\n      text-align: center;\r\n      transition: all .3s cubic-bezier(.645, .045, .355, 1);\r\n      transform-origin: 100% 50%;\r\n      &:before {\r\n        transform: scale(.6);\r\n        display: inline-block;\r\n        vertical-align: -3px;\r\n      }\r\n      &:hover {\r\n        background-color: #b4bccc;\r\n        color: #fff;\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n"]}]}
 |