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.42 kB
JavaScript
import*as e from"react";import t from"primereact/api";import{CSSTransition as n}from"primereact/csstransition";import{useUpdateEffect as r,useEventListener as o,useResizeListener as l,useMountEffect as u,useUnmountEffect as a}from"primereact/hooks";import{Portal as i}from"primereact/portal";import{classNames as c,DomHandler as s,IconUtils as m,ObjectUtils as p,ZIndexUtils as f}from"primereact/utils";import{Ripple as d}from"primereact/ripple";function y(){return y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},y.apply(this,arguments)}function b(e){if(Array.isArray(e))return e}function g(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,l=[],u=!0,a=!1;try{for(n=n.call(e);!(u=(r=n.next()).done)&&(l.push(r.value),!t||l.length!==t);u=!0);}catch(e){a=!0,o=e}finally{try{u||null==n.return||n.return()}finally{if(a)throw o}}return l}}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function v(e,t){if(e){if("string"==typeof e)return h(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?h(e,t):void 0}}function E(){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 x(e,t){return b(e)||g(e,t)||v(e,t)||E()}var N=e.memo((function(t){var o=x(e.useState(null),2),l=o[0],u=o[1],a=e.useRef(null),i=t.root||!t.resetMenu;!0===t.resetMenu&&null!==l&&u(null);var f=function(e,t){t.disabled?e.preventDefault():u(t)},y=function(e,n){n.disabled?e.preventDefault():(n.url||e.preventDefault(),n.command&&n.command({originalEvent:e,item:n}),n.items||t.onLeafClick(e))},b=function(){var e=a.current.parentElement,t=s.getOffset(a.current.parentElement),n=s.getViewport(),r=a.current.offsetParent?a.current.offsetWidth:s.getHiddenElementOuterWidth(a.current),o=s.getOuterWidth(e.children[0]);a.current.style.top="0px",a.current.style.left=parseInt(t.left,10)+o+r>n.width-s.calculateScrollbarWidth()?-1*r+"px":o+"px"};r((function(){i&&b()}));var g=function(t){return e.createElement("li",{key:"separator_"+t,className:"p-menu-separator",role:"separator"})},h=function(n){return n.items?e.createElement(N,{menuProps:t.menuProps,model:n.items,resetMenu:n!==l,onLeafClick:t.onLeafClick}):null},v=function(n,r){if(!1===n.visible)return null;var o=l===n,u=n.label+"_"+r,a=c("p-menuitem",{"p-menuitem-active":o},n.className),i=c("p-menuitem-link",{"p-disabled":n.disabled}),s=c("p-menuitem-icon",n.icon),b="p-submenu-icon pi pi-angle-right",g=m.getJSXIcon(n.icon,{className:"p-menuitem-icon"},{props:t.menuProps}),v=n.label&&e.createElement("span",{className:"p-menuitem-text"},n.label),E=n.items&&e.createElement("span",{className:b}),x=h(n),N=e.createElement("a",{href:n.url||"#",className:i,target:n.target,onClick:function(e){return y(e,n)},role:"menuitem","aria-haspopup":null!=n.items,"aria-disabled":n.disabled},g,v,E,e.createElement(d,null));n.template&&(N=p.getJSXElement(n.template,n,{onClick:function(e){return y(e,n)},className:i,labelClassName:"p-menuitem-text",iconClassName:s,submenuIconClassName:b,element:N,props:t,active:o}));return e.createElement("li",{key:u,role:"none",id:n.id,className:a,style:n.style,onMouseEnter:function(e){return f(e,n)}},N,x)},E=function(e,t){return e.separator?g(t):v(e,t)},S=c({"p-submenu-list":!t.root}),O=t.model?t.model.map(E):null;return e.createElement(n,{nodeRef:a,classNames:"p-contextmenusub",in:i,timeout:{enter:0,exit:0},unmountOnExit:!0,onEnter:function(){b()}},e.createElement("ul",{ref:a,className:S},O))}));N.displayName="ContextMenuSub";var S=e.memo(e.forwardRef((function(m,d){var b=x(e.useState(!1),2),g=b[0],h=b[1],v=x(e.useState(!1),2),E=v[0],O=v[1],w=x(e.useState(!1),2),C=w[0],I=w[1],P=e.useRef(null),k=e.useRef(null),M=x(o({type:"click",listener:function(e){U(e)&&2!==e.button&&(_(e),I(!0))}}),2),H=M[0],T=M[1],L=x(o({type:"contextmenu",listener:function(e){Z(e)}}),1)[0],j=x(l({listener:function(e){g&&!s.isTouchDevice()&&_(e)}}),2),A=j[0],D=j[1],R=function(){I(!1)},W=function(){I(!1)},Z=function(e){e.stopPropagation(),e.preventDefault(),k.current=e,g?O(!0):(h(!0),m.onShow&&m.onShow(k.current))},_=function(e){k.current=e,h(!1),O(!1),m.onHide&&m.onHide(k.current)},X=function(){m.autoZIndex&&f.set("menu",P.current,t.autoZIndex,m.baseZIndex||t.zIndex.menu),z(k.current)},J=function(){$()},V=function(){q(),f.clear(P.current)},Y=function(){f.clear(P.current)},z=function(e){if(e){var t=e.pageX+1,n=e.pageY+1,r=P.current.offsetParent?P.current.offsetWidth:s.getHiddenElementOuterWidth(P.current),o=P.current.offsetParent?P.current.offsetHeight:s.getHiddenElementOuterHeight(P.current),l=s.getViewport();t+r-document.body.scrollLeft>l.width&&(t-=r),n+o-document.body.scrollTop>l.height&&(n-=o),t<document.body.scrollLeft&&(t=document.body.scrollLeft),n<document.body.scrollTop&&(n=document.body.scrollTop),P.current.style.left=t+"px",P.current.style.top=n+"px"}},K=function(e){I(!0),_(e),e.stopPropagation()},U=function(e){return P&&P.current&&!(P.current.isSameNode(e.target)||P.current.contains(e.target))},$=function(){A(),H()},q=function(){D(),T()};u((function(){m.global&&L()})),r((function(){g?(h(!1),O(!1),I(!0)):E||g||!C||Z(k.current)}),[E]),a((function(){f.clear(P.current)})),e.useImperativeHandle(d,(function(){return{props:m,show:Z,hide:_,getElement:function(){return P.current}}}));var B,F,G=(B=p.findDiffKeys(m,S.defaultProps),F=c("p-contextmenu p-component",m.className),e.createElement(n,{nodeRef:P,classNames:"p-contextmenu",in:g,timeout:{enter:250,exit:0},options:m.transitionOptions,unmountOnExit:!0,onEnter:X,onEntered:J,onExit:V,onExited:Y},e.createElement("div",y({ref:P,id:m.id,className:F,style:m.style},B,{onClick:R,onMouseEnter:W}),e.createElement(N,{menuProps:m,model:m.model,root:!0,resetMenu:C,onLeafClick:K}))));return e.createElement(i,{element:G,appendTo:m.appendTo})})));S.displayName="ContextMenu",S.defaultProps={__TYPE:"ContextMenu",id:null,model:null,style:null,className:null,global:!1,autoZIndex:!0,baseZIndex:0,appendTo:null,transitionOptions:null,onShow:null,onHide:null};export{S as ContextMenu};