primevue
Version:
[](https://opensource.org/licenses/MIT) [](https://badge.fury.io/js/primevue) [ • 11.9 kB
JavaScript
import e from"primevue/overlayeventbus";import t from"primevue/portal";import{ObjectUtils as i,UniqueComponentId as n,ZIndexUtils as s,DomHandler as l,ConnectedOverlayScrollHandler 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,resolveDynamicComponent as k,createCommentVNode as x,toDisplayString as g,createVNode as I,Transition as L,mergeProps as C,renderSlot as O,renderList as w,createTextVNode as E}from"vue";var A={name:"Menuitem",inheritAttrs:!1,emits:["item-click"],props:{item:null,templates:null,exact:null,id:null,focusedOptionId:null},methods:{getItemProp:(e,t)=>e&&e.item?i.getItemValue(e.item[t]):void 0,onItemActionClick(e,t){t&&t(e)},onItemClick(e){const t=this.getItemProp(this.item,"command");t&&t({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}},computed:{iconClass(){return["p-menuitem-icon",this.item.icon]}},directives:{ripple:a}};const S=["id","aria-label","aria-disabled"],$=["href","onClick"],K={class:"p-menuitem-text"},z=["href","target"],D={class:"p-menuitem-text"};A.render=function(e,t,i,n,s,l){const o=r("router-link"),a=d("ripple");return l.visible()?(c(),u("li",{key:0,id:i.id,class:p(l.containerClass()),role:"menuitem",style:h(i.item.style),"aria-label":l.label(),"aria-disabled":l.disabled()},[m("div",{class:"p-menuitem-content",onClick:t[0]||(t[0]=e=>l.onItemClick(e))},[i.templates.item?(c(),f(k(i.templates.item),{key:1,item:i.item},null,8,["item"])):(c(),u(b,{key:0},[i.item.to&&!l.disabled()?(c(),f(o,{key:0,to:i.item.to,custom:""},{default:v((({navigate:e,href:t,isActive:n,isExactActive:s})=>[y((c(),u("a",{href:t,class:p(l.linkClass({isActive:n,isExactActive:s})),tabindex:"-1","aria-hidden":"true",onClick:t=>l.onItemActionClick(t,e)},[i.templates.itemicon?(c(),f(k(i.templates.itemicon),{key:0,item:i.item,class:p(l.iconClass)},null,8,["item","class"])):i.item.icon?(c(),u("span",{key:1,class:p(l.iconClass)},null,2)):x("",!0),m("span",K,g(l.label()),1)],10,$)),[[a]])])),_:1},8,["to"])):y((c(),u("a",{key:1,href:i.item.url,class:p(l.linkClass()),target:i.item.target,tabindex:"-1","aria-hidden":"true"},[i.templates.itemicon?(c(),f(k(i.templates.itemicon),{key:0,item:i.item,class:p(l.iconClass)},null,8,["item","class"])):i.item.icon?(c(),u("span",{key:1,class:p(l.iconClass)},null,2)):x("",!0),m("span",D,g(l.label()),1)],10,z)),[[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(){return{id:this.$attrs.id,overlayVisible:!1,focused:!1,focusedOptionIndex:-1,selectedOptionIndex:-1}},watch:{"$attrs.id":function(e){this.id=e||n()}},target:null,outsideClickListener:null,scrollHandler:null,resizeListener:null,container:null,list:null,mounted(){this.id=this.id||n(),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&&s.clear(this.container),this.container=null},methods:{itemClick(e){const t=e.item;this.disabled(t)||(t.command&&t.command(e),t.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"Escape":this.popup&&(l.focus(this.target),this.hide());case"Tab":this.overlayVisible&&this.hide()}},onArrowDownKey(e){const t=this.findNextOptionIndex(this.focusedOptionIndex);this.changeFocusedOptionIndex(t),e.preventDefault()},onArrowUpKey(e){if(e.altKey&&this.popup)l.focus(this.target),this.hide(),e.preventDefault();else{const t=this.findPrevOptionIndex(this.focusedOptionIndex);this.changeFocusedOptionIndex(t),e.preventDefault()}},onHomeKey(e){this.changeFocusedOptionIndex(0),e.preventDefault()},onEndKey(e){this.changeFocusedOptionIndex(l.find(this.container,"li.p-menuitem:not(.p-disabled)").length-1),e.preventDefault()},onEnterKey(e){const t=l.findSingle(this.list,`li[id="${this.focusedOptionIndex}"]`),i=t&&l.findSingle(t,".p-menuitem-link");this.popup&&l.focus(this.target),i?i.click():t&&t.click(),e.preventDefault()},onSpaceKey(e){this.onEnterKey(e)},findNextOptionIndex(e){const t=[...l.find(this.container,"li.p-menuitem:not(.p-disabled)")].findIndex((t=>t.id===e));return t>-1?t+1:0},findPrevOptionIndex(e){const t=[...l.find(this.container,"li.p-menuitem:not(.p-disabled)")].findIndex((t=>t.id===e));return t>-1?t-1:0},changeFocusedOptionIndex(e){const t=l.find(this.container,"li.p-menuitem:not(.p-disabled)");let i=e>=t.length?t.length-1:e<0?0:e;i>-1&&(this.focusedOptionIndex=t[i].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&&s.set("menu",e,this.baseZIndex+this.$primevue.config.zIndex.menu),this.popup&&(l.focus(this.list),this.changeFocusedOptionIndex(0)),this.$emit("show")},onLeave(){this.unbindOutsideClickListener(),this.unbindResizeListener(),this.unbindScrollListener(),this.$emit("hide")},onAfterLeave(e){this.autoZIndex&&s.clear(e)},alignOverlay(){l.absolutePosition(this.container,this.target),this.container.style.minWidth=l.getOuterWidth(this.target)+"px"},bindOutsideClickListener(){this.outsideClickListener||(this.outsideClickListener=e=>{const t=this.container&&!this.container.contains(e.target),i=!(this.target&&(this.target===e.target||this.target.contains(e.target)));this.overlayVisible&&t&&i?this.hide():!this.popup&&t&&i&&(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 o(this.target,(()=>{this.overlayVisible&&this.hide()}))),this.scrollHandler.bindScrollListener()},unbindScrollListener(){this.scrollHandler&&this.scrollHandler.unbindScrollListener()},bindResizeListener(){this.resizeListener||(this.resizeListener=()=>{this.overlayVisible&&!l.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(t){e.emit("overlay-click",{originalEvent:t,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}]},focusedOptionId(){return-1!==this.focusedOptionIndex?this.focusedOptionIndex:null}},components:{PVMenuitem:A,Portal:t}};const F=["id"],H={key:0,class:"p-menu-start"},R=["id","tabindex","aria-activedescendant","aria-label","aria-labelledby"],T=["id"],B={key:1,class:"p-menu-end"};!function(e,t){void 0===t&&(t={});var i=t.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css","top"===i&&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: flex;\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,t,i,n,s,l){const o=r("PVMenuitem"),a=r("Portal");return c(),f(a,{appendTo:i.appendTo,disabled:!i.popup},{default:v((()=>[I(L,{name:"p-connected-overlay",onEnter:l.onEnter,onLeave:l.onLeave,onAfterLeave:l.onAfterLeave},{default:v((()=>[!i.popup||s.overlayVisible?(c(),u("div",C({key:0,ref:l.containerRef,id:s.id,class:l.containerClass},e.$attrs,{onClick:t[3]||(t[3]=(...e)=>l.onOverlayClick&&l.onOverlayClick(...e))}),[e.$slots.start?(c(),u("div",H,[O(e.$slots,"start")])):x("",!0),m("ul",{ref:l.listRef,id:s.id+"_list",class:"p-menu-list p-reset",role:"menu",tabindex:i.tabindex,"aria-activedescendant":s.focused?l.focusedOptionId:void 0,"aria-label":e.ariaLabel,"aria-labelledby":e.ariaLabelledby,onFocus:t[0]||(t[0]=(...e)=>l.onListFocus&&l.onListFocus(...e)),onBlur:t[1]||(t[1]=(...e)=>l.onListBlur&&l.onListBlur(...e)),onKeydown:t[2]||(t[2]=(...e)=>l.onListKeyDown&&l.onListKeyDown(...e))},[(c(!0),u(b,null,w(i.model,((t,n)=>(c(),u(b,{key:l.label(t)+n.toString()},[t.items&&l.visible(t)&&!t.separator?(c(),u(b,{key:0},[t.items?(c(),u("li",{key:0,id:s.id+"_"+n,class:"p-submenu-header",role:"none"},[O(e.$slots,"item",{item:t},(()=>[E(g(l.label(t)),1)]))],8,T)):x("",!0),(c(!0),u(b,null,w(t.items,((a,r)=>(c(),u(b,{key:a.label+n+"_"+r},[l.visible(a)&&!a.separator?(c(),f(o,{key:0,id:s.id+"_"+n+"_"+r,item:a,templates:e.$slots,exact:i.exact,focusedOptionId:l.focusedOptionId,onItemClick:l.itemClick},null,8,["id","item","templates","exact","focusedOptionId","onItemClick"])):l.visible(a)&&a.separator?(c(),u("li",{key:"separator"+n+r,class:p(l.separatorClass(t)),style:h(a.style),role:"separator"},null,6)):x("",!0)],64)))),128))],64)):l.visible(t)&&t.separator?(c(),u("li",{key:"separator"+n.toString(),class:p(l.separatorClass(t)),style:h(t.style),role:"separator"},null,6)):(c(),f(o,{key:l.label(t)+n.toString(),id:s.id+"_"+n,item:t,templates:e.$slots,exact:i.exact,focusedOptionId:l.focusedOptionId,onItemClick:l.itemClick},null,8,["id","item","templates","exact","focusedOptionId","onItemClick"]))],64)))),128))],40,R),e.$slots.end?(c(),u("div",B,[O(e.$slots,"end")])):x("",!0)],16,F)):x("",!0)])),_:3},8,["onEnter","onLeave","onAfterLeave"])])),_:3},8,["appendTo","disabled"])};export{V as default};