primereact
Version:
PrimeReact is an open source UI library for React featuring a rich set of 80+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with Prime
2 lines (1 loc) • 6.48 kB
JavaScript
import*as e from"react";import n from"primereact/api";import{CSSTransition as t}from"primereact/csstransition";import{useEventListener as r,useMountEffect as o,useUpdateEffect as a,useOverlayListener as i,useUnmountEffect as l}from"primereact/hooks";import{OverlayService as u}from"primereact/overlayservice";import{Portal as c}from"primereact/portal";import{classNames as s,DomHandler as p,IconUtils as m,ObjectUtils as f,ZIndexUtils as d}from"primereact/utils";import{Ripple as v}from"primereact/ripple";function h(){return h=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},h.apply(this,arguments)}function y(e){if(Array.isArray(e))return e}function b(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,o,a=[],i=!0,l=!1;try{for(t=t.call(e);!(i=(r=t.next()).done)&&(a.push(r.value),!n||a.length!==n);i=!0);}catch(e){l=!0,o=e}finally{try{i||null==t.return||t.return()}finally{if(l)throw o}}return a}}function g(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}function E(e,n){if(e){if("string"==typeof e)return g(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?g(e,n):void 0}}function w(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function N(e,n){return y(e)||b(e,n)||E(e,n)||w()}var S=e.memo((function(n){var t=N(e.useState(null),2),i=t[0],l=t[1],u=e.useRef(null),c=N(r({type:"click",listener:function(e){u.current&&!u.current.contains(e.target)&&l(null)}}),1)[0],d=function(){if(u.current){var e=u.current.parentElement,n=p.getOffset(e),t=p.getViewport(),r=u.current.offsetParent?u.current.offsetWidth:p.getHiddenElementOuterWidth(u.current),o=p.getOuterWidth(e.children[0]);parseInt(n.left,10)+o+r>t.width-p.calculateScrollbarWidth()&&p.addClass(u.current,"p-submenu-list-flipped")}},h=function(e,t){t.disabled?e.preventDefault():n.root?(i||n.popup)&&l(t):l(t)},y=function(e,t){t.disabled?e.preventDefault():(t.url||e.preventDefault(),t.command&&t.command({originalEvent:e,item:t}),n.root&&t.items&&l(i&&t===i?null:t),t.items||x())},b=function(e,t){var r=e.currentTarget.parentElement;switch(e.which){case 40:var o=E(r);o&&o.children[0].focus(),e.preventDefault();break;case 38:var a=w(r);a&&a.children[0].focus(),e.preventDefault();break;case 39:t.items&&(l(t),setTimeout((function(){r.children[1].children[0].children[0].focus()}),50)),e.preventDefault()}n.onKeyDown&&n.onKeyDown(e,r)},g=function(e,n){37===e.which&&(l(null),n.parentElement.previousElementSibling.focus())},E=function e(n){var t=n.nextElementSibling;return t?p.hasClass(t,"p-disabled")||!p.hasClass(t,"p-menuitem")?e(t):t:null},w=function e(n){var t=n.previousElementSibling;return t?p.hasClass(t,"p-disabled")||!p.hasClass(t,"p-menuitem")?e(t):t:null},x=function(){l(null),n.onLeafClick&&n.onLeafClick()};o((function(){c()})),a((function(){n.parentActive||l(null),!n.root&&n.parentActive&&d()}),[n.parentActive]);var C=function(n){return e.createElement("li",{key:"separator_"+n,className:"p-menu-separator",role:"separator"})},k=function(t){return t.items?e.createElement(S,{menuProps:n.menuProps,model:t.items,onLeafClick:x,popup:n.popup,onKeyDown:g,parentActive:t===i}):null},I=function(t,r){if(!1===t.visible)return null;var o=t.style,a=t.disabled,l=t.icon,u=t.label,c=t.items,p=t.target,d=t.url,g=t.template,E=u+"_"+r,w=i===t,N=s("p-menuitem",{"p-menuitem-active":w},t.className),S=s("p-menuitem-link",{"p-disabled":a}),x=s("p-menuitem-icon",l),C="p-submenu-icon pi pi-angle-right",I=m.getJSXIcon(l,{className:"p-menuitem-icon"},{props:n.menuProps}),D=u&&e.createElement("span",{className:"p-menuitem-text"},u),O=c&&e.createElement("span",{className:C}),T=k(t),A=e.createElement("a",{href:d||"#",className:S,target:p,role:"menuitem","aria-haspopup":null!=c,onClick:function(e){return y(e,t)},onKeyDown:function(e){return b(e,t)},"aria-disabled":a},I,D,O,e.createElement(v,null));g&&(A=f.getJSXElement(g,t,{onClick:function(e){return y(e,t)},onKeyDown:function(e){return b(e,t)},className:S,labelClassName:"p-menuitem-text",iconClassName:x,submenuIconClassName:C,element:A,props:n,active:w,disabled:a}));return e.createElement("li",{key:E,id:t,className:N,style:o,onMouseEnter:function(e){return h(e,t)},role:"none"},A,T)},D=function(e,n){return e.separator?C(n):I(e,n)},O=s({"p-submenu-list":!n.root}),T=n.model?n.model.map(D):null;return e.createElement("ul",{ref:u,className:O,role:n.root?"menubar":"menu","aria-orientation":"horizontal"},T)}));S.displayName="TieredMenuSub";var x=e.memo(e.forwardRef((function(r,o){var a=N(e.useState(!r.popup),2),m=a[0],v=a[1],y=e.useRef(null),b=e.useRef(null),g=N(i({target:b,overlay:y,listener:function(e,n){n.valid&&D(e)},when:m}),2),E=g[0],w=g[1],C=function(e){r.popup&&u.emit("overlay-click",{originalEvent:e,target:b.current})},k=function(e){r.popup&&(m?D(e):I(e))},I=function(e){b.current=e.currentTarget,v(!0),r.onShow&&r.onShow(e)},D=function(e){b.current=e.currentTarget,v(!1),r.onHide&&r.onHide(e)},O=function(){r.autoZIndex&&d.set("menu",y.current,n.autoZIndex,r.baseZIndex||n.zIndex.menu),p.absolutePosition(y.current,b.current)},T=function(){E()},A=function(){b.current=null,w()},P=function(){d.clear(y.current)};l((function(){d.clear(y.current)})),e.useImperativeHandle(o,(function(){return{props:r,toggle:k,show:I,hide:D,getElement:function(){return y.current}}}));var j,K,H=(j=f.findDiffKeys(r,x.defaultProps),K=s("p-tieredmenu p-component",{"p-tieredmenu-overlay":r.popup},r.className),e.createElement(t,{nodeRef:y,classNames:"p-connected-overlay",in:m,timeout:{enter:120,exit:100},options:r.transitionOptions,unmountOnExit:!0,onEnter:O,onEntered:T,onExit:A,onExited:P},e.createElement("div",h({ref:y,id:r.id,className:K,style:r.style},j,{onClick:C}),e.createElement(S,{menuProps:r,model:r.model,root:!0,popup:r.popup}))));return r.popup?e.createElement(c,{element:H,appendTo:r.appendTo}):H})));x.displayName="TieredMenu",x.defaultProps={__TYPE:"TieredMenu",id:null,model:null,popup:!1,style:null,className:null,autoZIndex:!0,baseZIndex:0,appendTo:null,transitionOptions:null,onShow:null,onHide:null};export{x as TieredMenu};