UNPKG

carbon-react

Version:

A library of reusable React components for easily building user interfaces.

2 lines (1 loc) 5.7 kB
import{jsxs as e,jsx as t}from"react/jsx-runtime";import o,{forwardRef as r,useState as n,useRef as a,useContext as i,useMemo as l,useCallback as p,useImperativeHandle as c,useEffect as s}from"react";import u from"invariant";import d from"../../__internal__/utils/helpers/tags/tags.js";import{MenuItemDivider as b,MenuButton as m,StyledButtonIcon as f,ButtonIcon as v}from"./action-popover.style.js";import y from"../../__internal__/utils/helpers/events/events.js";import _ from"../../__internal__/popover/popover.component.js";import O from"../../__internal__/utils/helpers/guid/index.js";import j from"../../hooks/__internal__/useLocale/useLocale.js";import g from"./action-popover-menu/action-popover-menu.component.js";import{ActionPopoverItem as h}from"./action-popover-item/action-popover-item.component.js";import"./action-popover-divider/action-popover-divider.component.js";import{ActionPopoverProvider as P}from"./__internal__/action-popover.context.js";import x from"../../hooks/__internal__/useModalManager/useModalManager.js";import w from"../../hooks/__internal__/useAdaptiveSidebarModalFocus/useAdaptiveSidebarModalFocus.js";import{getItems as A,findFirstFocusableItem as S,findLastFocusableItem as D,checkChildrenForString as I}from"./__internal__/action-popover.utils.js";import M from"../flat-table/__internal__/flat-table.context.js";function k(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}const E=()=>{},L=()=>{},B=r(((r,B)=>{var{children:K,id:$,onOpen:C=E,onClose:F=L,rightAlignMenu:z,renderButton:R,placement:N="bottom",horizontalAlignment:U="left",submenuPosition:q="left","aria-label":T,"aria-labelledby":V,"aria-describedby":G}=r,H=function(e,t){if(null==e)return{};var o,r,n=function(e,t){if(null==e)return{};var o,r,n={},a=Object.keys(e);for(r=0;r<a.length;r++)o=a[r],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)o=a[r],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}(r,["children","id","onOpen","onClose","rightAlignMenu","renderButton","placement","horizontalAlignment","submenuPosition","aria-label","aria-labelledby","aria-describedby"]);const J=j(),[Q,W]=n(!1),[X,Y]=n(0),[Z]=n(O()),ee=a(null),te=a(null),{isInFlatTable:oe}=i(M),[re,ne]=n(null),ae=l((()=>!o.Children.toArray(K).find((e=>!o.isValidElement(e)||e.type!==h&&e.type!==b))),[K]),ie=l((()=>A(K)),[K]),le=S(ie),pe=D(ie);u(ae,`ActionPopover only accepts children of type \`${h.displayName}\` and \`${b.displayName}\`.`);const ce=l((()=>"top"!==N||z?"top"===N&&z?"top-start":"bottom"===N&&z?"bottom-start":"bottom-end":"top-end"),[N,z]),se=p((e=>{e&&!Q&&C(),!e&&Q&&F(),W(e)}),[Q,C,F]),ue=p((()=>{var e;const t=null===(e=ee.current)||void 0===e?void 0:e.querySelector("[data-element='action-popover-button']");null==t||t.focus()}),[]);c(B,(()=>({focusButton(){ue()}})),[ue]);const de=p((e=>{e.stopPropagation();const t=!Q;Y(le),se(t),t||ue()}),[Q,le,se,ue]),be=p((e=>{y.isSpaceKey(e)||y.isDownKey(e)||y.isEnterKey(e)?(e.preventDefault(),e.stopPropagation(),Y(le),se(!0)):y.isUpKey(e)&&(e.preventDefault(),e.stopPropagation(),Y(pe),se(!0))}),[le,pe,se]),me=p((e=>{y.isEscKey(e)&&(se(!1),ue())}),[se,ue]);x({open:Q,closeModal:me,modalRef:ee}),s((()=>{const e=({target:e})=>{var t,o;const r=null==te||null===(t=te.current)||void 0===t?void 0:t.contains(e),n=null==ee||null===(o=ee.current)||void 0===o?void 0:o.contains(e);r||n||se(!1)},t="click";return document.addEventListener(t,e,{capture:!0}),function(){document.removeEventListener(t,e,{capture:!0})}}),[se]),w((()=>W(!1)));const fe=$||`ActionPopoverButton_${Z}`,ve=`ActionPopoverMenu_${Z}`;return e(m,(ye=function(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{},r=Object.keys(o);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(o).filter((function(e){return Object.getOwnPropertyDescriptor(o,e).enumerable})))),r.forEach((function(t){k(e,t,o[t])}))}return e}({id:fe,onKeyDown:be,onClick:de,isOpen:Q,ref:ee},H,d("action-popover-wrapper",H)),_e=null!=(_e={children:[(e=>{if(R){const t=R({tabIndex:Q?-1:0,"data-element":"action-popover-button",ariaAttributes:{"aria-haspopup":"true","aria-label":T||J.actionPopover.ariaLabel(),"aria-labelledby":V,"aria-describedby":G,"aria-controls":e,"aria-expanded":`${Q}`}}),o=I(t);return R({tabIndex:Q?-1:0,"data-element":"action-popover-button",ariaAttributes:{"aria-haspopup":"true","aria-label":o?void 0:T||J.actionPopover.ariaLabel(),"aria-labelledby":V,"aria-describedby":G,"aria-controls":e,"aria-expanded":`${Q}`}})}return t(f,{role:"button","aria-haspopup":"true","aria-label":T||J.actionPopover.ariaLabel(),"aria-labelledby":V,"aria-describedby":G,"aria-controls":e,"aria-expanded":Q,tabIndex:Q?-1:0,"data-element":"action-popover-button",children:t(v,{type:"ellipsis_vertical"})})})(ve),t(P,{value:{setOpenPopover:se,focusButton:ue,submenuPosition:q,horizontalAlignment:U,selectedSubmenuRef:re,setSelectedSubmenuRef:ne},children:Q&&t(_,{placement:ce,reference:ee,disableBackgroundUI:oe,children:t(g,{"data-component":"action-popover",ref:te,parentID:fe,menuID:ve,focusIndex:X,setFocusIndex:Y,isOpen:Q,setOpen:se,placement:N,children:K})})})]})?_e:{},Object.getOwnPropertyDescriptors?Object.defineProperties(ye,Object.getOwnPropertyDescriptors(_e)):function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t.push.apply(t,o)}return t}(Object(_e)).forEach((function(e){Object.defineProperty(ye,e,Object.getOwnPropertyDescriptor(_e,e))})),ye));var ye,_e}));export{B as ActionPopover,B as default};