UNPKG

primevue

Version:

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![npm version](https://badge.fury.io/js/primevue.svg)](https://badge.fury.io/js/primevue) [![Discord Chat](https://img.shields.io/discord/55794023

2 lines (1 loc) 12.4 kB
import e from"primevue/basecomponent";import t from"primevue/overlayeventbus";import i from"primevue/portal";import{ObjectUtils as n,UniqueComponentId as s,ZIndexUtils as l,DomHandler as o,ConnectedOverlayScrollHandler as a}from"primevue/utils";import r from"primevue/ripple";import{resolveComponent as d,resolveDirective as c,openBlock as p,createElementBlock as u,mergeProps as h,createElementVNode as m,Fragment as b,createBlock as f,withCtx as v,withDirectives as y,resolveDynamicComponent as g,normalizeClass as k,createCommentVNode as x,toDisplayString as I,createVNode as O,Transition as L,renderSlot as C,renderList as w,createTextVNode as E}from"vue";var A={name:"Menuitem",extends:e,inheritAttrs:!1,emits:["item-click"],props:{item:null,templates:null,exact:null,id:null,focusedOptionId:null},methods:{getItemProp:(e,t)=>e&&e.item?n.getItemValue(e.item[t]):void 0,getPTOptions(e){return this.ptm(e,{context:{focused:this.isItemFocused()}})},isItemFocused(){return this.focusedOptionId===this.id},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:r}};const S=["id","aria-label","aria-disabled"],T=["href","onClick"],$=["href","target"];A.render=function(e,t,i,n,s,l){const o=d("router-link"),a=c("ripple");return l.visible()?(p(),u("li",h({key:0,id:i.id,class:l.containerClass(),role:"menuitem",style:i.item.style,"aria-label":l.label(),"aria-disabled":l.disabled()},l.getPTOptions("menuitem")),[m("div",h({class:"p-menuitem-content",onClick:t[0]||(t[0]=e=>l.onItemClick(e))},l.getPTOptions("content")),[i.templates.item?(p(),f(g(i.templates.item),{key:1,item:i.item},null,8,["item"])):(p(),u(b,{key:0},[i.item.to&&!l.disabled()?(p(),f(o,{key:0,to:i.item.to,custom:""},{default:v((({navigate:e,href:t,isActive:n,isExactActive:s})=>[y((p(),u("a",h({href:t,class:l.linkClass({isActive:n,isExactActive:s}),tabindex:"-1","aria-hidden":"true",onClick:t=>l.onItemActionClick(t,e)},l.getPTOptions("action")),[i.templates.itemicon?(p(),f(g(i.templates.itemicon),{key:0,item:i.item,class:k(l.iconClass)},null,8,["item","class"])):i.item.icon?(p(),u("span",h({key:1,class:l.iconClass},l.getPTOptions("icon")),null,16)):x("",!0),m("span",h({class:"p-menuitem-text"},l.getPTOptions("label")),I(l.label()),17)],16,T)),[[a]])])),_:1},8,["to"])):y((p(),u("a",h({key:1,href:i.item.url,class:l.linkClass(),target:i.item.target,tabindex:"-1","aria-hidden":"true"},l.getPTOptions("action")),[i.templates.itemicon?(p(),f(g(i.templates.itemicon),{key:0,item:i.item,class:k(l.iconClass)},null,8,["item","class"])):i.item.icon?(p(),u("span",h({key:1,class:l.iconClass},l.getPTOptions("icon")),null,16)):x("",!0),m("span",h({class:"p-menuitem-text"},l.getPTOptions("label")),I(l.label()),17)],16,$)),[[a]])],64))],16)],16,S)):x("",!0)};var K={name:"Menu",extends:e,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||s()}},target:null,outsideClickListener:null,scrollHandler:null,resizeListener:null,container:null,list:null,mounted(){this.id=this.id||s(),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&&l.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&&(o.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)o.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(o.find(this.container,"li.p-menuitem:not(.p-disabled)").length-1),e.preventDefault()},onEnterKey(e){const t=o.findSingle(this.list,`li[id="${this.focusedOptionIndex}"]`),i=t&&o.findSingle(t,".p-menuitem-link");this.popup&&o.focus(this.target),i?i.click():t&&t.click(),e.preventDefault()},onSpaceKey(e){this.onEnterKey(e)},findNextOptionIndex(e){const t=[...o.find(this.container,"li.p-menuitem:not(.p-disabled)")].findIndex((t=>t.id===e));return t>-1?t+1:0},findPrevOptionIndex(e){const t=[...o.find(this.container,"li.p-menuitem:not(.p-disabled)")].findIndex((t=>t.id===e));return t>-1?t-1:0},changeFocusedOptionIndex(e){const t=o.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&&l.set("menu",e,this.baseZIndex+this.$primevue.config.zIndex.menu),this.popup&&(o.focus(this.list),this.changeFocusedOptionIndex(0)),this.$emit("show")},onLeave(){this.unbindOutsideClickListener(),this.unbindResizeListener(),this.unbindScrollListener(),this.$emit("hide")},onAfterLeave(e){this.autoZIndex&&l.clear(e)},alignOverlay(){o.absolutePosition(this.container,this.target),this.container.style.minWidth=o.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 a(this.target,(()=>{this.overlayVisible&&this.hide()}))),this.scrollHandler.bindScrollListener()},unbindScrollListener(){this.scrollHandler&&this.scrollHandler.unbindScrollListener()},bindResizeListener(){this.resizeListener||(this.resizeListener=()=>{this.overlayVisible&&!o.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(e){t.emit("overlay-click",{originalEvent:e,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:i}};const P=["id"],z=["id","tabindex","aria-activedescendant","aria-label","aria-labelledby"],F=["id"];!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"),K.render=function(e,t,i,n,s,l){const o=d("PVMenuitem"),a=d("Portal");return p(),f(a,{appendTo:i.appendTo,disabled:!i.popup},{default:v((()=>[O(L,{name:"p-connected-overlay",onEnter:l.onEnter,onLeave:l.onLeave,onAfterLeave:l.onAfterLeave},{default:v((()=>[!i.popup||s.overlayVisible?(p(),u("div",h({key:0,ref:l.containerRef,id:s.id,class:l.containerClass,onClick:t[3]||(t[3]=(...e)=>l.onOverlayClick&&l.onOverlayClick(...e))},{...e.$attrs,...e.ptm("root")}),[e.$slots.start?(p(),u("div",h({key:0,class:"p-menu-start"},e.ptm("start")),[C(e.$slots,"start")],16)):x("",!0),m("ul",h({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))},e.ptm("menu")),[(p(!0),u(b,null,w(i.model,((t,n)=>(p(),u(b,{key:l.label(t)+n.toString()},[t.items&&l.visible(t)&&!t.separator?(p(),u(b,{key:0},[t.items?(p(),u("li",h({key:0,id:s.id+"_"+n,class:"p-submenu-header",role:"none"},e.ptm("submenuHeader")),[C(e.$slots,"item",{item:t},(()=>[E(I(l.label(t)),1)]))],16,F)):x("",!0),(p(!0),u(b,null,w(t.items,((a,r)=>(p(),u(b,{key:a.label+n+"_"+r},[l.visible(a)&&!a.separator?(p(),f(o,{key:0,id:s.id+"_"+n+"_"+r,item:a,templates:e.$slots,exact:i.exact,focusedOptionId:l.focusedOptionId,onItemClick:l.itemClick,pt:e.pt},null,8,["id","item","templates","exact","focusedOptionId","onItemClick","pt"])):l.visible(a)&&a.separator?(p(),u("li",h({key:"separator"+n+r,class:l.separatorClass(t),style:a.style,role:"separator"},e.ptm("separator")),null,16)):x("",!0)],64)))),128))],64)):l.visible(t)&&t.separator?(p(),u("li",h({key:"separator"+n.toString(),class:l.separatorClass(t),style:t.style,role:"separator"},e.ptm("separator")),null,16)):(p(),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,pt:e.pt},null,8,["id","item","templates","exact","focusedOptionId","onItemClick","pt"]))],64)))),128))],16,z),e.$slots.end?(p(),u("div",h({key:1,class:"p-menu-end"},e.ptm("end")),[C(e.$slots,"end")],16)):x("",!0)],16,P)):x("",!0)])),_:3},8,["onEnter","onLeave","onAfterLeave"])])),_:3},8,["appendTo","disabled"])};export{K as default};