@onewelcome/react-lib-components 10.0.0 → 10.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs.js +2 -2
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.es.js +5 -5
- package/dist/components/Button/BaseButton.module.scss.cjs.js +2 -2
- package/dist/components/Button/BaseButton.module.scss.es.js +4 -4
- package/dist/components/Button/Button.module.scss.cjs.js +2 -2
- package/dist/components/Button/Button.module.scss.es.js +17 -17
- package/dist/components/Button/IconButton.module.scss.cjs.js +2 -2
- package/dist/components/Button/IconButton.module.scss.es.js +18 -18
- package/dist/components/ContextMenu/ContextMenu.module.scss.cjs.js +2 -2
- package/dist/components/ContextMenu/ContextMenu.module.scss.es.js +5 -5
- package/dist/components/ContextMenu/ContextMenuItem.module.scss.cjs.js +2 -2
- package/dist/components/ContextMenu/ContextMenuItem.module.scss.es.js +3 -3
- package/dist/components/DataGrid/DataGrid.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGrid.module.scss.es.js +6 -6
- package/dist/components/DataGrid/DataGridActions/DataGridActions.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridActions/DataGridActions.module.scss.es.js +6 -6
- package/dist/components/DataGrid/DataGridActions/DataGridColumnsToggle.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridActions/DataGridColumnsToggle.module.scss.es.js +7 -7
- package/dist/components/DataGrid/DataGridBody/DataGridBody.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridBody/DataGridBody.module.scss.es.js +2 -2
- package/dist/components/DataGrid/DataGridBody/DataGridCell/DataGridCell.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridBody/DataGridCell/DataGridCell.module.scss.es.js +5 -5
- package/dist/components/DataGrid/DataGridBody/DataGridDrawer/DataGridDrawer.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridBody/DataGridDrawer/DataGridDrawer.module.scss.es.js +4 -4
- package/dist/components/DataGrid/DataGridBody/DataGridDrawer/DataGridDrawerItem.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridBody/DataGridDrawer/DataGridDrawerItem.module.scss.es.js +5 -5
- package/dist/components/DataGrid/DataGridBody/DataGridRow/DataGridRow.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridBody/DataGridRow/DataGridRow.module.scss.es.js +24 -24
- package/dist/components/DataGrid/DataGridFilters/DataGridFilter.cjs.js +1 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridFilter.cjs.js.map +1 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridFilter.es.js +0 -8
- package/dist/components/DataGrid/DataGridFilters/DataGridFilter.es.js.map +1 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridFilter.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridFilters/DataGridFilter.module.scss.es.js +9 -9
- package/dist/components/DataGrid/DataGridFilters/DataGridToolbar.cjs.js +1 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridToolbar.cjs.js.map +1 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridToolbar.es.js +4 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridToolbar.es.js.map +1 -1
- package/dist/components/DataGrid/DataGridFilters/DataGridToolbar.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridFilters/DataGridToolbar.module.scss.es.js +8 -8
- package/dist/components/DataGrid/DataGridFilters/DateTimePicker/DateTimePicker.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridFilters/DateTimePicker/DateTimePicker.module.scss.es.js +17 -17
- package/dist/components/DataGrid/DataGridHeader/DataGridHeader.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridHeader/DataGridHeader.module.scss.es.js +3 -3
- package/dist/components/DataGrid/DataGridHeader/DataGridHeaderCell.module.scss.cjs.js +2 -2
- package/dist/components/DataGrid/DataGridHeader/DataGridHeaderCell.module.scss.es.js +7 -7
- package/dist/components/DatePicker/DatePicker.module.scss.cjs.js +2 -2
- package/dist/components/DatePicker/DatePicker.module.scss.es.js +31 -31
- package/dist/components/Form/Checkbox/Checkbox.module.scss.cjs.js +2 -2
- package/dist/components/Form/Checkbox/Checkbox.module.scss.es.js +13 -13
- package/dist/components/Form/Fieldset/Fieldset.module.scss.cjs.js +2 -2
- package/dist/components/Form/Fieldset/Fieldset.module.scss.es.js +5 -5
- package/dist/components/Form/FileUpload/FileItem/FileItem.module.scss.cjs.js +2 -2
- package/dist/components/Form/FileUpload/FileItem/FileItem.module.scss.es.js +18 -18
- package/dist/components/Form/FileUpload/FileUpload.module.scss.cjs.js +2 -2
- package/dist/components/Form/FileUpload/FileUpload.module.scss.es.js +16 -16
- package/dist/components/Form/Form.module.scss.cjs.js +2 -2
- package/dist/components/Form/Form.module.scss.es.js +2 -2
- package/dist/components/Form/FormControl/FormControl.module.scss.cjs.js +2 -2
- package/dist/components/Form/FormControl/FormControl.module.scss.es.js +13 -13
- package/dist/components/Form/FormErrorText/FormErrorText.module.scss.cjs.js +2 -2
- package/dist/components/Form/FormErrorText/FormErrorText.module.scss.es.js +5 -5
- package/dist/components/Form/FormGroup/FormGroup.module.scss.cjs.js +2 -2
- package/dist/components/Form/FormGroup/FormGroup.module.scss.es.js +3 -3
- package/dist/components/Form/FormHelperText/FormHelperText.module.scss.cjs.js +2 -2
- package/dist/components/Form/FormHelperText/FormHelperText.module.scss.es.js +4 -4
- package/dist/components/Form/FormSelectorWrapper/FormSelectorWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/FormSelectorWrapper/FormSelectorWrapper.module.scss.es.js +6 -6
- package/dist/components/Form/Input/Input.module.scss.cjs.js +2 -2
- package/dist/components/Form/Input/Input.module.scss.es.js +9 -9
- package/dist/components/Form/Label/Label.module.scss.cjs.js +2 -2
- package/dist/components/Form/Label/Label.module.scss.es.js +2 -2
- package/dist/components/Form/Radio/Radio.module.scss.cjs.js +2 -2
- package/dist/components/Form/Radio/Radio.module.scss.es.js +11 -11
- package/dist/components/Form/Select/MultiSelect/MultiSelect.cjs.js +1 -1
- package/dist/components/Form/Select/MultiSelect/MultiSelect.cjs.js.map +1 -1
- package/dist/components/Form/Select/MultiSelect/MultiSelect.es.js +64 -7
- package/dist/components/Form/Select/MultiSelect/MultiSelect.es.js.map +1 -1
- package/dist/components/Form/Select/MultiSelect/MultiSelect.module.scss.cjs.js +2 -2
- package/dist/components/Form/Select/MultiSelect/MultiSelect.module.scss.es.js +15 -15
- package/dist/components/Form/Select/MultiSelect/SelectButton.module.scss.cjs.js +2 -2
- package/dist/components/Form/Select/MultiSelect/SelectButton.module.scss.es.js +2 -2
- package/dist/components/Form/Select/MultiSelect/SelectedOptions.module.scss.cjs.js +2 -2
- package/dist/components/Form/Select/MultiSelect/SelectedOptions.module.scss.es.js +4 -4
- package/dist/components/Form/Select/Select.interfaces.cjs.js.map +1 -1
- package/dist/components/Form/Select/Select.interfaces.es.js.map +1 -1
- package/dist/components/Form/Select/SingleSelect/Select.module.scss.cjs.js +2 -2
- package/dist/components/Form/Select/SingleSelect/Select.module.scss.es.js +17 -17
- package/dist/components/Form/Select/useAddNewBtn.module.scss.cjs.js +2 -2
- package/dist/components/Form/Select/useAddNewBtn.module.scss.es.js +4 -4
- package/dist/components/Form/Textarea/Textarea.module.scss.cjs.js +2 -2
- package/dist/components/Form/Textarea/Textarea.module.scss.es.js +6 -6
- package/dist/components/Form/Toggle/Toggle.module.scss.cjs.js +2 -2
- package/dist/components/Form/Toggle/Toggle.module.scss.es.js +18 -18
- package/dist/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.module.scss.es.js +3 -3
- package/dist/components/Form/Wrapper/InputWrapper/InputWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/InputWrapper/InputWrapper.module.scss.es.js +4 -4
- package/dist/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/MultiSelectWrapper/MultiSelectWrapper.module.scss.es.js +3 -3
- package/dist/components/Form/Wrapper/RadioWrapper/RadioWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/RadioWrapper/RadioWrapper.module.scss.es.js +3 -3
- package/dist/components/Form/Wrapper/SelectWrapper/SelectWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/SelectWrapper/SelectWrapper.module.scss.es.js +3 -3
- package/dist/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/TextareaWrapper/TextareaWrapper.module.scss.es.js +8 -8
- package/dist/components/Form/Wrapper/Wrapper/Wrapper.module.scss.cjs.js +2 -2
- package/dist/components/Form/Wrapper/Wrapper/Wrapper.module.scss.es.js +6 -6
- package/dist/components/Icon/Icon.module.scss.cjs.js +2 -2
- package/dist/components/Icon/Icon.module.scss.es.js +104 -104
- package/dist/components/Layout/Card/Card.module.scss.cjs.js +2 -2
- package/dist/components/Layout/Card/Card.module.scss.es.js +12 -12
- package/dist/components/Layout/ContentHeader/ContentHeader.module.scss.cjs.js +2 -2
- package/dist/components/Layout/ContentHeader/ContentHeader.module.scss.es.js +12 -12
- package/dist/components/Layout/FormPage/FormWithStepper/FormSection/FormSection.module.scss.cjs.js +2 -2
- package/dist/components/Layout/FormPage/FormWithStepper/FormSection/FormSection.module.scss.es.js +4 -4
- package/dist/components/Layout/FormPage/FormWithStepper/FormStepper/FormStepper.module.scss.cjs.js +2 -2
- package/dist/components/Layout/FormPage/FormWithStepper/FormStepper/FormStepper.module.scss.es.js +2 -2
- package/dist/components/Layout/FormPage/FormWithStepper/FormWithStepper.module.scss.cjs.js +2 -2
- package/dist/components/Layout/FormPage/FormWithStepper/FormWithStepper.module.scss.es.js +3 -3
- package/dist/components/Link/Link.module.scss.cjs.js +2 -2
- package/dist/components/Link/Link.module.scss.es.js +16 -16
- package/dist/components/Notifications/Alert/AlertContainer/AlertContainer.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/Alert/AlertContainer/AlertContainer.module.scss.es.js +11 -11
- package/dist/components/Notifications/Alert/AlertItem/AlertItem.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/Alert/AlertItem/AlertItem.module.scss.es.js +22 -22
- package/dist/components/Notifications/Banner/Banner.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/Banner/Banner.module.scss.es.js +9 -9
- package/dist/components/Notifications/BaseModal/BaseModal.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/BaseModal/BaseModal.module.scss.es.js +5 -5
- package/dist/components/Notifications/BaseModal/BaseModalActions/BaseModalActions.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/BaseModal/BaseModalActions/BaseModalActions.module.scss.es.js +4 -4
- package/dist/components/Notifications/BaseModal/BaseModalContent/BaseModalContent.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/BaseModal/BaseModalContent/BaseModalContent.module.scss.es.js +2 -2
- package/dist/components/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.module.scss.es.js +6 -6
- package/dist/components/Notifications/Dialog/Dialog.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/Dialog/Dialog.module.scss.es.js +4 -4
- package/dist/components/Notifications/Dialog/DialogActions/DialogActions.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/Dialog/DialogActions/DialogActions.module.scss.es.js +3 -3
- package/dist/components/Notifications/Dialog/DialogTitle/DialogTitle.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/Dialog/DialogTitle/DialogTitle.module.scss.es.js +10 -10
- package/dist/components/Notifications/SideSheet/SideSheet.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/SideSheet/SideSheet.module.scss.es.js +13 -13
- package/dist/components/Notifications/SideSheet/SideSheetContent/SideSheetContent.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/SideSheet/SideSheetContent/SideSheetContent.module.scss.es.js +2 -2
- package/dist/components/Notifications/SideSheet/SideSheetHeader/SideSheetHeader.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/SideSheet/SideSheetHeader/SideSheetHeader.module.scss.es.js +2 -2
- package/dist/components/Notifications/SlideInModal/SlideInModal.module.scss.cjs.js +2 -2
- package/dist/components/Notifications/SlideInModal/SlideInModal.module.scss.es.js +10 -10
- package/dist/components/Pagination/Pagination.module.scss.cjs.js +2 -2
- package/dist/components/Pagination/Pagination.module.scss.es.js +14 -14
- package/dist/components/Popover/Popover.module.scss.cjs.js +2 -2
- package/dist/components/Popover/Popover.module.scss.es.js +3 -3
- package/dist/components/ProgressBar/ProgressBar.module.scss.cjs.js +2 -2
- package/dist/components/ProgressBar/ProgressBar.module.scss.es.js +9 -9
- package/dist/components/Skeleton/Skeleton.module.scss.cjs.js +2 -2
- package/dist/components/Skeleton/Skeleton.module.scss.es.js +5 -5
- package/dist/components/Spinner/Spinner.module.scss.cjs.js +2 -2
- package/dist/components/Spinner/Spinner.module.scss.es.js +3 -3
- package/dist/components/Stepper/Step.module.scss.cjs.js +2 -2
- package/dist/components/Stepper/Step.module.scss.es.js +22 -22
- package/dist/components/Stepper/Stepper.module.scss.cjs.js +2 -2
- package/dist/components/Stepper/Stepper.module.scss.es.js +4 -4
- package/dist/components/Tabs/Tab.module.scss.cjs.js +2 -2
- package/dist/components/Tabs/Tab.module.scss.es.js +3 -3
- package/dist/components/Tabs/TabButton.module.scss.cjs.js +2 -2
- package/dist/components/Tabs/TabButton.module.scss.es.js +12 -12
- package/dist/components/Tabs/Tabs.module.scss.cjs.js +2 -2
- package/dist/components/Tabs/Tabs.module.scss.es.js +10 -10
- package/dist/components/Tag/RemoveButton.module.scss.cjs.js +2 -2
- package/dist/components/Tag/RemoveButton.module.scss.es.js +3 -3
- package/dist/components/Tag/Tag.module.scss.cjs.js +2 -2
- package/dist/components/Tag/Tag.module.scss.es.js +6 -6
- package/dist/components/TextEllipsis/TextEllipsis.module.scss.cjs.js +2 -2
- package/dist/components/TextEllipsis/TextEllipsis.module.scss.es.js +3 -3
- package/dist/components/Tiles/Tile.module.scss.cjs.js +2 -2
- package/dist/components/Tiles/Tile.module.scss.es.js +8 -8
- package/dist/components/Tiles/Tiles.module.scss.cjs.js +2 -2
- package/dist/components/Tiles/Tiles.module.scss.es.js +2 -2
- package/dist/components/Tooltip/Tooltip.module.scss.cjs.js +2 -2
- package/dist/components/Tooltip/Tooltip.module.scss.es.js +27 -27
- package/dist/components/Typography/Typography.module.scss.cjs.js +2 -2
- package/dist/components/Typography/Typography.module.scss.es.js +13 -13
- package/dist/components/admin/layout/LeftNav/LeftNav.module.scss.cjs.js +2 -2
- package/dist/components/admin/layout/LeftNav/LeftNav.module.scss.es.js +5 -5
- package/dist/components/admin/layout/LeftNav/LeftNavItem/LeftNavItem.module.scss.cjs.js +2 -2
- package/dist/components/admin/layout/LeftNav/LeftNavItem/LeftNavItem.module.scss.es.js +14 -14
- package/dist/components/admin/layout/MicrofrontendContainer/MicrofrontendContainer.module.scss.cjs.js +2 -2
- package/dist/components/admin/layout/MicrofrontendContainer/MicrofrontendContainer.module.scss.es.js +3 -3
- package/dist/components/miscellaneous/IdentityProviderButton.module.scss.cjs.js +2 -2
- package/dist/components/miscellaneous/IdentityProviderButton.module.scss.es.js +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/readyclasses.module.scss.cjs.js +2 -2
- package/dist/readyclasses.module.scss.es.js +5 -5
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./MultiSelect.module.scss.cjs.js"),t=require("react"),s=require("../../../../hooks/useClickOutside.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./MultiSelect.module.scss.cjs.js"),t=require("react"),s=require("react-dom"),r=require("../../../../hooks/useClickOutside.cjs.js"),n=require("../../../../hooks/useDetermineStatusIcon.cjs.js"),l=require("../../../../hooks/useGetDomRoot.cjs.js"),a=require("../../../../readyclasses.module.scss.cjs.js"),o=require("../../../../util/helper.cjs.js"),i=require("../../../Icon/Icon.cjs.js"),c=require("../Select.interfaces.cjs.js"),u=require("../useAddNewBtn.cjs.js"),d=require("../useSelectPositionList.cjs.js"),p=require("./SelectButton.cjs.js"),f=require("./SelectedOptions.cjs.js"),m=require("./useArrowNavigation.cjs.js"),h=require("./useSearch.cjs.js"),v=require("../../../withReadOnly.cjs.js"),b=(e,t)=>`${e}_option${t}`,w=e=>`${e}_listbox`,y=e=>t.Children.toArray(e).reduce(((e,s)=>"string"==typeof s||"number"==typeof s?e+s:t.isValidElement(s)&&s.props.children?e+y(s.props.children):e),""),E=v.withReadOnly(t.forwardRef((({id:v,children:E,name:j,disabled:S=!1,labeledBy:C,placeholder:g,describedBy:R,selectButtonProps:x={},className:N,error:I=!1,success:q=!1,value:B,clearLabel:O="Clear selection",noResultsLabel:L="No results found",onChange:P,addNew:$,search:k={enabled:!0,renderThreshold:0,searchPlaceholder:"Search item"},isReadOnlyView:A,domRoot:D,...F},z)=>{const M=t.useRef(v??o.generateID(20)),[T,V]=t.useState(!1),[H,G]=t.useState([]),_=t.useRef(null),K=t.useRef(null),U=t.useRef(null),J=t.useRef(null),{root:Q}=l.useGetDomRoot(D,_),[W,X]=t.useState(0),[Y,Z]=t.useState(!1),[ee,te]=t.useState(!1),[se,re]=t.useState(t.Children.count(E)-H.length),{filter:ne,renderSearch:le,searchInputRef:ae,resetSearchState:oe,searchVisible:ie}=h.useSearch({selectId:M.current,expanded:T,search:k,searchInputClassName:e.default["select-search"],optionsCount:se,focusedSelectItem:W,setFocusedSelectItem:X,describedBy:R,getOptionId:b,getListboxId:w}),{addBtnRef:ce,addNewBtnOptionsContainerClassName:ue,renderAddNew:de}=u.useAddNewBtn({id:b(M.current,se),addNew:$,filter:ne,focusedSelectItem:W,optionsCount:se,searchInputRef:ae,shouldClick:Y,onClickCallback:()=>{Z(!1),oe()}}),pe=z||t.createRef(),fe=t.useRef(null),me=!!F["data-readonlyview"]||A,{onArrowNavigation:he}=m.useArrowNavigation({expanded:T,setExpanded:V,setFocusedSelectItem:X,childrenCount:se,setShouldClick:Z,addBtnRef:ce,searchInputRef:ae,customSelectButtonRef:fe,onClose:oe,isReadOnlyView:me}),{listPosition:ve,opacity:be,optionsListMaxHeight:we,setListPosition:ye,setOpacity:Ee}=d.useSelectPositionList({expanded:T,optionListReference:U,containerReference:K,addBtnRef:ce}),je=n.useDetermineStatusIcon({success:q,error:I});t.useEffect((()=>{T&&ae.current&&(te(!0),ae.current.focus()),!T&&fe.current&&ee&&(te(!1),fe.current.focus())}),[T,fe.current,ee,ae.current]),t.useEffect((()=>{var e;(e=>{const s=t.Children.map(E,(e=>e)),r=e.map((e=>{const t=s.find((t=>t.props.value===e));return{value:e,label:null==t?void 0:t.props.children,fixed:null==t?void 0:t.props.fixed}}));G(r)})(B),e=B,pe.current&&[...pe.current.options].forEach((t=>{e.includes(t.value)?t.selected=!0:t.selected=!1}))}),[B]),r.useClickOutside(_,(()=>{T&&(V(!1),ye(c.Position.Below),Ee(0))}),[T]);const Se=[];T&&Se.push(e.default.expanded),I&&Se.push(e.default.error),S&&Se.push(e.default.disabled),N&&Se.push(N),q&&Se.push(e.default.success);const Ce=()=>{F["data-readonlyview"]||A||(V((e=>!e)),Z(!1))};t.useEffect((()=>{if(!T)return;const e=K.current,t=J.current;if(!e||!t)return;let s=null;const r=()=>{if(!e||!t)return;const s=e.getBoundingClientRect(),r=s.left,n=ve===c.Position.Below?s.bottom:s.top;t.style.position="fixed",t.style.zIndex="1000",t.style.left="0",t.style.top="0",t.style.width=`${s.width}px`,t.style.transform=`translate3d(${r}px, ${n}px, 0)`},n=()=>{null==s&&(s=globalThis.requestAnimationFrame((()=>{s=null,r()})))};r();const l=()=>n(),a=()=>n();window.addEventListener("scroll",l,{passive:!0,capture:!0}),window.addEventListener("resize",a);const o=new ResizeObserver((()=>{n()}));return o.observe(e),()=>{window.removeEventListener("scroll",l,!0),window.removeEventListener("resize",a),o.disconnect(),null!=s&&globalThis.cancelAnimationFrame(s)}}),[T,ve]);const ge=t.createElement("div",{className:`list-wrapper-container ${e.default["list-wrapper-container"]}`},t.createElement("div",{ref:U,className:`list-wrapper ${e.default["list-wrapper"]}`,style:{display:T?"block":"none",opacity:be,maxHeight:we.wrapper,pointerEvents:T?"auto":"none",top:ve===c.Position.Below?"4px":void 0,bottom:ve===c.Position.Above?"4px":void 0}},t.createElement("ul",{id:w(M.current),className:ue,role:"listbox","aria-multiselectable":"true",style:{maxHeight:we.list}},(()=>{const s=e=>e.filter((e=>"object"==typeof e&&"props"in e&&!H.find((t=>t.value===e.props.value))));let r;return r=n(s(""!==ne?t.Children.toArray(E).filter((e=>y(e.props.children).toLowerCase().includes(ne.toLowerCase()))):t.Children.toArray(E))),se!==r.length&&re(r.length),0===r.length?t.createElement("li",{className:e.default["no-results"]},L):r;function n(e){return t.Children.map(e,((e,s)=>t.cloneElement(e,{onFocusChange:e=>{X(e)},onOptionSelect:e=>{(e=>{if(pe.current&&e){const t=e.getAttribute("data-value"),s=[...pe.current.options],r=s.filter((e=>e.selected)).map((e=>e.value));s.forEach((e=>{(e.value===t||r.includes(e.value))&&(e.selected=!0)})),pe.current.dispatchEvent(new Event("change",{bubbles:!0}))}V(!1),oe()})(e.current),V(!1),Z(!1)},isSearching:!1,selectOpened:T,childIndex:s,hasFocus:W===s,shouldClick:Y,id:b(M.current,s)})))}})()),de()));return t.createElement(t.Fragment,null,t.createElement("div",{ref:_},t.createElement("select",{...o.filterProps(F,/^data-/,!1),tabIndex:-1,multiple:!0,"aria-hidden":"true",ref:pe,name:j,onChange:e=>{null==P||P(e)},className:a.default["sr-only"]},t.createElement("option",{value:""}),t.Children.map(E,(e=>t.createElement("option",{value:e.props.value})))),t.createElement("div",{...o.filterProps(F,/^data-/),id:M.current,ref:K,onKeyDown:he,className:`custom-select ${e.default.select} ${Se.join(" ")}`},t.createElement("div",{className:`${e.default["custom-select"]} ${Se.join(" ")} `,style:{display:"flex"}},t.createElement("div",{className:e.default["display-container"],"data-display":!0},t.createElement(p.SelectButton,{...x,onClick:Ce,name:j,ref:fe,disabled:S,"aria-disabled":S,"aria-invalid":I,"aria-expanded":T,"aria-haspopup":"listbox","aria-labelledby":C,"aria-describedby":R}),0===(null==B?void 0:B.length)&&g&&t.createElement("span",{className:e.default.placeholder},g),(null==B?void 0:B.length)>0&&t.createElement(f.SelectedOptions,{disabled:S,display:H,onClick:Ce,onRemove:e=>{pe.current&&([...pe.current.options].find((t=>t.value===e)).selected=!1,pe.current.dispatchEvent(new Event("change",{bubbles:!0})))}}),ie&&le()),t.createElement("div",{className:e.default.status},je||(T?t.createElement(i.Icon,{className:e.default["chevron-icon"],icon:i.Icons.ChevronUp}):t.createElement(i.Icon,{className:e.default["chevron-icon"],icon:i.Icons.ChevronDown})))))),s.createPortal(t.createElement("div",{ref:J,className:`${e.default.select} ${Se.join(" ")}`},ge),Q))})));exports.MultiSelect=E;
|
|
2
2
|
//# sourceMappingURL=MultiSelect.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelect.cjs.js","sources":["../../../../../src/components/Form/Select/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/*\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classes from \"./MultiSelect.module.scss\";\n\nimport React, {\n ForwardRefRenderFunction,\n ReactElement,\n createRef,\n useEffect,\n useRef,\n useState\n} from \"react\";\nimport { useClickOutside } from \"../../../../hooks/useClickOutside\";\nimport { useDetermineStatusIcon } from \"../../../../hooks/useDetermineStatusIcon\";\nimport readyclasses from \"../../../../readyclasses.module.scss\";\nimport { filterProps, generateID } from \"../../../../util/helper\";\nimport { Icon, Icons } from \"../../../Icon/Icon\";\nimport { MultiSelectProps, Position } from \"../Select.interfaces\";\nimport { useAddNewBtn } from \"../useAddNewBtn\";\nimport { useSelectPositionList } from \"../useSelectPositionList\";\nimport { SelectButton } from \"./SelectButton\";\nimport { Display, SelectedOptions } from \"./SelectedOptions\";\nimport { useArrowNavigation } from \"./useArrowNavigation\";\nimport { useSearch } from \"./useSearch\";\nimport { withReadOnly } from \"../../../withReadOnly\";\n\nconst getOptionId = (multiSelectId: string, optionIndex: number) =>\n `${multiSelectId}_option${optionIndex}`;\n\nconst getListboxId = (multiSelectId: string) => `${multiSelectId}_listbox`;\n\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n return React.Children.toArray(children).reduce((text: string, child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return text + child;\n }\n if (React.isValidElement(child) && child.props.children) {\n return text + extractTextFromChildren(child.props.children);\n }\n return text;\n }, \"\");\n};\n\nconst MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSelectProps> = (\n {\n id,\n children,\n name,\n disabled = false,\n labeledBy,\n placeholder,\n describedBy,\n selectButtonProps = {},\n className,\n error = false,\n success = false,\n value,\n clearLabel = \"Clear selection\",\n noResultsLabel = \"No results found\",\n onChange,\n addNew,\n search = { enabled: true, renderThreshold: 0, searchPlaceholder: \"Search item\" },\n isReadOnlyView,\n ...rest\n }: MultiSelectProps,\n ref\n) => {\n const multiSelectId = useRef(id ?? generateID(20));\n const [expanded, setExpanded] = useState(false);\n const [display, setDisplay] = useState<Display[]>([]);\n const containerReference = useRef<HTMLDivElement>(null);\n const optionListReference = useRef<HTMLDivElement>(null);\n const [focusedSelectItem, setFocusedSelectItem] = useState(0);\n const [shouldClick, setShouldClick] =\n useState(\n false\n ); /** We need this, because whenever we use the arrow keys to select the select item, and we focus the currently selected item it fires the \"click\" listener in Option component. Instead, we only want this to fire if we press \"enter\" or \"spacebar\" so we set this to true whenever that is the case, and back to false when it has been executed. */\n const [shouldFocusButtonAfterClose, setShouldFocusButtonAfterClose] = useState(false);\n const [optionsVisibleCount, setOptionsVisibleCount] = useState(\n React.Children.count(children) - display.length\n );\n const { filter, renderSearch, searchInputRef, resetSearchState, searchVisible } = useSearch({\n selectId: multiSelectId.current,\n expanded,\n search,\n searchInputClassName: classes[\"select-search\"],\n optionsCount: optionsVisibleCount,\n focusedSelectItem,\n setFocusedSelectItem,\n describedBy,\n getOptionId,\n getListboxId\n });\n const { addBtnRef, addNewBtnOptionsContainerClassName, renderAddNew } = useAddNewBtn({\n id: getOptionId(multiSelectId.current, optionsVisibleCount),\n addNew,\n filter,\n focusedSelectItem,\n optionsCount: optionsVisibleCount,\n searchInputRef,\n shouldClick,\n onClickCallback: () => {\n setShouldClick(false);\n resetSearchState();\n }\n });\n\n const nativeSelect = (ref as React.RefObject<HTMLSelectElement>) || createRef();\n\n const onOptionChangeHandler = (optionElement: HTMLElement | null) => {\n if (nativeSelect.current && optionElement) {\n const value = optionElement.getAttribute(\"data-value\")!;\n const options = [...nativeSelect.current.options];\n const lastSelectedOptionValues = options\n .filter(option => option.selected)\n .map(option => option.value);\n options.forEach(option => {\n if (option.value === value || lastSelectedOptionValues.includes(option.value)) {\n option.selected = true;\n }\n });\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n setExpanded(false);\n resetSearchState();\n };\n\n const onSelectedOptionRemoveHandler = (value: string) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.find(option => option.value === value)!.selected = false;\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n\n const customSelectButtonRef = useRef<HTMLButtonElement>(null);\n const readOnlyView = !!rest[\"data-readonlyview\"] || isReadOnlyView;\n const { onArrowNavigation } = useArrowNavigation({\n expanded,\n setExpanded,\n setFocusedSelectItem,\n childrenCount: optionsVisibleCount,\n setShouldClick,\n addBtnRef,\n searchInputRef,\n customSelectButtonRef,\n onClose: resetSearchState,\n isReadOnlyView: readOnlyView\n });\n\n const { listPosition, opacity, optionsListMaxHeight, setListPosition, setOpacity } =\n useSelectPositionList({ expanded, optionListReference, containerReference, addBtnRef });\n\n const syncDisplayValue = (values: string[]) => {\n const options = React.Children.map(children, child => child);\n const displayArray: Display[] = values.map(value => {\n const option = options.find(option => option.props.value === value);\n return { value, label: option?.props.children, fixed: option?.props.fixed };\n });\n setDisplay(displayArray);\n };\n\n const syncSelectedOption = (vals: string[]) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.forEach(option => {\n if (vals.includes(option.value)) {\n option.selected = true;\n } else {\n option.selected = false;\n }\n });\n }\n };\n\n /**\n * @description We have to modify the children (Option component) to have a additional props that allows us to keep track of which one is selected and focused at all times and if a filter is active.\n * The `children` prop can be either a single object (1 child) or an array of multiple children.\n */\n const renderOptions = () => {\n type ReactChildrenType = ReturnType<typeof React.Children.toArray>;\n\n const filterOutSelectedChildren = (internalChildren: ReactChildrenType) => {\n return internalChildren.filter(\n child =>\n typeof child === \"object\" &&\n \"props\" in child &&\n !display.find(option => option.value === child.props.value)\n );\n };\n\n let results;\n if (filter !== \"\") {\n const filteredChildren = React.Children.toArray(children).filter(child => {\n const childElement = child as ReactElement;\n const childText = extractTextFromChildren(childElement.props.children);\n return childText.toLowerCase().includes(filter.toLowerCase());\n });\n\n results = _internalRenderChildren(filterOutSelectedChildren(filteredChildren));\n } else {\n results = _internalRenderChildren(\n filterOutSelectedChildren(React.Children.toArray(children))\n );\n }\n\n optionsVisibleCount !== results.length && setOptionsVisibleCount(results.length);\n\n if (results.length === 0) {\n return <li className={classes[\"no-results\"]}>{noResultsLabel}</li>;\n }\n\n return results;\n\n function _internalRenderChildren(internalChildren: ReactChildrenType) {\n return React.Children.map(internalChildren, (child, index) => {\n return React.cloneElement(child as ReactElement, {\n onFocusChange: (childIndex: number) => {\n setFocusedSelectItem(childIndex);\n },\n onOptionSelect: (optionRef: React.RefObject<HTMLLIElement>) => {\n onOptionChangeHandler(optionRef.current);\n setExpanded(false);\n setShouldClick(false);\n },\n isSearching: false,\n selectOpened: expanded,\n childIndex: index,\n hasFocus: focusedSelectItem === index,\n shouldClick: shouldClick,\n id: getOptionId(multiSelectId.current, index)\n });\n });\n }\n };\n\n const renderChevronIcon = () => {\n return expanded ? (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronUp} />\n ) : (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronDown} />\n );\n };\n\n const icon = useDetermineStatusIcon({ success, error });\n\n const nativeOnChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(event);\n };\n\n useEffect(() => {\n if (expanded && searchInputRef.current) {\n setShouldFocusButtonAfterClose(true);\n searchInputRef.current.focus();\n }\n\n if (!expanded && customSelectButtonRef.current && shouldFocusButtonAfterClose) {\n setShouldFocusButtonAfterClose(false);\n customSelectButtonRef.current.focus();\n }\n }, [\n expanded,\n customSelectButtonRef.current,\n shouldFocusButtonAfterClose,\n searchInputRef.current\n ]);\n\n useEffect(() => {\n syncDisplayValue(value);\n syncSelectedOption(value);\n }, [value]);\n\n const myElementRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(myElementRef, () => {\n if (!expanded) {\n return;\n }\n setExpanded(false);\n setListPosition(Position.Below);\n setOpacity(0);\n }, [expanded]);\n\n const additionalClasses = [];\n expanded && additionalClasses.push(classes.expanded);\n error && additionalClasses.push(classes.error);\n disabled && additionalClasses.push(classes.disabled);\n className && additionalClasses.push(className);\n success && additionalClasses.push(classes.success);\n\n const onSelectButtonClick = () => {\n if (rest[\"data-readonlyview\"] || isReadOnlyView) {\n return;\n }\n setExpanded(expanded => !expanded);\n setShouldClick(false);\n };\n\n const optionsElement = (\n <div className={`list-wrapper-container ${classes[\"list-wrapper-container\"]}`}>\n <div\n ref={optionListReference}\n className={`list-wrapper ${classes[\"list-wrapper\"]}`}\n style={{\n display: expanded ? \"block\" : \"none\",\n opacity: opacity,\n maxHeight: optionsListMaxHeight.wrapper,\n pointerEvents: expanded ? \"auto\" : \"none\",\n top: listPosition === Position.Below ? \"4px\" : \"initial\",\n bottom: listPosition === Position.Above ? \"4px\" : \"initial\"\n }}\n >\n <ul\n id={getListboxId(multiSelectId.current)}\n className={addNewBtnOptionsContainerClassName}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n style={{ maxHeight: optionsListMaxHeight.list }}\n >\n {renderOptions()}\n </ul>\n {renderAddNew()}\n </div>\n </div>\n );\n\n /** The native select is purely for external form libraries. We use it to emit an onChange with native select event object so they know exactly what's happening. */\n return (\n <div ref={myElementRef}>\n <select\n {...filterProps(rest, /^data-/, false)}\n tabIndex={-1}\n multiple={true}\n aria-hidden=\"true\"\n ref={nativeSelect}\n name={name}\n onChange={nativeOnChangeHandler}\n className={readyclasses[\"sr-only\"]}\n >\n <option value=\"\"></option>\n {React.Children.map(children, child => (\n <option value={child.props.value}></option>\n ))}\n </select>\n <div\n {...filterProps(rest, /^data-/)}\n id={multiSelectId.current}\n ref={containerReference}\n onKeyDown={onArrowNavigation}\n className={`custom-select ${classes.select} ${additionalClasses.join(\" \")}`}\n >\n {listPosition === Position.Above ? optionsElement : undefined}\n <div\n className={`${classes[\"custom-select\"]} ${additionalClasses.join(\" \")} `}\n style={{ display: \"flex\" }}\n >\n <div className={classes[\"display-container\"]} data-display>\n <SelectButton\n {...selectButtonProps}\n onClick={onSelectButtonClick}\n name={name}\n ref={customSelectButtonRef}\n disabled={disabled}\n aria-disabled={disabled}\n aria-invalid={error}\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-labelledby={labeledBy}\n aria-describedby={describedBy}\n />\n {value?.length === 0 && placeholder && (\n <span className={classes[\"placeholder\"]}>{placeholder}</span>\n )}\n {value?.length > 0 && (\n <SelectedOptions\n disabled={disabled}\n display={display}\n onClick={onSelectButtonClick}\n onRemove={onSelectedOptionRemoveHandler}\n />\n )}\n {searchVisible && renderSearch()}\n </div>\n <div className={classes[\"status\"]}>{icon || renderChevronIcon()}</div>\n </div>\n {listPosition === Position.Below ? optionsElement : undefined}\n </div>\n </div>\n );\n};\n\nexport const MultiSelect = withReadOnly(React.forwardRef(MultiSelectComponent));\n"],"names":["getOptionId","multiSelectId","optionIndex","getListboxId","extractTextFromChildren","children","React","Children","toArray","reduce","text","child","isValidElement","props","MultiSelect","withReadOnly","forwardRef","id","name","disabled","labeledBy","placeholder","describedBy","selectButtonProps","className","error","success","value","clearLabel","noResultsLabel","onChange","addNew","search","enabled","renderThreshold","searchPlaceholder","isReadOnlyView","rest","ref","useRef","generateID","expanded","setExpanded","useState","display","setDisplay","containerReference","optionListReference","focusedSelectItem","setFocusedSelectItem","shouldClick","setShouldClick","shouldFocusButtonAfterClose","setShouldFocusButtonAfterClose","optionsVisibleCount","setOptionsVisibleCount","count","length","filter","renderSearch","searchInputRef","resetSearchState","searchVisible","useSearch","selectId","current","searchInputClassName","classes","optionsCount","addBtnRef","addNewBtnOptionsContainerClassName","renderAddNew","useAddNewBtn","onClickCallback","nativeSelect","createRef","customSelectButtonRef","readOnlyView","onArrowNavigation","useArrowNavigation","childrenCount","onClose","listPosition","opacity","optionsListMaxHeight","setListPosition","setOpacity","useSelectPositionList","icon","useDetermineStatusIcon","useEffect","focus","vals","values","options","map","displayArray","option","find","label","fixed","syncDisplayValue","forEach","includes","selected","myElementRef","useClickOutside","Position","Below","additionalClasses","push","onSelectButtonClick","optionsElement","default","createElement","style","maxHeight","wrapper","pointerEvents","top","bottom","Above","role","list","filterOutSelectedChildren","internalChildren","results","_internalRenderChildren","toLowerCase","index","cloneElement","onFocusChange","childIndex","onOptionSelect","optionRef","optionElement","getAttribute","lastSelectedOptionValues","dispatchEvent","Event","bubbles","onOptionChangeHandler","isSearching","selectOpened","hasFocus","renderOptions","filterProps","tabIndex","multiple","event","readyclasses","onKeyDown","select","join","SelectButton","onClick","SelectedOptions","onRemove","Icon","Icons","ChevronUp","ChevronDown"],"mappings":"4sBAwCMA,EAAc,CAACC,EAAuBC,IAC1C,GAAGD,WAAuBC,IAEtBC,EAAgBF,GAA0B,GAAGA,YAE7CG,EAA2BC,GACxBC,EAAMC,SAASC,QAAQH,GAAUI,QAAO,CAACC,EAAcC,IACvC,iBAAVA,GAAuC,iBAAVA,EAC/BD,EAAOC,EAEZL,EAAMM,eAAeD,IAAUA,EAAME,MAAMR,SACtCK,EAAON,EAAwBO,EAAME,MAAMR,UAE7CK,GACN,IA+VQI,EAAcC,EAAAA,aAAaT,EAAMU,YA5V8C,EAExFC,KACAZ,WACAa,OACAC,YAAW,EACXC,YACAC,cACAC,cACAC,oBAAoB,CAAC,EACrBC,YACAC,SAAQ,EACRC,WAAU,EACVC,QACAC,aAAa,kBACbC,iBAAiB,mBACjBC,WACAC,SACAC,SAAS,CAAEC,SAAS,EAAMC,gBAAiB,EAAGC,kBAAmB,eACjEC,oBACGC,GAELC,KAEA,MAAMrC,EAAgBsC,EAAAA,OAAOtB,GAAMuB,EAAAA,WAAW,MACvCC,EAAUC,GAAeC,EAAAA,UAAS,IAClCC,EAASC,GAAcF,EAAAA,SAAoB,IAC5CG,EAAqBP,SAAuB,MAC5CQ,EAAsBR,SAAuB,OAC5CS,EAAmBC,GAAwBN,EAAAA,SAAS,IACpDO,EAAaC,GAClBR,EAAAA,UACE,IAEGS,EAA6BC,GAAkCV,EAAAA,UAAS,IACxEW,EAAqBC,GAA0BZ,EAAAA,SACpDrC,EAAMC,SAASiD,MAAMnD,GAAYuC,EAAQa,SAErCC,OAAEA,eAAQC,EAAcC,eAAAA,GAAAC,iBAAgBA,iBAAkBC,IAAkBC,YAAU,CAC1FC,SAAU/D,EAAcgE,QACxBxB,WACAT,SACAkC,qBAAsBC,UAAQ,iBAC9BC,aAAcd,EACdN,oBACAC,uBACA3B,cACAtB,cACAG,kBAEIkE,UAAEA,GAAWC,mCAAAA,GAAAC,aAAoCA,IAAiBC,EAAAA,aAAa,CACnFvD,GAAIjB,EAAYC,EAAcgE,QAASX,GACvCvB,SACA2B,SACAV,oBACAoB,aAAcd,EACdM,kBACAV,cACAuB,gBAAiB,KACftB,GAAe,GACEU,IAAA,IAIfa,GAAgBpC,GAA8CqC,cA4B9DC,GAAwBrC,SAA0B,MAClDsC,KAAiBxC,EAAK,sBAAwBD,GAC9C0C,kBAAEA,IAAsBC,qBAAmB,CAC/CtC,WACAC,cACAO,uBACA+B,cAAe1B,EACfH,iBACAkB,aACAT,kBACAgB,yBACAK,QAASpB,GACTzB,eAAgByC,MAGZK,aAAEA,GAAAC,QAAcA,GAASC,qBAAAA,GAAAC,gBAAsBA,cAAiBC,IACpEC,EAAAA,sBAAsB,CAAE9C,WAAUM,sBAAqBD,qBAAoBuB,eA6FvEmB,GAAOC,EAAAA,uBAAuB,CAAE/D,UAASD,UAM/CiE,EAAAA,WAAU,KACJjD,GAAYmB,GAAeK,UAC7BZ,GAA+B,GAC/BO,GAAeK,QAAQ0B,UAGpBlD,GAAYmC,GAAsBX,SAAWb,IAChDC,GAA+B,GAC/BuB,GAAsBX,QAAQ0B,QAAM,GAErC,CACDlD,EACAmC,GAAsBX,QACtBb,EACAQ,GAAeK,UAGjByB,EAAAA,WAAU,KAzGiB,IAACE,EATH,CAACC,IACxB,MAAMC,EAAUxF,EAAMC,SAASwF,IAAI1F,MAAmBM,IAChDqF,EAA0BH,EAAOE,KAAIpE,IACnC,MAAAsE,EAASH,EAAQI,MAAKD,GAAUA,EAAOpF,MAAMc,QAAUA,IACtD,MAAA,CAAEA,MAAAA,EAAOwE,MAAO,MAAAF,OAAA,EAAAA,EAAQpF,MAAMR,SAAU+F,MAAe,MAARH,OAAQ,EAAAA,EAAApF,MAAMuF,MAAM,IAE5EvD,EAAWmD,EAAY,EA6GvBK,CAAiB1E,GA1GSiE,EA2GPjE,EA1Gf+C,GAAaT,SACC,IAAIS,GAAaT,QAAQ6B,SACjCQ,SAAkBL,IACpBL,EAAKW,SAASN,EAAOtE,OACvBsE,EAAOO,UAAW,EAElBP,EAAOO,UAAW,CAAA,GAoGA,GACvB,CAAC7E,IAEE,MAAA8E,GAAelE,SAAuB,MAE5CmE,EAAAA,gBAAgBD,IAAc,KACvBhE,IAGLC,GAAY,GACIiE,GAAAA,WAASC,OACzBtB,GAAW,GAAC,GACX,CAAC7C,IAEJ,MAAMoE,GAAoB,GACdpE,GAAAoE,GAAkBC,KAAK3C,EAAAA,QAAQ1B,UAClChB,GAAAoF,GAAkBC,KAAK3C,EAAAA,QAAQ1C,OAC5BN,GAAA0F,GAAkBC,KAAK3C,EAAAA,QAAQhD,UAC9BK,GAAAqF,GAAkBC,KAAKtF,GACzBE,GAAAmF,GAAkBC,KAAK3C,EAAAA,QAAQzC,SAE1C,MAAMqF,GAAsB,KACtB1E,EAAK,sBAAwBD,IAGrBM,GAAAD,IAAaA,IACzBU,GAAe,GAAK,EAGhB6D,mBACH,MAAI,CAAAxF,UAAW,0BAA0B2C,EAAQ8C,QAAA,6BAChD3G,EAAA4G,cAAC,MAAA,CACC5E,IAAKS,EACLvB,UAAW,gBAAgB2C,UAAQ,kBACnCgD,MAAO,CACLvE,QAASH,EAAW,QAAU,OAC9B0C,WACAiC,UAAWhC,GAAqBiC,QAChCC,cAAe7E,EAAW,OAAS,OACnC8E,IAAKrC,KAAiByB,EAAAA,SAASC,MAAQ,MAAQ,UAC/CY,OAAQtC,KAAiByB,WAASc,MAAQ,MAAQ,YAGpDnH,EAAA4G,cAAC,KAAA,CACCjG,GAAId,EAAaF,EAAcgE,SAC/BzC,UAAW8C,GACXoD,KAAK,UACL,uBAAqB,OACrBP,MAAO,CAAEC,UAAWhC,GAAqBuC,OA1I3B,MAGd,MAAAC,EAA6BC,GAC1BA,EAAiBnE,QAEpB/C,GAAiB,iBAAVA,GACP,UAAWA,IACViC,EAAQsD,MAAeD,GAAAA,EAAOtE,QAAUhB,EAAME,MAAMc,UAIvD,IAAAmG,EAiBA,OATQA,EAAAC,EAAwBH,EAPrB,KAAXlE,EACuBpD,EAAMC,SAASC,QAAQH,GAAUqD,QAAgB/C,GAEtDP,EADGO,EACkCE,MAAMR,UAC5C2H,cAAczB,SAAS7C,EAAOsE,iBAMrB1H,EAAMC,SAASC,QAAQH,KAIrDiD,IAAwBwE,EAAQrE,QAAUF,EAAuBuE,EAAQrE,QAElD,IAAnBqE,EAAQrE,uBACF,KAAG,CAAAjC,UAAW2C,UAAQ,eAAgBtC,GAGzCiG,EAEP,SAASC,EAAwBF,GAC/B,OAAOvH,EAAMC,SAASwF,IAAI8B,GAAkB,CAAClH,EAAOsH,IAC3C3H,EAAM4H,aAAavH,EAAuB,CAC/CwH,cAAgBC,IACdnF,EAAqBmF,EAAU,EAEjCC,eAAiBC,IA/GK,CAACC,IACzB,GAAA7D,GAAaT,SAAWsE,EAAe,CACnC5G,MAAAA,EAAQ4G,EAAcC,aAAa,cACnC1C,EAAU,IAAIpB,GAAaT,QAAQ6B,SACnC2C,EAA2B3C,EAC9BpC,QAAiBuC,GAAAA,EAAOO,WACxBT,KAAcE,GAAAA,EAAOtE,QAChBmE,EAAAQ,SAAkBL,KACpBA,EAAOtE,QAAUA,GAAS8G,EAAyBlC,SAASN,EAAOtE,UACrEsE,EAAOO,UAAW,EAAA,IAGT9B,GAAAT,QAAQyE,cAAc,IAAIC,MAAM,SAAU,CAAEC,SAAS,IAAO,CAE3ElG,GAAY,GACKmB,IAAA,EAiGTgF,CAAsBP,EAAUrE,SAChCvB,GAAY,GACZS,GAAe,EAAK,EAEtB2F,aAAa,EACbC,aAActG,EACd2F,WAAYH,EACZe,SAAUhG,IAAsBiF,EAChC/E,cACAjC,GAAIjB,EAAYC,EAAcgE,QAASgE,MAE1C,GAuFIgB,IAEF1E,OAOL,SAAA2C,cAAC,MAAI,CAAA5E,IAAKmE,IACRnG,EAAA4G,cAAC,SAAA,IACKgC,cAAY7G,EAAM,UAAU,GAChC8G,UAAU,EACVC,UAAU,EACV,cAAY,OACZ9G,IAAKoC,GACLxD,OACAY,SA1FyBuH,IAClB,MAAAvH,GAAAA,EAAAuH,EAAA,EA0FP7H,UAAW8H,UAAa,cAExBpC,cAAC,SAAO,CAAAvF,MAAM,KACbrB,EAAMC,SAASwF,IAAI1F,GAAUM,GAC3BL,EAAA4G,cAAA,SAAA,CAAOvF,MAAOhB,EAAME,MAAMc,WAG/BrB,EAAA4G,cAAC,MAAA,IACKgC,EAAYA,YAAA7G,EAAM,UACtBpB,GAAIhB,EAAcgE,QAClB3B,IAAKQ,EACLyG,UAAWzE,GACXtD,UAAW,iBAAiB2C,UAAQqF,UAAU3C,GAAkB4C,KAAK,QAEpEvE,KAAiByB,EAASA,SAAAc,MAAQT,QAAiB,EACpD1G,EAAA4G,cAAC,MAAA,CACC1F,UAAW,GAAG2C,EAAQ8C,QAAA,oBAAoBJ,GAAkB4C,KAAK,QACjEtC,MAAO,CAAEvE,QAAS,yBAEjB,MAAI,CAAApB,UAAW2C,EAAAA,QAAQ,qBAAsB,gBAAY,GACxD7D,EAAA4G,cAACwC,EAAAA,aAAA,IACKnI,EACJoI,QAAS5C,GACT7F,OACAoB,IAAKsC,GACLzD,WACA,gBAAeA,EACf,eAAcM,EACd,gBAAegB,EACf,gBAAc,UACd,kBAAiBrB,EACjB,mBAAkBE,IAED,WAAlBK,WAAO8B,SAAgBpC,GACrBf,EAAA4G,cAAA,OAAA,CAAK1F,UAAW2C,EAAAA,QAAqB,aAAI9C,IAEpC,MAAPM,OAAO,EAAAA,EAAA8B,QAAS,GACfnD,EAAA4G,cAAC0C,EAAAA,gBAAA,CACCzI,WACAyB,UACA+G,QAAS5C,GACT8C,SA3PyBlI,IACjC+C,GAAaT,UACC,IAAIS,GAAaT,QAAQ6B,SACjCI,MAAeD,GAAAA,EAAOtE,QAAUA,IAAQ6E,UAAW,EAC9C9B,GAAAT,QAAQyE,cAAc,IAAIC,MAAM,SAAU,CAAEC,SAAS,KAAO,IA0PlE9E,IAAiBH,KAEpBrD,EAAA4G,cAAC,OAAI1F,UAAW2C,EAAA8C,QAAgB,QAAIzB,KAlJnC/C,EACJnC,EAAA4G,cAAA4C,OAAA,CAAKtI,UAAW2C,EAAAA,QAAQ,gBAAiBqB,KAAMuE,QAAMC,YAEtD1J,EAAA4G,cAAC4C,QAAKtI,UAAW2C,UAAQ,gBAAiBqB,KAAMuE,QAAME,iBAiJnD/E,KAAiByB,EAAAA,SAASC,MAAQI,QAAiB,GAExD"}
|
|
1
|
+
{"version":3,"file":"MultiSelect.cjs.js","sources":["../../../../../src/components/Form/Select/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/*\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classes from \"./MultiSelect.module.scss\";\n\nimport React, {\n ForwardRefRenderFunction,\n ReactElement,\n createRef,\n useEffect,\n useRef,\n useState\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useClickOutside } from \"../../../../hooks/useClickOutside\";\nimport { useDetermineStatusIcon } from \"../../../../hooks/useDetermineStatusIcon\";\nimport { useGetDomRoot } from \"../../../../hooks/useGetDomRoot\";\nimport readyclasses from \"../../../../readyclasses.module.scss\";\nimport { filterProps, generateID } from \"../../../../util/helper\";\nimport { Icon, Icons } from \"../../../Icon/Icon\";\nimport { MultiSelectProps, Position } from \"../Select.interfaces\";\nimport { useAddNewBtn } from \"../useAddNewBtn\";\nimport { useSelectPositionList } from \"../useSelectPositionList\";\nimport { SelectButton } from \"./SelectButton\";\nimport { Display, SelectedOptions } from \"./SelectedOptions\";\nimport { useArrowNavigation } from \"./useArrowNavigation\";\nimport { useSearch } from \"./useSearch\";\nimport { withReadOnly } from \"../../../withReadOnly\";\n\nconst getOptionId = (multiSelectId: string, optionIndex: number) =>\n `${multiSelectId}_option${optionIndex}`;\n\nconst getListboxId = (multiSelectId: string) => `${multiSelectId}_listbox`;\n\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n return React.Children.toArray(children).reduce((text: string, child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return text + child;\n }\n if (React.isValidElement(child) && child.props.children) {\n return text + extractTextFromChildren(child.props.children);\n }\n return text;\n }, \"\");\n};\n\nconst MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSelectProps> = (\n {\n id,\n children,\n name,\n disabled = false,\n labeledBy,\n placeholder,\n describedBy,\n selectButtonProps = {},\n className,\n error = false,\n success = false,\n value,\n clearLabel = \"Clear selection\",\n noResultsLabel = \"No results found\",\n onChange,\n addNew,\n search = { enabled: true, renderThreshold: 0, searchPlaceholder: \"Search item\" },\n isReadOnlyView,\n domRoot,\n ...rest\n }: MultiSelectProps,\n ref\n) => {\n const multiSelectId = useRef(id ?? generateID(20));\n const [expanded, setExpanded] = useState(false);\n const [display, setDisplay] = useState<Display[]>([]);\n const myElementRef = useRef<HTMLDivElement>(null);\n const containerReference = useRef<HTMLDivElement>(null);\n const optionListReference = useRef<HTMLDivElement>(null);\n const portalRef = useRef<HTMLDivElement>(null);\n const { root } = useGetDomRoot(domRoot, myElementRef);\n const [focusedSelectItem, setFocusedSelectItem] = useState(0);\n const [shouldClick, setShouldClick] =\n useState(\n false\n ); /** We need this, because whenever we use the arrow keys to select the select item, and we focus the currently selected item it fires the \"click\" listener in Option component. Instead, we only want this to fire if we press \"enter\" or \"spacebar\" so we set this to true whenever that is the case, and back to false when it has been executed. */\n const [shouldFocusButtonAfterClose, setShouldFocusButtonAfterClose] = useState(false);\n const [optionsVisibleCount, setOptionsVisibleCount] = useState(\n React.Children.count(children) - display.length\n );\n const { filter, renderSearch, searchInputRef, resetSearchState, searchVisible } = useSearch({\n selectId: multiSelectId.current,\n expanded,\n search,\n searchInputClassName: classes[\"select-search\"],\n optionsCount: optionsVisibleCount,\n focusedSelectItem,\n setFocusedSelectItem,\n describedBy,\n getOptionId,\n getListboxId\n });\n const { addBtnRef, addNewBtnOptionsContainerClassName, renderAddNew } = useAddNewBtn({\n id: getOptionId(multiSelectId.current, optionsVisibleCount),\n addNew,\n filter,\n focusedSelectItem,\n optionsCount: optionsVisibleCount,\n searchInputRef,\n shouldClick,\n onClickCallback: () => {\n setShouldClick(false);\n resetSearchState();\n }\n });\n\n const nativeSelect = (ref as React.RefObject<HTMLSelectElement>) || createRef();\n\n const onOptionChangeHandler = (optionElement: HTMLElement | null) => {\n if (nativeSelect.current && optionElement) {\n const value = optionElement.getAttribute(\"data-value\")!;\n const options = [...nativeSelect.current.options];\n const lastSelectedOptionValues = options\n .filter(option => option.selected)\n .map(option => option.value);\n options.forEach(option => {\n if (option.value === value || lastSelectedOptionValues.includes(option.value)) {\n option.selected = true;\n }\n });\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n setExpanded(false);\n resetSearchState();\n };\n\n const onSelectedOptionRemoveHandler = (value: string) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.find(option => option.value === value)!.selected = false;\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n\n const customSelectButtonRef = useRef<HTMLButtonElement>(null);\n const readOnlyView = !!rest[\"data-readonlyview\"] || isReadOnlyView;\n const { onArrowNavigation } = useArrowNavigation({\n expanded,\n setExpanded,\n setFocusedSelectItem,\n childrenCount: optionsVisibleCount,\n setShouldClick,\n addBtnRef,\n searchInputRef,\n customSelectButtonRef,\n onClose: resetSearchState,\n isReadOnlyView: readOnlyView\n });\n\n const { listPosition, opacity, optionsListMaxHeight, setListPosition, setOpacity } =\n useSelectPositionList({ expanded, optionListReference, containerReference, addBtnRef });\n\n const syncDisplayValue = (values: string[]) => {\n const options = React.Children.map(children, child => child);\n const displayArray: Display[] = values.map(value => {\n const option = options.find(option => option.props.value === value);\n return { value, label: option?.props.children, fixed: option?.props.fixed };\n });\n setDisplay(displayArray);\n };\n\n const syncSelectedOption = (vals: string[]) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.forEach(option => {\n if (vals.includes(option.value)) {\n option.selected = true;\n } else {\n option.selected = false;\n }\n });\n }\n };\n\n /**\n * @description We have to modify the children (Option component) to have a additional props that allows us to keep track of which one is selected and focused at all times and if a filter is active.\n * The `children` prop can be either a single object (1 child) or an array of multiple children.\n */\n const renderOptions = () => {\n type ReactChildrenType = ReturnType<typeof React.Children.toArray>;\n\n const filterOutSelectedChildren = (internalChildren: ReactChildrenType) => {\n return internalChildren.filter(\n child =>\n typeof child === \"object\" &&\n \"props\" in child &&\n !display.find(option => option.value === child.props.value)\n );\n };\n\n let results;\n if (filter !== \"\") {\n const filteredChildren = React.Children.toArray(children).filter(child => {\n const childElement = child as ReactElement;\n const childText = extractTextFromChildren(childElement.props.children);\n return childText.toLowerCase().includes(filter.toLowerCase());\n });\n\n results = _internalRenderChildren(filterOutSelectedChildren(filteredChildren));\n } else {\n results = _internalRenderChildren(\n filterOutSelectedChildren(React.Children.toArray(children))\n );\n }\n\n optionsVisibleCount !== results.length && setOptionsVisibleCount(results.length);\n\n if (results.length === 0) {\n return <li className={classes[\"no-results\"]}>{noResultsLabel}</li>;\n }\n\n return results;\n\n function _internalRenderChildren(internalChildren: ReactChildrenType) {\n return React.Children.map(internalChildren, (child, index) => {\n return React.cloneElement(child as ReactElement, {\n onFocusChange: (childIndex: number) => {\n setFocusedSelectItem(childIndex);\n },\n onOptionSelect: (optionRef: React.RefObject<HTMLLIElement>) => {\n onOptionChangeHandler(optionRef.current);\n setExpanded(false);\n setShouldClick(false);\n },\n isSearching: false,\n selectOpened: expanded,\n childIndex: index,\n hasFocus: focusedSelectItem === index,\n shouldClick: shouldClick,\n id: getOptionId(multiSelectId.current, index)\n });\n });\n }\n };\n\n const renderChevronIcon = () => {\n return expanded ? (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronUp} />\n ) : (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronDown} />\n );\n };\n\n const icon = useDetermineStatusIcon({ success, error });\n\n const nativeOnChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(event);\n };\n\n useEffect(() => {\n if (expanded && searchInputRef.current) {\n setShouldFocusButtonAfterClose(true);\n searchInputRef.current.focus();\n }\n\n if (!expanded && customSelectButtonRef.current && shouldFocusButtonAfterClose) {\n setShouldFocusButtonAfterClose(false);\n customSelectButtonRef.current.focus();\n }\n }, [\n expanded,\n customSelectButtonRef.current,\n shouldFocusButtonAfterClose,\n searchInputRef.current\n ]);\n\n useEffect(() => {\n syncDisplayValue(value);\n syncSelectedOption(value);\n }, [value]);\n\n useClickOutside(myElementRef, () => {\n if (!expanded) {\n return;\n }\n setExpanded(false);\n setListPosition(Position.Below);\n setOpacity(0);\n }, [expanded]);\n\n const additionalClasses = [];\n expanded && additionalClasses.push(classes.expanded);\n error && additionalClasses.push(classes.error);\n disabled && additionalClasses.push(classes.disabled);\n className && additionalClasses.push(className);\n success && additionalClasses.push(classes.success);\n\n const onSelectButtonClick = () => {\n if (rest[\"data-readonlyview\"] || isReadOnlyView) {\n return;\n }\n setExpanded(expanded => !expanded);\n setShouldClick(false);\n };\n\n useEffect(() => {\n if (!expanded) {\n return;\n }\n\n const anchor = containerReference.current;\n const portal = portalRef.current;\n\n if (!anchor || !portal) {\n return;\n }\n\n let frameId: number | null = null;\n\n const updatePosition = () => {\n if (!anchor || !portal) {\n return;\n }\n\n const rect = anchor.getBoundingClientRect();\n const x = rect.left;\n const y = listPosition === Position.Below ? rect.bottom : rect.top;\n\n portal.style.position = \"fixed\";\n portal.style.zIndex = \"1000\";\n portal.style.left = \"0\";\n portal.style.top = \"0\";\n portal.style.width = `${rect.width}px`;\n portal.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n };\n\n const scheduleUpdate = () => {\n if (frameId != null) {\n return;\n }\n frameId = globalThis.requestAnimationFrame(() => {\n frameId = null;\n updatePosition();\n });\n };\n\n updatePosition();\n\n const handleScroll = () => scheduleUpdate();\n const handleResize = () => scheduleUpdate();\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true, capture: true });\n window.addEventListener(\"resize\", handleResize);\n\n const resizeObserver = new ResizeObserver(() => {\n scheduleUpdate();\n });\n resizeObserver.observe(anchor);\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", handleResize);\n resizeObserver.disconnect();\n if (frameId != null) {\n globalThis.cancelAnimationFrame(frameId);\n }\n };\n }, [expanded, listPosition]);\n\n const optionsElement = (\n <div className={`list-wrapper-container ${classes[\"list-wrapper-container\"]}`}>\n <div\n ref={optionListReference}\n className={`list-wrapper ${classes[\"list-wrapper\"]}`}\n style={{\n display: expanded ? \"block\" : \"none\",\n opacity: opacity,\n maxHeight: optionsListMaxHeight.wrapper,\n pointerEvents: expanded ? \"auto\" : \"none\",\n top: listPosition === Position.Below ? \"4px\" : undefined,\n bottom: listPosition === Position.Above ? \"4px\" : undefined\n }}\n >\n <ul\n id={getListboxId(multiSelectId.current)}\n className={addNewBtnOptionsContainerClassName}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n style={{ maxHeight: optionsListMaxHeight.list }}\n >\n {renderOptions()}\n </ul>\n {renderAddNew()}\n </div>\n </div>\n );\n\n /** The native select is purely for external form libraries. We use it to emit an onChange with native select event object so they know exactly what's happening. */\n return (\n <>\n <div ref={myElementRef}>\n <select\n {...filterProps(rest, /^data-/, false)}\n tabIndex={-1}\n multiple={true}\n aria-hidden=\"true\"\n ref={nativeSelect}\n name={name}\n onChange={nativeOnChangeHandler}\n className={readyclasses[\"sr-only\"]}\n >\n <option value=\"\"></option>\n {React.Children.map(children, child => (\n <option value={child.props.value}></option>\n ))}\n </select>\n <div\n {...filterProps(rest, /^data-/)}\n id={multiSelectId.current}\n ref={containerReference}\n onKeyDown={onArrowNavigation}\n className={`custom-select ${classes.select} ${additionalClasses.join(\" \")}`}\n >\n <div\n className={`${classes[\"custom-select\"]} ${additionalClasses.join(\" \")} `}\n style={{ display: \"flex\" }}\n >\n <div className={classes[\"display-container\"]} data-display>\n <SelectButton\n {...selectButtonProps}\n onClick={onSelectButtonClick}\n name={name}\n ref={customSelectButtonRef}\n disabled={disabled}\n aria-disabled={disabled}\n aria-invalid={error}\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-labelledby={labeledBy}\n aria-describedby={describedBy}\n />\n {value?.length === 0 && placeholder && (\n <span className={classes[\"placeholder\"]}>{placeholder}</span>\n )}\n {value?.length > 0 && (\n <SelectedOptions\n disabled={disabled}\n display={display}\n onClick={onSelectButtonClick}\n onRemove={onSelectedOptionRemoveHandler}\n />\n )}\n {searchVisible && renderSearch()}\n </div>\n <div className={classes[\"status\"]}>{icon || renderChevronIcon()}</div>\n </div>\n </div>\n </div>\n {createPortal(\n <div ref={portalRef} className={`${classes.select} ${additionalClasses.join(\" \")}`}>\n {optionsElement}\n </div>,\n root\n )}\n </>\n );\n};\n\nexport const MultiSelect = withReadOnly(React.forwardRef(MultiSelectComponent));\n"],"names":["getOptionId","multiSelectId","optionIndex","getListboxId","extractTextFromChildren","children","React","Children","toArray","reduce","text","child","isValidElement","props","MultiSelect","withReadOnly","forwardRef","id","name","disabled","labeledBy","placeholder","describedBy","selectButtonProps","className","error","success","value","clearLabel","noResultsLabel","onChange","addNew","search","enabled","renderThreshold","searchPlaceholder","isReadOnlyView","domRoot","rest","ref","useRef","generateID","expanded","setExpanded","useState","display","setDisplay","myElementRef","containerReference","optionListReference","portalRef","root","useGetDomRoot","focusedSelectItem","setFocusedSelectItem","shouldClick","setShouldClick","shouldFocusButtonAfterClose","setShouldFocusButtonAfterClose","optionsVisibleCount","setOptionsVisibleCount","count","length","filter","renderSearch","searchInputRef","resetSearchState","searchVisible","useSearch","selectId","current","searchInputClassName","classes","optionsCount","addBtnRef","addNewBtnOptionsContainerClassName","renderAddNew","useAddNewBtn","onClickCallback","nativeSelect","createRef","customSelectButtonRef","readOnlyView","onArrowNavigation","useArrowNavigation","childrenCount","onClose","listPosition","opacity","optionsListMaxHeight","setListPosition","setOpacity","useSelectPositionList","icon","useDetermineStatusIcon","useEffect","focus","vals","values","options","map","displayArray","option","find","label","fixed","syncDisplayValue","forEach","includes","selected","useClickOutside","Position","Below","additionalClasses","push","onSelectButtonClick","anchor","portal","frameId","updatePosition","rect","getBoundingClientRect","x","left","y","bottom","top","style","position","zIndex","width","transform","scheduleUpdate","globalThis","requestAnimationFrame","handleScroll","handleResize","window","addEventListener","passive","capture","resizeObserver","ResizeObserver","observe","removeEventListener","disconnect","cancelAnimationFrame","optionsElement","default","createElement","maxHeight","wrapper","pointerEvents","Above","role","list","filterOutSelectedChildren","internalChildren","results","_internalRenderChildren","toLowerCase","index","cloneElement","onFocusChange","childIndex","onOptionSelect","optionRef","optionElement","getAttribute","lastSelectedOptionValues","dispatchEvent","Event","bubbles","onOptionChangeHandler","isSearching","selectOpened","hasFocus","renderOptions","Fragment","filterProps","tabIndex","multiple","event","readyclasses","onKeyDown","select","join","SelectButton","onClick","SelectedOptions","onRemove","Icon","Icons","ChevronUp","ChevronDown","createPortal"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import classes from "./MultiSelect.module.scss.es.js";
|
|
2
2
|
import React, { useRef, useState, createRef, useEffect } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
3
4
|
import { useClickOutside } from "../../../../hooks/useClickOutside.es.js";
|
|
4
5
|
import { useDetermineStatusIcon } from "../../../../hooks/useDetermineStatusIcon.es.js";
|
|
6
|
+
import { useGetDomRoot } from "../../../../hooks/useGetDomRoot.es.js";
|
|
5
7
|
import readyclasses from "../../../../readyclasses.module.scss.es.js";
|
|
6
8
|
import { generateID, filterProps } from "../../../../util/helper.es.js";
|
|
7
9
|
import { Icon, Icons } from "../../../Icon/Icon.es.js";
|
|
@@ -45,13 +47,17 @@ const MultiSelectComponent = ({
|
|
|
45
47
|
addNew,
|
|
46
48
|
search = { enabled: true, renderThreshold: 0, searchPlaceholder: "Search item" },
|
|
47
49
|
isReadOnlyView,
|
|
50
|
+
domRoot,
|
|
48
51
|
...rest
|
|
49
52
|
}, ref) => {
|
|
50
53
|
const multiSelectId = useRef(id ?? generateID(20));
|
|
51
54
|
const [expanded, setExpanded] = useState(false);
|
|
52
55
|
const [display, setDisplay] = useState([]);
|
|
56
|
+
const myElementRef = useRef(null);
|
|
53
57
|
const containerReference = useRef(null);
|
|
54
58
|
const optionListReference = useRef(null);
|
|
59
|
+
const portalRef = useRef(null);
|
|
60
|
+
const { root } = useGetDomRoot(domRoot, myElementRef);
|
|
55
61
|
const [focusedSelectItem, setFocusedSelectItem] = useState(0);
|
|
56
62
|
const [shouldClick, setShouldClick] = useState(
|
|
57
63
|
false
|
|
@@ -214,7 +220,6 @@ const MultiSelectComponent = ({
|
|
|
214
220
|
syncDisplayValue(value);
|
|
215
221
|
syncSelectedOption(value);
|
|
216
222
|
}, [value]);
|
|
217
|
-
const myElementRef = useRef(null);
|
|
218
223
|
useClickOutside(myElementRef, () => {
|
|
219
224
|
if (!expanded) {
|
|
220
225
|
return;
|
|
@@ -236,6 +241,57 @@ const MultiSelectComponent = ({
|
|
|
236
241
|
setExpanded((expanded2) => !expanded2);
|
|
237
242
|
setShouldClick(false);
|
|
238
243
|
};
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
if (!expanded) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const anchor = containerReference.current;
|
|
249
|
+
const portal = portalRef.current;
|
|
250
|
+
if (!anchor || !portal) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
let frameId = null;
|
|
254
|
+
const updatePosition = () => {
|
|
255
|
+
if (!anchor || !portal) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const rect = anchor.getBoundingClientRect();
|
|
259
|
+
const x = rect.left;
|
|
260
|
+
const y = listPosition === Position.Below ? rect.bottom : rect.top;
|
|
261
|
+
portal.style.position = "fixed";
|
|
262
|
+
portal.style.zIndex = "1000";
|
|
263
|
+
portal.style.left = "0";
|
|
264
|
+
portal.style.top = "0";
|
|
265
|
+
portal.style.width = `${rect.width}px`;
|
|
266
|
+
portal.style.transform = `translate3d(${x}px, ${y}px, 0)`;
|
|
267
|
+
};
|
|
268
|
+
const scheduleUpdate = () => {
|
|
269
|
+
if (frameId != null) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
frameId = globalThis.requestAnimationFrame(() => {
|
|
273
|
+
frameId = null;
|
|
274
|
+
updatePosition();
|
|
275
|
+
});
|
|
276
|
+
};
|
|
277
|
+
updatePosition();
|
|
278
|
+
const handleScroll = () => scheduleUpdate();
|
|
279
|
+
const handleResize = () => scheduleUpdate();
|
|
280
|
+
window.addEventListener("scroll", handleScroll, { passive: true, capture: true });
|
|
281
|
+
window.addEventListener("resize", handleResize);
|
|
282
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
283
|
+
scheduleUpdate();
|
|
284
|
+
});
|
|
285
|
+
resizeObserver.observe(anchor);
|
|
286
|
+
return () => {
|
|
287
|
+
window.removeEventListener("scroll", handleScroll, true);
|
|
288
|
+
window.removeEventListener("resize", handleResize);
|
|
289
|
+
resizeObserver.disconnect();
|
|
290
|
+
if (frameId != null) {
|
|
291
|
+
globalThis.cancelAnimationFrame(frameId);
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}, [expanded, listPosition]);
|
|
239
295
|
const optionsElement = /* @__PURE__ */ React.createElement("div", { className: `list-wrapper-container ${classes["list-wrapper-container"]}` }, /* @__PURE__ */ React.createElement(
|
|
240
296
|
"div",
|
|
241
297
|
{
|
|
@@ -246,8 +302,8 @@ const MultiSelectComponent = ({
|
|
|
246
302
|
opacity,
|
|
247
303
|
maxHeight: optionsListMaxHeight.wrapper,
|
|
248
304
|
pointerEvents: expanded ? "auto" : "none",
|
|
249
|
-
top: listPosition === Position.Below ? "4px" :
|
|
250
|
-
bottom: listPosition === Position.Above ? "4px" :
|
|
305
|
+
top: listPosition === Position.Below ? "4px" : void 0,
|
|
306
|
+
bottom: listPosition === Position.Above ? "4px" : void 0
|
|
251
307
|
}
|
|
252
308
|
},
|
|
253
309
|
/* @__PURE__ */ React.createElement(
|
|
@@ -263,7 +319,7 @@ const MultiSelectComponent = ({
|
|
|
263
319
|
),
|
|
264
320
|
renderAddNew()
|
|
265
321
|
));
|
|
266
|
-
return /* @__PURE__ */ React.createElement("div", { ref: myElementRef }, /* @__PURE__ */ React.createElement(
|
|
322
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { ref: myElementRef }, /* @__PURE__ */ React.createElement(
|
|
267
323
|
"select",
|
|
268
324
|
{
|
|
269
325
|
...filterProps(rest, /^data-/, false),
|
|
@@ -286,7 +342,6 @@ const MultiSelectComponent = ({
|
|
|
286
342
|
onKeyDown: onArrowNavigation,
|
|
287
343
|
className: `custom-select ${classes.select} ${additionalClasses.join(" ")}`
|
|
288
344
|
},
|
|
289
|
-
listPosition === Position.Above ? optionsElement : void 0,
|
|
290
345
|
/* @__PURE__ */ React.createElement(
|
|
291
346
|
"div",
|
|
292
347
|
{
|
|
@@ -318,8 +373,10 @@ const MultiSelectComponent = ({
|
|
|
318
373
|
}
|
|
319
374
|
), searchVisible && renderSearch()),
|
|
320
375
|
/* @__PURE__ */ React.createElement("div", { className: classes["status"] }, icon || renderChevronIcon())
|
|
321
|
-
)
|
|
322
|
-
|
|
376
|
+
)
|
|
377
|
+
)), createPortal(
|
|
378
|
+
/* @__PURE__ */ React.createElement("div", { ref: portalRef, className: `${classes.select} ${additionalClasses.join(" ")}` }, optionsElement),
|
|
379
|
+
root
|
|
323
380
|
));
|
|
324
381
|
};
|
|
325
382
|
const MultiSelect = withReadOnly(React.forwardRef(MultiSelectComponent));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelect.es.js","sources":["../../../../../src/components/Form/Select/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/*\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classes from \"./MultiSelect.module.scss\";\n\nimport React, {\n ForwardRefRenderFunction,\n ReactElement,\n createRef,\n useEffect,\n useRef,\n useState\n} from \"react\";\nimport { useClickOutside } from \"../../../../hooks/useClickOutside\";\nimport { useDetermineStatusIcon } from \"../../../../hooks/useDetermineStatusIcon\";\nimport readyclasses from \"../../../../readyclasses.module.scss\";\nimport { filterProps, generateID } from \"../../../../util/helper\";\nimport { Icon, Icons } from \"../../../Icon/Icon\";\nimport { MultiSelectProps, Position } from \"../Select.interfaces\";\nimport { useAddNewBtn } from \"../useAddNewBtn\";\nimport { useSelectPositionList } from \"../useSelectPositionList\";\nimport { SelectButton } from \"./SelectButton\";\nimport { Display, SelectedOptions } from \"./SelectedOptions\";\nimport { useArrowNavigation } from \"./useArrowNavigation\";\nimport { useSearch } from \"./useSearch\";\nimport { withReadOnly } from \"../../../withReadOnly\";\n\nconst getOptionId = (multiSelectId: string, optionIndex: number) =>\n `${multiSelectId}_option${optionIndex}`;\n\nconst getListboxId = (multiSelectId: string) => `${multiSelectId}_listbox`;\n\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n return React.Children.toArray(children).reduce((text: string, child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return text + child;\n }\n if (React.isValidElement(child) && child.props.children) {\n return text + extractTextFromChildren(child.props.children);\n }\n return text;\n }, \"\");\n};\n\nconst MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSelectProps> = (\n {\n id,\n children,\n name,\n disabled = false,\n labeledBy,\n placeholder,\n describedBy,\n selectButtonProps = {},\n className,\n error = false,\n success = false,\n value,\n clearLabel = \"Clear selection\",\n noResultsLabel = \"No results found\",\n onChange,\n addNew,\n search = { enabled: true, renderThreshold: 0, searchPlaceholder: \"Search item\" },\n isReadOnlyView,\n ...rest\n }: MultiSelectProps,\n ref\n) => {\n const multiSelectId = useRef(id ?? generateID(20));\n const [expanded, setExpanded] = useState(false);\n const [display, setDisplay] = useState<Display[]>([]);\n const containerReference = useRef<HTMLDivElement>(null);\n const optionListReference = useRef<HTMLDivElement>(null);\n const [focusedSelectItem, setFocusedSelectItem] = useState(0);\n const [shouldClick, setShouldClick] =\n useState(\n false\n ); /** We need this, because whenever we use the arrow keys to select the select item, and we focus the currently selected item it fires the \"click\" listener in Option component. Instead, we only want this to fire if we press \"enter\" or \"spacebar\" so we set this to true whenever that is the case, and back to false when it has been executed. */\n const [shouldFocusButtonAfterClose, setShouldFocusButtonAfterClose] = useState(false);\n const [optionsVisibleCount, setOptionsVisibleCount] = useState(\n React.Children.count(children) - display.length\n );\n const { filter, renderSearch, searchInputRef, resetSearchState, searchVisible } = useSearch({\n selectId: multiSelectId.current,\n expanded,\n search,\n searchInputClassName: classes[\"select-search\"],\n optionsCount: optionsVisibleCount,\n focusedSelectItem,\n setFocusedSelectItem,\n describedBy,\n getOptionId,\n getListboxId\n });\n const { addBtnRef, addNewBtnOptionsContainerClassName, renderAddNew } = useAddNewBtn({\n id: getOptionId(multiSelectId.current, optionsVisibleCount),\n addNew,\n filter,\n focusedSelectItem,\n optionsCount: optionsVisibleCount,\n searchInputRef,\n shouldClick,\n onClickCallback: () => {\n setShouldClick(false);\n resetSearchState();\n }\n });\n\n const nativeSelect = (ref as React.RefObject<HTMLSelectElement>) || createRef();\n\n const onOptionChangeHandler = (optionElement: HTMLElement | null) => {\n if (nativeSelect.current && optionElement) {\n const value = optionElement.getAttribute(\"data-value\")!;\n const options = [...nativeSelect.current.options];\n const lastSelectedOptionValues = options\n .filter(option => option.selected)\n .map(option => option.value);\n options.forEach(option => {\n if (option.value === value || lastSelectedOptionValues.includes(option.value)) {\n option.selected = true;\n }\n });\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n setExpanded(false);\n resetSearchState();\n };\n\n const onSelectedOptionRemoveHandler = (value: string) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.find(option => option.value === value)!.selected = false;\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n\n const customSelectButtonRef = useRef<HTMLButtonElement>(null);\n const readOnlyView = !!rest[\"data-readonlyview\"] || isReadOnlyView;\n const { onArrowNavigation } = useArrowNavigation({\n expanded,\n setExpanded,\n setFocusedSelectItem,\n childrenCount: optionsVisibleCount,\n setShouldClick,\n addBtnRef,\n searchInputRef,\n customSelectButtonRef,\n onClose: resetSearchState,\n isReadOnlyView: readOnlyView\n });\n\n const { listPosition, opacity, optionsListMaxHeight, setListPosition, setOpacity } =\n useSelectPositionList({ expanded, optionListReference, containerReference, addBtnRef });\n\n const syncDisplayValue = (values: string[]) => {\n const options = React.Children.map(children, child => child);\n const displayArray: Display[] = values.map(value => {\n const option = options.find(option => option.props.value === value);\n return { value, label: option?.props.children, fixed: option?.props.fixed };\n });\n setDisplay(displayArray);\n };\n\n const syncSelectedOption = (vals: string[]) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.forEach(option => {\n if (vals.includes(option.value)) {\n option.selected = true;\n } else {\n option.selected = false;\n }\n });\n }\n };\n\n /**\n * @description We have to modify the children (Option component) to have a additional props that allows us to keep track of which one is selected and focused at all times and if a filter is active.\n * The `children` prop can be either a single object (1 child) or an array of multiple children.\n */\n const renderOptions = () => {\n type ReactChildrenType = ReturnType<typeof React.Children.toArray>;\n\n const filterOutSelectedChildren = (internalChildren: ReactChildrenType) => {\n return internalChildren.filter(\n child =>\n typeof child === \"object\" &&\n \"props\" in child &&\n !display.find(option => option.value === child.props.value)\n );\n };\n\n let results;\n if (filter !== \"\") {\n const filteredChildren = React.Children.toArray(children).filter(child => {\n const childElement = child as ReactElement;\n const childText = extractTextFromChildren(childElement.props.children);\n return childText.toLowerCase().includes(filter.toLowerCase());\n });\n\n results = _internalRenderChildren(filterOutSelectedChildren(filteredChildren));\n } else {\n results = _internalRenderChildren(\n filterOutSelectedChildren(React.Children.toArray(children))\n );\n }\n\n optionsVisibleCount !== results.length && setOptionsVisibleCount(results.length);\n\n if (results.length === 0) {\n return <li className={classes[\"no-results\"]}>{noResultsLabel}</li>;\n }\n\n return results;\n\n function _internalRenderChildren(internalChildren: ReactChildrenType) {\n return React.Children.map(internalChildren, (child, index) => {\n return React.cloneElement(child as ReactElement, {\n onFocusChange: (childIndex: number) => {\n setFocusedSelectItem(childIndex);\n },\n onOptionSelect: (optionRef: React.RefObject<HTMLLIElement>) => {\n onOptionChangeHandler(optionRef.current);\n setExpanded(false);\n setShouldClick(false);\n },\n isSearching: false,\n selectOpened: expanded,\n childIndex: index,\n hasFocus: focusedSelectItem === index,\n shouldClick: shouldClick,\n id: getOptionId(multiSelectId.current, index)\n });\n });\n }\n };\n\n const renderChevronIcon = () => {\n return expanded ? (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronUp} />\n ) : (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronDown} />\n );\n };\n\n const icon = useDetermineStatusIcon({ success, error });\n\n const nativeOnChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(event);\n };\n\n useEffect(() => {\n if (expanded && searchInputRef.current) {\n setShouldFocusButtonAfterClose(true);\n searchInputRef.current.focus();\n }\n\n if (!expanded && customSelectButtonRef.current && shouldFocusButtonAfterClose) {\n setShouldFocusButtonAfterClose(false);\n customSelectButtonRef.current.focus();\n }\n }, [\n expanded,\n customSelectButtonRef.current,\n shouldFocusButtonAfterClose,\n searchInputRef.current\n ]);\n\n useEffect(() => {\n syncDisplayValue(value);\n syncSelectedOption(value);\n }, [value]);\n\n const myElementRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(myElementRef, () => {\n if (!expanded) {\n return;\n }\n setExpanded(false);\n setListPosition(Position.Below);\n setOpacity(0);\n }, [expanded]);\n\n const additionalClasses = [];\n expanded && additionalClasses.push(classes.expanded);\n error && additionalClasses.push(classes.error);\n disabled && additionalClasses.push(classes.disabled);\n className && additionalClasses.push(className);\n success && additionalClasses.push(classes.success);\n\n const onSelectButtonClick = () => {\n if (rest[\"data-readonlyview\"] || isReadOnlyView) {\n return;\n }\n setExpanded(expanded => !expanded);\n setShouldClick(false);\n };\n\n const optionsElement = (\n <div className={`list-wrapper-container ${classes[\"list-wrapper-container\"]}`}>\n <div\n ref={optionListReference}\n className={`list-wrapper ${classes[\"list-wrapper\"]}`}\n style={{\n display: expanded ? \"block\" : \"none\",\n opacity: opacity,\n maxHeight: optionsListMaxHeight.wrapper,\n pointerEvents: expanded ? \"auto\" : \"none\",\n top: listPosition === Position.Below ? \"4px\" : \"initial\",\n bottom: listPosition === Position.Above ? \"4px\" : \"initial\"\n }}\n >\n <ul\n id={getListboxId(multiSelectId.current)}\n className={addNewBtnOptionsContainerClassName}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n style={{ maxHeight: optionsListMaxHeight.list }}\n >\n {renderOptions()}\n </ul>\n {renderAddNew()}\n </div>\n </div>\n );\n\n /** The native select is purely for external form libraries. We use it to emit an onChange with native select event object so they know exactly what's happening. */\n return (\n <div ref={myElementRef}>\n <select\n {...filterProps(rest, /^data-/, false)}\n tabIndex={-1}\n multiple={true}\n aria-hidden=\"true\"\n ref={nativeSelect}\n name={name}\n onChange={nativeOnChangeHandler}\n className={readyclasses[\"sr-only\"]}\n >\n <option value=\"\"></option>\n {React.Children.map(children, child => (\n <option value={child.props.value}></option>\n ))}\n </select>\n <div\n {...filterProps(rest, /^data-/)}\n id={multiSelectId.current}\n ref={containerReference}\n onKeyDown={onArrowNavigation}\n className={`custom-select ${classes.select} ${additionalClasses.join(\" \")}`}\n >\n {listPosition === Position.Above ? optionsElement : undefined}\n <div\n className={`${classes[\"custom-select\"]} ${additionalClasses.join(\" \")} `}\n style={{ display: \"flex\" }}\n >\n <div className={classes[\"display-container\"]} data-display>\n <SelectButton\n {...selectButtonProps}\n onClick={onSelectButtonClick}\n name={name}\n ref={customSelectButtonRef}\n disabled={disabled}\n aria-disabled={disabled}\n aria-invalid={error}\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-labelledby={labeledBy}\n aria-describedby={describedBy}\n />\n {value?.length === 0 && placeholder && (\n <span className={classes[\"placeholder\"]}>{placeholder}</span>\n )}\n {value?.length > 0 && (\n <SelectedOptions\n disabled={disabled}\n display={display}\n onClick={onSelectButtonClick}\n onRemove={onSelectedOptionRemoveHandler}\n />\n )}\n {searchVisible && renderSearch()}\n </div>\n <div className={classes[\"status\"]}>{icon || renderChevronIcon()}</div>\n </div>\n {listPosition === Position.Below ? optionsElement : undefined}\n </div>\n </div>\n );\n};\n\nexport const MultiSelect = withReadOnly(React.forwardRef(MultiSelectComponent));\n"],"names":["value","option","expanded"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiSelect.es.js","sources":["../../../../../src/components/Form/Select/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/*\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classes from \"./MultiSelect.module.scss\";\n\nimport React, {\n ForwardRefRenderFunction,\n ReactElement,\n createRef,\n useEffect,\n useRef,\n useState\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useClickOutside } from \"../../../../hooks/useClickOutside\";\nimport { useDetermineStatusIcon } from \"../../../../hooks/useDetermineStatusIcon\";\nimport { useGetDomRoot } from \"../../../../hooks/useGetDomRoot\";\nimport readyclasses from \"../../../../readyclasses.module.scss\";\nimport { filterProps, generateID } from \"../../../../util/helper\";\nimport { Icon, Icons } from \"../../../Icon/Icon\";\nimport { MultiSelectProps, Position } from \"../Select.interfaces\";\nimport { useAddNewBtn } from \"../useAddNewBtn\";\nimport { useSelectPositionList } from \"../useSelectPositionList\";\nimport { SelectButton } from \"./SelectButton\";\nimport { Display, SelectedOptions } from \"./SelectedOptions\";\nimport { useArrowNavigation } from \"./useArrowNavigation\";\nimport { useSearch } from \"./useSearch\";\nimport { withReadOnly } from \"../../../withReadOnly\";\n\nconst getOptionId = (multiSelectId: string, optionIndex: number) =>\n `${multiSelectId}_option${optionIndex}`;\n\nconst getListboxId = (multiSelectId: string) => `${multiSelectId}_listbox`;\n\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n return React.Children.toArray(children).reduce((text: string, child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return text + child;\n }\n if (React.isValidElement(child) && child.props.children) {\n return text + extractTextFromChildren(child.props.children);\n }\n return text;\n }, \"\");\n};\n\nconst MultiSelectComponent: ForwardRefRenderFunction<HTMLSelectElement, MultiSelectProps> = (\n {\n id,\n children,\n name,\n disabled = false,\n labeledBy,\n placeholder,\n describedBy,\n selectButtonProps = {},\n className,\n error = false,\n success = false,\n value,\n clearLabel = \"Clear selection\",\n noResultsLabel = \"No results found\",\n onChange,\n addNew,\n search = { enabled: true, renderThreshold: 0, searchPlaceholder: \"Search item\" },\n isReadOnlyView,\n domRoot,\n ...rest\n }: MultiSelectProps,\n ref\n) => {\n const multiSelectId = useRef(id ?? generateID(20));\n const [expanded, setExpanded] = useState(false);\n const [display, setDisplay] = useState<Display[]>([]);\n const myElementRef = useRef<HTMLDivElement>(null);\n const containerReference = useRef<HTMLDivElement>(null);\n const optionListReference = useRef<HTMLDivElement>(null);\n const portalRef = useRef<HTMLDivElement>(null);\n const { root } = useGetDomRoot(domRoot, myElementRef);\n const [focusedSelectItem, setFocusedSelectItem] = useState(0);\n const [shouldClick, setShouldClick] =\n useState(\n false\n ); /** We need this, because whenever we use the arrow keys to select the select item, and we focus the currently selected item it fires the \"click\" listener in Option component. Instead, we only want this to fire if we press \"enter\" or \"spacebar\" so we set this to true whenever that is the case, and back to false when it has been executed. */\n const [shouldFocusButtonAfterClose, setShouldFocusButtonAfterClose] = useState(false);\n const [optionsVisibleCount, setOptionsVisibleCount] = useState(\n React.Children.count(children) - display.length\n );\n const { filter, renderSearch, searchInputRef, resetSearchState, searchVisible } = useSearch({\n selectId: multiSelectId.current,\n expanded,\n search,\n searchInputClassName: classes[\"select-search\"],\n optionsCount: optionsVisibleCount,\n focusedSelectItem,\n setFocusedSelectItem,\n describedBy,\n getOptionId,\n getListboxId\n });\n const { addBtnRef, addNewBtnOptionsContainerClassName, renderAddNew } = useAddNewBtn({\n id: getOptionId(multiSelectId.current, optionsVisibleCount),\n addNew,\n filter,\n focusedSelectItem,\n optionsCount: optionsVisibleCount,\n searchInputRef,\n shouldClick,\n onClickCallback: () => {\n setShouldClick(false);\n resetSearchState();\n }\n });\n\n const nativeSelect = (ref as React.RefObject<HTMLSelectElement>) || createRef();\n\n const onOptionChangeHandler = (optionElement: HTMLElement | null) => {\n if (nativeSelect.current && optionElement) {\n const value = optionElement.getAttribute(\"data-value\")!;\n const options = [...nativeSelect.current.options];\n const lastSelectedOptionValues = options\n .filter(option => option.selected)\n .map(option => option.value);\n options.forEach(option => {\n if (option.value === value || lastSelectedOptionValues.includes(option.value)) {\n option.selected = true;\n }\n });\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n setExpanded(false);\n resetSearchState();\n };\n\n const onSelectedOptionRemoveHandler = (value: string) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.find(option => option.value === value)!.selected = false;\n nativeSelect.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n\n const customSelectButtonRef = useRef<HTMLButtonElement>(null);\n const readOnlyView = !!rest[\"data-readonlyview\"] || isReadOnlyView;\n const { onArrowNavigation } = useArrowNavigation({\n expanded,\n setExpanded,\n setFocusedSelectItem,\n childrenCount: optionsVisibleCount,\n setShouldClick,\n addBtnRef,\n searchInputRef,\n customSelectButtonRef,\n onClose: resetSearchState,\n isReadOnlyView: readOnlyView\n });\n\n const { listPosition, opacity, optionsListMaxHeight, setListPosition, setOpacity } =\n useSelectPositionList({ expanded, optionListReference, containerReference, addBtnRef });\n\n const syncDisplayValue = (values: string[]) => {\n const options = React.Children.map(children, child => child);\n const displayArray: Display[] = values.map(value => {\n const option = options.find(option => option.props.value === value);\n return { value, label: option?.props.children, fixed: option?.props.fixed };\n });\n setDisplay(displayArray);\n };\n\n const syncSelectedOption = (vals: string[]) => {\n if (nativeSelect.current) {\n const options = [...nativeSelect.current.options];\n options.forEach(option => {\n if (vals.includes(option.value)) {\n option.selected = true;\n } else {\n option.selected = false;\n }\n });\n }\n };\n\n /**\n * @description We have to modify the children (Option component) to have a additional props that allows us to keep track of which one is selected and focused at all times and if a filter is active.\n * The `children` prop can be either a single object (1 child) or an array of multiple children.\n */\n const renderOptions = () => {\n type ReactChildrenType = ReturnType<typeof React.Children.toArray>;\n\n const filterOutSelectedChildren = (internalChildren: ReactChildrenType) => {\n return internalChildren.filter(\n child =>\n typeof child === \"object\" &&\n \"props\" in child &&\n !display.find(option => option.value === child.props.value)\n );\n };\n\n let results;\n if (filter !== \"\") {\n const filteredChildren = React.Children.toArray(children).filter(child => {\n const childElement = child as ReactElement;\n const childText = extractTextFromChildren(childElement.props.children);\n return childText.toLowerCase().includes(filter.toLowerCase());\n });\n\n results = _internalRenderChildren(filterOutSelectedChildren(filteredChildren));\n } else {\n results = _internalRenderChildren(\n filterOutSelectedChildren(React.Children.toArray(children))\n );\n }\n\n optionsVisibleCount !== results.length && setOptionsVisibleCount(results.length);\n\n if (results.length === 0) {\n return <li className={classes[\"no-results\"]}>{noResultsLabel}</li>;\n }\n\n return results;\n\n function _internalRenderChildren(internalChildren: ReactChildrenType) {\n return React.Children.map(internalChildren, (child, index) => {\n return React.cloneElement(child as ReactElement, {\n onFocusChange: (childIndex: number) => {\n setFocusedSelectItem(childIndex);\n },\n onOptionSelect: (optionRef: React.RefObject<HTMLLIElement>) => {\n onOptionChangeHandler(optionRef.current);\n setExpanded(false);\n setShouldClick(false);\n },\n isSearching: false,\n selectOpened: expanded,\n childIndex: index,\n hasFocus: focusedSelectItem === index,\n shouldClick: shouldClick,\n id: getOptionId(multiSelectId.current, index)\n });\n });\n }\n };\n\n const renderChevronIcon = () => {\n return expanded ? (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronUp} />\n ) : (\n <Icon className={classes[\"chevron-icon\"]} icon={Icons.ChevronDown} />\n );\n };\n\n const icon = useDetermineStatusIcon({ success, error });\n\n const nativeOnChangeHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n onChange?.(event);\n };\n\n useEffect(() => {\n if (expanded && searchInputRef.current) {\n setShouldFocusButtonAfterClose(true);\n searchInputRef.current.focus();\n }\n\n if (!expanded && customSelectButtonRef.current && shouldFocusButtonAfterClose) {\n setShouldFocusButtonAfterClose(false);\n customSelectButtonRef.current.focus();\n }\n }, [\n expanded,\n customSelectButtonRef.current,\n shouldFocusButtonAfterClose,\n searchInputRef.current\n ]);\n\n useEffect(() => {\n syncDisplayValue(value);\n syncSelectedOption(value);\n }, [value]);\n\n useClickOutside(myElementRef, () => {\n if (!expanded) {\n return;\n }\n setExpanded(false);\n setListPosition(Position.Below);\n setOpacity(0);\n }, [expanded]);\n\n const additionalClasses = [];\n expanded && additionalClasses.push(classes.expanded);\n error && additionalClasses.push(classes.error);\n disabled && additionalClasses.push(classes.disabled);\n className && additionalClasses.push(className);\n success && additionalClasses.push(classes.success);\n\n const onSelectButtonClick = () => {\n if (rest[\"data-readonlyview\"] || isReadOnlyView) {\n return;\n }\n setExpanded(expanded => !expanded);\n setShouldClick(false);\n };\n\n useEffect(() => {\n if (!expanded) {\n return;\n }\n\n const anchor = containerReference.current;\n const portal = portalRef.current;\n\n if (!anchor || !portal) {\n return;\n }\n\n let frameId: number | null = null;\n\n const updatePosition = () => {\n if (!anchor || !portal) {\n return;\n }\n\n const rect = anchor.getBoundingClientRect();\n const x = rect.left;\n const y = listPosition === Position.Below ? rect.bottom : rect.top;\n\n portal.style.position = \"fixed\";\n portal.style.zIndex = \"1000\";\n portal.style.left = \"0\";\n portal.style.top = \"0\";\n portal.style.width = `${rect.width}px`;\n portal.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n };\n\n const scheduleUpdate = () => {\n if (frameId != null) {\n return;\n }\n frameId = globalThis.requestAnimationFrame(() => {\n frameId = null;\n updatePosition();\n });\n };\n\n updatePosition();\n\n const handleScroll = () => scheduleUpdate();\n const handleResize = () => scheduleUpdate();\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true, capture: true });\n window.addEventListener(\"resize\", handleResize);\n\n const resizeObserver = new ResizeObserver(() => {\n scheduleUpdate();\n });\n resizeObserver.observe(anchor);\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", handleResize);\n resizeObserver.disconnect();\n if (frameId != null) {\n globalThis.cancelAnimationFrame(frameId);\n }\n };\n }, [expanded, listPosition]);\n\n const optionsElement = (\n <div className={`list-wrapper-container ${classes[\"list-wrapper-container\"]}`}>\n <div\n ref={optionListReference}\n className={`list-wrapper ${classes[\"list-wrapper\"]}`}\n style={{\n display: expanded ? \"block\" : \"none\",\n opacity: opacity,\n maxHeight: optionsListMaxHeight.wrapper,\n pointerEvents: expanded ? \"auto\" : \"none\",\n top: listPosition === Position.Below ? \"4px\" : undefined,\n bottom: listPosition === Position.Above ? \"4px\" : undefined\n }}\n >\n <ul\n id={getListboxId(multiSelectId.current)}\n className={addNewBtnOptionsContainerClassName}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n style={{ maxHeight: optionsListMaxHeight.list }}\n >\n {renderOptions()}\n </ul>\n {renderAddNew()}\n </div>\n </div>\n );\n\n /** The native select is purely for external form libraries. We use it to emit an onChange with native select event object so they know exactly what's happening. */\n return (\n <>\n <div ref={myElementRef}>\n <select\n {...filterProps(rest, /^data-/, false)}\n tabIndex={-1}\n multiple={true}\n aria-hidden=\"true\"\n ref={nativeSelect}\n name={name}\n onChange={nativeOnChangeHandler}\n className={readyclasses[\"sr-only\"]}\n >\n <option value=\"\"></option>\n {React.Children.map(children, child => (\n <option value={child.props.value}></option>\n ))}\n </select>\n <div\n {...filterProps(rest, /^data-/)}\n id={multiSelectId.current}\n ref={containerReference}\n onKeyDown={onArrowNavigation}\n className={`custom-select ${classes.select} ${additionalClasses.join(\" \")}`}\n >\n <div\n className={`${classes[\"custom-select\"]} ${additionalClasses.join(\" \")} `}\n style={{ display: \"flex\" }}\n >\n <div className={classes[\"display-container\"]} data-display>\n <SelectButton\n {...selectButtonProps}\n onClick={onSelectButtonClick}\n name={name}\n ref={customSelectButtonRef}\n disabled={disabled}\n aria-disabled={disabled}\n aria-invalid={error}\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-labelledby={labeledBy}\n aria-describedby={describedBy}\n />\n {value?.length === 0 && placeholder && (\n <span className={classes[\"placeholder\"]}>{placeholder}</span>\n )}\n {value?.length > 0 && (\n <SelectedOptions\n disabled={disabled}\n display={display}\n onClick={onSelectButtonClick}\n onRemove={onSelectedOptionRemoveHandler}\n />\n )}\n {searchVisible && renderSearch()}\n </div>\n <div className={classes[\"status\"]}>{icon || renderChevronIcon()}</div>\n </div>\n </div>\n </div>\n {createPortal(\n <div ref={portalRef} className={`${classes.select} ${additionalClasses.join(\" \")}`}>\n {optionsElement}\n </div>,\n root\n )}\n </>\n );\n};\n\nexport const MultiSelect = withReadOnly(React.forwardRef(MultiSelectComponent));\n"],"names":["value","option","expanded"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('.MultiSelect_sr-
|
|
2
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="
|
|
1
|
+
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('.MultiSelect_sr-only_EsL6T{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.MultiSelect_hidden_EsL6T{display:none}.MultiSelect_slide-in_EsL6T{animation:MultiSelect_slide-in_EsL6T .5s forwards}@media (prefers-reduced-motion: reduce){.MultiSelect_slide-in_EsL6T{animation-duration:.1ms}}.MultiSelect_slide-out_EsL6T{animation:MultiSelect_slide-out_EsL6T .5s forwards}@media (prefers-reduced-motion: reduce){.MultiSelect_slide-out_EsL6T{animation-duration:.1ms}}@keyframes MultiSelect_slide-in_EsL6T{0%{transform:translateY(100vh)}to{transform:translateY(0)}}@keyframes MultiSelect_slide-out_EsL6T{0%{transform:translateY(0)}to{transform:translateY(100vh)}}/*!\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.MultiSelect_select_EsL6T{position:relative;box-sizing:border-box;border:0;border-radius:var(--input-border-radius);background-color:var(--input-background-color);font-size:var(--form-control-font-size);transition-property:background-color;transition-duration:.2s;transition-timing-function:ease-in-out}@media (prefers-reduced-motion: reduce){.MultiSelect_select_EsL6T{transition-duration:.1ms}}.MultiSelect_select_EsL6T [data-display]{color:var(--color-default);font-family:var(--font-family)}.MultiSelect_select_EsL6T.MultiSelect_expanded_EsL6T .MultiSelect_list-wrapper_EsL6T{background:var(--light)}.MultiSelect_select_EsL6T:not(.MultiSelect_expanded_EsL6T):has(button:focus){position:relative;z-index:2;outline:calc(.125 * var(--font-size)) solid var(--color-focus);outline-offset:calc(.125 * var(--font-size));border-radius:var(--focus-border-radius)}.MultiSelect_select_EsL6T:not(.MultiSelect_expanded_EsL6T) .MultiSelect_custom-select_EsL6T:focus:not(.MultiSelect_error_EsL6T){border-color:var(--input-border-color);border-width:var(--input-border-width);padding:0 calc(.5 * var(--font-size) - var(--input-border-width))}.MultiSelect_select_EsL6T:hover:not(.MultiSelect_disabled_EsL6T):not(.MultiSelect_expanded_EsL6T):not(.MultiSelect_error_EsL6T) .MultiSelect_custom-select_EsL6T:not(:focus){border-color:var(--input-border-color);border-width:var(--input-border-width);background-color:var(--color-blue-grey25)}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T{box-sizing:border-box;width:100%;min-height:calc(2.875 * var(--font-size) - 2 * var(--input-border-width));padding:0 calc(.5 * var(--font-size) - var(--input-border-width));background-color:transparent;border-color:var(--color-blue-grey500);border-style:var(--input-border-style);border-width:var(--input-border-width);border-radius:var(--input-border-radius);font-size:var(--form-control-font-size);transition-property:background-color,border-color;transition-duration:.2s;transition-timing-function:ease-in-out}@media (prefers-reduced-motion: reduce){.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T{transition-duration:.1ms}}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T:focus-visible,.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T:focus{outline:none}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T.MultiSelect_error_EsL6T{border-color:var(--error)}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T.MultiSelect_error_EsL6T:focus{border-width:var(--input-border-width)}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T.MultiSelect_disabled_EsL6T{border-color:var(--color-disabled);pointer-events:none}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T .MultiSelect_display-container_EsL6T{flex:1;display:flex;align-items:center;padding:.1875rem 0;gap:.375rem}.MultiSelect_select_EsL6T .MultiSelect_list-wrapper-container_EsL6T{position:relative}.MultiSelect_select_EsL6T .MultiSelect_list-wrapper_EsL6T{border-color:var(--light-grey-border);border-style:var(--input-border-style);border-width:var(--input-border-width);border-radius:var(--input-border-radius);box-shadow:0 4px 5px #01053233;box-shadow:0 3px 14px #0105321f;box-shadow:0 8px 10px #01053224;position:absolute;z-index:11;left:0;width:100%;overflow:auto}.MultiSelect_select_EsL6T ul{box-sizing:border-box;padding:.25rem 0;width:100%;margin:0;list-style:none;background-color:var(--light);border-radius:var(--input-border-radius);color:var(--default);text-align:left;overflow:auto;max-height:25rem}.MultiSelect_select_EsL6T ul li{padding:.62rem .75rem;font-size:var(--form-control-font-size);font-family:var(--font-family);margin:0;position:relative;line-height:1.43;box-sizing:border-box;min-height:2.5rem;cursor:pointer}.MultiSelect_select_EsL6T ul li:after{content:"";position:absolute;top:0;left:0;background-color:transparent;width:100%;height:100%;opacity:.05}.MultiSelect_select_EsL6T ul li:focus,.MultiSelect_select_EsL6T ul li.MultiSelect_focus_EsL6T{outline:none}.MultiSelect_select_EsL6T ul li:focus:before,.MultiSelect_select_EsL6T ul li.MultiSelect_focus_EsL6T:before{content:"";position:absolute;top:0;left:.125rem;height:100%;width:calc(100% - .25rem);opacity:1;z-index:101;outline:calc(.125 * var(--font-size)) solid var(--color-focus);outline-offset:0;border-radius:var(--focus-border-radius)}.MultiSelect_select_EsL6T ul li:hover:after,.MultiSelect_select_EsL6T ul li:active:after{background-color:var(--color-primary)}.MultiSelect_select_EsL6T ul li:active:after{opacity:.1}.MultiSelect_select_EsL6T ul li.MultiSelect_disabled_EsL6T{color:var(--greyed-out);background-color:var(--disabled);pointer-events:none}.MultiSelect_status_EsL6T{padding:.3125rem;display:flex;align-items:center}.MultiSelect_status_EsL6T [data-icon-status=success]{color:var(--success);font-size:var(--font-size-big)}.MultiSelect_status_EsL6T [data-icon-status=error]{color:var(--error);font-size:var(--font-size-big)}.MultiSelect_status_EsL6T .MultiSelect_chevron-icon_EsL6T{color:var(--default);font-size:var(--font-size-small)}.MultiSelect_status_EsL6T *+*{margin-left:1.25rem}.MultiSelect_placeholder_EsL6T{color:var(--greyed-out)}.MultiSelect_select-search_EsL6T{flex:1;box-sizing:border-box;border-bottom-left-radius:0;border-bottom-right-radius:0;border:0;background-color:transparent;color:var(--default);font-family:var(--font-family);font-size:calc(.83 * var(--font-size));line-height:1.3333;margin:0;padding:0}.MultiSelect_select-search_EsL6T:focus-visible,.MultiSelect_select-search_EsL6T:focus{outline:none}.MultiSelect_disabled_EsL6T{cursor:not-allowed;color:var(--greyed-out);background-color:var(--color-blue-grey25)}.MultiSelect_disabled_EsL6T>*{pointer-events:none}@media only screen and (min-width: 30em){.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T{padding:0 calc(.5 * var(--font-size) - var(--input-border-width))}.MultiSelect_select_EsL6T:not(.MultiSelect_expanded_EsL6T) .MultiSelect_custom-select_EsL6T:focus:not(.MultiSelect_error_EsL6T){padding:0 calc(.5 * var(--font-size) - var(--input-border-width))}}[data-readonlyview=true] .MultiSelect_custom-select_EsL6T{color:var(--read-only-text-color);border-color:var(--read-only-border-color);background-color:var(--color-white)}[data-readonlyview=true] .MultiSelect_custom-select_EsL6T.MultiSelect_error_EsL6T,[data-readonlyview=true] .MultiSelect_custom-select_EsL6T.MultiSelect_success_EsL6T{border-color:var(--read-only-border-color)}[data-readonlyview=true] .MultiSelect_custom-select_EsL6T button{pointer-events:none}[data-readonlyview=true] .MultiSelect_status_EsL6T .MultiSelect_chevron-icon_EsL6T{visibility:hidden}[data-readonlyview=true]:hover:not(.MultiSelect_disabled_EsL6T):not(.MultiSelect_expanded_EsL6T):not(.MultiSelect_error_EsL6T) .MultiSelect_custom-select_EsL6T:not(:focus){color:var(--read-only-text-color);border-color:var(--read-only-border-color);background-color:var(--color-white)}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}}();
|
|
2
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="MultiSelect_select_EsL6T",t="MultiSelect_expanded_EsL6T",s="MultiSelect_error_EsL6T",l="MultiSelect_disabled_EsL6T",c="MultiSelect_focus_EsL6T",r="MultiSelect_status_EsL6T",o="MultiSelect_placeholder_EsL6T",i="MultiSelect_success_EsL6T",u={select:e,expanded:t,"list-wrapper":"MultiSelect_list-wrapper_EsL6T","custom-select":"MultiSelect_custom-select_EsL6T",error:s,disabled:l,"display-container":"MultiSelect_display-container_EsL6T","list-wrapper-container":"MultiSelect_list-wrapper-container_EsL6T",focus:c,status:r,"chevron-icon":"MultiSelect_chevron-icon_EsL6T",placeholder:o,"select-search":"MultiSelect_select-search_EsL6T",success:i};exports.default=u,exports.disabled=l,exports.error=s,exports.expanded=t,exports.focus=c,exports.placeholder=o,exports.select=e,exports.status=r,exports.success=i;
|
|
3
3
|
//# sourceMappingURL=MultiSelect.module.scss.cjs.js.map
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('.MultiSelect_sr-
|
|
2
|
-
const select = "
|
|
3
|
-
const expanded = "
|
|
4
|
-
const error = "
|
|
5
|
-
const disabled = "
|
|
6
|
-
const focus = "
|
|
7
|
-
const status = "
|
|
8
|
-
const placeholder = "
|
|
9
|
-
const success = "
|
|
1
|
+
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('.MultiSelect_sr-only_EsL6T{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.MultiSelect_hidden_EsL6T{display:none}.MultiSelect_slide-in_EsL6T{animation:MultiSelect_slide-in_EsL6T .5s forwards}@media (prefers-reduced-motion: reduce){.MultiSelect_slide-in_EsL6T{animation-duration:.1ms}}.MultiSelect_slide-out_EsL6T{animation:MultiSelect_slide-out_EsL6T .5s forwards}@media (prefers-reduced-motion: reduce){.MultiSelect_slide-out_EsL6T{animation-duration:.1ms}}@keyframes MultiSelect_slide-in_EsL6T{0%{transform:translateY(100vh)}to{transform:translateY(0)}}@keyframes MultiSelect_slide-out_EsL6T{0%{transform:translateY(0)}to{transform:translateY(100vh)}}/*!\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.MultiSelect_select_EsL6T{position:relative;box-sizing:border-box;border:0;border-radius:var(--input-border-radius);background-color:var(--input-background-color);font-size:var(--form-control-font-size);transition-property:background-color;transition-duration:.2s;transition-timing-function:ease-in-out}@media (prefers-reduced-motion: reduce){.MultiSelect_select_EsL6T{transition-duration:.1ms}}.MultiSelect_select_EsL6T [data-display]{color:var(--color-default);font-family:var(--font-family)}.MultiSelect_select_EsL6T.MultiSelect_expanded_EsL6T .MultiSelect_list-wrapper_EsL6T{background:var(--light)}.MultiSelect_select_EsL6T:not(.MultiSelect_expanded_EsL6T):has(button:focus){position:relative;z-index:2;outline:calc(.125 * var(--font-size)) solid var(--color-focus);outline-offset:calc(.125 * var(--font-size));border-radius:var(--focus-border-radius)}.MultiSelect_select_EsL6T:not(.MultiSelect_expanded_EsL6T) .MultiSelect_custom-select_EsL6T:focus:not(.MultiSelect_error_EsL6T){border-color:var(--input-border-color);border-width:var(--input-border-width);padding:0 calc(.5 * var(--font-size) - var(--input-border-width))}.MultiSelect_select_EsL6T:hover:not(.MultiSelect_disabled_EsL6T):not(.MultiSelect_expanded_EsL6T):not(.MultiSelect_error_EsL6T) .MultiSelect_custom-select_EsL6T:not(:focus){border-color:var(--input-border-color);border-width:var(--input-border-width);background-color:var(--color-blue-grey25)}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T{box-sizing:border-box;width:100%;min-height:calc(2.875 * var(--font-size) - 2 * var(--input-border-width));padding:0 calc(.5 * var(--font-size) - var(--input-border-width));background-color:transparent;border-color:var(--color-blue-grey500);border-style:var(--input-border-style);border-width:var(--input-border-width);border-radius:var(--input-border-radius);font-size:var(--form-control-font-size);transition-property:background-color,border-color;transition-duration:.2s;transition-timing-function:ease-in-out}@media (prefers-reduced-motion: reduce){.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T{transition-duration:.1ms}}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T:focus-visible,.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T:focus{outline:none}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T.MultiSelect_error_EsL6T{border-color:var(--error)}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T.MultiSelect_error_EsL6T:focus{border-width:var(--input-border-width)}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T.MultiSelect_disabled_EsL6T{border-color:var(--color-disabled);pointer-events:none}.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T .MultiSelect_display-container_EsL6T{flex:1;display:flex;align-items:center;padding:.1875rem 0;gap:.375rem}.MultiSelect_select_EsL6T .MultiSelect_list-wrapper-container_EsL6T{position:relative}.MultiSelect_select_EsL6T .MultiSelect_list-wrapper_EsL6T{border-color:var(--light-grey-border);border-style:var(--input-border-style);border-width:var(--input-border-width);border-radius:var(--input-border-radius);box-shadow:0 4px 5px #01053233;box-shadow:0 3px 14px #0105321f;box-shadow:0 8px 10px #01053224;position:absolute;z-index:11;left:0;width:100%;overflow:auto}.MultiSelect_select_EsL6T ul{box-sizing:border-box;padding:.25rem 0;width:100%;margin:0;list-style:none;background-color:var(--light);border-radius:var(--input-border-radius);color:var(--default);text-align:left;overflow:auto;max-height:25rem}.MultiSelect_select_EsL6T ul li{padding:.62rem .75rem;font-size:var(--form-control-font-size);font-family:var(--font-family);margin:0;position:relative;line-height:1.43;box-sizing:border-box;min-height:2.5rem;cursor:pointer}.MultiSelect_select_EsL6T ul li:after{content:"";position:absolute;top:0;left:0;background-color:transparent;width:100%;height:100%;opacity:.05}.MultiSelect_select_EsL6T ul li:focus,.MultiSelect_select_EsL6T ul li.MultiSelect_focus_EsL6T{outline:none}.MultiSelect_select_EsL6T ul li:focus:before,.MultiSelect_select_EsL6T ul li.MultiSelect_focus_EsL6T:before{content:"";position:absolute;top:0;left:.125rem;height:100%;width:calc(100% - .25rem);opacity:1;z-index:101;outline:calc(.125 * var(--font-size)) solid var(--color-focus);outline-offset:0;border-radius:var(--focus-border-radius)}.MultiSelect_select_EsL6T ul li:hover:after,.MultiSelect_select_EsL6T ul li:active:after{background-color:var(--color-primary)}.MultiSelect_select_EsL6T ul li:active:after{opacity:.1}.MultiSelect_select_EsL6T ul li.MultiSelect_disabled_EsL6T{color:var(--greyed-out);background-color:var(--disabled);pointer-events:none}.MultiSelect_status_EsL6T{padding:.3125rem;display:flex;align-items:center}.MultiSelect_status_EsL6T [data-icon-status=success]{color:var(--success);font-size:var(--font-size-big)}.MultiSelect_status_EsL6T [data-icon-status=error]{color:var(--error);font-size:var(--font-size-big)}.MultiSelect_status_EsL6T .MultiSelect_chevron-icon_EsL6T{color:var(--default);font-size:var(--font-size-small)}.MultiSelect_status_EsL6T *+*{margin-left:1.25rem}.MultiSelect_placeholder_EsL6T{color:var(--greyed-out)}.MultiSelect_select-search_EsL6T{flex:1;box-sizing:border-box;border-bottom-left-radius:0;border-bottom-right-radius:0;border:0;background-color:transparent;color:var(--default);font-family:var(--font-family);font-size:calc(.83 * var(--font-size));line-height:1.3333;margin:0;padding:0}.MultiSelect_select-search_EsL6T:focus-visible,.MultiSelect_select-search_EsL6T:focus{outline:none}.MultiSelect_disabled_EsL6T{cursor:not-allowed;color:var(--greyed-out);background-color:var(--color-blue-grey25)}.MultiSelect_disabled_EsL6T>*{pointer-events:none}@media only screen and (min-width: 30em){.MultiSelect_select_EsL6T .MultiSelect_custom-select_EsL6T{padding:0 calc(.5 * var(--font-size) - var(--input-border-width))}.MultiSelect_select_EsL6T:not(.MultiSelect_expanded_EsL6T) .MultiSelect_custom-select_EsL6T:focus:not(.MultiSelect_error_EsL6T){padding:0 calc(.5 * var(--font-size) - var(--input-border-width))}}[data-readonlyview=true] .MultiSelect_custom-select_EsL6T{color:var(--read-only-text-color);border-color:var(--read-only-border-color);background-color:var(--color-white)}[data-readonlyview=true] .MultiSelect_custom-select_EsL6T.MultiSelect_error_EsL6T,[data-readonlyview=true] .MultiSelect_custom-select_EsL6T.MultiSelect_success_EsL6T{border-color:var(--read-only-border-color)}[data-readonlyview=true] .MultiSelect_custom-select_EsL6T button{pointer-events:none}[data-readonlyview=true] .MultiSelect_status_EsL6T .MultiSelect_chevron-icon_EsL6T{visibility:hidden}[data-readonlyview=true]:hover:not(.MultiSelect_disabled_EsL6T):not(.MultiSelect_expanded_EsL6T):not(.MultiSelect_error_EsL6T) .MultiSelect_custom-select_EsL6T:not(:focus){color:var(--read-only-text-color);border-color:var(--read-only-border-color);background-color:var(--color-white)}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}}();
|
|
2
|
+
const select = "MultiSelect_select_EsL6T";
|
|
3
|
+
const expanded = "MultiSelect_expanded_EsL6T";
|
|
4
|
+
const error = "MultiSelect_error_EsL6T";
|
|
5
|
+
const disabled = "MultiSelect_disabled_EsL6T";
|
|
6
|
+
const focus = "MultiSelect_focus_EsL6T";
|
|
7
|
+
const status = "MultiSelect_status_EsL6T";
|
|
8
|
+
const placeholder = "MultiSelect_placeholder_EsL6T";
|
|
9
|
+
const success = "MultiSelect_success_EsL6T";
|
|
10
10
|
const classes = {
|
|
11
11
|
select,
|
|
12
12
|
expanded,
|
|
13
|
-
"list-wrapper": "MultiSelect_list-
|
|
14
|
-
"custom-select": "MultiSelect_custom-
|
|
13
|
+
"list-wrapper": "MultiSelect_list-wrapper_EsL6T",
|
|
14
|
+
"custom-select": "MultiSelect_custom-select_EsL6T",
|
|
15
15
|
error,
|
|
16
16
|
disabled,
|
|
17
|
-
"display-container": "MultiSelect_display-
|
|
18
|
-
"list-wrapper-container": "MultiSelect_list-wrapper-
|
|
17
|
+
"display-container": "MultiSelect_display-container_EsL6T",
|
|
18
|
+
"list-wrapper-container": "MultiSelect_list-wrapper-container_EsL6T",
|
|
19
19
|
focus,
|
|
20
20
|
status,
|
|
21
|
-
"chevron-icon": "MultiSelect_chevron-
|
|
21
|
+
"chevron-icon": "MultiSelect_chevron-icon_EsL6T",
|
|
22
22
|
placeholder,
|
|
23
|
-
"select-search": "MultiSelect_select-
|
|
23
|
+
"select-search": "MultiSelect_select-search_EsL6T",
|
|
24
24
|
success
|
|
25
25
|
};
|
|
26
26
|
export {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('/*!\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.
|
|
2
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="
|
|
1
|
+
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('/*!\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.SelectButton_btn_EsL6T{position:absolute;top:0;left:0;height:100%;width:100%;border:0;padding:0;background:none;cursor:pointer;outline:0}')),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}}();
|
|
2
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="SelectButton_btn_EsL6T",t={btn:e};exports.btn=e,exports.default=t;
|
|
3
3
|
//# sourceMappingURL=SelectButton.module.scss.cjs.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('/*!\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.
|
|
2
|
-
const btn = "
|
|
1
|
+
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('/*!\n * Copyright 2022 OneWelcome B.V.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */.SelectButton_btn_EsL6T{position:absolute;top:0;left:0;height:100%;width:100%;border:0;padding:0;background:none;cursor:pointer;outline:0}')),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}}();
|
|
2
|
+
const btn = "SelectButton_btn_EsL6T";
|
|
3
3
|
const classes = {
|
|
4
4
|
btn
|
|
5
5
|
};
|