import Trigger from './trigger'
import {getOffset,getDefaultTarget} from '@main/utils'
import {filterEmpty} from '@main/utils/props'
import PopMenu from './popMenu'
const SubMenu = {
inject:["showAllFuncBox","hideAllFuncBox"],
props:{
eventKey:{
type:String
},
mode:{
type:String
},
level:{
type:Number
},
parent: {
type: Object,
default: null
},
isAllFunc:{
type:Boolean,
}
},
data(){
return{
subStyle:{
left:0,
top:0,
display:'none'
},
isActive:false,
}
},
mounted(){
let me=this;
let subMenuDom = me.$refs['subMenus'].$el.firstElementChild;
let h = document.documentElement.offsetHeight;
let headH=document.querySelector(".pl-header").offsetHeight+(document.querySelector(".pl-navbar")?document.querySelector(".pl-navbar").offsetHeight:0);
if(!subMenuDom.dataWidth){
subMenuDom.dataWidth=subMenuDom.offsetWidth;
me.level!=0&&(subMenuDom.style.width = '0');
}
if(!subMenuDom.dataHeight){
subMenuDom.dataHeight=(subMenuDom.offsetHeight>h-headH?h-headH:subMenuDom.offsetHeight)+1;
me.level==0&&(subMenuDom.style.height = '0');
}
},
methods:{
setPotion(){
let me=this;
let rect = getOffset(me.$refs['domMenuTitle'],getDefaultTarget());
let subStyle = {
left: (me.level==0&&!me.isAllFunc)?rect.left:rect.left+rect.width,
top: (me.level==0&&!me.isAllFunc)?rect.top+rect.height-1:rect.top,
width:rect.width,
height:rect.height,
}
if(me.level==0&&me.isAllFunc){
subStyle.left+=10;
}
return subStyle;
},
show(){
let me=this;
if(me.level!=0){
me.parent.show&&me.parent.show();
}
if(me.isAllFunc){
me.showAllFuncBox();//当在全部功能中展现菜单,不收起全部功能下拉框
}
let p = me.setPotion(),
h = document.documentElement.offsetHeight,
w = document.documentElement.offsetWidth,
subMenuDom = me.$refs['subMenus'].$el.firstElementChild,
headH=document.querySelector(".pl-header").offsetHeight+(document.querySelector(".pl-navbar")?document.querySelector(".pl-navbar").offsetHeight:0);
//subMenuDom.style.display = 'block';
let sh = subMenuDom.offsetHeight,
sw = subMenuDom.offsetWidth;
sh = sh>(h-headH) ? (h-headH) : sh;
if(subMenuDom.dataWidth){
sw=subMenuDom.dataWidth;
}
if(subMenuDom.dataHeight){
sh=subMenuDom.dataHeight;
}
if(p.left+sw>w){
subMenuDom.style.left="auto";
subMenuDom.style.right=-(me.level>0?p.left-p.width:w)+'px';
}else{
subMenuDom.style.right="auto";
subMenuDom.style.left=(me.level>0?p.left-10:p.left)+'px';
}
subMenuDom.style.top = ((sh+p.top)>h?(h-sh):p.top)+'px';
subMenuDom.style.opacity = '1';
subMenuDom.style.height = sh+'px';
subMenuDom.style.width = sw+'px';
let zIndex = window.getComputedStyle(this.$el.parentNode,null)['z-index']*1;
subMenuDom.style.zIndex=zIndex+1;
// me.$set(me,'subStyle',{display:'block',...p});
// me.subStyle.display = 'block';
me.isActive =true;
},
hide(){
let me=this;
let subMenuDom = me.$refs['subMenus'].$el.firstElementChild;
if(me.level==0){
subMenuDom.style.height = '0';
}else{
subMenuDom.style.width = '0';
}
// me.subStyle.display = 'none';
me.isActive = false;
},
hideParent(){
let me=this;
if(me.level!=0){
me.parent.hide&&me.parent.hideParent();
}
this.hide();
},
handleTitleMouseEnter(evt){
this.show();
},
handleTitleMouseLeave(evt){
this.hide();
},
handleSubMouseEnter(){
this.show();
this.$emit('mouseenter');
},
handleSubMouseLeave(){
this.hideParent();
this.$emit('mouseleave');
},
renderChildren(children){
let me=this;
let {...props} = me.$props;
const {subStyle,isActive} = me;
let popMenuProps={
props:{
...props,
level:props.level+1,
children:children,
parent:me
},
style:{
// ...subStyle,
},
class:{
['pl-menus-sub']:1,
['pl-menus-pop']:1,
},
on:{
mouseenter:me.handleSubMouseEnter,
mouseleave:me.handleSubMouseLeave
}
}
if(me.isAllFunc){
popMenuProps.class['allFuncSubMenu']=1;
}
return (
<PopMenu ref="domMenuSub" {...popMenuProps}></PopMenu>
)
}
},
render(h) {
const props = this.$props;
const {subStyle,isActive} = this;
const isInlineMode = props.mode === 'inline';
const children = this.renderChildren(filterEmpty(this.$slots.default));
const nodeProps ={
class:{
['pl-menus-item']:1,
['pl-menus-itemSeld']:isActive
}
}
const titleProps={
attrs:{
title:this.$slots.title[0].text
},
on:{
mouseenter:this.handleTitleMouseEnter,
mouseleave:this.handleTitleMouseLeave
}
}
/*
{isInlineMode && children}
{!isInlineMode && (
<Trigger>
{children}
</Trigger>)}
*/
/**
* 菜单太多的问题
* 子菜单独立渲染 添加滚动条
*/
return (
<li {...nodeProps} >
<div ref="domMenuTitle" class="title" {...titleProps}>
{props.level>0&&(<i class="iconfont icon-arrow-right trigger"></i>)}
<span class='txt'>{this.$slots.title}</span>
</div>
<Trigger ref="subMenus">{children}</Trigger>
{/* {props.level==0&&(
<Trigger>
{children}
</Trigger>)}
{
props.level>0&&children
} */}
</li>
);
}
}
export default SubMenu;