UNPKG

carbon-react

Version:

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

2 lines (1 loc) • 8.79 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),l=require("@floating-ui/dom"),r=require("@tanstack/react-virtual"),n=require("lodash/findLastIndex"),i=require("lodash/debounce"),o=require("../../../../hooks/__internal__/useScrollBlock/useScrollBlock.js"),a=require("../../../../hooks/__internal__/useModalManager/useModalManager.js"),s=require("./select-list.style.js"),u=require("../../../../__internal__/popover/popover.component.js"),c=require("../../option-row/option-row.component.js"),d=require("../utils/get-next-child-by-text.js"),f=require("../utils/get-next-index-by-key.js"),p=require("../utils/is-navigation-key.js"),b=require("../list-action-button/list-action-button.component.js"),v=require("../../../loader/loader.component.js"),m=require("../../option/option.component.js"),y=require("./select-list.context.js");function g(e){return e&&e.__esModule?e:{default:e}}var h=g(t),x=g(n),j=g(i);function O(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function S(e){for(var t=1;t<arguments.length;t++){var l=null!=arguments[t]?arguments[t]:{},r=Object.keys(l);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(l).filter((function(e){return Object.getOwnPropertyDescriptor(l,e).enumerable})))),r.forEach((function(t){O(e,t,l[t])}))}return e}function E(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t.push.apply(t,l)}return t}(Object(t)).forEach((function(l){Object.defineProperty(e,l,Object.getOwnPropertyDescriptor(t,l))})),e}const k={behavior:"auto",align:"end"},w=h.default.forwardRef(((n,i)=>{var{listMaxHeight:g=180,listActionButton:O,id:w,labelId:L,children:C,onSelect:P,onSelectListClose:q,filterText:T,anchorElement:_,highlightedValue:V,onListAction:M,isLoading:I,onListScrollBottom:B,multiColumn:H,tableHeader:R,listPlacement:A="bottom",flipEnabled:D=!0,isOpen:z,multiselectValues:W,enableVirtualScroll:K,virtualScrollOverscan:$=5,listWidth:F}=n,N=function(e,t){if(null==e)return{};var l,r,n=function(e,t){if(null==e)return{};var l,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)l=i[r],t.indexOf(l)>=0||(n[l]=e[l]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)l=i[r],t.indexOf(l)>=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(n[l]=e[l])}return n}(n,["listMaxHeight","listActionButton","id","labelId","children","onSelect","onSelectListClose","filterText","anchorElement","highlightedValue","onListAction","isLoading","onListScrollBottom","multiColumn","tableHeader","listPlacement","flipEnabled","isOpen","multiselectValues","enableVirtualScroll","virtualScrollOverscan","listWidth"]);const[U,Y]=t.useState(-1),[G,J]=t.useState(0),Q=t.useRef(""),X=t.useRef(null),Z=t.useRef(null),ee=t.useRef(null),te=t.useRef(null),{blockScroll:le,allowScroll:re}=o.default(),ne=t.useRef(0),ie=K?$:h.default.Children.count(C),oe=r.useVirtualizer({count:h.default.Children.count(C),getScrollElement:()=>z?i.current:null,estimateSize:()=>40,overscan:ie,paddingStart:H?48:0,scrollPaddingEnd:ne.current,rangeExtractor:e=>{const t=r.defaultRangeExtractor(e);return-1===U||t.includes(U)||t.push(U),t}});t.useEffect((()=>{if(!z)return;const e=U>-1?U:0;oe.scrollToIndex(e,k)}),[U,z,oe]);const ae=oe.getVirtualItems(),se=t.useMemo((()=>h.default.Children.toArray(C)),[C]),ue=t.useCallback((e=>se.findIndex((t=>{return t.props.value&&"object"==typeof e?(l=t.props.value,r=e,Object.keys(l).every((e=>l[e]===r[e]))):h.default.isValidElement(t)&&t.props.value===e;var l,r}))),[se]);if(0===ae.length){const e=V?ue(V):U;e>-1&&ae.push({index:e})}const ce=oe.getTotalSize(),de=0===ce?1:ce;t.useEffect((()=>(z&&le(),()=>{z&&re()})),[re,le,z]),t.useLayoutEffect((()=>{H&&J(Z.current?Z.current.offsetWidth-Z.current.clientWidth:0)}),[H]);const fe=t.useMemo((()=>({current:_||null})),[_]),pe=t.useCallback((e=>{var t,l,r;P({id:null!==(t=e.id)&&void 0!==t?t:"",text:null!==(l=e.text)&&void 0!==l?l:"",value:null!==(r=e.value)&&void 0!==r?r:"",selectionType:"click",selectionConfirmed:!0})}),[P]),be=t.useRef(Array.from({length:h.default.Children.count(C)})),ve=t.useMemo((()=>se.filter((e=>h.default.isValidElement(e)&&(e.type===m.default||e.type===c.default)))),[se]),{measureElement:me}=oe,ye=ae.filter((e=>void 0!==e)).map((({index:e,start:t})=>{const l=se[e],r=ve.indexOf(l),n=r>-1,i={index:e,onSelect:pe,hidden:I&&1===se.length,style:{transform:`translateY(${t}px)`},"aria-setsize":n?ve.length:void 0,"aria-posinset":n?r+1:void 0,ref:t=>{z&&me(t),be.current[e]=t},"data-index":e};return void 0!==l?h.default.cloneElement(l,i):null})).filter((e=>null!==e)),ge=x.default(se,(e=>h.default.isValidElement(e)&&(e.type===m.default||e.type===c.default))),he=t.useCallback(((e,t)=>{const l=ge;if(-1===l)return-1;let r=f.default(e,t,l,I);const n=se[r];return(h.default.isValidElement(n)&&n.type!==m.default&&n.type!==c.default||n.props.disabled)&&(r=he(e,r)),r}),[se,ge,I]),xe=t.useCallback((e=>{var t;let l=U;V&&(l=ue(V));const r=he(e,l);if(-1===r||l===r)return;const{text:n,value:i}=se[r].props;P({id:null===(t=be.current[r])||void 0===t?void 0:t.id,text:null!=n?n:"",value:null!=i?i:"",selectionType:"navigationKey",selectionConfirmed:!1})}),[se,U,ue,he,V,P]),je=t.useCallback(((e,t)=>{var l;t?q():(e.preventDefault(),null===(l=te.current)||void 0===l||l.focus())}),[q]),Oe=t.useCallback((()=>{_&&_.getElementsByTagName("input")[0].focus()}),[_]),Se=t.useCallback((e=>{if(!z)return;const{key:t}=e,l=document.activeElement===te.current;if("Tab"===t&&O)je(e,l);else if("Tab"===t)q();else if("Enter"!==t||l)p.default(t)&&(Oe(),xe(t));else{var r;e.preventDefault();const t=se[U];if(!h.default.isValidElement(t))return q(),void P({id:"",text:"",value:"",selectionType:"enterKey",selectionConfirmed:!1});if(t.props.disabled)return;const{text:l,value:n}=t.props;P({id:null===(r=be.current[U])||void 0===r?void 0:r.id,text:null!=l?l:"",value:null!=n?n:"",selectionType:"enterKey",selectionConfirmed:!0})}}),[se,O,je,q,U,P,xe,Oe,z]),Ee=t.useCallback((e=>{"Escape"===e.key&&q()}),[q]);a.default({open:!!z,closeModal:Ee,modalRef:X,triggerRefocusOnClose:!1}),t.useEffect((()=>{const e=i.current,t=j.default((e=>{const t=e.target;z&&t.scrollHeight-t.scrollTop===t.clientHeight&&(null==B||B())}),300);return null==e||e.addEventListener("scroll",t),()=>{null==e||e.removeEventListener("scroll",t)}}),[z,i,B]),t.useEffect((()=>(window.addEventListener("keydown",Se),function(){window.removeEventListener("keydown",Se)})),[Se,i]),t.useEffect((()=>{T&&T!==Q.current?(Q.current=T,Y((e=>{const t=d.default(T,se,e);if(!t)return-1;const l=ue(t.props.value);return oe.scrollToIndex(l,k),l}))):Q.current=T||""}),[se,T,ue,oe]),t.useEffect((()=>{if(!(V&&0!==Object.keys(V).length||z))return void Y(-1);const e=ue(V);-1!==e&&Y(e)}),[ue,V,z]),t.useEffect((()=>{I&&U===ge&&ge>-1&&oe.scrollToIndex(ge,E(S({},k),{align:"start"}))}),[C,U,I,ge,i,oe]);const ke=t.useMemo((()=>[l.offset(3),l.size({apply({rects:e,elements:t}){Object.assign(t.floating.style,{width:`${null!=F?F:e.reference.width}px`})}}),...D?[l.flip({fallbackStrategy:"initialPlacement"})]:[]]),[F,D]),we=I?e.jsx(s.StyledSelectLoaderContainer,{children:e.jsx(v.Loader,{"data-role":"select-list-loader"})},"loader"):void 0;let Le=ye;const Ce={role:"listbox",id:w,"aria-labelledby":L,"aria-multiselectable":!!W||void 0};return t.useLayoutEffect((()=>{var e,t;O&&z&&(ne.current=(null===(t=te.current)||void 0===t||null===(e=t.parentElement)||void 0===e?void 0:e.offsetHeight)||0)}),[O,z]),H&&(Le=e.jsxs(s.StyledSelectListTable,{children:[e.jsx(s.StyledSelectListTableHeader,{scrollbarWidth:G,children:R}),e.jsx(s.StyledSelectListTableBody,E(S({},Ce),{"aria-labelledby":L,ref:Z,listHeight:de-48,children:ye}))]})),e.jsx(y.default.Provider,{value:{currentOptionsListIndex:U,multiselectValues:W},children:e.jsx(u.default,{placement:A,disablePortal:!0,reference:fe,middleware:ke,isOpen:z,disableBackgroundUI:!0,animationFrame:!0,children:e.jsxs(s.StyledSelectListContainer,E(S({ref:ee,"data-element":"select-list-wrapper","data-role":"select-list-wrapper",isLoading:I},N),{children:[e.jsxs(s.StyledScrollableContainer,{ref:i,maxHeight:g,"data-component":"select-list-scrollable-container","data-element":"select-list-scrollable-container","data-role":"select-list-scrollable-container",hasActionButton:!!O,children:[e.jsx(s.StyledSelectList,E(S({as:H?"div":"ul","data-element":"select-list"},H?{}:Ce),{ref:X,tabIndex:-1,listHeight:H?void 0:de,children:Le})),we]}),O&&e.jsx(b.default,{ref:te,listActionButton:O,onListAction:M})]}))})})}));exports.default=w;