primevue
Version:
[](https://opensource.org/licenses/MIT) [](https://badge.fury.io/js/primevue) [ • 11.5 kB
JavaScript
import e from"primevue/overlayeventbus";import i from"primevue/portal";import{ObjectUtils as t,ZIndexUtils as n,DomHandler as s,ConnectedOverlayScrollHandler as l,UniqueComponentId as o}from"primevue/utils";import a from"primevue/ripple";import{resolveComponent as r,resolveDirective as d,openBlock as c,createElementBlock as u,normalizeClass as p,normalizeStyle as h,createElementVNode as m,Fragment as b,createBlock as f,withCtx as v,withDirectives as y,createCommentVNode as x,toDisplayString as k,resolveDynamicComponent as g,createVNode as I,Transition as L,mergeProps as O,renderList as C,renderSlot as w,createTextVNode as E}from"vue";var A={name:"Menuitem",inheritAttrs:!1,emits:["item-click"],props:{item:null,template:null,exact:null,id:null,focusedOptionId:null},methods:{getItemProp:(e,i)=>e&&e.item?t.getItemValue(e.item[i]):void 0,onItemActionClick(e,i){i&&i(e)},onItemClick(e){const i=this.getItemProp(this.item,"command");i&&i({originalEvent:e,item:this.item.item}),this.$emit("item-click",{originalEvent:e,item:this.item,id:this.id})},containerClass(){return["p-menuitem",this.item.class,{"p-focus":this.id===this.focusedOptionId,"p-disabled":this.disabled()}]},linkClass(e){return["p-menuitem-link",{"router-link-active":e&&e.isActive,"router-link-active-exact":this.exact&&e&&e.isExactActive}]},visible(){return"function"==typeof this.item.visible?this.item.visible():!1!==this.item.visible},disabled(){return"function"==typeof this.item.disabled?this.item.disabled():this.item.disabled},label(){return"function"==typeof this.item.label?this.item.label():this.item.label}},directives:{ripple:a}};const S=["id","aria-label","aria-disabled"],K=["href","onClick"],z={class:"p-menuitem-text"},$=["href","target"],D={class:"p-menuitem-text"};A.render=function(e,i,t,n,s,l){const o=r("router-link"),a=d("ripple");return l.visible()?(c(),u("li",{key:0,id:t.id,class:p(l.containerClass()),role:"menuitem",style:h(t.item.style),"aria-label":l.label(),"aria-disabled":l.disabled()},[m("div",{class:"p-menuitem-content",onClick:i[0]||(i[0]=e=>l.onItemClick(e))},[t.template?(c(),f(g(t.template),{key:1,item:t.item},null,8,["item"])):(c(),u(b,{key:0},[t.item.to&&!l.disabled()?(c(),f(o,{key:0,to:t.item.to,custom:""},{default:v((({navigate:e,href:i,isActive:n,isExactActive:s})=>[y((c(),u("a",{href:i,class:p(l.linkClass({isActive:n,isExactActive:s})),tabindex:"-1","aria-hidden":"true",onClick:i=>l.onItemActionClick(i,e)},[t.item.icon?(c(),u("span",{key:0,class:p(["p-menuitem-icon",t.item.icon])},null,2)):x("",!0),m("span",z,k(l.label()),1)],10,K)),[[a]])])),_:1},8,["to"])):y((c(),u("a",{key:1,href:t.item.url,class:p(l.linkClass()),target:t.item.target,tabindex:"-1","aria-hidden":"true"},[t.item.icon?(c(),u("span",{key:0,class:p(["p-menuitem-icon",t.item.icon])},null,2)):x("",!0),m("span",D,k(l.label()),1)],10,$)),[[a]])],64))])],14,S)):x("",!0)};var V={name:"Menu",inheritAttrs:!1,emits:["show","hide","focus","blur"],props:{popup:{type:Boolean,default:!1},model:{type:Array,default:null},appendTo:{type:String,default:"body"},autoZIndex:{type:Boolean,default:!0},baseZIndex:{type:Number,default:0},exact:{type:Boolean,default:!0},tabindex:{type:Number,default:0},"aria-label":{type:String,default:null},"aria-labelledby":{type:String,default:null}},data:()=>({overlayVisible:!1,focused:!1,focusedOptionIndex:-1,selectedOptionIndex:-1}),target:null,outsideClickListener:null,scrollHandler:null,resizeListener:null,container:null,list:null,mounted(){this.popup||(this.bindResizeListener(),this.bindOutsideClickListener())},beforeUnmount(){this.unbindResizeListener(),this.unbindOutsideClickListener(),this.scrollHandler&&(this.scrollHandler.destroy(),this.scrollHandler=null),this.target=null,this.container&&this.autoZIndex&&n.clear(this.container),this.container=null},methods:{itemClick(e){const i=e.item;this.disabled(i)||(i.command&&i.command(e),i.to&&e.navigate&&e.navigate(e.originalEvent),this.overlayVisible&&this.hide(),this.popup||this.focusedOptionIndex===e.id||(this.focusedOptionIndex=e.id))},onListFocus(e){this.focused=!0,this.popup||(-1!==this.selectedOptionIndex?(this.changeFocusedOptionIndex(this.selectedOptionIndex),this.selectedOptionIndex=-1):this.changeFocusedOptionIndex(0)),this.$emit("focus",e)},onListBlur(e){this.focused=!1,this.focusedOptionIndex=-1,this.$emit("blur",e)},onListKeyDown(e){switch(e.code){case"ArrowDown":this.onArrowDownKey(e);break;case"ArrowUp":this.onArrowUpKey(e);break;case"Home":this.onHomeKey(e);break;case"End":this.onEndKey(e);break;case"Enter":this.onEnterKey(e);break;case"Space":this.onSpaceKey(e);break;case"Tab":this.overlayVisible&&this.hide()}},onArrowDownKey(e){const i=this.findNextOptionIndex(this.focusedOptionIndex);this.changeFocusedOptionIndex(i),e.preventDefault()},onArrowUpKey(e){if(e.altKey&&this.popup)s.focus(this.target),this.hide(),e.preventDefault();else{const i=this.findPrevOptionIndex(this.focusedOptionIndex);this.changeFocusedOptionIndex(i),e.preventDefault()}},onHomeKey(e){this.changeFocusedOptionIndex(0),e.preventDefault()},onEndKey(e){this.changeFocusedOptionIndex(s.find(this.container,"li.p-menuitem:not(.p-disabled)").length-1),e.preventDefault()},onEnterKey(e){const i=s.findSingle(this.list,`li[id="${this.focusedOptionIndex}"]`),t=i&&s.findSingle(i,".p-menuitem-link");this.popup&&s.focus(this.target),t?t.click():i&&i.click(),e.preventDefault()},onSpaceKey(e){this.onEnterKey(e)},findNextOptionIndex(e){const i=[...s.find(this.container,"li.p-menuitem:not(.p-disabled)")].findIndex((i=>i.id===e));return i>-1?i+1:0},findPrevOptionIndex(e){const i=[...s.find(this.container,"li.p-menuitem:not(.p-disabled)")].findIndex((i=>i.id===e));return i>-1?i-1:0},changeFocusedOptionIndex(e){const i=s.find(this.container,"li.p-menuitem:not(.p-disabled)");let t=e>=i.length?i.length-1:e<0?0:e;this.focusedOptionIndex=i[t].getAttribute("id")},toggle(e){this.overlayVisible?this.hide():this.show(e)},show(e){this.overlayVisible=!0,this.target=e.currentTarget},hide(){this.overlayVisible=!1,this.target=null},onEnter(e){this.alignOverlay(),this.bindOutsideClickListener(),this.bindResizeListener(),this.bindScrollListener(),this.autoZIndex&&n.set("menu",e,this.baseZIndex+this.$primevue.config.zIndex.menu),this.popup&&(s.focus(this.list),this.changeFocusedOptionIndex(0)),this.$emit("show")},onLeave(){this.unbindOutsideClickListener(),this.unbindResizeListener(),this.unbindScrollListener(),this.$emit("hide")},onAfterLeave(e){this.autoZIndex&&n.clear(e)},alignOverlay(){s.absolutePosition(this.container,this.target),this.container.style.minWidth=s.getOuterWidth(this.target)+"px"},bindOutsideClickListener(){this.outsideClickListener||(this.outsideClickListener=e=>{const i=this.container&&!this.container.contains(e.target),t=!(this.target&&(this.target===e.target||this.target.contains(e.target)));this.overlayVisible&&i&&t?this.hide():!this.popup&&i&&t&&(this.focusedOptionIndex=-1)},document.addEventListener("click",this.outsideClickListener))},unbindOutsideClickListener(){this.outsideClickListener&&(document.removeEventListener("click",this.outsideClickListener),this.outsideClickListener=null)},bindScrollListener(){this.scrollHandler||(this.scrollHandler=new l(this.target,(()=>{this.overlayVisible&&this.hide()}))),this.scrollHandler.bindScrollListener()},unbindScrollListener(){this.scrollHandler&&this.scrollHandler.unbindScrollListener()},bindResizeListener(){this.resizeListener||(this.resizeListener=()=>{this.overlayVisible&&!s.isTouchDevice()&&this.hide()},window.addEventListener("resize",this.resizeListener))},unbindResizeListener(){this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null)},visible:e=>"function"==typeof e.visible?e.visible():!1!==e.visible,disabled:e=>"function"==typeof e.disabled?e.disabled():e.disabled,label:e=>"function"==typeof e.label?e.label():e.label,separatorClass:e=>["p-menuitem-separator",e.class],onOverlayClick(i){e.emit("overlay-click",{originalEvent:i,target:this.target})},containerRef(e){this.container=e},listRef(e){this.list=e}},computed:{containerClass(){return["p-menu p-component",{"p-menu-overlay":this.popup,"p-input-filled":"filled"===this.$primevue.config.inputStyle,"p-ripple-disabled":!1===this.$primevue.config.ripple}]},id(){return this.$attrs.id||o()},focusedOptionId(){return-1!==this.focusedOptionIndex?this.focusedOptionIndex:null}},components:{PVMenuitem:A,Portal:i}};const F=["id"],H=["id","tabindex","aria-activedescendant","aria-label","aria-labelledby"],R=["id"];!function(e,i){void 0===i&&(i={});var t=i.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css","top"===t&&n.firstChild?n.insertBefore(s,n.firstChild):n.appendChild(s),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(document.createTextNode(e))}}("\n.p-menu-overlay {\n position: absolute;\n top: 0;\n left: 0;\n}\n.p-menu ul {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.p-menu .p-menuitem-link {\n cursor: pointer;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n position: relative;\n}\n.p-menu .p-menuitem-text {\n line-height: 1;\n}\n"),V.render=function(e,i,t,n,s,l){const o=r("PVMenuitem"),a=r("Portal");return c(),f(a,{appendTo:t.appendTo,disabled:!t.popup},{default:v((()=>[I(L,{name:"p-connected-overlay",onEnter:l.onEnter,onLeave:l.onLeave,onAfterLeave:l.onAfterLeave},{default:v((()=>[!t.popup||s.overlayVisible?(c(),u("div",O({key:0,ref:l.containerRef,id:l.id,class:l.containerClass},e.$attrs,{onClick:i[3]||(i[3]=(...e)=>l.onOverlayClick&&l.onOverlayClick(...e))}),[m("ul",{ref:l.listRef,id:l.id+"_list",class:"p-menu-list p-reset",role:"menu",tabindex:t.tabindex,"aria-activedescendant":s.focused?l.focusedOptionId:void 0,"aria-label":e.ariaLabel,"aria-labelledby":e.ariaLabelledby,onFocus:i[0]||(i[0]=(...e)=>l.onListFocus&&l.onListFocus(...e)),onBlur:i[1]||(i[1]=(...e)=>l.onListBlur&&l.onListBlur(...e)),onKeydown:i[2]||(i[2]=(...e)=>l.onListKeyDown&&l.onListKeyDown(...e))},[(c(!0),u(b,null,C(t.model,((i,n)=>(c(),u(b,{key:l.label(i)+n.toString()},[i.items&&l.visible(i)&&!i.separator?(c(),u(b,{key:0},[i.items?(c(),u("li",{key:0,id:l.id+"_"+n,class:"p-submenu-header",role:"none"},[w(e.$slots,"item",{item:i},(()=>[E(k(l.label(i)),1)]))],8,R)):x("",!0),(c(!0),u(b,null,C(i.items,((s,a)=>(c(),u(b,{key:s.label+n+"_"+a},[l.visible(s)&&!s.separator?(c(),f(o,{key:0,id:l.id+"_"+n+"_"+a,item:s,template:e.$slots.item,exact:t.exact,focusedOptionId:l.focusedOptionId,onItemClick:l.itemClick},null,8,["id","item","template","exact","focusedOptionId","onItemClick"])):l.visible(s)&&s.separator?(c(),u("li",{key:"separator"+n+a,class:p(l.separatorClass(i)),style:h(s.style),role:"separator"},null,6)):x("",!0)],64)))),128))],64)):l.visible(i)&&i.separator?(c(),u("li",{key:"separator"+n.toString(),class:p(l.separatorClass(i)),style:h(i.style),role:"separator"},null,6)):(c(),f(o,{key:l.label(i)+n.toString(),id:l.id+"_"+n,item:i,template:e.$slots.item,exact:t.exact,focusedOptionId:l.focusedOptionId,onItemClick:l.itemClick},null,8,["id","item","template","exact","focusedOptionId","onItemClick"]))],64)))),128))],40,H)],16,F)):x("",!0)])),_:3},8,["onEnter","onLeave","onAfterLeave"])])),_:3},8,["appendTo","disabled"])};export{V as default};