@ryuzaki13/react-foundation-ui 1.5.13 → 1.5.15
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/advanced-search/index.js +5 -5
- package/dist/chunks/{TextEditorLexicalClient-B084kVzu.js → TextEditorLexicalClient-ChVeb3f3.js} +2 -2
- package/dist/chunks/{TextEditorLexicalClient-B084kVzu.js.map → TextEditorLexicalClient-ChVeb3f3.js.map} +1 -1
- package/dist/chunks/{date-input-9T8AoG5U.js → date-input-QRwRTMmy.js} +2 -2
- package/dist/chunks/{date-input-9T8AoG5U.js.map → date-input-QRwRTMmy.js.map} +1 -1
- package/dist/chunks/{input-VC8jEoTa.js → input-D3u9BYWD.js} +31 -28
- package/dist/chunks/input-D3u9BYWD.js.map +1 -0
- package/dist/chunks/{input-files-CoMjadk7.js → input-files-D7iu_1n5.js} +5 -5
- package/dist/chunks/{input-files-CoMjadk7.js.map → input-files-D7iu_1n5.js.map} +1 -1
- package/dist/chunks/{input-search-Bs_9SxT0.js → input-search-4841icgL.js} +2 -2
- package/dist/chunks/{input-search-Bs_9SxT0.js.map → input-search-4841icgL.js.map} +1 -1
- package/dist/chunks/{multi-select-BJ6Lst1E.js → multi-select-BDvaRbUc.js} +8 -7
- package/dist/chunks/multi-select-BDvaRbUc.js.map +1 -0
- package/dist/chunks/{picker-DLnfOgZj.js → picker-lpH_xp14.js} +87 -87
- package/dist/chunks/picker-lpH_xp14.js.map +1 -0
- package/dist/chunks/{select-CysiIrej.js → select-3KLv_evq.js} +6 -6
- package/dist/chunks/select-3KLv_evq.js.map +1 -0
- package/dist/date-input/index.js +1 -1
- package/dist/date-time-input/index.js +4 -4
- package/dist/drop-zone/index.js +1 -1
- package/dist/image/index.js +2 -2
- package/dist/input/Input.d.ts +1 -0
- package/dist/input/Input.d.ts.map +1 -1
- package/dist/input/index.js +2 -2
- package/dist/input-date-time/index.js +4 -4
- package/dist/input-file/index.js +4 -4
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +4 -4
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +1 -1
- package/dist/listbox/index.js +1 -1
- package/dist/listbox/index.js.map +1 -1
- package/dist/multi-select/index.js +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/ODataMultiSelect.d.ts.map +1 -1
- package/dist/picker/PickerStatus.d.ts +1 -2
- package/dist/picker/PickerStatus.d.ts.map +1 -1
- package/dist/picker/PickerTriggerInput.d.ts +1 -0
- package/dist/picker/PickerTriggerInput.d.ts.map +1 -1
- package/dist/picker/index.js +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/select/Select.d.ts +1 -1
- package/dist/select/Select.d.ts.map +1 -1
- package/dist/select/index.js +1 -1
- package/dist/slider/index.js +8 -8
- package/dist/state-select/index.js +1 -1
- package/dist/tag-input/index.js +3 -3
- package/dist/text-editor/index.js +1 -1
- package/dist/textarea/index.js +3 -3
- package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
- package/dist/tree-select/index.js +5 -5
- package/dist/tree-select/index.js.map +1 -1
- package/package.json +1 -1
- package/storybook-static/assets/{Badge-Cz9gcxIU.js → Badge-DldwMP5d.js} +1 -1
- package/storybook-static/assets/{Badge.stories-PV88uXCB.js → Badge.stories-CB4lGRxY.js} +1 -1
- package/storybook-static/assets/{BadgeList-BMO51PtO.js → BadgeList-DP-72loV.js} +1 -1
- package/storybook-static/assets/{Button-DQxw6N8K.js → Button-BHscU-z3.js} +1 -1
- package/storybook-static/assets/{Button-BfLxUIid.js → Button-Bve0Lsd9.js} +1 -1
- package/storybook-static/assets/{Button.stories-NlwBLVkf.js → Button.stories-CQSct8PY.js} +1 -1
- package/storybook-static/assets/{CalendarView-C_i7clUL.js → CalendarView-MNrakgtl.js} +1 -1
- package/storybook-static/assets/{CheckBox-3WpAVlwd.js → CheckBox-BFPm58c_.js} +1 -1
- package/storybook-static/assets/{CheckBox-Drc-88GM.js → CheckBox-Czrn4-bF.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-D4IsLr4P.js → CheckBox.stories-aZatr3pc.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-CPY8DhM_.js → Color-6AOWCN3U-CiSKW9je.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BjBW8_sr.js → ContextMenu-BgqQQbbY.js} +1 -1
- package/storybook-static/assets/{ContextMenu-D2--kuIS.js → ContextMenu-CD9NSiLw.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-yGhy89Pi.js → ContextMenu.stories-hdAAEtrI.js} +1 -1
- package/storybook-static/assets/DateInput-BNOPi8tv.js +1 -0
- package/storybook-static/assets/{DateInput-G4c2mjqq.js → DateInput-BfSiBIl7.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-5ciPhgGf.js → DateInput.stories-DH6ku3Rc.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-C9M3c98a.js → DateRangePresetSelect-DG_q8icb.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DJ4HV2xU.js → DateRangePresetSelect-yrKx1bkL.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-C8Ohsfia.js → DateRangePresetSelect.stories-BZvZ3f2V.js} +1 -1
- package/storybook-static/assets/{Detail-CSPYsUEC.js → Detail-BDVQnuaF.js} +1 -1
- package/storybook-static/assets/{Detail.stories-LsOTK5pf.js → Detail.stories-CYmQh0uU.js} +1 -1
- package/storybook-static/assets/{Dialog-C8i0iW4a.js → Dialog-BZyurJz4.js} +1 -1
- package/storybook-static/assets/{Dialog-BjEcdbGi.js → Dialog-BwrMFaxL.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-BnmqXDWO.js → Dialog.stories-DVSdUxZ7.js} +1 -1
- package/storybook-static/assets/{Disclosure-Cvsl0gPE.js → Disclosure-BMSmmUiw.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-CFfYWULd.js → Disclosure.stories-CbJ9Es-C.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-ZnY0phsi.js → DisclosureGroup-EDWONIdc.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-8jGqLFb9.js → DocsRenderer-JROSPFPF-DSQiqbJZ.js} +1 -1
- package/storybook-static/assets/{DropZone-DFqqqipb.js → DropZone-CDZMeILF.js} +1 -1
- package/storybook-static/assets/{DropZone-DvuKp6tN.js → DropZone-DeAXD85q.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-B1xdFmz3.js → DropZone.stories-BqoW_3wP.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-BrgLHYbc.js → DropdownMenu-BzlgFl8n.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-CBOJ7TTT.js → ExpandableActionPanel-C5uzOOG0.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-ColZw5gd.js → ExpandableActionPanel.stories-i_SklR9s.js} +1 -1
- package/storybook-static/assets/{Flex-BT_QGMVX.js → Flex-DpQ24IHJ.js} +1 -1
- package/storybook-static/assets/{Flex.stories-CEgggepS.js → Flex.stories-bHyNTNg1.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-ClEj7JDK.js → FloatingPopover-STiijh_P.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-Cwt_acDE.js → FormattedTableCell-D6bBTkaG.js} +1 -1
- package/storybook-static/assets/{Grid-CfILre0m.js → Grid-Bphykxdg.js} +1 -1
- package/storybook-static/assets/{Grid.stories-wQ7jvA5X.js → Grid.stories-D8IvHZzt.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BMJDf8-2.js → ImageCropper.stories-CBKBFppK.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-COuwgno_.js → ImageRenderer-BLyK861z.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-DsdXyXKD.js → ImageRenderer.stories-ffdIT08r.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-iNAQGgcZ.js → ImageView.stories-CNUlVM8s.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-BYAuiSK7.js → ImageViewer.stories-Ms-ALdLt.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-DVlrAVlM.js → ImageViewerRuntime-DpJELdy_.js} +1 -1
- package/storybook-static/assets/Input-DBiChvMe.js +3 -0
- package/storybook-static/assets/{Input-BhXx34oj.js → Input-yBrifTXs.js} +1 -1
- package/storybook-static/assets/{Input.stories-cYqQabmU.js → Input.stories-CjcpHWcs.js} +1 -1
- package/storybook-static/assets/{InputDateTime-BqmrEg_Q.js → InputDateTime-B_jDcTqs.js} +1 -1
- package/storybook-static/assets/InputDateTime.stories-CAQzQH3t.js +38 -0
- package/storybook-static/assets/{InputFile-BCZ1O6Id.js → InputFile-D5VmcZpC.js} +1 -1
- package/storybook-static/assets/InputFile-fNgIzpGf.js +1 -0
- package/storybook-static/assets/{InputFile.stories-Cn9z-0xo.js → InputFile.stories-BNnT9A9v.js} +1 -1
- package/storybook-static/assets/InputFiles-BlkbLv47.js +1 -0
- package/storybook-static/assets/{InputFiles-c9zsOv2D.js → InputFiles-CtQKNcCo.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-m9aTBp1E.js → InputFiles.stories-BJn-YsDa.js} +1 -1
- package/storybook-static/assets/{InputFilesList-CokmKz6s.js → InputFilesList-lWrwPimQ.js} +1 -1
- package/storybook-static/assets/{InputImage-ONEbMmSy.js → InputImage-DBhS-3SD.js} +1 -1
- package/storybook-static/assets/{InputImage-hzPQOP_G.js → InputImage-DjIsVDMm.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-DtmL7qrl.js → InputImage.stories-uS8YZ8OU.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-D9I5JYap.js → InteractiveComponents-CSDnze29.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-Rkp13MQ5.js → InteractiveComponents.stories-C-qWn4VL.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-Dy9IvK0b.js → LayoutPicker-FRNg3HmE.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BodO442K.js → LayoutPicker-bi0eHID1.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-exb5TXXF.js → LayoutPicker.stories-CY9pmqLs.js} +1 -1
- package/storybook-static/assets/{Listbox-CQ80dSOo.js → Listbox-CemgFVhQ.js} +1 -1
- package/storybook-static/assets/{Listbox-CZ1FQQ5X.js → Listbox-f89xR3TU.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-Nfzs72Yd.js → Listbox.stories-CgL3tWpH.js} +1 -1
- package/storybook-static/assets/{Modal--uBl58UW.js → Modal-hBFJVwb4.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D77rBBBh.js → Modal.stories-ChrBZSkG.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-Dwn7kE4K.js → ModalManagerProvider-CCHfccow.js} +1 -1
- package/storybook-static/assets/{MultiSelect-BlTby36f.js → MultiSelect-BK12v3Cq.js} +1 -1
- package/storybook-static/assets/MultiSelect-Dr5CQeIO.js +2 -0
- package/storybook-static/assets/{MultiSelect.stories-BEHlAAJJ.js → MultiSelect.stories-DsSw6woy.js} +1 -1
- package/storybook-static/assets/{NoData-DLuw3XVk.js → NoData-DmgbBfVW.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-BB5Np8PK.js → NotificationsHost-BAIpEqnM.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-DDadi6Mw.js → NotificationsHost.stories-NayVs4Pk.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-XFTdhfCe.js → ODataMultiSelect-jNIRRDb2.js} +1 -1
- package/storybook-static/assets/ODataMultiSelect.stories-CWj51Zvd.js +137 -0
- package/storybook-static/assets/{ODataSelect-C01W8jth.js → ODataSelect-DQ31vwaX.js} +1 -1
- package/storybook-static/assets/ODataSelect.stories-DPrdwHyr.js +207 -0
- package/storybook-static/assets/{ODataTreeMultiSelect-sGEW_iPs.js → ODataTreeMultiSelect-BUHLV3tv.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CKN_SvQU.js → ODataTreeMultiSelect.stories-BVQaJtdc.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-1hCNPZNo.js → ODataTreeSelect-CjlD8Or9.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-GDmyjoWv.js → ODataTreeSelect.stories-Blu9kCg4.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-dsU38i0h.js → OneStepScroller-ddh_nRgx.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-B5IQUCox.js → PeriodSelect-BNYzz5bI.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-Dar6tgT-.js → PeriodSelect-Bpn0Gwht.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-s4UcTVBB.js → PeriodSelect.stories-Daj7UH8v.js} +1 -1
- package/storybook-static/assets/{PickerSelectionToolbar-BrUGVuF4.js → PickerSelectionToolbar-DOusOxuB.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-CiB7RNtz.js → PickerTriggerActions-DcLFOMBR.js} +1 -1
- package/storybook-static/assets/{Popover-BUpM2SdA.js → Popover-DOSQByLv.js} +1 -1
- package/storybook-static/assets/{Popover-CElnnd4d.js → Popover-Dp1WZ351.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CDPYRGg5.js → Popover.stories-C5rNeweU.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DWsBB7Xe.js → PresetRangeDateInput-C47SD8Wh.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DKbX277t.js → PresetRangeDateInput-D4IVr33W.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CLnxG1Su.js → PresetRangeDateInput.stories-Hils_9pa.js} +1 -1
- package/storybook-static/assets/{PresetSelect-TONMNVox.js → PresetSelect-DLQMUw6v.js} +1 -1
- package/storybook-static/assets/{RadioButton-CHp5HFET.js → RadioButton-BPnBnsQn.js} +1 -1
- package/storybook-static/assets/{RadioButton-C8cdy1c5.js → RadioButton-BVaLDFV8.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-D-wI-ysI.js → RadioButton.stories-D1N7hhYj.js} +1 -1
- package/storybook-static/assets/{RadioGroup-RnbEh9jf.js → RadioGroup-DRTeV91W.js} +1 -1
- package/storybook-static/assets/{RadioGroup-Cyzz_ISM.js → RadioGroup-DY6lfEMI.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-DAocx-vl.js → RadioGroup.stories-z3pvhBDW.js} +1 -1
- package/storybook-static/assets/{Scrollable-BZwDWzCP.js → Scrollable-BhY4xR4v.js} +1 -1
- package/storybook-static/assets/Select-DQSp_Ora.js +12 -0
- package/storybook-static/assets/{Select-BMWvHZb0.js → Select-xjBvVsFv.js} +1 -1
- package/storybook-static/assets/{Select.stories-Tt0ajJXV.js → Select.stories-DrFgfM4J.js} +1 -1
- package/storybook-static/assets/{SelectOptionContent-DZcX0XcL.js → SelectOptionContent-B3r2MCq9.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-Cb2eKzWt.js → SerializableSelect-BgY63lvT.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-BMGIdje_.js → SerializableSelect.stories-DQ1TOnu-.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput--8TJ-hnE.js → SingleDateTimeInput-BJmIUH4L.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-ByN30Wn3.js → SingleDateTimeInput-De-QgdP1.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-CrsfwMCv.js → SingleDateTimeInput.stories-CVBxjtw1.js} +1 -1
- package/storybook-static/assets/Slider-ChIA3nZE.js +1 -0
- package/storybook-static/assets/{Slider-B7Zh8pKd.js → Slider-D5T295Oy.js} +1 -1
- package/storybook-static/assets/{Slider.stories-2Fh_zSe4.js → Slider.stories-1PzeXIzZ.js} +1 -1
- package/storybook-static/assets/SliderInput-B9fPy3Cn.js +2 -0
- package/storybook-static/assets/{SliderInput-2r2n9oBs.js → SliderInput-XwL2-00c.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-RrseFw59.js → SliderInput.stories-BYk9yit5.js} +1 -1
- package/storybook-static/assets/{Sortable-DHi8kx5A.js → Sortable-DJGBM9Up.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-DJoStzvM.js → Sortable.stories-DNHi2j2g.js} +1 -1
- package/storybook-static/assets/{Splitter-Dxol4S_V.js → Splitter-BLtIq8GC.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-BbVOMBqo.js → Splitter.stories-DwEuHo4U.js} +1 -1
- package/storybook-static/assets/{StateSelect-3OnKvOr4.js → StateSelect-3bHw0Mqx.js} +1 -1
- package/storybook-static/assets/{StateSelect-pbm7Jf8f.js → StateSelect-Cut_GUS9.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-CgTE3-yP.js → StateSelect.stories-BxcettN-.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-BSJLw3CZ.js → StringToggle.stories-DGJLDN6l.js} +1 -1
- package/storybook-static/assets/{Switch-BxBEQCPT.js → Switch-DACuBBcY.js} +1 -1
- package/storybook-static/assets/{Switch-BdBKEluZ.js → Switch-UEGPSa7I.js} +1 -1
- package/storybook-static/assets/{Switch.stories-D5DDiey7.js → Switch.stories-COyEd7ll.js} +1 -1
- package/storybook-static/assets/{Table-tNWO7Xkx.js → Table-C3L5k62i.js} +1 -1
- package/storybook-static/assets/{Table.stories-Co6W6DfX.js → Table.stories-Bg8zioLm.js} +1 -1
- package/storybook-static/assets/{Tabs-MhG7k5kZ.js → Tabs-Mp2c4cx_.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-6-cDteqF.js → Tabs.stories-2n-gKA13.js} +1 -1
- package/storybook-static/assets/{TabsBox-CbcUNOlb.js → TabsBox-BpmIGtyk.js} +1 -1
- package/storybook-static/assets/{TagInput-BvhI42-e.js → TagInput-Dum97AE2.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-Bh03CP2k.js → TagInput.stories-Hs0-B_N1.js} +1 -1
- package/storybook-static/assets/{Text-CvyKTMrH.js → Text-Cgi6ZSLz.js} +1 -1
- package/storybook-static/assets/{Textarea-JurrghA5.js → Textarea-CvLQOnIp.js} +1 -1
- package/storybook-static/assets/{Textarea-CZORYVJ_.js → Textarea-D72BTP62.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-BUDqqVKy.js → Textarea.stories-vjBJEVm0.js} +1 -1
- package/storybook-static/assets/{TimePanel-DIKKUv5f.js → TimePanel-CW_su34b.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-B1q_i8WF.js → TimePanel.stories-6XPNZ7zt.js} +1 -1
- package/storybook-static/assets/{Toggle-BGRFjquY.js → Toggle-CJu4uO-W.js} +1 -1
- package/storybook-static/assets/{Toggle-C3KWroQa.js → Toggle-olojCi27.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-CqaiA6sq.js → Toggle.stories-Cgyc4d77.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BT1UYS2s.js → TreeMultiSelect-EgBDsFyR.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BJt6pYdc.js → TreeMultiSelect-Kx5mztXt.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-B6fswq0n.js → TreeMultiSelect.stories-Dne12S2l.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-Ezb14TOv.js → TreePickerBase-D1Pvek1r.js} +2 -2
- package/storybook-static/assets/{TreeSelect-6ad8aM5F.js → TreeSelect-DNfvUsxi.js} +1 -1
- package/storybook-static/assets/{TreeSelect-CdxWhNPr.js → TreeSelect-D_eYI6Ou.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-BMjSPnlt.js → TreeSelect.stories-Bzm61QfI.js} +1 -1
- package/storybook-static/assets/{TreeTable-B10lvNT_.js → TreeTable-BL144oay.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-BOkFmk-a.js → TreeTable.stories-CyXEHcki.js} +1 -1
- package/storybook-static/assets/{async-Wscr5OK0.js → async-BTZglz_X.js} +1 -1
- package/storybook-static/assets/{blocks-BkGgmJsC.js → blocks-DA12rSpV.js} +3 -3
- package/storybook-static/assets/{browserAndReact-BKmF0BgP.js → browserAndReact-D1Ykifm6.js} +1 -1
- package/storybook-static/assets/{check-uBaZUURY.js → check-BX6nx-3o.js} +1 -1
- package/storybook-static/assets/{chevron-down-DbISRZCX.js → chevron-down-DNmFEwHw.js} +1 -1
- package/storybook-static/assets/{chevron-left-Cb-kl5mh.js → chevron-left-D4-j0hj3.js} +1 -1
- package/storybook-static/assets/{chevron-right-D99XGTe7.js → chevron-right-jqFyXkAQ.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-D3-dGAP5.js → chunk-W22LQPXL-DTI5co7U.js} +1 -1
- package/storybook-static/assets/{circle-alert-CxdnePpP.js → circle-alert-CPhslK47.js} +1 -1
- package/storybook-static/assets/{circle-check-DxbzyOrj.js → circle-check-mqeGU7uk.js} +1 -1
- package/storybook-static/assets/{components-NKMCS9u_.js → components-B8GmvnkL.js} +3 -3
- package/storybook-static/assets/{contextMenu-CrE8d-C8.js → contextMenu-KnkARJmS.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-DLjGcYhl.js → defaultRenderers-9jhgJsUF.js} +1 -1
- package/storybook-static/assets/{download-B34Dyboo.js → download-2bfCyDgM.js} +1 -1
- package/storybook-static/assets/{filesAndExcel-D0WmBd17.js → filesAndExcel-DVSSMVHy.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-CHmsuwKl.js → floating-ui.react-DxmRb2Qf.js} +1 -1
- package/storybook-static/assets/{formatters-B5IRTBCO.js → formatters-DyKYAUlo.js} +1 -1
- package/storybook-static/assets/{formatters-runtime-DIIzhbds.js → formatters-runtime-Bz1bSLIu.js} +1 -1
- package/storybook-static/assets/{foundationLib-CVhEJ6js.js → foundationLib-aysuo_oK.js} +1 -1
- package/storybook-static/assets/{hooks-BDibLnHt.js → hooks-pwoB_iPM.js} +1 -1
- package/storybook-static/assets/iframe-C6KyCBvm.js +1 -0
- package/storybook-static/assets/{iframe-CD1cMwos.js → iframe-cjuwJElu.js} +5 -5
- package/storybook-static/assets/{info-YWjqfWxe.js → info-Bo4lQd-n.js} +1 -1
- package/storybook-static/assets/{odata-D3YkIfXJ.js → odata-st4-eYHw.js} +1 -1
- package/storybook-static/assets/{odataAndTables-C2flJmi6.js → odataAndTables-F9Gtp-kk.js} +1 -1
- package/storybook-static/assets/{odataFetchFn-DHf6YwiM.js → odataFetchFn-CkRZZriA.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-C7XqnT73.js → odataStoryFixtures-CqSeDBqF.js} +1 -1
- package/storybook-static/assets/{persisted-CKfZAtRr.js → persisted-CjFXaS21.js} +1 -1
- package/storybook-static/assets/{pureUtilities-Bwoj6fXN.js → pureUtilities-DLQdVlhe.js} +1 -1
- package/storybook-static/assets/{react-BONe4qKn.js → react-CjERBoLl.js} +1 -1
- package/storybook-static/assets/{refresh-cw-DpHq4LQP.js → refresh-cw-JWYI2x81.js} +1 -1
- package/storybook-static/assets/{runtimeAndState-DsHleu6Y.js → runtimeAndState-BzzV3GX-.js} +1 -1
- package/storybook-static/assets/{settings-2-Dz6u0Wf2.js → settings-2-DG4qROG-.js} +1 -1
- package/storybook-static/assets/{sortable-VOkfa1Z-.js → sortable-CWsNoMxK.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-T5IQBZDB-C4OOYkZu.js → syntaxhighlighter-T5IQBZDB-1bseUYr-.js} +1 -1
- package/storybook-static/assets/{trash-2-DTPcXUiI.js → trash-2-DcYDgK5k.js} +1 -1
- package/storybook-static/assets/{triangle-alert-DUI5nsd3.js → triangle-alert-CdAbGIRd.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-BpntR4Iz.js → useODataSelectBase-DCi7pW6G.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-C2vzjXPp.js → useODataTreeData-bDwoSzvJ.js} +1 -1
- package/storybook-static/assets/usePickerQuery-CizLKZif.js +1 -0
- package/storybook-static/assets/usePickerTriggerController-C6_AtdR_.js +1 -0
- package/storybook-static/assets/{x-B8aXMeuU.js → x-DjlJGqcw.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/dist/chunks/input-VC8jEoTa.js.map +0 -1
- package/dist/chunks/multi-select-BJ6Lst1E.js.map +0 -1
- package/dist/chunks/picker-DLnfOgZj.js.map +0 -1
- package/dist/chunks/select-CysiIrej.js.map +0 -1
- package/storybook-static/assets/DateInput-Dex3NjVs.js +0 -1
- package/storybook-static/assets/Input-DCQXBGK4.js +0 -3
- package/storybook-static/assets/InputDateTime.stories-C3xQIS7z.js +0 -38
- package/storybook-static/assets/InputFile-Bth1Jhjf.js +0 -1
- package/storybook-static/assets/InputFiles-CURwAma0.js +0 -1
- package/storybook-static/assets/MultiSelect-B725mcqy.js +0 -2
- package/storybook-static/assets/ODataMultiSelect.stories-V1UHe_oU.js +0 -137
- package/storybook-static/assets/ODataSelect.stories-GBg5TBT_.js +0 -207
- package/storybook-static/assets/Select-QJmM58Sy.js +0 -12
- package/storybook-static/assets/Slider-eV8LAbRY.js +0 -1
- package/storybook-static/assets/SliderInput-BjWQPhW1.js +0 -2
- package/storybook-static/assets/iframe-CTou9CRA.js +0 -1
- package/storybook-static/assets/usePickerQuery-BDYoi7Rg.js +0 -1
- package/storybook-static/assets/usePickerTriggerController-DAUdKKpa.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select-BDvaRbUc.js","names":[],"sources":["../../src/multi-select/ui/MultiSelectOption.tsx","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/ui/MultiSelectToken.tsx","../../src/multi-select/ui/defaultRenderers.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelect.tsx","../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { SelectOptionContent } from \"../../select/SelectOptionContent\";\n\ninterface MultiSelectOptionProps {\n\titem: CollectionItem;\n\ttextKey: string;\n\tcodeKey?: string;\n\thighlight?: string;\n\tselected: boolean;\n}\n\n/**\n * Отдельная опция внутри `MultiSelect`. Отрисовывает состояние выбора и подсветку текста для найденных совпадений.\n */\nexport function MultiSelectOption({ item, textKey, codeKey, highlight }: MultiSelectOptionProps) {\n\treturn <SelectOptionContent label={item[textKey]} code={codeKey && item[codeKey]} highlight={highlight} />;\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.multiSelectTokens {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * 2) 0 var(--space-md);\n\n\tpointer-events: none;\n\toverflow: hidden;\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n}\n\n.multiSelectToken {\n\tfont-size: var(--font-size-sm);\n\tfont-weight: 300;\n\tfont-variation-settings: \"wght\" 300;\n\n\t// flex: 1 1 0%;\n\t// min-width: 0;\n\tmax-width: 100%;\n\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tword-break: normal;\n\ttext-overflow: ellipsis;\n\n\tpointer-events: none;\n}\n","import styles from \"./MultiSelect.module.scss\";\n\ninterface MultiSelectTokenProps {\n\tvalue: string | undefined;\n}\n\n/**\n * Токен выбранного значения в `MultiSelect`. Показывает выбранный элемент и кнопку его удаления из текущего набора.\n */\nexport function MultiSelectToken({ value }: MultiSelectTokenProps) {\n\tif (!value) return null;\n\n\treturn (\n\t\t<div className={styles.multiSelectTokens}>\n\t\t\t<div className={styles.multiSelectToken}>{value}</div>\n\t\t</div>\n\t);\n}\n","import { formatRussianPlural, type RussianPluralForms } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { PickerSelectionToolbar } from \"../../picker\";\n\nimport { type MultiSelectItemState, type MultiSelectRenderContext } from \"./MultiSelect\";\nimport { MultiSelectOption } from \"./MultiSelectOption\";\nimport { MultiSelectToken } from \"./MultiSelectToken\";\n\ninterface MultiSelectRendererConfig {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n}\n\nconst ELEMENT_FORMS: RussianPluralForms = {\n\tone: \"элемент\",\n\tfew: \"элемента\",\n\tmany: \"элементов\"\n};\n\nexport function formatOptionCount(count: number) {\n\treturn formatRussianPlural(count, ELEMENT_FORMS);\n}\n\nexport function resolveMultiSelectTextKey(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (textKey) {\n\t\treturn textKey;\n\t}\n\n\tconst sampleItem = items[0];\n\n\tif (!sampleItem) {\n\t\treturn codeKey;\n\t}\n\n\treturn Object.keys(sampleItem).find((key) => key !== codeKey) ?? codeKey;\n}\n\nexport function getDefaultMultiSelectTokenValue(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (items.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (items.length > 1) {\n\t\treturn formatOptionCount(items.length);\n\t}\n\n\tconst resolvedTextKey = resolveMultiSelectTextKey(items, codeKey, textKey);\n\treturn items[0]?.[resolvedTextKey] ?? items[0]?.[codeKey];\n}\n\nexport function createDefaultMultiSelectTokenRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultToken(context: MultiSelectRenderContext) {\n\t\treturn <MultiSelectToken value={getDefaultMultiSelectTokenValue(context.selectedItems, config.codeKey, config.textKey)} />;\n\t};\n}\n\nexport function renderDefaultMultiSelectToolbar(context: MultiSelectRenderContext) {\n\treturn <PickerSelectionToolbar onSelectAll={context.selectAll} onDeselectAll={context.deselectAll} />;\n}\n\nexport function createDefaultMultiSelectItemRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultItem(item: CollectionItem, state: MultiSelectItemState) {\n\t\treturn (\n\t\t\t<MultiSelectOption\n\t\t\t\titem={item}\n\t\t\t\tselected={state.selected}\n\t\t\t\thighlight={state.highlightQuery}\n\t\t\t\ttextKey={resolveMultiSelectTextKey([item], config.codeKey, config.textKey)}\n\t\t\t\tcodeKey={config.hideCode ? undefined : config.codeKey}\n\t\t\t/>\n\t\t);\n\t};\n}\n","import { Text } from \"../../text\";\nimport uiStyles from \"../../ui.module.scss\";\n\ninterface MultiSelectOptionSkeletonProps {\n\ttext: string;\n\tisError?: boolean;\n}\n\n/**\n * Скелетон строки опции для `MultiSelect`. Используется во время загрузки или при отображении ошибок получения списка.\n */\nexport function MultiSelectOptionSkeleton({ text, isError }: MultiSelectOptionSkeletonProps) {\n\treturn (\n\t\t<div className={uiStyles.uiPopupOption}>\n\t\t\t<span className={uiStyles.uiPopupOptionIcon}></span>\n\t\t\t<Text color={isError ? \"error\" : \"primary\"}>{text}</Text>\n\t\t</div>\n\t);\n}\n","import React, { forwardRef, type PropsWithChildren, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../../check-box\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { type UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\n\nimport {\n\tcreateDefaultMultiSelectItemRenderer,\n\tcreateDefaultMultiSelectTokenRenderer,\n\trenderDefaultMultiSelectToolbar,\n\tresolveMultiSelectTextKey\n} from \"./defaultRenderers\";\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ninterface MultiSelectOptionsProps extends PropsWithChildren {\n\tisNoData?: boolean;\n\t// isLoading?: boolean;\n\terror?: string;\n}\n\nfunction MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsProps) {\n\tif (isNoData) return <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\t// if (isLoading) return <PickerStatus loadingState={<MultiSelectOptionSkeleton text=\"Загрузка...\" />} />;\n\tif (error) return <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\n\treturn <>{children}</>;\n}\n\nexport interface MultiSelectItemState {\n\tselected: boolean;\n\tactive: boolean;\n\tdisabled: boolean;\n\tquery: string;\n\thighlightQuery: string;\n}\n\nexport interface MultiSelectRenderContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tavailableItems: CollectionItem[];\n\tquery: string;\n\topen: boolean;\n\tclearSelection: () => void;\n\tselectAll: () => void;\n\tdeselectAll: () => void;\n}\n\nexport interface MultiSelectOptionDisableContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tselectedKeys: ReadonlySet<string>;\n\topen: boolean;\n}\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => React.ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nexport interface MultiSelectProps<TOption extends Record<string, string> = CollectionItem>\n\textends MultiSelectRenderers, UiBaseProps<TOption[]> {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\thighlightQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\titems: TOption[];\n\tgetOptionDisabled?: (item: TOption, context: MultiSelectOptionDisableContext) => boolean;\n\tonOpen?: () => void;\n\tonClose?: (value: TOption[]) => void;\n\terror?: string;\n\tisLoading?: boolean;\n}\n\nconst fallback: CollectionItem[] = [];\n\nfunction getItemKey(item: CollectionItem, codeKey: string) {\n\treturn item[codeKey];\n}\n\nfunction getItemSearchParts(item: CollectionItem, codeKey: string, textKey: string) {\n\treturn Array.from(new Set([item[textKey], item[codeKey], ...Object.values(item)]));\n}\n\nfunction areSelectionsEqual(left: CollectionItem[], right: CollectionItem[], codeKey: string) {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map((item) => getItemKey(item, codeKey)));\n\n\treturn left.every((item) => rightKeys.has(getItemKey(item, codeKey)));\n}\n\ninterface MultiSelectOptionEntry {\n\titem: CollectionItem;\n\tindex: number;\n}\n\ninterface MultiSelectOptionGroupProps {\n\tentries: MultiSelectOptionEntry[];\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: Set<string>;\n\tcodeKey: string;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionDisabled?: (item: CollectionItem) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (item: CollectionItem) => void;\n\tselectOnlyOption: (item: CollectionItem) => void;\n\trenderItem: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nfunction MultiSelectOptionGroup({\n\tentries,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tcodeKey,\n\tquery,\n\thighlightQuery,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderItem\n}: MultiSelectOptionGroupProps) {\n\treturn entries.map(({ item, index }) => {\n\t\tconst active = index === activeIndex;\n\t\tconst selected = selectedKeys.has(getItemKey(item, codeKey));\n\t\tconst optionDisabled = getOptionDisabled?.(item) ?? false;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={`${getItemKey(item, codeKey)}-${index}`}\n\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\trole=\"option\"\n\t\t\t\taria-selected={selected}\n\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tuiStyles.uiSelectOption,\n\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\tactive && uiStyles.uiPopupOptionActive\n\t\t\t\t)}\n\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}>\n\t\t\t\t<div\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}}>\n\t\t\t\t\t<CheckBox\n\t\t\t\t\t\tvalue={selected}\n\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\t\ttoggleOption(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"overflowHidden\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\tselectOnlyOption(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}>\n\t\t\t\t\t{renderItem(item, { selected, active, disabled: optionDisabled, query, highlightQuery })}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t});\n}\n\n/**\n * Поле множественного выбора с внутренним черновиком значений и подтверждением выбора при закрытии списка.\n * Подходит как для самостоятельного использования, так и как базовый слой для OData-оберток.\n */\nexport const MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(\n\t(\n\t\t{\n\t\t\tcodeKey,\n\t\t\ttextKey,\n\t\t\thideCode,\n\t\t\titems,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tplaceholder,\n\t\t\tsize,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\thighlightQuery,\n\t\t\tonQuery,\n\t\t\tdefaultFilter = true,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tgetOptionDisabled,\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\tisLoading,\n\t\t\trenderToken,\n\t\t\trenderToolbar,\n\t\t\trenderItem\n\t\t},\n\t\tref\n\t) => {\n\t\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\t\tconst [open, setOpen] = useState(false);\n\t\tconst triggerMode = \"search-multi\";\n\t\tconst committedSelectedItems = value ?? fallback;\n\t\tconst committedSelectedKeys = useMemo(\n\t\t\t() => new Set(committedSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedItems]\n\t\t);\n\t\tconst availableItems = useMemo(\n\t\t\t() => items.filter((item) => !committedSelectedKeys.has(getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedKeys, items]\n\t\t);\n\t\tconst resolvedTextKey = useMemo(\n\t\t\t() => resolveMultiSelectTextKey([...committedSelectedItems, ...items], codeKey, textKey),\n\t\t\t[codeKey, committedSelectedItems, items, textKey]\n\t\t);\n\t\tconst {\n\t\t\tquery: currentQuery,\n\t\t\tsetQuery,\n\t\t\tresetQueryOnClose\n\t\t} = usePickerQuery({\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\tonQuery,\n\t\t\ttriggerMode\n\t\t});\n\t\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\t\tsetQuery(\"\");\n\t\t\t}\n\n\t\t\tsetOpen(nextOpen);\n\t\t};\n\t\tconst filteredCommittedSelectedItems = usePickerDefaultFilter({\n\t\t\toptions: committedSelectedItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst filteredAvailableItems = usePickerDefaultFilter({\n\t\t\toptions: availableItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst visibleOptions = useMemo(\n\t\t\t() => [...filteredCommittedSelectedItems, ...filteredAvailableItems],\n\t\t\t[filteredAvailableItems, filteredCommittedSelectedItems]\n\t\t);\n\t\tconst selectedIndex = filteredCommittedSelectedItems.length > 0 ? 0 : -1;\n\t\tconst {\n\t\t\tdraftValue: draftSelectedItems,\n\t\t\tsetDraftValue: setDraftSelectedItems,\n\t\t\tprepareOpen\n\t\t} = usePickerSelectionLifecycle({\n\t\t\tvalue: committedSelectedItems,\n\t\t\topen,\n\t\t\tonCommit: onChange,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tisEqual: (left, right) => areSelectionsEqual(left, right, codeKey)\n\t\t});\n\t\tconst selectedKeys = useMemo(\n\t\t\t() => new Set(draftSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, draftSelectedItems]\n\t\t);\n\t\tconst optionDisableContext = useMemo<MultiSelectOptionDisableContext>(\n\t\t\t() => ({\n\t\t\t\tselectedItems: draftSelectedItems,\n\t\t\t\tcommittedSelectedItems,\n\t\t\t\tselectedKeys,\n\t\t\t\topen\n\t\t\t}),\n\t\t\t[committedSelectedItems, draftSelectedItems, open, selectedKeys]\n\t\t);\n\t\tconst isOptionDisabled = useCallback(\n\t\t\t(item: CollectionItem) => getOptionDisabled?.(item, optionDisableContext) ?? false,\n\t\t\t[getOptionDisabled, optionDisableContext]\n\t\t);\n\t\tconst {\n\t\t\tactiveIndex,\n\t\t\tcontext,\n\t\t\tfloatingStyles,\n\t\t\tgetFloatingProps,\n\t\t\tsetReference,\n\t\t\tsetFloating,\n\t\t\tsetOptionRef,\n\t\t\tclose,\n\t\t\topenList,\n\t\t\ttoggleOpen,\n\t\t\tselectActiveOption,\n\t\t\thandleReferenceKeyDown,\n\t\t\thandleFloatingKeyDown,\n\t\t\tgetOptionId,\n\t\t\tgetActiveOptionId\n\t\t} = usePickerFloatingListbox({\n\t\t\toptions: visibleOptions,\n\t\t\tselectedIndex,\n\t\t\topen,\n\t\t\tonOpenChange: handleOpenChange,\n\t\t\tonSelect: undefined,\n\t\t\tdisabled,\n\t\t\tgetOptionDisabled: isOptionDisabled,\n\t\t\tcloseOnSelect: false,\n\t\t\tallowOpenWithoutOptions: true,\n\t\t\ttriggerMode\n\t\t});\n\n\t\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\t\tconst toggleDraftSelection = (item: CollectionItem) => {\n\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst isSelected = currentItems.some((selectedItem) => getItemKey(selectedItem, codeKey) === itemKey);\n\n\t\t\t\tif (isSelected) {\n\t\t\t\t\treturn currentItems.filter((selectedItem) => getItemKey(selectedItem, codeKey) !== itemKey);\n\t\t\t\t}\n\n\t\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\t\treturn currentItems;\n\t\t\t\t}\n\n\t\t\t\treturn [...currentItems, item];\n\t\t\t});\n\t\t};\n\n\t\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ref) {\n\t\t\t\tref.current = node;\n\t\t\t}\n\t\t};\n\n\t\tconst clearSelection = () => {\n\t\t\tsetDraftSelectedItems([]);\n\n\t\t\tif (!open) {\n\t\t\t\tonChange([]);\n\t\t\t}\n\t\t};\n\n\t\tconst selectAll = () => {\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst nextItems = [...currentItems];\n\t\t\t\tconst selectedKeys = new Set(currentItems.map((item) => getItemKey(item, codeKey)));\n\n\t\t\t\tfor (const item of visibleOptions) {\n\t\t\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\t\t\tif (!selectedKeys.has(itemKey) && !isOptionDisabled(item)) {\n\t\t\t\t\t\tselectedKeys.add(itemKey);\n\t\t\t\t\t\tnextItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nextItems;\n\t\t\t});\n\t\t};\n\n\t\tconst deselectAll = () => {\n\t\t\tsetDraftSelectedItems([]);\n\t\t};\n\n\t\tconst selectOnlyOption = (item: CollectionItem) => {\n\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetDraftSelectedItems([item]);\n\t\t\tclose();\n\t\t};\n\n\t\tconst currentSelectedItems = open ? draftSelectedItems : committedSelectedItems;\n\t\tconst hasSelectedItems = currentSelectedItems.length > 0;\n\t\tconst renderContext: MultiSelectRenderContext = {\n\t\t\tselectedItems: currentSelectedItems,\n\t\t\tcommittedSelectedItems,\n\t\t\tavailableItems: filteredAvailableItems,\n\t\t\tquery: currentQuery,\n\t\t\topen,\n\t\t\tclearSelection,\n\t\t\tselectAll,\n\t\t\tdeselectAll\n\t\t};\n\t\tconst tokenRenderer =\n\t\t\trenderToken === undefined ? createDefaultMultiSelectTokenRenderer({ codeKey, textKey: resolvedTextKey }) : renderToken;\n\t\tconst toolbarRenderer = renderToolbar === undefined ? renderDefaultMultiSelectToolbar : renderToolbar;\n\t\tconst itemRenderer =\n\t\t\trenderItem ??\n\t\t\tcreateDefaultMultiSelectItemRenderer({\n\t\t\t\tcodeKey,\n\t\t\t\ttextKey: resolvedTextKey,\n\t\t\t\thideCode\n\t\t\t});\n\t\tconst tokenNode = typeof tokenRenderer === \"function\" ? tokenRenderer(renderContext) : null;\n\t\tconst toolbarNode = typeof toolbarRenderer === \"function\" ? toolbarRenderer(renderContext) : null;\n\t\t// const hasToken = tokenNode !== null && tokenNode !== undefined;\n\t\tconst selectedEntries = filteredCommittedSelectedItems.map((item, index) => ({ item, index }));\n\t\tconst itemEntries = filteredAvailableItems.map((item, index) => ({ item, index: index + selectedEntries.length }));\n\t\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\t\tconst triggerController = usePickerTriggerController({\n\t\t\tmode: triggerMode,\n\t\t\topen,\n\t\t\tcurrentQuery,\n\t\t\thasDisplayValue: false,\n\t\t\tinputRef,\n\t\t\tsetQuery,\n\t\t\topenList,\n\t\t\tclose,\n\t\t\ttoggleOpen,\n\t\t\tonBeforeOpen: () => {\n\t\t\t\tif (!open) {\n\t\t\t\t\tprepareOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn (\n\t\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\t\thasSelectedItems ? undefined : `${placeholder ?? label ?? \"Выберите значения\"} <${items.length}>`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={!hasSelectedItems}\n\t\t\t\t\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"multi-select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-multi-select\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={clearSelection}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить все\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\toverlay={tokenNode}\n\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tconst activeItem = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\t\t\tif (activeItem) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeItem);\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tselectActiveOption();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tclassName={uiStyles.uiPopupOptions}\n\t\t\t\t\t\t\t\theader={toolbarNode}>\n\t\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t\t<div className=\"scrollable h100\">\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableItems.length > 0 && <Separator className=\"marginBlockSm\" />}\n\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={itemEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t</PickerField>\n\t\t);\n\t}\n);\n\nMultiSelect.displayName = \"MultiSelect\";\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import React from \"react\";\n\nimport { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { MultiSelect } from \"./MultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport const ODataMultiSelect: React.FC<ODataMultiSelectProps> = ({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}) => {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tisLoading={odataModel.isLoading}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n};\n","import { useCallback, useState } from \"react\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentItem } from \"@ryuzaki13/react-foundation-api/odata\";\n\ninterface ODataDependentSegmentMultiSelectProps {\n\titem: ODataDependentSegmentItem;\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentSegmentMultiSelect: React.FC<ODataDependentSegmentMultiSelectProps> = ({\n\titem,\n\tvalues,\n\tonChange,\n\twidth = 15\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tconst nextSelectedValues = {\n\t\t\t\t...selectedValues,\n\t\t\t\t[item.id]: keys\n\t\t\t};\n\n\t\t\tif (!values) {\n\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t}\n\n\t\t\tonChange?.(nextSelectedValues);\n\t\t},\n\t\t[item.id, onChange, selectedValues, values]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selectedValues}\n\t\t\t\tvalue={selectedValues[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useState } from \"react\";\n\nimport { flattenODataDependentServices, ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\ninterface ODataDependentMultiSelectProps extends ODataDependentBaseProps {\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentMultiSelect: React.FC<ODataDependentMultiSelectProps> = ({\n\twidth = 15,\n\todata,\n\tsegments,\n\tmodel,\n\tvalues,\n\tonChange\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selectedValues}\n\t\t\tonChange={(nextSelectedValues) => {\n\t\t\t\tif (!values) {\n\t\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t\t}\n\n\t\t\t\tonChange?.(nextSelectedValues);\n\t\t\t}}\n\t\t\twidth={width}\n\t\t/>\n\t));\n};\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-DHVTOqZ0.js";
|
|
2
2
|
import { t } from "./grid-dI94AAbi.js";
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
5
|
-
import { forwardRef as
|
|
6
|
-
import { cn as
|
|
7
|
-
import { FloatingFocusManager as
|
|
8
|
-
import { jsx as
|
|
9
|
-
import { ChevronDownIcon as
|
|
10
|
-
import { useFloatingListbox as
|
|
11
|
-
import { normalizeTextToLower as
|
|
12
|
-
import { AnimatePresence as
|
|
3
|
+
import { a as n, c as r, i, u as a } from "./input-D3u9BYWD.js";
|
|
4
|
+
import { t as o } from "./separator-B72Aq-6a.js";
|
|
5
|
+
import { forwardRef as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
|
|
6
|
+
import { cn as f } from "@ryuzaki13/react-foundation-lib/utils";
|
|
7
|
+
import { FloatingFocusManager as p, FloatingPortal as m } from "@floating-ui/react";
|
|
8
|
+
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
9
|
+
import { ChevronDownIcon as v } from "lucide-react";
|
|
10
|
+
import { useFloatingListbox as y } from "@ryuzaki13/react-foundation-lib/hooks";
|
|
11
|
+
import { normalizeTextToLower as b } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
12
|
+
import { AnimatePresence as x, motion as S } from "motion/react";
|
|
13
13
|
//#region src/picker/PickerField.tsx
|
|
14
|
-
function
|
|
15
|
-
let { controlId: u, labelId: d, descriptionId: f, errorId: p, describedBy:
|
|
14
|
+
function C({ id: e, label: t, description: n, disabled: i, size: o, className: s, error: c, children: l }) {
|
|
15
|
+
let { controlId: u, labelId: d, descriptionId: f, errorId: p, describedBy: m } = a({
|
|
16
16
|
id: e,
|
|
17
17
|
hasLabel: t != null,
|
|
18
18
|
hasDescription: !!n,
|
|
19
19
|
hasError: !!c
|
|
20
20
|
});
|
|
21
|
-
return /* @__PURE__ */
|
|
21
|
+
return /* @__PURE__ */ g(r, {
|
|
22
22
|
label: t,
|
|
23
23
|
description: n,
|
|
24
|
-
disabled:
|
|
24
|
+
disabled: i,
|
|
25
25
|
size: o,
|
|
26
26
|
className: s,
|
|
27
27
|
error: c,
|
|
@@ -34,11 +34,11 @@ function x({ id: e, label: t, description: n, disabled: a, size: o, className: s
|
|
|
34
34
|
labelId: d,
|
|
35
35
|
descriptionId: f,
|
|
36
36
|
errorId: p,
|
|
37
|
-
describedBy:
|
|
37
|
+
describedBy: m
|
|
38
38
|
})
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
|
-
var
|
|
41
|
+
var w = {
|
|
42
42
|
popupLayout: "DRJ4hy",
|
|
43
43
|
popupBody: "U4CULi",
|
|
44
44
|
status: "bupTWA",
|
|
@@ -48,17 +48,17 @@ var S = {
|
|
|
48
48
|
};
|
|
49
49
|
//#endregion
|
|
50
50
|
//#region src/picker/PickerPopup.tsx
|
|
51
|
-
function
|
|
51
|
+
function T(e) {
|
|
52
52
|
e.stopPropagation();
|
|
53
53
|
}
|
|
54
|
-
function
|
|
55
|
-
return /* @__PURE__ */
|
|
54
|
+
function E({ open: e, context: t, floatingStyles: n, listId: r, labelId: i, popupAriaLabel: a, descriptionId: s, activeOptionId: c, ariaMultiselectable: l, popupRole: u = "listbox", setFloating: d, getFloatingProps: h, onKeyDown: v, initialFocus: y = -1, returnFocus: b = !1, tabIndex: C = 0, className: E, maxWidth: D, layoutClassName: O, headerClassName: k, bodyClassName: A, header: j, children: M }) {
|
|
55
|
+
return /* @__PURE__ */ g(x, { children: e && /* @__PURE__ */ g(m, { children: /* @__PURE__ */ g(p, {
|
|
56
56
|
context: t,
|
|
57
57
|
modal: !1,
|
|
58
|
-
initialFocus:
|
|
59
|
-
returnFocus:
|
|
60
|
-
children: /* @__PURE__ */
|
|
61
|
-
ref:
|
|
58
|
+
initialFocus: y,
|
|
59
|
+
returnFocus: b,
|
|
60
|
+
children: /* @__PURE__ */ g(S.div, {
|
|
61
|
+
ref: d,
|
|
62
62
|
style: {
|
|
63
63
|
...n,
|
|
64
64
|
maxWidth: D
|
|
@@ -75,26 +75,26 @@ function w({ open: e, context: t, floatingStyles: n, listId: r, labelId: i, popu
|
|
|
75
75
|
opacity: 0,
|
|
76
76
|
scale: .95
|
|
77
77
|
},
|
|
78
|
-
...
|
|
78
|
+
...h({
|
|
79
79
|
id: r,
|
|
80
80
|
role: u,
|
|
81
|
-
tabIndex:
|
|
81
|
+
tabIndex: C,
|
|
82
82
|
"aria-labelledby": i,
|
|
83
|
-
"aria-label": i ? void 0 :
|
|
83
|
+
"aria-label": i ? void 0 : a,
|
|
84
84
|
"aria-describedby": s,
|
|
85
85
|
"aria-activedescendant": c,
|
|
86
86
|
"aria-multiselectable": l || void 0,
|
|
87
|
-
onMouseDown:
|
|
87
|
+
onMouseDown: T,
|
|
88
88
|
onKeyDown: v,
|
|
89
89
|
className: E
|
|
90
90
|
}),
|
|
91
|
-
children: /* @__PURE__ */
|
|
92
|
-
className:
|
|
93
|
-
children: [j ? /* @__PURE__ */
|
|
91
|
+
children: /* @__PURE__ */ _("div", {
|
|
92
|
+
className: f(w.popupLayout, O),
|
|
93
|
+
children: [j ? /* @__PURE__ */ _("div", {
|
|
94
94
|
className: k,
|
|
95
|
-
children: [j, /* @__PURE__ */
|
|
96
|
-
}) : /* @__PURE__ */
|
|
97
|
-
className:
|
|
95
|
+
children: [j, /* @__PURE__ */ g(o, { className: "marginBlockSm" })]
|
|
96
|
+
}) : /* @__PURE__ */ g("div", {}), /* @__PURE__ */ g("div", {
|
|
97
|
+
className: f(w.popupBody, A),
|
|
98
98
|
children: M
|
|
99
99
|
})]
|
|
100
100
|
})
|
|
@@ -103,21 +103,21 @@ function w({ open: e, context: t, floatingStyles: n, listId: r, labelId: i, popu
|
|
|
103
103
|
}
|
|
104
104
|
//#endregion
|
|
105
105
|
//#region src/picker/PickerSelectionToolbar.tsx
|
|
106
|
-
function
|
|
107
|
-
return /* @__PURE__ */
|
|
106
|
+
function D({ onSelectAll: e, onDeselectAll: n, selectAllButtonRef: r }) {
|
|
107
|
+
return /* @__PURE__ */ _(t.Container, {
|
|
108
108
|
gap: "xs",
|
|
109
109
|
templateColumns: "1fr 1fr",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
110
|
+
children: [/* @__PURE__ */ g("button", {
|
|
111
111
|
ref: r,
|
|
112
112
|
type: "button",
|
|
113
|
-
className:
|
|
113
|
+
className: w.selectionActionButton,
|
|
114
114
|
onClick: e,
|
|
115
115
|
"data-ui": "picker-select-all",
|
|
116
116
|
"data-action": "select-all",
|
|
117
117
|
children: "Выбрать все"
|
|
118
|
-
}), /* @__PURE__ */
|
|
118
|
+
}), /* @__PURE__ */ g("button", {
|
|
119
119
|
type: "button",
|
|
120
|
-
className:
|
|
120
|
+
className: w.selectionActionButton,
|
|
121
121
|
onClick: n,
|
|
122
122
|
"data-ui": "picker-deselect-all",
|
|
123
123
|
"data-action": "deselect-all",
|
|
@@ -127,52 +127,52 @@ function T({ onSelectAll: e, onDeselectAll: n, selectAllButtonRef: r }) {
|
|
|
127
127
|
}
|
|
128
128
|
//#endregion
|
|
129
129
|
//#region src/picker/PickerStatus.tsx
|
|
130
|
-
function
|
|
131
|
-
let
|
|
132
|
-
return
|
|
133
|
-
className:
|
|
130
|
+
function O({ emptyState: t, errorState: n }) {
|
|
131
|
+
let r = n ?? t;
|
|
132
|
+
return r == null ? null : /* @__PURE__ */ g("div", {
|
|
133
|
+
className: f(e.uiPopupOption, w.status, n !== void 0 && w.statusError),
|
|
134
134
|
"aria-disabled": !0,
|
|
135
|
-
children:
|
|
135
|
+
children: r
|
|
136
136
|
});
|
|
137
137
|
}
|
|
138
138
|
//#endregion
|
|
139
139
|
//#region src/picker/PickerTriggerActions.tsx
|
|
140
|
-
function
|
|
141
|
-
return /* @__PURE__ */
|
|
140
|
+
function k({ open: t, disabled: n, children: r, onToggleMouseDown: i, onToggleClick: a, openAriaLabel: o = "Открыть список", closeAriaLabel: s = "Закрыть список" }) {
|
|
141
|
+
return /* @__PURE__ */ _("div", {
|
|
142
142
|
className: e.uiToggleButtonContainer,
|
|
143
143
|
"data-disabled": n || void 0,
|
|
144
144
|
children: [
|
|
145
145
|
r,
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ g("div", { className: e.uiButtonSeparator }),
|
|
147
|
+
/* @__PURE__ */ g("button", {
|
|
148
148
|
type: "button",
|
|
149
149
|
"aria-label": t ? s : o,
|
|
150
150
|
className: e.uiToggleButton,
|
|
151
151
|
onMouseDown: i,
|
|
152
152
|
onClick: a,
|
|
153
|
-
children: /* @__PURE__ */
|
|
153
|
+
children: /* @__PURE__ */ g(v, { className: f(e.uiToggleIcon, t && e.uiToggleIconOpen) })
|
|
154
154
|
})
|
|
155
155
|
]
|
|
156
156
|
});
|
|
157
157
|
}
|
|
158
158
|
//#endregion
|
|
159
159
|
//#region src/picker/PickerTriggerInput.tsx
|
|
160
|
-
var
|
|
160
|
+
var A = s(({ rootRef: t, endAdornment: r, overlay: a, rootClassName: o, inputClassName: s, isLoading: c, ...l }, u) => /* @__PURE__ */ g("div", {
|
|
161
161
|
ref: t,
|
|
162
|
-
className:
|
|
163
|
-
children:
|
|
162
|
+
className: f(e.uiInputContainer, w.triggerContainer, o),
|
|
163
|
+
children: c ? /* @__PURE__ */ g(n, {}) : /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g(i, {
|
|
164
164
|
endAdornment: r,
|
|
165
|
-
children: ({ controlClassName: t }) => /* @__PURE__ */
|
|
166
|
-
...
|
|
167
|
-
ref:
|
|
168
|
-
className:
|
|
165
|
+
children: ({ controlClassName: t }) => /* @__PURE__ */ g("input", {
|
|
166
|
+
...l,
|
|
167
|
+
ref: u,
|
|
168
|
+
className: f(e.uiInputWithToggle, t, s)
|
|
169
169
|
})
|
|
170
|
-
}),
|
|
170
|
+
}), a] })
|
|
171
171
|
}));
|
|
172
|
-
|
|
172
|
+
A.displayName = "PickerTriggerInput";
|
|
173
173
|
//#endregion
|
|
174
174
|
//#region src/picker/model/createPickerTriggerPolicy.ts
|
|
175
|
-
function
|
|
175
|
+
function j(e) {
|
|
176
176
|
switch (e) {
|
|
177
177
|
case "search-single": return {
|
|
178
178
|
focusFloatingOnOpen: !1,
|
|
@@ -205,21 +205,21 @@ function k(e) {
|
|
|
205
205
|
}
|
|
206
206
|
//#endregion
|
|
207
207
|
//#region src/picker/model/extractPickerTextContent.ts
|
|
208
|
-
function
|
|
208
|
+
function M(e) {
|
|
209
209
|
if (typeof e == "string" || typeof e == "number") return String(e);
|
|
210
210
|
if (Array.isArray(e)) {
|
|
211
|
-
let t = e.map(
|
|
211
|
+
let t = e.map(M).filter((e) => !!e);
|
|
212
212
|
return t.length ? t.join(" ") : void 0;
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
//#endregion
|
|
216
216
|
//#region src/picker/model/usePickerDefaultFilter.ts
|
|
217
|
-
function
|
|
218
|
-
return
|
|
217
|
+
function N(e) {
|
|
218
|
+
return b((Array.isArray(e) ? e : [e]).filter(Boolean).join(" "));
|
|
219
219
|
}
|
|
220
|
-
function
|
|
221
|
-
let i =
|
|
222
|
-
return
|
|
220
|
+
function P({ options: e, query: t, enabled: n = !0, getSearchText: r }) {
|
|
221
|
+
let i = b(t);
|
|
222
|
+
return l(() => !n || !i ? [...e] : e.filter((e) => N(r(e)).includes(i)), [
|
|
223
223
|
n,
|
|
224
224
|
r,
|
|
225
225
|
i,
|
|
@@ -228,9 +228,9 @@ function M({ options: e, query: t, enabled: n = !0, getSearchText: r }) {
|
|
|
228
228
|
}
|
|
229
229
|
//#endregion
|
|
230
230
|
//#region src/picker/model/usePickerFloatingListbox.ts
|
|
231
|
-
function
|
|
232
|
-
let t = e.triggerMode ?
|
|
233
|
-
return
|
|
231
|
+
function F(e) {
|
|
232
|
+
let t = e.triggerMode ? j(e.triggerMode) : void 0;
|
|
233
|
+
return y({
|
|
234
234
|
...e,
|
|
235
235
|
focusFloatingOnOpen: e.focusFloatingOnOpen ?? t?.focusFloatingOnOpen,
|
|
236
236
|
restoreFocusOnClose: e.restoreFocusOnClose ?? t?.restoreFocusOnClose
|
|
@@ -238,47 +238,47 @@ function N(e) {
|
|
|
238
238
|
}
|
|
239
239
|
//#endregion
|
|
240
240
|
//#region src/picker/model/usePickerQuery.ts
|
|
241
|
-
function
|
|
242
|
-
let a = e !== void 0, [o, s] =
|
|
241
|
+
function I({ query: e, defaultQuery: t, onQuery: n, resetOnClose: r, triggerMode: i }) {
|
|
242
|
+
let a = e !== void 0, [o, s] = d(t ?? ""), c = a ? e ?? "" : o, l = r ?? (!i || j(i).resetQueryOnClose), u = (e) => {
|
|
243
243
|
a || s(e), n?.(e);
|
|
244
244
|
};
|
|
245
245
|
return {
|
|
246
246
|
query: c,
|
|
247
|
-
setQuery:
|
|
248
|
-
clearQuery: () =>
|
|
247
|
+
setQuery: u,
|
|
248
|
+
clearQuery: () => u(""),
|
|
249
249
|
resetQueryOnClose: l
|
|
250
250
|
};
|
|
251
251
|
}
|
|
252
252
|
//#endregion
|
|
253
253
|
//#region src/picker/model/usePickerSelectionLifecycle.ts
|
|
254
|
-
function
|
|
255
|
-
let o =
|
|
256
|
-
return
|
|
257
|
-
o.current && !t && (a(
|
|
254
|
+
function L({ value: e, open: t, onCommit: n, onOpen: r, onClose: i, isEqual: a }) {
|
|
255
|
+
let o = u(!1), [s, l] = d(e);
|
|
256
|
+
return c(() => {
|
|
257
|
+
o.current && !t && (a(s, e) || n(s), i?.(s)), o.current = t;
|
|
258
258
|
}, [
|
|
259
|
-
|
|
259
|
+
s,
|
|
260
260
|
a,
|
|
261
261
|
i,
|
|
262
262
|
n,
|
|
263
263
|
t,
|
|
264
264
|
e
|
|
265
265
|
]), {
|
|
266
|
-
draftValue:
|
|
267
|
-
setDraftValue:
|
|
266
|
+
draftValue: s,
|
|
267
|
+
setDraftValue: l,
|
|
268
268
|
prepareOpen: () => {
|
|
269
|
-
|
|
269
|
+
l(e), r?.();
|
|
270
270
|
}
|
|
271
271
|
};
|
|
272
272
|
}
|
|
273
273
|
//#endregion
|
|
274
274
|
//#region src/picker/model/usePickerTriggerController.ts
|
|
275
|
-
function
|
|
275
|
+
function R(e) {
|
|
276
276
|
requestAnimationFrame(() => {
|
|
277
277
|
e.current?.focus();
|
|
278
278
|
});
|
|
279
279
|
}
|
|
280
|
-
function
|
|
281
|
-
let u =
|
|
280
|
+
function z({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i, setQuery: a, openList: o, close: s, toggleOpen: c, onBeforeOpen: l }) {
|
|
281
|
+
let u = j(e), d = () => {
|
|
282
282
|
if (l?.(), o) {
|
|
283
283
|
o();
|
|
284
284
|
return;
|
|
@@ -291,7 +291,7 @@ function L({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i,
|
|
|
291
291
|
}
|
|
292
292
|
c?.();
|
|
293
293
|
}, p = () => {
|
|
294
|
-
t ? f() : d(), u.shouldFocusReferenceOnToggle(t) &&
|
|
294
|
+
t ? f() : d(), u.shouldFocusReferenceOnToggle(t) && R(i);
|
|
295
295
|
};
|
|
296
296
|
return {
|
|
297
297
|
policy: u,
|
|
@@ -335,6 +335,6 @@ function L({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i,
|
|
|
335
335
|
};
|
|
336
336
|
}
|
|
337
337
|
//#endregion
|
|
338
|
-
export {
|
|
338
|
+
export { P as a, A as c, D as d, E as f, F as i, k as l, L as n, M as o, C as p, I as r, j as s, z as t, O as u };
|
|
339
339
|
|
|
340
|
-
//# sourceMappingURL=picker-
|
|
340
|
+
//# sourceMappingURL=picker-lpH_xp14.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker-lpH_xp14.js","names":[],"sources":["../../src/picker/PickerField.tsx","../../src/picker/Picker.module.scss","../../src/picker/PickerPopup.tsx","../../src/picker/PickerSelectionToolbar.tsx","../../src/picker/PickerStatus.tsx","../../src/picker/PickerTriggerActions.tsx","../../src/picker/PickerTriggerInput.tsx","../../src/picker/model/createPickerTriggerPolicy.ts","../../src/picker/model/extractPickerTextContent.ts","../../src/picker/model/usePickerDefaultFilter.ts","../../src/picker/model/usePickerFloatingListbox.ts","../../src/picker/model/usePickerQuery.ts","../../src/picker/model/usePickerSelectionLifecycle.ts","../../src/picker/model/usePickerTriggerController.ts"],"sourcesContent":["import { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { InputUI } from \"../input\";\nimport { useInputFieldIds } from \"../input/lib/useInputFieldIds\";\n\nimport { PickerFieldProps } from \"./types\";\n\nexport function PickerField<TValue extends InputType>({\n\tid,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tclassName,\n\terror,\n\tchildren\n}: PickerFieldProps<TValue>) {\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tsize={size}\n\t\t\tclassName={className}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t{children({ controlId, labelId, descriptionId, errorId, describedBy })}\n\t\t</InputUI>\n\t);\n}\n",".popupLayout {\n\tdisplay: grid;\n\tgrid-template-rows: auto 1fr;\n\tmin-height: 0;\n\tmax-height: 75vh;\n\toverflow: hidden;\n\n\tflex: 1 1 auto;\n}\n\n.popupBody {\n\tmin-height: 0;\n}\n\n.status {\n\tpadding: var(--space-xs) var(--space-sm);\n\tcolor: var(--content-2);\n}\n\n.statusError {\n\tcolor: var(--status-error-text);\n}\n\n.triggerContainer {\n\tposition: relative;\n}\n\n.selectionActionButton {\n\tpadding-block: var(--space-xs);\n\tborder-radius: var(--radius-sm);\n\n\t&:hover {\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n","import { type CSSProperties, type KeyboardEvent, type MouseEvent, type ReactNode } from \"react\";\n\nimport { FloatingContext, FloatingFocusManager, FloatingPortal } from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AnimatePresence, motion } from \"motion/react\";\n\nimport { Separator } from \"../separator\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerPopupProps {\n\topen: boolean;\n\tcontext: FloatingContext;\n\tfloatingStyles: CSSProperties;\n\tlistId: string;\n\tlabelId?: string;\n\tpopupAriaLabel?: string;\n\tdescriptionId?: string;\n\tactiveOptionId?: string;\n\tariaMultiselectable?: boolean;\n\tpopupRole?: \"listbox\" | \"dialog\";\n\tsetFloating: (node: HTMLElement | null) => void;\n\tgetFloatingProps: (userProps?: Record<string, unknown>) => Record<string, unknown>;\n\tonKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\tinitialFocus?: number;\n\treturnFocus?: boolean;\n\ttabIndex?: number;\n\tclassName?: string;\n\tmaxWidth?: CSSProperties[\"maxWidth\"];\n\tlayoutClassName?: string;\n\theaderClassName?: string;\n\tbodyClassName?: string;\n\theader?: ReactNode;\n\tchildren: ReactNode;\n}\n\nfunction stopNestedFloatingMouseDown(event: MouseEvent<HTMLElement>): void {\n\tevent.stopPropagation();\n}\n\nexport function PickerPopup({\n\topen,\n\tcontext,\n\tfloatingStyles,\n\tlistId,\n\tlabelId,\n\tpopupAriaLabel,\n\tdescriptionId,\n\tactiveOptionId,\n\tariaMultiselectable,\n\tpopupRole = \"listbox\",\n\tsetFloating,\n\tgetFloatingProps,\n\tonKeyDown,\n\tinitialFocus = -1,\n\treturnFocus = false,\n\ttabIndex = 0,\n\tclassName,\n\tmaxWidth,\n\tlayoutClassName,\n\theaderClassName,\n\tbodyClassName,\n\theader,\n\tchildren\n}: PickerPopupProps) {\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<FloatingPortal>\n\t\t\t\t\t<FloatingFocusManager context={context} modal={false} initialFocus={initialFocus} returnFocus={returnFocus}>\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tref={setFloating}\n\t\t\t\t\t\t\tstyle={{ ...floatingStyles, maxWidth }}\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.95 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.95 }}\n\t\t\t\t\t\t\t{...getFloatingProps({\n\t\t\t\t\t\t\t\tid: listId,\n\t\t\t\t\t\t\t\trole: popupRole,\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t\t\"aria-labelledby\": labelId,\n\t\t\t\t\t\t\t\t\"aria-label\": labelId ? undefined : popupAriaLabel,\n\t\t\t\t\t\t\t\t\"aria-describedby\": descriptionId,\n\t\t\t\t\t\t\t\t\"aria-activedescendant\": activeOptionId,\n\t\t\t\t\t\t\t\t\"aria-multiselectable\": ariaMultiselectable || undefined,\n\t\t\t\t\t\t\t\tonMouseDown: stopNestedFloatingMouseDown,\n\t\t\t\t\t\t\t\tonKeyDown,\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t<div className={cn(styles.popupLayout, layoutClassName)}>\n\t\t\t\t\t\t\t\t{header ? (\n\t\t\t\t\t\t\t\t\t<div className={headerClassName}>\n\t\t\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t\t\t\t<Separator className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className={cn(styles.popupBody, bodyClassName)}>{children}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t</FloatingFocusManager>\n\t\t\t\t</FloatingPortal>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { type Ref } from \"react\";\n\nimport { Grid } from \"../grid\";\n\nimport styles from \"./Picker.module.scss\";\n\ntype PickerSelectionToolbarProps = {\n\tonSelectAll: () => void;\n\tonDeselectAll: () => void;\n\tselectAllButtonRef?: Ref<HTMLButtonElement>;\n};\n\n/**\n * Общая панель массовых действий для picker-компонентов с множественным выбором.\n * Компонент не знает формат значения и делегирует изменение владельцу selection-модели.\n */\nexport function PickerSelectionToolbar({ onSelectAll, onDeselectAll, selectAllButtonRef }: PickerSelectionToolbarProps) {\n\treturn (\n\t\t<Grid.Container gap=\"xs\" templateColumns=\"1fr 1fr\">\n\t\t\t<button\n\t\t\t\tref={selectAllButtonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectionActionButton}\n\t\t\t\tonClick={onSelectAll}\n\t\t\t\tdata-ui=\"picker-select-all\"\n\t\t\t\tdata-action=\"select-all\">\n\t\t\t\tВыбрать все\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectionActionButton}\n\t\t\t\tonClick={onDeselectAll}\n\t\t\t\tdata-ui=\"picker-deselect-all\"\n\t\t\t\tdata-action=\"deselect-all\">\n\t\t\t\tСнять выбор\n\t\t\t</button>\n\t\t</Grid.Container>\n\t);\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerStatusProps {\n\temptyState?: ReactNode;\n\t// loadingState?: ReactNode;\n\terrorState?: ReactNode;\n}\n\nexport function PickerStatus({ emptyState, errorState }: PickerStatusProps) {\n\tconst content = errorState ?? emptyState;\n\n\tif (content === undefined || content === null) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiPopupOption, styles.status, errorState !== undefined && styles.statusError)} aria-disabled={true}>\n\t\t\t{content}\n\t\t</div>\n\t);\n}\n","import { MouseEvent, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\ninterface PickerTriggerActionsProps {\n\topen: boolean;\n\tdisabled?: boolean;\n\tchildren?: ReactNode;\n\tonToggleMouseDown?: (event: MouseEvent<HTMLButtonElement>) => void;\n\tonToggleClick: () => void;\n\topenAriaLabel?: string;\n\tcloseAriaLabel?: string;\n}\n\nexport function PickerTriggerActions({\n\topen,\n\tdisabled,\n\tchildren,\n\tonToggleMouseDown,\n\tonToggleClick,\n\topenAriaLabel = \"Открыть список\",\n\tcloseAriaLabel = \"Закрыть список\"\n}: PickerTriggerActionsProps) {\n\treturn (\n\t\t<div className={uiStyles.uiToggleButtonContainer} data-disabled={disabled || undefined}>\n\t\t\t{children}\n\n\t\t\t<div className={uiStyles.uiButtonSeparator} />\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label={open ? closeAriaLabel : openAriaLabel}\n\t\t\t\tclassName={uiStyles.uiToggleButton}\n\t\t\t\tonMouseDown={onToggleMouseDown}\n\t\t\t\tonClick={onToggleClick}>\n\t\t\t\t<ChevronDownIcon className={cn(uiStyles.uiToggleIcon, open && uiStyles.uiToggleIconOpen)} />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","import { ComponentPropsWithoutRef, forwardRef, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputControl, InputLoadingFrame } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerTriggerInputProps extends Omit<ComponentPropsWithoutRef<\"input\">, \"size\"> {\n\trootRef?: (node: HTMLDivElement | null) => void;\n\tendAdornment?: ReactNode;\n\toverlay?: ReactNode;\n\trootClassName?: string;\n\tinputClassName?: string;\n\tisLoading?: boolean;\n}\n\nexport const PickerTriggerInput = forwardRef<HTMLInputElement, PickerTriggerInputProps>(\n\t({ rootRef, endAdornment, overlay, rootClassName, inputClassName, isLoading, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={rootRef} className={cn(uiStyles.uiInputContainer, styles.triggerContainer, rootClassName)}>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<InputLoadingFrame />\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<InputControl endAdornment={endAdornment}>\n\t\t\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t\t\t<input {...props} ref={ref} className={cn(uiStyles.uiInputWithToggle, controlClassName, inputClassName)} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</InputControl>\n\t\t\t\t\t\t{overlay}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nPickerTriggerInput.displayName = \"PickerTriggerInput\";\n","export type PickerTriggerMode = \"display\" | \"search-single\" | \"search-multi\";\n\ninterface PickerTriggerTextFocusParams {\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n}\n\nexport interface PickerTriggerPolicy {\n\tfocusFloatingOnOpen: boolean;\n\trestoreFocusOnClose: boolean;\n\tresetQueryOnClose: boolean;\n\tshouldOpenOnTriggerClick: (open: boolean) => boolean;\n\tshouldOpenOnInputChange: (open: boolean) => boolean;\n\tshouldFocusReferenceOnToggle: (open: boolean) => boolean;\n\tshouldSelectTriggerTextOnFocus: (params: PickerTriggerTextFocusParams) => boolean;\n}\n\n/**\n * Единая политика поведения trigger-input для picker-компонентов.\n * Нормализует различия между display-режимом, single-search и multi-search.\n */\nexport function createPickerTriggerPolicy(mode: PickerTriggerMode): PickerTriggerPolicy {\n\tswitch (mode) {\n\t\tcase \"search-single\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: ({ open, currentQuery, hasDisplayValue }) =>\n\t\t\t\t\t!open && currentQuery.length === 0 && hasDisplayValue\n\t\t\t};\n\t\tcase \"search-multi\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t\tcase \"display\":\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: true,\n\t\t\t\trestoreFocusOnClose: true,\n\t\t\t\tresetQueryOnClose: false,\n\t\t\t\tshouldOpenOnTriggerClick: (open) => !open,\n\t\t\t\tshouldOpenOnInputChange: () => false,\n\t\t\t\tshouldFocusReferenceOnToggle: () => false,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t}\n}\n","import { ReactNode } from \"react\";\n\nexport function extractPickerTextContent(node: ReactNode): string | undefined {\n\tif (typeof node === \"string\" || typeof node === \"number\") {\n\t\treturn String(node);\n\t}\n\n\tif (Array.isArray(node)) {\n\t\tconst values = node.map(extractPickerTextContent).filter((value): value is string => Boolean(value));\n\t\treturn values.length ? values.join(\" \") : undefined;\n\t}\n\n\treturn undefined;\n}\n","import { useMemo } from \"react\";\n\nimport { normalizeTextToLower } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\ninterface UsePickerDefaultFilterOptions<T> {\n\toptions: readonly T[];\n\tquery: string;\n\tenabled?: boolean;\n\tgetSearchText: (option: T) => unknown;\n}\n\nfunction normalizeSearchText(value: unknown) {\n\tconst parts = Array.isArray(value) ? value : [value];\n\n\treturn normalizeTextToLower(parts.filter(Boolean).join(\" \"));\n}\n\nexport function usePickerDefaultFilter<T>({ options, query, enabled = true, getSearchText }: UsePickerDefaultFilterOptions<T>) {\n\tconst normalizedQuery = normalizeTextToLower(query);\n\n\treturn useMemo(() => {\n\t\tif (!enabled || !normalizedQuery) {\n\t\t\treturn [...options];\n\t\t}\n\n\t\treturn options.filter((option) => normalizeSearchText(getSearchText(option)).includes(normalizedQuery));\n\t}, [enabled, getSearchText, normalizedQuery, options]);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport {\n\ttype FloatingListboxPlacementStrategy,\n\ttype FloatingListboxSizeResolver,\n\tuseFloatingListbox\n} from \"@ryuzaki13/react-foundation-lib/hooks\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerFloatingListboxParams<T> {\n\toptions: readonly T[];\n\tselectedIndex: number;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tgetOptionDisabled?: (option: T) => boolean;\n\tonSelect?: (option: T) => void;\n\tdisabled?: boolean;\n\tplacement?: Placement;\n\tplacementStrategy?: FloatingListboxPlacementStrategy;\n\tcloseOnSelect?: boolean;\n\tfocusFloatingOnOpen?: boolean;\n\tallowOpenWithoutOptions?: boolean;\n\trestoreFocusOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n\tresolveFloatingSize?: FloatingListboxSizeResolver;\n}\n\n/**\n * Единая точка входа для popup/listbox поведения во всех picker-компонентах.\n */\nexport function usePickerFloatingListbox<T>(params: UsePickerFloatingListboxParams<T>) {\n\tconst triggerPolicy = params.triggerMode ? createPickerTriggerPolicy(params.triggerMode) : undefined;\n\n\treturn useFloatingListbox({\n\t\t...params,\n\t\tfocusFloatingOnOpen: params.focusFloatingOnOpen ?? triggerPolicy?.focusFloatingOnOpen,\n\t\trestoreFocusOnClose: params.restoreFocusOnClose ?? triggerPolicy?.restoreFocusOnClose\n\t});\n}\n","import { useState } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerQueryOptions {\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tresetOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n}\n\n/**\n * Управляет controlled/uncontrolled query и возвращает policy закрытия владельцу open-state.\n * Сброс выполняется самим владельцем в событии close, поэтому hook не зеркалит lifecycle через effect.\n */\nexport function usePickerQuery({ query, defaultQuery, onQuery, resetOnClose, triggerMode }: UsePickerQueryOptions) {\n\tconst isControlled = query !== undefined;\n\tconst [internalQuery, setInternalQuery] = useState(defaultQuery ?? \"\");\n\tconst currentQuery = isControlled ? (query ?? \"\") : internalQuery;\n\tconst resolvedResetOnClose = resetOnClose ?? (triggerMode ? createPickerTriggerPolicy(triggerMode).resetQueryOnClose : true);\n\n\tconst setQuery = (nextValue: string) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalQuery(nextValue);\n\t\t}\n\n\t\tonQuery?.(nextValue);\n\t};\n\n\treturn {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tclearQuery: () => setQuery(\"\"),\n\t\tresetQueryOnClose: resolvedResetOnClose\n\t};\n}\n","import { useEffect, useRef, useState } from \"react\";\n\ninterface UsePickerSelectionLifecycleOptions<TValue> {\n\tvalue: TValue;\n\topen: boolean;\n\tonCommit: (value: TValue) => void;\n\tonOpen?: () => void;\n\tonClose?: (value: TValue) => void;\n\tisEqual: (left: TValue, right: TValue) => boolean;\n}\n\n/**\n * Общий жизненный цикл чернового выбора для picker-компонентов,\n * где изменения подтверждаются при закрытии popup.\n */\nexport function usePickerSelectionLifecycle<TValue>({\n\tvalue,\n\topen,\n\tonCommit,\n\tonOpen,\n\tonClose,\n\tisEqual\n}: UsePickerSelectionLifecycleOptions<TValue>) {\n\tconst previousOpenRef = useRef(false);\n\tconst [draftValue, setDraftValue] = useState(value);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open) {\n\t\t\tif (!isEqual(draftValue, value)) {\n\t\t\t\tonCommit(draftValue);\n\t\t\t}\n\n\t\t\tonClose?.(draftValue);\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [draftValue, isEqual, onClose, onCommit, open, value]);\n\n\tconst prepareOpen = () => {\n\t\tsetDraftValue(value);\n\t\tonOpen?.();\n\t};\n\n\treturn {\n\t\tdraftValue,\n\t\tsetDraftValue,\n\t\tprepareOpen\n\t};\n}\n","import { MouseEvent, RefObject } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerTriggerControllerOptions {\n\tmode: PickerTriggerMode;\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n\tinputRef: RefObject<HTMLInputElement | null>;\n\tsetQuery?: (value: string) => void;\n\topenList?: () => void;\n\tclose?: () => void;\n\ttoggleOpen?: () => void;\n\tonBeforeOpen?: () => void;\n}\n\ninterface HandleTriggerKeyDownOptions {\n\tevent: React.KeyboardEvent<HTMLElement>;\n\tonActivateWhenOpen?: () => void;\n\tenableSpaceActivation?: boolean;\n\tenableClosedArrowDownOpen?: boolean;\n\tsuppressClosedArrowUp?: boolean;\n}\n\nfunction focusInput(inputRef: RefObject<HTMLInputElement | null>) {\n\trequestAnimationFrame(() => {\n\t\tinputRef.current?.focus();\n\t});\n}\n\n/**\n * Единый контроллер пользовательских действий на trigger-input.\n * Держит поведение display/search-single/search-multi в одном месте.\n */\nexport function usePickerTriggerController({\n\tmode,\n\topen,\n\tcurrentQuery,\n\thasDisplayValue,\n\tinputRef,\n\tsetQuery,\n\topenList,\n\tclose,\n\ttoggleOpen,\n\tonBeforeOpen\n}: UsePickerTriggerControllerOptions) {\n\tconst policy = createPickerTriggerPolicy(mode);\n\n\tconst openTrigger = () => {\n\t\tonBeforeOpen?.();\n\n\t\tif (openList) {\n\t\t\topenList();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst closeTrigger = () => {\n\t\tif (close) {\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst toggleTrigger = () => {\n\t\tif (open) {\n\t\t\tcloseTrigger();\n\t\t} else {\n\t\t\topenTrigger();\n\t\t}\n\n\t\tif (policy.shouldFocusReferenceOnToggle(open)) {\n\t\t\tfocusInput(inputRef);\n\t\t}\n\t};\n\n\treturn {\n\t\tpolicy,\n\t\thandleTriggerInputChange: (nextValue: string) => {\n\t\t\tsetQuery?.(nextValue);\n\n\t\t\tif (policy.shouldOpenOnInputChange(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerClick: () => {\n\t\t\tif (policy.shouldOpenOnTriggerClick(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerFocus: (input: HTMLInputElement) => {\n\t\t\tif (\n\t\t\t\tpolicy.shouldSelectTriggerTextOnFocus({\n\t\t\t\t\topen,\n\t\t\t\t\tcurrentQuery,\n\t\t\t\t\thasDisplayValue\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tinput.select();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\thandleToggleMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n\t\t\tevent.preventDefault();\n\t\t},\n\t\thandleToggleClick: () => {\n\t\t\ttoggleTrigger();\n\t\t},\n\t\thandleTriggerKeyDown: ({\n\t\t\tevent,\n\t\t\tonActivateWhenOpen,\n\t\t\tenableSpaceActivation = false,\n\t\t\tenableClosedArrowDownOpen = false,\n\t\t\tsuppressClosedArrowUp = false\n\t\t}: HandleTriggerKeyDownOptions) => {\n\t\t\tif (!open && suppressClosedArrowUp && event.key === \"ArrowUp\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!open && enableClosedArrowDownOpen && event.key === \"ArrowDown\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\ttoggleTrigger();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"Enter\") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (enableSpaceActivation && event.key === \" \") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttoggleTrigger\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-DHVTOqZ0.js";
|
|
2
|
-
import {
|
|
3
|
-
import { a as n, c as r, f as i, i as a, l as o, o as s, p as c, r as l, t as u, u as d } from "./picker-
|
|
2
|
+
import { l as t } from "./input-D3u9BYWD.js";
|
|
3
|
+
import { a as n, c as r, f as i, i as a, l as o, o as s, p as c, r as l, t as u, u as d } from "./picker-lpH_xp14.js";
|
|
4
4
|
import { n as f, r as p } from "./useODataSelectBase-Bq36Wp1U.js";
|
|
5
5
|
import { Fragment as m, useCallback as h, useMemo as g, useRef as ee, useState as te } from "react";
|
|
6
6
|
import { useODataCollectionModel as _ } from "@ryuzaki13/react-foundation-api/odata";
|
|
@@ -66,7 +66,7 @@ var C = {
|
|
|
66
66
|
//#endregion
|
|
67
67
|
//#region src/select/Select.tsx
|
|
68
68
|
function w(t) {
|
|
69
|
-
let { label: f, description: p, disabled: _, placeholder: S, size: ae, options: w, value: T, onChange: E, getOptionKey: D, getOptionLabel: O, getOptionCode: k, getOptionDisabled: A, getOptionAriaLabel: se, getOptionGroup: j, getOptionClassName: ce, renderOption: M, renderValue: N, className: le, buttonClassName: ue, optionsClassName: de, optionsMaxWidth: fe, optionsContentClassName: pe, searchable: P = !1, defaultFilter: me = !0, query: he, defaultQuery: ge, onQuery: _e, renderPopupHeader: ve, emptyState: ye,
|
|
69
|
+
let { label: f, description: p, disabled: _, placeholder: S, size: ae, options: w, value: T, onChange: E, getOptionKey: D, getOptionLabel: O, getOptionCode: k, getOptionDisabled: A, getOptionAriaLabel: se, getOptionGroup: j, getOptionClassName: ce, renderOption: M, renderValue: N, className: le, buttonClassName: ue, optionsClassName: de, optionsMaxWidth: fe, optionsContentClassName: pe, searchable: P = !1, defaultFilter: me = !0, query: he, defaultQuery: ge, onQuery: _e, renderPopupHeader: ve, emptyState: ye, isLoading: be, errorState: xe, placement: Se = "bottom-start", clearable: F = !1 } = t, I = E, L = ee(null), [R, Ce] = te(!1), z = P ? "search-single" : "display", B = T === void 0 ? void 0 : D(T), V = B === void 0 ? void 0 : w.find((e) => D(e) === B) ?? T, { query: H, setQuery: U, resetQueryOnClose: we } = l({
|
|
70
70
|
query: he,
|
|
71
71
|
defaultQuery: ge,
|
|
72
72
|
onQuery: _e,
|
|
@@ -156,6 +156,7 @@ function w(t) {
|
|
|
156
156
|
readOnly: !P,
|
|
157
157
|
autoComplete: "off",
|
|
158
158
|
role: "combobox",
|
|
159
|
+
isLoading: be,
|
|
159
160
|
value: Ge,
|
|
160
161
|
placeholder: V === void 0 || Z ? `${S ?? f ?? ""} <${w.length}>` : void 0,
|
|
161
162
|
"aria-labelledby": n,
|
|
@@ -233,7 +234,6 @@ function w(t) {
|
|
|
233
234
|
}, `group-${String(t.group.key)}-${n}`) : /* @__PURE__ */ b(m, { children: i }, `options-${n}`);
|
|
234
235
|
}) : W.map((e, t) => Je(s, e, t)) : /* @__PURE__ */ b(d, {
|
|
235
236
|
emptyState: ye,
|
|
236
|
-
loadingState: be,
|
|
237
237
|
errorState: xe
|
|
238
238
|
})
|
|
239
239
|
})
|
|
@@ -287,7 +287,7 @@ var E = ({ odata: e, segment: n, model: r, size: i, label: a, description: o, di
|
|
|
287
287
|
defaultFilter: !1,
|
|
288
288
|
disabled: s || f.isLoading,
|
|
289
289
|
placeholder: f.placeholder,
|
|
290
|
-
|
|
290
|
+
isLoading: f.isLoading,
|
|
291
291
|
errorState: f.isError ? "Ошибка загрузки" : void 0,
|
|
292
292
|
emptyState: !f.isLoading && !f.isError ? "Нет данных" : void 0,
|
|
293
293
|
clearable: d
|
|
@@ -325,4 +325,4 @@ function k({ label: e, description: t, disabled: n, placeholder: r, size: i, opt
|
|
|
325
325
|
//#endregion
|
|
326
326
|
export { S as i, E as n, w as r, k as t };
|
|
327
327
|
|
|
328
|
-
//# sourceMappingURL=select-
|
|
328
|
+
//# sourceMappingURL=select-3KLv_evq.js.map
|