@ryuzaki13/react-foundation-ui 1.7.0 → 1.8.1
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/README.md +36 -0
- package/dist/advanced-search/index.js +1 -1
- package/dist/chunks/{multi-select-Bs1GU5MD.js → multi-select-D5b3Gxsv.js} +130 -119
- package/dist/chunks/{multi-select-Bs1GU5MD.js.map → multi-select-D5b3Gxsv.js.map} +1 -1
- package/dist/chunks/odata-dependent-C_DCbKY2.js +45 -0
- package/dist/chunks/odata-dependent-C_DCbKY2.js.map +1 -0
- package/dist/chunks/select-D3EnRya6.js +355 -0
- package/dist/chunks/select-D3EnRya6.js.map +1 -0
- package/dist/chunks/{useODataSelectBase-Bq36Wp1U.js → useODataSelectBase-Cc79kBNk.js} +27 -43
- package/dist/chunks/useODataSelectBase-Cc79kBNk.js.map +1 -0
- package/dist/multi-select/index.js +1 -1
- package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts +5 -13
- package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts +3 -20
- package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts.map +1 -1
- package/dist/odata-dependent/ODataDependentSegmentControlProps.d.ts +29 -0
- package/dist/odata-dependent/ODataDependentSegmentControlProps.d.ts.map +1 -0
- package/dist/odata-dependent/index.d.ts +3 -0
- package/dist/odata-dependent/index.d.ts.map +1 -0
- package/dist/odata-dependent/index.js +2 -0
- package/dist/odata-dependent/model/useODataDependentSelection.d.ts +50 -0
- package/dist/odata-dependent/model/useODataDependentSelection.d.ts.map +1 -0
- package/dist/preset-select/index.js +1 -1
- package/dist/select/ODataDependentSegmentSelect.d.ts +12 -0
- package/dist/select/ODataDependentSegmentSelect.d.ts.map +1 -0
- package/dist/select/index.d.ts +1 -0
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +2 -2
- package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/tree-select/index.js +2 -2
- package/package.json +5 -1
- package/storybook-static/assets/{Badge-Dvx1zhPb.js → Badge-vnYXe1um.js} +1 -1
- package/storybook-static/assets/{Badge.stories-0OqfwxFw.js → Badge.stories-5LcplF_Q.js} +1 -1
- package/storybook-static/assets/{BadgeList-y-uBOP3g.js → BadgeList-B1Mn9GtM.js} +1 -1
- package/storybook-static/assets/{Button-Do2mwgAg.js → Button-Ez6zTRLH.js} +1 -1
- package/storybook-static/assets/{Button-C80gfqoH.js → Button-tokZDQsV.js} +1 -1
- package/storybook-static/assets/{Button.stories-D8Fw6nud.js → Button.stories-BeJ5wldz.js} +1 -1
- package/storybook-static/assets/{CalendarView--kZXxq2R.js → CalendarView-BYiJjzKd.js} +1 -1
- package/storybook-static/assets/{CheckBox-B75CNLqu.js → CheckBox-BFCmk9Is.js} +1 -1
- package/storybook-static/assets/{CheckBox-BLhKCbdy.js → CheckBox-O5kReKiZ.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-B6oVA8el.js → CheckBox.stories-BUNYAiF-.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-cvznI3uO.js → Color-6AOWCN3U-CYSLqqAa.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CO0idIWo.js → ContextMenu-CXsCt4Ca.js} +1 -1
- package/storybook-static/assets/{ContextMenu-fNZVzUvQ.js → ContextMenu-D7IH0vrL.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-0nmobIh6.js → ContextMenu.stories-BugHcFL7.js} +1 -1
- package/storybook-static/assets/{DateInput-D2rfcbf3.js → DateInput-Clx9NJfT.js} +1 -1
- package/storybook-static/assets/{DateInput-C2In05Rg.js → DateInput-xKfdW4xy.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-JUkITh6A.js → DateInput.stories-VgCgoB2M.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-nJgrTbCb.js → DateRangePresetSelect-CalAPOdY.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-Qc1kiswO.js → DateRangePresetSelect-PvUDbbbE.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-ZCKuMVv1.js → DateRangePresetSelect.stories-DrLZercZ.js} +1 -1
- package/storybook-static/assets/{Detail-pOYJZCE7.js → Detail-Bls5nJys.js} +1 -1
- package/storybook-static/assets/{Detail.stories-zt0s1IF8.js → Detail.stories-BS7JQ0sv.js} +1 -1
- package/storybook-static/assets/{Dialog-0qof8LAi.js → Dialog-DzFUQBt1.js} +1 -1
- package/storybook-static/assets/{Dialog-yNCOXo0U.js → Dialog-T74XF-bA.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-B8N3aCaV.js → Dialog.stories-DwAyLLWR.js} +1 -1
- package/storybook-static/assets/{Disclosure-1aczsOfE.js → Disclosure-DukYcfZ8.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-BHF7zV4r.js → Disclosure.stories-BwbQhJLc.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-1UIF1dzA.js → DisclosureGroup-C2j4-sfq.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-C3ElfDK6.js → DocsRenderer-JROSPFPF-aOEkU93H.js} +1 -1
- package/storybook-static/assets/{DropZone-BXwkEyR-.js → DropZone-CX6FCvI6.js} +1 -1
- package/storybook-static/assets/{DropZone-DcnHdyOy.js → DropZone-DmXfqTac.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-C__hp7nZ.js → DropZone.stories-CWUYTr9y.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-Cn3NEWML.js → DropdownMenu-9_GcY2uX.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-DRmbAqvH.js → ExpandableActionPanel-nt3MqFv9.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-CILdKlLi.js → ExpandableActionPanel.stories-olHfqsW_.js} +1 -1
- package/storybook-static/assets/{Flex-sxipWyth.js → Flex-RLn0K4Ow.js} +1 -1
- package/storybook-static/assets/{Flex.stories-DY8V2sbR.js → Flex.stories-DQDMHquA.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-CNZzGjfO.js → FloatingPopover-C3zX8ub-.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-DG4dVFTa.js → FormattedTableCell-B4pCfcrR.js} +1 -1
- package/storybook-static/assets/{Grid-D2wN6WmI.js → Grid-tCvypgeR.js} +1 -1
- package/storybook-static/assets/{Grid.stories-Dtya61zz.js → Grid.stories-B5vW8L5j.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-CQOvZs9k.js → ImageCropper.stories-ZYBRPrX5.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-C8mxg5a9.js → ImageRenderer-BNfa_o00.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-ulHRIV84.js → ImageRenderer.stories-Dpnwae9g.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DfO8LRNv.js → ImageView.stories-B0AdmHu8.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-BC2AIOFa.js → ImageViewer.stories-BjS-HrS8.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-D3u-RNDY.js → ImageViewerRuntime-CUjlGhkL.js} +1 -1
- package/storybook-static/assets/{Input-Duo7u72d.js → Input-BZvdvztj.js} +1 -1
- package/storybook-static/assets/{Input-BrWASIXE.js → Input-BfxuEl-U.js} +1 -1
- package/storybook-static/assets/{Input.stories--i9k07KI.js → Input.stories-CRyRl5-A.js} +1 -1
- package/storybook-static/assets/{InputDateTime-DcZRgiPg.js → InputDateTime-BoHXIqs0.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-Dt6Y1CZ2.js → InputDateTime.stories-4TKy1puk.js} +1 -1
- package/storybook-static/assets/{InputFile-BiLD06iA.js → InputFile-9rfT18Tp.js} +1 -1
- package/storybook-static/assets/{InputFile-Cj-m_fo4.js → InputFile-cHVEMDCa.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-akX4tW3o.js → InputFile.stories-Dfz4dP6-.js} +1 -1
- package/storybook-static/assets/{InputFiles-B8Erga76.js → InputFiles-B7hAFUUH.js} +1 -1
- package/storybook-static/assets/{InputFiles-6FDWUpPw.js → InputFiles-D-yaCNy7.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CHQIzkT-.js → InputFiles.stories-BuyS7aob.js} +1 -1
- package/storybook-static/assets/{InputFilesList-B2ED3xeD.js → InputFilesList-AVN7l6tF.js} +1 -1
- package/storybook-static/assets/{InputImage-Csz6DuXw.js → InputImage-B9XqXq0w.js} +1 -1
- package/storybook-static/assets/{InputImage-DgEux6nu.js → InputImage-HJDF6igx.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-BQMt1D7p.js → InputImage.stories-BV70MC-m.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-Dsk4_Vr2.js → InteractiveComponents-CHY0kEDq.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-DkOUo1Hs.js → InteractiveComponents.stories-D6arBycE.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CtU_BRSU.js → LayoutPicker-BGk1niU3.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BYQGwA2A.js → LayoutPicker-SjhPWivQ.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-u-llXrmg.js → LayoutPicker.stories-CbEGkcsV.js} +1 -1
- package/storybook-static/assets/{Listbox-CRpGe74L.js → Listbox-C3sJ_hRZ.js} +1 -1
- package/storybook-static/assets/{Listbox-D-w3s2rV.js → Listbox-D8KrJkpi.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-DNgm_jEg.js → Listbox.stories-CVdUd7oX.js} +1 -1
- package/storybook-static/assets/{Modal-BCEfdMRV.js → Modal-0PfZiQTc.js} +1 -1
- package/storybook-static/assets/{Modal.stories-DgluP-Zg.js → Modal.stories-CVsQnsPB.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-DB1CpShR.js → ModalManagerProvider-CtrgehPS.js} +1 -1
- package/storybook-static/assets/{MultiSelect-CtPVgzw3.js → MultiSelect-BmMO3Np9.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DXazv8Gk.js → MultiSelect-C4uTzWsY.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-m3lK4whp.js → MultiSelect.stories-BbRKK0p6.js} +1 -1
- package/storybook-static/assets/{NoData-tXPTJtqs.js → NoData-FOwrLS3D.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-Cns_wFoV.js → NotificationsHost-CvUyoPxm.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-Bl6cz2bV.js → NotificationsHost.stories-CxAmUl63.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-6Df5Fkah.js → ODataMultiSelect-MtLFqFdV.js} +3 -2
- package/storybook-static/assets/ODataMultiSelect.stories-BqdZ_SmQ.js +139 -0
- package/storybook-static/assets/{ODataSelect-BO5s66q2.js → ODataSelect-C2mNXOs7.js} +3 -1
- package/storybook-static/assets/ODataSelect.stories-Ch9pJFtV.js +161 -0
- package/storybook-static/assets/{ODataTreeMultiSelect-OSArfN7U.js → ODataTreeMultiSelect-DKuQpEHJ.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-DIO3n7N6.js → ODataTreeMultiSelect.stories-rhaGxNb0.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-C2YNVppX.js → ODataTreeSelect-iOpfYI9F.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-BCjXst_-.js → ODataTreeSelect.stories-DO1bOEQc.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-CBqY-Bqn.js → OneStepScroller-BMbG0e_H.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-D9DwWI_-.js → PeriodSelect-Cs81vXtY.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-8I2DZE_l.js → PeriodSelect-MupKtCZ2.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-Dvdfl6jl.js → PeriodSelect.stories-B2FDkAfy.js} +1 -1
- package/storybook-static/assets/{PickerSelectionToolbar-DTFaKHYJ.js → PickerSelectionToolbar-DkWserZQ.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-DB5hWOPs.js → PickerTriggerActions-BOhoXiBt.js} +1 -1
- package/storybook-static/assets/{Popover-x1KDnoku.js → Popover-UdAXxj_x.js} +1 -1
- package/storybook-static/assets/{Popover-DDuVgt46.js → Popover-dlyvIeXz.js} +1 -1
- package/storybook-static/assets/{Popover.stories-JeW5d8gm.js → Popover.stories-CO2yrZc-.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-C4gbhz_V.js → PresetRangeDateInput-Bbgpqy-r.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Csq8RBK7.js → PresetRangeDateInput-TTU2ggx2.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-mPfnN7w9.js → PresetRangeDateInput.stories-DUMiMPe7.js} +1 -1
- package/storybook-static/assets/{PresetSelect-D5XN8_y3.js → PresetSelect-DmdRTAVo.js} +1 -1
- package/storybook-static/assets/{RadioButton-DqKb7dga.js → RadioButton-CMxc7Jvy.js} +1 -1
- package/storybook-static/assets/{RadioButton-3vNTYzok.js → RadioButton-CsZACDyv.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-DEtB6-Gq.js → RadioButton.stories-Aav_OAcv.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CxSDxT4Z.js → RadioGroup-C34FTwLU.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BVH61YyU.js → RadioGroup-U2EEs5od.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-D8YHF52N.js → RadioGroup.stories-wL2AX-Yg.js} +1 -1
- package/storybook-static/assets/{Scrollable-CzjaBhDx.js → Scrollable-DUOHq_cZ.js} +1 -1
- package/storybook-static/assets/{Select-DRU8ibvA.js → Select-CaoNBi5X.js} +1 -1
- package/storybook-static/assets/{Select-DCitHJuw.js → Select-JY35jdqV.js} +1 -1
- package/storybook-static/assets/{Select.stories-CK_D5RAO.js → Select.stories-Db-PRiir.js} +1 -1
- package/storybook-static/assets/{SelectOptionContent-BAJEXMJG.js → SelectOptionContent-BcvkiM5d.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-DyRYm6Fb.js → SerializableSelect-HSwx4Kn2.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-6msteGLD.js → SerializableSelect.stories-DdHotcES.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CNIODG1r.js → SingleDateTimeInput-CQVoGA2w.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Dt2pvrEI.js → SingleDateTimeInput-MYajYmv1.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BjZkApxR.js → SingleDateTimeInput.stories-BbUphbSp.js} +1 -1
- package/storybook-static/assets/{Slider-CyrGnw3r.js → Slider-BrQ4ksxF.js} +1 -1
- package/storybook-static/assets/{Slider-C2STT2eb.js → Slider-s7ST-3RJ.js} +1 -1
- package/storybook-static/assets/{Slider.stories-cV_-2z3X.js → Slider.stories-w50A1paF.js} +1 -1
- package/storybook-static/assets/{SliderInput-C7XLyS8n.js → SliderInput-1_Egcch8.js} +1 -1
- package/storybook-static/assets/{SliderInput-DxWLjpcW.js → SliderInput-Cnm3KcyF.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-DBIe7Yhj.js → SliderInput.stories-DLBBUxKz.js} +1 -1
- package/storybook-static/assets/{Sortable-06Qmji0A.js → Sortable-B0TvDh0j.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-VPSDld7o.js → Sortable.stories-B31jbM4x.js} +1 -1
- package/storybook-static/assets/{Splitter-Bjc9_DpU.js → Splitter-D4B3BVbz.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-CaecpwzX.js → Splitter.stories-szzG_E9V.js} +1 -1
- package/storybook-static/assets/{StateSelect-DEbS-UHz.js → StateSelect-BNneTJ8H.js} +1 -1
- package/storybook-static/assets/{StateSelect-CBqVFgZr.js → StateSelect-Ceh8_VLn.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-DHCZQjpD.js → StateSelect.stories-CJxr-Qm_.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-DZ5cJKre.js → StringToggle.stories-Cwdk9yWF.js} +1 -1
- package/storybook-static/assets/{Switch-BQVOziJc.js → Switch-f5NHm5hJ.js} +1 -1
- package/storybook-static/assets/{Switch-DbMsXJZQ.js → Switch-uGSRbqVn.js} +1 -1
- package/storybook-static/assets/{Switch.stories-xsRPNma9.js → Switch.stories-HaYKntQH.js} +1 -1
- package/storybook-static/assets/{Table-90xunt07.js → Table-DxQuA1Dc.js} +1 -1
- package/storybook-static/assets/{Table.stories-BHO05Nt2.js → Table.stories-SMhKCmIb.js} +1 -1
- package/storybook-static/assets/{Tabs-I00nOCLh.js → Tabs-BDX7aIIu.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-B2XJ7Ho5.js → Tabs.stories-CjlYBZ8E.js} +1 -1
- package/storybook-static/assets/{TabsBox-elxR9IVU.js → TabsBox-t8UA3Ghh.js} +1 -1
- package/storybook-static/assets/{TagInput-DJRFuFDX.js → TagInput-YHV8sAGl.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-Cf6c-1Xx.js → TagInput.stories-VKkEKC9A.js} +1 -1
- package/storybook-static/assets/{Text-CKeWyv1R.js → Text-BQ5vHbkZ.js} +1 -1
- package/storybook-static/assets/{Textarea-DamLyP7r.js → Textarea-BY_dHgap.js} +1 -1
- package/storybook-static/assets/{Textarea-DZ27cTTb.js → Textarea-ogSh20Tb.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-1wsB9B_l.js → Textarea.stories-BixCwInt.js} +1 -1
- package/storybook-static/assets/{TimePanel-BCiqgc3_.js → TimePanel-CgR59Au6.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CChD-RUz.js → TimePanel.stories-D3uV3m77.js} +1 -1
- package/storybook-static/assets/{Toggle-BAJj1RSd.js → Toggle-BbYcoBEJ.js} +1 -1
- package/storybook-static/assets/{Toggle-CUhT4loI.js → Toggle-Cit9qQ37.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-Dipcr_LJ.js → Toggle.stories-uPLdFwPH.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BXhuUX3J.js → TreeMultiSelect-CYvFBp49.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-D4Owgkp8.js → TreeMultiSelect-RMw3Sgov.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-CB2jm_bz.js → TreeMultiSelect.stories-eVCsLnck.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-eXU7yGrA.js → TreePickerBase-CU303uk2.js} +1 -1
- package/storybook-static/assets/{TreeSelect-5qlmmCCI.js → TreeSelect-CAWkriLu.js} +1 -1
- package/storybook-static/assets/{TreeSelect-0dZm6ufk.js → TreeSelect-MAH_yWl9.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-CllcJYnI.js → TreeSelect.stories-CIfGlEJN.js} +1 -1
- package/storybook-static/assets/{TreeTable-BqZk_QkK.js → TreeTable-0VRrM8GW.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-BDoNVZCh.js → TreeTable.stories-CNS5t3Hd.js} +1 -1
- package/storybook-static/assets/{async-CoT7Kgjz.js → async-D1pthPMH.js} +1 -1
- package/storybook-static/assets/{blocks-W-usNnZb.js → blocks-DGyM6J7r.js} +3 -3
- package/storybook-static/assets/{browserAndReact-CdN7k1Ys.js → browserAndReact-nVftiNpl.js} +1 -1
- package/storybook-static/assets/{check-DjVied9B.js → check-CiBhUcLr.js} +1 -1
- package/storybook-static/assets/{chevron-down-CjmFWC1H.js → chevron-down-B5rz2XNJ.js} +1 -1
- package/storybook-static/assets/{chevron-left-CgCtsWUK.js → chevron-left-CzhF1KUP.js} +1 -1
- package/storybook-static/assets/{chevron-right-DfAt2YE7.js → chevron-right-B0yOnjFl.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-CPNotdVj.js → chunk-W22LQPXL-8PHxgOk1.js} +1 -1
- package/storybook-static/assets/{circle-alert-DNyHEnP7.js → circle-alert-BoM4TTd8.js} +1 -1
- package/storybook-static/assets/{circle-check-BUp-oyqo.js → circle-check-Dehe_1cN.js} +1 -1
- package/storybook-static/assets/{components-CWI6MUvj.js → components-pGFA2Z8i.js} +3 -3
- package/storybook-static/assets/{contextMenu-B2RJaey1.js → contextMenu-CVWcJjzy.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-jxMgDhVa.js → defaultRenderers-DvwV_t0j.js} +1 -1
- package/storybook-static/assets/{download-C5zRdMry.js → download-OLJFBMAt.js} +1 -1
- package/storybook-static/assets/{filesAndExcel-CYKyG14W.js → filesAndExcel-BA3jxJBm.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-BGMb0aIS.js → floating-ui.react-CdJawQTm.js} +1 -1
- package/storybook-static/assets/{formatters-runtime-DnSgDhbz.js → formatters-runtime-C4C-phHX.js} +1 -1
- package/storybook-static/assets/{formatters-DeU7wI7T.js → formatters-wR_e2lQa.js} +1 -1
- package/storybook-static/assets/{foundationLib-DrimcZD1.js → foundationLib-Bz2ZS9e8.js} +1 -1
- package/storybook-static/assets/{hooks-BJmY6rG1.js → hooks-B3pvBii1.js} +1 -1
- package/storybook-static/assets/{iframe-BnW9ONAs.js → iframe-CE1ro1AE.js} +3 -3
- package/storybook-static/assets/iframe-D3TD9_FU.js +1 -0
- package/storybook-static/assets/{info-2igYCwst.js → info-D18FxvY-.js} +1 -1
- package/storybook-static/assets/{odata-DfSyh3Sn.js → odata-BBdp3RzK.js} +1 -1
- package/storybook-static/assets/{odataAndTables-BhJXkoYZ.js → odataAndTables-CcXirND0.js} +1 -1
- package/storybook-static/assets/{odataFetchFn-D2X1lPng.js → odataFetchFn-vrHbdkDn.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-DYRSp8rq.js → odataStoryFixtures-BPO4gqpN.js} +1 -1
- package/storybook-static/assets/{persisted-DHhF6isC.js → persisted-1Sxmb7Az.js} +1 -1
- package/storybook-static/assets/{pureUtilities-ChXuZIo7.js → pureUtilities-CvNXMzzV.js} +1 -1
- package/storybook-static/assets/{react-CLWTMVeL.js → react-B2hhruMd.js} +1 -1
- package/storybook-static/assets/{refresh-cw-B-NTAP58.js → refresh-cw-pmQ0tFtI.js} +1 -1
- package/storybook-static/assets/{runtimeAndState-H412awCm.js → runtimeAndState-DV7ilYb6.js} +1 -1
- package/storybook-static/assets/{settings-2-1qvlM5d_.js → settings-2-BEyMy2Fq.js} +1 -1
- package/storybook-static/assets/{sortable-BHG_CM3B.js → sortable-BNF14v_A.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-T5IQBZDB-R3_3CMVb.js → syntaxhighlighter-T5IQBZDB-CaaXbF-I.js} +1 -1
- package/storybook-static/assets/{trash-2-CE6CewYq.js → trash-2-CQnHnUJa.js} +1 -1
- package/storybook-static/assets/{triangle-alert-D3UYXaLs.js → triangle-alert-DSpoU8D0.js} +1 -1
- package/storybook-static/assets/useODataSelectBase-Czwwb448.js +1 -0
- package/storybook-static/assets/{useODataTreeData-kmN53sfw.js → useODataTreeData-CnsLoUDj.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-0QXDg2qR.js → usePickerQuery-DSDKSoxY.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-FtkRoBgz.js → usePickerTriggerController-CTVRGuZE.js} +1 -1
- package/storybook-static/assets/{x-BGnlLolo.js → x-DRm1wyYI.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/dist/chunks/select-DeeGYtVc.js +0 -328
- package/dist/chunks/select-DeeGYtVc.js.map +0 -1
- package/dist/chunks/useODataSelectBase-Bq36Wp1U.js.map +0 -1
- package/storybook-static/assets/ODataMultiSelect.stories-B6yPCpTe.js +0 -137
- package/storybook-static/assets/ODataSelect.stories-C0zyeXlC.js +0 -207
- package/storybook-static/assets/iframe-DGAjOA6_.js +0 -1
- package/storybook-static/assets/useODataSelectBase-FSv5umRf.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select-Bs1GU5MD.js","names":[],"sources":["../../src/multi-select/ui/MultiSelectOption.tsx","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/ui/MultiSelectToken.tsx","../../src/multi-select/ui/defaultRenderers.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelect.tsx","../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { SelectOptionContent } from \"../../select/SelectOptionContent\";\n\ninterface MultiSelectOptionProps {\n\titem: CollectionItem;\n\ttextKey: string;\n\tcodeKey?: string;\n\thighlight?: string;\n\tselected: boolean;\n}\n\n/**\n * Отдельная опция внутри `MultiSelect`. Отрисовывает состояние выбора и подсветку текста для найденных совпадений.\n */\nexport function MultiSelectOption({ item, textKey, codeKey, highlight }: MultiSelectOptionProps) {\n\treturn <SelectOptionContent label={item[textKey]} code={codeKey && item[codeKey]} highlight={highlight} />;\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.multiSelectTokens {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\n\tpointer-events: none;\n\toverflow: hidden;\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n}\n\n.multiSelectToken {\n\tfont-size: var(--font-size-sm);\n\t// font-weight: 300;\n\t// font-variation-settings: \"wght\" 300;\n\n\t// flex: 1 1 0%;\n\t// min-width: 0;\n\tmax-width: 100%;\n\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tword-break: normal;\n\ttext-overflow: ellipsis;\n\n\tpointer-events: none;\n}\n","import styles from \"./MultiSelect.module.scss\";\n\ninterface MultiSelectTokenProps {\n\tvalue: string | undefined;\n}\n\n/**\n * Токен выбранного значения в `MultiSelect`. Показывает выбранный элемент и кнопку его удаления из текущего набора.\n */\nexport function MultiSelectToken({ value }: MultiSelectTokenProps) {\n\tif (!value) return null;\n\n\treturn (\n\t\t<div className={styles.multiSelectTokens}>\n\t\t\t<div className={styles.multiSelectToken}>{value}</div>\n\t\t</div>\n\t);\n}\n","import { formatRussianPlural, type RussianPluralForms } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { PickerSelectionToolbar } from \"../../picker\";\n\nimport { type MultiSelectItemState, type MultiSelectRenderContext } from \"./MultiSelect\";\nimport { MultiSelectOption } from \"./MultiSelectOption\";\nimport { MultiSelectToken } from \"./MultiSelectToken\";\n\ninterface MultiSelectRendererConfig {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n}\n\nconst ELEMENT_FORMS: RussianPluralForms = {\n\tone: \"элемент\",\n\tfew: \"элемента\",\n\tmany: \"элементов\"\n};\n\nexport function formatOptionCount(count: number) {\n\treturn formatRussianPlural(count, ELEMENT_FORMS);\n}\n\nexport function resolveMultiSelectTextKey(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (textKey) {\n\t\treturn textKey;\n\t}\n\n\tconst sampleItem = items[0];\n\n\tif (!sampleItem) {\n\t\treturn codeKey;\n\t}\n\n\treturn Object.keys(sampleItem).find((key) => key !== codeKey) ?? codeKey;\n}\n\nexport function getDefaultMultiSelectTokenValue(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (items.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (items.length > 1) {\n\t\treturn formatOptionCount(items.length);\n\t}\n\n\tconst resolvedTextKey = resolveMultiSelectTextKey(items, codeKey, textKey);\n\treturn items[0]?.[resolvedTextKey] ?? items[0]?.[codeKey];\n}\n\nexport function createDefaultMultiSelectTokenRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultToken(context: MultiSelectRenderContext) {\n\t\treturn <MultiSelectToken value={getDefaultMultiSelectTokenValue(context.selectedItems, config.codeKey, config.textKey)} />;\n\t};\n}\n\nexport function renderDefaultMultiSelectToolbar(context: MultiSelectRenderContext) {\n\treturn <PickerSelectionToolbar onSelectAll={context.selectAll} onDeselectAll={context.deselectAll} />;\n}\n\nexport function createDefaultMultiSelectItemRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultItem(item: CollectionItem, state: MultiSelectItemState) {\n\t\treturn (\n\t\t\t<MultiSelectOption\n\t\t\t\titem={item}\n\t\t\t\tselected={state.selected}\n\t\t\t\thighlight={state.highlightQuery}\n\t\t\t\ttextKey={resolveMultiSelectTextKey([item], config.codeKey, config.textKey)}\n\t\t\t\tcodeKey={config.hideCode ? undefined : config.codeKey}\n\t\t\t/>\n\t\t);\n\t};\n}\n","import { Text } from \"../../text\";\nimport uiStyles from \"../../ui.module.scss\";\n\ninterface MultiSelectOptionSkeletonProps {\n\ttext: string;\n\tisError?: boolean;\n}\n\n/**\n * Скелетон строки опции для `MultiSelect`. Используется во время загрузки или при отображении ошибок получения списка.\n */\nexport function MultiSelectOptionSkeleton({ text, isError }: MultiSelectOptionSkeletonProps) {\n\treturn (\n\t\t<div className={uiStyles.uiPopupOption}>\n\t\t\t<span className={uiStyles.uiPopupOptionIcon}></span>\n\t\t\t<Text color={isError ? \"error\" : \"primary\"}>{text}</Text>\n\t\t</div>\n\t);\n}\n","import React, { forwardRef, type PropsWithChildren, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../../check-box\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { type UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\n\nimport {\n\tcreateDefaultMultiSelectItemRenderer,\n\tcreateDefaultMultiSelectTokenRenderer,\n\trenderDefaultMultiSelectToolbar,\n\tresolveMultiSelectTextKey\n} from \"./defaultRenderers\";\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ninterface MultiSelectOptionsProps extends PropsWithChildren {\n\tisNoData?: boolean;\n\t// isLoading?: boolean;\n\terror?: string;\n}\n\nfunction MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsProps) {\n\tif (isNoData) return <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\t// if (isLoading) return <PickerStatus loadingState={<MultiSelectOptionSkeleton text=\"Загрузка...\" />} />;\n\tif (error) return <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\n\treturn <>{children}</>;\n}\n\nexport interface MultiSelectItemState {\n\tselected: boolean;\n\tactive: boolean;\n\tdisabled: boolean;\n\tquery: string;\n\thighlightQuery: string;\n}\n\nexport interface MultiSelectRenderContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tavailableItems: CollectionItem[];\n\tquery: string;\n\topen: boolean;\n\tclearSelection: () => void;\n\tselectAll: () => void;\n\tdeselectAll: () => void;\n}\n\nexport interface MultiSelectOptionDisableContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tselectedKeys: ReadonlySet<string>;\n\topen: boolean;\n}\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => React.ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nexport interface MultiSelectProps<TOption extends Record<string, string> = CollectionItem>\n\textends MultiSelectRenderers, UiBaseProps<TOption[]> {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\thighlightQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\titems: TOption[];\n\tgetOptionDisabled?: (item: TOption, context: MultiSelectOptionDisableContext) => boolean;\n\tonOpen?: () => void;\n\tonClose?: (value: TOption[]) => void;\n\terror?: string;\n\tisLoading?: boolean;\n}\n\nconst fallback: CollectionItem[] = [];\n\nfunction getItemKey(item: CollectionItem, codeKey: string) {\n\treturn item[codeKey];\n}\n\nfunction getItemSearchParts(item: CollectionItem, codeKey: string, textKey: string) {\n\treturn Array.from(new Set([item[textKey], item[codeKey], ...Object.values(item)]));\n}\n\nfunction areSelectionsEqual(left: CollectionItem[], right: CollectionItem[], codeKey: string) {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map((item) => getItemKey(item, codeKey)));\n\n\treturn left.every((item) => rightKeys.has(getItemKey(item, codeKey)));\n}\n\ninterface MultiSelectOptionEntry {\n\titem: CollectionItem;\n\tindex: number;\n}\n\ninterface MultiSelectOptionGroupProps {\n\tentries: MultiSelectOptionEntry[];\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: Set<string>;\n\tcodeKey: string;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionDisabled?: (item: CollectionItem) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (item: CollectionItem) => void;\n\tselectOnlyOption: (item: CollectionItem) => void;\n\trenderItem: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nfunction MultiSelectOptionGroup({\n\tentries,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tcodeKey,\n\tquery,\n\thighlightQuery,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderItem\n}: MultiSelectOptionGroupProps) {\n\treturn entries.map(({ item, index }) => {\n\t\tconst active = index === activeIndex;\n\t\tconst selected = selectedKeys.has(getItemKey(item, codeKey));\n\t\tconst optionDisabled = getOptionDisabled?.(item) ?? false;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={`${getItemKey(item, codeKey)}-${index}`}\n\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\trole=\"option\"\n\t\t\t\taria-selected={selected}\n\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tuiStyles.uiSelectOption,\n\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\tactive && uiStyles.uiPopupOptionActive\n\t\t\t\t)}\n\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}>\n\t\t\t\t<div\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}}>\n\t\t\t\t\t<CheckBox\n\t\t\t\t\t\tvalue={selected}\n\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\t\ttoggleOption(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"overflowHidden\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\tselectOnlyOption(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}>\n\t\t\t\t\t{renderItem(item, { selected, active, disabled: optionDisabled, query, highlightQuery })}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t});\n}\n\n/**\n * Поле множественного выбора с внутренним черновиком значений и подтверждением выбора при закрытии списка.\n * Подходит как для самостоятельного использования, так и как базовый слой для OData-оберток.\n */\nexport const MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(\n\t(\n\t\t{\n\t\t\tcodeKey,\n\t\t\ttextKey,\n\t\t\thideCode,\n\t\t\titems,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tplaceholder,\n\t\t\tsize,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\thighlightQuery,\n\t\t\tonQuery,\n\t\t\tdefaultFilter = true,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tgetOptionDisabled,\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\tisLoading,\n\t\t\trenderToken,\n\t\t\trenderToolbar,\n\t\t\trenderItem\n\t\t},\n\t\tref\n\t) => {\n\t\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\t\tconst [open, setOpen] = useState(false);\n\t\tconst triggerMode = \"search-multi\";\n\t\tconst committedSelectedItems = value ?? fallback;\n\t\tconst committedSelectedKeys = useMemo(\n\t\t\t() => new Set(committedSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedItems]\n\t\t);\n\t\tconst availableItems = useMemo(\n\t\t\t() => items.filter((item) => !committedSelectedKeys.has(getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedKeys, items]\n\t\t);\n\t\tconst resolvedTextKey = useMemo(\n\t\t\t() => resolveMultiSelectTextKey([...committedSelectedItems, ...items], codeKey, textKey),\n\t\t\t[codeKey, committedSelectedItems, items, textKey]\n\t\t);\n\t\tconst {\n\t\t\tquery: currentQuery,\n\t\t\tsetQuery,\n\t\t\tresetQueryOnClose\n\t\t} = usePickerQuery({\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\tonQuery,\n\t\t\ttriggerMode\n\t\t});\n\t\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\t\tsetQuery(\"\");\n\t\t\t}\n\n\t\t\tsetOpen(nextOpen);\n\t\t};\n\t\tconst filteredCommittedSelectedItems = usePickerDefaultFilter({\n\t\t\toptions: committedSelectedItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst filteredAvailableItems = usePickerDefaultFilter({\n\t\t\toptions: availableItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst visibleOptions = useMemo(\n\t\t\t() => [...filteredCommittedSelectedItems, ...filteredAvailableItems],\n\t\t\t[filteredAvailableItems, filteredCommittedSelectedItems]\n\t\t);\n\t\tconst selectedIndex = filteredCommittedSelectedItems.length > 0 ? 0 : -1;\n\t\tconst {\n\t\t\tdraftValue: draftSelectedItems,\n\t\t\tsetDraftValue: setDraftSelectedItems,\n\t\t\tprepareOpen\n\t\t} = usePickerSelectionLifecycle({\n\t\t\tvalue: committedSelectedItems,\n\t\t\topen,\n\t\t\tonCommit: onChange,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tisEqual: (left, right) => areSelectionsEqual(left, right, codeKey)\n\t\t});\n\t\tconst selectedKeys = useMemo(\n\t\t\t() => new Set(draftSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, draftSelectedItems]\n\t\t);\n\t\tconst optionDisableContext = useMemo<MultiSelectOptionDisableContext>(\n\t\t\t() => ({\n\t\t\t\tselectedItems: draftSelectedItems,\n\t\t\t\tcommittedSelectedItems,\n\t\t\t\tselectedKeys,\n\t\t\t\topen\n\t\t\t}),\n\t\t\t[committedSelectedItems, draftSelectedItems, open, selectedKeys]\n\t\t);\n\t\tconst isOptionDisabled = useCallback(\n\t\t\t(item: CollectionItem) => getOptionDisabled?.(item, optionDisableContext) ?? false,\n\t\t\t[getOptionDisabled, optionDisableContext]\n\t\t);\n\t\tconst {\n\t\t\tactiveIndex,\n\t\t\tcontext,\n\t\t\tfloatingStyles,\n\t\t\tgetFloatingProps,\n\t\t\tsetReference,\n\t\t\tsetFloating,\n\t\t\tsetOptionRef,\n\t\t\tclose,\n\t\t\topenList,\n\t\t\ttoggleOpen,\n\t\t\tselectActiveOption,\n\t\t\thandleReferenceKeyDown,\n\t\t\thandleFloatingKeyDown,\n\t\t\tgetOptionId,\n\t\t\tgetActiveOptionId\n\t\t} = usePickerFloatingListbox({\n\t\t\toptions: visibleOptions,\n\t\t\tselectedIndex,\n\t\t\topen,\n\t\t\tonOpenChange: handleOpenChange,\n\t\t\tonSelect: undefined,\n\t\t\tdisabled,\n\t\t\tgetOptionDisabled: isOptionDisabled,\n\t\t\tcloseOnSelect: false,\n\t\t\tallowOpenWithoutOptions: true,\n\t\t\ttriggerMode\n\t\t});\n\n\t\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\t\tconst toggleDraftSelection = (item: CollectionItem) => {\n\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst isSelected = currentItems.some((selectedItem) => getItemKey(selectedItem, codeKey) === itemKey);\n\n\t\t\t\tif (isSelected) {\n\t\t\t\t\treturn currentItems.filter((selectedItem) => getItemKey(selectedItem, codeKey) !== itemKey);\n\t\t\t\t}\n\n\t\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\t\treturn currentItems;\n\t\t\t\t}\n\n\t\t\t\treturn [...currentItems, item];\n\t\t\t});\n\t\t};\n\n\t\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ref) {\n\t\t\t\tref.current = node;\n\t\t\t}\n\t\t};\n\n\t\tconst clearSelection = () => {\n\t\t\tsetDraftSelectedItems([]);\n\n\t\t\tif (!open) {\n\t\t\t\tonChange([]);\n\t\t\t}\n\t\t};\n\n\t\tconst selectAll = () => {\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst nextItems = [...currentItems];\n\t\t\t\tconst selectedKeys = new Set(currentItems.map((item) => getItemKey(item, codeKey)));\n\n\t\t\t\tfor (const item of visibleOptions) {\n\t\t\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\t\t\tif (!selectedKeys.has(itemKey) && !isOptionDisabled(item)) {\n\t\t\t\t\t\tselectedKeys.add(itemKey);\n\t\t\t\t\t\tnextItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nextItems;\n\t\t\t});\n\t\t};\n\n\t\tconst deselectAll = () => {\n\t\t\tsetDraftSelectedItems([]);\n\t\t};\n\n\t\tconst selectOnlyOption = (item: CollectionItem) => {\n\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetDraftSelectedItems([item]);\n\t\t\tclose();\n\t\t};\n\n\t\tconst currentSelectedItems = open ? draftSelectedItems : committedSelectedItems;\n\t\tconst hasSelectedItems = currentSelectedItems.length > 0;\n\t\tconst renderContext: MultiSelectRenderContext = {\n\t\t\tselectedItems: currentSelectedItems,\n\t\t\tcommittedSelectedItems,\n\t\t\tavailableItems: filteredAvailableItems,\n\t\t\tquery: currentQuery,\n\t\t\topen,\n\t\t\tclearSelection,\n\t\t\tselectAll,\n\t\t\tdeselectAll\n\t\t};\n\t\tconst tokenRenderer =\n\t\t\trenderToken === undefined ? createDefaultMultiSelectTokenRenderer({ codeKey, textKey: resolvedTextKey }) : renderToken;\n\t\tconst toolbarRenderer = renderToolbar === undefined ? renderDefaultMultiSelectToolbar : renderToolbar;\n\t\tconst itemRenderer =\n\t\t\trenderItem ??\n\t\t\tcreateDefaultMultiSelectItemRenderer({\n\t\t\t\tcodeKey,\n\t\t\t\ttextKey: resolvedTextKey,\n\t\t\t\thideCode\n\t\t\t});\n\t\tconst tokenNode = typeof tokenRenderer === \"function\" ? tokenRenderer(renderContext) : null;\n\t\tconst toolbarNode = typeof toolbarRenderer === \"function\" ? toolbarRenderer(renderContext) : null;\n\t\t// const hasToken = tokenNode !== null && tokenNode !== undefined;\n\t\tconst selectedEntries = filteredCommittedSelectedItems.map((item, index) => ({ item, index }));\n\t\tconst itemEntries = filteredAvailableItems.map((item, index) => ({ item, index: index + selectedEntries.length }));\n\t\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\t\tconst triggerController = usePickerTriggerController({\n\t\t\tmode: triggerMode,\n\t\t\topen,\n\t\t\tcurrentQuery,\n\t\t\thasDisplayValue: false,\n\t\t\tinputRef,\n\t\t\tsetQuery,\n\t\t\topenList,\n\t\t\tclose,\n\t\t\ttoggleOpen,\n\t\t\tonBeforeOpen: () => {\n\t\t\t\tif (!open) {\n\t\t\t\t\tprepareOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn (\n\t\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\t\thasSelectedItems ? undefined : `${placeholder ?? label ?? \"Выберите значения\"} <${items.length}>`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={!hasSelectedItems}\n\t\t\t\t\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"multi-select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-multi-select\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={clearSelection}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить все\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\toverlay={tokenNode}\n\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tconst activeItem = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\t\t\tif (activeItem) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeItem);\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tselectActiveOption();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tclassName={uiStyles.uiPopupOptions}\n\t\t\t\t\t\t\t\theader={toolbarNode}>\n\t\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t\t<div className=\"scrollable h100\">\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableItems.length > 0 && <Separator className=\"marginBlockSm\" />}\n\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={itemEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t</PickerField>\n\t\t);\n\t}\n);\n\nMultiSelect.displayName = \"MultiSelect\";\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import React from \"react\";\n\nimport { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { MultiSelect } from \"./MultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport const ODataMultiSelect: React.FC<ODataMultiSelectProps> = ({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}) => {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tisLoading={odataModel.isLoading}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n};\n","import { useCallback, useState } from \"react\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentItem } from \"@ryuzaki13/react-foundation-api/odata\";\n\ninterface ODataDependentSegmentMultiSelectProps {\n\titem: ODataDependentSegmentItem;\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentSegmentMultiSelect: React.FC<ODataDependentSegmentMultiSelectProps> = ({\n\titem,\n\tvalues,\n\tonChange,\n\twidth = 15\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tconst nextSelectedValues = {\n\t\t\t\t...selectedValues,\n\t\t\t\t[item.id]: keys\n\t\t\t};\n\n\t\t\tif (!values) {\n\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t}\n\n\t\t\tonChange?.(nextSelectedValues);\n\t\t},\n\t\t[item.id, onChange, selectedValues, values]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selectedValues}\n\t\t\t\tvalue={selectedValues[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useState } from \"react\";\n\nimport { flattenODataDependentServices, ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\ninterface ODataDependentMultiSelectProps extends ODataDependentBaseProps {\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentMultiSelect: React.FC<ODataDependentMultiSelectProps> = ({\n\twidth = 15,\n\todata,\n\tsegments,\n\tmodel,\n\tvalues,\n\tonChange\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selectedValues}\n\t\t\tonChange={(nextSelectedValues) => {\n\t\t\t\tif (!values) {\n\t\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t\t}\n\n\t\t\t\tonChange?.(nextSelectedValues);\n\t\t\t}}\n\t\t\twidth={width}\n\t\t/>\n\t));\n};\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-select-D5b3Gxsv.js","names":[],"sources":["../../src/multi-select/ui/MultiSelectOption.tsx","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/ui/MultiSelectToken.tsx","../../src/multi-select/ui/defaultRenderers.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelect.tsx","../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { SelectOptionContent } from \"../../select/SelectOptionContent\";\n\ninterface MultiSelectOptionProps {\n\titem: CollectionItem;\n\ttextKey: string;\n\tcodeKey?: string;\n\thighlight?: string;\n\tselected: boolean;\n}\n\n/**\n * Отдельная опция внутри `MultiSelect`. Отрисовывает состояние выбора и подсветку текста для найденных совпадений.\n */\nexport function MultiSelectOption({ item, textKey, codeKey, highlight }: MultiSelectOptionProps) {\n\treturn <SelectOptionContent label={item[textKey]} code={codeKey && item[codeKey]} highlight={highlight} />;\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.multiSelectTokens {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\n\tpointer-events: none;\n\toverflow: hidden;\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n}\n\n.multiSelectToken {\n\tfont-size: var(--font-size-sm);\n\t// font-weight: 300;\n\t// font-variation-settings: \"wght\" 300;\n\n\t// flex: 1 1 0%;\n\t// min-width: 0;\n\tmax-width: 100%;\n\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tword-break: normal;\n\ttext-overflow: ellipsis;\n\n\tpointer-events: none;\n}\n","import styles from \"./MultiSelect.module.scss\";\n\ninterface MultiSelectTokenProps {\n\tvalue: string | undefined;\n}\n\n/**\n * Токен выбранного значения в `MultiSelect`. Показывает выбранный элемент и кнопку его удаления из текущего набора.\n */\nexport function MultiSelectToken({ value }: MultiSelectTokenProps) {\n\tif (!value) return null;\n\n\treturn (\n\t\t<div className={styles.multiSelectTokens}>\n\t\t\t<div className={styles.multiSelectToken}>{value}</div>\n\t\t</div>\n\t);\n}\n","import { formatRussianPlural, type RussianPluralForms } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { PickerSelectionToolbar } from \"../../picker\";\n\nimport { type MultiSelectItemState, type MultiSelectRenderContext } from \"./MultiSelect\";\nimport { MultiSelectOption } from \"./MultiSelectOption\";\nimport { MultiSelectToken } from \"./MultiSelectToken\";\n\ninterface MultiSelectRendererConfig {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n}\n\nconst ELEMENT_FORMS: RussianPluralForms = {\n\tone: \"элемент\",\n\tfew: \"элемента\",\n\tmany: \"элементов\"\n};\n\nexport function formatOptionCount(count: number) {\n\treturn formatRussianPlural(count, ELEMENT_FORMS);\n}\n\nexport function resolveMultiSelectTextKey(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (textKey) {\n\t\treturn textKey;\n\t}\n\n\tconst sampleItem = items[0];\n\n\tif (!sampleItem) {\n\t\treturn codeKey;\n\t}\n\n\treturn Object.keys(sampleItem).find((key) => key !== codeKey) ?? codeKey;\n}\n\nexport function getDefaultMultiSelectTokenValue(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (items.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (items.length > 1) {\n\t\treturn formatOptionCount(items.length);\n\t}\n\n\tconst resolvedTextKey = resolveMultiSelectTextKey(items, codeKey, textKey);\n\treturn items[0]?.[resolvedTextKey] ?? items[0]?.[codeKey];\n}\n\nexport function createDefaultMultiSelectTokenRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultToken(context: MultiSelectRenderContext) {\n\t\treturn <MultiSelectToken value={getDefaultMultiSelectTokenValue(context.selectedItems, config.codeKey, config.textKey)} />;\n\t};\n}\n\nexport function renderDefaultMultiSelectToolbar(context: MultiSelectRenderContext) {\n\treturn <PickerSelectionToolbar onSelectAll={context.selectAll} onDeselectAll={context.deselectAll} />;\n}\n\nexport function createDefaultMultiSelectItemRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultItem(item: CollectionItem, state: MultiSelectItemState) {\n\t\treturn (\n\t\t\t<MultiSelectOption\n\t\t\t\titem={item}\n\t\t\t\tselected={state.selected}\n\t\t\t\thighlight={state.highlightQuery}\n\t\t\t\ttextKey={resolveMultiSelectTextKey([item], config.codeKey, config.textKey)}\n\t\t\t\tcodeKey={config.hideCode ? undefined : config.codeKey}\n\t\t\t/>\n\t\t);\n\t};\n}\n","import { Text } from \"../../text\";\nimport uiStyles from \"../../ui.module.scss\";\n\ninterface MultiSelectOptionSkeletonProps {\n\ttext: string;\n\tisError?: boolean;\n}\n\n/**\n * Скелетон строки опции для `MultiSelect`. Используется во время загрузки или при отображении ошибок получения списка.\n */\nexport function MultiSelectOptionSkeleton({ text, isError }: MultiSelectOptionSkeletonProps) {\n\treturn (\n\t\t<div className={uiStyles.uiPopupOption}>\n\t\t\t<span className={uiStyles.uiPopupOptionIcon}></span>\n\t\t\t<Text color={isError ? \"error\" : \"primary\"}>{text}</Text>\n\t\t</div>\n\t);\n}\n","import React, { forwardRef, type PropsWithChildren, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../../check-box\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { type UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\n\nimport {\n\tcreateDefaultMultiSelectItemRenderer,\n\tcreateDefaultMultiSelectTokenRenderer,\n\trenderDefaultMultiSelectToolbar,\n\tresolveMultiSelectTextKey\n} from \"./defaultRenderers\";\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ninterface MultiSelectOptionsProps extends PropsWithChildren {\n\tisNoData?: boolean;\n\t// isLoading?: boolean;\n\terror?: string;\n}\n\nfunction MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsProps) {\n\tif (isNoData) return <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\t// if (isLoading) return <PickerStatus loadingState={<MultiSelectOptionSkeleton text=\"Загрузка...\" />} />;\n\tif (error) return <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\n\treturn <>{children}</>;\n}\n\nexport interface MultiSelectItemState {\n\tselected: boolean;\n\tactive: boolean;\n\tdisabled: boolean;\n\tquery: string;\n\thighlightQuery: string;\n}\n\nexport interface MultiSelectRenderContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tavailableItems: CollectionItem[];\n\tquery: string;\n\topen: boolean;\n\tclearSelection: () => void;\n\tselectAll: () => void;\n\tdeselectAll: () => void;\n}\n\nexport interface MultiSelectOptionDisableContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tselectedKeys: ReadonlySet<string>;\n\topen: boolean;\n}\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => React.ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nexport interface MultiSelectProps<TOption extends Record<string, string> = CollectionItem>\n\textends MultiSelectRenderers, UiBaseProps<TOption[]> {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\thighlightQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\titems: TOption[];\n\tgetOptionDisabled?: (item: TOption, context: MultiSelectOptionDisableContext) => boolean;\n\tonOpen?: () => void;\n\tonClose?: (value: TOption[]) => void;\n\terror?: string;\n\tisLoading?: boolean;\n}\n\nconst fallback: CollectionItem[] = [];\n\nfunction getItemKey(item: CollectionItem, codeKey: string) {\n\treturn item[codeKey];\n}\n\nfunction getItemSearchParts(item: CollectionItem, codeKey: string, textKey: string) {\n\treturn Array.from(new Set([item[textKey], item[codeKey], ...Object.values(item)]));\n}\n\nfunction areSelectionsEqual(left: CollectionItem[], right: CollectionItem[], codeKey: string) {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map((item) => getItemKey(item, codeKey)));\n\n\treturn left.every((item) => rightKeys.has(getItemKey(item, codeKey)));\n}\n\ninterface MultiSelectOptionEntry {\n\titem: CollectionItem;\n\tindex: number;\n}\n\ninterface MultiSelectOptionGroupProps {\n\tentries: MultiSelectOptionEntry[];\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: Set<string>;\n\tcodeKey: string;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionDisabled?: (item: CollectionItem) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (item: CollectionItem) => void;\n\tselectOnlyOption: (item: CollectionItem) => void;\n\trenderItem: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nfunction MultiSelectOptionGroup({\n\tentries,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tcodeKey,\n\tquery,\n\thighlightQuery,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderItem\n}: MultiSelectOptionGroupProps) {\n\treturn entries.map(({ item, index }) => {\n\t\tconst active = index === activeIndex;\n\t\tconst selected = selectedKeys.has(getItemKey(item, codeKey));\n\t\tconst optionDisabled = getOptionDisabled?.(item) ?? false;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={`${getItemKey(item, codeKey)}-${index}`}\n\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\trole=\"option\"\n\t\t\t\taria-selected={selected}\n\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tuiStyles.uiSelectOption,\n\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\tactive && uiStyles.uiPopupOptionActive\n\t\t\t\t)}\n\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}>\n\t\t\t\t<div\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}}>\n\t\t\t\t\t<CheckBox\n\t\t\t\t\t\tvalue={selected}\n\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\t\ttoggleOption(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"overflowHidden\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\tselectOnlyOption(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}>\n\t\t\t\t\t{renderItem(item, { selected, active, disabled: optionDisabled, query, highlightQuery })}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t});\n}\n\n/**\n * Поле множественного выбора с внутренним черновиком значений и подтверждением выбора при закрытии списка.\n * Подходит как для самостоятельного использования, так и как базовый слой для OData-оберток.\n */\nexport const MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(\n\t(\n\t\t{\n\t\t\tcodeKey,\n\t\t\ttextKey,\n\t\t\thideCode,\n\t\t\titems,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tplaceholder,\n\t\t\tsize,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\thighlightQuery,\n\t\t\tonQuery,\n\t\t\tdefaultFilter = true,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tgetOptionDisabled,\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\tisLoading,\n\t\t\trenderToken,\n\t\t\trenderToolbar,\n\t\t\trenderItem\n\t\t},\n\t\tref\n\t) => {\n\t\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\t\tconst [open, setOpen] = useState(false);\n\t\tconst triggerMode = \"search-multi\";\n\t\tconst committedSelectedItems = value ?? fallback;\n\t\tconst committedSelectedKeys = useMemo(\n\t\t\t() => new Set(committedSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedItems]\n\t\t);\n\t\tconst availableItems = useMemo(\n\t\t\t() => items.filter((item) => !committedSelectedKeys.has(getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedKeys, items]\n\t\t);\n\t\tconst resolvedTextKey = useMemo(\n\t\t\t() => resolveMultiSelectTextKey([...committedSelectedItems, ...items], codeKey, textKey),\n\t\t\t[codeKey, committedSelectedItems, items, textKey]\n\t\t);\n\t\tconst {\n\t\t\tquery: currentQuery,\n\t\t\tsetQuery,\n\t\t\tresetQueryOnClose\n\t\t} = usePickerQuery({\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\tonQuery,\n\t\t\ttriggerMode\n\t\t});\n\t\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\t\tsetQuery(\"\");\n\t\t\t}\n\n\t\t\tsetOpen(nextOpen);\n\t\t};\n\t\tconst filteredCommittedSelectedItems = usePickerDefaultFilter({\n\t\t\toptions: committedSelectedItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst filteredAvailableItems = usePickerDefaultFilter({\n\t\t\toptions: availableItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst visibleOptions = useMemo(\n\t\t\t() => [...filteredCommittedSelectedItems, ...filteredAvailableItems],\n\t\t\t[filteredAvailableItems, filteredCommittedSelectedItems]\n\t\t);\n\t\tconst selectedIndex = filteredCommittedSelectedItems.length > 0 ? 0 : -1;\n\t\tconst {\n\t\t\tdraftValue: draftSelectedItems,\n\t\t\tsetDraftValue: setDraftSelectedItems,\n\t\t\tprepareOpen\n\t\t} = usePickerSelectionLifecycle({\n\t\t\tvalue: committedSelectedItems,\n\t\t\topen,\n\t\t\tonCommit: onChange,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tisEqual: (left, right) => areSelectionsEqual(left, right, codeKey)\n\t\t});\n\t\tconst selectedKeys = useMemo(\n\t\t\t() => new Set(draftSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, draftSelectedItems]\n\t\t);\n\t\tconst optionDisableContext = useMemo<MultiSelectOptionDisableContext>(\n\t\t\t() => ({\n\t\t\t\tselectedItems: draftSelectedItems,\n\t\t\t\tcommittedSelectedItems,\n\t\t\t\tselectedKeys,\n\t\t\t\topen\n\t\t\t}),\n\t\t\t[committedSelectedItems, draftSelectedItems, open, selectedKeys]\n\t\t);\n\t\tconst isOptionDisabled = useCallback(\n\t\t\t(item: CollectionItem) => getOptionDisabled?.(item, optionDisableContext) ?? false,\n\t\t\t[getOptionDisabled, optionDisableContext]\n\t\t);\n\t\tconst {\n\t\t\tactiveIndex,\n\t\t\tcontext,\n\t\t\tfloatingStyles,\n\t\t\tgetFloatingProps,\n\t\t\tsetReference,\n\t\t\tsetFloating,\n\t\t\tsetOptionRef,\n\t\t\tclose,\n\t\t\topenList,\n\t\t\ttoggleOpen,\n\t\t\tselectActiveOption,\n\t\t\thandleReferenceKeyDown,\n\t\t\thandleFloatingKeyDown,\n\t\t\tgetOptionId,\n\t\t\tgetActiveOptionId\n\t\t} = usePickerFloatingListbox({\n\t\t\toptions: visibleOptions,\n\t\t\tselectedIndex,\n\t\t\topen,\n\t\t\tonOpenChange: handleOpenChange,\n\t\t\tonSelect: undefined,\n\t\t\tdisabled,\n\t\t\tgetOptionDisabled: isOptionDisabled,\n\t\t\tcloseOnSelect: false,\n\t\t\tallowOpenWithoutOptions: true,\n\t\t\ttriggerMode\n\t\t});\n\n\t\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\t\tconst toggleDraftSelection = (item: CollectionItem) => {\n\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst isSelected = currentItems.some((selectedItem) => getItemKey(selectedItem, codeKey) === itemKey);\n\n\t\t\t\tif (isSelected) {\n\t\t\t\t\treturn currentItems.filter((selectedItem) => getItemKey(selectedItem, codeKey) !== itemKey);\n\t\t\t\t}\n\n\t\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\t\treturn currentItems;\n\t\t\t\t}\n\n\t\t\t\treturn [...currentItems, item];\n\t\t\t});\n\t\t};\n\n\t\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ref) {\n\t\t\t\tref.current = node;\n\t\t\t}\n\t\t};\n\n\t\tconst clearSelection = () => {\n\t\t\tsetDraftSelectedItems([]);\n\n\t\t\tif (!open) {\n\t\t\t\tonChange([]);\n\t\t\t}\n\t\t};\n\n\t\tconst selectAll = () => {\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst nextItems = [...currentItems];\n\t\t\t\tconst selectedKeys = new Set(currentItems.map((item) => getItemKey(item, codeKey)));\n\n\t\t\t\tfor (const item of visibleOptions) {\n\t\t\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\t\t\tif (!selectedKeys.has(itemKey) && !isOptionDisabled(item)) {\n\t\t\t\t\t\tselectedKeys.add(itemKey);\n\t\t\t\t\t\tnextItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nextItems;\n\t\t\t});\n\t\t};\n\n\t\tconst deselectAll = () => {\n\t\t\tsetDraftSelectedItems([]);\n\t\t};\n\n\t\tconst selectOnlyOption = (item: CollectionItem) => {\n\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetDraftSelectedItems([item]);\n\t\t\tclose();\n\t\t};\n\n\t\tconst currentSelectedItems = open ? draftSelectedItems : committedSelectedItems;\n\t\tconst hasSelectedItems = currentSelectedItems.length > 0;\n\t\tconst renderContext: MultiSelectRenderContext = {\n\t\t\tselectedItems: currentSelectedItems,\n\t\t\tcommittedSelectedItems,\n\t\t\tavailableItems: filteredAvailableItems,\n\t\t\tquery: currentQuery,\n\t\t\topen,\n\t\t\tclearSelection,\n\t\t\tselectAll,\n\t\t\tdeselectAll\n\t\t};\n\t\tconst tokenRenderer =\n\t\t\trenderToken === undefined ? createDefaultMultiSelectTokenRenderer({ codeKey, textKey: resolvedTextKey }) : renderToken;\n\t\tconst toolbarRenderer = renderToolbar === undefined ? renderDefaultMultiSelectToolbar : renderToolbar;\n\t\tconst itemRenderer =\n\t\t\trenderItem ??\n\t\t\tcreateDefaultMultiSelectItemRenderer({\n\t\t\t\tcodeKey,\n\t\t\t\ttextKey: resolvedTextKey,\n\t\t\t\thideCode\n\t\t\t});\n\t\tconst tokenNode = typeof tokenRenderer === \"function\" ? tokenRenderer(renderContext) : null;\n\t\tconst toolbarNode = typeof toolbarRenderer === \"function\" ? toolbarRenderer(renderContext) : null;\n\t\t// const hasToken = tokenNode !== null && tokenNode !== undefined;\n\t\tconst selectedEntries = filteredCommittedSelectedItems.map((item, index) => ({ item, index }));\n\t\tconst itemEntries = filteredAvailableItems.map((item, index) => ({ item, index: index + selectedEntries.length }));\n\t\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\t\tconst triggerController = usePickerTriggerController({\n\t\t\tmode: triggerMode,\n\t\t\topen,\n\t\t\tcurrentQuery,\n\t\t\thasDisplayValue: false,\n\t\t\tinputRef,\n\t\t\tsetQuery,\n\t\t\topenList,\n\t\t\tclose,\n\t\t\ttoggleOpen,\n\t\t\tonBeforeOpen: () => {\n\t\t\t\tif (!open) {\n\t\t\t\t\tprepareOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn (\n\t\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\t\thasSelectedItems ? undefined : `${placeholder ?? label ?? \"Выберите значения\"} <${items.length}>`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={!hasSelectedItems}\n\t\t\t\t\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"multi-select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-multi-select\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={clearSelection}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить все\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\toverlay={tokenNode}\n\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tconst activeItem = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\t\t\tif (activeItem) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeItem);\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tselectActiveOption();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tclassName={uiStyles.uiPopupOptions}\n\t\t\t\t\t\t\t\theader={toolbarNode}>\n\t\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t\t<div className=\"scrollable h100\">\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableItems.length > 0 && <Separator className=\"marginBlockSm\" />}\n\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={itemEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t</PickerField>\n\t\t);\n\t}\n);\n\nMultiSelect.displayName = \"MultiSelect\";\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import React from \"react\";\n\nimport { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { MultiSelect } from \"./MultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport const ODataMultiSelect: React.FC<ODataMultiSelectProps> = ({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}) => {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tisLoading={odataModel.isLoading}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n};\n","import { useCallback } from \"react\";\n\nimport { useODataDependentSelection } from \"../../odata-dependent\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentControlProps } from \"../../odata-dependent\";\n\nexport type ODataDependentSegmentMultiSelectProps = ODataDependentSegmentControlProps;\n\nexport function ODataDependentSegmentMultiSelect(props: ODataDependentSegmentMultiSelectProps) {\n\tconst { item, disabled, label, description, size, width = 15 } = props;\n\tconst selection = useODataDependentSelection(props);\n\tconst { updateSegment } = selection;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tupdateSegment(item.id, keys);\n\t\t},\n\t\t[item.id, updateSegment]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selection.values}\n\t\t\t\tvalue={selection.values[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t\tdisabled={disabled || selection.isSegmentDisabled(item.id)}\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tsize={size}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { flattenODataDependentServices, type ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { useODataDependentSelection } from \"../../odata-dependent\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\nimport type { UseODataDependentSelectionOptions } from \"../../odata-dependent\";\n\nexport type ODataDependentMultiSelectProps = Omit<ODataDependentBaseProps, \"dependencies\" | \"value\"> &\n\tUseODataDependentSelectionOptions & {\n\t\t/**\n\t\t * Ширина одного элемента в `em` единицах.\n\t\t *\n\t\t * @default 15\n\t\t */\n\t\twidth?: number;\n\t};\n\nexport function ODataDependentMultiSelect(props: ODataDependentMultiSelectProps) {\n\tconst { width = 15, odata, segments, model, values, defaultValues, onChange, selectionMode, segmentOrder } = props;\n\tconst selection = useODataDependentSelection({ values, defaultValues, onChange });\n\tconst segmentSelectionProps =\n\t\tselectionMode === \"sequential\" ? { selectionMode: \"sequential\" as const, segmentOrder } : { selectionMode, segmentOrder };\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selection.values}\n\t\t\tonChange={selection.updateValues}\n\t\t\t{...segmentSelectionProps}\n\t\t\twidth={width}\n\t\t/>\n\t));\n}\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useCallback as e, useState as t } from "react";
|
|
2
|
+
//#region src/odata-dependent/model/useODataDependentSelection.ts
|
|
3
|
+
function n(e, t) {
|
|
4
|
+
return t.indexOf(e);
|
|
5
|
+
}
|
|
6
|
+
function r({ values: r, defaultValues: i, onChange: a, selectionMode: o = "independent", segmentOrder: s = [] }) {
|
|
7
|
+
let [c, l] = t(() => i ?? {}), u = r ?? c, d = e((e) => {
|
|
8
|
+
r === void 0 && l(e), a?.(e);
|
|
9
|
+
}, [a, r]), f = e((e) => {
|
|
10
|
+
if (o === "independent") return !1;
|
|
11
|
+
let t = n(e, s);
|
|
12
|
+
return t < 0 || s.slice(0, t).some((e) => !u[e]?.length);
|
|
13
|
+
}, [
|
|
14
|
+
u,
|
|
15
|
+
s,
|
|
16
|
+
o
|
|
17
|
+
]);
|
|
18
|
+
return {
|
|
19
|
+
values: u,
|
|
20
|
+
updateValues: d,
|
|
21
|
+
updateSegment: e((e, t) => {
|
|
22
|
+
if (f(e)) return;
|
|
23
|
+
let r = {
|
|
24
|
+
...u,
|
|
25
|
+
[e]: [...t]
|
|
26
|
+
};
|
|
27
|
+
if (o === "sequential") {
|
|
28
|
+
let t = n(e, s);
|
|
29
|
+
for (let e of s.slice(t + 1)) e in r && (r[e] = []);
|
|
30
|
+
}
|
|
31
|
+
d(r);
|
|
32
|
+
}, [
|
|
33
|
+
f,
|
|
34
|
+
u,
|
|
35
|
+
s,
|
|
36
|
+
o,
|
|
37
|
+
d
|
|
38
|
+
]),
|
|
39
|
+
isSegmentDisabled: f
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { r as t };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=odata-dependent-C_DCbKY2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odata-dependent-C_DCbKY2.js","names":[],"sources":["../../src/odata-dependent/model/useODataDependentSelection.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\n\n/**\n * Единый массивный формат значений зависимых OData-сегментов.\n *\n * Даже single-select хранит значение как массив из нуля или одного элемента:\n * это позволяет без преобразований передавать весь снимок в `dependencies`\n * OData-контролов и использовать один state-контракт для разных видов выбора.\n */\nexport type ODataDependentSelectionValues = Record<string, string[]>;\n\nexport type ODataDependentSelectionMode = \"independent\" | \"sequential\";\n\ntype ODataDependentSelectionCommonOptions = {\n\t/** Внешний снимок значений. При наличии включает controlled-режим. */\n\tvalues?: ODataDependentSelectionValues;\n\t/** Начальный снимок для uncontrolled-режима. */\n\tdefaultValues?: ODataDependentSelectionValues;\n\t/** Получает полный снимок после каждого изменения сегмента. */\n\tonChange?: (values: ODataDependentSelectionValues) => void;\n};\n\ntype IndependentSelectionOptions = {\n\t/** Каждый сегмент доступен независимо от заполненности предыдущих. */\n\tselectionMode?: \"independent\";\n\t/** Порядок может передаваться общей композицией, но в этом режиме не ограничивает выбор. */\n\tsegmentOrder?: readonly string[];\n};\n\ntype SequentialSelectionOptions = {\n\t/** Сегмент доступен только после заполнения всех предыдущих уровней цепочки. */\n\tselectionMode: \"sequential\";\n\t/** Явный metadata- или consumer-порядок сегментов одной цепочки. */\n\tsegmentOrder: readonly string[];\n};\n\nexport type UseODataDependentSelectionOptions = ODataDependentSelectionCommonOptions &\n\t(IndependentSelectionOptions | SequentialSelectionOptions);\n\nexport type ODataDependentSelectionModel = {\n\t/** Текущий общий снимок, который следует передавать каждому OData-контролу как `dependencies`. */\n\tvalues: ODataDependentSelectionValues;\n\t/** Публикует готовый общий снимок, сохраняя controlled/uncontrolled семантику hook. */\n\tupdateValues: (values: ODataDependentSelectionValues) => void;\n\t/** Обновляет один сегмент и в sequential-режиме сбрасывает все последующие уровни. */\n\tupdateSegment: (segmentId: string, value: readonly string[]) => void;\n\t/** Проверяет доступность сегмента относительно полного предшествующего пути цепочки. */\n\tisSegmentDisabled: (segmentId: string) => boolean;\n};\n\nfunction getSegmentIndex(segmentId: string, segmentOrder: readonly string[]) {\n\treturn segmentOrder.indexOf(segmentId);\n}\n\n/**\n * Управляет общим снимком зависимых OData-сегментов без привязки к Select или MultiSelect.\n *\n * В sequential-режиме `segmentOrder` является источником истины для блокировки и\n * каскадного сброса. Если id отсутствует в порядке, сегмент блокируется: это\n * fail-closed поведение не позволяет незаметно обойти неправильно заданную цепочку.\n */\nexport function useODataDependentSelection({\n\tvalues,\n\tdefaultValues,\n\tonChange,\n\tselectionMode = \"independent\",\n\tsegmentOrder = []\n}: UseODataDependentSelectionOptions): ODataDependentSelectionModel {\n\tconst [uncontrolledValues, setUncontrolledValues] = useState<ODataDependentSelectionValues>(() => defaultValues ?? {});\n\tconst resolvedValues = values ?? uncontrolledValues;\n\n\tconst updateValues = useCallback(\n\t\t(nextValues: ODataDependentSelectionValues) => {\n\t\t\tif (values === undefined) {\n\t\t\t\tsetUncontrolledValues(nextValues);\n\t\t\t}\n\n\t\t\tonChange?.(nextValues);\n\t\t},\n\t\t[onChange, values]\n\t);\n\n\tconst isSegmentDisabled = useCallback(\n\t\t(segmentId: string) => {\n\t\t\tif (selectionMode === \"independent\") return false;\n\n\t\t\tconst segmentIndex = getSegmentIndex(segmentId, segmentOrder);\n\t\t\tif (segmentIndex < 0) return true;\n\n\t\t\treturn segmentOrder.slice(0, segmentIndex).some((previousSegmentId) => !resolvedValues[previousSegmentId]?.length);\n\t\t},\n\t\t[resolvedValues, segmentOrder, selectionMode]\n\t);\n\n\tconst updateSegment = useCallback(\n\t\t(segmentId: string, nextSegmentValue: readonly string[]) => {\n\t\t\tif (isSegmentDisabled(segmentId)) return;\n\n\t\t\tconst nextValues: ODataDependentSelectionValues = {\n\t\t\t\t...resolvedValues,\n\t\t\t\t[segmentId]: [...nextSegmentValue]\n\t\t\t};\n\n\t\t\tif (selectionMode === \"sequential\") {\n\t\t\t\tconst segmentIndex = getSegmentIndex(segmentId, segmentOrder);\n\n\t\t\t\t// Смена родителя делает прежний downstream-путь недостоверным.\n\t\t\t\tfor (const followingSegmentId of segmentOrder.slice(segmentIndex + 1)) {\n\t\t\t\t\tif (followingSegmentId in nextValues) {\n\t\t\t\t\t\tnextValues[followingSegmentId] = [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateValues(nextValues);\n\t\t},\n\t\t[isSegmentDisabled, resolvedValues, segmentOrder, selectionMode, updateValues]\n\t);\n\n\treturn {\n\t\tvalues: resolvedValues,\n\t\tupdateValues,\n\t\tupdateSegment,\n\t\tisSegmentDisabled\n\t};\n}\n"],"mappings":";;AAkDA,SAAS,EAAgB,GAAmB,GAAiC;CAC5E,OAAO,EAAa,QAAQ,CAAS;AACtC;AASA,SAAgB,EAA2B,EAC1C,WACA,kBACA,aACA,mBAAgB,eAChB,kBAAe,CAAC,KACmD;CACnE,IAAM,CAAC,GAAoB,KAAyB,QAA8C,KAAiB,CAAC,CAAC,GAC/G,IAAiB,KAAU,GAE3B,IAAe,GACnB,MAA8C;EAK9C,AAJI,MAAW,KAAA,KACd,EAAsB,CAAU,GAGjC,IAAW,CAAU;CACtB,GACA,CAAC,GAAU,CAAM,CAClB,GAEM,IAAoB,GACxB,MAAsB;EACtB,IAAI,MAAkB,eAAe,OAAO;EAE5C,IAAM,IAAe,EAAgB,GAAW,CAAY;EAG5D,OAFI,IAAe,KAEZ,EAAa,MAAM,GAAG,CAAY,CAAC,CAAC,MAAM,MAAsB,CAAC,EAAe,EAAkB,EAAE,MAAM;CAClH,GACA;EAAC;EAAgB;EAAc;CAAa,CAC7C;CA2BA,OAAO;EACN,QAAQ;EACR;EACA,eA5BqB,GACpB,GAAmB,MAAwC;GAC3D,IAAI,EAAkB,CAAS,GAAG;GAElC,IAAM,IAA4C;IACjD,GAAG;KACF,IAAY,CAAC,GAAG,CAAgB;GAClC;GAEA,IAAI,MAAkB,cAAc;IACnC,IAAM,IAAe,EAAgB,GAAW,CAAY;IAG5D,KAAK,IAAM,KAAsB,EAAa,MAAM,IAAe,CAAC,GACnE,AAAI,KAAsB,MACzB,EAAW,KAAsB,CAAC;GAGrC;GAEA,EAAa,CAAU;EACxB,GACA;GAAC;GAAmB;GAAgB;GAAc;GAAe;EAAY,CAM7E;EACA;CACD;AACD"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { t as e } from "./ui.module-DHVTOqZ0.js";
|
|
2
|
+
import { u as t } from "./input-CCdBtl-C.js";
|
|
3
|
+
import { a as n, c as r, f as i, i as a, l as o, o as s, p as c, r as l, t as u, u as d } from "./picker-CrRdwdA5.js";
|
|
4
|
+
import { n as f, r as p } from "./useODataSelectBase-Cc79kBNk.js";
|
|
5
|
+
import { t as m } from "./odata-dependent-C_DCbKY2.js";
|
|
6
|
+
import { Fragment as h, useCallback as g, useMemo as _, useRef as ee, useState as te } from "react";
|
|
7
|
+
import { useODataCollectionModel as v } from "@ryuzaki13/react-foundation-api/odata";
|
|
8
|
+
import { cn as y } from "@ryuzaki13/react-foundation-lib/utils";
|
|
9
|
+
import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
10
|
+
import { CheckIcon as ne, XIcon as re } from "lucide-react";
|
|
11
|
+
//#region src/select/lib/getOptionSearchText.ts
|
|
12
|
+
function ie({ option: e, getOptionLabel: t, getOptionCode: n, getOptionGroup: r }) {
|
|
13
|
+
return [
|
|
14
|
+
s(t(e)),
|
|
15
|
+
s(n?.(e)),
|
|
16
|
+
s(r?.(e)?.label)
|
|
17
|
+
].filter((e) => !!e).join(" ").toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
function C(e, t, n) {
|
|
20
|
+
return e.find((e) => e.value === t) ?? n;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/select/model/useODataSelect.ts
|
|
24
|
+
function w({ odata: e, segment: t, model: n, value: r, dependencies: i, onChange: a }) {
|
|
25
|
+
let o = f({
|
|
26
|
+
odata: e,
|
|
27
|
+
segment: t,
|
|
28
|
+
model: n,
|
|
29
|
+
value: r ? [r] : [],
|
|
30
|
+
dependencies: i
|
|
31
|
+
}), s = o.selectedItems[0], c = _(() => s ? [s, ...o.filteredItems] : o.filteredItems, [o.filteredItems, s]), l = (e) => {
|
|
32
|
+
a(e?.[o.selectionKey]);
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
...o,
|
|
36
|
+
selectedItem: s,
|
|
37
|
+
options: c,
|
|
38
|
+
handleChange: l
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/select/lib/createSelectOptionSections.ts
|
|
43
|
+
function ae(e, t) {
|
|
44
|
+
let n = [];
|
|
45
|
+
return e.forEach((e, r) => {
|
|
46
|
+
let i = t(e), a = n.at(-1), o = a?.group?.key === i?.key;
|
|
47
|
+
if (a && o) {
|
|
48
|
+
a.items.push({
|
|
49
|
+
option: e,
|
|
50
|
+
index: r
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
n.push({
|
|
55
|
+
group: i,
|
|
56
|
+
items: [{
|
|
57
|
+
option: e,
|
|
58
|
+
index: r
|
|
59
|
+
}]
|
|
60
|
+
});
|
|
61
|
+
}), n;
|
|
62
|
+
}
|
|
63
|
+
var T = {
|
|
64
|
+
inputWithOverlay: "aEEqH1",
|
|
65
|
+
valueOverlay: "_4HQKa7"
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/select/Select.tsx
|
|
69
|
+
function E(t) {
|
|
70
|
+
let { label: f, description: p, disabled: m, placeholder: v, size: C, options: w, value: E, onChange: oe, getOptionKey: D, getOptionLabel: O, getOptionCode: k, getOptionDisabled: A, getOptionAriaLabel: j, getOptionGroup: M, getOptionClassName: se, renderOption: N, renderValue: P, className: ce, buttonClassName: le, optionsClassName: ue, optionsMaxWidth: de, optionsContentClassName: fe, searchable: F = !1, defaultFilter: pe = !0, query: me, defaultQuery: he, onQuery: ge, renderPopupHeader: _e, emptyState: ve, isLoading: ye, errorState: be, placement: xe = "bottom-start", clearable: I = !1 } = t, L = oe, R = ee(null), [z, Se] = te(!1), B = F ? "search-single" : "display", V = E === void 0 ? void 0 : D(E), H = V === void 0 ? void 0 : w.find((e) => D(e) === V) ?? E, { query: U, setQuery: W, resetQueryOnClose: Ce } = l({
|
|
71
|
+
query: me,
|
|
72
|
+
defaultQuery: he,
|
|
73
|
+
onQuery: ge,
|
|
74
|
+
triggerMode: B
|
|
75
|
+
}), we = (e) => {
|
|
76
|
+
z && !e && Ce && W(""), Se(e);
|
|
77
|
+
}, Te = g((e) => ie({
|
|
78
|
+
option: e,
|
|
79
|
+
getOptionLabel: O,
|
|
80
|
+
getOptionCode: k,
|
|
81
|
+
getOptionGroup: M
|
|
82
|
+
}), [
|
|
83
|
+
k,
|
|
84
|
+
M,
|
|
85
|
+
O
|
|
86
|
+
]), G = n({
|
|
87
|
+
options: w,
|
|
88
|
+
query: U,
|
|
89
|
+
enabled: F && pe,
|
|
90
|
+
getSearchText: Te
|
|
91
|
+
}), K = _(() => M ? ae(G, M) : void 0, [M, G]), Ee = V === void 0 ? -1 : G.findIndex((e) => D(e) === V), { activeIndex: De, context: Oe, floatingStyles: ke, getFloatingProps: Ae, setReference: je, setFloating: Me, setOptionRef: Ne, close: q, openList: Pe, toggleOpen: Fe, selectOption: Ie, selectActiveOption: Le, handleReferenceKeyDown: Re, handleFloatingKeyDown: ze, getOptionId: Be, getActiveOptionId: J } = a({
|
|
92
|
+
options: G,
|
|
93
|
+
selectedIndex: Ee,
|
|
94
|
+
open: z,
|
|
95
|
+
onOpenChange: we,
|
|
96
|
+
getOptionDisabled: A,
|
|
97
|
+
onSelect: L,
|
|
98
|
+
disabled: m,
|
|
99
|
+
placement: xe,
|
|
100
|
+
triggerMode: B
|
|
101
|
+
}), Y = G.length > 0, X = H === void 0 ? void 0 : O(H), Z = H === void 0 ? void 0 : P ? P(H) : X, Ve = s(X), He = H === void 0 ? void 0 : s(k?.(H)), Ue = s(Z) ?? Ve ?? He ?? (V === void 0 ? "" : String(V)), Q = F && (z || U.length > 0), We = Q ? U : H === void 0 ? "" : Ue, Ge = H !== void 0 && Z !== void 0 && s(Z) === void 0 && !Q, $ = u({
|
|
102
|
+
mode: B,
|
|
103
|
+
open: z,
|
|
104
|
+
currentQuery: U,
|
|
105
|
+
hasDisplayValue: H !== void 0,
|
|
106
|
+
inputRef: R,
|
|
107
|
+
setQuery: W,
|
|
108
|
+
openList: Pe,
|
|
109
|
+
close: q,
|
|
110
|
+
toggleOpen: Fe
|
|
111
|
+
}), Ke = (e) => {
|
|
112
|
+
R.current = e;
|
|
113
|
+
}, qe = () => {
|
|
114
|
+
I && L(void 0), W(""), q();
|
|
115
|
+
}, Je = (t, n, r) => {
|
|
116
|
+
let i = D(n), a = V !== void 0 && i === V, o = r === De, s = A?.(n) ?? !1, c = {
|
|
117
|
+
active: o,
|
|
118
|
+
selected: a,
|
|
119
|
+
disabled: s
|
|
120
|
+
};
|
|
121
|
+
return /* @__PURE__ */ x("div", {
|
|
122
|
+
id: Be(t, r),
|
|
123
|
+
ref: (e) => Ne(r, e),
|
|
124
|
+
role: "option",
|
|
125
|
+
"aria-selected": a,
|
|
126
|
+
"aria-disabled": s || void 0,
|
|
127
|
+
"aria-label": j?.(n),
|
|
128
|
+
className: y(e.uiPopupOption, s && e.disabled, o && e.uiPopupOptionActive, a && e.selected, se?.(n, c)),
|
|
129
|
+
onClick: () => Ie(n),
|
|
130
|
+
children: N ? N(n, c) : /* @__PURE__ */ S(b, { children: [
|
|
131
|
+
x(a ? ne : "span", { className: e.uiPopupOptionIcon }),
|
|
132
|
+
/* @__PURE__ */ x("div", {
|
|
133
|
+
className: e.uiOptionText,
|
|
134
|
+
children: O(n)
|
|
135
|
+
}),
|
|
136
|
+
k && /* @__PURE__ */ x("div", {
|
|
137
|
+
className: e.uiOptionCode,
|
|
138
|
+
children: k(n)
|
|
139
|
+
})
|
|
140
|
+
] })
|
|
141
|
+
}, i);
|
|
142
|
+
};
|
|
143
|
+
return /* @__PURE__ */ x(c, {
|
|
144
|
+
label: f,
|
|
145
|
+
description: p,
|
|
146
|
+
disabled: m,
|
|
147
|
+
size: C,
|
|
148
|
+
className: ce,
|
|
149
|
+
children: ({ controlId: t, labelId: n, describedBy: a }) => {
|
|
150
|
+
let s = `${t}-listbox`;
|
|
151
|
+
return /* @__PURE__ */ S(b, { children: [/* @__PURE__ */ x(r, {
|
|
152
|
+
ref: Ke,
|
|
153
|
+
rootRef: je,
|
|
154
|
+
id: t,
|
|
155
|
+
type: "text",
|
|
156
|
+
disabled: m,
|
|
157
|
+
readOnly: !F,
|
|
158
|
+
autoComplete: "off",
|
|
159
|
+
role: "combobox",
|
|
160
|
+
isLoading: ye,
|
|
161
|
+
value: We,
|
|
162
|
+
placeholder: H === void 0 || Q ? `${v ?? f ?? ""} <${w.length}>` : void 0,
|
|
163
|
+
"aria-labelledby": n,
|
|
164
|
+
"aria-describedby": a,
|
|
165
|
+
"aria-haspopup": "listbox",
|
|
166
|
+
"aria-expanded": z,
|
|
167
|
+
"aria-controls": z ? s : void 0,
|
|
168
|
+
"aria-autocomplete": F ? "list" : "none",
|
|
169
|
+
"aria-activedescendant": z ? J(s) : void 0,
|
|
170
|
+
inputClassName: y(Ge && T.inputWithOverlay, le, "textOverflow"),
|
|
171
|
+
overlay: Ge ? /* @__PURE__ */ x("div", {
|
|
172
|
+
className: T.valueOverlay,
|
|
173
|
+
children: Z
|
|
174
|
+
}) : void 0,
|
|
175
|
+
endAdornment: /* @__PURE__ */ x(o, {
|
|
176
|
+
open: z,
|
|
177
|
+
disabled: m,
|
|
178
|
+
onToggleMouseDown: $.handleToggleMouseDown,
|
|
179
|
+
onToggleClick: $.handleToggleClick,
|
|
180
|
+
children: I && H !== void 0 && !m ? /* @__PURE__ */ x("button", {
|
|
181
|
+
type: "button",
|
|
182
|
+
className: e.uiClearButton,
|
|
183
|
+
"data-ui": "select-clear-button",
|
|
184
|
+
"data-action": "clear-select",
|
|
185
|
+
onMouseDown: (e) => {
|
|
186
|
+
e.preventDefault(), e.stopPropagation();
|
|
187
|
+
},
|
|
188
|
+
onClick: (e) => {
|
|
189
|
+
e.preventDefault(), e.stopPropagation(), qe();
|
|
190
|
+
},
|
|
191
|
+
"aria-label": "Очистить выбор",
|
|
192
|
+
children: /* @__PURE__ */ x(re, {})
|
|
193
|
+
}) : null
|
|
194
|
+
}),
|
|
195
|
+
onChange: (e) => {
|
|
196
|
+
F && $.handleTriggerInputChange(e.target.value);
|
|
197
|
+
},
|
|
198
|
+
onClick: $.handleTriggerClick,
|
|
199
|
+
onFocus: (e) => {
|
|
200
|
+
$.handleTriggerFocus(e.currentTarget);
|
|
201
|
+
},
|
|
202
|
+
onKeyDown: (e) => {
|
|
203
|
+
Re(e), !e.defaultPrevented && $.handleTriggerKeyDown({
|
|
204
|
+
event: e,
|
|
205
|
+
onActivateWhenOpen: Le,
|
|
206
|
+
enableSpaceActivation: !F
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}), /* @__PURE__ */ x(i, {
|
|
210
|
+
open: z,
|
|
211
|
+
context: Oe,
|
|
212
|
+
floatingStyles: ke,
|
|
213
|
+
listId: s,
|
|
214
|
+
labelId: n,
|
|
215
|
+
descriptionId: a,
|
|
216
|
+
activeOptionId: Y ? J(s) : void 0,
|
|
217
|
+
setFloating: Me,
|
|
218
|
+
getFloatingProps: Ae,
|
|
219
|
+
onKeyDown: ze,
|
|
220
|
+
className: y(e.uiPopupOptions, ue),
|
|
221
|
+
maxWidth: de,
|
|
222
|
+
header: _e,
|
|
223
|
+
children: /* @__PURE__ */ x("div", {
|
|
224
|
+
className: y(fe, "h100 scrollable"),
|
|
225
|
+
children: Y ? K ? K.map((t, n) => {
|
|
226
|
+
let r = t.group ? `${s}-group-${n}` : void 0, i = t.items.map(({ option: e, index: t }) => Je(s, e, t));
|
|
227
|
+
return t.group ? /* @__PURE__ */ S("div", {
|
|
228
|
+
role: "group",
|
|
229
|
+
"aria-labelledby": r,
|
|
230
|
+
children: [/* @__PURE__ */ x("div", {
|
|
231
|
+
id: r,
|
|
232
|
+
className: e.uiPopupGroupLabel,
|
|
233
|
+
children: t.group.label
|
|
234
|
+
}), i]
|
|
235
|
+
}, `group-${String(t.group.key)}-${n}`) : /* @__PURE__ */ x(h, { children: i }, `options-${n}`);
|
|
236
|
+
}) : G.map((e, t) => Je(s, e, t)) : /* @__PURE__ */ x(d, {
|
|
237
|
+
emptyState: ve,
|
|
238
|
+
errorState: be
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
})] });
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/select/ODataSelect.tsx
|
|
247
|
+
function oe(e, t, n) {
|
|
248
|
+
return e ? t || Object.keys(e).find((e) => e !== n) || n : t || n;
|
|
249
|
+
}
|
|
250
|
+
var D = ({ odata: e, segment: n, model: r, size: i, label: a, description: o, disabled: s, value: c, dependencies: l, onChange: u, clearable: d }) => {
|
|
251
|
+
let f = w({
|
|
252
|
+
odata: e,
|
|
253
|
+
segment: n,
|
|
254
|
+
model: v(r),
|
|
255
|
+
value: c,
|
|
256
|
+
dependencies: l,
|
|
257
|
+
onChange: u
|
|
258
|
+
});
|
|
259
|
+
if (f.isLoading) return /* @__PURE__ */ x(t, {
|
|
260
|
+
size: i,
|
|
261
|
+
label: a,
|
|
262
|
+
description: o
|
|
263
|
+
});
|
|
264
|
+
let m = n.hideCode ?? e.hideCode, h = oe(f.selectedItem ?? f.options[0], f.textKey, f.codeKey);
|
|
265
|
+
return /* @__PURE__ */ x(E, {
|
|
266
|
+
size: i,
|
|
267
|
+
label: a,
|
|
268
|
+
description: o,
|
|
269
|
+
options: f.options,
|
|
270
|
+
value: f.selectedItem,
|
|
271
|
+
onChange: f.handleChange,
|
|
272
|
+
getOptionKey: (e) => e[f.codeKey],
|
|
273
|
+
getOptionLabel: (e) => e[h],
|
|
274
|
+
getOptionCode: m ? void 0 : (e) => e[f.codeKey],
|
|
275
|
+
getOptionAriaLabel: (e) => m || e[h] === e[f.codeKey] ? String(e[h]) : `${e[h]} ${e[f.codeKey]}`,
|
|
276
|
+
renderValue: (e) => /* @__PURE__ */ x(p, {
|
|
277
|
+
label: e[h],
|
|
278
|
+
code: m ? void 0 : e[f.codeKey]
|
|
279
|
+
}),
|
|
280
|
+
renderOption: (e) => /* @__PURE__ */ x(p, {
|
|
281
|
+
label: e[h],
|
|
282
|
+
code: m ? void 0 : e[f.codeKey],
|
|
283
|
+
highlight: f.debouncedQuery
|
|
284
|
+
}),
|
|
285
|
+
searchable: !0,
|
|
286
|
+
query: f.query,
|
|
287
|
+
onQuery: f.setQuery,
|
|
288
|
+
defaultFilter: !1,
|
|
289
|
+
disabled: s || f.isLoading,
|
|
290
|
+
placeholder: f.placeholder,
|
|
291
|
+
isLoading: f.isLoading,
|
|
292
|
+
errorState: f.isError ? "Ошибка загрузки" : void 0,
|
|
293
|
+
emptyState: !f.isLoading && !f.isError ? "Нет данных" : void 0,
|
|
294
|
+
clearable: d
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
//#endregion
|
|
298
|
+
//#region src/select/ODataDependentSegmentSelect.tsx
|
|
299
|
+
function O(e) {
|
|
300
|
+
let { item: t, disabled: n, label: r, description: i, size: a, width: o = 15, clearable: s } = e, c = m(e), { updateSegment: l } = c, u = `calc(${o}em + var(--width-add))`, d = g((e) => {
|
|
301
|
+
l(t.id, e === void 0 ? [] : [e]);
|
|
302
|
+
}, [t.id, l]);
|
|
303
|
+
return /* @__PURE__ */ x("div", {
|
|
304
|
+
style: {
|
|
305
|
+
maxWidth: u,
|
|
306
|
+
minWidth: u
|
|
307
|
+
},
|
|
308
|
+
children: /* @__PURE__ */ x(D, {
|
|
309
|
+
odata: t.odata,
|
|
310
|
+
segment: t.segment,
|
|
311
|
+
model: t.model,
|
|
312
|
+
dependencies: c.values,
|
|
313
|
+
value: c.values[t.id]?.[0],
|
|
314
|
+
onChange: d,
|
|
315
|
+
disabled: n || c.isSegmentDisabled(t.id),
|
|
316
|
+
label: r,
|
|
317
|
+
description: i,
|
|
318
|
+
size: a,
|
|
319
|
+
clearable: s
|
|
320
|
+
})
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
//#endregion
|
|
324
|
+
//#region src/select/SerializableSelect.tsx
|
|
325
|
+
function k(e, t) {
|
|
326
|
+
return e[t];
|
|
327
|
+
}
|
|
328
|
+
function A(e, t, n) {
|
|
329
|
+
let r = e[t];
|
|
330
|
+
if (typeof r == "string" || typeof r == "number") return r;
|
|
331
|
+
let i = k(e, n);
|
|
332
|
+
return typeof i == "string" || typeof i == "number" ? i : String(i);
|
|
333
|
+
}
|
|
334
|
+
function j({ label: e, description: t, disabled: n, placeholder: r, size: i, options: a, value: o, onChange: s, optionKey: c, optionLabel: l, renderCode: u, className: d, clearable: f }) {
|
|
335
|
+
let p = o === void 0 ? void 0 : a.find((e) => k(e, c) === o);
|
|
336
|
+
return /* @__PURE__ */ x(E, {
|
|
337
|
+
label: e,
|
|
338
|
+
description: t,
|
|
339
|
+
disabled: n,
|
|
340
|
+
placeholder: r,
|
|
341
|
+
size: i,
|
|
342
|
+
options: a,
|
|
343
|
+
value: p,
|
|
344
|
+
onChange: (e) => s(e ? k(e, c) : void 0),
|
|
345
|
+
getOptionKey: (e) => k(e, c),
|
|
346
|
+
getOptionLabel: (e) => A(e, l, c),
|
|
347
|
+
getOptionCode: u ? (e) => k(e, c) : void 0,
|
|
348
|
+
className: d,
|
|
349
|
+
clearable: f
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
export { C as a, E as i, O as n, D as r, j as t };
|
|
354
|
+
|
|
355
|
+
//# sourceMappingURL=select-D3EnRya6.js.map
|