@ryuzaki13/react-foundation-ui 3.7.5 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/formatMultiSelectOptionCount-t-e8apob.js +14 -0
- package/dist/chunks/formatMultiSelectOptionCount-t-e8apob.js.map +1 -0
- package/dist/multi-select/index.js +355 -240
- package/dist/multi-select/index.js.map +1 -1
- package/dist/multi-select/lib/adaptLegacyMultiSelectContext.d.ts +8 -0
- package/dist/multi-select/lib/adaptLegacyMultiSelectContext.d.ts.map +1 -0
- package/dist/multi-select/lib/createMultiSelectOptionSections.d.ts +15 -0
- package/dist/multi-select/lib/createMultiSelectOptionSections.d.ts.map +1 -0
- package/dist/multi-select/lib/formatMultiSelectOptionCount.d.ts +3 -0
- package/dist/multi-select/lib/formatMultiSelectOptionCount.d.ts.map +1 -0
- package/dist/multi-select/lib/materializeMultiSelectOptions.d.ts +6 -0
- package/dist/multi-select/lib/materializeMultiSelectOptions.d.ts.map +1 -0
- package/dist/multi-select/lib/multiSelectSelection.d.ts +4 -0
- package/dist/multi-select/lib/multiSelectSelection.d.ts.map +1 -0
- package/dist/multi-select/lib/resolveLegacyMultiSelectTextKey.d.ts +4 -0
- package/dist/multi-select/lib/resolveLegacyMultiSelectTextKey.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelect.d.ts +10 -41
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/MultiSelectOptionList.d.ts +23 -0
- package/dist/multi-select/ui/MultiSelectOptionList.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelectOptionRow.d.ts +21 -0
- package/dist/multi-select/ui/MultiSelectOptionRow.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelectOptionsWrapper.d.ts +9 -0
- package/dist/multi-select/ui/MultiSelectOptionsWrapper.d.ts.map +1 -0
- package/dist/multi-select/ui/OptionMultiSelect.d.ts +30 -0
- package/dist/multi-select/ui/OptionMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/OptionMultiSelectCore.d.ts +13 -0
- package/dist/multi-select/ui/OptionMultiSelectCore.d.ts.map +1 -0
- package/dist/multi-select/ui/index.d.ts +2 -0
- package/dist/multi-select/ui/index.d.ts.map +1 -1
- package/dist/multi-select/ui/legacyMultiSelectTypes.d.ts +29 -0
- package/dist/multi-select/ui/legacyMultiSelectTypes.d.ts.map +1 -0
- package/dist/multi-select/ui/optionMultiSelectTypes.d.ts +45 -0
- package/dist/multi-select/ui/optionMultiSelectTypes.d.ts.map +1 -0
- package/dist/shimmer-text/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tree-select/index.js +1 -1
- package/dist/tree-select/index.js.map +1 -1
- package/package.json +2 -2
- package/storybook-static/assets/{Badge-BfIgRKNN.js → Badge-uLn0juvN.js} +1 -1
- package/storybook-static/assets/{Badge.stories-Bw9t-rQV.js → Badge.stories-vAeQxF59.js} +1 -1
- package/storybook-static/assets/{BadgeList-CVOdFfyT.js → BadgeList-CY_L4VvY.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-DAoSFPEB.js → BarcodeScannerDialog.stories-C_M9fRVa.js} +1 -1
- package/storybook-static/assets/{Button-g9If4XMf.js → Button-B9K2X1Qh.js} +1 -1
- package/storybook-static/assets/{Button-DVYJuV3C.js → Button-_CwdBR3k.js} +1 -1
- package/storybook-static/assets/{Button.stories-C9kMD1ir.js → Button.stories-BOyxeyZ-.js} +1 -1
- package/storybook-static/assets/{CalendarView-CVAGzDnG.js → CalendarView-DI5Xyd8e.js} +1 -1
- package/storybook-static/assets/{CheckBox-DzpTYZ8X.js → CheckBox-CyH0yqmm.js} +1 -1
- package/storybook-static/assets/{CheckBox-BY0SKlri.js → CheckBox-ivX0kZSD.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-s7JkVe9v.js → CheckBox.stories-ISH4Prdw.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-DqlbXkwg.js → Color-6AOWCN3U-Tqykt5jy.js} +1 -1
- package/storybook-static/assets/{ContextMenu-w5Jmwcku.js → ContextMenu-DwLCPnoN.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CEJolusp.js → ContextMenu-PCdqGJxx.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-DaMcB8Pz.js → ContextMenu.stories-4FfiXmxn.js} +1 -1
- package/storybook-static/assets/{DateInput-0moPZfp3.js → DateInput-Bc1Wy65t.js} +1 -1
- package/storybook-static/assets/{DateInput-B79-bkj2.js → DateInput-L-Y80kKJ.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-DqjigZX2.js → DateInput.stories-JchxtVkw.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-Cy2QteRp.js → DateRangePresetSelect-Cedah5Yp.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CYm-EgTs.js → DateRangePresetSelect-bU-gFcj2.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-D_gaZM1w.js → DateRangePresetSelect.stories-DvEWNS_W.js} +1 -1
- package/storybook-static/assets/{Detail-CSzc517F.js → Detail-CWlXU9CA.js} +1 -1
- package/storybook-static/assets/{Detail.stories-D-OmMp6r.js → Detail.stories-OukjnklW.js} +1 -1
- package/storybook-static/assets/{Dialog-NiG3kfEI.js → Dialog-CkabwirS.js} +1 -1
- package/storybook-static/assets/{Dialog-H-UalASx.js → Dialog-rVSalesb.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-DqxKgUOp.js → Dialog.stories-BXQhdz__.js} +1 -1
- package/storybook-static/assets/{Disclosure-rhJDQsQ4.js → Disclosure-Dr8Lhnhy.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-DOGeq7B_.js → Disclosure.stories-DZ3cPTHU.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-D0UWfJ4m.js → DisclosureGroup-CY6Yb_J_.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-B1WAN9Z0.js → DocsRenderer-JROSPFPF-DDBN-s9I.js} +1 -1
- package/storybook-static/assets/{DropZone-C_PhrEVi.js → DropZone-BGx1oE5x.js} +1 -1
- package/storybook-static/assets/{DropZone-BtWvUQVo.js → DropZone-DcKtndvt.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-LcN1HAgF.js → DropZone.stories-CdroZ3KP.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-CJ7xZ9A9.js → DropdownMenu-BCw6UYmi.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-BNs2NQAu.js → ExpandableActionPanel-DBeRCLiz.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-5ycxCFaw.js → ExpandableActionPanel.stories-Dk2b0dZ7.js} +1 -1
- package/storybook-static/assets/{Flex-DMLBwFu_.js → Flex-BGCt2Ty4.js} +1 -1
- package/storybook-static/assets/{Flex.stories-DVlBBQXi.js → Flex.stories-TNfwUrEG.js} +1 -1
- package/storybook-static/assets/{FlexContainer-6MA4jm1a.js → FlexContainer-Cp7KpERB.js} +1 -1
- package/storybook-static/assets/{FlexItem-D2mwuCCw.js → FlexItem-CgSxHUjW.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-DAbW0PKY.js → FloatingPopover-DuSkz_S2.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-Yk96SgW5.js → FormattedTableCell-DxTBvVfJ.js} +1 -1
- package/storybook-static/assets/{Grid-Cc65pPjF.js → Grid-CJKjOeEG.js} +1 -1
- package/storybook-static/assets/{Grid-txlDo064.js → Grid-QVmgVzoV.js} +1 -1
- package/storybook-static/assets/{Grid.stories-BqcMgdsN.js → Grid.stories-DPcBuL8b.js} +1 -1
- package/storybook-static/assets/{GridContainer-CKvtE0IV.js → GridContainer-CotR1WQh.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-DLoD6loY.js → ImageCropper.stories-Cgu7OqIp.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-CPct0n3T.js → ImageRenderer-BUC_GBJ2.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-CMWRQ6t6.js → ImageRenderer.stories-Dt493hYg.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-kEka_Hqw.js → ImageView.stories-BLn05DXS.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-Cy6dSSRv.js → ImageViewer.stories-C19infAQ.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-CblH2Ixd.js → ImageViewerRuntime-rN0RzFEB.js} +1 -1
- package/storybook-static/assets/{Input-D585E16E.js → Input-CvT5iV9z.js} +1 -1
- package/storybook-static/assets/{Input-CkasTov6.js → Input-cRia6EnE.js} +1 -1
- package/storybook-static/assets/{Input.stories-FVhWUvuO.js → Input.stories-HLHRUjA7.js} +1 -1
- package/storybook-static/assets/{InputDateTime-Bgj4R_QI.js → InputDateTime-Cc1JktSi.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-BPiXVYDj.js → InputDateTime.stories-D53nmoks.js} +1 -1
- package/storybook-static/assets/{InputFile-D0a5htyV.js → InputFile-BsC6k9CX.js} +1 -1
- package/storybook-static/assets/{InputFile-CdiMYcVe.js → InputFile-sJ25-ukA.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-D_UwgQFT.js → InputFile.stories-DB-782ch.js} +1 -1
- package/storybook-static/assets/{InputFiles-By0NxLAo.js → InputFiles-BSnj81Jt.js} +1 -1
- package/storybook-static/assets/{InputFiles-CMe8IvkD.js → InputFiles-CZIFzjW7.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-D8KsrYoa.js → InputFiles.stories-CMayp1MA.js} +1 -1
- package/storybook-static/assets/{InputFilesList-DlaVRbwJ.js → InputFilesList-Bm6PVcf-.js} +1 -1
- package/storybook-static/assets/{InputImage-DR93tQeJ.js → InputImage-B7qUyJja.js} +1 -1
- package/storybook-static/assets/{InputImage-CJGf1g53.js → InputImage-BSO7ZMcf.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-DyEpoKEz.js → InputImage.stories-DaJtPzZj.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-6snpmjJ0.js → InteractiveComponents-iNV7x7WW.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-BHu3vMe9.js → InteractiveComponents.stories-D7I6ysOH.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-DYp0nljL.js → LayoutPicker-DcAfPDfE.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CCnNrafK.js → LayoutPicker-_RIOJ_qN.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-B2m0ylcv.js → LayoutPicker.stories-CIGzD6OV.js} +1 -1
- package/storybook-static/assets/{Listbox-DNk9vlIu.js → Listbox-D6QEqJxm.js} +1 -1
- package/storybook-static/assets/{Listbox-u8f_4-44.js → Listbox-DTJfHCCi.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-BBnhx4SX.js → Listbox.stories-BHm9e3kt.js} +1 -1
- package/storybook-static/assets/{Modal-4fLCAKtY.js → Modal-CFo0PqWY.js} +1 -1
- package/storybook-static/assets/{Modal-PUhB2wty.js → Modal-soD4yzlp.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D3e48w_m.js → Modal.stories-Cwmx-hgp.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-BfH95P3h.js → ModalManagerProvider-BF08D_uQ.js} +1 -1
- package/storybook-static/assets/{MultiSelect-CN8_kCmV.js → MultiSelect-BSwE_oBc.js} +7 -5
- package/storybook-static/assets/MultiSelect-DBNTc1dz.js +3 -0
- package/storybook-static/assets/{MultiSelect.stories-COG7FIlv.js → MultiSelect.stories-CI3HUdj4.js} +1 -1
- package/storybook-static/assets/{NoData-BurROUNL.js → NoData-CWK82Q1i.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-BAjTaLZc.js → NotificationsHost-DmFTlzqz.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-hx_KAWmp.js → NotificationsHost.stories-DGnDAG9L.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-dA9jGS2c.js → ODataMultiSelect-rXpV6DVc.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-Dva_JUSt.js → ODataMultiSelect.stories-BK7inW-H.js} +1 -1
- package/storybook-static/assets/{ODataSelect-DLUV4Rht.js → ODataSelect-ChMv3gAt.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-CQV_bo7g.js → ODataSelect.stories-CWgCeuUZ.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-LcVvEQzR.js → ODataTreeMultiSelect--K1Cr5rs.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-Bg7gIJ6x.js → ODataTreeMultiSelect.stories-DkqcOU54.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Ahj-WtQa.js → ODataTreeSelect-CXPOA45d.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-CGeYCMu0.js → ODataTreeSelect.stories-Arr35qIR.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-DcRPaPaJ.js → OneStepScroller-DektyW3p.js} +1 -1
- package/storybook-static/assets/{Option-DnD8KI3c.js → Option-DK4dHhT1.js} +1 -1
- package/storybook-static/assets/{OptionButton-DoGBQsQT.js → OptionButton-CsOv8dZ_.js} +1 -1
- package/storybook-static/assets/{OptionContent-bcTaOvMc.js → OptionContent-DgSmB8T-.js} +1 -1
- package/storybook-static/assets/{OptionContentContainer-DlhRLbld.js → OptionContentContainer-ROUyLVX_.js} +1 -1
- package/storybook-static/assets/OptionMultiSelect-BtULWPnH.js +75 -0
- package/storybook-static/assets/OptionMultiSelect.stories-oNE7yvAx.js +64 -0
- package/storybook-static/assets/OptionMultiSelectCore-D8cGuRYM.js +3 -0
- package/storybook-static/assets/{PeriodSelect--nMn6M4X.js → PeriodSelect-DrO6n1An.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-CjwBbkLp.js → PeriodSelect-yuiZbhil.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-DXyqnh4s.js → PeriodSelect.stories-BEicKdLp.js} +1 -1
- package/storybook-static/assets/{PickerField-CJ5MDLyk.js → PickerField-nBBELo78.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-Dq9jwals.js → PickerTriggerActions-CkKNIp3y.js} +1 -1
- package/storybook-static/assets/{Popover-hja4HaFp.js → Popover-Bf4a7PIe.js} +1 -1
- package/storybook-static/assets/{Popover-DAvxpqm9.js → Popover-CvpieQDS.js} +1 -1
- package/storybook-static/assets/{Popover.stories-BF9_UeHx.js → Popover.stories-CetSmVHK.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-CN7naHmX.js → PresetRangeDateInput-D1uKkeQM.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-CCPNYf5B.js → PresetRangeDateInput-VqFGeOlz.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-C2d6UzCR.js → PresetRangeDateInput.stories-Bv6H31A8.js} +1 -1
- package/storybook-static/assets/{PresetSelect-MHuvYyyg.js → PresetSelect-Dxgbcd6v.js} +1 -1
- package/storybook-static/assets/{README-CAXbPH6W.js → README-0TL8dXfy.js} +1 -1
- package/storybook-static/assets/{README-HznRk4uy.js → README-4rRBLeQ7.js} +1 -1
- package/storybook-static/assets/{README-CBNVEgzW.js → README-B38eezDS.js} +1 -1
- package/storybook-static/assets/{README-CR3ItwRk.js → README-B8hyGxl2.js} +1 -1
- package/storybook-static/assets/{README-BkxDYJKq.js → README-BHP_hy_l.js} +1 -1
- package/storybook-static/assets/{README-CttbYZHp.js → README-BHeLXCve.js} +1 -1
- package/storybook-static/assets/{README-CIgcwR99.js → README-BJHxnca5.js} +1 -1
- package/storybook-static/assets/{README-yL69Fl0z.js → README-BJmN3u7D.js} +1 -1
- package/storybook-static/assets/{README-0t5gXDcG.js → README-BMsZYhwk.js} +1 -1
- package/storybook-static/assets/{README-B5A2YIW_.js → README-BNhuO-gy.js} +1 -1
- package/storybook-static/assets/{README-4-DogNpH.js → README-BUZdjVfo.js} +1 -1
- package/storybook-static/assets/{README-XXmD4e3b.js → README-BWyLOpAH.js} +1 -1
- package/storybook-static/assets/{README-CNSmCTyX.js → README-B_YeFSgu.js} +1 -1
- package/storybook-static/assets/{README-CBQQHqOC.js → README-BnFo7A1M.js} +1 -1
- package/storybook-static/assets/{README-BhMrk60D.js → README-Brb2EJiv.js} +1 -1
- package/storybook-static/assets/{README-CasBjCip.js → README-Bv0lZXg9.js} +1 -1
- package/storybook-static/assets/{README-tGSBextT.js → README-BvbLyoA_.js} +1 -1
- package/storybook-static/assets/{README-CoDRzU4Y.js → README-Bwaf_RtF.js} +1 -1
- package/storybook-static/assets/{README-D0117YhU.js → README-BylYDbD8.js} +1 -1
- package/storybook-static/assets/{README-CvLr2H20.js → README-C5QxSdGG.js} +1 -1
- package/storybook-static/assets/{README-DLTXYDh8.js → README-CFU_RMXj.js} +1 -1
- package/storybook-static/assets/{README-BmOluEzg.js → README-CLxQzsFZ.js} +1 -1
- package/storybook-static/assets/{README-CYbt7QAK.js → README-COZsAYb9.js} +1 -1
- package/storybook-static/assets/{README-CLEaUbij.js → README-CPJ2Urdv.js} +1 -1
- package/storybook-static/assets/{README-NU67m2t8.js → README-CPjmlBJs.js} +1 -1
- package/storybook-static/assets/{README-CaC2TYA8.js → README-CVpcKWPZ.js} +1 -1
- package/storybook-static/assets/{README-pY6Eedga.js → README-CeVuNRzY.js} +1 -1
- package/storybook-static/assets/{README-BBqtFPVn.js → README-CezbnFVJ.js} +1 -1
- package/storybook-static/assets/{README-C5dDUqrl.js → README-Ckx6r6jB.js} +1 -1
- package/storybook-static/assets/{README-tZ8EVVrY.js → README-ClPVK3xK.js} +1 -1
- package/storybook-static/assets/{README-6tan5Ti3.js → README-CpP8uzpn.js} +1 -1
- package/storybook-static/assets/{README-CRLEe_P2.js → README-CqBnIIPG.js} +1 -1
- package/storybook-static/assets/{README-D3QNDQ04.js → README-CuNo3VAh.js} +1 -1
- package/storybook-static/assets/{README-DAYt0dDG.js → README-D-shrn-x.js} +1 -1
- package/storybook-static/assets/{README-1CJtcqET.js → README-DCH7J0KE.js} +1 -1
- package/storybook-static/assets/{README-DOB-f5a2.js → README-DEbWVz3I.js} +1 -1
- package/storybook-static/assets/{README-jg_7E-_V.js → README-DNHgCPLW.js} +1 -1
- package/storybook-static/assets/{README-Btbk0r_n.js → README-DQnRX2Qb.js} +1 -1
- package/storybook-static/assets/{README-BhR3R5Vm.js → README-DTEuMdnT.js} +1 -1
- package/storybook-static/assets/{README-CmK7-nTx.js → README-DXPMTtIt.js} +1 -1
- package/storybook-static/assets/{README-DjmJYCjd.js → README-DYj0lPM6.js} +1 -1
- package/storybook-static/assets/{README-CiL_DiHD.js → README-DvAAUxal.js} +1 -1
- package/storybook-static/assets/{README-t9NSGOcK.js → README-G45bqpi3.js} +1 -1
- package/storybook-static/assets/{README-DyRuK33k.js → README-JZYdxWRZ.js} +1 -1
- package/storybook-static/assets/{README-4sOVjf_y.js → README-LmLhlHwK.js} +1 -1
- package/storybook-static/assets/{README-C2ZsCtOM.js → README-Lwdz64Y5.js} +1 -1
- package/storybook-static/assets/{README-BBRvzbwY.js → README-T1F1XOUj.js} +1 -1
- package/storybook-static/assets/{README-Zq11HEqP.js → README-blHl72M6.js} +1 -1
- package/storybook-static/assets/{README-B-VbM3qn.js → README-mRw-97cE.js} +1 -1
- package/storybook-static/assets/{README-OEllb2GT.js → README-mq8MaRz_.js} +1 -1
- package/storybook-static/assets/{README-CIuf5o3t.js → README-u3-T1-M4.js} +1 -1
- package/storybook-static/assets/{README-Bitg8Dqq.js → README-z1sBBQYb.js} +1 -1
- package/storybook-static/assets/{README-mHFWPZQI.js → README-zNoQ0KA3.js} +1 -1
- package/storybook-static/assets/{RadioButton-CHud0pkv.js → RadioButton-DGpnLExZ.js} +1 -1
- package/storybook-static/assets/{RadioButton-mxUWWPPf.js → RadioButton-hwBOLm3O.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-BvcI9fLh.js → RadioButton.stories-BdhfL6cj.js} +1 -1
- package/storybook-static/assets/{RadioGroup-D5ewJut4.js → RadioGroup-BZp-Y7i0.js} +1 -1
- package/storybook-static/assets/{RadioGroup-DHGinm9b.js → RadioGroup-CR66RuD6.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-5a1dM3Ht.js → RadioGroup.stories-CyVY3MQs.js} +1 -1
- package/storybook-static/assets/{Scrollable-DDc-cGZl.js → Scrollable-BdyVTGWU.js} +1 -1
- package/storybook-static/assets/{Scrollable-BPlUjNUZ.js → Scrollable-l-kJfzny.js} +1 -1
- package/storybook-static/assets/{Scrollable.stories-CEfsGP5Z.js → Scrollable.stories-CDe3jWzB.js} +1 -1
- package/storybook-static/assets/{Select-C2RWcXm6.js → Select-C1o9Tgm4.js} +1 -1
- package/storybook-static/assets/{Select-BLMdD3ZT.js → Select-wMvrcMy4.js} +1 -1
- package/storybook-static/assets/{Select.stories-u6lL8E7D.js → Select.stories-CK3pQnzE.js} +1 -1
- package/storybook-static/assets/{Separator-GL-gavvF.js → Separator-Bz1SbIE1.js} +1 -1
- package/storybook-static/assets/{Separator-Chpv2xY_.js → Separator-tJoZoT06.js} +1 -1
- package/storybook-static/assets/{Separator.stories-DlaAhPNQ.js → Separator.stories-DdbjLc2p.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-DfevbY2h.js → SerializableSelect-D2y7wrSs.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Dmdj4Ak0.js → SerializableSelect.stories-CsHAHPuI.js} +1 -1
- package/storybook-static/assets/ShimmerText-Cl8gyoBJ.css +1 -0
- package/storybook-static/assets/{ShimmerText-Byhixd0z.js → ShimmerText-y0zDplGg.js} +1 -1
- package/storybook-static/assets/{ShimmerText.stories-DlIby1XS.js → ShimmerText.stories-BfGiPneX.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-BpGEhGfP.js → SingleDateTimeInput-B5pXlyuR.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-BNXm-7tA.js → SingleDateTimeInput-_jTgXVdm.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-D4T-S8sZ.js → SingleDateTimeInput.stories-BeOx8XHz.js} +1 -1
- package/storybook-static/assets/{Slider-UXzLe96u.js → Slider-BHZZpZry.js} +1 -1
- package/storybook-static/assets/{Slider-0Cj7_oYR.js → Slider-DlLlAkOo.js} +1 -1
- package/storybook-static/assets/{Slider.stories-BW1QJY3N.js → Slider.stories-D3AMXdSf.js} +1 -1
- package/storybook-static/assets/{SliderInput-CO2-QQuX.js → SliderInput-B_nKtEFR.js} +1 -1
- package/storybook-static/assets/{SliderInput-CQeBa61Z.js → SliderInput-DZ7-x9G-.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-DneAaFFf.js → SliderInput.stories-CupwFBr2.js} +1 -1
- package/storybook-static/assets/{Sortable-CMzasXuu.js → Sortable-DQqEEJ_h.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-CXEER9r1.js → Sortable.stories-BIzq139o.js} +1 -1
- package/storybook-static/assets/{Splitter-BEo8Dne9.js → Splitter-CnbBNzjk.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-x_mh2dI_.js → Splitter.stories-isfPJaLA.js} +1 -1
- package/storybook-static/assets/{StateSelect-BIialJTy.js → StateSelect-Ba01Hzid.js} +1 -1
- package/storybook-static/assets/{StateSelect-CjMgHX49.js → StateSelect-Bh9mu8Wx.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-CcKiAHnH.js → StateSelect.stories-CNe1cwYS.js} +1 -1
- package/storybook-static/assets/{StatusIndicator-DtC8QOwU.js → StatusIndicator-uczF3UAh.js} +1 -1
- package/storybook-static/assets/{StatusIndicator.stories-DRqELcGJ.js → StatusIndicator.stories-BWUH9ne2.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-BSgkntNV.js → StringToggle.stories-CNYMdULK.js} +1 -1
- package/storybook-static/assets/{Switch-CbziRM0a.js → Switch-DrAWdWBc.js} +1 -1
- package/storybook-static/assets/{Switch-B04gVpR9.js → Switch-axVFVLlk.js} +1 -1
- package/storybook-static/assets/{Switch.stories-O8nJrVHX.js → Switch.stories-BIIkoLb6.js} +1 -1
- package/storybook-static/assets/{Table-BdGd9Xq6.js → Table-DkshLxur.js} +1 -1
- package/storybook-static/assets/{Table.stories-D9ldg3L9.js → Table.stories-DELoBGks.js} +1 -1
- package/storybook-static/assets/{TableEditor.stories-BAO2vPR0.js → TableEditor.stories-glEEEgYH.js} +1 -1
- package/storybook-static/assets/{Tabs-C8DxTS84.js → Tabs-kyOZ5dm3.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-DZBURv5Q.js → Tabs.stories-DMLyEGyu.js} +1 -1
- package/storybook-static/assets/{TabsBox-CqhX8Ij-.js → TabsBox-B08FfLUR.js} +1 -1
- package/storybook-static/assets/{TagInput-BVNKZ9yP.js → TagInput-5EqCMO1Q.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-BKf-t22p.js → TagInput.stories-8FOnpAnF.js} +1 -1
- package/storybook-static/assets/{Text-CkwzRSZE.js → Text-I4ck3fsu.js} +1 -1
- package/storybook-static/assets/{Textarea-cl5KhIoD.js → Textarea-BVXq2-cJ.js} +1 -1
- package/storybook-static/assets/{Textarea-CJKqR9Mv.js → Textarea-Cp3ATqQR.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-DdvO05aa.js → Textarea.stories-Do1b_cnC.js} +1 -1
- package/storybook-static/assets/{TimePanel-fK86yZ72.js → TimePanel-C6O64BbD.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CrM1TUt1.js → TimePanel.stories-BYGDrk63.js} +1 -1
- package/storybook-static/assets/{Toggle-Bx8_bdQx.js → Toggle-haKh6Emn.js} +1 -1
- package/storybook-static/assets/{Toggle-nksfsxGW.js → Toggle-l0bt4DX1.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-8D_Jb0be.js → Toggle.stories-CQnDWv6e.js} +1 -1
- package/storybook-static/assets/TreeMultiSelect-BrFx88uE.js +1 -0
- package/storybook-static/assets/{TreeMultiSelect-DQVLotjv.js → TreeMultiSelect-BzKXN_-p.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-Dq3uKD0R.js → TreeMultiSelect.stories-Dbg_4IBP.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-8bo1CHfA.js → TreePickerBase-DiRNy79I.js} +1 -1
- package/storybook-static/assets/{TreeSelect-BScoBM9q.js → TreeSelect-1L4YxMuF.js} +1 -1
- package/storybook-static/assets/{TreeSelect-BJfITfaD.js → TreeSelect-Ryr5xwEV.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-DYtaljqz.js → TreeSelect.stories-bRJplz1I.js} +1 -1
- package/storybook-static/assets/{TreeTable-EVNS645P.js → TreeTable-B5H2S6d8.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-vR8NwLJT.js → TreeTable.stories-DhKxOf9Y.js} +1 -1
- package/storybook-static/assets/{blocks-fBgwENq0.js → blocks-k8_NQe3D.js} +3 -3
- package/storybook-static/assets/{check-DOxef4zQ.js → check-DFoJ7qw2.js} +1 -1
- package/storybook-static/assets/{chevron-down-BicH-8G6.js → chevron-down-BK3QcIgw.js} +1 -1
- package/storybook-static/assets/{chevron-left-BiGgKlTV.js → chevron-left-BZXvWuac.js} +1 -1
- package/storybook-static/assets/{chevron-right-C_v5RuTJ.js → chevron-right-Df49J0bT.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-DX_AXoN6.js → chunk-W22LQPXL-CdOhbWq8.js} +1 -1
- package/storybook-static/assets/{circle-alert-B0Usajbz.js → circle-alert-B_NZODcU.js} +1 -1
- package/storybook-static/assets/{circle-check-ClhYD9WX.js → circle-check-DU6WB2Tc.js} +1 -1
- package/storybook-static/assets/{components-ro8evPtv.js → components-BTWZ08KE.js} +3 -3
- package/storybook-static/assets/{contextMenu-BcNIDq4-.js → contextMenu-Dtfejk82.js} +1 -1
- package/storybook-static/assets/{download-CwjSwIMz.js → download-CpgafCSO.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-IvbhKseM.js → floating-ui.react-6Ph0JA2E.js} +1 -1
- package/storybook-static/assets/formatMultiSelectOptionCount-xGq1uM2H.js +1 -0
- package/storybook-static/assets/{foundationApi-CaFilvwn.js → foundationApi-DIqIwHWJ.js} +1 -1
- package/storybook-static/assets/{foundationLib-sa5BaF26.js → foundationLib-DRYm0u3O.js} +1 -1
- package/storybook-static/assets/{hooks-DnsHfLNZ.js → hooks-B7AHsKh1.js} +1 -1
- package/storybook-static/assets/iframe-Bn7SuTNo.js +1 -0
- package/storybook-static/assets/{iframe-CEXFdp8K.js → iframe-DmEkruYl.js} +4 -4
- package/storybook-static/assets/{info-ugODHoZm.js → info-BzOoa08d.js} +1 -1
- package/storybook-static/assets/{odata-BbknwIAI.js → odata-DuCCq8G1.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-Bw0ypI87.js → odataStoryFixtures-BuE6LYnL.js} +1 -1
- package/storybook-static/assets/{react-xuQ8zOUh.js → react-CQwrc_lN.js} +1 -1
- package/storybook-static/assets/{refresh-cw-p3BCsAiv.js → refresh-cw-BSc2Wznw.js} +1 -1
- package/storybook-static/assets/{settings-2-Dgw5COvw.js → settings-2-DiZDqDHO.js} +1 -1
- package/storybook-static/assets/{sortable-PQ8wFm2i.js → sortable-DHBz0op6.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-dLaISzVM.js → syntaxhighlighter-QEQV7K2Y-DbrECuyo.js} +1 -1
- package/storybook-static/assets/{trash-2-C6u2EV2V.js → trash-2-Co1c8VKG.js} +1 -1
- package/storybook-static/assets/{triangle-alert-Bqj2fQGH.js → triangle-alert-CIl3TL3P.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-DLb2YZHl.js → useODataSelectBase-F-y8dDqn.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-DU7h6rmV.js → useODataTreeData-C1uROydE.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-BUXqAgMs.js → usePickerQuery-XIF3uyW2.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-43_j8ROL.js → usePickerTriggerController-DJ1RhgvB.js} +1 -1
- package/storybook-static/assets/{x-Sefx0Nta.js → x-BGcGcGD5.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/dist/chunks/defaultRenderers-u_Vep6Pj.js +0 -38
- package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +0 -1
- package/dist/multi-select/ui/defaultRenderers.d.ts +0 -17
- package/dist/multi-select/ui/defaultRenderers.d.ts.map +0 -1
- package/storybook-static/assets/MultiSelect-BNSLtPtc.js +0 -2
- package/storybook-static/assets/ShimmerText-Fqy5Uks3.css +0 -1
- package/storybook-static/assets/TreeMultiSelect-CJlTFHic.js +0 -1
- package/storybook-static/assets/defaultRenderers-UxEpV_2H.js +0 -1
- package/storybook-static/assets/iframe-CS8G7D4V.js +0 -1
- /package/storybook-static/assets/{MultiSelect-SJBp1Ymv.css → OptionMultiSelectCore-SJBp1Ymv.css} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/multi-select/ui/MultiSelect.module.scss","../../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":["@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.optionCheckBox {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tflex-shrink: 0;\n\n\t--check-box-control-size: auto;\n\tpadding-left: var(--space-sm);\n}\n\n.optionActionCell {\n\tdisplay: flex;\n\talign-self: stretch;\n\tflex: 1 1 0;\n\tmin-width: 0;\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, { type PropsWithChildren, type Ref, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { CheckBox } from \"../../check-box\";\nimport { Option, OptionButton } from \"../../option\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTrigger,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { type UiBaseProps } from \"../../types\";\n\nimport { createDefaultMultiSelectItemRenderer, createDefaultMultiSelectTokenRenderer, resolveMultiSelectTextKey } from \"./defaultRenderers\";\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\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\n/**\n * Структурированное содержимое опции множественного выбора. `MultiSelect` владеет\n * интерактивной оболочкой и checkbox-слотом, а renderer отвечает только за данные\n * текстовой части, поэтому единая композиция `OptionButton` сохраняется и для\n * произвольного ReactNode.\n */\nexport interface MultiSelectOptionContent {\n\ttext: string;\n\tcode: string | undefined;\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) => MultiSelectOptionContent;\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) => MultiSelectOptionContent;\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 itemKey = getItemKey(item, codeKey);\n\t\tconst selected = selectedKeys.has(itemKey);\n\t\tconst optionDisabled = getOptionDisabled?.(item) ?? false;\n\t\tconst content = renderItem(item, { selected, active, disabled: optionDisabled, query, highlightQuery });\n\n\t\treturn (\n\t\t\t<Option\n\t\t\t\tkey={`${itemKey}-${index}`}\n\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\trole=\"row\"\n\t\t\t\taria-selected={selected}\n\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\tselected={selected}\n\t\t\t\tactive={active}\n\t\t\t\tdisabled={optionDisabled}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"gridcell\"\n\t\t\t\t\tclassName={styles.optionCheckBox}\n\t\t\t\t\tonMouseDown={(event) => event.stopPropagation()}\n\t\t\t\t\tonClick={(event) => event.stopPropagation()}>\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\taria-label={`${selected ? \"Убрать\" : \"Добавить\"} «${content.text}» ${selected ? \"из выбора\" : \"в выбор\"}`}\n\t\t\t\t\t\tonChange={() => toggleOption(item)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div role=\"gridcell\" className={styles.optionActionCell}>\n\t\t\t\t\t<OptionButton\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\taria-label={`Выбрать только «${content.text}»`}\n\t\t\t\t\t\ttext={content.text}\n\t\t\t\t\t\tcode={content.code}\n\t\t\t\t\t\tsearchText={highlightQuery}\n\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\tonClick={() => selectOnlyOption(item)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Option>\n\t\t);\n\t});\n}\n\n/**\n * Поле множественного выбора с внутренним черновиком значений и подтверждением выбора при закрытии списка.\n * Подходит как для самостоятельного использования, так и как базовый слой для OData-оберток.\n */\nexport function MultiSelect({\n\tref,\n\tcodeKey,\n\ttextKey,\n\thideCode,\n\titems,\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tsize,\n\tquery,\n\tdefaultQuery,\n\thighlightQuery,\n\tonQuery,\n\tdefaultFilter = true,\n\tonOpen,\n\tonClose,\n\tgetOptionDisabled,\n\tdisabled,\n\terror,\n\tisLoading,\n\trenderToken,\n\trenderToolbar,\n\trenderItem\n}: MultiSelectProps & { ref?: Ref<HTMLInputElement> }) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = \"search-multi\";\n\tconst committedSelectedItems = value ?? fallback;\n\tconst committedSelectedKeys = useMemo(\n\t\t() => new Set(committedSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t[codeKey, committedSelectedItems]\n\t);\n\tconst availableItems = useMemo(\n\t\t() => items.filter((item) => !committedSelectedKeys.has(getItemKey(item, codeKey))),\n\t\t[codeKey, committedSelectedKeys, items]\n\t);\n\tconst resolvedTextKey = useMemo(\n\t\t() => resolveMultiSelectTextKey([...committedSelectedItems, ...items], codeKey, textKey),\n\t\t[codeKey, committedSelectedItems, items, textKey]\n\t);\n\tconst {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tresetQueryOnClose\n\t} = usePickerQuery({\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\tconst filteredCommittedSelectedItems = usePickerDefaultFilter({\n\t\toptions: committedSelectedItems,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t});\n\tconst filteredAvailableItems = usePickerDefaultFilter({\n\t\toptions: availableItems,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t});\n\tconst visibleOptions = useMemo(\n\t\t() => [...filteredCommittedSelectedItems, ...filteredAvailableItems],\n\t\t[filteredAvailableItems, filteredCommittedSelectedItems]\n\t);\n\tconst selectedIndex = filteredCommittedSelectedItems.length > 0 ? 0 : -1;\n\tconst {\n\t\tdraftValue: draftSelectedItems,\n\t\tsetDraftValue: setDraftSelectedItems,\n\t\tprepareOpen\n\t} = usePickerSelectionLifecycle({\n\t\tvalue: committedSelectedItems,\n\t\topen,\n\t\tonCommit: onChange,\n\t\tonOpen,\n\t\tonClose,\n\t\tisEqual: (left, right) => areSelectionsEqual(left, right, codeKey)\n\t});\n\tconst selectedKeys = useMemo(() => new Set(draftSelectedItems.map((item) => getItemKey(item, codeKey))), [codeKey, draftSelectedItems]);\n\tconst optionDisableContext = useMemo<MultiSelectOptionDisableContext>(\n\t\t() => ({\n\t\t\tselectedItems: draftSelectedItems,\n\t\t\tcommittedSelectedItems,\n\t\t\tselectedKeys,\n\t\t\topen\n\t\t}),\n\t\t[committedSelectedItems, draftSelectedItems, open, selectedKeys]\n\t);\n\tconst isOptionDisabled = useCallback(\n\t\t(item: CollectionItem) => getOptionDisabled?.(item, optionDisableContext) ?? false,\n\t\t[getOptionDisabled, optionDisableContext]\n\t);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: handleOpenChange,\n\t\tonSelect: undefined,\n\t\tdisabled,\n\t\tgetOptionDisabled: isOptionDisabled,\n\t\tcloseOnSelect: false,\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode\n\t});\n\n\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\tconst toggleDraftSelection = (item: CollectionItem) => {\n\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\tconst isSelected = currentItems.some((selectedItem) => getItemKey(selectedItem, codeKey) === itemKey);\n\n\t\t\tif (isSelected) {\n\t\t\t\treturn currentItems.filter((selectedItem) => getItemKey(selectedItem, codeKey) !== itemKey);\n\t\t\t}\n\n\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\treturn currentItems;\n\t\t\t}\n\n\t\t\treturn [...currentItems, item];\n\t\t});\n\t};\n\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\n\t\tif (typeof ref === \"function\") {\n\t\t\tref(node);\n\t\t\treturn;\n\t\t}\n\n\t\tif (ref) {\n\t\t\tref.current = node;\n\t\t}\n\t};\n\n\tconst clearSelection = () => {\n\t\tsetDraftSelectedItems([]);\n\n\t\tif (!open) {\n\t\t\tonChange([]);\n\t\t}\n\t};\n\n\tconst selectAll = () => {\n\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\tconst nextItems = [...currentItems];\n\t\t\tconst selectedKeys = new Set(currentItems.map((item) => getItemKey(item, codeKey)));\n\n\t\t\tfor (const item of visibleOptions) {\n\t\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\t\tif (!selectedKeys.has(itemKey) && !isOptionDisabled(item)) {\n\t\t\t\t\tselectedKeys.add(itemKey);\n\t\t\t\t\tnextItems.push(item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nextItems;\n\t\t});\n\t};\n\n\tconst deselectAll = () => {\n\t\tsetDraftSelectedItems([]);\n\t};\n\n\tconst selectOnlyOption = (item: CollectionItem) => {\n\t\tif (isOptionDisabled(item)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDraftSelectedItems([item]);\n\t\tclose();\n\t};\n\n\tconst currentSelectedItems = open ? draftSelectedItems : committedSelectedItems;\n\tconst hasSelectedItems = currentSelectedItems.length > 0;\n\tconst renderContext: MultiSelectRenderContext = {\n\t\tselectedItems: currentSelectedItems,\n\t\tcommittedSelectedItems,\n\t\tavailableItems: filteredAvailableItems,\n\t\tquery: currentQuery,\n\t\topen,\n\t\tclearSelection,\n\t\tselectAll,\n\t\tdeselectAll\n\t};\n\tconst tokenRenderer =\n\t\trenderToken === undefined ? createDefaultMultiSelectTokenRenderer({ codeKey, textKey: resolvedTextKey }) : renderToken;\n\tconst itemRenderer =\n\t\trenderItem ??\n\t\tcreateDefaultMultiSelectItemRenderer({\n\t\t\tcodeKey,\n\t\t\ttextKey: resolvedTextKey,\n\t\t\thideCode\n\t\t});\n\tconst tokenNode = typeof tokenRenderer === \"function\" ? tokenRenderer(renderContext) : null;\n\tconst toolbarNode = typeof renderToolbar === \"function\" ? renderToolbar(renderContext) : renderToolbar;\n\tconst selectedEntries = filteredCommittedSelectedItems.map((item, index) => ({ item, index }));\n\tconst itemEntries = filteredAvailableItems.map((item, index) => ({ item, index: index + selectedEntries.length }));\n\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: false,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen,\n\t\tonBeforeOpen: () => {\n\t\t\tif (!open) {\n\t\t\t\tprepareOpen();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-grid`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTrigger\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\toptionCount={items.length}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tplaceholderFallback=\"Выберите значения\"\n\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\tselectedValue={tokenNode}\n\t\t\t\t\t\t\thasSelection={hasSelectedItems}\n\t\t\t\t\t\t\tshowSelectedValue={hasSelectedItems && currentQuery.length === 0}\n\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\tonClear={clearSelection}\n\t\t\t\t\t\t\tclearAriaLabel=\"Очистить все\"\n\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"grid\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (open && event.ctrlKey && event.key === \" \") {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tconst activeItem = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\tif (activeItem) {\n\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeItem);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeItem = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\tif (activeItem) {\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption(activeItem);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tariaMultiselectable\n\t\t\t\t\t\t\tpopupRole=\"grid\"\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\ttoolbar={toolbarNode}\n\t\t\t\t\t\t\tselectionActions={\n\t\t\t\t\t\t\t\trenderToolbar === undefined ? { onSelectAll: selectAll, onDeselectAll: deselectAll } : undefined\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t<div role=\"presentation\" className=\"scrollable overscroll h100\">\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableItems.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Separator aria-hidden=\"true\" className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\tentries={itemEntries}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\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-service\";\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 { 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 function ODataMultiSelect({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}: ODataMultiSelectProps) {\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 { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\nimport type { UiBaseProps } from \"../../types\";\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":"index.js","names":[],"sources":["../../src/multi-select/lib/materializeMultiSelectOptions.ts","../../src/multi-select/lib/adaptLegacyMultiSelectContext.ts","../../src/multi-select/lib/resolveLegacyMultiSelectTextKey.ts","../../src/multi-select/lib/multiSelectSelection.ts","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/lib/createMultiSelectOptionSections.ts","../../src/multi-select/ui/MultiSelectOptionRow.tsx","../../src/multi-select/ui/MultiSelectOptionList.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelectOptionsWrapper.tsx","../../src/multi-select/ui/OptionMultiSelectCore.tsx","../../src/multi-select/ui/MultiSelect.tsx","../../src/multi-select/ui/OptionMultiSelect.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":["/**\n * Создаёт mutable-снимок readonly options. Сохранение ссылки включается только\n * legacy-адаптером, чей опубликованный callback-контракт исторически mutable.\n */\nexport function materializeMultiSelectOptions<TOption>(options: readonly TOption[], preserveArrayReference = false): TOption[] {\n\tif (preserveArrayReference && Array.isArray(options)) {\n\t\treturn options;\n\t}\n\n\treturn [...options];\n}\n","import { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { type MultiSelectOptionDisableContext, type MultiSelectRenderContext } from \"../ui/legacyMultiSelectTypes\";\nimport { type OptionMultiSelectOptionDisableContext, type OptionMultiSelectRenderContext } from \"../ui/optionMultiSelectTypes\";\n\nimport { materializeMultiSelectOptions } from \"./materializeMultiSelectOptions\";\n\n/** Преобразует generic render-context в опубликованный legacy-контракт. */\nexport function adaptLegacyMultiSelectRenderContext(context: OptionMultiSelectRenderContext<CollectionItem>): MultiSelectRenderContext {\n\treturn {\n\t\tselectedItems: materializeMultiSelectOptions(context.selectedOptions, true),\n\t\tcommittedSelectedItems: materializeMultiSelectOptions(context.committedSelectedOptions, true),\n\t\tavailableItems: materializeMultiSelectOptions(context.availableOptions, true),\n\t\tquery: context.query,\n\t\topen: context.open,\n\t\tclearSelection: context.clearSelection,\n\t\tselectAll: context.selectAll,\n\t\tdeselectAll: context.deselectAll\n\t};\n}\n\n/** Преобразует generic disable-context без изменения identity выбранных элементов. */\nexport function adaptLegacyMultiSelectOptionDisableContext(\n\tcontext: OptionMultiSelectOptionDisableContext<CollectionItem>\n): MultiSelectOptionDisableContext {\n\treturn {\n\t\tselectedItems: materializeMultiSelectOptions(context.selectedOptions, true),\n\t\tcommittedSelectedItems: materializeMultiSelectOptions(context.committedSelectedOptions, true),\n\t\tselectedKeys: context.selectedKeys,\n\t\topen: context.open\n\t};\n}\n","import { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\n/** Сохраняет исходное правило вывода textKey для legacy code/text API. */\nexport function resolveLegacyMultiSelectTextKey(items: readonly 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","import { type OptionMultiSelectOptionKey } from \"../ui/optionMultiSelectTypes\";\n\n/** Сравнивает наборы выбора по identity опций, не связывая их с object reference. */\nexport function areMultiSelectSelectionsEqual<TOption>(\n\tleft: readonly TOption[],\n\tright: readonly TOption[],\n\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey\n): boolean {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map(getOptionKey));\n\n\treturn left.every((option) => rightKeys.has(getOptionKey(option)));\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.optionCheckBox {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tflex-shrink: 0;\n\n\t--check-box-control-size: auto;\n\tpadding-left: var(--space-sm);\n}\n\n.optionActionCell {\n\tdisplay: flex;\n\talign-self: stretch;\n\tflex: 1 1 0;\n\tmin-width: 0;\n}\n","import { type OptionMultiSelectOptionGroup } from \"../ui/optionMultiSelectTypes\";\n\nexport type MultiSelectOptionEntry<TOption> = Readonly<{\n\toption: TOption;\n\tindex: number;\n}>;\n\nexport type MultiSelectOptionSection<TOption> = Readonly<{\n\tgroup: OptionMultiSelectOptionGroup | undefined;\n\tentries: readonly MultiSelectOptionEntry<TOption>[];\n}>;\n\n/**\n * Группирует только соседние опции и сохраняет их глобальные индексы. Благодаря\n * этому визуальные заголовки не попадают в active-index клавиатурной навигации.\n */\nexport function createMultiSelectOptionSections<TOption>(\n\tentries: readonly MultiSelectOptionEntry<TOption>[],\n\tgetOptionGroup: (option: TOption) => OptionMultiSelectOptionGroup | undefined\n): readonly MultiSelectOptionSection<TOption>[] {\n\tconst sections: Array<{\n\t\tgroup: OptionMultiSelectOptionGroup | undefined;\n\t\tentries: MultiSelectOptionEntry<TOption>[];\n\t}> = [];\n\n\tfor (const entry of entries) {\n\t\tconst group = getOptionGroup(entry.option);\n\t\tconst currentSection = sections.at(-1);\n\t\tconst belongsToCurrentSection = currentSection?.group?.key === group?.key;\n\n\t\tif (currentSection && belongsToCurrentSection) {\n\t\t\tcurrentSection.entries.push(entry);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsections.push({ group, entries: [entry] });\n\t}\n\n\treturn sections;\n}\n","import { CheckBox } from \"../../check-box\";\nimport { Option, OptionButton } from \"../../option\";\n\nimport styles from \"./MultiSelect.module.scss\";\nimport {\n\ttype OptionMultiSelectOptionContent,\n\ttype OptionMultiSelectOptionKey,\n\ttype OptionMultiSelectOptionState\n} from \"./optionMultiSelectTypes\";\n\ntype MultiSelectOptionRowProps<TOption> = Readonly<{\n\toption: TOption;\n\tindex: number;\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: ReadonlySet<OptionMultiSelectOptionKey>;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (option: TOption) => void;\n\tselectOnlyOption: (option: TOption) => void;\n\trenderOption: (option: TOption, state: OptionMultiSelectOptionState) => OptionMultiSelectOptionContent;\n}>;\n\n/** Одна интерактивная строка grid: checkbox меняет draft, основная кнопка подтверждает только эту опцию. */\nexport function MultiSelectOptionRow<TOption>({\n\toption,\n\tindex,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tquery,\n\thighlightQuery,\n\tgetOptionKey,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderOption\n}: MultiSelectOptionRowProps<TOption>) {\n\tconst active = index === activeIndex;\n\tconst optionKey = getOptionKey(option);\n\tconst selected = selectedKeys.has(optionKey);\n\tconst optionDisabled = getOptionDisabled?.(option) ?? false;\n\tconst content = renderOption(option, { selected, active, disabled: optionDisabled, query, highlightQuery });\n\n\treturn (\n\t\t<Option\n\t\t\tid={getOptionId(listId, index)}\n\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\trole=\"row\"\n\t\t\taria-selected={selected}\n\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\tselected={selected}\n\t\t\tactive={active}\n\t\t\tdisabled={optionDisabled}>\n\t\t\t<div\n\t\t\t\trole=\"gridcell\"\n\t\t\t\tclassName={styles.optionCheckBox}\n\t\t\t\tonMouseDown={(event) => event.stopPropagation()}\n\t\t\t\tonClick={(event) => event.stopPropagation()}>\n\t\t\t\t<CheckBox\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\taria-label={`${selected ? \"Убрать\" : \"Добавить\"} «${content.text}» ${selected ? \"из выбора\" : \"в выбор\"}`}\n\t\t\t\t\tonChange={() => toggleOption(option)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div role=\"gridcell\" className={styles.optionActionCell}>\n\t\t\t\t<OptionButton\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\taria-label={`Выбрать только «${content.text}»`}\n\t\t\t\t\ttext={content.text}\n\t\t\t\t\tcode={content.code}\n\t\t\t\t\tsearchText={highlightQuery}\n\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\tonClick={() => selectOnlyOption(option)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</Option>\n\t);\n}\n","import { Fragment } from \"react\";\n\nimport uiStyles from \"../../ui.module.scss\";\nimport { createMultiSelectOptionSections, type MultiSelectOptionEntry } from \"../lib/createMultiSelectOptionSections\";\n\nimport { MultiSelectOptionRow } from \"./MultiSelectOptionRow\";\nimport {\n\ttype OptionMultiSelectOptionContent,\n\ttype OptionMultiSelectOptionGroup,\n\ttype OptionMultiSelectOptionKey,\n\ttype OptionMultiSelectOptionState\n} from \"./optionMultiSelectTypes\";\n\ntype MultiSelectOptionListProps<TOption> = Readonly<{\n\tentries: readonly MultiSelectOptionEntry<TOption>[];\n\tsectionId: string;\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: ReadonlySet<OptionMultiSelectOptionKey>;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey;\n\tgetOptionGroup?: (option: TOption) => OptionMultiSelectOptionGroup | undefined;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (option: TOption) => void;\n\tselectOnlyOption: (option: TOption) => void;\n\trenderOption: (option: TOption, state: OptionMultiSelectOptionState) => OptionMultiSelectOptionContent;\n}>;\n\n/** Рендерит одну selected/available-секцию, сохраняя global option indexes при группировке. */\nexport function MultiSelectOptionList<TOption>({ entries, sectionId, getOptionGroup, ...rowProps }: MultiSelectOptionListProps<TOption>) {\n\tconst sections = getOptionGroup ? createMultiSelectOptionSections(entries, getOptionGroup) : [{ group: undefined, entries }];\n\n\treturn sections.map((section, sectionIndex) => {\n\t\tconst rows = section.entries.map(({ option, index }) => (\n\t\t\t<MultiSelectOptionRow key={`${rowProps.getOptionKey(option)}-${index}`} option={option} index={index} {...rowProps} />\n\t\t));\n\n\t\tif (!section.group) {\n\t\t\treturn <Fragment key={`${sectionId}-ungrouped-${sectionIndex}`}>{rows}</Fragment>;\n\t\t}\n\n\t\tconst groupLabelId = `${sectionId}-group-${sectionIndex}`;\n\n\t\treturn (\n\t\t\t<div key={`${sectionId}-${section.group.key}-${sectionIndex}`} role=\"rowgroup\" aria-labelledby={groupLabelId}>\n\t\t\t\t<div id={groupLabelId} role=\"row\" className={uiStyles.uiPopupGroupLabel}>\n\t\t\t\t\t<div role=\"gridcell\">{section.group.label}</div>\n\t\t\t\t</div>\n\t\t\t\t{rows}\n\t\t\t</div>\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 { type PropsWithChildren } from \"react\";\n\nimport { PickerStatus } from \"../../picker\";\n\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\ntype MultiSelectOptionsWrapperProps = PropsWithChildren<{\n\tisNoData?: boolean;\n\terror?: string;\n}>;\n\n/** Выбирает одно доступное состояние тела popup, не меняя структуру самого grid. */\nexport function MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsWrapperProps) {\n\tif (isNoData) {\n\t\treturn <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\t}\n\n\tif (error) {\n\t\treturn <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\t}\n\n\treturn <>{children}</>;\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n\textractPickerTextContent,\n\tPickerField,\n\tPickerPopup,\n\tPickerTrigger,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { formatMultiSelectOptionCount } from \"../lib/formatMultiSelectOptionCount\";\nimport { materializeMultiSelectOptions } from \"../lib/materializeMultiSelectOptions\";\nimport { areMultiSelectSelectionsEqual } from \"../lib/multiSelectSelection\";\n\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionList } from \"./MultiSelectOptionList\";\nimport { MultiSelectOptionsWrapper } from \"./MultiSelectOptionsWrapper\";\nimport { type OptionMultiSelectProps } from \"./OptionMultiSelect\";\nimport { type OptionMultiSelectOptionDisableContext } from \"./optionMultiSelectTypes\";\n\ntype OptionMultiSelectCoreProps<TOption> = OptionMultiSelectProps<TOption> &\n\tReadonly<{\n\t\t/** Сохраняет опубликованную ссылочную семантику только для legacy MultiSelect. */\n\t\tpreserveOptionArrayReference?: boolean;\n\t}>;\n\n/**\n * Единая generic-реализация множественного выбора. Публичные компоненты только\n * адаптируют свои контракты к этим selector-функциям, поэтому focus и a11y\n * поведение не расходятся между новым и legacy API.\n */\nexport function OptionMultiSelectCore<TOption>({\n\tref,\n\toptions,\n\tvalue,\n\tonChange,\n\tgetOptionKey,\n\tgetOptionLabel,\n\tgetOptionCode,\n\tgetOptionGroup,\n\tgetOptionSearchText,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tsize,\n\tquery,\n\tdefaultQuery,\n\thighlightQuery,\n\tonQuery,\n\tdefaultFilter = true,\n\tonOpen,\n\tonClose,\n\tgetOptionDisabled,\n\tdisabled,\n\terror,\n\tisLoading,\n\trenderToken,\n\trenderToolbar,\n\trenderOption,\n\tpreserveOptionArrayReference = false\n}: OptionMultiSelectCoreProps<TOption>) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = \"search-multi\";\n\tconst committedSelectedOptions = useMemo(\n\t\t() => materializeMultiSelectOptions(value, preserveOptionArrayReference),\n\t\t[preserveOptionArrayReference, value]\n\t);\n\tconst committedSelectedKeys = useMemo(\n\t\t() => new Set(committedSelectedOptions.map(getOptionKey)),\n\t\t[committedSelectedOptions, getOptionKey]\n\t);\n\tconst availableOptions = useMemo(\n\t\t() => options.filter((option) => !committedSelectedKeys.has(getOptionKey(option))),\n\t\t[committedSelectedKeys, getOptionKey, options]\n\t);\n\tconst {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tresetQueryOnClose\n\t} = usePickerQuery({\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\tconst getSearchText = useCallback(\n\t\t(option: TOption) =>\n\t\t\tgetOptionSearchText?.(option) ??\n\t\t\t[getOptionLabel(option), getOptionCode?.(option), extractPickerTextContent(getOptionGroup?.(option)?.label)].filter(\n\t\t\t\t(part): part is string => Boolean(part)\n\t\t\t),\n\t\t[getOptionCode, getOptionGroup, getOptionLabel, getOptionSearchText]\n\t);\n\tconst filteredCommittedSelectedOptions = usePickerDefaultFilter({\n\t\toptions: committedSelectedOptions,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText\n\t});\n\tconst filteredAvailableOptions = usePickerDefaultFilter({\n\t\toptions: availableOptions,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText\n\t});\n\tconst visibleOptions = useMemo(\n\t\t() => [...filteredCommittedSelectedOptions, ...filteredAvailableOptions],\n\t\t[filteredAvailableOptions, filteredCommittedSelectedOptions]\n\t);\n\tconst selectedIndex = filteredCommittedSelectedOptions.length > 0 ? 0 : -1;\n\tconst compareSelections = useCallback(\n\t\t(left: TOption[], right: TOption[]) => areMultiSelectSelectionsEqual(left, right, getOptionKey),\n\t\t[getOptionKey]\n\t);\n\tconst {\n\t\tdraftValue: draftSelectedOptions,\n\t\tsetDraftValue: setDraftSelectedOptions,\n\t\tprepareOpen\n\t} = usePickerSelectionLifecycle({\n\t\tvalue: committedSelectedOptions,\n\t\topen,\n\t\tonCommit: onChange,\n\t\tonOpen,\n\t\tonClose,\n\t\tisEqual: compareSelections\n\t});\n\tconst selectedKeys = useMemo(() => new Set(draftSelectedOptions.map(getOptionKey)), [draftSelectedOptions, getOptionKey]);\n\tconst optionDisableContext = useMemo<OptionMultiSelectOptionDisableContext<TOption>>(\n\t\t() => ({\n\t\t\tselectedOptions: draftSelectedOptions,\n\t\t\tcommittedSelectedOptions,\n\t\t\tselectedKeys,\n\t\t\topen\n\t\t}),\n\t\t[committedSelectedOptions, draftSelectedOptions, open, selectedKeys]\n\t);\n\tconst isOptionDisabled = useCallback(\n\t\t(option: TOption) => getOptionDisabled?.(option, optionDisableContext) ?? false,\n\t\t[getOptionDisabled, optionDisableContext]\n\t);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: handleOpenChange,\n\t\tonSelect: undefined,\n\t\tdisabled,\n\t\tgetOptionDisabled: isOptionDisabled,\n\t\tcloseOnSelect: false,\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode\n\t});\n\n\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\tconst toggleDraftSelection = (option: TOption) => {\n\t\tconst optionKey = getOptionKey(option);\n\n\t\tsetDraftSelectedOptions((currentOptions) => {\n\t\t\tconst isSelected = currentOptions.some((selectedOption) => getOptionKey(selectedOption) === optionKey);\n\n\t\t\tif (isSelected) {\n\t\t\t\treturn currentOptions.filter((selectedOption) => getOptionKey(selectedOption) !== optionKey);\n\t\t\t}\n\n\t\t\tif (isOptionDisabled(option)) {\n\t\t\t\treturn currentOptions;\n\t\t\t}\n\n\t\t\treturn [...currentOptions, option];\n\t\t});\n\t};\n\n\tconst setInputNode = useCallback(\n\t\t(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\t\t[ref]\n\t);\n\n\tconst clearSelection = () => {\n\t\tsetDraftSelectedOptions([]);\n\n\t\tif (!open) {\n\t\t\tonChange([]);\n\t\t}\n\t};\n\n\tconst selectAll = () => {\n\t\tsetDraftSelectedOptions((currentOptions) => {\n\t\t\tconst nextOptions = [...currentOptions];\n\t\t\tconst nextSelectedKeys = new Set(currentOptions.map(getOptionKey));\n\n\t\t\tfor (const option of visibleOptions) {\n\t\t\t\tconst optionKey = getOptionKey(option);\n\n\t\t\t\tif (!nextSelectedKeys.has(optionKey) && !isOptionDisabled(option)) {\n\t\t\t\t\tnextSelectedKeys.add(optionKey);\n\t\t\t\t\tnextOptions.push(option);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nextOptions;\n\t\t});\n\t};\n\n\tconst deselectAll = () => {\n\t\tsetDraftSelectedOptions([]);\n\t};\n\n\tconst selectOnlyOption = (option: TOption) => {\n\t\tif (isOptionDisabled(option)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDraftSelectedOptions([option]);\n\t\tclose();\n\t};\n\n\tconst currentSelectedOptions = open ? draftSelectedOptions : committedSelectedOptions;\n\tconst hasSelectedOptions = currentSelectedOptions.length > 0;\n\tconst renderContext = {\n\t\tselectedOptions: currentSelectedOptions,\n\t\tcommittedSelectedOptions,\n\t\tavailableOptions: filteredAvailableOptions,\n\t\tquery: currentQuery,\n\t\topen,\n\t\tclearSelection,\n\t\tselectAll,\n\t\tdeselectAll\n\t};\n\tconst defaultTokenNode =\n\t\tcurrentSelectedOptions.length > 1\n\t\t\t? formatMultiSelectOptionCount(currentSelectedOptions.length)\n\t\t\t: currentSelectedOptions.length === 1\n\t\t\t\t? getOptionLabel(currentSelectedOptions[0])\n\t\t\t\t: undefined;\n\tconst tokenNode = renderToken === undefined ? defaultTokenNode : typeof renderToken === \"function\" ? renderToken(renderContext) : null;\n\tconst toolbarNode = typeof renderToolbar === \"function\" ? renderToolbar(renderContext) : renderToolbar;\n\tconst renderDefaultOption = useCallback(\n\t\t(option: TOption) => ({ text: getOptionLabel(option), code: getOptionCode?.(option) }),\n\t\t[getOptionCode, getOptionLabel]\n\t);\n\tconst optionRenderer = renderOption ?? renderDefaultOption;\n\tconst selectedEntries = filteredCommittedSelectedOptions.map((option, index) => ({ option, index }));\n\tconst availableEntries = filteredAvailableOptions.map((option, index) => ({\n\t\toption,\n\t\tindex: index + selectedEntries.length\n\t}));\n\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: false,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen,\n\t\tonBeforeOpen: () => {\n\t\t\tif (!open) {\n\t\t\t\tprepareOpen();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-grid`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTrigger\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\toptionCount={options.length}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tplaceholderFallback=\"Выберите значения\"\n\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\tselectedValue={tokenNode}\n\t\t\t\t\t\t\thasSelection={hasSelectedOptions}\n\t\t\t\t\t\t\tshowSelectedValue={hasSelectedOptions && currentQuery.length === 0}\n\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\tonClear={clearSelection}\n\t\t\t\t\t\t\tclearAriaLabel=\"Очистить все\"\n\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"grid\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (open && event.ctrlKey && event.key === \" \") {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tconst activeOption = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\tif (activeIndex >= 0 && activeIndex < visibleOptions.length) {\n\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeOption);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeOption = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0 && activeIndex < visibleOptions.length) {\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption(activeOption);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tariaMultiselectable\n\t\t\t\t\t\t\tpopupRole=\"grid\"\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\ttoolbar={toolbarNode}\n\t\t\t\t\t\t\tselectionActions={\n\t\t\t\t\t\t\t\trenderToolbar === undefined ? { onSelectAll: selectAll, onDeselectAll: deselectAll } : undefined\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t<div role=\"presentation\" className=\"scrollable overscroll h100\">\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionList\n\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\tsectionId={`${listId}-selected`}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionKey={getOptionKey}\n\t\t\t\t\t\t\t\t\t\tgetOptionGroup={getOptionGroup}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderOption={optionRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableEntries.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Separator aria-hidden=\"true\" className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionList\n\t\t\t\t\t\t\t\t\t\tentries={availableEntries}\n\t\t\t\t\t\t\t\t\t\tsectionId={`${listId}-available`}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionKey={getOptionKey}\n\t\t\t\t\t\t\t\t\t\tgetOptionGroup={getOptionGroup}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderOption={optionRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n","import { type ReactNode, type Ref, useMemo } from \"react\";\n\nimport { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { type UiBaseProps } from \"../../types\";\nimport { adaptLegacyMultiSelectOptionDisableContext, adaptLegacyMultiSelectRenderContext } from \"../lib/adaptLegacyMultiSelectContext\";\nimport { resolveLegacyMultiSelectTextKey } from \"../lib/resolveLegacyMultiSelectTextKey\";\n\nimport {\n\ttype MultiSelectItemState,\n\ttype MultiSelectOptionContent,\n\ttype MultiSelectOptionDisableContext,\n\ttype MultiSelectRenderContext\n} from \"./legacyMultiSelectTypes\";\nimport { OptionMultiSelectCore } from \"./OptionMultiSelectCore\";\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: MultiSelectItemState) => MultiSelectOptionContent;\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\n/**\n * Совместимый адаптер исходного codeKey/textKey API. Новым typed-consumers следует\n * использовать `OptionMultiSelect`, а OData-обёртки продолжают работать через\n * опубликованный контракт без изменения selection semantics.\n */\nexport function MultiSelect({\n\tref,\n\tcodeKey,\n\ttextKey,\n\thideCode,\n\titems,\n\tvalue,\n\tonChange,\n\tgetOptionDisabled,\n\tonClose,\n\trenderToken,\n\trenderToolbar,\n\trenderItem,\n\t...props\n}: MultiSelectProps & { ref?: Ref<HTMLInputElement> }) {\n\tconst selectedItems = useMemo(() => value ?? [], [value]);\n\tconst resolvedTextKey = useMemo(\n\t\t() => resolveLegacyMultiSelectTextKey([...selectedItems, ...items], codeKey, textKey),\n\t\t[codeKey, items, selectedItems, textKey]\n\t);\n\tconst adaptedRenderToken =\n\t\ttypeof renderToken === \"function\"\n\t\t\t? (context: Parameters<typeof adaptLegacyMultiSelectRenderContext>[0]) =>\n\t\t\t\t\trenderToken(adaptLegacyMultiSelectRenderContext(context))\n\t\t\t: renderToken;\n\tconst adaptedRenderToolbar =\n\t\ttypeof renderToolbar === \"function\"\n\t\t\t? (context: Parameters<typeof adaptLegacyMultiSelectRenderContext>[0]) =>\n\t\t\t\t\trenderToolbar(adaptLegacyMultiSelectRenderContext(context))\n\t\t\t: renderToolbar;\n\n\treturn (\n\t\t<OptionMultiSelectCore\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tpreserveOptionArrayReference\n\t\t\toptions={items}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionKey={(item) => item[codeKey]}\n\t\t\tgetOptionLabel={(item) => item[resolvedTextKey] ?? item[codeKey] ?? \"\"}\n\t\t\tgetOptionCode={hideCode ? undefined : (item) => item[codeKey] ?? \"\"}\n\t\t\tgetOptionSearchText={(item) => Array.from(new Set([item[resolvedTextKey], item[codeKey], ...Object.values(item)]))}\n\t\t\tgetOptionDisabled={\n\t\t\t\tgetOptionDisabled\n\t\t\t\t\t? (item, context) => getOptionDisabled(item, adaptLegacyMultiSelectOptionDisableContext(context))\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tonClose={onClose}\n\t\t\trenderToken={adaptedRenderToken}\n\t\t\trenderToolbar={adaptedRenderToolbar}\n\t\t\trenderOption={\n\t\t\t\trenderItem\n\t\t\t\t\t? (item, state) => renderItem(item, state)\n\t\t\t\t\t: (item) => ({\n\t\t\t\t\t\t\ttext: item[resolvedTextKey] ?? \"\",\n\t\t\t\t\t\t\tcode: hideCode ? undefined : (item[codeKey] ?? \"\")\n\t\t\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n}\n\nMultiSelect.displayName = \"MultiSelect\";\n\nexport {\n\ttype MultiSelectItemState,\n\ttype MultiSelectOptionContent,\n\ttype MultiSelectOptionDisableContext,\n\ttype MultiSelectRenderContext\n} from \"./legacyMultiSelectTypes\";\n","import { type Ref } from \"react\";\n\nimport { type UiBaseProps } from \"../../types\";\n\nimport { OptionMultiSelectCore } from \"./OptionMultiSelectCore\";\nimport {\n\ttype OptionMultiSelectOptionDisableContext,\n\ttype OptionMultiSelectOptionGroup,\n\ttype OptionMultiSelectOptionKey,\n\ttype OptionMultiSelectRenderers\n} from \"./optionMultiSelectTypes\";\n\n/**\n * Типобезопасный контракт множественного выбора. Опция остаётся в исходной\n * domain/view-model форме, а UI получает только необходимые selector-функции.\n */\nexport type OptionMultiSelectProps<TOption> = OptionMultiSelectRenderers<TOption> &\n\tOmit<UiBaseProps<TOption[], readonly TOption[]>, \"onChange\"> &\n\tReadonly<{\n\t\tref?: Ref<HTMLInputElement>;\n\t\toptions: readonly TOption[];\n\t\tonChange: (value: TOption[]) => void;\n\t\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey;\n\t\tgetOptionLabel: (option: TOption) => string;\n\t\tgetOptionCode?: (option: TOption) => string | undefined;\n\t\tgetOptionGroup?: (option: TOption) => OptionMultiSelectOptionGroup | undefined;\n\t\tgetOptionSearchText?: (option: TOption) => string | readonly string[];\n\t\tgetOptionDisabled?: (option: TOption, context: OptionMultiSelectOptionDisableContext<TOption>) => boolean;\n\t\tquery?: string;\n\t\tdefaultQuery?: string;\n\t\thighlightQuery?: string;\n\t\tonQuery?: (value: string) => void;\n\t\tdefaultFilter?: boolean;\n\t\tonOpen?: () => void;\n\t\tonClose?: (value: TOption[]) => void;\n\t\terror?: string;\n\t\tisLoading?: boolean;\n\t}>;\n\n/** Множественный выбор для произвольной типизированной коллекции опций. */\nexport function OptionMultiSelect<TOption>(props: OptionMultiSelectProps<TOption>) {\n\treturn <OptionMultiSelectCore {...props} />;\n}\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\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 { 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 function ODataMultiSelect({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}: ODataMultiSelectProps) {\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 { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\nimport type { UiBaseProps } from \"../../types\";\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,8 @@
|
|
|
1
|
+
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
2
|
+
import { type MultiSelectOptionDisableContext, type MultiSelectRenderContext } from "../ui/legacyMultiSelectTypes";
|
|
3
|
+
import { type OptionMultiSelectOptionDisableContext, type OptionMultiSelectRenderContext } from "../ui/optionMultiSelectTypes";
|
|
4
|
+
/** Преобразует generic render-context в опубликованный legacy-контракт. */
|
|
5
|
+
export declare function adaptLegacyMultiSelectRenderContext(context: OptionMultiSelectRenderContext<CollectionItem>): MultiSelectRenderContext;
|
|
6
|
+
/** Преобразует generic disable-context без изменения identity выбранных элементов. */
|
|
7
|
+
export declare function adaptLegacyMultiSelectOptionDisableContext(context: OptionMultiSelectOptionDisableContext<CollectionItem>): MultiSelectOptionDisableContext;
|
|
8
|
+
//# sourceMappingURL=adaptLegacyMultiSelectContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptLegacyMultiSelectContext.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/adaptLegacyMultiSelectContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,KAAK,+BAA+B,EAAE,KAAK,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACnH,OAAO,EAAE,KAAK,qCAAqC,EAAE,KAAK,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAI/H,2EAA2E;AAC3E,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,8BAA8B,CAAC,cAAc,CAAC,GAAG,wBAAwB,CAWrI;AAED,sFAAsF;AACtF,wBAAgB,0CAA0C,CACzD,OAAO,EAAE,qCAAqC,CAAC,cAAc,CAAC,GAC5D,+BAA+B,CAOjC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type OptionMultiSelectOptionGroup } from "../ui/optionMultiSelectTypes";
|
|
2
|
+
export type MultiSelectOptionEntry<TOption> = Readonly<{
|
|
3
|
+
option: TOption;
|
|
4
|
+
index: number;
|
|
5
|
+
}>;
|
|
6
|
+
export type MultiSelectOptionSection<TOption> = Readonly<{
|
|
7
|
+
group: OptionMultiSelectOptionGroup | undefined;
|
|
8
|
+
entries: readonly MultiSelectOptionEntry<TOption>[];
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Группирует только соседние опции и сохраняет их глобальные индексы. Благодаря
|
|
12
|
+
* этому визуальные заголовки не попадают в active-index клавиатурной навигации.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createMultiSelectOptionSections<TOption>(entries: readonly MultiSelectOptionEntry<TOption>[], getOptionGroup: (option: TOption) => OptionMultiSelectOptionGroup | undefined): readonly MultiSelectOptionSection<TOption>[];
|
|
15
|
+
//# sourceMappingURL=createMultiSelectOptionSections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMultiSelectOptionSections.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/createMultiSelectOptionSections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEjF,MAAM,MAAM,sBAAsB,CAAC,OAAO,IAAI,QAAQ,CAAC;IACtD,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,MAAM,wBAAwB,CAAC,OAAO,IAAI,QAAQ,CAAC;IACxD,KAAK,EAAE,4BAA4B,GAAG,SAAS,CAAC;IAChD,OAAO,EAAE,SAAS,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EACtD,OAAO,EAAE,SAAS,sBAAsB,CAAC,OAAO,CAAC,EAAE,EACnD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,4BAA4B,GAAG,SAAS,GAC3E,SAAS,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAoB9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatMultiSelectOptionCount.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/formatMultiSelectOptionCount.ts"],"names":[],"mappings":"AAQA,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Создаёт mutable-снимок readonly options. Сохранение ссылки включается только
|
|
3
|
+
* legacy-адаптером, чей опубликованный callback-контракт исторически mutable.
|
|
4
|
+
*/
|
|
5
|
+
export declare function materializeMultiSelectOptions<TOption>(options: readonly TOption[], preserveArrayReference?: boolean): TOption[];
|
|
6
|
+
//# sourceMappingURL=materializeMultiSelectOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializeMultiSelectOptions.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/materializeMultiSelectOptions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,sBAAsB,UAAQ,GAAG,OAAO,EAAE,CAM7H"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type OptionMultiSelectOptionKey } from "../ui/optionMultiSelectTypes";
|
|
2
|
+
/** Сравнивает наборы выбора по identity опций, не связывая их с object reference. */
|
|
3
|
+
export declare function areMultiSelectSelectionsEqual<TOption>(left: readonly TOption[], right: readonly TOption[], getOptionKey: (option: TOption) => OptionMultiSelectOptionKey): boolean;
|
|
4
|
+
//# sourceMappingURL=multiSelectSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiSelectSelection.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/multiSelectSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE/E,qFAAqF;AACrF,wBAAgB,6BAA6B,CAAC,OAAO,EACpD,IAAI,EAAE,SAAS,OAAO,EAAE,EACxB,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,0BAA0B,GAC3D,OAAO,CAQT"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
2
|
+
/** Сохраняет исходное правило вывода textKey для legacy code/text API. */
|
|
3
|
+
export declare function resolveLegacyMultiSelectTextKey(items: readonly CollectionItem[], codeKey: string, textKey?: string): string;
|
|
4
|
+
//# sourceMappingURL=resolveLegacyMultiSelectTextKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveLegacyMultiSelectTextKey.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/resolveLegacyMultiSelectTextKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,0EAA0E;AAC1E,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,UAYlH"}
|
|
@@ -1,40 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type ReactNode, type Ref } from "react";
|
|
2
|
+
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
2
3
|
import { type UiBaseProps } from "../../types";
|
|
3
|
-
import type
|
|
4
|
-
|
|
5
|
-
selected: boolean;
|
|
6
|
-
active: boolean;
|
|
7
|
-
disabled: boolean;
|
|
8
|
-
query: string;
|
|
9
|
-
highlightQuery: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Структурированное содержимое опции множественного выбора. `MultiSelect` владеет
|
|
13
|
-
* интерактивной оболочкой и checkbox-слотом, а renderer отвечает только за данные
|
|
14
|
-
* текстовой части, поэтому единая композиция `OptionButton` сохраняется и для
|
|
15
|
-
* произвольного ReactNode.
|
|
16
|
-
*/
|
|
17
|
-
export interface MultiSelectOptionContent {
|
|
18
|
-
text: string;
|
|
19
|
-
code: string | undefined;
|
|
20
|
-
}
|
|
21
|
-
export interface MultiSelectRenderContext {
|
|
22
|
-
selectedItems: CollectionItem[];
|
|
23
|
-
committedSelectedItems: CollectionItem[];
|
|
24
|
-
availableItems: CollectionItem[];
|
|
25
|
-
query: string;
|
|
26
|
-
open: boolean;
|
|
27
|
-
clearSelection: () => void;
|
|
28
|
-
selectAll: () => void;
|
|
29
|
-
deselectAll: () => void;
|
|
30
|
-
}
|
|
31
|
-
export interface MultiSelectOptionDisableContext {
|
|
32
|
-
selectedItems: CollectionItem[];
|
|
33
|
-
committedSelectedItems: CollectionItem[];
|
|
34
|
-
selectedKeys: ReadonlySet<string>;
|
|
35
|
-
open: boolean;
|
|
36
|
-
}
|
|
37
|
-
type MultiSelectOptionalRenderer<TContext> = ((context: TContext) => React.ReactNode) | null | false;
|
|
4
|
+
import { type MultiSelectItemState, type MultiSelectOptionContent, type MultiSelectOptionDisableContext, type MultiSelectRenderContext } from "./legacyMultiSelectTypes";
|
|
5
|
+
type MultiSelectOptionalRenderer<TContext> = ((context: TContext) => ReactNode) | null | false;
|
|
38
6
|
interface MultiSelectRenderers {
|
|
39
7
|
renderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;
|
|
40
8
|
renderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;
|
|
@@ -57,14 +25,15 @@ export interface MultiSelectProps<TOption extends Record<string, string> = Colle
|
|
|
57
25
|
isLoading?: boolean;
|
|
58
26
|
}
|
|
59
27
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
28
|
+
* Совместимый адаптер исходного codeKey/textKey API. Новым typed-consumers следует
|
|
29
|
+
* использовать `OptionMultiSelect`, а OData-обёртки продолжают работать через
|
|
30
|
+
* опубликованный контракт без изменения selection semantics.
|
|
62
31
|
*/
|
|
63
|
-
export declare function MultiSelect({ ref, codeKey, textKey, hideCode, items, value, onChange,
|
|
32
|
+
export declare function MultiSelect({ ref, codeKey, textKey, hideCode, items, value, onChange, getOptionDisabled, onClose, renderToken, renderToolbar, renderItem, ...props }: MultiSelectProps & {
|
|
64
33
|
ref?: Ref<HTMLInputElement>;
|
|
65
|
-
}):
|
|
34
|
+
}): import("react").JSX.Element;
|
|
66
35
|
export declare namespace MultiSelect {
|
|
67
36
|
var displayName: string;
|
|
68
37
|
}
|
|
69
|
-
export {};
|
|
38
|
+
export { type MultiSelectItemState, type MultiSelectOptionContent, type MultiSelectOptionDisableContext, type MultiSelectRenderContext } from "./legacyMultiSelectTypes";
|
|
70
39
|
//# sourceMappingURL=MultiSelect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAW,MAAM,OAAO,CAAC;AAE1D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,MAAM,0BAA0B,CAAC;AAGlC,KAAK,2BAA2B,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAE/F,UAAU,oBAAoB;IAC7B,WAAW,CAAC,EAAE,2BAA2B,CAAC,wBAAwB,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,2BAA2B,CAAC,wBAAwB,CAAC,CAAC;IACtE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,oBAAoB,KAAK,wBAAwB,CAAC;CAC7F;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CACxF,SAAQ,oBAAoB,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC;IACzF,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC3B,GAAG,EACH,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,aAAa,EACb,UAAU,EACV,GAAG,KAAK,EACR,EAAE,gBAAgB,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;CAAE,+BA+CpD;yBA7De,WAAW;;;AAiE3B,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type MultiSelectOptionEntry } from "../lib/createMultiSelectOptionSections";
|
|
2
|
+
import { type OptionMultiSelectOptionContent, type OptionMultiSelectOptionGroup, type OptionMultiSelectOptionKey, type OptionMultiSelectOptionState } from "./optionMultiSelectTypes";
|
|
3
|
+
type MultiSelectOptionListProps<TOption> = Readonly<{
|
|
4
|
+
entries: readonly MultiSelectOptionEntry<TOption>[];
|
|
5
|
+
sectionId: string;
|
|
6
|
+
listId: string;
|
|
7
|
+
activeIndex: number;
|
|
8
|
+
selectedKeys: ReadonlySet<OptionMultiSelectOptionKey>;
|
|
9
|
+
query: string;
|
|
10
|
+
highlightQuery: string;
|
|
11
|
+
getOptionKey: (option: TOption) => OptionMultiSelectOptionKey;
|
|
12
|
+
getOptionGroup?: (option: TOption) => OptionMultiSelectOptionGroup | undefined;
|
|
13
|
+
getOptionDisabled?: (option: TOption) => boolean;
|
|
14
|
+
getOptionId: (listId: string, index: number) => string;
|
|
15
|
+
setOptionRef: (index: number, node: HTMLElement | null) => void;
|
|
16
|
+
toggleOption: (option: TOption) => void;
|
|
17
|
+
selectOnlyOption: (option: TOption) => void;
|
|
18
|
+
renderOption: (option: TOption, state: OptionMultiSelectOptionState) => OptionMultiSelectOptionContent;
|
|
19
|
+
}>;
|
|
20
|
+
/** Рендерит одну selected/available-секцию, сохраняя global option indexes при группировке. */
|
|
21
|
+
export declare function MultiSelectOptionList<TOption>({ entries, sectionId, getOptionGroup, ...rowProps }: MultiSelectOptionListProps<TOption>): import("react").JSX.Element[];
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=MultiSelectOptionList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiSelectOptionList.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmC,KAAK,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAGtH,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,MAAM,0BAA0B,CAAC;AAElC,KAAK,0BAA0B,CAAC,OAAO,IAAI,QAAQ,CAAC;IACnD,OAAO,EAAE,SAAS,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,0BAA0B,CAAC;IAC9D,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,4BAA4B,GAAG,SAAS,CAAC;IAC/E,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACjD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,KAAK,8BAA8B,CAAC;CACvG,CAAC,CAAC;AAEH,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,EAAE,0BAA0B,CAAC,OAAO,CAAC,iCAuBtI"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type OptionMultiSelectOptionContent, type OptionMultiSelectOptionKey, type OptionMultiSelectOptionState } from "./optionMultiSelectTypes";
|
|
2
|
+
type MultiSelectOptionRowProps<TOption> = Readonly<{
|
|
3
|
+
option: TOption;
|
|
4
|
+
index: number;
|
|
5
|
+
listId: string;
|
|
6
|
+
activeIndex: number;
|
|
7
|
+
selectedKeys: ReadonlySet<OptionMultiSelectOptionKey>;
|
|
8
|
+
query: string;
|
|
9
|
+
highlightQuery: string;
|
|
10
|
+
getOptionKey: (option: TOption) => OptionMultiSelectOptionKey;
|
|
11
|
+
getOptionDisabled?: (option: TOption) => boolean;
|
|
12
|
+
getOptionId: (listId: string, index: number) => string;
|
|
13
|
+
setOptionRef: (index: number, node: HTMLElement | null) => void;
|
|
14
|
+
toggleOption: (option: TOption) => void;
|
|
15
|
+
selectOnlyOption: (option: TOption) => void;
|
|
16
|
+
renderOption: (option: TOption, state: OptionMultiSelectOptionState) => OptionMultiSelectOptionContent;
|
|
17
|
+
}>;
|
|
18
|
+
/** Одна интерактивная строка grid: checkbox меняет draft, основная кнопка подтверждает только эту опцию. */
|
|
19
|
+
export declare function MultiSelectOptionRow<TOption>({ option, index, listId, activeIndex, selectedKeys, query, highlightQuery, getOptionKey, getOptionDisabled, getOptionId, setOptionRef, toggleOption, selectOnlyOption, renderOption }: MultiSelectOptionRowProps<TOption>): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=MultiSelectOptionRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiSelectOptionRow.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionRow.tsx"],"names":[],"mappings":"AAIA,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,MAAM,0BAA0B,CAAC;AAElC,KAAK,yBAAyB,CAAC,OAAO,IAAI,QAAQ,CAAC;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,0BAA0B,CAAC;IAC9D,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACjD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,KAAK,8BAA8B,CAAC;CACvG,CAAC,CAAC;AAEH,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,EAC7C,MAAM,EACN,KAAK,EACL,MAAM,EACN,WAAW,EACX,YAAY,EACZ,KAAK,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,EAAE,yBAAyB,CAAC,OAAO,CAAC,+BA2CpC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type PropsWithChildren } from "react";
|
|
2
|
+
type MultiSelectOptionsWrapperProps = PropsWithChildren<{
|
|
3
|
+
isNoData?: boolean;
|
|
4
|
+
error?: string;
|
|
5
|
+
}>;
|
|
6
|
+
/** Выбирает одно доступное состояние тела popup, не меняя структуру самого grid. */
|
|
7
|
+
export declare function MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsWrapperProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=MultiSelectOptionsWrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiSelectOptionsWrapper.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionsWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAM/C,KAAK,8BAA8B,GAAG,iBAAiB,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,8BAA8B,+BAUtG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Ref } from "react";
|
|
2
|
+
import { type UiBaseProps } from "../../types";
|
|
3
|
+
import { type OptionMultiSelectOptionDisableContext, type OptionMultiSelectOptionGroup, type OptionMultiSelectOptionKey, type OptionMultiSelectRenderers } from "./optionMultiSelectTypes";
|
|
4
|
+
/**
|
|
5
|
+
* Типобезопасный контракт множественного выбора. Опция остаётся в исходной
|
|
6
|
+
* domain/view-model форме, а UI получает только необходимые selector-функции.
|
|
7
|
+
*/
|
|
8
|
+
export type OptionMultiSelectProps<TOption> = OptionMultiSelectRenderers<TOption> & Omit<UiBaseProps<TOption[], readonly TOption[]>, "onChange"> & Readonly<{
|
|
9
|
+
ref?: Ref<HTMLInputElement>;
|
|
10
|
+
options: readonly TOption[];
|
|
11
|
+
onChange: (value: TOption[]) => void;
|
|
12
|
+
getOptionKey: (option: TOption) => OptionMultiSelectOptionKey;
|
|
13
|
+
getOptionLabel: (option: TOption) => string;
|
|
14
|
+
getOptionCode?: (option: TOption) => string | undefined;
|
|
15
|
+
getOptionGroup?: (option: TOption) => OptionMultiSelectOptionGroup | undefined;
|
|
16
|
+
getOptionSearchText?: (option: TOption) => string | readonly string[];
|
|
17
|
+
getOptionDisabled?: (option: TOption, context: OptionMultiSelectOptionDisableContext<TOption>) => boolean;
|
|
18
|
+
query?: string;
|
|
19
|
+
defaultQuery?: string;
|
|
20
|
+
highlightQuery?: string;
|
|
21
|
+
onQuery?: (value: string) => void;
|
|
22
|
+
defaultFilter?: boolean;
|
|
23
|
+
onOpen?: () => void;
|
|
24
|
+
onClose?: (value: TOption[]) => void;
|
|
25
|
+
error?: string;
|
|
26
|
+
isLoading?: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
/** Множественный выбор для произвольной типизированной коллекции опций. */
|
|
29
|
+
export declare function OptionMultiSelect<TOption>(props: OptionMultiSelectProps<TOption>): import("react").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=OptionMultiSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OptionMultiSelect.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/OptionMultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EACN,KAAK,qCAAqC,EAC1C,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,OAAO,IAAI,0BAA0B,CAAC,OAAO,CAAC,GAChF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,GAC5D,QAAQ,CAAC;IACR,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,0BAA0B,CAAC;IAC9D,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,4BAA4B,GAAG,SAAS,CAAC;IAC/E,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,qCAAqC,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;IAC1G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEJ,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,+BAEhF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type OptionMultiSelectProps } from "./OptionMultiSelect";
|
|
2
|
+
type OptionMultiSelectCoreProps<TOption> = OptionMultiSelectProps<TOption> & Readonly<{
|
|
3
|
+
/** Сохраняет опубликованную ссылочную семантику только для legacy MultiSelect. */
|
|
4
|
+
preserveOptionArrayReference?: boolean;
|
|
5
|
+
}>;
|
|
6
|
+
/**
|
|
7
|
+
* Единая generic-реализация множественного выбора. Публичные компоненты только
|
|
8
|
+
* адаптируют свои контракты к этим selector-функциям, поэтому focus и a11y
|
|
9
|
+
* поведение не расходятся между новым и legacy API.
|
|
10
|
+
*/
|
|
11
|
+
export declare function OptionMultiSelectCore<TOption>({ ref, options, value, onChange, getOptionKey, getOptionLabel, getOptionCode, getOptionGroup, getOptionSearchText, label, description, placeholder, size, query, defaultQuery, highlightQuery, onQuery, defaultFilter, onOpen, onClose, getOptionDisabled, disabled, error, isLoading, renderToken, renderToolbar, renderOption, preserveOptionArrayReference }: OptionMultiSelectCoreProps<TOption>): import("react").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=OptionMultiSelectCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OptionMultiSelectCore.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/OptionMultiSelectCore.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,KAAK,0BAA0B,CAAC,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,GACzE,QAAQ,CAAC;IACR,kFAAkF;IAClF,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACvC,CAAC,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,EAC9C,GAAG,EACH,OAAO,EACP,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,WAAW,EACX,WAAW,EACX,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,cAAc,EACd,OAAO,EACP,aAAoB,EACpB,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,4BAAoC,EACpC,EAAE,0BAA0B,CAAC,OAAO,CAAC,+BA8XrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
2
|
+
export interface MultiSelectItemState {
|
|
3
|
+
selected: boolean;
|
|
4
|
+
active: boolean;
|
|
5
|
+
disabled: boolean;
|
|
6
|
+
query: string;
|
|
7
|
+
highlightQuery: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MultiSelectOptionContent {
|
|
10
|
+
text: string;
|
|
11
|
+
code: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface MultiSelectRenderContext {
|
|
14
|
+
selectedItems: CollectionItem[];
|
|
15
|
+
committedSelectedItems: CollectionItem[];
|
|
16
|
+
availableItems: CollectionItem[];
|
|
17
|
+
query: string;
|
|
18
|
+
open: boolean;
|
|
19
|
+
clearSelection: () => void;
|
|
20
|
+
selectAll: () => void;
|
|
21
|
+
deselectAll: () => void;
|
|
22
|
+
}
|
|
23
|
+
export interface MultiSelectOptionDisableContext {
|
|
24
|
+
selectedItems: CollectionItem[];
|
|
25
|
+
committedSelectedItems: CollectionItem[];
|
|
26
|
+
selectedKeys: ReadonlySet<string>;
|
|
27
|
+
open: boolean;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=legacyMultiSelectTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacyMultiSelectTypes.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/legacyMultiSelectTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,sBAAsB,EAAE,cAAc,EAAE,CAAC;IACzC,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,+BAA+B;IAC/C,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,sBAAsB,EAAE,cAAc,EAAE,CAAC;IACzC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,EAAE,OAAO,CAAC;CACd"}
|