Files
SaaS-lib/lib/paas/view/system/layout/start-menu.vue
xuziqiang d0155dbe3c push
2024-05-15 17:29:42 +08:00

245 lines
6.4 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- @format -->
<template>
<a class="start-menu-link" @click="showMenu()">
产品与服务
<DownOutlined class="nav-item-icon" />
</a>
<div class="start-menu">
<a-drawer
class="start-menu-box"
placement="top"
:closable="false"
:visible="IfshowMenu"
:zIndex="90"
@close="showMenu">
<div class="menu-search-block">
<div class="search-block">
<a-input-search
v-model:value="searchInput"
placeholder="通过名称/关键字查找产品(例如:中间件、告警管理等)"
@search="onSearchMenu"
class="search-input" />
</div>
<div class="search-Tip" v-if="showTip">
<p class="successTip" v-if="isSuccess == 1"
>以下是与"<span class="search-key">{{ searchInput }}</span
>"相关的产品与服务</p
>
<p class="failTip" v-if="isSuccess == 0">
未找到与"<span class="search-key">{{ searchInput }}</span
>"相关的产品与服务。
</p>
</div>
<!--改高度,滚动条 -->
<div class="menu-box">
<template v-for="(catalog, index) in catalogs" :key="index">
<div class="menu-block" v-if="catalog.items.length > 0">
<h5 class="menu-block-title h5">{{ catalog.label }}</h5>
<ul class="menu-block-container">
<li
class="menu-block-item"
v-for="(item, ind) in catalog.items"
:key="ind"
@click="onDockCatalogItem(item)">
<i class="iconfont h3 item-icon" v-html="item.icon"></i>
<span>{{ item.label }}</span>
<i class="iconfont tip-icon" :class="{ active: item.dock }">&#xe61f;</i>
</li>
</ul>
</div>
</template>
</div>
</div>
</a-drawer>
</div>
</template>
<script lang="ts">
import { defineComponent, inject } from 'vue';
import { DownOutlined } from '@ant-design/icons-vue';
import { CatalogConfigService, CatalogItem } from '/nerv-lib/paas/store/modules/catalog-config';
import { authorizationService } from '/nerv-lib/paas/store/modules/authorization-service';
import { cloneDeep } from 'lodash-es';
// import { useRouter } from 'vue-router';
// import { http } from '/nerv-lib/util/http';
// import { message } from 'ant-design-vue';
// import Cookies from 'js-cookie';
export default defineComponent({
name: 'NsStartMenu',
components: { DownOutlined },
props: {},
setup: () => {
//提供provide
const selecDocks = inject('selecDocks');
return {
selecDocks,
};
},
data(): {
IfshowMenu: boolean;
showTip: boolean;
searchInput: any;
isSuccess: number;
catalogsTemp: Array<any>;
catalogs: Array<any>;
} {
return {
IfshowMenu: false,
showTip: false,
searchInput: '',
isSuccess: 0,
catalogsTemp: [],
catalogs: [],
};
},
mounted() {
const catalogConfigService = CatalogConfigService();
const authService = authorizationService();
catalogConfigService.$subscribe((_mutation, state) => {
const { data } = state;
this.catalogs = cloneDeep(data);
if (!data) return;
this.catalogs.forEach((cate: any) => {
if (cate.items) {
cate.items = cate.items.filter((m1: any) => {
if (m1['splitMenuModule']) {
return authService.exists(m1['splitMenuModule'], m1['name']);
} else if (m1['splitModule']) {
return false;
} else {
return authService.exists(m1['name']);
}
});
}
});
this.catalogsTemp = this.catalogs;
});
},
methods: {
showMenu() {
this.IfshowMenu = !this.IfshowMenu;
},
onSearchMenu() {
let catalogs: any[] = [];
let searchStr = '';
searchStr = this.searchInput;
this.catalogs = JSON.parse(JSON.stringify(this.catalogsTemp));
if (searchStr == '') {
this.showTip = false;
return;
}
let reg = new RegExp(searchStr, 'i');
this.showTip = true;
this.catalogs.forEach((it: any) => {
if (reg.test(it.label)) {
catalogs.push(it);
}
if (!reg.test(it.label)) {
let items: any[] = [];
it.items.forEach((subIt: any) => {
if (reg.test(subIt.label)) {
items.push(subIt);
}
});
if (items.length != 0) {
let catalogItem: any = {};
catalogItem['name'] = it.name;
catalogItem['label'] = it.label;
catalogItem['items'] = items;
catalogs.push(catalogItem);
}
}
});
this.catalogs = catalogs;
if (catalogs.length == 0) {
this.isSuccess = 0;
} else {
this.isSuccess = 1;
}
},
onDockCatalogItem(item: CatalogItem): void {
item.dock = !item.dock;
(this.selecDocks as Function)(item);
// this.eventDockCatalogItem.emit(item);
},
},
});
</script>
<style lang="less">
.start-menu-link {
color: @layout-header-color;
&:hover {
color: @layout-header-color;
}
}
.start-menu {
.title {
margin-left: 16px;
margin-bottom: 0px;
cursor: pointer;
user-select: none;
span {
font-size: 12px;
}
.doorway {
margin: 0 8px;
color: #808d96 !important;
width: 12px !important;
height: 12px !important;
}
.active {
transform: rotateX(180deg);
}
}
.menu-tip {
position: absolute;
z-index: 99;
// background-color: #fff;
width: 100%;
//overflow-y: auto;
height: 722px;
left: 48px;
width: 100%;
.mask {
// position: absolute;
// left: 0px;
// right: 0px;
// top: 49px;
background: rgba(0, 0, 0, 0.5);
height: 2000px;
width: 40%;
z-index: 98;
}
}
}
ul,
li {
list-style: none;
padding: 0;
}
.nav-item-icon {
font-size: 10px;
}
.start-menu-box {
:deep(.ant-drawer-content-wrapper) {
width: 70%;
}
}
</style>