@ryuzaki13/react-foundation-ui 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/badge/Badge.d.ts.map +1 -1
- package/dist/badge/index.js +1 -1
- package/dist/badge/stories/Badge.stories.js +1 -1
- package/dist/base-table/index.js +1 -1
- package/dist/base-table/lib/columnPinning.d.ts.map +1 -1
- package/dist/base-table/model/useTableColumnOrder.d.ts +1 -1
- package/dist/base-table/model/useTableColumnOrder.d.ts.map +1 -1
- package/dist/base-table/model/useTableColumnSizing.d.ts +1 -1
- package/dist/base-table/model/useTableColumnSizing.d.ts.map +1 -1
- package/dist/base-table/ui/BaseTable.d.ts +2 -2
- package/dist/base-table/ui/BaseTable.d.ts.map +1 -1
- package/dist/base-table/ui/BaseTableHeaderCell.d.ts.map +1 -1
- package/dist/base-table/ui/FormattedTableCell.d.ts.map +1 -1
- package/dist/check-box/CheckBox.d.ts.map +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/check-box/stories/CheckBox.stories.js +1 -1
- package/dist/chunks/{BadgeList-DHW_Ktr3.js → BadgeList-6qL9oNAp.js} +5 -5
- package/dist/chunks/BadgeList-6qL9oNAp.js.map +1 -0
- package/dist/chunks/{CalendarView-B75faWIU.js → CalendarView-DjShdvRD.js} +42 -42
- package/dist/chunks/{CalendarView-B75faWIU.js.map → CalendarView-DjShdvRD.js.map} +1 -1
- package/dist/chunks/{CheckBox-Cck5w1Ud.js → CheckBox-CulnjNvJ.js} +9 -9
- package/dist/chunks/CheckBox-CulnjNvJ.js.map +1 -0
- package/dist/chunks/{DateInput-CINDYueM.js → DateInput-LSSvObtg.js} +3 -3
- package/dist/chunks/DateInput-LSSvObtg.js.map +1 -0
- package/dist/chunks/Dialog-BPS4BeWZ.js.map +1 -1
- package/dist/chunks/{DisclosureGroup-0BtaXO54.js → DisclosureGroup-Plk2M_Vl.js} +9 -9
- package/dist/chunks/DisclosureGroup-Plk2M_Vl.js.map +1 -0
- package/dist/chunks/{DropZone-hf7Em__0.js → DropZone-DPGTpHI6.js} +7 -7
- package/dist/chunks/DropZone-DPGTpHI6.js.map +1 -0
- package/dist/chunks/DropdownMenu-Ds-trH4M.js.map +1 -1
- package/dist/chunks/Flex-DbBdq336.js.map +1 -1
- package/dist/chunks/Grid-ByIIytjh.js.map +1 -1
- package/dist/chunks/{Input-Ce2HXBUc.js → Input-Wrew1puH.js} +30 -30
- package/dist/chunks/Input-Wrew1puH.js.map +1 -0
- package/dist/chunks/{InputDateTime-DPtY_4Od.js → InputDateTime-2PCX8an8.js} +2 -2
- package/dist/chunks/{InputDateTime-DPtY_4Od.js.map → InputDateTime-2PCX8an8.js.map} +1 -1
- package/dist/chunks/{InputFile-ga5yJmdZ.js → InputFile-Ca-bRo93.js} +2 -2
- package/dist/chunks/InputFile-Ca-bRo93.js.map +1 -0
- package/dist/chunks/{InputFiles-Or2Nvfgk.js → InputFiles-pI9rQXOI.js} +22 -22
- package/dist/chunks/InputFiles-pI9rQXOI.js.map +1 -0
- package/dist/chunks/{InputImage-BeA5WJz1.js → InputImage-B522AQzl.js} +2 -2
- package/dist/chunks/{InputImage-BeA5WJz1.js.map → InputImage-B522AQzl.js.map} +1 -1
- package/dist/chunks/{LabeledExpandableActionPanel-Bx-DWmYz.js → LabeledExpandableActionPanel-CWmOSWeS.js} +12 -12
- package/dist/chunks/LabeledExpandableActionPanel-CWmOSWeS.js.map +1 -0
- package/dist/chunks/{Listbox-CY1wQOCP.js → Listbox-B6F_IKQv.js} +22 -22
- package/dist/chunks/Listbox-B6F_IKQv.js.map +1 -0
- package/dist/chunks/{MultiSelect-CBqTylqO.js → MultiSelect-CUXA8gx-.js} +12 -12
- package/dist/chunks/{MultiSelect-CBqTylqO.js.map → MultiSelect-CUXA8gx-.js.map} +1 -1
- package/dist/chunks/{NotificationsHost-BQc-zOr2.js → NotificationsHost-Bnq7xFKO.js} +24 -24
- package/dist/chunks/NotificationsHost-Bnq7xFKO.js.map +1 -0
- package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js → PresetRangeDateInput-B_8jsilZ.js} +2 -2
- package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js.map → PresetRangeDateInput-B_8jsilZ.js.map} +1 -1
- package/dist/chunks/{RadioButton-DJp31HFR.js → RadioButton-D5vPW4Yr.js} +8 -8
- package/dist/chunks/RadioButton-D5vPW4Yr.js.map +1 -0
- package/dist/chunks/{Select-B7k_8_Lf.js → Select-CoAYWNOn.js} +10 -10
- package/dist/chunks/Select-CoAYWNOn.js.map +1 -0
- package/dist/chunks/{SerializableSelect-53uNCqdE.js → SerializableSelect-awBOWKTj.js} +2 -2
- package/dist/chunks/{SerializableSelect-53uNCqdE.js.map → SerializableSelect-awBOWKTj.js.map} +1 -1
- package/dist/chunks/{SingleDateTimeInput-CwvIbwje.js → SingleDateTimeInput-o44Vlwdk.js} +19 -19
- package/dist/chunks/SingleDateTimeInput-o44Vlwdk.js.map +1 -0
- package/dist/chunks/{StateSelect-D0wuUdT9.js → StateSelect-abZq176J.js} +2 -2
- package/dist/chunks/{StateSelect-D0wuUdT9.js.map → StateSelect-abZq176J.js.map} +1 -1
- package/dist/chunks/{Switch-B476FBUD.js → Switch-DHMnZVmN.js} +9 -9
- package/dist/chunks/Switch-DHMnZVmN.js.map +1 -0
- package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js → TextEditorLexicalClient-Dt4eaPA3.js} +4 -4
- package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js.map → TextEditorLexicalClient-Dt4eaPA3.js.map} +1 -1
- package/dist/chunks/{Textarea-DeJJjjkI.js → Textarea-DOVrPH4I.js} +2 -2
- package/dist/chunks/{Textarea-DeJJjjkI.js.map → Textarea-DOVrPH4I.js.map} +1 -1
- package/dist/chunks/TimePanel-_kF2RtHk.js.map +1 -1
- package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js → TreeMultiSelect-C76RYavo.js} +2 -2
- package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js.map → TreeMultiSelect-C76RYavo.js.map} +1 -1
- package/dist/chunks/{TreePickerBase-DYzTsSBQ.js → TreePickerBase-qNHIWbYL.js} +155 -155
- package/dist/chunks/TreePickerBase-qNHIWbYL.js.map +1 -0
- package/dist/chunks/{TreeSelect-DGLDu6qc.js → TreeSelect-LEhNdPCX.js} +2 -2
- package/dist/chunks/{TreeSelect-DGLDu6qc.js.map → TreeSelect-LEhNdPCX.js.map} +1 -1
- package/dist/chunks/{base-table-DVje02Zi.js → base-table-ij2guVMB.js} +3 -3
- package/dist/chunks/base-table-ij2guVMB.js.map +1 -0
- package/dist/chunks/{layout-picker-BA9vA8JI.js → layout-picker-CzZ8Xzkk.js} +9 -9
- package/dist/chunks/layout-picker-CzZ8Xzkk.js.map +1 -0
- package/dist/chunks/{misc-DrmMj8GO.js → misc-Bj0y3ERC.js} +54 -54
- package/dist/chunks/misc-Bj0y3ERC.js.map +1 -0
- package/dist/chunks/{modal-DqVcZws_.js → modal-B4ivQb2h.js} +10 -10
- package/dist/chunks/modal-B4ivQb2h.js.map +1 -0
- package/dist/chunks/{picker-Cj4RnJh6.js → picker-gIUs0nE_.js} +13 -13
- package/dist/chunks/picker-gIUs0nE_.js.map +1 -0
- package/dist/chunks/popover-C79P5bm2.js.map +1 -1
- package/dist/chunks/{slider-34wxzKkG.js → slider-CigVo4Ju.js} +3 -3
- package/dist/chunks/slider-CigVo4Ju.js.map +1 -0
- package/dist/chunks/{sortable-CwDHC3CA.js → sortable-BZqnZ_LA.js} +10 -10
- package/dist/chunks/sortable-BZqnZ_LA.js.map +1 -0
- package/dist/chunks/{table-BYA0hCj7.js → table-CK-CM2zD.js} +2 -2
- package/dist/chunks/table-CK-CM2zD.js.map +1 -0
- package/dist/chunks/table-column-interactions-DPyJDD7P.js.map +1 -1
- package/dist/chunks/{tabs-CjU2KCgs.js → tabs-D5ikIIng.js} +2 -2
- package/dist/chunks/{tabs-CjU2KCgs.js.map → tabs-D5ikIIng.js.map} +1 -1
- package/dist/context-menu/components/MenuContent.d.ts.map +1 -1
- package/dist/context-menu/components/MenuContext.d.ts.map +1 -1
- package/dist/context-menu/components/MenuRoot.d.ts.map +1 -1
- package/dist/context-menu/components/RadialMenuContent.d.ts.map +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-input/lib/types.d.ts.map +1 -1
- package/dist/date-input/stories/DateInput.stories.js +2 -2
- package/dist/date-input/ui/CalendarView.d.ts.map +1 -1
- package/dist/date-input/ui/DateInput.d.ts.map +1 -1
- package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +1 -1
- package/dist/date-time-input/index.js +1 -1
- package/dist/date-time-input/lib/dateTimeValue.d.ts.map +1 -1
- package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +1 -1
- package/dist/date-time-input/ui/SingleDateTimeInput.d.ts.map +1 -1
- package/dist/dialog/Dialog.d.ts.map +1 -1
- package/dist/disclosure/Disclosure.d.ts.map +1 -1
- package/dist/disclosure/index.js +1 -1
- package/dist/disclosure/stories/Disclosure.stories.js +1 -1
- package/dist/drop-zone/DropZone.d.ts.map +1 -1
- package/dist/drop-zone/index.js +1 -1
- package/dist/drop-zone/stories/DropZone.stories.d.ts.map +1 -1
- package/dist/drop-zone/stories/DropZone.stories.js +1 -1
- package/dist/drop-zone/stories/DropZone.stories.js.map +1 -1
- package/dist/errors/ErrorDisplay.d.ts.map +1 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/expandable-action-panel/ExpandableActionPanel.d.ts.map +1 -1
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +4 -4
- package/dist/image/index.js +3 -3
- package/dist/image/index.js.map +1 -1
- package/dist/image/ui/ImageSelection.d.ts.map +1 -1
- package/dist/input/Input.d.ts.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input/stories/Input.stories.js +1 -1
- package/dist/input-date-time/index.js +1 -1
- package/dist/input-date-time/stories/InputDateTime.stories.js +1 -1
- package/dist/input-file/InputFile.d.ts.map +1 -1
- package/dist/input-file/index.js +1 -1
- package/dist/input-file/stories/InputFile.stories.d.ts.map +1 -1
- package/dist/input-file/stories/InputFile.stories.js +1 -1
- package/dist/input-file/stories/InputFile.stories.js.map +1 -1
- package/dist/input-files/InputFilesList.d.ts.map +1 -1
- package/dist/input-files/index.js +1 -1
- package/dist/input-files/stories/InputFiles.stories.d.ts +1 -1
- package/dist/input-files/stories/InputFiles.stories.d.ts.map +1 -1
- package/dist/input-files/stories/InputFiles.stories.js +1 -1
- package/dist/input-files/stories/InputFiles.stories.js.map +1 -1
- package/dist/input-image/index.js +1 -1
- package/dist/input-image/stories/InputImage.stories.d.ts.map +1 -1
- package/dist/input-image/stories/InputImage.stories.js +1 -1
- package/dist/input-image/stories/InputImage.stories.js.map +1 -1
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +1 -1
- package/dist/layout-picker/stories/LayoutPicker.stories.js +1 -1
- package/dist/layout-picker/ui/LayoutPicker.d.ts.map +1 -1
- package/dist/list/List.d.ts.map +1 -1
- package/dist/list/index.js +5 -5
- package/dist/list/index.js.map +1 -1
- package/dist/listbox/Listbox.d.ts.map +1 -1
- package/dist/listbox/index.js +1 -1
- package/dist/listbox/stories/Listbox.stories.js +1 -1
- package/dist/misc/CopyTextWrapper.d.ts.map +1 -1
- package/dist/misc/OneStepScroller.d.ts.map +1 -1
- package/dist/misc/StateIcon.d.ts.map +1 -1
- package/dist/misc/index.js +1 -1
- package/dist/modal/Modal.d.ts +5 -1
- package/dist/modal/Modal.d.ts.map +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/modal/stories/Modal.stories.js +2 -2
- package/dist/multi-select/index.js +1130 -24
- package/dist/multi-select/index.js.map +1 -1
- package/dist/multi-select/model/useODataMultiSelect.d.ts +23 -0
- package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts +20 -0
- package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts +21 -0
- package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/ODataMultiSelect.d.ts +7 -0
- package/dist/multi-select/ui/ODataMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/index.d.ts +3 -0
- package/dist/multi-select/ui/index.d.ts.map +1 -1
- package/dist/multi-select/ui/stories/MultiSelect.stories.js +1 -1
- package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts +44 -0
- package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts.map +1 -0
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/model/NotificationsProvider.d.ts.map +1 -1
- package/dist/notifications/ui/NotificationsHost.d.ts.map +1 -1
- package/dist/notifications/ui/stories/NotificationsHost.stories.js +1 -1
- package/dist/period-select/PeriodSelect.d.ts +1 -1
- package/dist/period-select/PeriodSelect.d.ts.map +1 -1
- package/dist/period-select/index.js.map +1 -1
- package/dist/period-select/lib/periodSelect.d.ts.map +1 -1
- package/dist/period-select/stories/PeriodSelect.stories.d.ts.map +1 -1
- package/dist/period-select/stories/PeriodSelect.stories.js +1 -1
- package/dist/period-select/stories/PeriodSelect.stories.js.map +1 -1
- package/dist/picker/PickerPopup.d.ts.map +1 -1
- package/dist/picker/PickerTriggerActions.d.ts.map +1 -1
- package/dist/picker/index.js +1 -1
- package/dist/picker/model/usePickerFloatingListbox.d.ts.map +1 -1
- package/dist/popover/FloatingPopover.d.ts.map +1 -1
- package/dist/popover/components/PopoverContent.d.ts.map +1 -1
- package/dist/popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/popover/stories/Popover.stories.js +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/RadioButton.d.ts.map +1 -1
- package/dist/radio-button/index.js +1 -1
- package/dist/radio-button/stories/RadioButton.stories.js +1 -1
- package/dist/select/ODataSelect.d.ts +9 -0
- package/dist/select/ODataSelect.d.ts.map +1 -0
- package/dist/select/Select.d.ts.map +1 -1
- package/dist/select/index.js +2 -2
- package/dist/select/model/useODataSelect.d.ts +25 -0
- package/dist/select/model/useODataSelect.d.ts.map +1 -0
- package/dist/select/model/useODataSelectBase.d.ts +24 -0
- package/dist/select/model/useODataSelectBase.d.ts.map +1 -0
- package/dist/select/stories/ODataSelect.stories.d.ts +46 -0
- package/dist/select/stories/ODataSelect.stories.d.ts.map +1 -0
- package/dist/select/stories/Select.stories.js +1 -1
- package/dist/select/stories/SerializableSelect.stories.js +1 -1
- package/dist/select/stories/odataStoryFixtures.d.ts +35 -0
- package/dist/select/stories/odataStoryFixtures.d.ts.map +1 -0
- package/dist/simple-table/index.js +1 -1
- package/dist/simple-table/index.js.map +1 -1
- package/dist/slider/Slider.d.ts.map +1 -1
- package/dist/slider/index.js +1 -1
- package/dist/slider/stories/Slider.stories.js +1 -1
- package/dist/slider/stories/SliderInput.stories.js +1 -1
- package/dist/sortable/Sortable.d.ts.map +1 -1
- package/dist/sortable/SortableDragHandle.d.ts.map +1 -1
- package/dist/sortable/index.js +1 -1
- package/dist/sortable/stories/Sortable.stories.js +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/state-select/stories/StateSelect.stories.d.ts.map +1 -1
- package/dist/state-select/stories/StateSelect.stories.js +1 -1
- package/dist/state-select/stories/StateSelect.stories.js.map +1 -1
- package/dist/switch/Switch.d.ts.map +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/switch/stories/Switch.stories.js +1 -1
- package/dist/table/Table.d.ts +1 -1
- package/dist/table/Table.d.ts.map +1 -1
- package/dist/table/index.js +1 -1
- package/dist/table/stories/Table.stories.d.ts +155 -0
- package/dist/table/stories/Table.stories.d.ts.map +1 -0
- package/dist/table-column-interactions/TableHeaderInteractionCell.d.ts.map +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tabs/stories/Tabs.stories.d.ts.map +1 -1
- package/dist/tabs/stories/Tabs.stories.js +2 -2
- package/dist/tabs/stories/Tabs.stories.js.map +1 -1
- package/dist/text/TextOverflow.d.ts.map +1 -1
- package/dist/text/index.js.map +1 -1
- package/dist/text-editor/TextEditorLexicalClient.d.ts.map +1 -1
- package/dist/text-editor/index.js +2 -2
- package/dist/textarea/index.js +1 -1
- package/dist/textarea/stories/Textarea.stories.js +1 -1
- package/dist/tree-select/ODataTreeMultiSelect.d.ts +12 -0
- package/dist/tree-select/ODataTreeMultiSelect.d.ts.map +1 -0
- package/dist/tree-select/ODataTreeSelect.d.ts +13 -0
- package/dist/tree-select/ODataTreeSelect.d.ts.map +1 -0
- package/dist/tree-select/TreeNodeContent.d.ts.map +1 -1
- package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
- package/dist/tree-select/index.js +2 -2
- package/dist/tree-select/model/buildODataTreeNodes.d.ts +12 -0
- package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -0
- package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts +4 -0
- package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts.map +1 -0
- package/dist/tree-select/model/useODataTreeData.d.ts +11 -0
- package/dist/tree-select/model/useODataTreeData.d.ts.map +1 -0
- package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts +55 -0
- package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts.map +1 -0
- package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts +54 -0
- package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts.map +1 -0
- package/dist/tree-select/stories/TreeMultiSelect.stories.js +1 -1
- package/dist/tree-select/stories/TreeSelect.stories.js +1 -1
- package/dist/tree-table/TreeTable.d.ts +1 -1
- package/dist/tree-table/TreeTable.d.ts.map +1 -1
- package/dist/tree-table/index.js +2 -2
- package/dist/tree-table/index.js.map +1 -1
- package/dist/tree-table/stories/TreeTable.stories.d.ts +158 -0
- package/dist/tree-table/stories/TreeTable.stories.d.ts.map +1 -0
- package/package.json +5 -4
- package/dist/chunks/BadgeList-DHW_Ktr3.js.map +0 -1
- package/dist/chunks/CheckBox-Cck5w1Ud.js.map +0 -1
- package/dist/chunks/DateInput-CINDYueM.js.map +0 -1
- package/dist/chunks/DisclosureGroup-0BtaXO54.js.map +0 -1
- package/dist/chunks/DropZone-hf7Em__0.js.map +0 -1
- package/dist/chunks/Input-Ce2HXBUc.js.map +0 -1
- package/dist/chunks/InputFile-ga5yJmdZ.js.map +0 -1
- package/dist/chunks/InputFiles-Or2Nvfgk.js.map +0 -1
- package/dist/chunks/LabeledExpandableActionPanel-Bx-DWmYz.js.map +0 -1
- package/dist/chunks/Listbox-CY1wQOCP.js.map +0 -1
- package/dist/chunks/NotificationsHost-BQc-zOr2.js.map +0 -1
- package/dist/chunks/RadioButton-DJp31HFR.js.map +0 -1
- package/dist/chunks/Select-B7k_8_Lf.js.map +0 -1
- package/dist/chunks/SingleDateTimeInput-CwvIbwje.js.map +0 -1
- package/dist/chunks/Switch-B476FBUD.js.map +0 -1
- package/dist/chunks/TreePickerBase-DYzTsSBQ.js.map +0 -1
- package/dist/chunks/base-table-DVje02Zi.js.map +0 -1
- package/dist/chunks/layout-picker-BA9vA8JI.js.map +0 -1
- package/dist/chunks/misc-DrmMj8GO.js.map +0 -1
- package/dist/chunks/modal-DqVcZws_.js.map +0 -1
- package/dist/chunks/picker-Cj4RnJh6.js.map +0 -1
- package/dist/chunks/slider-34wxzKkG.js.map +0 -1
- package/dist/chunks/sortable-CwDHC3CA.js.map +0 -1
- package/dist/chunks/table-BYA0hCj7.js.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Text as e } from "../text/index.js";
|
|
2
2
|
import { t } from "./ui.module-BisoTevy.js";
|
|
3
3
|
import { t as n } from "./Grid-ByIIytjh.js";
|
|
4
|
-
import { t as r } from "./CheckBox-
|
|
5
|
-
import { a as i, c as a, d as o, f as s, i as ee, l as te, n as ne, r as c, t as re, u as l } from "./picker-
|
|
4
|
+
import { t as r } from "./CheckBox-CulnjNvJ.js";
|
|
5
|
+
import { a as i, c as a, d as o, f as s, i as ee, l as te, n as ne, r as c, t as re, u as l } from "./picker-gIUs0nE_.js";
|
|
6
6
|
import { t as u } from "./separator-CIqnk2z9.js";
|
|
7
7
|
import { t as d } from "./SelectOptionContent-CI7wq9Oi.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { cn as f } from "@ryuzaki13/react-foundation-lib/utils";
|
|
9
|
+
import { XIcon as p } from "lucide-react";
|
|
10
10
|
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
11
11
|
import { forwardRef as _, useCallback as ie, useMemo as v, useRef as ae, useState as oe } from "react";
|
|
12
12
|
//#region src/multi-select/ui/MultiSelectOption.tsx
|
|
@@ -129,14 +129,14 @@ function me(e, t, n) {
|
|
|
129
129
|
}
|
|
130
130
|
function E({ entries: e, listId: n, activeIndex: i, selectedKeys: a, codeKey: o, query: s, highlightQuery: ee, getOptionDisabled: te, getOptionId: ne, setOptionRef: c, toggleOption: re, selectOnlyOption: l, renderItem: u }) {
|
|
131
131
|
return e.map(({ item: e, index: d }) => {
|
|
132
|
-
let
|
|
132
|
+
let p = d === i, m = a.has(T(e, o)), _ = te?.(e) ?? !1;
|
|
133
133
|
return /* @__PURE__ */ g("div", {
|
|
134
134
|
id: ne(n, d),
|
|
135
135
|
ref: (e) => c(d, e),
|
|
136
136
|
role: "option",
|
|
137
137
|
"aria-selected": m,
|
|
138
138
|
"aria-disabled": _ || void 0,
|
|
139
|
-
className:
|
|
139
|
+
className: f(t.uiSelectOption, _ && t.disabled, m && t.selected, p && t.uiPopupOptionActive),
|
|
140
140
|
onMouseDown: (e) => {
|
|
141
141
|
e.preventDefault();
|
|
142
142
|
},
|
|
@@ -164,7 +164,7 @@ function E({ entries: e, listId: n, activeIndex: i, selectedKeys: a, codeKey: o,
|
|
|
164
164
|
},
|
|
165
165
|
children: u(e, {
|
|
166
166
|
selected: m,
|
|
167
|
-
active:
|
|
167
|
+
active: p,
|
|
168
168
|
disabled: _,
|
|
169
169
|
query: s,
|
|
170
170
|
highlightQuery: ee
|
|
@@ -173,7 +173,7 @@ function E({ entries: e, listId: n, activeIndex: i, selectedKeys: a, codeKey: o,
|
|
|
173
173
|
}, `${T(e, o)}-${d}`);
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
|
-
var D = _(({ codeKey: e, textKey: n, hideCode: r, items: l, value: d, onChange:
|
|
176
|
+
var D = _(({ codeKey: e, textKey: n, hideCode: r, items: l, value: d, onChange: f, label: _, description: y, placeholder: x, size: S, query: se, defaultQuery: w, highlightQuery: D, onQuery: he, defaultFilter: O = !0, onOpen: ge, onClose: _e, getOptionDisabled: k, disabled: A, error: j, isLoading: M, renderToken: N, renderToolbar: P, renderItem: ve }, F) => {
|
|
177
177
|
let I = ae(null), [L, ye] = oe(!1), R = "search-multi", z = d ?? fe, be = v(() => new Set(z.map((t) => T(t, e))), [e, z]), xe = v(() => l.filter((t) => !be.has(T(t, e))), [
|
|
178
178
|
e,
|
|
179
179
|
be,
|
|
@@ -202,7 +202,7 @@ var D = _(({ codeKey: e, textKey: n, hideCode: r, items: l, value: d, onChange:
|
|
|
202
202
|
}), W = v(() => [...H, ...U], [U, H]), Ce = H.length > 0 ? 0 : -1, { draftValue: G, setDraftValue: K, prepareOpen: we } = ne({
|
|
203
203
|
value: z,
|
|
204
204
|
open: L,
|
|
205
|
-
onCommit:
|
|
205
|
+
onCommit: f,
|
|
206
206
|
onOpen: ge,
|
|
207
207
|
onClose: _e,
|
|
208
208
|
isEqual: (t, n) => me(t, n, e)
|
|
@@ -237,7 +237,7 @@ var D = _(({ codeKey: e, textKey: n, hideCode: r, items: l, value: d, onChange:
|
|
|
237
237
|
}
|
|
238
238
|
F && (F.current = e);
|
|
239
239
|
}, He = () => {
|
|
240
|
-
K([]), L ||
|
|
240
|
+
K([]), L || f([]);
|
|
241
241
|
}, Ue = () => {
|
|
242
242
|
K((t) => {
|
|
243
243
|
let n = [...t], r = new Set(t.map((t) => T(t, e)));
|
|
@@ -327,7 +327,7 @@ var D = _(({ codeKey: e, textKey: n, hideCode: r, items: l, value: d, onChange:
|
|
|
327
327
|
"data-action": "clear-multi-select",
|
|
328
328
|
onClick: He,
|
|
329
329
|
"aria-label": "Очистить все",
|
|
330
|
-
children: /* @__PURE__ */ h(
|
|
330
|
+
children: /* @__PURE__ */ h(p, {})
|
|
331
331
|
})]
|
|
332
332
|
}),
|
|
333
333
|
onChange: (e) => {
|
|
@@ -419,4 +419,4 @@ D.displayName = "MultiSelect";
|
|
|
419
419
|
//#endregion
|
|
420
420
|
export { S as n, D as t };
|
|
421
421
|
|
|
422
|
-
//# sourceMappingURL=MultiSelect-
|
|
422
|
+
//# sourceMappingURL=MultiSelect-CUXA8gx-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelect-CBqTylqO.js","names":[],"sources":["../../src/multi-select/ui/MultiSelectOption.tsx","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/ui/MultiSelectOptionsToolbar.tsx","../../src/multi-select/ui/MultiSelectToken.tsx","../../src/multi-select/ui/defaultRenderers.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelect.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\theight: calc(100% - var(--space-sm));\n\tmax-width: calc(100% - var(--control-height) * 2);\n\n\t// overflow: hidden;\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n}\n\n.multiSelectToken {\n\t// font-size: var(--font-size-sm);\n\n\t// flex: 1 1 0%;\n\t// min-width: 0;\n\tmax-width: 70%;\n\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tword-break: normal;\n\ttext-overflow: ellipsis;\n\n\tpointer-events: none;\n}\n\n.selectAllButton {\n\t// font-size: var(--font-size-sm);\n\tpadding-block: var(--space-xs);\n\tborder-radius: var(--radius-sm);\n\n\t&:hover {\n\t\t// color: var(--content-accent);\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n","import { Grid } from \"../../grid\";\n\nimport styles from \"./MultiSelect.module.scss\";\n\n/**\n * Панель массовых действий для `MultiSelect`. Позволяет быстро выбрать все доступные элементы или снять выбор.\n */\nexport function MultiSelectOptionsToolbar({ onSelectAll, onDeselectAll }: { onSelectAll: () => void; onDeselectAll: () => void }) {\n\treturn (\n\t\t<Grid.Container gap=\"xs\" templateColumns=\"1fr 1fr\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectAllButton}\n\t\t\t\tonClick={onSelectAll}\n\t\t\t\tdata-ui=\"multi-select-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.selectAllButton}\n\t\t\t\tonClick={onDeselectAll}\n\t\t\t\tdata-ui=\"multi-select-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 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 { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { MultiSelectOption } from \"./MultiSelectOption\";\nimport { MultiSelectOptionsToolbar } from \"./MultiSelectOptionsToolbar\";\nimport { MultiSelectToken } from \"./MultiSelectToken\";\n\nimport type { MultiSelectItemState, MultiSelectRenderContext } from \"./MultiSelect\";\n\ninterface MultiSelectRendererConfig {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\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 `${items.length} элемент${items.length > 5 ? \"ов\" : \"а\"})`;\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 <MultiSelectOptionsToolbar 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 { XIcon } from \"lucide-react\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\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\ninterface MultiSelectOptionsProps extends PropsWithChildren {\n\tisNoData?: boolean;\n\tisLoading?: boolean;\n\terror?: string;\n}\n\nfunction MultiSelectOptionsWrapper({ isNoData, isLoading, error, children }: MultiSelectOptionsProps) {\n\tif (isNoData) return <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\tif (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 { query: currentQuery, setQuery } = usePickerQuery({\n\t\t\topen,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\tonQuery,\n\t\t\ttriggerMode\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: setOpen,\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\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tsize={size}\n\t\t\t\tclassName={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\tdisabled={disabled}\n\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\tplaceholder={hasSelectedItems ? undefined : placeholder}\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{tokenNode}\n\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\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} isLoading={isLoading} 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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiSelect-CUXA8gx-.js","names":[],"sources":["../../src/multi-select/ui/MultiSelectOption.tsx","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/ui/MultiSelectOptionsToolbar.tsx","../../src/multi-select/ui/MultiSelectToken.tsx","../../src/multi-select/ui/defaultRenderers.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelect.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\theight: calc(100% - var(--space-sm));\n\tmax-width: calc(100% - var(--control-height) * 2);\n\n\t// overflow: hidden;\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n}\n\n.multiSelectToken {\n\t// font-size: var(--font-size-sm);\n\n\t// flex: 1 1 0%;\n\t// min-width: 0;\n\tmax-width: 70%;\n\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tword-break: normal;\n\ttext-overflow: ellipsis;\n\n\tpointer-events: none;\n}\n\n.selectAllButton {\n\t// font-size: var(--font-size-sm);\n\tpadding-block: var(--space-xs);\n\tborder-radius: var(--radius-sm);\n\n\t&:hover {\n\t\t// color: var(--content-accent);\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n","import { Grid } from \"../../grid\";\n\nimport styles from \"./MultiSelect.module.scss\";\n\n/**\n * Панель массовых действий для `MultiSelect`. Позволяет быстро выбрать все доступные элементы или снять выбор.\n */\nexport function MultiSelectOptionsToolbar({ onSelectAll, onDeselectAll }: { onSelectAll: () => void; onDeselectAll: () => void }) {\n\treturn (\n\t\t<Grid.Container gap=\"xs\" templateColumns=\"1fr 1fr\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectAllButton}\n\t\t\t\tonClick={onSelectAll}\n\t\t\t\tdata-ui=\"multi-select-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.selectAllButton}\n\t\t\t\tonClick={onDeselectAll}\n\t\t\t\tdata-ui=\"multi-select-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 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 { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { MultiSelectOption } from \"./MultiSelectOption\";\nimport { MultiSelectOptionsToolbar } from \"./MultiSelectOptionsToolbar\";\nimport { MultiSelectToken } from \"./MultiSelectToken\";\n\nimport type { MultiSelectItemState, MultiSelectRenderContext } from \"./MultiSelect\";\n\ninterface MultiSelectRendererConfig {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\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 `${items.length} элемент${items.length > 5 ? \"ов\" : \"а\"})`;\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 <MultiSelectOptionsToolbar 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\tisLoading?: boolean;\n\terror?: string;\n}\n\nfunction MultiSelectOptionsWrapper({ isNoData, isLoading, error, children }: MultiSelectOptionsProps) {\n\tif (isNoData) return <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\tif (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 { query: currentQuery, setQuery } = usePickerQuery({\n\t\t\topen,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\tonQuery,\n\t\t\ttriggerMode\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: setOpen,\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\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tsize={size}\n\t\t\t\tclassName={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\tdisabled={disabled}\n\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\tplaceholder={hasSelectedItems ? undefined : placeholder}\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{tokenNode}\n\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\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} isLoading={isLoading} 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"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { i as e } from "./Flex-DbBdq336.js";
|
|
2
2
|
import { t } from "./Button-BZ_b-Kin.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { cn as n } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
|
+
import { AlertCircleIcon as r, CheckCircle2Icon as i, InfoIcon as a, TriangleAlertIcon as o, XIcon as s } from "lucide-react";
|
|
5
5
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
6
|
import { createContext as u, useContext as d, useEffect as f, useMemo as p } from "react";
|
|
7
7
|
import { createMissingContextError as m } from "@ryuzaki13/react-foundation-lib/error";
|
|
@@ -62,34 +62,34 @@ var w = {
|
|
|
62
62
|
}, T = {
|
|
63
63
|
info: {
|
|
64
64
|
title: "Информация",
|
|
65
|
-
Icon:
|
|
65
|
+
Icon: a
|
|
66
66
|
},
|
|
67
67
|
success: {
|
|
68
68
|
title: "Успешно",
|
|
69
|
-
Icon:
|
|
69
|
+
Icon: i
|
|
70
70
|
},
|
|
71
71
|
warning: {
|
|
72
72
|
title: "Предупреждение",
|
|
73
|
-
Icon:
|
|
73
|
+
Icon: o
|
|
74
74
|
},
|
|
75
75
|
error: {
|
|
76
76
|
title: "Ошибка",
|
|
77
|
-
Icon:
|
|
77
|
+
Icon: r
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
80
|
function E() {
|
|
81
|
-
let
|
|
81
|
+
let r = x(), { dismiss: i } = S();
|
|
82
82
|
return /* @__PURE__ */ c("div", {
|
|
83
83
|
className: w.container,
|
|
84
84
|
"aria-label": "Область уведомлений",
|
|
85
85
|
"aria-live": "polite",
|
|
86
86
|
"aria-relevant": "additions text",
|
|
87
|
-
children:
|
|
88
|
-
let
|
|
87
|
+
children: r.map((r) => {
|
|
88
|
+
let a = T[r.type], o = r.title ?? a.title, u = a.Icon;
|
|
89
89
|
return /* @__PURE__ */ c("article", {
|
|
90
|
-
role:
|
|
90
|
+
role: r.type === "error" ? "alert" : "status",
|
|
91
91
|
"aria-atomic": "true",
|
|
92
|
-
className:
|
|
92
|
+
className: n(w.card, w[r.type]),
|
|
93
93
|
children: /* @__PURE__ */ l(e, {
|
|
94
94
|
align: "start",
|
|
95
95
|
justify: "between",
|
|
@@ -108,20 +108,20 @@ function E() {
|
|
|
108
108
|
children: [
|
|
109
109
|
/* @__PURE__ */ c("div", {
|
|
110
110
|
className: w.kicker,
|
|
111
|
-
children:
|
|
111
|
+
children: a.title
|
|
112
112
|
}),
|
|
113
|
-
|
|
113
|
+
r.title ? /* @__PURE__ */ c("div", {
|
|
114
114
|
className: w.title,
|
|
115
|
-
children:
|
|
115
|
+
children: o
|
|
116
116
|
}) : null,
|
|
117
117
|
/* @__PURE__ */ c("div", {
|
|
118
118
|
className: w.message,
|
|
119
|
-
children:
|
|
119
|
+
children: r.message
|
|
120
120
|
}),
|
|
121
|
-
|
|
121
|
+
r.actions?.length ? /* @__PURE__ */ c("div", {
|
|
122
122
|
className: w.actions,
|
|
123
|
-
children:
|
|
124
|
-
tone: e.tone ??
|
|
123
|
+
children: r.actions.map((e) => /* @__PURE__ */ c(t, {
|
|
124
|
+
tone: e.tone ?? r.type,
|
|
125
125
|
appearance: "outline",
|
|
126
126
|
"data-ui": "notification-action-button",
|
|
127
127
|
"data-action": "notification-action",
|
|
@@ -131,21 +131,21 @@ function E() {
|
|
|
131
131
|
}) : null
|
|
132
132
|
]
|
|
133
133
|
})]
|
|
134
|
-
}),
|
|
135
|
-
icon: /* @__PURE__ */ c(
|
|
134
|
+
}), r.dismissible === !1 ? null : /* @__PURE__ */ c(t, {
|
|
135
|
+
icon: /* @__PURE__ */ c(s, {}),
|
|
136
136
|
appearance: "ghost",
|
|
137
|
-
tone:
|
|
138
|
-
onClick: () => r
|
|
137
|
+
tone: r.type,
|
|
138
|
+
onClick: () => i(r.id),
|
|
139
139
|
"aria-label": "Закрыть уведомление",
|
|
140
140
|
"data-ui": "notification-dismiss-button",
|
|
141
141
|
"data-action": "dismiss-notification"
|
|
142
142
|
})]
|
|
143
143
|
})
|
|
144
|
-
},
|
|
144
|
+
}, r.id);
|
|
145
145
|
})
|
|
146
146
|
});
|
|
147
147
|
}
|
|
148
148
|
//#endregion
|
|
149
149
|
export { S as a, x as i, y as n, C as r, E as t };
|
|
150
150
|
|
|
151
|
-
//# sourceMappingURL=NotificationsHost-
|
|
151
|
+
//# sourceMappingURL=NotificationsHost-Bnq7xFKO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationsHost-Bnq7xFKO.js","names":[],"sources":["../../src/notifications/model/NotificationsProvider.tsx","../../src/notifications/ui/Notification.module.scss","../../src/notifications/ui/NotificationsHost.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { createContext, PropsWithChildren, useContext, useEffect, useMemo } from \"react\";\n\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\nimport {\n\tbindNotifications,\n\tcreateNotificationsStore,\n\tNotificationId,\n\tNotificationPushInput,\n\tNotificationsStoreApi,\n\tNotificationType\n} from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { useStore } from \"zustand\";\n\nconst NotificationsContext = createContext<NotificationsStoreApi | null>(null);\n\n/**\n * Провайдер уведомлений приложения. Хранит состояние списка уведомлений и предоставляет хуки доступа к нему.\n */\nexport function NotificationsProvider({ children }: PropsWithChildren) {\n\tconst store = useMemo(() => createNotificationsStore(), []);\n\n\tuseEffect(() => {\n\t\treturn bindNotifications(store);\n\t}, [store]);\n\n\treturn <NotificationsContext.Provider value={store}>{children}</NotificationsContext.Provider>;\n}\n\nfunction useNotificationApi() {\n\tconst ctx = useContext(NotificationsContext);\n\tif (!ctx) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"useNotificationApi\",\n\t\t\tproviderName: \"NotificationsProvider\"\n\t\t});\n\t}\n\treturn ctx;\n}\n\nexport function useNotifications() {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items);\n}\n\nexport function useNotify() {\n\tconst api = useNotificationApi();\n\tconst actions = useStore(api, (s) => s.actions);\n\n\tconst mk = (type: NotificationType) => (message: string, opts?: Omit<NotificationPushInput, \"type\" | \"message\">) =>\n\t\tactions.push({ type, message, ...opts });\n\n\treturn {\n\t\t...actions,\n\t\tsuccess: mk(\"success\"),\n\t\tinfo: mk(\"info\"),\n\t\twarning: mk(\"warning\"),\n\t\terror: mk(\"error\")\n\t};\n}\n\nexport function useNotificationById(id: NotificationId) {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items.find((n) => n.id === id));\n}\n","@use \"@/styles/mixins\" as *;\n\n.container {\n\tposition: fixed;\n\tz-index: var(--z-notify);\n\tbottom: 0;\n\tleft: 0;\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-lg);\n\twidth: min(28em, calc(100dvw - var(--space-lg) * 2));\n\tpointer-events: none;\n}\n\n.card {\n\t--notify-accent: var(--border-1);\n\t--notify-accent-surface: var(--surface-1);\n\t--notify-accent-text: var(--content-accent);\n\n\tposition: relative;\n\toverflow: hidden;\n\tpointer-events: auto;\n\twidth: 100%;\n\tpadding: var(--space-md);\n\t// border: var(--border);\n\tborder-left: 0.3125em solid var(--notify-accent);\n\tborder-radius: var(--radius-md);\n\tbackground: linear-gradient(37deg, var(--notify-accent-surface), var(--surface-0));\n\tcolor: var(--content-0);\n\tbox-shadow: var(--shadow-md);\n}\n\n.info {\n\t--notify-accent: var(--status-info-border);\n\t--notify-accent-surface: var(--status-info-soft);\n\t--notify-accent-text: var(--status-info-text);\n}\n\n.success {\n\t--notify-accent: var(--status-success-border);\n\t--notify-accent-surface: var(--status-success-soft);\n\t--notify-accent-text: var(--status-success-text);\n}\n\n.warning {\n\t--notify-accent: var(--status-warning-border);\n\t--notify-accent-surface: var(--status-warning-soft);\n\t--notify-accent-text: var(--status-warning-text);\n}\n\n.error {\n\t--notify-accent: var(--status-error-border);\n\t--notify-accent-surface: var(--status-error-soft);\n\t--notify-accent-text: var(--status-error-text);\n}\n\n.header,\n.content,\n.copy {\n\tmin-width: 0;\n}\n\n.content {\n\tmin-width: 0;\n\tflex: 1;\n}\n\n.icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tborder-radius: 50%;\n\tbackground-color: var(--notify-accent-surface);\n\tcolor: var(--notify-accent-text);\n\tborder: var(--border-width) solid color-mix(in srgb, var(--notify-accent) 22%, transparent);\n\n\tsvg {\n\t\twidth: 1.125em;\n\t\theight: 1.125em;\n\t}\n}\n\n.kicker {\n\tmargin-bottom: var(--space-xs);\n\tcolor: var(--notify-accent-text);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.title {\n\tcolor: var(--notify-accent-text);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.message {\n\tmargin-top: var(--space-xs);\n\tcolor: var(--content-0);\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n\n.actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tmargin-top: var(--space-sm);\n}\n\n@include mobile {\n\t.container {\n\t\tpadding: var(--space-md);\n\t\twidth: min(100dvw, calc(100dvw - var(--space-md) * 2));\n\t}\n}\n","import { NotificationType } from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AlertCircleIcon, CheckCircle2Icon, InfoIcon, TriangleAlertIcon, XIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { FlexContainer } from \"../../flex\";\nimport { useNotifications, useNotify } from \"../model/NotificationsProvider\";\n\nimport styles from \"./Notification.module.scss\";\n\nconst notificationConfig: Record<\n\tNotificationType,\n\t{\n\t\ttitle: string;\n\t\tIcon: typeof InfoIcon;\n\t}\n> = {\n\tinfo: {\n\t\ttitle: \"Информация\",\n\t\tIcon: InfoIcon\n\t},\n\tsuccess: {\n\t\ttitle: \"Успешно\",\n\t\tIcon: CheckCircle2Icon\n\t},\n\twarning: {\n\t\ttitle: \"Предупреждение\",\n\t\tIcon: TriangleAlertIcon\n\t},\n\terror: {\n\t\ttitle: \"Ошибка\",\n\t\tIcon: AlertCircleIcon\n\t}\n};\n\n/**\n * Хост для визуального отображения очереди уведомлений.\n * Обычно монтируется один раз на уровне приложения рядом с провайдером уведомлений.\n */\nexport function NotificationsHost() {\n\tconst items = useNotifications();\n\tconst { dismiss } = useNotify();\n\n\treturn (\n\t\t<div className={styles.container} aria-label=\"Область уведомлений\" aria-live=\"polite\" aria-relevant=\"additions text\">\n\t\t\t{items.map((notification) => {\n\t\t\t\tconst config = notificationConfig[notification.type];\n\t\t\t\tconst title = notification.title ?? config.title;\n\t\t\t\tconst Icon = config.Icon;\n\n\t\t\t\treturn (\n\t\t\t\t\t<article\n\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\trole={notification.type === \"error\" ? \"alert\" : \"status\"}\n\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\tclassName={cn(styles.card, styles[notification.type])}>\n\t\t\t\t\t\t<FlexContainer align=\"start\" justify=\"between\" gap=\"sm\" className={styles.header}>\n\t\t\t\t\t\t\t<FlexContainer align=\"start\" gap=\"sm\" className={styles.content}>\n\t\t\t\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<Icon />\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t<div className={styles.copy}>\n\t\t\t\t\t\t\t\t\t<div className={styles.kicker}>{config.title}</div>\n\t\t\t\t\t\t\t\t\t{notification.title ? <div className={styles.title}>{title}</div> : null}\n\t\t\t\t\t\t\t\t\t<div className={styles.message}>{notification.message}</div>\n\n\t\t\t\t\t\t\t\t\t{notification.actions?.length ? (\n\t\t\t\t\t\t\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t\t\t\t\t\t\t{notification.actions.map((action) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone ?? notification.type}\n\t\t\t\t\t\t\t\t\t\t\t\t\tappearance=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"notification-action-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-action=\"notification-action\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void action.onClick()}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</FlexContainer>\n\n\t\t\t\t\t\t\t{notification.dismissible !== false ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ticon={<XIcon />}\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\ttone={notification.type}\n\t\t\t\t\t\t\t\t\tonClick={() => dismiss(notification.id)}\n\t\t\t\t\t\t\t\t\taria-label=\"Закрыть уведомление\"\n\t\t\t\t\t\t\t\t\tdata-ui=\"notification-dismiss-button\"\n\t\t\t\t\t\t\t\t\tdata-action=\"dismiss-notification\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</FlexContainer>\n\t\t\t\t\t</article>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as e } from "./Flex-DbBdq336.js";
|
|
2
|
-
import { t } from "./DateInput-
|
|
2
|
+
import { t } from "./DateInput-LSSvObtg.js";
|
|
3
3
|
import { c as n, l as r, r as i, s as a, t as o, u as s } from "./DateRangePresetSelect-CyzGMvVp.js";
|
|
4
4
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
5
5
|
import { useCallback as u, useMemo as d, useRef as f, useState as p } from "react";
|
|
@@ -50,4 +50,4 @@ function h({ value: h, onChange: g, presetId: _, onPresetIdChange: v, referenceD
|
|
|
50
50
|
//#endregion
|
|
51
51
|
export { h as t };
|
|
52
52
|
|
|
53
|
-
//# sourceMappingURL=PresetRangeDateInput-
|
|
53
|
+
//# sourceMappingURL=PresetRangeDateInput-B_8jsilZ.js.map
|
package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js.map → PresetRangeDateInput-B_8jsilZ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresetRangeDateInput-
|
|
1
|
+
{"version":3,"file":"PresetRangeDateInput-B_8jsilZ.js","names":[],"sources":["../../src/preset-range-date-input/ui/PresetRangeDateInput.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport { NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nimport { RangeDateInput, type DateRangeInputProps } from \"../../date-input\";\nimport {\n\tDateRangePresetOption,\n\tDateRangePresetSelect,\n\tDEFAULT_DATE_RANGE_PRESET_IDS,\n\tnormalizeDateRangePresetIds,\n\tresolveDateRangePresetIdByRange,\n\tresolveDateRangePresetOptionsByIds,\n\tresolveDateRangePresetPayload\n} from \"../../date-range-preset-select\";\nimport { FlexContainer } from \"../../flex\";\n\nexport interface PresetRangeDateInputProps extends Omit<DateRangeInputProps, \"selectsRange\"> {\n\tpresetId?: DateRangePresetOption[\"id\"] | null;\n\tonPresetIdChange?: (presetId: DateRangePresetOption[\"id\"] | null) => void;\n\treferenceDate?: Date;\n\tpresetIds?: readonly DateRangePresetOption[\"id\"][];\n\tpresetOptions?: readonly DateRangePresetOption[];\n\tpresetLabel?: ReactNode;\n\tpresetDescription?: string;\n\tpresetPlaceholder?: string;\n\tpresetDisabled?: boolean;\n}\n\n/**\n * Строит сигнатуру пресета для защиты от повторной синхронизации.\n */\nfunction getPresetSignature(presetId: DateRangePresetOption[\"id\"] | null): string {\n\treturn presetId ?? \"__empty__\";\n}\n\n/**\n * Составной компонент выбора диапазона дат через пресет или ручной ввод.\n */\nexport function PresetRangeDateInput({\n\tvalue,\n\tonChange,\n\tpresetId,\n\tonPresetIdChange,\n\treferenceDate,\n\tpresetIds,\n\tpresetOptions,\n\tpresetLabel,\n\tpresetDescription,\n\tpresetPlaceholder = \"Выберите пресет диапазона\",\n\tpresetDisabled,\n\t...rangeDateInputProps\n}: PresetRangeDateInputProps) {\n\tconst [defaultReferenceDate] = useState(() => new Date());\n\tconst resolvedReferenceDate = referenceDate ?? defaultReferenceDate;\n\tconst resolvedPresetOptions = useMemo(\n\t\t() => presetOptions ?? resolveDateRangePresetOptionsByIds(normalizeDateRangePresetIds(presetIds, DEFAULT_DATE_RANGE_PRESET_IDS)),\n\t\t[presetIds, presetOptions]\n\t);\n\tconst controlledValue = value ?? null;\n\tconst matchedPresetId = useMemo(\n\t\t() => resolveDateRangePresetIdByRange(controlledValue, resolvedReferenceDate, resolvedPresetOptions),\n\t\t[controlledValue, resolvedPresetOptions, resolvedReferenceDate]\n\t);\n\tconst selectedPresetId = presetId ?? matchedPresetId ?? undefined;\n\tconst lastPresetSignatureRef = useRef<string>(\"\");\n\n\t/**\n\t * Сообщает наружу только реальное изменение `presetId`.\n\t */\n\tconst emitPresetIdChange = useCallback(\n\t\t(nextPresetId: DateRangePresetOption[\"id\"] | null) => {\n\t\t\tif (!onPresetIdChange) return;\n\n\t\t\tconst nextSignature = getPresetSignature(nextPresetId);\n\t\t\tif (nextSignature === lastPresetSignatureRef.current) return;\n\n\t\t\tlastPresetSignatureRef.current = nextSignature;\n\t\t\tonPresetIdChange(nextPresetId);\n\t\t},\n\t\t[onPresetIdChange]\n\t);\n\n\t/**\n\t * Обрабатывает выбор пресета и переводит его в диапазон дат.\n\t */\n\tconst handlePresetChange = (nextPresetId: DateRangePresetOption[\"id\"] | undefined) => {\n\t\tconst nextPayload = resolveDateRangePresetPayload(nextPresetId, resolvedReferenceDate, resolvedPresetOptions);\n\t\tif (!nextPayload) {\n\t\t\temitPresetIdChange(null);\n\t\t\treturn;\n\t\t}\n\n\t\temitPresetIdChange(nextPayload.id);\n\t\tonChange(nextPayload.range);\n\t};\n\n\t/**\n\t * Обрабатывает ручное изменение диапазона и подбирает подходящий пресет.\n\t */\n\tconst handleRangeChange = (nextRange: NullableDateRange | null) => {\n\t\tonChange(nextRange);\n\t\temitPresetIdChange(resolveDateRangePresetIdByRange(nextRange, resolvedReferenceDate, resolvedPresetOptions));\n\t};\n\n\treturn (\n\t\t<FlexContainer gap=\"sm\" align=\"end\">\n\t\t\t<DateRangePresetSelect\n\t\t\t\tsize=\"md\"\n\t\t\t\tlabel={presetLabel}\n\t\t\t\tdescription={presetDescription}\n\t\t\t\tplaceholder={presetPlaceholder}\n\t\t\t\tdisabled={presetDisabled ?? rangeDateInputProps.disabled}\n\t\t\t\tvalue={selectedPresetId}\n\t\t\t\tonChange={handlePresetChange}\n\t\t\t\toptions={resolvedPresetOptions}\n\t\t\t\treferenceDate={resolvedReferenceDate}\n\t\t\t/>\n\n\t\t\t<RangeDateInput {...rangeDateInputProps} size=\"md\" value={controlledValue} onChange={handleRangeChange} />\n\t\t</FlexContainer>\n\t);\n}\n"],"mappings":";;;;;;AA+BA,SAAS,EAAmB,GAAsD;CACjF,OAAO,KAAY;AACpB;AAKA,SAAgB,EAAqB,EACpC,UACA,aACA,aACA,qBACA,kBACA,cACA,kBACA,gBACA,sBACA,uBAAoB,6BACpB,mBACA,GAAG,KAC0B;CAC7B,IAAM,CAAC,KAAwB,wBAAe,IAAI,KAAK,CAAC,GAClD,IAAwB,KAAiB,GACzC,IAAwB,QACvB,KAAiB,EAAmC,EAA4B,GAAW,CAA6B,CAAC,GAC/H,CAAC,GAAW,CAAa,CAC1B,GACM,IAAkB,KAAS,MAC3B,IAAkB,QACjB,EAAgC,GAAiB,GAAuB,CAAqB,GACnG;EAAC;EAAiB;EAAuB;CAAqB,CAC/D,GACM,IAAmB,KAAY,KAAmB,KAAA,GAClD,IAAyB,EAAe,EAAE,GAK1C,IAAqB,GACzB,MAAqD;EACrD,IAAI,CAAC,GAAkB;EAEvB,IAAM,IAAgB,EAAmB,CAAY;EACjD,MAAkB,EAAuB,YAE7C,EAAuB,UAAU,GACjC,EAAiB,CAAY;CAC9B,GACA,CAAC,CAAgB,CAClB,GAKM,KAAsB,MAA0D;EACrF,IAAM,IAAc,EAA8B,GAAc,GAAuB,CAAqB;EAC5G,IAAI,CAAC,GAAa;GACjB,EAAmB,IAAI;GACvB;EACD;EAGA,AADA,EAAmB,EAAY,EAAE,GACjC,EAAS,EAAY,KAAK;CAC3B,GAKM,KAAqB,MAAwC;EAElE,AADA,EAAS,CAAS,GAClB,EAAmB,EAAgC,GAAW,GAAuB,CAAqB,CAAC;CAC5G;CAEA,OACC,kBAAC,GAAD;EAAe,KAAI;EAAK,OAAM;YAA9B,CACC,kBAAC,GAAD;GACC,MAAK;GACL,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU,KAAkB,EAAoB;GAChD,OAAO;GACP,UAAU;GACV,SAAS;GACT,eAAe;EACf,CAAA,GAED,kBAAC,GAAD;GAAgB,GAAI;GAAqB,MAAK;GAAK,OAAO;GAAiB,UAAU;EAAoB,CAAA,CAC3F;;AAEjB"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-BisoTevy.js";
|
|
2
2
|
import { n as t } from "./uiClasses-BNjBunnY.js";
|
|
3
3
|
import { t as n } from "./CheckBox.module-D0Ze9qh3.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { cn as r } from "@ryuzaki13/react-foundation-lib/utils";
|
|
5
|
+
import { CircleIcon as i } from "lucide-react";
|
|
6
6
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
7
7
|
import { useId as s } from "react";
|
|
8
8
|
var c = { radioInput: "gu8UMB" }, l = ({ label: l, description: u, placeholder: d, disabled: f, size: p, className: m, onChange: h, value: g, id: _, tone: v = "neutral", ...y }) => {
|
|
9
9
|
let b = s(), x = _ ?? b, S = u ? `${x}-description` : void 0, C = l ?? d, w = g ?? !1;
|
|
10
10
|
return /* @__PURE__ */ o("div", {
|
|
11
|
-
className:
|
|
11
|
+
className: r(e.uiElement, p && e.uiSizable, p && e[p], f && e.disabled, m),
|
|
12
12
|
children: [/* @__PURE__ */ o("div", {
|
|
13
13
|
className: n.row,
|
|
14
14
|
children: [/* @__PURE__ */ o("div", {
|
|
15
|
-
className:
|
|
15
|
+
className: r(n.wrapper, t(v)),
|
|
16
16
|
children: [/* @__PURE__ */ a("input", {
|
|
17
17
|
...y,
|
|
18
18
|
id: x,
|
|
@@ -23,12 +23,12 @@ var c = { radioInput: "gu8UMB" }, l = ({ label: l, description: u, placeholder:
|
|
|
23
23
|
"aria-disabled": f,
|
|
24
24
|
"aria-checked": w,
|
|
25
25
|
"aria-describedby": S,
|
|
26
|
-
className:
|
|
26
|
+
className: r(e.uiSelectionControl, n.input, c.radioInput),
|
|
27
27
|
onChange: () => h?.(!w)
|
|
28
28
|
}), /* @__PURE__ */ a("div", {
|
|
29
|
-
className:
|
|
29
|
+
className: r(e.uiSelectionIcon, n.icon),
|
|
30
30
|
"aria-hidden": "true",
|
|
31
|
-
children: /* @__PURE__ */ a(
|
|
31
|
+
children: /* @__PURE__ */ a(i, {})
|
|
32
32
|
})]
|
|
33
33
|
}), C && /* @__PURE__ */ a("label", {
|
|
34
34
|
htmlFor: x,
|
|
@@ -45,4 +45,4 @@ var c = { radioInput: "gu8UMB" }, l = ({ label: l, description: u, placeholder:
|
|
|
45
45
|
//#endregion
|
|
46
46
|
export { l as t };
|
|
47
47
|
|
|
48
|
-
//# sourceMappingURL=RadioButton-
|
|
48
|
+
//# sourceMappingURL=RadioButton-D5vPW4Yr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioButton-D5vPW4Yr.js","names":[],"sources":["../../src/radio-button/RadioButton.module.scss","../../src/radio-button/RadioButton.tsx"],"sourcesContent":[".radioInput {\n\tborder-radius: 50%;\n}\n","import React, { useId } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CircleIcon } from \"lucide-react\";\n\nimport baseStyles from \"../check-box/CheckBox.module.scss\";\nimport uiStyles from \"../ui.module.scss\";\nimport { getUiToneClassName } from \"../uiClasses\";\n\nimport styles from \"./RadioButton.module.scss\";\n\nimport type { UiBaseProps, UiTone } from \"../types\";\n\nexport interface RadioButtonProps\n\textends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"checked\" | \"value\" | \"onChange\" | \"type\">, UiBaseProps<boolean> {\n\ttone?: UiTone;\n}\n\n/**\n * Компонент радиокнопки для выбора одного варианта.\n * Поддерживает tone + appearance и использует общие selection utility-классы из ui.module.scss.\n */\nexport const RadioButton: React.FC<RadioButtonProps> = ({\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tdisabled,\n\tsize,\n\tclassName,\n\tonChange,\n\tvalue,\n\tid: externalId,\n\ttone = \"neutral\",\n\t...props\n}) => {\n\tconst autoId = useId();\n\tconst id = externalId ?? autoId;\n\tconst descriptionId = description ? `${id}-description` : undefined;\n\tconst text = label ?? placeholder;\n\tconst checked = value ?? false;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\tuiStyles.uiElement,\n\t\t\t\tsize && uiStyles.uiSizable,\n\t\t\t\tsize && uiStyles[size],\n\t\t\t\tdisabled && uiStyles.disabled,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<div className={baseStyles.row}>\n\t\t\t\t<div className={cn(baseStyles.wrapper, getUiToneClassName(tone))}>\n\t\t\t\t\t<input\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\trole=\"radio\"\n\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\taria-disabled={disabled}\n\t\t\t\t\t\taria-checked={checked}\n\t\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\t\tclassName={cn(uiStyles.uiSelectionControl, baseStyles.input, styles.radioInput)}\n\t\t\t\t\t\tonChange={() => onChange?.(!checked)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className={cn(uiStyles.uiSelectionIcon, baseStyles.icon)} aria-hidden=\"true\">\n\t\t\t\t\t\t<CircleIcon />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{text && (\n\t\t\t\t\t<label htmlFor={id} className={uiStyles.uiLabel}>\n\t\t\t\t\t\t{text}\n\t\t\t\t\t</label>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{description && (\n\t\t\t\t<p id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"mappings":";;;;;;;kCCsBa,KAA2C,EACvD,UACA,gBACA,gBACA,aACA,SACA,cACA,aACA,UACA,IAAI,GACJ,UAAO,WACP,GAAG,QACE;CACL,IAAM,IAAS,EAAM,GACf,IAAK,KAAc,GACnB,IAAgB,IAAc,GAAG,EAAG,gBAAgB,KAAA,GACpD,IAAO,KAAS,GAChB,IAAU,KAAS;CAEzB,OACC,kBAAC,OAAD;EACC,WAAW,EACV,EAAS,WACT,KAAQ,EAAS,WACjB,KAAQ,EAAS,IACjB,KAAY,EAAS,UACrB,CACD;YAPD,CAQC,kBAAC,OAAD;GAAK,WAAW,EAAW;aAA3B,CACC,kBAAC,OAAD;IAAK,WAAW,EAAG,EAAW,SAAS,EAAmB,CAAI,CAAC;cAA/D,CACC,kBAAC,SAAD;KACC,GAAI;KACA;KACJ,MAAK;KACL,MAAK;KACI;KACC;KACV,iBAAe;KACf,gBAAc;KACd,oBAAkB;KAClB,WAAW,EAAG,EAAS,oBAAoB,EAAW,OAAO,EAAO,UAAU;KAC9E,gBAAgB,IAAW,CAAC,CAAO;IACnC,CAAA,GACD,kBAAC,OAAD;KAAK,WAAW,EAAG,EAAS,iBAAiB,EAAW,IAAI;KAAG,eAAY;eAC1E,kBAAC,GAAD,CAAa,CAAA;IACT,CAAA,CACD;OACJ,KACA,kBAAC,SAAD;IAAO,SAAS;IAAI,WAAW,EAAS;cACtC;GACK,CAAA,CAEJ;MACJ,KACA,kBAAC,KAAD;GAAG,IAAI;GAAe,WAAW,EAAS;aACxC;EACC,CAAA,CAEA;;AAEP"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-BisoTevy.js";
|
|
2
|
-
import { a as t, c as n, d as r, f as i, i as a, l as o, o as s, r as c, t as l, u } from "./picker-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { a as t, c as n, d as r, f as i, i as a, l as o, o as s, r as c, t as l, u } from "./picker-gIUs0nE_.js";
|
|
3
|
+
import { cn as d } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
|
+
import { CheckIcon as ee, XIcon as f } from "lucide-react";
|
|
5
5
|
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
6
6
|
import { useRef as te, useState as ne } from "react";
|
|
7
7
|
//#region src/select/lib/getOptionSearchText.ts
|
|
@@ -85,7 +85,7 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
85
85
|
"aria-controls": L ? s : void 0,
|
|
86
86
|
"aria-autocomplete": A ? "list" : "none",
|
|
87
87
|
"aria-activedescendant": L ? K(s) : void 0,
|
|
88
|
-
inputClassName:
|
|
88
|
+
inputClassName: d(Q && _.inputWithOverlay, ce, "textOverflow"),
|
|
89
89
|
overlay: Q ? /* @__PURE__ */ m("div", {
|
|
90
90
|
className: _.valueOverlay,
|
|
91
91
|
children: Y
|
|
@@ -107,7 +107,7 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
107
107
|
e.preventDefault(), e.stopPropagation(), Pe();
|
|
108
108
|
},
|
|
109
109
|
"aria-label": "Очистить выбор",
|
|
110
|
-
children: /* @__PURE__ */ m(
|
|
110
|
+
children: /* @__PURE__ */ m(f, {})
|
|
111
111
|
}) : null
|
|
112
112
|
}),
|
|
113
113
|
onChange: (e) => {
|
|
@@ -135,10 +135,10 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
135
135
|
setFloating: xe,
|
|
136
136
|
getFloatingProps: ye,
|
|
137
137
|
onKeyDown: Oe,
|
|
138
|
-
className:
|
|
138
|
+
className: d(e.uiPopupOptions, le),
|
|
139
139
|
header: he,
|
|
140
140
|
children: /* @__PURE__ */ m("div", {
|
|
141
|
-
className:
|
|
141
|
+
className: d(ue, "h100 scrollable"),
|
|
142
142
|
children: q ? W.map((t, n) => {
|
|
143
143
|
let r = w(t), i = B !== void 0 && r === B, a = n === ge, o = D?.(t) ?? !1, c = {
|
|
144
144
|
active: a,
|
|
@@ -152,10 +152,10 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
152
152
|
"aria-selected": i,
|
|
153
153
|
"aria-disabled": o || void 0,
|
|
154
154
|
"aria-label": ae?.(t),
|
|
155
|
-
className:
|
|
155
|
+
className: d(e.uiPopupOption, o && e.disabled, a && e.uiPopupOptionActive, i && e.selected, oe?.(t, c)),
|
|
156
156
|
onClick: () => Te(t),
|
|
157
157
|
children: O ? O(t, c) : /* @__PURE__ */ h(p, { children: [
|
|
158
|
-
m(i ?
|
|
158
|
+
m(i ? ee : "span", { className: e.uiPopupOptionIcon }),
|
|
159
159
|
/* @__PURE__ */ m("div", {
|
|
160
160
|
className: e.uiOptionText,
|
|
161
161
|
children: T(t)
|
|
@@ -179,4 +179,4 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
179
179
|
//#endregion
|
|
180
180
|
export { g as n, v as t };
|
|
181
181
|
|
|
182
|
-
//# sourceMappingURL=Select-
|
|
182
|
+
//# sourceMappingURL=Select-CoAYWNOn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select-CoAYWNOn.js","names":[],"sources":["../../src/select/lib/getOptionSearchText.ts","../../src/select/Select.module.scss","../../src/select/Select.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\n\nimport { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { extractPickerTextContent } from \"../../picker\";\n\nexport function getOptionSearchText<T extends InputType>({\n\toption,\n\tgetOptionLabel,\n\tgetOptionCode\n}: {\n\toption: T;\n\tgetOptionLabel: (option: T) => ReactNode;\n\tgetOptionCode?: (option: T) => ReactNode;\n}) {\n\treturn [extractPickerTextContent(getOptionLabel(option)), extractPickerTextContent(getOptionCode?.(option))]\n\t\t.filter((part): part is string => Boolean(part))\n\t\t.join(\" \")\n\t\t.toLowerCase();\n}\n\n/** Находит selected option по value и возвращает fallback, если значение еще не нормализовано. */\nexport function resolveSelectedOption<TOption extends { value: string }>(\n\toptions: readonly TOption[],\n\tvalue: string,\n\tfallback: TOption\n): TOption {\n\treturn options.find((option) => option.value === value) ?? fallback;\n}\n",".inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) + var(--space-xs)) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n","import { ReactNode, useRef, useState } from \"react\";\n\nimport { Placement } from \"@floating-ui/react\";\nimport { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\n\nimport {\n\textractPickerTextContent,\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport { getOptionSearchText } from \"./lib\";\nimport styles from \"./Select.module.scss\";\n\nexport type SelectOptionKey = string | number;\n\nexport type SelectOptionState = {\n\tactive: boolean;\n\tselected: boolean;\n\tdisabled: boolean;\n};\n\nexport interface SelectProps<TOption extends InputType, TChangeValue extends TOption | undefined = TOption> extends UiBaseProps<\n\tTChangeValue,\n\tTOption | undefined\n> {\n\toptions: readonly TOption[];\n\tgetOptionKey: (option: TOption) => SelectOptionKey;\n\tgetOptionLabel: (option: TOption) => ReactNode;\n\tgetOptionCode?: (option: TOption) => ReactNode;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionAriaLabel?: (option: TOption) => string;\n\tgetOptionClassName?: (option: TOption, state: SelectOptionState) => string | undefined;\n\trenderOption?: (option: TOption, state: SelectOptionState) => ReactNode;\n\trenderValue?: (option: TOption) => ReactNode;\n\tclassName?: string;\n\tbuttonClassName?: string;\n\toptionsClassName?: string;\n\toptionsContentClassName?: string;\n\tsearchable?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\trenderPopupHeader?: ReactNode;\n\temptyState?: ReactNode;\n\tloadingState?: ReactNode;\n\terrorState?: ReactNode;\n\tplacement?: Placement;\n\tclearable?: boolean;\n}\n\n/**\n * Выпадающий список выбора значения из набора опций. Подходит для форм, фильтров и простых справочников.\n */\nexport function Select<TOption extends InputType, TChangeValue extends TOption | undefined = TOption>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\tgetOptionKey,\n\tgetOptionLabel,\n\tgetOptionCode,\n\tgetOptionDisabled,\n\tgetOptionAriaLabel,\n\tgetOptionClassName,\n\trenderOption,\n\trenderValue,\n\tclassName,\n\tbuttonClassName,\n\toptionsClassName,\n\toptionsContentClassName,\n\tsearchable = false,\n\tdefaultFilter = true,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\trenderPopupHeader,\n\temptyState,\n\tloadingState,\n\terrorState,\n\tplacement = \"bottom-start\",\n\tclearable = false\n}: SelectProps<TOption, TChangeValue>) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = searchable ? \"search-single\" : \"display\";\n\tconst selectedKey = value === undefined ? undefined : getOptionKey(value);\n\tconst selectedOption =\n\t\tselectedKey === undefined ? undefined : (options.find((option) => getOptionKey(option) === selectedKey) ?? value);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst visibleOptions = usePickerDefaultFilter({\n\t\toptions,\n\t\tquery: currentQuery,\n\t\tenabled: searchable && defaultFilter,\n\t\tgetSearchText: (option) =>\n\t\t\tgetOptionSearchText({\n\t\t\t\toption,\n\t\t\t\tgetOptionLabel,\n\t\t\t\tgetOptionCode\n\t\t\t})\n\t});\n\tconst selectedIndex = selectedKey === undefined ? -1 : visibleOptions.findIndex((option) => getOptionKey(option) === selectedKey);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tgetOptionDisabled,\n\t\tonSelect: (option) => onChange(option as TChangeValue),\n\t\tdisabled,\n\t\tplacement,\n\t\ttriggerMode\n\t});\n\n\tconst hasOptions = visibleOptions.length > 0;\n\tconst labelContent = selectedOption !== undefined ? getOptionLabel(selectedOption) : undefined;\n\tconst displayContent = selectedOption !== undefined ? (renderValue ? renderValue(selectedOption) : labelContent) : undefined;\n\tconst labelText = extractPickerTextContent(labelContent);\n\tconst codeText = selectedOption !== undefined ? extractPickerTextContent(getOptionCode?.(selectedOption)) : undefined;\n\tconst displayText =\n\t\textractPickerTextContent(displayContent) ?? labelText ?? codeText ?? (selectedKey !== undefined ? String(selectedKey) : \"\");\n\tconst showSearchValue = searchable && (open || currentQuery.length > 0);\n\tconst inputValue = showSearchValue ? currentQuery : selectedOption !== undefined ? displayText : \"\";\n\tconst showDisplayOverlay =\n\t\tselectedOption !== undefined &&\n\t\tdisplayContent !== undefined &&\n\t\textractPickerTextContent(displayContent) === undefined &&\n\t\t!showSearchValue;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: selectedOption !== undefined,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClear = () => {\n\t\tif (clearable) {\n\t\t\tonChange(undefined as TChangeValue);\n\t\t}\n\n\t\tsetQuery(\"\");\n\t\tclose();\n\t};\n\n\treturn (\n\t\t<PickerField\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\tclassName={className}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\treadOnly={!searchable}\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\tplaceholder={selectedOption === undefined || showSearchValue ? placeholder : undefined}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={searchable ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tinputClassName={cn(showDisplayOverlay && styles.inputWithOverlay, buttonClassName, \"textOverflow\")}\n\t\t\t\t\t\t\toverlay={showDisplayOverlay ? <div className={styles.valueOverlay}>{displayContent}</div> : undefined}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{clearable && selectedOption !== undefined && !disabled ? (\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\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-select\"\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClear();\n\t\t\t\t\t\t\t\t\t\t\t}}\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) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (!searchable) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: selectActiveOption,\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: !searchable\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={hasOptions ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, optionsClassName)}\n\t\t\t\t\t\t\theader={renderPopupHeader}>\n\t\t\t\t\t\t\t<div className={cn(optionsContentClassName, \"h100 scrollable\")}>\n\t\t\t\t\t\t\t\t{hasOptions ? (\n\t\t\t\t\t\t\t\t\tvisibleOptions.map((option, index) => {\n\t\t\t\t\t\t\t\t\t\tconst optionKey = getOptionKey(option);\n\t\t\t\t\t\t\t\t\t\tconst selected = selectedKey !== undefined && optionKey === selectedKey;\n\t\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled = getOptionDisabled?.(option) ?? false;\n\t\t\t\t\t\t\t\t\t\tconst optionState = { active, selected, disabled: optionDisabled };\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={optionKey}\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={getOptionAriaLabel?.(option)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tuiStyles.uiPopupOption,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && uiStyles.uiPopupOptionActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetOptionClassName?.(option, optionState)\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\tonClick={() => selectOption(option)}>\n\t\t\t\t\t\t\t\t\t\t\t\t{renderOption ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\trenderOption(option, optionState)\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\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className={uiStyles.uiPopupOptionIcon} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className={uiStyles.uiPopupOptionIcon} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={uiStyles.uiOptionText}>{getOptionLabel(option)}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getOptionCode && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={uiStyles.uiOptionCode}>{getOptionCode(option)}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\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</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PickerStatus emptyState={emptyState} loadingState={loadingState} errorState={errorState} />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as e } from "./Select-
|
|
1
|
+
import { t as e } from "./Select-CoAYWNOn.js";
|
|
2
2
|
import { jsx as t } from "react/jsx-runtime";
|
|
3
3
|
//#region src/select/SerializableSelect.tsx
|
|
4
4
|
function n(e, t) {
|
|
@@ -30,4 +30,4 @@ function i({ label: i, description: a, disabled: o, placeholder: s, size: c, opt
|
|
|
30
30
|
//#endregion
|
|
31
31
|
export { i as t };
|
|
32
32
|
|
|
33
|
-
//# sourceMappingURL=SerializableSelect-
|
|
33
|
+
//# sourceMappingURL=SerializableSelect-awBOWKTj.js.map
|