primevue
Version:
[](https://opensource.org/licenses/MIT) [](https://badge.fury.io/js/primevue) [ • 19.4 kB
JavaScript
import{ObjectUtils as e,DomHandler as t,UniqueComponentId as i}from"primevue/utils";import s from"primevue/ripple";import{resolveComponent as n,resolveDirective as a,openBlock as r,createElementBlock as l,Fragment as o,renderList as d,normalizeStyle as m,normalizeClass as c,createElementVNode as u,createBlock as h,withCtx as p,withDirectives as I,createCommentVNode as g,toDisplayString as f,resolveDynamicComponent as y,createVNode as v,Transition as b,vShow as P}from"vue";var k={name:"PanelMenuSub",emits:["item-toggle"],props:{panelId:{type:String,default:null},focusedItemId:{type:String,default:null},items:{type:Array,default:null},level:{type:Number,default:0},template:{type:Function,default:null},activeItemPath:{type:Object,default:null},exact:{type:Boolean,default:!0}},methods:{getItemId(e){return`${this.panelId}_${e.key}`},getItemKey(e){return this.getItemId(e)},getItemProp:(t,i,s)=>t&&t.item?e.getItemValue(t.item[i],s):void 0,getItemLabel(e){return this.getItemProp(e,"label")},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:t=>e.isNotEmpty(t.items),onItemClick(e,t){this.getItemProp(t,"command",{originalEvent:e,item:t.item}),this.$emit("item-toggle",{processedItem:t,expanded:!this.isItemActive(t)})},onItemToggle(e){this.$emit("item-toggle",e)},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-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")]},getItemToggleIconClass(e){return["p-submenu-icon",this.isItemActive(e)?"pi pi-fw pi-chevron-down":"pi pi-fw pi-chevron-right"]},getSeparatorItemClass(e){return["p-menuitem-separator",this.getItemProp(e,"class")]}},directives:{ripple:s}};const x={class:"p-submenu-list"},K=["id","aria-label","aria-expanded","aria-level","aria-setsize","aria-posinset"],E=["onClick"],A=["href","onClick"],H={class:"p-menuitem-text"},C=["href","target"],w={class:"p-menuitem-text"},D={class:"p-toggleable-content"};k.render=function(e,t,i,s,k,F){const S=n("router-link"),T=n("PanelMenuSub",!0),L=a("ripple");return r(),l("ul",x,[(r(!0),l(o,null,d(i.items,((e,t)=>(r(),l(o,{key:F.getItemKey(e)},[F.isItemVisible(e)&&!F.getItemProp(e,"separator")?(r(),l("li",{key:0,id:F.getItemId(e),style:m(F.getItemProp(e,"style")),class:c(F.getItemClass(e)),role:"treeitem","aria-label":F.getItemLabel(e),"aria-expanded":F.isItemGroup(e)?F.isItemActive(e):void 0,"aria-level":i.level+1,"aria-setsize":F.getAriaSetSize(),"aria-posinset":F.getAriaPosInset(t)},[u("div",{class:"p-menuitem-content",onClick:t=>F.onItemClick(t,e)},[i.template?(r(),h(y(i.template),{key:1,item:e.item},null,8,["item"])):(r(),l(o,{key:0},[F.getItemProp(e,"to")&&!F.isItemDisabled(e)?(r(),h(S,{key:0,to:F.getItemProp(e,"to"),custom:""},{default:p((({navigate:t,href:i,isActive:s,isExactActive:n})=>[I((r(),l("a",{href:i,class:c(F.getItemActionClass(e,{isActive:s,isExactActive:n})),tabindex:"-1","aria-hidden":"true",onClick:e=>F.onItemActionClick(e,t)},[F.getItemProp(e,"icon")?(r(),l("span",{key:0,class:c(F.getItemIconClass(e))},null,2)):g("",!0),u("span",H,f(F.getItemLabel(e)),1)],10,A)),[[L]])])),_:2},1032,["to"])):I((r(),l("a",{key:1,href:F.getItemProp(e,"url"),class:c(F.getItemActionClass(e)),target:F.getItemProp(e,"target"),tabindex:"-1","aria-hidden":"true"},[F.isItemGroup(e)?(r(),l("span",{key:0,class:c(F.getItemToggleIconClass(e))},null,2)):g("",!0),F.getItemProp(e,"icon")?(r(),l("span",{key:1,class:c(F.getItemIconClass(e))},null,2)):g("",!0),u("span",w,f(F.getItemLabel(e)),1)],10,C)),[[L]])],64))],8,E),v(b,{name:"p-toggleable-content"},{default:p((()=>[I(u("div",D,[F.isItemVisible(e)&&F.isItemGroup(e)?(r(),h(T,{key:0,id:F.getItemId(e)+"_list",role:"group",panelId:i.panelId,focusedItemId:i.focusedItemId,items:e.items,level:i.level+1,template:i.template,activeItemPath:i.activeItemPath,exact:i.exact,onItemToggle:F.onItemToggle},null,8,["id","panelId","focusedItemId","items","level","template","activeItemPath","exact","onItemToggle"])):g("",!0)],512),[[P,F.isItemActive(e)]])])),_:2},1024)],14,K)):g("",!0),F.isItemVisible(e)&&F.getItemProp(e,"separator")?(r(),l("li",{key:1,style:m(F.getItemProp(e,"style")),class:c(F.getSeparatorItemClass(e)),role:"separator"},null,6)):g("",!0)],64)))),128))])};var F={name:"PanelMenuList",emits:["item-toggle","header-focus"],props:{panelId:{type:String,default:null},items:{type:Array,default:null},template:{type:Function,default:null},expandedKeys:{type:Object,default:null},exact:{type:Boolean,default:!0}},searchTimeout:null,searchValue:null,data:()=>({focused:!1,focusedItem:null,activeItemPath:[]}),watch:{expandedKeys(e){this.autoUpdateActiveItemPath(e)}},mounted(){this.autoUpdateActiveItemPath(this.expandedKeys)},methods:{getItemProp:(t,i)=>t&&t.item?e.getItemValue(t.item[i]):void 0,getItemLabel(e){return this.getItemProp(e,"label")},isItemVisible(e){return!1!==this.getItemProp(e,"visible")},isItemDisabled(e){return this.getItemProp(e,"disabled")},isItemActive(e){return this.activeItemPath.some((t=>t.key===e.parentKey))},isItemGroup:t=>e.isNotEmpty(t.items),onFocus(e){this.focused=!0,this.focusedItem=this.focusedItem||(this.isElementInPanel(e,e.relatedTarget)?this.findFirstItem():this.findLastItem())},onBlur(){this.focused=!1,this.focusedItem=null,this.searchValue=""},onKeyDown(t){const i=t.metaKey||t.ctrlKey;switch(t.code){case"ArrowDown":this.onArrowDownKey(t);break;case"ArrowUp":this.onArrowUpKey(t);break;case"ArrowLeft":this.onArrowLeftKey(t);break;case"ArrowRight":this.onArrowRightKey(t);break;case"Home":this.onHomeKey(t);break;case"End":this.onEndKey(t);break;case"Space":this.onSpaceKey(t);break;case"Enter":this.onEnterKey(t);break;case"Escape":case"Tab":case"PageDown":case"PageUp":case"Backspace":case"ShiftLeft":case"ShiftRight":break;default:!i&&e.isPrintableCharacter(t.key)&&this.searchItems(t,t.key)}},onArrowDownKey(t){const i=e.isNotEmpty(this.focusedItem)?this.findNextItem(this.focusedItem):this.findFirstItem();this.changeFocusedItem({originalEvent:t,processedItem:i,focusOnNext:!0}),t.preventDefault()},onArrowUpKey(t){const i=e.isNotEmpty(this.focusedItem)?this.findPrevItem(this.focusedItem):this.findLastItem();this.changeFocusedItem({originalEvent:t,processedItem:i,selfCheck:!0}),t.preventDefault()},onArrowLeftKey(t){if(e.isNotEmpty(this.focusedItem)){this.activeItemPath.some((e=>e.key===this.focusedItem.key))?this.activeItemPath=this.activeItemPath.filter((e=>e.key!==this.focusedItem.key)):this.focusedItem=e.isNotEmpty(this.focusedItem.parent)?this.focusedItem.parent:this.focusedItem,t.preventDefault()}},onArrowRightKey(t){if(e.isNotEmpty(this.focusedItem)){if(this.isItemGroup(this.focusedItem)){this.activeItemPath.some((e=>e.key===this.focusedItem.key))?this.onArrowDownKey(t):(this.activeItemPath=this.activeItemPath.filter((e=>e.parentKey!==this.focusedItem.parentKey)),this.activeItemPath.push(this.focusedItem))}t.preventDefault()}},onHomeKey(e){this.changeFocusedItem({originalEvent:e,processedItem:this.findFirstItem(),allowHeaderFocus:!1}),e.preventDefault()},onEndKey(e){this.changeFocusedItem({originalEvent:e,processedItem:this.findLastItem(),focusOnNext:!0,allowHeaderFocus:!1}),e.preventDefault()},onEnterKey(i){if(e.isNotEmpty(this.focusedItem)){const e=t.findSingle(this.$el,`li[id="${this.focusedItemId}"]`),i=e&&t.findSingle(e,".p-menuitem-link");i?i.click():e&&e.click()}i.preventDefault()},onSpaceKey(e){this.onEnterKey(e)},onItemToggle(e){const{processedItem:i,expanded:s}=e;this.expandedKeys?this.$emit("item-toggle",{item:i.item,expanded:s}):(this.activeItemPath=this.activeItemPath.filter((e=>e.parentKey!==i.parentKey)),s&&this.activeItemPath.push(i)),this.focusedItem=i,t.focus(this.$el)},isElementInPanel(e,t){const i=e.currentTarget.closest(".p-panelmenu-panel");return i&&i.contains(t)},isItemMatched(e){return this.isValidItem(e)&&this.getItemLabel(e).toLocaleLowerCase(this.searchLocale).startsWith(this.searchValue.toLocaleLowerCase(this.searchLocale))},isVisibleItem(e){return!!e&&(0===e.level||this.isItemActive(e))&&this.isItemVisible(e)},isValidItem(e){return!!e&&!this.isItemDisabled(e)},findFirstItem(){return this.visibleItems.find((e=>this.isValidItem(e)))},findLastItem(){return e.findLast(this.visibleItems,(e=>this.isValidItem(e)))},findNextItem(e){const t=this.visibleItems.findIndex((t=>t.key===e.key));return(t<this.visibleItems.length-1?this.visibleItems.slice(t+1).find((e=>this.isValidItem(e))):void 0)||e},findPrevItem(t){const i=this.visibleItems.findIndex((e=>e.key===t.key));return(i>0?e.findLast(this.visibleItems.slice(0,i),(e=>this.isValidItem(e))):void 0)||t},searchItems(t,i){this.searchValue=(this.searchValue||"")+i;let s=null,n=!1;if(e.isNotEmpty(this.focusedItem)){const t=this.visibleItems.findIndex((e=>e.key===this.focusedItem.key));s=this.visibleItems.slice(t).find((e=>this.isItemMatched(e))),s=e.isEmpty(s)?this.visibleItems.slice(0,t).find((e=>this.isItemMatched(e))):s}else s=this.visibleItems.find((e=>this.isItemMatched(e)));return e.isNotEmpty(s)&&(n=!0),e.isEmpty(s)&&e.isEmpty(this.focusedItem)&&(s=this.findFirstItem()),e.isNotEmpty(s)&&this.changeFocusedItem({originalEvent:t,processedItem:s,allowHeaderFocus:!1}),this.searchTimeout&&clearTimeout(this.searchTimeout),this.searchTimeout=setTimeout((()=>{this.searchValue="",this.searchTimeout=null}),500),n},changeFocusedItem(t){const{originalEvent:i,processedItem:s,focusOnNext:n,selfCheck:a,allowHeaderFocus:r=!0}=t;e.isNotEmpty(this.focusedItem)&&this.focusedItem.key!==s.key?(this.focusedItem=s,this.scrollInView()):r&&this.$emit("header-focus",{originalEvent:i,focusOnNext:n,selfCheck:a})},scrollInView(){const e=t.findSingle(this.$el,`li[id="${this.focusedItemId}"]`);e&&e.scrollIntoView&&e.scrollIntoView({block:"nearest",inline:"start"})},autoUpdateActiveItemPath(e){this.activeItemPath=Object.entries(e||{}).reduce(((e,[t,i])=>{if(i){const i=this.findProcessedItemByItemKey(t);i&&e.push(i)}return e}),[])},findProcessedItemByItemKey(e,t,i=0){if(!(t=t||0===i&&this.processedItems))return null;for(let s=0;s<t.length;s++){const n=t[s];if(this.getItemProp(n,"key")===e)return n;const a=this.findProcessedItemByItemKey(e,n.items,i+1);if(a)return a}},createProcessedItems(e,t=0,i={},s=""){const n=[];return e&&e.forEach(((e,a)=>{const r=(""!==s?s+"_":"")+a,l={item:e,index:a,level:t,key:r,parent:i,parentKey:s};l.items=this.createProcessedItems(e.items,t+1,l,r),n.push(l)})),n},flatItems(e,t=[]){return e&&e.forEach((e=>{this.isVisibleItem(e)&&(t.push(e),this.flatItems(e.items,t))})),t}},computed:{processedItems(){return this.createProcessedItems(this.items||[])},visibleItems(){return this.flatItems(this.processedItems)},focusedItemId(){return e.isNotEmpty(this.focusedItem)?`${this.panelId}_${this.focusedItem.key}`:null}},components:{PanelMenuSub:k}};F.render=function(e,t,i,s,a,l){const o=n("PanelMenuSub");return r(),h(o,{id:i.panelId+"_list",class:"p-panelmenu-root-list",role:"tree",tabindex:-1,"aria-activedescendant":a.focused?l.focusedItemId:void 0,panelId:i.panelId,focusedItemId:a.focused?l.focusedItemId:void 0,items:l.processedItems,template:i.template,activeItemPath:a.activeItemPath,exact:i.exact,onFocus:l.onFocus,onBlur:l.onBlur,onKeydown:l.onKeyDown,onItemToggle:l.onItemToggle},null,8,["id","aria-activedescendant","panelId","focusedItemId","items","template","activeItemPath","exact","onFocus","onBlur","onKeydown","onItemToggle"])};var S={name:"PanelMenu",emits:["update:expandedKeys","panel-open","panel-close"],props:{model:{type:Array,default:null},expandedKeys:{type:Object,default:null},exact:{type:Boolean,default:!0},tabindex:{type:Number,default:0}},data:()=>({activeItem:null}),methods:{getItemProp:(t,i)=>t?e.getItemValue(t[i]):void 0,getItemLabel(e){return this.getItemProp(e,"label")},isItemActive(t){return this.expandedKeys?this.expandedKeys[this.getItemProp(t,"key")]:e.equals(t,this.activeItem)},isItemVisible(e){return!1!==this.getItemProp(e,"visible")},isItemDisabled(e){return this.getItemProp(e,"disabled")},getPanelId(e){return`${this.id}_${e}`},getPanelKey(e){return this.getPanelId(e)},getHeaderId(e){return`${this.getPanelId(e)}_header`},getContentId(e){return`${this.getPanelId(e)}_content`},onHeaderClick(e,i){this.isItemDisabled(i)?e.preventDefault():(i.command&&i.command({originalEvent:e,item:i}),this.changeActiveItem(e,i),t.focus(e.currentTarget))},onHeaderKeyDown(e,t){switch(e.code){case"ArrowDown":this.onHeaderArrowDownKey(e);break;case"ArrowUp":this.onHeaderArrowUpKey(e);break;case"Home":this.onHeaderHomeKey(e);break;case"End":this.onHeaderEndKey(e);break;case"Enter":case"Space":this.onHeaderEnterKey(e,t)}},onHeaderArrowDownKey(e){const i=t.hasClass(e.currentTarget,"p-highlight")?t.findSingle(e.currentTarget.nextElementSibling,".p-panelmenu-root-list"):null;i?t.focus(i):this.updateFocusedHeader({originalEvent:e,focusOnNext:!0}),e.preventDefault()},onHeaderArrowUpKey(e){const i=this.findPrevHeader(e.currentTarget.parentElement)||this.findLastHeader(),s=t.hasClass(i,"p-highlight")?t.findSingle(i.nextElementSibling,".p-panelmenu-root-list"):null;s?t.focus(s):this.updateFocusedHeader({originalEvent:e,focusOnNext:!1}),e.preventDefault()},onHeaderHomeKey(e){this.changeFocusedHeader(e,this.findFirstHeader()),e.preventDefault()},onHeaderEndKey(e){this.changeFocusedHeader(e,this.findLastHeader()),e.preventDefault()},onHeaderEnterKey(e,i){const s=t.findSingle(e.currentTarget,".p-panelmenu-header-action");s?s.click():this.onHeaderClick(e,i),e.preventDefault()},onHeaderActionClick(e,t){t&&t(e)},findNextHeader(e,i=!1){const s=i?e:e.nextElementSibling,n=t.findSingle(s,".p-panelmenu-header");return n?t.hasClass(n,"p-disabled")?this.findNextHeader(n.parentElement):n:null},findPrevHeader(e,i=!1){const s=i?e:e.previousElementSibling,n=t.findSingle(s,".p-panelmenu-header");return n?t.hasClass(n,"p-disabled")?this.findPrevHeader(n.parentElement):n:null},findFirstHeader(){return this.findNextHeader(this.$el.firstElementChild,!0)},findLastHeader(){return this.findPrevHeader(this.$el.lastElementChild,!0)},updateFocusedHeader(e){const{originalEvent:i,focusOnNext:s,selfCheck:n}=e,a=i.currentTarget.closest(".p-panelmenu-panel"),r=n?t.findSingle(a,".p-panelmenu-header"):s?this.findNextHeader(a):this.findPrevHeader(a);r?this.changeFocusedHeader(i,r):s?this.onHeaderHomeKey(i):this.onHeaderEndKey(i)},changeActiveItem(t,i,s=!1){if(!this.isItemDisabled(i)){const n=this.isItemActive(i),a=n?"panel-close":"panel-open";this.activeItem=s?i:this.activeItem&&e.equals(i,this.activeItem)?null:i,this.changeExpandedKeys({item:i,expanded:!n}),this.$emit(a,{originalEvent:t,item:i})}},changeExpandedKeys({item:e,expanded:t=!1}){if(this.expandedKeys){let i={...this.expandedKeys};t?i[e.key]=!0:delete i[e.key],this.$emit("update:expandedKeys",i)}},changeFocusedHeader(e,i){i&&t.focus(i)},getPanelClass(e){return["p-panelmenu-panel",this.getItemProp(e,"class")]},getHeaderClass(e){return["p-panelmenu-header",this.getItemProp(e,"headerClass"),{"p-highlight":this.isItemActive(e),"p-disabled":this.isItemDisabled(e)}]},getHeaderActionClass(e,t){return["p-panelmenu-header-action",{"router-link-active":t&&t.isActive,"router-link-active-exact":this.exact&&t&&t.isExactActive}]},getHeaderIconClass(e){return["p-menuitem-icon",this.getItemProp(e,"icon")]},getHeaderToggleIconClass(e){return["p-submenu-icon",this.isItemActive(e)?"pi pi-chevron-down":"pi pi-chevron-right"]}},computed:{id(){return this.$attrs.id||i()}},components:{PanelMenuList:F}};const T=["id"],L=["id","tabindex","aria-label","aria-expanded","aria-controls","aria-disabled","onClick","onKeydown"],V={class:"p-panelmenu-header-content"},N=["href","onClick"],$={class:"p-menuitem-text"},B=["href"],M={class:"p-menuitem-text"},_=["id","aria-labelledby"],O={key:0,class:"p-panelmenu-content"};!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-panelmenu .p-panelmenu-header-action {\n display: flex;\n align-items: center;\n user-select: none;\n cursor: pointer;\n position: relative;\n text-decoration: none;\n}\n.p-panelmenu .p-panelmenu-header-action:focus {\n z-index: 1;\n}\n.p-panelmenu .p-submenu-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.p-panelmenu .p-menuitem-link {\n display: flex;\n align-items: center;\n user-select: none;\n cursor: pointer;\n text-decoration: none;\n position: relative;\n overflow: hidden;\n}\n.p-panelmenu .p-menuitem-text {\n line-height: 1;\n}\n"),S.render=function(e,t,i,s,a,k){const x=n("router-link"),K=n("PanelMenuList");return r(),l("div",{id:k.id,class:"p-panelmenu p-component"},[(r(!0),l(o,null,d(i.model,((t,s)=>(r(),l(o,{key:k.getPanelKey(s)},[k.isItemVisible(t)?(r(),l("div",{key:0,style:m(k.getItemProp(t,"style")),class:c(k.getPanelClass(t))},[u("div",{id:k.getHeaderId(s),class:c(k.getHeaderClass(t)),tabindex:k.isItemDisabled(t)?-1:i.tabindex,role:"button","aria-label":k.getItemLabel(t),"aria-expanded":k.isItemActive(t),"aria-controls":k.getContentId(s),"aria-disabled":k.isItemDisabled(t),onClick:e=>k.onHeaderClick(e,t),onKeydown:e=>k.onHeaderKeyDown(e,t)},[u("div",V,[e.$slots.item?(r(),h(y(e.$slots.item),{key:1,item:t},null,8,["item"])):(r(),l(o,{key:0},[k.getItemProp(t,"to")&&!k.isItemDisabled(t)?(r(),h(x,{key:0,to:k.getItemProp(t,"to"),custom:""},{default:p((({navigate:e,href:i,isActive:s,isExactActive:n})=>[u("a",{href:i,class:c(k.getHeaderActionClass(t,{isActive:s,isExactActive:n})),tabindex:-1,onClick:t=>k.onHeaderActionClick(t,e)},[k.getItemProp(t,"icon")?(r(),l("span",{key:0,class:c(k.getHeaderIconClass(t))},null,2)):g("",!0),u("span",$,f(k.getItemLabel(t)),1)],10,N)])),_:2},1032,["to"])):(r(),l("a",{key:1,href:k.getItemProp(t,"url"),class:c(k.getHeaderActionClass(t)),tabindex:-1},[k.getItemProp(t,"items")?(r(),l("span",{key:0,class:c(k.getHeaderToggleIconClass(t))},null,2)):g("",!0),k.getItemProp(t,"icon")?(r(),l("span",{key:1,class:c(k.getHeaderIconClass(t))},null,2)):g("",!0),u("span",M,f(k.getItemLabel(t)),1)],10,B))],64))])],42,L),v(b,{name:"p-toggleable-content"},{default:p((()=>[I(u("div",{id:k.getContentId(s),class:"p-toggleable-content",role:"region","aria-labelledby":k.getHeaderId(s)},[k.getItemProp(t,"items")?(r(),l("div",O,[v(K,{panelId:k.getPanelId(s),items:k.getItemProp(t,"items"),template:e.$slots.item,expandedKeys:i.expandedKeys,onItemToggle:k.changeExpandedKeys,onHeaderFocus:k.updateFocusedHeader,exact:i.exact},null,8,["panelId","items","template","expandedKeys","onItemToggle","onHeaderFocus","exact"])])):g("",!0)],8,_),[[P,k.isItemActive(t)]])])),_:2},1024)],6)):g("",!0)],64)))),128))],8,T)};export{S as default};