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) 19.7 kB
import e from"primevue/basecomponent";import t from"primevue/overlayeventbus";import i from"primevue/portal";import{ObjectUtils as s,UniqueComponentId as n,ZIndexUtils as o,DomHandler as r,ConnectedOverlayScrollHandler as a}from"primevue/utils";import l from"primevue/icons/angleright";import d from"primevue/ripple";import{resolveComponent as m,resolveDirective as c,openBlock as u,createElementBlock as h,normalizeProps as I,guardReactiveProps as p,Fragment as f,renderList as b,mergeProps as v,createElementVNode as g,createBlock as y,withCtx as x,withDirectives as k,resolveDynamicComponent as P,normalizeClass as L,createCommentVNode as C,toDisplayString as K,createVNode as E,Transition as A}from"vue";var w={name:"TieredMenuSub",extends:e,emits:["item-click","item-mouseenter"],props:{menuId:{type:String,default:null},focusedItemId:{type:String,default:null},items:{type:Array,default:null},level:{type:Number,default:0},templates:{type:Object,default:null},activeItemPath:{type:Object,default:null},exact:{type:Boolean,default:!0}},methods:{getItemId(e){return`${this.menuId}_${e.key}`},getItemKey(e){return this.getItemId(e)},getItemProp:(e,t,i)=>e&&e.item?s.getItemValue(e.item[t],i):void 0,getItemLabel(e){return this.getItemProp(e,"label")},getPTOptions(e,t){return this.ptm(t,{context:{active:this.isItemActive(e),focused:this.isItemFocused(e)}})},isItemActive(e){return this.activeItemPath.some((t=>t.key===e.key))},isItemVisible(e){return!1!==this.getItemProp(e,"visible")},isItemDisabled(e){return this.getItemProp(e,"disabled")},isItemFocused(e){return this.focusedItemId===this.getItemId(e)},isItemGroup:e=>s.isNotEmpty(e.items),onItemClick(e,t){this.getItemProp(t,"command",{originalEvent:e,item:t.item}),this.$emit("item-click",{originalEvent:e,processedItem:t,isFocus:!0})},onItemMouseEnter(e,t){this.$emit("item-mouseenter",{originalEvent:e,processedItem:t})},onItemActionClick(e,t){t&&t(e)},getAriaSetSize(){return this.items.filter((e=>this.isItemVisible(e)&&!this.getItemProp(e,"separator"))).length},getAriaPosInset(e){return e-this.items.slice(0,e).filter((e=>this.isItemVisible(e)&&this.getItemProp(e,"separator"))).length+1},getItemClass(e){return["p-menuitem",this.getItemProp(e,"class"),{"p-menuitem-active p-highlight":this.isItemActive(e),"p-focus":this.isItemFocused(e),"p-disabled":this.isItemDisabled(e)}]},getItemActionClass(e,t){return["p-menuitem-link",{"router-link-active":t&&t.isActive,"router-link-active-exact":this.exact&&t&&t.isExactActive}]},getItemIconClass(e){return["p-menuitem-icon",this.getItemProp(e,"icon")]},getSeparatorItemClass(e){return["p-menuitem-separator",this.getItemProp(e,"class")]}},components:{AngleRightIcon:l},directives:{ripple:d}};const S=["id","aria-label","aria-disabled","aria-expanded","aria-haspopup","aria-level","aria-setsize","aria-posinset"],T=["onClick","onMouseenter"],F=["href","onClick"],V=["href","target"],$=["id"];w.render=function(e,t,i,s,n,o){const r=m("router-link"),a=m("AngleRightIcon"),l=m("TieredMenuSub",!0),d=c("ripple");return u(),h("ul",I(p(e.ptm("menu"))),[(u(!0),h(f,null,b(i.items,((s,n)=>(u(),h(f,{key:o.getItemKey(s)},[o.isItemVisible(s)&&!o.getItemProp(s,"separator")?(u(),h("li",v({key:0,id:o.getItemId(s),style:o.getItemProp(s,"style"),class:o.getItemClass(s),role:"menuitem","aria-label":o.getItemLabel(s),"aria-disabled":o.isItemDisabled(s)||void 0,"aria-expanded":o.isItemGroup(s)?o.isItemActive(s):void 0,"aria-haspopup":o.isItemGroup(s)&&!o.getItemProp(s,"to")?"menu":void 0,"aria-level":i.level+1,"aria-setsize":o.getAriaSetSize(),"aria-posinset":o.getAriaPosInset(n)},o.getPTOptions(s,"menuitem")),[g("div",v({class:"p-menuitem-content",onClick:e=>o.onItemClick(e,s),onMouseenter:e=>o.onItemMouseEnter(e,s)},o.getPTOptions(s,"content")),[i.templates.item?(u(),y(P(i.templates.item),{key:1,item:s.item},null,8,["item"])):(u(),h(f,{key:0},[o.getItemProp(s,"to")&&!o.isItemDisabled(s)?(u(),y(r,{key:0,to:o.getItemProp(s,"to"),custom:""},{default:x((({navigate:e,href:t,isActive:n,isExactActive:r})=>[k((u(),h("a",v({href:t,class:o.getItemActionClass(s,{isActive:n,isExactActive:r}),tabindex:"-1","aria-hidden":"true",onClick:t=>o.onItemActionClick(t,e)},o.getPTOptions(s,"action")),[i.templates.itemicon?(u(),y(P(i.templates.itemicon),{key:0,item:s.item,class:L(o.getItemIconClass(s))},null,8,["item","class"])):o.getItemProp(s,"icon")?(u(),h("span",v({key:1,class:o.getItemIconClass(s)},o.getPTOptions(s,"icon")),null,16)):C("",!0),g("span",v({class:"p-menuitem-text"},o.getPTOptions(s,"label")),K(o.getItemLabel(s)),17)],16,F)),[[d]])])),_:2},1032,["to"])):k((u(),h("a",v({key:1,href:o.getItemProp(s,"url"),class:o.getItemActionClass(s),target:o.getItemProp(s,"target"),tabindex:"-1","aria-hidden":"true"},o.getPTOptions(s,"action")),[i.templates.itemicon?(u(),y(P(i.templates.itemicon),{key:0,item:s.item,class:L(o.getItemIconClass(s))},null,8,["item","class"])):o.getItemProp(s,"icon")?(u(),h("span",v({key:1,class:o.getItemIconClass(s)},o.getPTOptions(s,"icon")),null,16)):C("",!0),g("span",v({class:"p-menuitem-text"},o.getPTOptions(s,"label")),K(o.getItemLabel(s)),17),o.getItemProp(s,"items")?(u(),h(f,{key:2},[i.templates.submenuicon?(u(),y(P(i.templates.submenuicon),v({key:0,class:"p-submenu-icon",active:o.isItemActive(s)},o.getPTOptions(s,"submenuIcon")),null,16,["active"])):(u(),y(a,v({key:1,class:"p-submenu-icon"},o.getPTOptions(s,"submenuIcon")),null,16))],64)):C("",!0)],16,V)),[[d]])],64))],16,T),o.isItemVisible(s)&&o.isItemGroup(s)?(u(),y(l,{key:0,id:o.getItemId(s)+"_list",role:"menu",class:"p-submenu-list",menuId:i.menuId,focusedItemId:i.focusedItemId,items:s.items,templates:i.templates,activeItemPath:i.activeItemPath,exact:i.exact,level:i.level+1,pt:e.pt,onItemClick:t[0]||(t[0]=t=>e.$emit("item-click",t)),onItemMouseenter:t[1]||(t[1]=t=>e.$emit("item-mouseenter",t))},null,8,["id","menuId","focusedItemId","items","templates","activeItemPath","exact","level","pt"])):C("",!0)],16,S)):C("",!0),o.isItemVisible(s)&&o.getItemProp(s,"separator")?(u(),h("li",v({key:1,id:o.getItemId(s),style:o.getItemProp(s,"style"),class:o.getSeparatorItemClass(s),role:"separator"},e.ptm("separator")),null,16,$)):C("",!0)],64)))),128))],16)};var O={name:"TieredMenu",extends:e,inheritAttrs:!1,emits:["focus","blur","before-show","before-hide","hide","show"],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},disabled:{type:Boolean,default:!1},tabindex:{type:Number,default:0},"aria-labelledby":{type:String,default:null},"aria-label":{type:String,default:null}},outsideClickListener:null,scrollHandler:null,resizeListener:null,target:null,container:null,menubar:null,searchTimeout:null,searchValue:null,data(){return{id:this.$attrs.id,focused:!1,focusedItemInfo:{index:-1,level:0,parentKey:""},activeItemPath:[],visible:!this.popup,dirty:!1}},watch:{"$attrs.id":function(e){this.id=e||n()},activeItemPath(e){this.popup||(s.isNotEmpty(e)?(this.bindOutsideClickListener(),this.bindResizeListener()):(this.unbindOutsideClickListener(),this.unbindResizeListener()))}},mounted(){this.id=this.id||n()},beforeUnmount(){this.unbindOutsideClickListener(),this.unbindResizeListener(),this.scrollHandler&&(this.scrollHandler.destroy(),this.scrollHandler=null),this.container&&this.autoZIndex&&o.clear(this.container),this.target=null,this.container=null},methods:{getItemProp:(e,t)=>e?s.getItemValue(e[t]):void 0,getItemLabel(e){return this.getItemProp(e,"label")},isItemDisabled(e){return this.getItemProp(e,"disabled")},isItemGroup(e){return s.isNotEmpty(this.getItemProp(e,"items"))},isItemSeparator(e){return this.getItemProp(e,"separator")},getProccessedItemLabel(e){return e?this.getItemLabel(e.item):void 0},isProccessedItemGroup:e=>e&&s.isNotEmpty(e.items),toggle(e){this.visible?this.hide(e,!0):this.show(e)},show(e,t){this.popup&&(this.$emit("before-show"),this.visible=!0,this.target=this.target||e.currentTarget,this.relatedTarget=e.relatedTarget||null),this.focusedItemInfo={index:this.findFirstFocusedItemIndex(),level:0,parentKey:""},t&&r.focus(this.menubar)},hide(e,t){this.popup&&(this.$emit("before-hide"),this.visible=!1),this.activeItemPath=[],this.focusedItemInfo={index:-1,level:0,parentKey:""},t&&r.focus(this.relatedTarget||this.target||this.menubar),this.dirty=!1},onFocus(e){this.focused=!0,this.focusedItemInfo=-1!==this.focusedItemInfo.index?this.focusedItemInfo:{index:this.findFirstFocusedItemIndex(),level:0,parentKey:""},this.$emit("focus",e)},onBlur(e){this.focused=!1,this.focusedItemInfo={index:-1,level:0,parentKey:""},this.searchValue="",this.dirty=!1,this.$emit("blur",e)},onKeyDown(e){if(this.disabled)return void e.preventDefault();const t=e.metaKey||e.ctrlKey;switch(e.code){case"ArrowDown":this.onArrowDownKey(e);break;case"ArrowUp":this.onArrowUpKey(e);break;case"ArrowLeft":this.onArrowLeftKey(e);break;case"ArrowRight":this.onArrowRightKey(e);break;case"Home":this.onHomeKey(e);break;case"End":this.onEndKey(e);break;case"Space":this.onSpaceKey(e);break;case"Enter":this.onEnterKey(e);break;case"Escape":this.onEscapeKey(e);break;case"Tab":this.onTabKey(e);break;case"PageDown":case"PageUp":case"Backspace":case"ShiftLeft":case"ShiftRight":break;default:!t&&s.isPrintableCharacter(e.key)&&this.searchItems(e,e.key)}},onItemChange(e){const{processedItem:t,isFocus:i}=e;if(s.isEmpty(t))return;const{index:n,key:o,level:a,parentKey:l,items:d}=t,m=s.isNotEmpty(d),c=this.activeItemPath.filter((e=>e.parentKey!==l&&e.parentKey!==o));m&&c.push(t),this.focusedItemInfo={index:n,level:a,parentKey:l},this.activeItemPath=c,m&&(this.dirty=!0),i&&r.focus(this.menubar)},onOverlayClick(e){t.emit("overlay-click",{originalEvent:e,target:this.target})},onItemClick(e){const{originalEvent:t,processedItem:i}=e,n=this.isProccessedItemGroup(i),o=s.isEmpty(i.parent);if(this.isSelected(i)){const{index:e,key:t,level:s,parentKey:n}=i;this.activeItemPath=this.activeItemPath.filter((e=>t!==e.key&&t.startsWith(e.key))),this.focusedItemInfo={index:e,level:s,parentKey:n},this.dirty=!o,r.focus(this.menubar)}else if(n)this.onItemChange(e);else{const e=o?i:this.activeItemPath.find((e=>""===e.parentKey));this.hide(t),this.changeFocusedItemIndex(t,e?e.index:-1),r.focus(this.menubar)}},onItemMouseEnter(e){this.dirty&&this.onItemChange(e)},onArrowDownKey(e){const t=-1!==this.focusedItemInfo.index?this.findNextItemIndex(this.focusedItemInfo.index):this.findFirstFocusedItemIndex();this.changeFocusedItemIndex(e,t),e.preventDefault()},onArrowUpKey(e){if(e.altKey){if(-1!==this.focusedItemInfo.index){const t=this.visibleItems[this.focusedItemInfo.index];!this.isProccessedItemGroup(t)&&this.onItemChange({originalEvent:e,processedItem:t})}this.popup&&this.hide(e,!0),e.preventDefault()}else{const t=-1!==this.focusedItemInfo.index?this.findPrevItemIndex(this.focusedItemInfo.index):this.findLastFocusedItemIndex();this.changeFocusedItemIndex(e,t),e.preventDefault()}},onArrowLeftKey(e){const t=this.visibleItems[this.focusedItemInfo.index],i=this.activeItemPath.find((e=>e.key===t.parentKey));s.isEmpty(t.parent)||(this.focusedItemInfo={index:-1,parentKey:i?i.parentKey:""},this.searchValue="",this.onArrowDownKey(e)),this.activeItemPath=this.activeItemPath.filter((e=>e.parentKey!==this.focusedItemInfo.parentKey)),e.preventDefault()},onArrowRightKey(e){const t=this.visibleItems[this.focusedItemInfo.index];this.isProccessedItemGroup(t)&&(this.onItemChange({originalEvent:e,processedItem:t}),this.focusedItemInfo={index:-1,parentKey:t.key},this.searchValue="",this.onArrowDownKey(e)),e.preventDefault()},onHomeKey(e){this.changeFocusedItemIndex(e,this.findFirstItemIndex()),e.preventDefault()},onEndKey(e){this.changeFocusedItemIndex(e,this.findLastItemIndex()),e.preventDefault()},onEnterKey(e){if(-1!==this.focusedItemInfo.index){const e=r.findSingle(this.menubar,`li[id="${this.focusedItemId}"]`),t=e&&r.findSingle(e,".p-menuitem-link");if(t?t.click():e&&e.click(),!this.popup){const e=this.visibleItems[this.focusedItemInfo.index];!this.isProccessedItemGroup(e)&&(this.focusedItemInfo.index=this.findFirstFocusedItemIndex())}}e.preventDefault()},onSpaceKey(e){this.onEnterKey(e)},onEscapeKey(e){this.hide(e,!0),!this.popup&&(this.focusedItemInfo.index=this.findFirstFocusedItemIndex()),e.preventDefault()},onTabKey(e){if(-1!==this.focusedItemInfo.index){const t=this.visibleItems[this.focusedItemInfo.index];!this.isProccessedItemGroup(t)&&this.onItemChange({originalEvent:e,processedItem:t})}this.hide()},onEnter(e){this.autoZIndex&&o.set("menu",e,this.baseZIndex+this.$primevue.config.zIndex.menu),this.alignOverlay(),r.focus(this.menubar),this.scrollInView()},onAfterEnter(){this.bindOutsideClickListener(),this.bindScrollListener(),this.bindResizeListener(),this.$emit("show")},onLeave(){this.unbindOutsideClickListener(),this.unbindScrollListener(),this.unbindResizeListener(),this.$emit("hide"),this.container=null,this.dirty=!1},onAfterLeave(e){this.autoZIndex&&o.clear(e)},alignOverlay(){this.container.style.minWidth=r.getOuterWidth(this.target)+"px",r.absolutePosition(this.container,this.target)},bindOutsideClickListener(){this.outsideClickListener||(this.outsideClickListener=e=>{const t=this.container&&!this.container.contains(e.target),i=!this.popup||!(this.target&&(this.target===e.target||this.target.contains(e.target)));t&&i&&this.hide()},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,(e=>{this.hide(e,!0)}))),this.scrollHandler.bindScrollListener()},unbindScrollListener(){this.scrollHandler&&this.scrollHandler.unbindScrollListener()},bindResizeListener(){this.resizeListener||(this.resizeListener=e=>{r.isTouchDevice()||this.hide(e,!0)},window.addEventListener("resize",this.resizeListener))},unbindResizeListener(){this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null)},isItemMatched(e){return this.isValidItem(e)&&this.getProccessedItemLabel(e).toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase())},isValidItem(e){return!!e&&!this.isItemDisabled(e.item)&&!this.isItemSeparator(e.item)},isValidSelectedItem(e){return this.isValidItem(e)&&this.isSelected(e)},isSelected(e){return this.activeItemPath.some((t=>t.key===e.key))},findFirstItemIndex(){return this.visibleItems.findIndex((e=>this.isValidItem(e)))},findLastItemIndex(){return s.findLastIndex(this.visibleItems,(e=>this.isValidItem(e)))},findNextItemIndex(e){const t=e<this.visibleItems.length-1?this.visibleItems.slice(e+1).findIndex((e=>this.isValidItem(e))):-1;return t>-1?t+e+1:e},findPrevItemIndex(e){const t=e>0?s.findLastIndex(this.visibleItems.slice(0,e),(e=>this.isValidItem(e))):-1;return t>-1?t:e},findSelectedItemIndex(){return this.visibleItems.findIndex((e=>this.isValidSelectedItem(e)))},findFirstFocusedItemIndex(){const e=this.findSelectedItemIndex();return e<0?this.findFirstItemIndex():e},findLastFocusedItemIndex(){const e=this.findSelectedItemIndex();return e<0?this.findLastItemIndex():e},searchItems(e,t){this.searchValue=(this.searchValue||"")+t;let i=-1,s=!1;return-1!==this.focusedItemInfo.index?(i=this.visibleItems.slice(this.focusedItemInfo.index).findIndex((e=>this.isItemMatched(e))),i=-1===i?this.visibleItems.slice(0,this.focusedItemInfo.index).findIndex((e=>this.isItemMatched(e))):i+this.focusedItemInfo.index):i=this.visibleItems.findIndex((e=>this.isItemMatched(e))),-1!==i&&(s=!0),-1===i&&-1===this.focusedItemInfo.index&&(i=this.findFirstFocusedItemIndex()),-1!==i&&this.changeFocusedItemIndex(e,i),this.searchTimeout&&clearTimeout(this.searchTimeout),this.searchTimeout=setTimeout((()=>{this.searchValue="",this.searchTimeout=null}),500),s},changeFocusedItemIndex(e,t){this.focusedItemInfo.index!==t&&(this.focusedItemInfo.index=t,this.scrollInView())},scrollInView(e=-1){const t=-1!==e?`${this.id}_${e}`:this.focusedItemId,i=r.findSingle(this.menubar,`li[id="${t}"]`);i&&i.scrollIntoView&&i.scrollIntoView({block:"nearest",inline:"start"})},createProcessedItems(e,t=0,i={},s=""){const n=[];return e&&e.forEach(((e,o)=>{const r=(""!==s?s+"_":"")+o,a={item:e,index:o,level:t,key:r,parent:i,parentKey:s};a.items=this.createProcessedItems(e.items,t+1,a,r),n.push(a)})),n},containerRef(e){this.container=e},menubarRef(e){this.menubar=e?e.$el:void 0}},computed:{containerClass(){return["p-tieredmenu p-component",{"p-tieredmenu-overlay":this.popup,"p-input-filled":"filled"===this.$primevue.config.inputStyle,"p-ripple-disabled":!1===this.$primevue.config.ripple}]},processedItems(){return this.createProcessedItems(this.model||[])},visibleItems(){const e=this.activeItemPath.find((e=>e.key===this.focusedItemInfo.parentKey));return e?e.items:this.processedItems},focusedItemId(){return-1!==this.focusedItemInfo.index?`${this.id}${s.isNotEmpty(this.focusedItemInfo.parentKey)?"_"+this.focusedItemInfo.parentKey:""}_${this.focusedItemInfo.index}`:null}},components:{TieredMenuSub:w,Portal:i}};const D=["id"];!function(e,t){void 0===t&&(t={});var i=t.insertAt;if(e&&"undefined"!=typeof document){var s=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css","top"===i&&s.firstChild?s.insertBefore(n,s.firstChild):s.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}}("\n.p-tieredmenu-overlay {\n position: absolute;\n top: 0;\n left: 0;\n}\n.p-tieredmenu ul {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.p-tieredmenu .p-submenu-list {\n position: absolute;\n min-width: 100%;\n z-index: 1;\n display: none;\n}\n.p-tieredmenu .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-tieredmenu .p-menuitem-text {\n line-height: 1;\n}\n.p-tieredmenu .p-menuitem {\n position: relative;\n}\n.p-tieredmenu .p-menuitem-link .p-submenu-icon {\n margin-left: auto;\n}\n.p-tieredmenu .p-menuitem-active > .p-submenu-list {\n display: block;\n left: 100%;\n top: 0;\n}\n"),O.render=function(e,t,i,s,n,o){const r=m("TieredMenuSub"),a=m("Portal");return u(),y(a,{appendTo:i.appendTo,disabled:!i.popup},{default:x((()=>[E(A,{name:"p-connected-overlay",onEnter:o.onEnter,onAfterEnter:o.onAfterEnter,onLeave:o.onLeave,onAfterLeave:o.onAfterLeave},{default:x((()=>[n.visible?(u(),h("div",v({key:0,ref:o.containerRef,id:n.id,class:o.containerClass,onClick:t[0]||(t[0]=(...e)=>o.onOverlayClick&&o.onOverlayClick(...e))},{...e.$attrs,...e.ptm("root")}),[E(r,{ref:o.menubarRef,id:n.id+"_list",class:"p-tieredmenu-root-list",tabindex:i.disabled?-1:i.tabindex,role:"menubar","aria-label":e.ariaLabel,"aria-labelledby":e.ariaLabelledby,"aria-disabled":i.disabled||void 0,"aria-orientation":"vertical","aria-activedescendant":n.focused?o.focusedItemId:void 0,menuId:n.id,focusedItemId:n.focused?o.focusedItemId:void 0,items:o.processedItems,templates:e.$slots,activeItemPath:n.activeItemPath,exact:i.exact,level:0,pt:e.pt,onFocus:o.onFocus,onBlur:o.onBlur,onKeydown:o.onKeyDown,onItemClick:o.onItemClick,onItemMouseenter:o.onItemMouseEnter},null,8,["id","tabindex","aria-label","aria-labelledby","aria-disabled","aria-activedescendant","menuId","focusedItemId","items","templates","activeItemPath","exact","pt","onFocus","onBlur","onKeydown","onItemClick","onItemMouseenter"])],16,D)):C("",!0)])),_:1},8,["onEnter","onAfterEnter","onLeave","onAfterLeave"])])),_:1},8,["appendTo","disabled"])};export{O as default};