@ryuzaki13/react-foundation-ui 1.2.14 → 1.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{TextEditorLexicalClient-D4hmfP5B.js → TextEditorLexicalClient-CVTrglWP.js} +2 -2
- package/dist/chunks/{TextEditorLexicalClient-D4hmfP5B.js.map → TextEditorLexicalClient-CVTrglWP.js.map} +1 -1
- package/dist/chunks/{date-input-BcVfIUJT.js → date-input-DBJisPRz.js} +2 -2
- package/dist/chunks/{date-input-BcVfIUJT.js.map → date-input-DBJisPRz.js.map} +1 -1
- package/dist/chunks/{radio-group-CEY_kdz8.js → radio-group-CM9Lg_nc.js} +3 -3
- package/dist/chunks/radio-group-CM9Lg_nc.js.map +1 -0
- package/dist/date-input/index.js +1 -1
- package/dist/period-select/PeriodSelect.d.ts +12 -2
- package/dist/period-select/PeriodSelect.d.ts.map +1 -1
- package/dist/period-select/index.js +39 -31
- package/dist/period-select/index.js.map +1 -1
- package/dist/period-select/lib/periodSelect.d.ts +18 -1
- package/dist/period-select/lib/periodSelect.d.ts.map +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/radio-group/index.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/text-editor/index.js +1 -1
- package/package.json +1 -1
- package/storybook-static/assets/{Badge-BzE3KIAJ.js → Badge-xtkCi9dr.js} +1 -1
- package/storybook-static/assets/{Badge.stories-Ua5ECmTZ.js → Badge.stories-CKrFIQ5F.js} +1 -1
- package/storybook-static/assets/{Button-BZr1CHbJ.js → Button-CaaN67yU.js} +1 -1
- package/storybook-static/assets/{Button-BDbg6LF9.js → Button-DH3mbrYe.js} +1 -1
- package/storybook-static/assets/{Button.stories-1yBm6GWr.js → Button.stories-CgQQj0tp.js} +1 -1
- package/storybook-static/assets/{CheckBox-CLhSjwoM.js → CheckBox-BDQK30OS.js} +1 -1
- package/storybook-static/assets/{CheckBox-ClU3a73b.js → CheckBox-DfDQTQbJ.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CbmUeuSm.js → CheckBox.stories-Djc--F9u.js} +1 -1
- package/storybook-static/assets/{Color-KMSTOMOX-D4RUKQAg.js → Color-KMSTOMOX-DQy0eoyu.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BeUIbLy4.js → ContextMenu-0JP128xU.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-BnWm5LcX.js → ContextMenu.stories-DakD2D_c.js} +1 -1
- package/storybook-static/assets/{DateInput-B0gFyLyA.js → DateInput-Dz9JLuHe.js} +1 -1
- package/storybook-static/assets/{DateInput-Cn-GfCPV.js → DateInput-JDcWMGze.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-DcXiRksA.js → DateInput.stories-DFgf-v7q.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-BUeFvFRM.js → DateRangePresetSelect-BsiagzJO.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-IS9Vac0n.js → DateRangePresetSelect-CauxR1zA.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-Bl9jJVtx.js → DateRangePresetSelect.stories-CGjeE149.js} +1 -1
- package/storybook-static/assets/{Detail-C2vADWKT.js → Detail-Dd9tgzP1.js} +1 -1
- package/storybook-static/assets/{Detail.stories-CG8rLdIH.js → Detail.stories-BKh6pL2G.js} +1 -1
- package/storybook-static/assets/{Dialog-DW2xBHt6.js → Dialog-Chd71KoW.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-Dmhd1CnG.js → Dialog.stories-BHdYaLjQ.js} +1 -1
- package/storybook-static/assets/{Disclosure-DyNlfi6e.js → Disclosure-kpIMvWyk.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-zLaWezA0.js → Disclosure.stories-DYbw038T.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-BGRkR42g.js → DocsRenderer-JROSPFPF-CfQJHmsz.js} +2 -2
- package/storybook-static/assets/{DropZone-Bh46a7nG.js → DropZone-D0wMosH7.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-tbKrHK8P.js → DropZone.stories-CUNTD4nI.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-yMdkX2Bv.js → DropdownMenu-DH7_UG28.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-CjeHh0nI.js → ExpandableActionPanel.stories-OOg3t6Di.js} +1 -1
- package/storybook-static/assets/{Flex-Czbc0vf5.js → Flex-C-9AF37J.js} +1 -1
- package/storybook-static/assets/{Flex-CQStJ89L.js → Flex-TiBvMgmo.js} +1 -1
- package/storybook-static/assets/{Flex.stories-B-HTukqp.js → Flex.stories-QmHIoBfR.js} +1 -1
- package/storybook-static/assets/{Grid-Bk5IrBSw.js → Grid-BW2BrkVN.js} +1 -1
- package/storybook-static/assets/{Grid-D4NYv4pO.js → Grid-CE88HqQy.js} +1 -1
- package/storybook-static/assets/{Grid.stories-DfS-GHuB.js → Grid.stories-Cv1PU0l_.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-C6jSY7JQ.js → ImageCropper.stories-D8nIQ30F.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-DgEmIXI4.js → ImageRenderer-DlVtAEXb.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-B2JjQW3m.js → ImageRenderer.stories-Cc3KtBM7.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-CLs0y4jG.js → ImageView.stories-CbfjiLPT.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-Z8cchtBV.js → ImageViewer.stories-DhXW_-mP.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-BS7rtbW8.js → ImageViewerRuntime-BWpa3n31.js} +1 -1
- package/storybook-static/assets/{Input-BcGJZS3l.js → Input-0F3FSpLU.js} +1 -1
- package/storybook-static/assets/{Input-DW_06dLV.js → Input-nJNr-IY6.js} +1 -1
- package/storybook-static/assets/{Input.stories-BTtd1YEu.js → Input.stories-rTgTeYrT.js} +1 -1
- package/storybook-static/assets/{InputDateTime-iehYEtxN.js → InputDateTime-aEtaZ8Iq.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-D3xNpsu2.js → InputDateTime.stories-CDbaYQhG.js} +1 -1
- package/storybook-static/assets/{InputFile-D0tb340S.js → InputFile-CHOQ5bIv.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-Pq8Ecwjd.js → InputFile.stories-Bl5M5l2c.js} +1 -1
- package/storybook-static/assets/{InputFiles-BgeARUDm.js → InputFiles-CXTmn9Yb.js} +1 -1
- package/storybook-static/assets/{InputFiles-INybw4J2.js → InputFiles-CyFz3ody.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-M5lZ8X0M.js → InputFiles.stories-BlVsiC7g.js} +1 -1
- package/storybook-static/assets/{InputImage-C7QJAYSm.js → InputImage-DUzYflL7.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-5nA4aJ5_.js → InputImage.stories-Df0Llqmo.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CKstYA7F.js → LayoutPicker-BG0KYH1a.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-Bqc3KZvm.js → LayoutPicker.stories-BgRYBl0Z.js} +1 -1
- package/storybook-static/assets/{Listbox-BMf88cSk.js → Listbox-yqiBfOkE.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CI8WogUC.js → Listbox.stories-C4hehlvL.js} +1 -1
- package/storybook-static/assets/{Modal-DRZIE7SJ.js → Modal-Db6pP1_Q.js} +1 -1
- package/storybook-static/assets/{Modal.stories-DPulwYmq.js → Modal.stories-Bd9W4X7v.js} +1 -1
- package/storybook-static/assets/{MultiSelect-Bh_df5tS.js → MultiSelect-75Epu0vT.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DCqMGCpJ.js → MultiSelect-CCwvk_RE.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-BF_ltH3y.js → MultiSelect.stories-DTUXExXJ.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-VOO9Rjru.js → NotificationsHost-BRTN_qeJ.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BQebLt7E.js → NotificationsHost.stories-GLqI5DeR.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-2apHcEfR.js → ODataMultiSelect-BWAoROx6.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-D6JwbRE_.js → ODataMultiSelect-BlmT8jHo.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-XXcgbIRB.js → ODataMultiSelect.stories-BmlUlRUM.js} +1 -1
- package/storybook-static/assets/{ODataSelect-DhXlSsXp.js → ODataSelect-B3KH30W0.js} +1 -1
- package/storybook-static/assets/{ODataSelect-Bkdgov0g.js → ODataSelect-BmqsSYir.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-BCjsAT_n.js → ODataSelect.stories-CG4HA3Kl.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-BQZSzY8Q.js → ODataTreeMultiSelect-ymv5wCyN.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-xqkAPvud.js → ODataTreeMultiSelect.stories-B8NCLBVe.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-A4VYwwdU.js → ODataTreeSelect-8PsAgZ2H.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-DgeUmjcS.js → ODataTreeSelect.stories-DHzvb-PZ.js} +1 -1
- package/storybook-static/assets/PeriodSelect-CwlLJiZv.js +56 -0
- package/storybook-static/assets/PeriodSelect.stories-C4invndl.js +64 -0
- package/storybook-static/assets/{Popover-Cm1Cjnlt.js → Popover-CLBzKrX3.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CRqWnuti.js → Popover.stories-CCgMSOWy.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-CSC649o5.js → PresetRangeDateInput-lUb07N8N.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CJAb-3Tk.js → PresetRangeDateInput.stories-BgfljGMW.js} +1 -1
- package/storybook-static/assets/{RadioButton-BmXY3NdM.js → RadioButton-DGLBKGD5.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-BipvtuUA.js → RadioButton.stories-CMOj57A_.js} +1 -1
- package/storybook-static/assets/{RadioGroup-DHfbcL2R.js → RadioGroup-BzVcNqDG.js} +1 -1
- package/storybook-static/assets/RadioGroup-CypQbkYZ.js +1 -0
- package/storybook-static/assets/RadioGroup-DSogQ0Gh.css +1 -0
- package/storybook-static/assets/{RadioGroup.stories-C62fFzzV.js → RadioGroup.stories-BKf-vKr2.js} +1 -1
- package/storybook-static/assets/{Select-Ch13M3mQ.js → Select-BTWHtPG7.js} +1 -1
- package/storybook-static/assets/{Select-Fy8jN7iP.js → Select-rbSj1Ivy.js} +1 -1
- package/storybook-static/assets/{Select.stories-BW7wzvZe.js → Select.stories-CUdtpib6.js} +1 -1
- package/storybook-static/assets/{SelectOptionContent-CVUpvR-7.js → SelectOptionContent-Duik8EFr.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-CTvWTB2q.js → SerializableSelect-C5uFdEp7.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-Dso6qEq4.js → SerializableSelect-n2j6L_D2.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-B5fxANJn.js → SerializableSelect.stories-BuohYsxG.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-bZX5vdCS.js → SingleDateTimeInput-DjCwwZnM.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BMya0oXg.js → SingleDateTimeInput.stories-DF-06Elf.js} +1 -1
- package/storybook-static/assets/{Slider-BAIxquDG.js → Slider-MPMI6E09.js} +1 -1
- package/storybook-static/assets/{Slider.stories-utpaC-ia.js → Slider.stories-B7VReG6n.js} +1 -1
- package/storybook-static/assets/{SliderInput-DF4oIloP.js → SliderInput-DK-haMxX.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-CRVFeI1D.js → SliderInput.stories-DSyrGoH4.js} +1 -1
- package/storybook-static/assets/{Sortable-Bv8jz10S.js → Sortable-BqBEFdrB.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-DNxX4jDX.js → Sortable.stories-BxkGVbDP.js} +1 -1
- package/storybook-static/assets/{Splitter-Bvffqr8i.js → Splitter-Ct-iSKjC.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-BVU-GNaK.js → Splitter.stories-DswknDVG.js} +1 -1
- package/storybook-static/assets/{StateSelect-BH4CyjC5.js → StateSelect-DBzu5XP5.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-Dpi8ZcDt.js → StateSelect.stories-CXMU7n3r.js} +1 -1
- package/storybook-static/assets/{Switch-Cqc2HRLW.js → Switch-BhJaHAGg.js} +1 -1
- package/storybook-static/assets/{Switch.stories-B-o_zmuu.js → Switch.stories-IvY14JXy.js} +1 -1
- package/storybook-static/assets/{Table-B7TdHBCU.js → Table-BA4-lz0u.js} +1 -1
- package/storybook-static/assets/{Table.stories-CSoxR6jv.js → Table.stories-DC5fB33Z.js} +1 -1
- package/storybook-static/assets/{Tabs-D5HBzPiY.js → Tabs-C_-pUBUJ.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-PAzw7Dlb.js → Tabs.stories-CBrZTQ-N.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-3ReNXVbh.js → TagInput.stories-B3CUuGFC.js} +1 -1
- package/storybook-static/assets/{Textarea-BOzNLgC6.js → Textarea-gBiqDDXW.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-bq8yhANY.js → Textarea.stories-DxzLiHyn.js} +1 -1
- package/storybook-static/assets/{TimePanel-DmVlBlDJ.js → TimePanel-DABqHFxp.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-DWZe2l26.js → TimePanel.stories-DP1YMy06.js} +1 -1
- package/storybook-static/assets/{Toggle-YHELkLqx.js → Toggle-mrhp4D2Y.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-D6NM__CI.js → Toggle.stories-DmxXXXzj.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-nF6wFwPQ.js → TreeMultiSelect-BtbWQoOj.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-Dt8PaMtr.js → TreeMultiSelect-DCoqMl3k.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-DhfU07N3.js → TreeMultiSelect.stories-CiA44Tbt.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-CN5yE22C.js → TreePickerBase-DzunMFi5.js} +1 -1
- package/storybook-static/assets/{TreeSelect-BbH2issG.js → TreeSelect-BCO44FR8.js} +1 -1
- package/storybook-static/assets/{TreeSelect-DCTNqVLJ.js → TreeSelect-yWmCDjA7.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories--9JI132F.js → TreeSelect.stories-s4tRpy7q.js} +1 -1
- package/storybook-static/assets/{TreeTable-CNvQIhsI.js → TreeTable-BHNmIkVt.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DdO4RDEk.js → TreeTable.stories-UZXvm4os.js} +1 -1
- package/storybook-static/assets/{WithTooltip-7X4HQR7L-B2lbg1FZ.js → WithTooltip-7X4HQR7L-CkyaWCvT.js} +1 -1
- package/storybook-static/assets/{async-DZRJqhWL.js → async-DyfEsUOx.js} +1 -1
- package/storybook-static/assets/{base-table-B2rD9HeU.js → base-table-M5XWh_jH.js} +1 -1
- package/storybook-static/assets/{blocks-BHuImGbL.js → blocks-DpCAfXPL.js} +6 -6
- package/storybook-static/assets/{button-DGtlPvuJ.js → button-BVVHoFwa.js} +1 -1
- package/storybook-static/assets/{check-box-DeH-6UWx.js → check-box-DUXqcF-J.js} +1 -1
- package/storybook-static/assets/{chunk-3LY4VQVK-CgGzJ6QG.js → chunk-3LY4VQVK-BwmsA2Rg.js} +1 -1
- package/storybook-static/assets/{chunk-LITCR56V-Ds2BJwUB.js → chunk-LITCR56V-B2njGr_K.js} +1 -1
- package/storybook-static/assets/{contextMenu-Buq9lqVJ.js → contextMenu-ByKFXgTt.js} +1 -1
- package/storybook-static/assets/{date-C28FxYJN.js → date-Bt7LFtSg.js} +1 -1
- package/storybook-static/assets/{error-C5kTCpJk.js → error-C0eOM80t.js} +1 -1
- package/storybook-static/assets/{file-CwwWpMSP.js → file-Zu7A9e9D.js} +1 -1
- package/storybook-static/assets/{flex-5zISG9Jc.js → flex-D5GVt1MM.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-7HjCasCd.js → floating-ui.react-m4KUKbwu.js} +1 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-DZKQpsEf.js +1 -0
- package/storybook-static/assets/{formatters-BvxAGVeJ.js → formatters-D0rqrkc6.js} +1 -1
- package/storybook-static/assets/{formulas-DwBh9TSt.js → formulas-CzAOrD6u.js} +1 -1
- package/storybook-static/assets/grid-CsX1FHk0.js +1 -0
- package/storybook-static/assets/{hooks-CL6WXb32.js → hooks-BfyDIPET.js} +1 -1
- package/storybook-static/assets/{iframe-D5Bxpr_P.js → iframe-DJavOMzO.js} +3 -3
- package/storybook-static/assets/{input-CV_S26po.js → input-R6hd2E_Y.js} +1 -1
- package/storybook-static/assets/{mdx-react-shim-DTmE8sHb.js → mdx-react-shim-Uqc1i8V9.js} +1 -1
- package/storybook-static/assets/{media-DOXiQvKm.js → media-2SJWDb7s.js} +1 -1
- package/storybook-static/assets/{misc-C4eqPY8Q.js → misc-5uqTnmbl.js} +1 -1
- package/storybook-static/assets/{notifications-DzIpqqDe.js → notifications-BefQ0AQC.js} +1 -1
- package/storybook-static/assets/{number-CiPyI49v.js → number-C777LTv3.js} +1 -1
- package/storybook-static/assets/{odata-Cdjr_13P.js → odata-BlULCQl_.js} +1 -1
- package/storybook-static/assets/odata-service-CjrwtO-a.js +1 -0
- package/storybook-static/assets/{odataFetchFn-5oA806GG.js → odataFetchFn-D1n2YZ5p.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-CYeyJ4EJ.js → odataStoryFixtures-D3tc67Mp.js} +1 -1
- package/storybook-static/assets/{persisted-B8lPMVbx.js → persisted-DwRDWL3r.js} +1 -1
- package/storybook-static/assets/{picker-fFmVfvJ2.js → picker-zma3rQke.js} +1 -1
- package/storybook-static/assets/{popover-Bkx-kueF.js → popover-BxMxQqNC.js} +1 -1
- package/storybook-static/assets/{preset-select-BsTcZQD4.js → preset-select-C2V0FLJB.js} +1 -1
- package/storybook-static/assets/{pwa-BUVV-ASt.js → pwa-BwmyFla8.js} +1 -1
- package/storybook-static/assets/{queryClient-BbpnSB7G.js → queryClient-CVTaWWa-.js} +1 -1
- package/storybook-static/assets/{react-18-DKMWiFiE.js → react-18-VWMxMR2Q.js} +1 -1
- package/storybook-static/assets/{react-DBQ_9riD.js → react-DewH2VGS.js} +1 -1
- package/storybook-static/assets/{react-dom-BORNa2yW.js → react-dom-gm7HNzSd.js} +1 -1
- package/storybook-static/assets/select-Chy_MAxf.js +1 -0
- package/storybook-static/assets/{slider-B_2ta5qX.js → slider-Liezjg2n.js} +1 -1
- package/storybook-static/assets/{sortable-fm1V05nH.js → sortable-DCOi5LoM.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-Cha-c1Dj.js → syntaxhighlighter-RTCFPKCB-DpHyskQO.js} +1 -1
- package/storybook-static/assets/{text-CJkmBtCb.js → text-DCD-LDXt.js} +1 -1
- package/storybook-static/assets/{theming-BLNJzZ-f.js → theming-BAqUlJ0w.js} +1 -1
- package/storybook-static/assets/ui-DyOaVl2J.js +1 -0
- package/storybook-static/assets/{useODataSelectBase-BgVM9NkS.js → useODataSelectBase-D_XcSN43.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-BQjC6a1R.js → useODataTreeData-CQURFDlR.js} +1 -1
- package/storybook-static/assets/{utils-LKT2AuXL.js → utils-BCcqwWnK.js} +1 -1
- package/storybook-static/assets/{valueState-DmkiFIaF.js → valueState-_2GTEAkP.js} +1 -1
- package/storybook-static/iframe.html +1 -1
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/dist/chunks/radio-group-CEY_kdz8.js.map +0 -1
- package/storybook-static/assets/PeriodSelect-BzkAbTjx.js +0 -51
- package/storybook-static/assets/PeriodSelect.stories-i12jUffi.js +0 -47
- package/storybook-static/assets/RadioGroup-BMD9LbW8.js +0 -1
- package/storybook-static/assets/RadioGroup-hi7uePOA.css +0 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-CGLz6w8k.js +0 -1
- package/storybook-static/assets/grid-BoJLHyn-.js +0 -1
- package/storybook-static/assets/odata-service-CKEAyQU6.js +0 -1
- package/storybook-static/assets/select-DdmNDdpr.js +0 -1
- package/storybook-static/assets/ui-BOZe6RmJ.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-input-BcVfIUJT.js","names":[],"sources":["../../src/date-input/lib/dateInputValue.ts","../../src/date-input/model/useDateInput.ts","../../src/date-input/ui/DateInput.module.scss","../../src/date-input/ui/DateInput.tsx"],"sourcesContent":["import {\n\tDEFAULT_DATE_PRESET_NAMES,\n\tformatDate,\n\tformatDateRange,\n\tgetCalendarPeriod,\n\tgetDatePreset,\n\tisDateRangeTuple,\n\tparseDateByFormat,\n\tresolveDateFormatName,\n\tresolveDateFormatPreset,\n\ttype CalendarPeriodOptions,\n\ttype DateFormatPrecision,\n\ttype DateFormatPreset,\n\ttype DateRangeInput,\n\ttype NullableDateRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\n/**\n * Пресет даты по умолчанию для текстового поля.\n */\nexport const DEFAULT_DATE_INPUT_PRESET = DEFAULT_DATE_PRESET_NAMES.date;\n\n/**\n * @deprecated Используйте `DEFAULT_DATE_INPUT_PRESET`.\n */\nexport const DEFAULT_DATE_INPUT_FORMAT = \"dd.MM.yyyy\";\n\nconst RANGE_SEPARATOR = \" - \";\nconst DATE_INPUT_FORMAT_OPTIONS = Object.freeze({\n\tdefaultFormat: DEFAULT_DATE_INPUT_PRESET,\n\tpatternPresetName: \"__date_input__\"\n});\n\nexport type DateInputValueOptions = {\n\t/**\n\t * Имя пресета форматирования даты.\n\t */\n\tdatePreset?: string;\n\t/**\n\t * @deprecated Используйте `datePreset`.\n\t */\n\tdateFormat?: string;\n\t/**\n\t * Точность календарного значения.\n\t */\n\tdatePickerLevel?: DateFormatPrecision;\n\t/**\n\t * Размер периода, который выбирается и нормализуется полем.\n\t */\n\tselectionMode?: CalendarPeriodOptions[\"selectionMode\"];\n\t/**\n\t * Последний включённый день недели для режима выбора недели.\n\t */\n\tweekEndDay?: CalendarPeriodOptions[\"weekEndDay\"];\n\t/**\n\t * Опорная дата для пресетов без года, например `month-long`.\n\t */\n\treferenceDate?: Date;\n};\n\nexport type DateInputValueOptionsInput = string | DateInputValueOptions | undefined;\n\n/**\n * Возвращает точность форматирования поля даты.\n */\nfunction resolveDateInputPrecision(options: DateInputValueOptions): DateFormatPrecision {\n\tif (options.selectionMode === \"day\" || options.selectionMode === \"week\") {\n\t\treturn \"day\";\n\t}\n\n\tif (options.selectionMode === \"month\" || options.selectionMode === \"year\") {\n\t\treturn options.selectionMode;\n\t}\n\n\treturn options.datePickerLevel ?? \"day\";\n}\n\nfunction resolveCalendarPeriodOptions(options?: DateInputValueOptions): CalendarPeriodOptions {\n\treturn {\n\t\tselectionMode: options?.selectionMode,\n\t\tweekEndDay: options?.weekEndDay\n\t};\n}\n\n/**\n * Нормализует объектные опции и позиционный вызов с именем пресета.\n */\nfunction normalizeDateInputValueOptions(\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): DateInputValueOptions {\n\tif (typeof optionsOrPreset === \"string\" || optionsOrPreset === undefined) {\n\t\treturn {\n\t\t\tdatePreset: optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\tif (datePickerLevel && optionsOrPreset.datePickerLevel === undefined) {\n\t\treturn {\n\t\t\t...optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\treturn optionsOrPreset;\n}\n\n/**\n * Проверяет новый `datePreset` и возвращает только зарегистрированное имя пресета.\n */\nfunction resolveDateInputPresetName(datePreset?: string): string {\n\tconst resolvedPresetName = resolveDateFormatName(datePreset, DEFAULT_DATE_INPUT_PRESET);\n\treturn getDatePreset(resolvedPresetName) ? resolvedPresetName : DEFAULT_DATE_INPUT_PRESET;\n}\n\n/**\n * Возвращает имя пресета или deprecated-формат для парсинга.\n */\nfunction resolveDateInputFormatName(options: DateInputValueOptions): string | undefined {\n\tif (options.datePreset !== undefined) {\n\t\treturn resolveDateInputPresetName(options.datePreset);\n\t}\n\n\treturn options.dateFormat;\n}\n\n/**\n * Возвращает зарегистрированный пресет или deprecated-объектный шаблон.\n */\nfunction resolveDateInputFormatPreset(options: DateInputValueOptions): string | DateFormatPreset {\n\tif (options.datePreset !== undefined) {\n\t\treturn resolveDateInputPresetName(options.datePreset);\n\t}\n\n\treturn resolveDateFormatPreset(options.dateFormat, DATE_INPUT_FORMAT_OPTIONS);\n}\n\n/**\n * Приводит результат универсального парсинга к календарной дате.\n */\nfunction parseDateTimeValue(value: string, options: DateInputValueOptions): Date | null {\n\treturn (\n\t\tparseDateByFormat(value, resolveDateInputFormatName(options), {\n\t\t\tdefaultFormat: DEFAULT_DATE_INPUT_PRESET,\n\t\t\tprecision: resolveDateInputPrecision(options),\n\t\t\treferenceDate: options.referenceDate\n\t\t})?.date ?? null\n\t);\n}\n\n/**\n * Приводит одиночную дату к началу выбранного календарного периода.\n */\nexport function normalizeSingleDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.start ?? null;\n}\n\n/**\n * Приводит диапазон дат к границам выбранных календарных периодов.\n */\nexport function normalizeRangeDateValue(range: NullableDateRange | null, options?: DateInputValueOptions): NullableDateRange | null {\n\tif (!isDateRangeTuple(range)) return null;\n\n\tconst [startDate, endDate] = range;\n\treturn [normalizeSingleDateValue(startDate, options), normalizeRangeEndDateValue(endDate, options)];\n}\n\n/**\n * Приводит конечную дату диапазона к концу выбранного календарного периода.\n */\nexport function normalizeRangeEndDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.end ?? null;\n}\n\nfunction getDateTime(date: Date | null): number | null {\n\treturn date?.getTime() ?? null;\n}\n\n/**\n * Сравнивает одиночные даты после нормализации к точности поля ввода.\n */\nexport function areSingleDateValuesEqual(left: Date | null, right: Date | null, options?: DateInputValueOptions): boolean {\n\treturn getDateTime(normalizeSingleDateValue(left, options)) === getDateTime(normalizeSingleDateValue(right, options));\n}\n\n/**\n * Сравнивает диапазоны дат после нормализации к границам выбранных периодов.\n */\nexport function areRangeDateValuesEqual(\n\tleft: NullableDateRange | null,\n\tright: NullableDateRange | null,\n\toptions?: DateInputValueOptions\n): boolean {\n\tconst normalizedLeft = normalizeRangeDateValue(left, options);\n\tconst normalizedRight = normalizeRangeDateValue(right, options);\n\n\treturn (\n\t\tgetDateTime(normalizedLeft?.[0] ?? null) === getDateTime(normalizedRight?.[0] ?? null) &&\n\t\tgetDateTime(normalizedLeft?.[1] ?? null) === getDateTime(normalizedRight?.[1] ?? null)\n\t);\n}\n\n/**\n * Форматирует одиночную дату для текстового поля.\n */\nexport function formatSingleDateValue(\n\tdate: Date | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!date) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst period = getCalendarPeriod(date, resolveCalendarPeriodOptions(options));\n\n\t// Single-поле хранит начало недели, но показывает обе включительные границы выбранного периода.\n\tif (options.selectionMode === \"week\" && period) {\n\t\treturn formatDateRange(period.start, period.end, resolveDateInputFormatPreset(options), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\treturn formatDate(date, resolveDateInputFormatPreset(options), {\n\t\tprecision: resolveDateInputPrecision(options)\n\t});\n}\n\n/**\n * Форматирует диапазон дат для текстового поля.\n */\nexport function formatRangeDateValue(\n\trange: NullableDateRange | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!isDateRangeTuple(range)) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startDate, endDate] = range;\n\tif (startDate && endDate) {\n\t\treturn formatDateRange(startDate, endDate, resolveDateInputFormatPreset(options), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\tif (startDate) {\n\t\treturn `${formatDate(startDate, resolveDateInputFormatPreset(options), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t})}${RANGE_SEPARATOR}`;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Унифицирует форматирование значения поля даты.\n */\nexport function formatDateInputValue(\n\tvalue: DateRangeInput,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (isDateRangeTuple(value)) {\n\t\treturn formatRangeDateValue(value, optionsOrPreset, datePickerLevel);\n\t}\n\n\treturn formatSingleDateValue(value, optionsOrPreset, datePickerLevel);\n}\n\n/**\n * Парсит строку одиночной даты по заданному шаблону или пресету.\n */\nexport function parseSingleDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\t// Для отображаемого диапазона single-week источником значения остаётся его первая граница.\n\tconst singleValue = options.selectionMode === \"week\" ? (value.split(RANGE_SEPARATOR)[0] ?? \"\") : value;\n\n\treturn normalizeSingleDateValue(parseDateTimeValue(singleValue, options), options);\n}\n\n/**\n * Парсит строку диапазона дат по заданному шаблону или пресету.\n */\nexport function parseRangeDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): NullableDateRange {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startPart = \"\", endPart = \"\"] = value.split(RANGE_SEPARATOR);\n\n\treturn [parseSingleDateValue(startPart, options), parseRangeEndDateValue(endPart, options)];\n}\n\n/**\n * Парсит конечную дату диапазона и нормализует её к концу суток.\n */\nexport function parseRangeEndDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\treturn normalizeRangeEndDateValue(parseDateTimeValue(value, options), options);\n}\n","import { useEffect, useEffectEvent, useMemo, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nimport {\n\tDateInputValueOptions,\n\tformatDateInputValue,\n\tnormalizeRangeDateValue,\n\tnormalizeRangeEndDateValue,\n\tnormalizeSingleDateValue,\n\tparseRangeDateValue,\n\tparseSingleDateValue,\n\ttype DateInputOptions\n} from \"../lib\";\n\nfunction resolveReferenceDate(value: Date | NullableDateRange | null): Date | undefined {\n\tif (isDateRangeTuple(value)) {\n\t\treturn value[0] ?? value[1] ?? undefined;\n\t}\n\n\treturn value ?? undefined;\n}\n\n/**\n * Хук управляет текстовым представлением и выбранным значением поля даты.\n */\nexport const useDateInput = (options: DateInputOptions) => {\n\tconst initialSelectedDate = useMemo(() => {\n\t\tconst selectionOptions: DateInputValueOptions = {\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn normalizeRangeDateValue(options.value as NullableDateRange | null, selectionOptions);\n\t\t}\n\n\t\treturn normalizeSingleDateValue(options.value as Date | null, selectionOptions);\n\t}, [options.selectsRange, options.selectionMode, options.value, options.weekEndDay]);\n\n\tconst [selectedDate, setSelectedDate] = useState(initialSelectedDate);\n\tconst formatOptions = useMemo<DateInputValueOptions>(\n\t\t() => ({\n\t\t\tdatePreset: options.datePreset,\n\t\t\tdateFormat: options.dateFormat,\n\t\t\tdatePickerLevel: options.datePickerLevel,\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t}),\n\t\t[options.dateFormat, options.datePickerLevel, options.datePreset, options.selectionMode, options.weekEndDay]\n\t);\n\tconst [inputValue, setInputValue] = useState<string>(() => formatDateInputValue(initialSelectedDate, formatOptions));\n\tconst valueSignature = useMemo(() => {\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedRange = normalizeRangeDateValue(options.value as NullableDateRange | null, formatOptions);\n\t\t\treturn `${normalizedRange?.[0]?.getTime() ?? \"null\"}:${normalizedRange?.[1]?.getTime() ?? \"null\"}`;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(options.value as Date | null, formatOptions);\n\t\treturn String(normalizedDate?.getTime() ?? \"null\");\n\t}, [formatOptions, options.selectsRange, options.value]);\n\n\t/**\n\t * Форматирует значение поля даты согласно текущему шаблону.\n\t */\n\tconst formatValue = (value: Date | NullableDateRange | null): string => formatDateInputValue(value, formatOptions);\n\n\t/**\n\t * Синхронизирует внутреннее состояние с внешними пропсами.\n\t */\n\tconst syncStateFromProps = useEffectEvent((nextValue: DateInputOptions[\"value\"]) => {\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedRange = normalizeRangeDateValue(nextValue as NullableDateRange | null, formatOptions);\n\t\t\tconst nextInputValue = formatValue(normalizedRange);\n\n\t\t\tsetSelectedDate((prevValue) => {\n\t\t\t\tconst previousRangeValue = prevValue as NullableDateRange | null;\n\t\t\t\tconst hasSameRange =\n\t\t\t\t\t(previousRangeValue?.[0]?.getTime() ?? null) === (normalizedRange?.[0]?.getTime() ?? null) &&\n\t\t\t\t\t(previousRangeValue?.[1]?.getTime() ?? null) === (normalizedRange?.[1]?.getTime() ?? null);\n\n\t\t\t\treturn hasSameRange ? prevValue : normalizedRange;\n\t\t\t});\n\t\t\tsetInputValue((prevValue) => (prevValue === nextInputValue ? prevValue : nextInputValue));\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(nextValue as Date | null, formatOptions);\n\t\tconst nextInputValue = formatValue(normalizedDate);\n\n\t\tsetSelectedDate((prevValue) =>\n\t\t\t((prevValue as Date | null)?.getTime() ?? null) === (normalizedDate?.getTime() ?? null) ? prevValue : normalizedDate\n\t\t);\n\t\tsetInputValue((prevValue) => (prevValue === nextInputValue ? prevValue : nextInputValue));\n\t});\n\n\tuseEffect(() => {\n\t\tsyncStateFromProps(options.value);\n\t}, [\n\t\toptions.dateFormat,\n\t\toptions.datePickerLevel,\n\t\toptions.datePreset,\n\t\toptions.selectsRange,\n\t\toptions.selectionMode,\n\t\toptions.value,\n\t\toptions.weekEndDay,\n\t\tvalueSignature\n\t]);\n\n\t/**\n\t * Парсит строковое значение поля в дату или диапазон дат.\n\t */\n\tconst parseDate = (dateString: string): Date | NullableDateRange | null => {\n\t\tconst parseOptions: DateInputValueOptions = {\n\t\t\t...formatOptions,\n\t\t\treferenceDate: resolveReferenceDate(selectedDate)\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn parseRangeDateValue(dateString, parseOptions);\n\t\t}\n\n\t\treturn parseSingleDateValue(dateString, parseOptions);\n\t};\n\n\t/**\n\t * Обрабатывает выбор даты из календаря.\n\t */\n\tconst handleSelect = (date: Date | NullableDateRange) => {\n\t\tconst [selectedStartDate, selectedEndDate] = (Array.isArray(date) ? date : [date, null]) as NullableDateRange;\n\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedStartDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\t\tconst normalizedEndDate = normalizeRangeEndDateValue(selectedEndDate, formatOptions);\n\n\t\t\tif (normalizedStartDate && normalizedEndDate) {\n\t\t\t\tif (normalizedEndDate < normalizedStartDate) {\n\t\t\t\t\tconst swappedRange: NullableDateRange = [\n\t\t\t\t\t\tnormalizeSingleDateValue(selectedEndDate, formatOptions),\n\t\t\t\t\t\tnormalizeRangeEndDateValue(selectedStartDate, formatOptions)\n\t\t\t\t\t];\n\t\t\t\t\tsetSelectedDate(swappedRange);\n\t\t\t\t\tsetInputValue(formatValue(swappedRange));\n\t\t\t\t\toptions.onChange(swappedRange);\n\t\t\t\t} else {\n\t\t\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, normalizedEndDate];\n\t\t\t\t\tsetSelectedDate(nextRange);\n\t\t\t\t\tsetInputValue(formatValue(nextRange));\n\t\t\t\t\toptions.onChange(nextRange);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, null];\n\t\t\tsetSelectedDate(nextRange);\n\t\t\tsetInputValue(formatValue(nextRange));\n\t\t\treturn false;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\tsetSelectedDate(normalizedDate);\n\t\tsetInputValue(formatValue(normalizedDate));\n\t\toptions.onChange(normalizedDate);\n\n\t\treturn true;\n\t};\n\n\treturn {\n\t\tinputValue,\n\t\tsetInputValue,\n\t\tselectedDate,\n\t\tsetSelectedDate,\n\t\thandleSelect,\n\t\tformatDate: formatValue,\n\t\tparseDate\n\t};\n};\n",".calendarButton {\n\t&:hover {\n\t\tcolor: var(--focus-ring);\n\t}\n}\n\n.selectionModeControl {\n\tmargin-top: var(--space-sm);\n\tpadding-top: var(--space-sm);\n\tborder-top: var(--border);\n}\n","import { JSX, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CalendarDaysIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { InputText } from \"../../input\";\nimport { Popover } from \"../../popover\";\nimport { RadioGroup } from \"../../radio-group\";\nimport { UiBaseProps } from \"../../types\";\nimport {\n\tareRangeDateValuesEqual,\n\tareSingleDateValuesEqual,\n\tDATE_INPUT_SELECTION_MODES,\n\tisDatePickerLevelAvailable,\n\tresolveAvailableDatePickerLevel,\n\ttype DateInputSelectionMode,\n\ttype DateInputWeekEndDay,\n\ttype DatePickerLevel\n} from \"../lib\";\nimport { useDateInput } from \"../model\";\n\nimport { CalendarView } from \"./CalendarView\";\nimport styles from \"./DateInput.module.scss\";\n\ninterface BaseDateInputProps {\n\terror?: string;\n\tonClearError?: () => void;\n\n\tminDate?: Date;\n\tmaxDate?: Date;\n\n\tdatePreset?: string;\n\t/**\n\t * @deprecated Используйте `datePreset`.\n\t */\n\tdateFormat?: string;\n\n\t/**\n\t * Минимальный уровень календарной навигации. Размер выбранного периода задаёт `selectionMode`.\n\t */\n\tdatePickerLevel?: DatePickerLevel;\n\t/**\n\t * Размер периода, который выбирает поле: день, неделя, месяц или год.\n\t */\n\tselectionMode?: DateInputSelectionMode;\n\t/**\n\t * Последний включённый день недели для `selectionMode=\"week\"`.\n\t */\n\tweekEndDay?: DateInputWeekEndDay;\n\t/**\n\t * Показывает переключатель `selectionMode` под календарём.\n\t */\n\tallowSelectionModeChange?: boolean;\n\t/**\n\t * Ограничивает набор режимов в runtime-переключателе.\n\t */\n\tselectionModeOptions?: readonly DateInputSelectionMode[];\n\t/**\n\t * Сообщает наружу о runtime-смене режима выбора.\n\t */\n\tonSelectionModeChange?: (selectionMode: DateInputSelectionMode) => void;\n}\n\nexport interface DateSingleInputProps extends BaseDateInputProps, UiBaseProps<Date | null> {\n\tselectsRange?: false;\n}\nexport interface DateRangeInputProps extends BaseDateInputProps, UiBaseProps<NullableDateRange | null> {\n\tselectsRange: true;\n}\n\ntype DateInputProps = DateSingleInputProps | DateRangeInputProps;\n\ninterface CalendarTypeState {\n\treadonly view: DatePickerLevel;\n\treadonly selectionMode: DateInputSelectionMode;\n\treadonly minDatePickerLevel: DatePickerLevel;\n}\n\nconst selectionModeLabels: Record<DateInputSelectionMode, string> = {\n\tday: \"День\",\n\tweek: \"Неделя\",\n\tmonth: \"Месяц\",\n\tyear: \"Год\"\n};\n\nfunction resolveSelectionModeOptions(\n\tselectionModeOptions: readonly DateInputSelectionMode[] | undefined,\n\tselectionMode: DateInputSelectionMode\n): readonly DateInputSelectionMode[] {\n\tconst enabledModes = new Set(selectionModeOptions?.length ? selectionModeOptions : DATE_INPUT_SELECTION_MODES);\n\tenabledModes.add(selectionMode);\n\n\treturn DATE_INPUT_SELECTION_MODES.filter((mode) => enabledModes.has(mode));\n}\n\nfunction DateInput(props: DateSingleInputProps): JSX.Element;\nfunction DateInput(props: DateRangeInputProps): JSX.Element;\nfunction DateInput({\n\tplaceholder,\n\tdisabled,\n\terror,\n\tonClearError,\n\tminDate,\n\tmaxDate,\n\tdatePickerLevel,\n\tselectionMode: controlledSelectionMode,\n\tweekEndDay = \"sunday\",\n\tallowSelectionModeChange,\n\tselectionModeOptions,\n\tonSelectionModeChange,\n\t...props\n}: DateInputProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst [uncontrolledSelectionMode, setUncontrolledSelectionMode] = useState<DateInputSelectionMode>(controlledSelectionMode ?? \"day\");\n\tconst selectionMode = controlledSelectionMode ?? uncontrolledSelectionMode;\n\tconst minDatePickerLevel = datePickerLevel ?? \"day\";\n\tconst preferredCalendarType = resolveAvailableDatePickerLevel(selectionMode, minDatePickerLevel);\n\tconst [calendarTypeState, setCalendarTypeState] = useState<CalendarTypeState>(() => ({\n\t\tview: preferredCalendarType,\n\t\tselectionMode,\n\t\tminDatePickerLevel\n\t}));\n\tconst calendarType =\n\t\tcalendarTypeState.selectionMode === selectionMode &&\n\t\tcalendarTypeState.minDatePickerLevel === minDatePickerLevel &&\n\t\tisDatePickerLevelAvailable(calendarTypeState.view, minDatePickerLevel)\n\t\t\t? calendarTypeState.view\n\t\t\t: preferredCalendarType;\n\n\tconst initialDateRef = useRef(props.value);\n\tconst dateInputValueOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\n\tconst { inputValue, setInputValue, selectedDate, setSelectedDate, handleSelect, formatDate, parseDate } = useDateInput({\n\t\t...props,\n\t\tdatePickerLevel: minDatePickerLevel,\n\t\tselectionMode,\n\t\tweekEndDay\n\t});\n\tconst rangeOnChange = props.selectsRange ? props.onChange : undefined;\n\n\tconst updateCalendarType = useCallback(\n\t\t(calendarType: DatePickerLevel) => {\n\t\t\tif (isDatePickerLevelAvailable(calendarType, minDatePickerLevel)) {\n\t\t\t\tsetCalendarTypeState({\n\t\t\t\t\tview: calendarType,\n\t\t\t\t\tselectionMode,\n\t\t\t\t\tminDatePickerLevel\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[minDatePickerLevel, selectionMode]\n\t);\n\n\tuseEffect(() => {\n\t\tinitialDateRef.current = props.value;\n\t}, [props.value]);\n\n\tconst handleInputBlur = () => {\n\t\tif (inputValue) {\n\t\t\tconst parsedDate = parseDate(inputValue);\n\t\t\tif (parsedDate) {\n\t\t\t\tsetInputValue(formatDate(parsedDate));\n\n\t\t\t\tif (props.selectsRange && isDateRangeTuple(parsedDate)) {\n\t\t\t\t\tconst selectedRange = isDateRangeTuple(selectedDate) ? selectedDate : null;\n\n\t\t\t\t\tif (areRangeDateValuesEqual(parsedDate, selectedRange, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t} else if (!props.selectsRange && parsedDate instanceof Date) {\n\t\t\t\t\tconst selectedSingleDate = selectedDate instanceof Date ? selectedDate : null;\n\n\t\t\t\t\tif (areSingleDateValuesEqual(parsedDate, selectedSingleDate, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault();\n\t\t\thandleInputBlur();\n\t\t}\n\t};\n\n\tconst handleCalendarDateSelect = useCallback(\n\t\t(value: Date | NullableDateRange) => {\n\t\t\tif (handleSelect(value)) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[handleSelect]\n\t);\n\n\tconst handleSelectionModeChange = useCallback(\n\t\t(nextSelectionMode: DateInputSelectionMode) => {\n\t\t\tif (controlledSelectionMode === undefined) {\n\t\t\t\tsetUncontrolledSelectionMode(nextSelectionMode);\n\t\t\t}\n\n\t\t\tonSelectionModeChange?.(nextSelectionMode);\n\t\t\tsetCalendarTypeState({\n\t\t\t\tview: resolveAvailableDatePickerLevel(nextSelectionMode, minDatePickerLevel),\n\t\t\t\tselectionMode: nextSelectionMode,\n\t\t\t\tminDatePickerLevel\n\t\t\t});\n\t\t},\n\t\t[controlledSelectionMode, minDatePickerLevel, onSelectionModeChange]\n\t);\n\n\tconst handleCancel = useCallback(() => {\n\t\t// Восстановить исходное состояние при отмене\n\t\tif (rangeOnChange) {\n\t\t\tconst [, selectedEndDate] = isDateRangeTuple(selectedDate) ? selectedDate : [null, null];\n\n\t\t\tif (!selectedEndDate) {\n\t\t\t\t// Восстановить исходное состояние диапазона\n\t\t\t\tconst initialValue = initialDateRef.current;\n\t\t\t\tconst initialRange = Array.isArray(initialValue) ? initialValue : null;\n\t\t\t\tconst initialStart = initialRange?.[0] ?? null;\n\t\t\t\tconst initialEnd = initialRange?.[1] ?? null;\n\n\t\t\t\tif (initialStart && initialEnd) {\n\t\t\t\t\tconst initialSelectedDate: NullableDateRange = [initialStart, initialEnd];\n\t\t\t\t\tsetSelectedDate(initialSelectedDate);\n\t\t\t\t\tsetInputValue(formatDate(initialSelectedDate));\n\n\t\t\t\t\trangeOnChange(initialSelectedDate);\n\t\t\t\t} else {\n\t\t\t\t\t// Если начального диапазона нет, очистить всё\n\t\t\t\t\tsetSelectedDate([null, null]);\n\t\t\t\t\tsetInputValue(\"\");\n\n\t\t\t\t\trangeOnChange([null, null]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [rangeOnChange, selectedDate, setSelectedDate, setInputValue, formatDate]);\n\n\tconst availableSelectionModes = resolveSelectionModeOptions(selectionModeOptions, selectionMode);\n\tconst showSelectionModeControl = allowSelectionModeChange && availableSelectionModes.length > 1;\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tonOpenChange={(value) => {\n\t\t\t\tsetOpen(value);\n\t\t\t\tif (!value) {\n\t\t\t\t\thandleCancel();\n\t\t\t\t}\n\t\t\t}}>\n\t\t\t<InputText\n\t\t\t\tlabel={props.label}\n\t\t\t\tdescription={props.description}\n\t\t\t\tsize={props.size}\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={setInputValue}\n\t\t\t\tonBlur={handleInputBlur}\n\t\t\t\tonKeyUp={handleKeyDown}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\terror={error}\n\t\t\t\tonClearError={onClearError}\n\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\tendAdornment={\n\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tclassName={styles.calendarButton}\n\t\t\t\t\t\t\ticon={<CalendarDaysIcon />}\n\t\t\t\t\t\t\taria-label=\"Открыть календарь\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t<Popover.Content background=\"primary\">\n\t\t\t\t<CalendarView\n\t\t\t\t\tview={calendarType}\n\t\t\t\t\tdatePickerLevel={minDatePickerLevel}\n\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\tonViewChange={updateCalendarType}\n\t\t\t\t\tvalue={selectedDate ?? null}\n\t\t\t\t\tonChange={handleCalendarDateSelect}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\tselectsRange={!!props.selectsRange}\n\t\t\t\t/>\n\t\t\t\t{showSelectionModeControl && (\n\t\t\t\t\t<div className={styles.selectionModeControl}>\n\t\t\t\t\t\t<RadioGroup<DateInputSelectionMode>\n\t\t\t\t\t\t\tvalue={selectionMode}\n\t\t\t\t\t\t\tonChange={handleSelectionModeChange}\n\t\t\t\t\t\t\tnoWrap\n\t\t\t\t\t\t\taria-label=\"Режим выбора даты\">\n\t\t\t\t\t\t\t{availableSelectionModes.map((mode) => (\n\t\t\t\t\t\t\t\t<RadioGroup.Option key={mode} value={mode} label={selectionModeLabels[mode]} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover>\n\t);\n}\n\nexport function SingleDateInput(props: Omit<DateSingleInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} />;\n}\n\nexport function RangeDateInput(props: Omit<DateRangeInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} selectsRange={true} />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-input-DBJisPRz.js","names":[],"sources":["../../src/date-input/lib/dateInputValue.ts","../../src/date-input/model/useDateInput.ts","../../src/date-input/ui/DateInput.module.scss","../../src/date-input/ui/DateInput.tsx"],"sourcesContent":["import {\n\tDEFAULT_DATE_PRESET_NAMES,\n\tformatDate,\n\tformatDateRange,\n\tgetCalendarPeriod,\n\tgetDatePreset,\n\tisDateRangeTuple,\n\tparseDateByFormat,\n\tresolveDateFormatName,\n\tresolveDateFormatPreset,\n\ttype CalendarPeriodOptions,\n\ttype DateFormatPrecision,\n\ttype DateFormatPreset,\n\ttype DateRangeInput,\n\ttype NullableDateRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\n/**\n * Пресет даты по умолчанию для текстового поля.\n */\nexport const DEFAULT_DATE_INPUT_PRESET = DEFAULT_DATE_PRESET_NAMES.date;\n\n/**\n * @deprecated Используйте `DEFAULT_DATE_INPUT_PRESET`.\n */\nexport const DEFAULT_DATE_INPUT_FORMAT = \"dd.MM.yyyy\";\n\nconst RANGE_SEPARATOR = \" - \";\nconst DATE_INPUT_FORMAT_OPTIONS = Object.freeze({\n\tdefaultFormat: DEFAULT_DATE_INPUT_PRESET,\n\tpatternPresetName: \"__date_input__\"\n});\n\nexport type DateInputValueOptions = {\n\t/**\n\t * Имя пресета форматирования даты.\n\t */\n\tdatePreset?: string;\n\t/**\n\t * @deprecated Используйте `datePreset`.\n\t */\n\tdateFormat?: string;\n\t/**\n\t * Точность календарного значения.\n\t */\n\tdatePickerLevel?: DateFormatPrecision;\n\t/**\n\t * Размер периода, который выбирается и нормализуется полем.\n\t */\n\tselectionMode?: CalendarPeriodOptions[\"selectionMode\"];\n\t/**\n\t * Последний включённый день недели для режима выбора недели.\n\t */\n\tweekEndDay?: CalendarPeriodOptions[\"weekEndDay\"];\n\t/**\n\t * Опорная дата для пресетов без года, например `month-long`.\n\t */\n\treferenceDate?: Date;\n};\n\nexport type DateInputValueOptionsInput = string | DateInputValueOptions | undefined;\n\n/**\n * Возвращает точность форматирования поля даты.\n */\nfunction resolveDateInputPrecision(options: DateInputValueOptions): DateFormatPrecision {\n\tif (options.selectionMode === \"day\" || options.selectionMode === \"week\") {\n\t\treturn \"day\";\n\t}\n\n\tif (options.selectionMode === \"month\" || options.selectionMode === \"year\") {\n\t\treturn options.selectionMode;\n\t}\n\n\treturn options.datePickerLevel ?? \"day\";\n}\n\nfunction resolveCalendarPeriodOptions(options?: DateInputValueOptions): CalendarPeriodOptions {\n\treturn {\n\t\tselectionMode: options?.selectionMode,\n\t\tweekEndDay: options?.weekEndDay\n\t};\n}\n\n/**\n * Нормализует объектные опции и позиционный вызов с именем пресета.\n */\nfunction normalizeDateInputValueOptions(\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): DateInputValueOptions {\n\tif (typeof optionsOrPreset === \"string\" || optionsOrPreset === undefined) {\n\t\treturn {\n\t\t\tdatePreset: optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\tif (datePickerLevel && optionsOrPreset.datePickerLevel === undefined) {\n\t\treturn {\n\t\t\t...optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\treturn optionsOrPreset;\n}\n\n/**\n * Проверяет новый `datePreset` и возвращает только зарегистрированное имя пресета.\n */\nfunction resolveDateInputPresetName(datePreset?: string): string {\n\tconst resolvedPresetName = resolveDateFormatName(datePreset, DEFAULT_DATE_INPUT_PRESET);\n\treturn getDatePreset(resolvedPresetName) ? resolvedPresetName : DEFAULT_DATE_INPUT_PRESET;\n}\n\n/**\n * Возвращает имя пресета или deprecated-формат для парсинга.\n */\nfunction resolveDateInputFormatName(options: DateInputValueOptions): string | undefined {\n\tif (options.datePreset !== undefined) {\n\t\treturn resolveDateInputPresetName(options.datePreset);\n\t}\n\n\treturn options.dateFormat;\n}\n\n/**\n * Возвращает зарегистрированный пресет или deprecated-объектный шаблон.\n */\nfunction resolveDateInputFormatPreset(options: DateInputValueOptions): string | DateFormatPreset {\n\tif (options.datePreset !== undefined) {\n\t\treturn resolveDateInputPresetName(options.datePreset);\n\t}\n\n\treturn resolveDateFormatPreset(options.dateFormat, DATE_INPUT_FORMAT_OPTIONS);\n}\n\n/**\n * Приводит результат универсального парсинга к календарной дате.\n */\nfunction parseDateTimeValue(value: string, options: DateInputValueOptions): Date | null {\n\treturn (\n\t\tparseDateByFormat(value, resolveDateInputFormatName(options), {\n\t\t\tdefaultFormat: DEFAULT_DATE_INPUT_PRESET,\n\t\t\tprecision: resolveDateInputPrecision(options),\n\t\t\treferenceDate: options.referenceDate\n\t\t})?.date ?? null\n\t);\n}\n\n/**\n * Приводит одиночную дату к началу выбранного календарного периода.\n */\nexport function normalizeSingleDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.start ?? null;\n}\n\n/**\n * Приводит диапазон дат к границам выбранных календарных периодов.\n */\nexport function normalizeRangeDateValue(range: NullableDateRange | null, options?: DateInputValueOptions): NullableDateRange | null {\n\tif (!isDateRangeTuple(range)) return null;\n\n\tconst [startDate, endDate] = range;\n\treturn [normalizeSingleDateValue(startDate, options), normalizeRangeEndDateValue(endDate, options)];\n}\n\n/**\n * Приводит конечную дату диапазона к концу выбранного календарного периода.\n */\nexport function normalizeRangeEndDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.end ?? null;\n}\n\nfunction getDateTime(date: Date | null): number | null {\n\treturn date?.getTime() ?? null;\n}\n\n/**\n * Сравнивает одиночные даты после нормализации к точности поля ввода.\n */\nexport function areSingleDateValuesEqual(left: Date | null, right: Date | null, options?: DateInputValueOptions): boolean {\n\treturn getDateTime(normalizeSingleDateValue(left, options)) === getDateTime(normalizeSingleDateValue(right, options));\n}\n\n/**\n * Сравнивает диапазоны дат после нормализации к границам выбранных периодов.\n */\nexport function areRangeDateValuesEqual(\n\tleft: NullableDateRange | null,\n\tright: NullableDateRange | null,\n\toptions?: DateInputValueOptions\n): boolean {\n\tconst normalizedLeft = normalizeRangeDateValue(left, options);\n\tconst normalizedRight = normalizeRangeDateValue(right, options);\n\n\treturn (\n\t\tgetDateTime(normalizedLeft?.[0] ?? null) === getDateTime(normalizedRight?.[0] ?? null) &&\n\t\tgetDateTime(normalizedLeft?.[1] ?? null) === getDateTime(normalizedRight?.[1] ?? null)\n\t);\n}\n\n/**\n * Форматирует одиночную дату для текстового поля.\n */\nexport function formatSingleDateValue(\n\tdate: Date | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!date) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst period = getCalendarPeriod(date, resolveCalendarPeriodOptions(options));\n\n\t// Single-поле хранит начало недели, но показывает обе включительные границы выбранного периода.\n\tif (options.selectionMode === \"week\" && period) {\n\t\treturn formatDateRange(period.start, period.end, resolveDateInputFormatPreset(options), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\treturn formatDate(date, resolveDateInputFormatPreset(options), {\n\t\tprecision: resolveDateInputPrecision(options)\n\t});\n}\n\n/**\n * Форматирует диапазон дат для текстового поля.\n */\nexport function formatRangeDateValue(\n\trange: NullableDateRange | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!isDateRangeTuple(range)) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startDate, endDate] = range;\n\tif (startDate && endDate) {\n\t\treturn formatDateRange(startDate, endDate, resolveDateInputFormatPreset(options), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\tif (startDate) {\n\t\treturn `${formatDate(startDate, resolveDateInputFormatPreset(options), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t})}${RANGE_SEPARATOR}`;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Унифицирует форматирование значения поля даты.\n */\nexport function formatDateInputValue(\n\tvalue: DateRangeInput,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (isDateRangeTuple(value)) {\n\t\treturn formatRangeDateValue(value, optionsOrPreset, datePickerLevel);\n\t}\n\n\treturn formatSingleDateValue(value, optionsOrPreset, datePickerLevel);\n}\n\n/**\n * Парсит строку одиночной даты по заданному шаблону или пресету.\n */\nexport function parseSingleDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\t// Для отображаемого диапазона single-week источником значения остаётся его первая граница.\n\tconst singleValue = options.selectionMode === \"week\" ? (value.split(RANGE_SEPARATOR)[0] ?? \"\") : value;\n\n\treturn normalizeSingleDateValue(parseDateTimeValue(singleValue, options), options);\n}\n\n/**\n * Парсит строку диапазона дат по заданному шаблону или пресету.\n */\nexport function parseRangeDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): NullableDateRange {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startPart = \"\", endPart = \"\"] = value.split(RANGE_SEPARATOR);\n\n\treturn [parseSingleDateValue(startPart, options), parseRangeEndDateValue(endPart, options)];\n}\n\n/**\n * Парсит конечную дату диапазона и нормализует её к концу суток.\n */\nexport function parseRangeEndDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\treturn normalizeRangeEndDateValue(parseDateTimeValue(value, options), options);\n}\n","import { useEffect, useEffectEvent, useMemo, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nimport {\n\tDateInputValueOptions,\n\tformatDateInputValue,\n\tnormalizeRangeDateValue,\n\tnormalizeRangeEndDateValue,\n\tnormalizeSingleDateValue,\n\tparseRangeDateValue,\n\tparseSingleDateValue,\n\ttype DateInputOptions\n} from \"../lib\";\n\nfunction resolveReferenceDate(value: Date | NullableDateRange | null): Date | undefined {\n\tif (isDateRangeTuple(value)) {\n\t\treturn value[0] ?? value[1] ?? undefined;\n\t}\n\n\treturn value ?? undefined;\n}\n\n/**\n * Хук управляет текстовым представлением и выбранным значением поля даты.\n */\nexport const useDateInput = (options: DateInputOptions) => {\n\tconst initialSelectedDate = useMemo(() => {\n\t\tconst selectionOptions: DateInputValueOptions = {\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn normalizeRangeDateValue(options.value as NullableDateRange | null, selectionOptions);\n\t\t}\n\n\t\treturn normalizeSingleDateValue(options.value as Date | null, selectionOptions);\n\t}, [options.selectsRange, options.selectionMode, options.value, options.weekEndDay]);\n\n\tconst [selectedDate, setSelectedDate] = useState(initialSelectedDate);\n\tconst formatOptions = useMemo<DateInputValueOptions>(\n\t\t() => ({\n\t\t\tdatePreset: options.datePreset,\n\t\t\tdateFormat: options.dateFormat,\n\t\t\tdatePickerLevel: options.datePickerLevel,\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t}),\n\t\t[options.dateFormat, options.datePickerLevel, options.datePreset, options.selectionMode, options.weekEndDay]\n\t);\n\tconst [inputValue, setInputValue] = useState<string>(() => formatDateInputValue(initialSelectedDate, formatOptions));\n\tconst valueSignature = useMemo(() => {\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedRange = normalizeRangeDateValue(options.value as NullableDateRange | null, formatOptions);\n\t\t\treturn `${normalizedRange?.[0]?.getTime() ?? \"null\"}:${normalizedRange?.[1]?.getTime() ?? \"null\"}`;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(options.value as Date | null, formatOptions);\n\t\treturn String(normalizedDate?.getTime() ?? \"null\");\n\t}, [formatOptions, options.selectsRange, options.value]);\n\n\t/**\n\t * Форматирует значение поля даты согласно текущему шаблону.\n\t */\n\tconst formatValue = (value: Date | NullableDateRange | null): string => formatDateInputValue(value, formatOptions);\n\n\t/**\n\t * Синхронизирует внутреннее состояние с внешними пропсами.\n\t */\n\tconst syncStateFromProps = useEffectEvent((nextValue: DateInputOptions[\"value\"]) => {\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedRange = normalizeRangeDateValue(nextValue as NullableDateRange | null, formatOptions);\n\t\t\tconst nextInputValue = formatValue(normalizedRange);\n\n\t\t\tsetSelectedDate((prevValue) => {\n\t\t\t\tconst previousRangeValue = prevValue as NullableDateRange | null;\n\t\t\t\tconst hasSameRange =\n\t\t\t\t\t(previousRangeValue?.[0]?.getTime() ?? null) === (normalizedRange?.[0]?.getTime() ?? null) &&\n\t\t\t\t\t(previousRangeValue?.[1]?.getTime() ?? null) === (normalizedRange?.[1]?.getTime() ?? null);\n\n\t\t\t\treturn hasSameRange ? prevValue : normalizedRange;\n\t\t\t});\n\t\t\tsetInputValue((prevValue) => (prevValue === nextInputValue ? prevValue : nextInputValue));\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(nextValue as Date | null, formatOptions);\n\t\tconst nextInputValue = formatValue(normalizedDate);\n\n\t\tsetSelectedDate((prevValue) =>\n\t\t\t((prevValue as Date | null)?.getTime() ?? null) === (normalizedDate?.getTime() ?? null) ? prevValue : normalizedDate\n\t\t);\n\t\tsetInputValue((prevValue) => (prevValue === nextInputValue ? prevValue : nextInputValue));\n\t});\n\n\tuseEffect(() => {\n\t\tsyncStateFromProps(options.value);\n\t}, [\n\t\toptions.dateFormat,\n\t\toptions.datePickerLevel,\n\t\toptions.datePreset,\n\t\toptions.selectsRange,\n\t\toptions.selectionMode,\n\t\toptions.value,\n\t\toptions.weekEndDay,\n\t\tvalueSignature\n\t]);\n\n\t/**\n\t * Парсит строковое значение поля в дату или диапазон дат.\n\t */\n\tconst parseDate = (dateString: string): Date | NullableDateRange | null => {\n\t\tconst parseOptions: DateInputValueOptions = {\n\t\t\t...formatOptions,\n\t\t\treferenceDate: resolveReferenceDate(selectedDate)\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn parseRangeDateValue(dateString, parseOptions);\n\t\t}\n\n\t\treturn parseSingleDateValue(dateString, parseOptions);\n\t};\n\n\t/**\n\t * Обрабатывает выбор даты из календаря.\n\t */\n\tconst handleSelect = (date: Date | NullableDateRange) => {\n\t\tconst [selectedStartDate, selectedEndDate] = (Array.isArray(date) ? date : [date, null]) as NullableDateRange;\n\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedStartDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\t\tconst normalizedEndDate = normalizeRangeEndDateValue(selectedEndDate, formatOptions);\n\n\t\t\tif (normalizedStartDate && normalizedEndDate) {\n\t\t\t\tif (normalizedEndDate < normalizedStartDate) {\n\t\t\t\t\tconst swappedRange: NullableDateRange = [\n\t\t\t\t\t\tnormalizeSingleDateValue(selectedEndDate, formatOptions),\n\t\t\t\t\t\tnormalizeRangeEndDateValue(selectedStartDate, formatOptions)\n\t\t\t\t\t];\n\t\t\t\t\tsetSelectedDate(swappedRange);\n\t\t\t\t\tsetInputValue(formatValue(swappedRange));\n\t\t\t\t\toptions.onChange(swappedRange);\n\t\t\t\t} else {\n\t\t\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, normalizedEndDate];\n\t\t\t\t\tsetSelectedDate(nextRange);\n\t\t\t\t\tsetInputValue(formatValue(nextRange));\n\t\t\t\t\toptions.onChange(nextRange);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, null];\n\t\t\tsetSelectedDate(nextRange);\n\t\t\tsetInputValue(formatValue(nextRange));\n\t\t\treturn false;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\tsetSelectedDate(normalizedDate);\n\t\tsetInputValue(formatValue(normalizedDate));\n\t\toptions.onChange(normalizedDate);\n\n\t\treturn true;\n\t};\n\n\treturn {\n\t\tinputValue,\n\t\tsetInputValue,\n\t\tselectedDate,\n\t\tsetSelectedDate,\n\t\thandleSelect,\n\t\tformatDate: formatValue,\n\t\tparseDate\n\t};\n};\n",".calendarButton {\n\t&:hover {\n\t\tcolor: var(--focus-ring);\n\t}\n}\n\n.selectionModeControl {\n\tmargin-top: var(--space-sm);\n\tpadding-top: var(--space-sm);\n\tborder-top: var(--border);\n}\n","import { JSX, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CalendarDaysIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { InputText } from \"../../input\";\nimport { Popover } from \"../../popover\";\nimport { RadioGroup } from \"../../radio-group\";\nimport { UiBaseProps } from \"../../types\";\nimport {\n\tareRangeDateValuesEqual,\n\tareSingleDateValuesEqual,\n\tDATE_INPUT_SELECTION_MODES,\n\tisDatePickerLevelAvailable,\n\tresolveAvailableDatePickerLevel,\n\ttype DateInputSelectionMode,\n\ttype DateInputWeekEndDay,\n\ttype DatePickerLevel\n} from \"../lib\";\nimport { useDateInput } from \"../model\";\n\nimport { CalendarView } from \"./CalendarView\";\nimport styles from \"./DateInput.module.scss\";\n\ninterface BaseDateInputProps {\n\terror?: string;\n\tonClearError?: () => void;\n\n\tminDate?: Date;\n\tmaxDate?: Date;\n\n\tdatePreset?: string;\n\t/**\n\t * @deprecated Используйте `datePreset`.\n\t */\n\tdateFormat?: string;\n\n\t/**\n\t * Минимальный уровень календарной навигации. Размер выбранного периода задаёт `selectionMode`.\n\t */\n\tdatePickerLevel?: DatePickerLevel;\n\t/**\n\t * Размер периода, который выбирает поле: день, неделя, месяц или год.\n\t */\n\tselectionMode?: DateInputSelectionMode;\n\t/**\n\t * Последний включённый день недели для `selectionMode=\"week\"`.\n\t */\n\tweekEndDay?: DateInputWeekEndDay;\n\t/**\n\t * Показывает переключатель `selectionMode` под календарём.\n\t */\n\tallowSelectionModeChange?: boolean;\n\t/**\n\t * Ограничивает набор режимов в runtime-переключателе.\n\t */\n\tselectionModeOptions?: readonly DateInputSelectionMode[];\n\t/**\n\t * Сообщает наружу о runtime-смене режима выбора.\n\t */\n\tonSelectionModeChange?: (selectionMode: DateInputSelectionMode) => void;\n}\n\nexport interface DateSingleInputProps extends BaseDateInputProps, UiBaseProps<Date | null> {\n\tselectsRange?: false;\n}\nexport interface DateRangeInputProps extends BaseDateInputProps, UiBaseProps<NullableDateRange | null> {\n\tselectsRange: true;\n}\n\ntype DateInputProps = DateSingleInputProps | DateRangeInputProps;\n\ninterface CalendarTypeState {\n\treadonly view: DatePickerLevel;\n\treadonly selectionMode: DateInputSelectionMode;\n\treadonly minDatePickerLevel: DatePickerLevel;\n}\n\nconst selectionModeLabels: Record<DateInputSelectionMode, string> = {\n\tday: \"День\",\n\tweek: \"Неделя\",\n\tmonth: \"Месяц\",\n\tyear: \"Год\"\n};\n\nfunction resolveSelectionModeOptions(\n\tselectionModeOptions: readonly DateInputSelectionMode[] | undefined,\n\tselectionMode: DateInputSelectionMode\n): readonly DateInputSelectionMode[] {\n\tconst enabledModes = new Set(selectionModeOptions?.length ? selectionModeOptions : DATE_INPUT_SELECTION_MODES);\n\tenabledModes.add(selectionMode);\n\n\treturn DATE_INPUT_SELECTION_MODES.filter((mode) => enabledModes.has(mode));\n}\n\nfunction DateInput(props: DateSingleInputProps): JSX.Element;\nfunction DateInput(props: DateRangeInputProps): JSX.Element;\nfunction DateInput({\n\tplaceholder,\n\tdisabled,\n\terror,\n\tonClearError,\n\tminDate,\n\tmaxDate,\n\tdatePickerLevel,\n\tselectionMode: controlledSelectionMode,\n\tweekEndDay = \"sunday\",\n\tallowSelectionModeChange,\n\tselectionModeOptions,\n\tonSelectionModeChange,\n\t...props\n}: DateInputProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst [uncontrolledSelectionMode, setUncontrolledSelectionMode] = useState<DateInputSelectionMode>(controlledSelectionMode ?? \"day\");\n\tconst selectionMode = controlledSelectionMode ?? uncontrolledSelectionMode;\n\tconst minDatePickerLevel = datePickerLevel ?? \"day\";\n\tconst preferredCalendarType = resolveAvailableDatePickerLevel(selectionMode, minDatePickerLevel);\n\tconst [calendarTypeState, setCalendarTypeState] = useState<CalendarTypeState>(() => ({\n\t\tview: preferredCalendarType,\n\t\tselectionMode,\n\t\tminDatePickerLevel\n\t}));\n\tconst calendarType =\n\t\tcalendarTypeState.selectionMode === selectionMode &&\n\t\tcalendarTypeState.minDatePickerLevel === minDatePickerLevel &&\n\t\tisDatePickerLevelAvailable(calendarTypeState.view, minDatePickerLevel)\n\t\t\t? calendarTypeState.view\n\t\t\t: preferredCalendarType;\n\n\tconst initialDateRef = useRef(props.value);\n\tconst dateInputValueOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\n\tconst { inputValue, setInputValue, selectedDate, setSelectedDate, handleSelect, formatDate, parseDate } = useDateInput({\n\t\t...props,\n\t\tdatePickerLevel: minDatePickerLevel,\n\t\tselectionMode,\n\t\tweekEndDay\n\t});\n\tconst rangeOnChange = props.selectsRange ? props.onChange : undefined;\n\n\tconst updateCalendarType = useCallback(\n\t\t(calendarType: DatePickerLevel) => {\n\t\t\tif (isDatePickerLevelAvailable(calendarType, minDatePickerLevel)) {\n\t\t\t\tsetCalendarTypeState({\n\t\t\t\t\tview: calendarType,\n\t\t\t\t\tselectionMode,\n\t\t\t\t\tminDatePickerLevel\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[minDatePickerLevel, selectionMode]\n\t);\n\n\tuseEffect(() => {\n\t\tinitialDateRef.current = props.value;\n\t}, [props.value]);\n\n\tconst handleInputBlur = () => {\n\t\tif (inputValue) {\n\t\t\tconst parsedDate = parseDate(inputValue);\n\t\t\tif (parsedDate) {\n\t\t\t\tsetInputValue(formatDate(parsedDate));\n\n\t\t\t\tif (props.selectsRange && isDateRangeTuple(parsedDate)) {\n\t\t\t\t\tconst selectedRange = isDateRangeTuple(selectedDate) ? selectedDate : null;\n\n\t\t\t\t\tif (areRangeDateValuesEqual(parsedDate, selectedRange, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t} else if (!props.selectsRange && parsedDate instanceof Date) {\n\t\t\t\t\tconst selectedSingleDate = selectedDate instanceof Date ? selectedDate : null;\n\n\t\t\t\t\tif (areSingleDateValuesEqual(parsedDate, selectedSingleDate, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault();\n\t\t\thandleInputBlur();\n\t\t}\n\t};\n\n\tconst handleCalendarDateSelect = useCallback(\n\t\t(value: Date | NullableDateRange) => {\n\t\t\tif (handleSelect(value)) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[handleSelect]\n\t);\n\n\tconst handleSelectionModeChange = useCallback(\n\t\t(nextSelectionMode: DateInputSelectionMode) => {\n\t\t\tif (controlledSelectionMode === undefined) {\n\t\t\t\tsetUncontrolledSelectionMode(nextSelectionMode);\n\t\t\t}\n\n\t\t\tonSelectionModeChange?.(nextSelectionMode);\n\t\t\tsetCalendarTypeState({\n\t\t\t\tview: resolveAvailableDatePickerLevel(nextSelectionMode, minDatePickerLevel),\n\t\t\t\tselectionMode: nextSelectionMode,\n\t\t\t\tminDatePickerLevel\n\t\t\t});\n\t\t},\n\t\t[controlledSelectionMode, minDatePickerLevel, onSelectionModeChange]\n\t);\n\n\tconst handleCancel = useCallback(() => {\n\t\t// Восстановить исходное состояние при отмене\n\t\tif (rangeOnChange) {\n\t\t\tconst [, selectedEndDate] = isDateRangeTuple(selectedDate) ? selectedDate : [null, null];\n\n\t\t\tif (!selectedEndDate) {\n\t\t\t\t// Восстановить исходное состояние диапазона\n\t\t\t\tconst initialValue = initialDateRef.current;\n\t\t\t\tconst initialRange = Array.isArray(initialValue) ? initialValue : null;\n\t\t\t\tconst initialStart = initialRange?.[0] ?? null;\n\t\t\t\tconst initialEnd = initialRange?.[1] ?? null;\n\n\t\t\t\tif (initialStart && initialEnd) {\n\t\t\t\t\tconst initialSelectedDate: NullableDateRange = [initialStart, initialEnd];\n\t\t\t\t\tsetSelectedDate(initialSelectedDate);\n\t\t\t\t\tsetInputValue(formatDate(initialSelectedDate));\n\n\t\t\t\t\trangeOnChange(initialSelectedDate);\n\t\t\t\t} else {\n\t\t\t\t\t// Если начального диапазона нет, очистить всё\n\t\t\t\t\tsetSelectedDate([null, null]);\n\t\t\t\t\tsetInputValue(\"\");\n\n\t\t\t\t\trangeOnChange([null, null]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [rangeOnChange, selectedDate, setSelectedDate, setInputValue, formatDate]);\n\n\tconst availableSelectionModes = resolveSelectionModeOptions(selectionModeOptions, selectionMode);\n\tconst showSelectionModeControl = allowSelectionModeChange && availableSelectionModes.length > 1;\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tonOpenChange={(value) => {\n\t\t\t\tsetOpen(value);\n\t\t\t\tif (!value) {\n\t\t\t\t\thandleCancel();\n\t\t\t\t}\n\t\t\t}}>\n\t\t\t<InputText\n\t\t\t\tlabel={props.label}\n\t\t\t\tdescription={props.description}\n\t\t\t\tsize={props.size}\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={setInputValue}\n\t\t\t\tonBlur={handleInputBlur}\n\t\t\t\tonKeyUp={handleKeyDown}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\terror={error}\n\t\t\t\tonClearError={onClearError}\n\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\tendAdornment={\n\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tclassName={styles.calendarButton}\n\t\t\t\t\t\t\ticon={<CalendarDaysIcon />}\n\t\t\t\t\t\t\taria-label=\"Открыть календарь\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t<Popover.Content background=\"primary\">\n\t\t\t\t<CalendarView\n\t\t\t\t\tview={calendarType}\n\t\t\t\t\tdatePickerLevel={minDatePickerLevel}\n\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\tonViewChange={updateCalendarType}\n\t\t\t\t\tvalue={selectedDate ?? null}\n\t\t\t\t\tonChange={handleCalendarDateSelect}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\tselectsRange={!!props.selectsRange}\n\t\t\t\t/>\n\t\t\t\t{showSelectionModeControl && (\n\t\t\t\t\t<div className={styles.selectionModeControl}>\n\t\t\t\t\t\t<RadioGroup<DateInputSelectionMode>\n\t\t\t\t\t\t\tvalue={selectionMode}\n\t\t\t\t\t\t\tonChange={handleSelectionModeChange}\n\t\t\t\t\t\t\tnoWrap\n\t\t\t\t\t\t\taria-label=\"Режим выбора даты\">\n\t\t\t\t\t\t\t{availableSelectionModes.map((mode) => (\n\t\t\t\t\t\t\t\t<RadioGroup.Option key={mode} value={mode} label={selectionModeLabels[mode]} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover>\n\t);\n}\n\nexport function SingleDateInput(props: Omit<DateSingleInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} />;\n}\n\nexport function RangeDateInput(props: Omit<DateRangeInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} selectsRange={true} />;\n}\n"],"mappings":"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"}
|
|
@@ -105,10 +105,10 @@ function g({ value: e, label: t, description: n, className: o }) {
|
|
|
105
105
|
});
|
|
106
106
|
a !== null && (e.preventDefault(), r[a]?.focus(), r[a]?.click());
|
|
107
107
|
},
|
|
108
|
-
children: [/* @__PURE__ */ d("
|
|
108
|
+
children: [/* @__PURE__ */ d("span", {
|
|
109
109
|
className: "textNoWrap",
|
|
110
110
|
children: t
|
|
111
|
-
}), n && /* @__PURE__ */ d("
|
|
111
|
+
}), n && /* @__PURE__ */ d("span", {
|
|
112
112
|
className: "fontSizeSm",
|
|
113
113
|
children: n
|
|
114
114
|
})]
|
|
@@ -118,4 +118,4 @@ h.Option = g;
|
|
|
118
118
|
//#endregion
|
|
119
119
|
export { h as n, g as t };
|
|
120
120
|
|
|
121
|
-
//# sourceMappingURL=radio-group-
|
|
121
|
+
//# sourceMappingURL=radio-group-CM9Lg_nc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio-group-CM9Lg_nc.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tflex: 1 0 0;\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-info-on-fill);\n\t\tbackground-color: var(--status-info-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":";;;;;;;;;;;GCoBM,IAAoB,EAA6C,IAAI;AAkB3E,SAAgB,EAAc,EAC7B,UACA,aACA,UACA,gBACA,aACA,cACA,WACA,iBAAc,cACd,cAAc,GACd,eACsB;CACtB,IAAM,IAAU,EAAM,GAChB,IAAU,IAAQ,GAAG,EAAQ,UAAU,KAAA,GACvC,IAAgB,IAAc,GAAG,EAAQ,gBAAgB,KAAA,GACzD,CAAC,GAAqB,KAA0B,EAAmB,CAAC,CAAC,GACrE,IAAe,GAAa,MAAuB,IAAW,CAAc,GAAG,CAAC,CAAQ,CAAC,GAMzF,IAAiB,GAAa,OACnC,GAAwB,MAAgB,EAAW,SAAS,CAAQ,IAAI,IAAa,CAAC,GAAG,GAAY,CAAQ,CAAE,SAElG;EACZ,GAAwB,MAAe,EAAW,QAAQ,MAAc,MAAc,CAAQ,CAAC;CAChG,IACE,CAAC,CAAC,GAEC,IAAe,SACb;EACN;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA,eAAe,EAAoB;EACnC;CACD,IACA;EAAC;EAAe;EAAU;EAAS;EAAc;EAAS;EAAa;EAAgB;EAAqB;CAAK,CAClH;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAS,WAAW,KAAY,EAAS,UAAU,CAAS;YAA/E;GACE,KACA,kBAAC,OAAD;IAAK,IAAI;IAAS,WAAW,EAAS;cACpC;GACG,CAAA;GAEL,KACA,kBAAC,OAAD;IAAK,IAAI;IAAe,WAAW,EAAS;cAC1C;GACG,CAAA;GAGN,kBAAC,EAAkB,UAAnB;IAA4B,OAAO;cAClC,kBAAC,OAAD;KACC,MAAK;KACL,mBAAiB;KACjB,cAAY,IAAU,KAAA,IAAY;KAClC,oBAAkB;KAClB,iBAAe,KAAY,KAAA;KAC3B,iBAAe,KAAY,KAAA;KAC3B,WAAW,EAAG,EAAS,gBAAgB,EAAO,YAAY,KAAU,EAAO,QAAQ,EAAO,EAAY;KACrG;IACG,CAAA;GACsB,CAAA;EACxB;;AAEP;AAYA,SAAgB,EAAU,EAAE,UAAO,UAAO,gBAAa,gBAA6B;CACnF,IAAM,IAAU,EAAW,CAAiB,GACtC,IAAW,EAAM,GACjB,IAAiB,GAAS;CAUhC,IARA,QAAsB;EAChB,OAIL,OAAO,EAAe,CAAQ;CAC/B,GAAG,CAAC,GAAgB,CAAQ,CAAC,GAEzB,CAAC,GACJ,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,WAAW,CAAS;YAA9C,CACC,kBAAC,KAAD;GAAG,WAAU;aAAc;EAAS,CAAA,GACnC,KAAe,kBAAC,OAAD;GAAK,WAAU;aAAuB;EAAiB,CAAA,CACnE;;CAIP,IAAM,IAAY,OAAO,GAAG,EAAQ,OAAO,CAAK,GAC1C,IAAa,EAAQ,aAAa,IAClC,IAAoB,EAAQ,UAAU,KAAA,KAAa,EAAQ,kBAAkB,GAE7E,UAAqB;EACtB,KAAc,KAIlB,EAAQ,WAAW,CAAK;CACzB;CAyCA,OACC,kBAAC,UAAD;EACC,IAAI,GAAG,EAAQ,QAAQ,UAAU;EACjC,MAAK;EACL,MAAK;EACL,gBAAc;EACd,UAAU;EACV,UAAU,KAAa,IAAoB,IAAI;EAC/C,WAAW,EAAG,EAAO,WAAW,KAAa,EAAO,SAAS,CAAS;EACtE,WAAQ;EACR,eAAY;EACZ,SAAS;EACT,YAlDqB,MAA4C;GAKlE,IAJI,KAIA,EAAyB,GAAO,CAAY,GAC/C;GAGD,IAAM,IAAgB,EAAM,eACtB,IAAe,EAAc,QAAqB,uBAAqB,GACvE,IAAa,MAAM,KAAK,GAAc,iBAAoC,kCAAgC,KAAK,CAAC,CAAC;GAEvH,IAAI,CAAC,EAAW,QACf;GAGD,IAAM,IAAe,EAAW,QAAQ,CAAa;GACrD,IAAI,MAAiB,IACpB;GAGD,IAAM,IAAY,EAA0B;IAC3C;IACA,WAAW,EAAW;IACtB,KAAK,EAAM;IACX,aAAa,EAAQ;GACtB,CAAC;GAEG,MAAc,SAIlB,EAAM,eAAe,GACrB,EAAW,EAAU,EAAE,MAAM,GAC7B,EAAW,EAAU,EAAE,MAAM;EAC9B;YAGC,CAYC,kBAAC,QAAD;GAAM,WAAU;aAAc;EAAY,CAAA,GACzC,KAAe,kBAAC,QAAD;GAAM,WAAU;aAAc;EAAkB,CAAA,CACzD;;AAEV;AAEA,EAAW,SAAS"}
|
package/dist/date-input/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../chunks/CalendarView-KCkhCtK-.js";
|
|
2
|
-
import { a as c, c as l, d as u, f as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S } from "../chunks/date-input-
|
|
2
|
+
import { a as c, c as l, d as u, f as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S } from "../chunks/date-input-DBJisPRz.js";
|
|
3
3
|
export { s as CalendarView, r as DATE_INPUT_SELECTION_MODES, a as DATE_INPUT_WEEK_END_DAYS, n as DATE_PICKER_LEVELS, y as DEFAULT_DATE_INPUT_FORMAT, p as DEFAULT_DATE_INPUT_PRESET, x as RangeDateInput, g as SingleDateInput, c as areRangeDateValuesEqual, _ as areSingleDateValuesEqual, b as formatDateInputValue, l as formatRangeDateValue, m as formatSingleDateValue, e as getDatePickerLevelForSelectionMode, i as isDatePickerLevelAvailable, S as normalizeRangeDateValue, u as normalizeRangeEndDateValue, d as normalizeSingleDateValue, v as parseRangeDateValue, h as parseRangeEndDateValue, f as parseSingleDateValue, o as resolveAvailableDatePickerLevel, t as resolveDateInputPeriodRangeState };
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import { type PeriodSelectOption, type PeriodSelectPresetId } from "./lib";
|
|
1
|
+
import { type PeriodSelectLabels, type PeriodSelectOption, type PeriodSelectPresetId } from "./lib";
|
|
2
2
|
import type { UiBaseProps } from "../types";
|
|
3
3
|
import type { DateRangeInput } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
4
4
|
export interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption["id"] | undefined> {
|
|
5
|
+
/**
|
|
6
|
+
* Полный список custom options с высшим приоритетом. При его передаче
|
|
7
|
+
* встроенные `presetIds`, `labels` и пороги диапазона не применяются.
|
|
8
|
+
*/
|
|
5
9
|
options?: readonly PeriodSelectOption[];
|
|
10
|
+
/**
|
|
11
|
+
* Частично заменяет подписи встроенных вариантов, не изменяя их id,
|
|
12
|
+
* канонический порядок и правила доступности.
|
|
13
|
+
* Не применяется, когда передан собственный `options`.
|
|
14
|
+
*/
|
|
15
|
+
labels?: Partial<PeriodSelectLabels>;
|
|
6
16
|
/**
|
|
7
17
|
* Разрешенные встроенные варианты периода. Значение нормализуется в канонический
|
|
8
18
|
* порядок, а пустой либо невалидный список безопасно заменяется полным набором.
|
|
@@ -16,5 +26,5 @@ export interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption["id"]
|
|
|
16
26
|
/**
|
|
17
27
|
* Select периода детализации, который может ограничивать доступные варианты по диапазону дат.
|
|
18
28
|
*/
|
|
19
|
-
export declare function PeriodSelect({ value, onChange, options, presetIds, dateRange, maxDayRangeDays, maxWeekRangeWeeks, ...props }: PeriodSelectProps): import("react").JSX.Element;
|
|
29
|
+
export declare function PeriodSelect({ value, onChange, options, labels, presetIds, dateRange, maxDayRangeDays, maxWeekRangeWeeks, ...props }: PeriodSelectProps): import("react").JSX.Element;
|
|
20
30
|
//# sourceMappingURL=PeriodSelect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeriodSelect.d.ts","sourceRoot":"","sources":["../../src/period-select/PeriodSelect.tsx"],"names":[],"mappings":"AAIA,OAAO,EAMN,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,MAAM,WAAW,iBAAkB,SAAQ,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3F,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,GAAG,KAAK,EACR,EAAE,iBAAiB,+BAqDnB"}
|
|
1
|
+
{"version":3,"file":"PeriodSelect.d.ts","sourceRoot":"","sources":["../../src/period-select/PeriodSelect.tsx"],"names":[],"mappings":"AAIA,OAAO,EAMN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,MAAM,WAAW,iBAAkB,SAAQ,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3F;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,GAAG,KAAK,EACR,EAAE,iBAAiB,+BAqDnB"}
|
|
@@ -44,15 +44,21 @@ function C(e, t = _) {
|
|
|
44
44
|
function w(e) {
|
|
45
45
|
return b(e) ? e : "day";
|
|
46
46
|
}
|
|
47
|
-
function T({ maxDayRangeDays: e, maxWeekRangeWeeks: t } = {}) {
|
|
48
|
-
let
|
|
49
|
-
return _.map((e) =>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
function T({ maxDayRangeDays: e, maxWeekRangeWeeks: t, labels: n } = {}) {
|
|
48
|
+
let r = c(e), i = c(t);
|
|
49
|
+
return _.map((e) => {
|
|
50
|
+
let t = {
|
|
51
|
+
...e,
|
|
52
|
+
label: n?.[e.id] ?? e.label
|
|
53
|
+
};
|
|
54
|
+
return e.id === "day" && r !== void 0 ? {
|
|
55
|
+
...t,
|
|
56
|
+
maxRangeDays: r
|
|
57
|
+
} : e.id === "week" && i !== void 0 ? {
|
|
58
|
+
...t,
|
|
59
|
+
maxRangeDays: i * 7
|
|
60
|
+
} : t;
|
|
61
|
+
});
|
|
56
62
|
}
|
|
57
63
|
function E(e, t) {
|
|
58
64
|
let n = c(e.maxRangeDays);
|
|
@@ -75,38 +81,40 @@ function O(e) {
|
|
|
75
81
|
}
|
|
76
82
|
//#endregion
|
|
77
83
|
//#region src/period-select/PeriodSelect.tsx
|
|
78
|
-
function k({ value: o, onChange: s, options: c,
|
|
79
|
-
let
|
|
80
|
-
maxDayRangeDays:
|
|
81
|
-
maxWeekRangeWeeks:
|
|
84
|
+
function k({ value: o, onChange: s, options: c, labels: l, presetIds: u, dateRange: d, maxDayRangeDays: f, maxWeekRangeWeeks: p, ...m }) {
|
|
85
|
+
let h = r(() => c ?? S(x(u), T({
|
|
86
|
+
maxDayRangeDays: f,
|
|
87
|
+
maxWeekRangeWeeks: p,
|
|
88
|
+
labels: l
|
|
82
89
|
})), [
|
|
83
|
-
|
|
90
|
+
l,
|
|
84
91
|
f,
|
|
92
|
+
p,
|
|
85
93
|
c,
|
|
86
|
-
|
|
87
|
-
]),
|
|
88
|
-
|
|
89
|
-
|
|
94
|
+
u
|
|
95
|
+
]), g = r(() => D(o, h, d), [
|
|
96
|
+
d,
|
|
97
|
+
h,
|
|
90
98
|
o
|
|
91
|
-
]),
|
|
92
|
-
if (
|
|
93
|
-
|
|
99
|
+
]), _ = i(null), v = n(() => {
|
|
100
|
+
if (g === void 0 || g === o) {
|
|
101
|
+
_.current = null;
|
|
94
102
|
return;
|
|
95
103
|
}
|
|
96
|
-
let e =
|
|
97
|
-
e && e.value === o && e.availableValue ===
|
|
104
|
+
let e = _.current;
|
|
105
|
+
e && e.value === o && e.availableValue === g || (_.current = {
|
|
98
106
|
value: o,
|
|
99
|
-
availableValue:
|
|
100
|
-
}, s(
|
|
107
|
+
availableValue: g
|
|
108
|
+
}, s(g));
|
|
101
109
|
});
|
|
102
110
|
return t(() => {
|
|
103
|
-
|
|
104
|
-
}, [
|
|
105
|
-
...
|
|
106
|
-
options:
|
|
107
|
-
value:
|
|
111
|
+
v();
|
|
112
|
+
}, [g, o]), /* @__PURE__ */ a(e, {
|
|
113
|
+
...m,
|
|
114
|
+
options: h,
|
|
115
|
+
value: g,
|
|
108
116
|
onChange: s,
|
|
109
|
-
getOptionDisabled: (e) => E(e,
|
|
117
|
+
getOptionDisabled: (e) => E(e, d)
|
|
110
118
|
});
|
|
111
119
|
}
|
|
112
120
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/period-select/lib/constants.ts","../../src/period-select/lib/periodSelect.ts","../../src/period-select/PeriodSelect.tsx"],"sourcesContent":["export const PERIOD_SELECT_COMPONENT_ID = \"period-select\";\n","import {\n\tcountCalendarDaysInDateRange,\n\ttype DateRangeInput,\n\tnormalizeText,\n\ttoPositiveInteger\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getPresetOption, normalizePresetIds, type PresetOption, resolvePresetOptionsByIds } from \"@ryuzaki13/react-foundation-lib/presets\";\nimport { isRecord } from \"@ryuzaki13/react-foundation-lib/validators\";\n\n/**\n * Идентификаторы встроенных уровней детализации периода.\n */\nexport type PeriodSelectPresetId = \"day\" | \"week\" | \"month\" | \"year\";\nexport type PeriodSelectId = PeriodSelectPresetId | (string & {});\n\nexport interface PeriodSelectOption extends PresetOption<PeriodSelectId> {\n\tmaxRangeDays?: number;\n}\n\ntype BuiltInPeriodSelectOption = PeriodSelectOption & {\n\tid: PeriodSelectPresetId;\n};\n\nexport type PeriodSelectDateRangeConnectors = Readonly<{\n\tstart: string;\n\tend: string;\n}>;\n\nexport type PeriodSelectThresholds = {\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n};\n\nexport const DEFAULT_PERIOD_SELECT_PRESET_ID = \"day\" satisfies PeriodSelectPresetId;\nexport const DEFAULT_PERIOD_SELECT_MAX_DAY_RANGE_DAYS = 31;\nexport const DEFAULT_PERIOD_SELECT_MAX_WEEK_RANGE_WEEKS = 26;\n\n/**\n * Канонический каталог встроенных вариантов. Порядок элементов задает порядок\n * отображения и автоматического перехода к следующему доступному уровню.\n */\nexport const PERIOD_SELECT_OPTIONS: readonly BuiltInPeriodSelectOption[] = Object.freeze([\n\t{\n\t\tid: \"day\",\n\t\tlabel: \"по дням\"\n\t},\n\t{\n\t\tid: \"week\",\n\t\tlabel: \"по неделям\"\n\t},\n\t{\n\t\tid: \"month\",\n\t\tlabel: \"по месяцам\"\n\t},\n\t{\n\t\tid: \"year\",\n\t\tlabel: \"по годам\"\n\t}\n]);\n\n/**\n * Полный набор встроенных вариантов, доступный при отсутствии явного allow-list.\n */\nexport const DEFAULT_PERIOD_SELECT_PRESET_IDS = Object.freeze([\n\t\"day\",\n\t\"week\",\n\t\"month\",\n\t\"year\"\n] as const satisfies readonly PeriodSelectPresetId[]);\n\nconst PERIOD_SELECT_PRESET_ID_SET: ReadonlySet<string> = new Set(PERIOD_SELECT_OPTIONS.map((option) => option.id));\n\nexport function isPeriodSelectPresetId(value: unknown): value is PeriodSelectPresetId {\n\treturn typeof value === \"string\" && PERIOD_SELECT_PRESET_ID_SET.has(value);\n}\n\nexport function normalizePeriodSelectPresetIds(\n\tvalue: unknown,\n\tfallbackIds: readonly PeriodSelectPresetId[] = DEFAULT_PERIOD_SELECT_PRESET_IDS\n): PeriodSelectPresetId[] {\n\tconst normalizedIds = normalizePresetIds(value, isPeriodSelectPresetId, fallbackIds);\n\tconst resolvedIds = normalizedIds.length > 0 ? normalizedIds : DEFAULT_PERIOD_SELECT_PRESET_IDS;\n\tconst resolvedIdSet = new Set<PeriodSelectPresetId>(resolvedIds);\n\n\t// Порядок runtime-опций является частью контракта: конфигурация только ограничивает\n\t// каталог и не может переставить уровни либо оставить контрол без вариантов.\n\treturn DEFAULT_PERIOD_SELECT_PRESET_IDS.filter((presetId) => resolvedIdSet.has(presetId));\n}\n\nexport function resolvePeriodSelectOptionsByIds(\n\tpresetIds: readonly PeriodSelectOption[\"id\"][],\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption[] {\n\treturn resolvePresetOptionsByIds(presetIds, options);\n}\n\nexport function getPeriodSelectOption(\n\tid: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption | null {\n\treturn getPresetOption(id, options);\n}\n\nexport function resolvePeriodSelectDefaultValue(value: unknown): PeriodSelectPresetId {\n\treturn isPeriodSelectPresetId(value) ? value : DEFAULT_PERIOD_SELECT_PRESET_ID;\n}\n\nexport function createPeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks }: PeriodSelectThresholds = {}): PeriodSelectOption[] {\n\tconst dayLimit = toPositiveInteger(maxDayRangeDays);\n\tconst weekLimit = toPositiveInteger(maxWeekRangeWeeks);\n\n\treturn PERIOD_SELECT_OPTIONS.map((option) => {\n\t\tif (option.id === \"day\" && dayLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...option,\n\t\t\t\tmaxRangeDays: dayLimit\n\t\t\t};\n\t\t}\n\n\t\tif (option.id === \"week\" && weekLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...option,\n\t\t\t\tmaxRangeDays: weekLimit * 7\n\t\t\t};\n\t\t}\n\n\t\treturn { ...option };\n\t});\n}\n\nexport function isPeriodSelectOptionDisabled(option: PeriodSelectOption, dateRange: DateRangeInput | undefined): boolean {\n\tconst maxRangeDays = toPositiveInteger(option.maxRangeDays);\n\tif (maxRangeDays === undefined || dateRange === undefined) {\n\t\treturn false;\n\t}\n\n\tconst rangeDays = countCalendarDaysInDateRange(dateRange);\n\treturn rangeDays !== null && rangeDays > maxRangeDays;\n}\n\nexport function resolvePeriodSelectAvailableValue(\n\tvalue: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[],\n\tdateRange: DateRangeInput | undefined\n): PeriodSelectOption[\"id\"] | undefined {\n\tif (options.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst selectedIndex = value === undefined ? -1 : options.findIndex((option) => option.id === value);\n\tconst selectedOption = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n\tif (selectedOption && !isPeriodSelectOptionDisabled(selectedOption, dateRange)) {\n\t\treturn selectedOption.id;\n\t}\n\n\tconst nextOptions = selectedIndex >= 0 ? options.slice(selectedIndex + 1) : options;\n\tconst nextAvailableOption = nextOptions.find((option) => !isPeriodSelectOptionDisabled(option, dateRange));\n\n\treturn nextAvailableOption?.id ?? options.find((option) => !isPeriodSelectOptionDisabled(option, dateRange))?.id;\n}\n\nexport function normalizePeriodSelectDateRangeConnectors(value: unknown): PeriodSelectDateRangeConnectors | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\n\tconst startConnector = normalizeText(value.start);\n\tconst endConnector = normalizeText(value.end);\n\n\treturn startConnector && endConnector ? { start: startConnector, end: endConnector } : undefined;\n}\n","import { useEffect, useEffectEvent, useMemo, useRef } from \"react\";\n\nimport { PresetSelect } from \"../preset-select\";\n\nimport {\n\tcreatePeriodSelectOptions,\n\tisPeriodSelectOptionDisabled,\n\tnormalizePeriodSelectPresetIds,\n\tresolvePeriodSelectAvailableValue,\n\tresolvePeriodSelectOptionsByIds,\n\ttype PeriodSelectOption,\n\ttype PeriodSelectPresetId\n} from \"./lib\";\n\nimport type { UiBaseProps } from \"../types\";\nimport type { DateRangeInput } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nexport interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption[\"id\"] | undefined> {\n\toptions?: readonly PeriodSelectOption[];\n\t/**\n\t * Разрешенные встроенные варианты периода. Значение нормализуется в канонический\n\t * порядок, а пустой либо невалидный список безопасно заменяется полным набором.\n\t * Не применяется, когда передан собственный `options`.\n\t */\n\tpresetIds?: readonly PeriodSelectPresetId[];\n\tdateRange?: DateRangeInput;\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n}\n\n/**\n * Select периода детализации, который может ограничивать доступные варианты по диапазону дат.\n */\nexport function PeriodSelect({\n\tvalue,\n\tonChange,\n\toptions,\n\tpresetIds,\n\tdateRange,\n\tmaxDayRangeDays,\n\tmaxWeekRangeWeeks,\n\t...props\n}: PeriodSelectProps) {\n\tconst resolvedOptions = useMemo(\n\t\t() =>\n\t\t\toptions ??\n\t\t\tresolvePeriodSelectOptionsByIds(\n\t\t\t\tnormalizePeriodSelectPresetIds(presetIds),\n\t\t\t\tcreatePeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks })\n\t\t\t),\n\t\t[maxDayRangeDays, maxWeekRangeWeeks, options, presetIds]\n\t);\n\tconst availableValue = useMemo(\n\t\t() => resolvePeriodSelectAvailableValue(value, resolvedOptions, dateRange),\n\t\t[dateRange, resolvedOptions, value]\n\t);\n\tconst lastEmittedTransitionRef = useRef<{\n\t\tvalue: PeriodSelectOption[\"id\"] | undefined;\n\t\tavailableValue: PeriodSelectOption[\"id\"] | undefined;\n\t} | null>(null);\n\n\tconst emitAvailableValue = useEffectEvent(() => {\n\t\tif (availableValue === undefined || availableValue === value) {\n\t\t\t// После принятия controlled-значения либо временной блокировки всех опций\n\t\t\t// такой же переход должен снова стать допустимым при следующем изменении условий.\n\t\t\tlastEmittedTransitionRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastTransition = lastEmittedTransitionRef.current;\n\t\tif (lastTransition && lastTransition.value === value && lastTransition.availableValue === availableValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tlastEmittedTransitionRef.current = { value, availableValue };\n\n\t\t// Сигнатура перехода защищает reconciliation от повтора в React StrictMode.\n\t\t// При временной блокировке всех опций внешний controlled-id сохраняется,\n\t\t// поэтому выбор восстановится без потери runtime-параметра после смены диапазона.\n\t\tonChange(availableValue);\n\t});\n\n\tuseEffect(() => {\n\t\temitAvailableValue();\n\t}, [availableValue, value]);\n\n\treturn (\n\t\t<PresetSelect\n\t\t\t{...props}\n\t\t\toptions={resolvedOptions}\n\t\t\tvalue={availableValue}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionDisabled={(option) => isPeriodSelectOptionDisabled(option, dateRange)}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/period-select/lib/constants.ts","../../src/period-select/lib/periodSelect.ts","../../src/period-select/PeriodSelect.tsx"],"sourcesContent":["export const PERIOD_SELECT_COMPONENT_ID = \"period-select\";\n","import {\n\tcountCalendarDaysInDateRange,\n\ttype DateRangeInput,\n\tnormalizeText,\n\ttoPositiveInteger\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getPresetOption, normalizePresetIds, type PresetOption, resolvePresetOptionsByIds } from \"@ryuzaki13/react-foundation-lib/presets\";\nimport { isRecord } from \"@ryuzaki13/react-foundation-lib/validators\";\n\n/**\n * Идентификаторы встроенных уровней детализации периода.\n */\nexport type PeriodSelectPresetId = \"day\" | \"week\" | \"month\" | \"year\";\nexport type PeriodSelectId = PeriodSelectPresetId | (string & {});\n\n/**\n * Полный типизированный набор подписей встроенных уровней детализации.\n * Потребитель может передать его частично, сохранив канонические подписи\n * для всех отсутствующих ключей.\n */\nexport type PeriodSelectLabels = Readonly<Record<PeriodSelectPresetId, string>>;\n\nexport interface PeriodSelectOption extends PresetOption<PeriodSelectId> {\n\tmaxRangeDays?: number;\n}\n\ntype BuiltInPeriodSelectOption = PeriodSelectOption & {\n\tid: PeriodSelectPresetId;\n};\n\nexport type PeriodSelectDateRangeConnectors = Readonly<{\n\tstart: string;\n\tend: string;\n}>;\n\nexport type PeriodSelectThresholds = {\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n};\n\n/**\n * Настройки формирования встроенных options. `labels` изменяет только\n * отображаемый текст и не влияет на id, порядок или ограничения диапазона.\n */\nexport type PeriodSelectOptionsConfig = PeriodSelectThresholds & {\n\tlabels?: Partial<PeriodSelectLabels>;\n};\n\nexport const DEFAULT_PERIOD_SELECT_PRESET_ID = \"day\" satisfies PeriodSelectPresetId;\nexport const DEFAULT_PERIOD_SELECT_MAX_DAY_RANGE_DAYS = 31;\nexport const DEFAULT_PERIOD_SELECT_MAX_WEEK_RANGE_WEEKS = 26;\n\n/**\n * Канонический каталог встроенных вариантов. Порядок элементов задает порядок\n * отображения и автоматического перехода к следующему доступному уровню.\n */\nexport const PERIOD_SELECT_OPTIONS: readonly BuiltInPeriodSelectOption[] = Object.freeze([\n\t{\n\t\tid: \"day\",\n\t\tlabel: \"по дням\"\n\t},\n\t{\n\t\tid: \"week\",\n\t\tlabel: \"по неделям\"\n\t},\n\t{\n\t\tid: \"month\",\n\t\tlabel: \"по месяцам\"\n\t},\n\t{\n\t\tid: \"year\",\n\t\tlabel: \"по годам\"\n\t}\n]);\n\n/**\n * Полный набор встроенных вариантов, доступный при отсутствии явного allow-list.\n */\nexport const DEFAULT_PERIOD_SELECT_PRESET_IDS = Object.freeze([\n\t\"day\",\n\t\"week\",\n\t\"month\",\n\t\"year\"\n] as const satisfies readonly PeriodSelectPresetId[]);\n\nconst PERIOD_SELECT_PRESET_ID_SET: ReadonlySet<string> = new Set(PERIOD_SELECT_OPTIONS.map((option) => option.id));\n\nexport function isPeriodSelectPresetId(value: unknown): value is PeriodSelectPresetId {\n\treturn typeof value === \"string\" && PERIOD_SELECT_PRESET_ID_SET.has(value);\n}\n\nexport function normalizePeriodSelectPresetIds(\n\tvalue: unknown,\n\tfallbackIds: readonly PeriodSelectPresetId[] = DEFAULT_PERIOD_SELECT_PRESET_IDS\n): PeriodSelectPresetId[] {\n\tconst normalizedIds = normalizePresetIds(value, isPeriodSelectPresetId, fallbackIds);\n\tconst resolvedIds = normalizedIds.length > 0 ? normalizedIds : DEFAULT_PERIOD_SELECT_PRESET_IDS;\n\tconst resolvedIdSet = new Set<PeriodSelectPresetId>(resolvedIds);\n\n\t// Порядок runtime-опций является частью контракта: конфигурация только ограничивает\n\t// каталог и не может переставить уровни либо оставить контрол без вариантов.\n\treturn DEFAULT_PERIOD_SELECT_PRESET_IDS.filter((presetId) => resolvedIdSet.has(presetId));\n}\n\nexport function resolvePeriodSelectOptionsByIds(\n\tpresetIds: readonly PeriodSelectOption[\"id\"][],\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption[] {\n\treturn resolvePresetOptionsByIds(presetIds, options);\n}\n\nexport function getPeriodSelectOption(\n\tid: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption | null {\n\treturn getPresetOption(id, options);\n}\n\nexport function resolvePeriodSelectDefaultValue(value: unknown): PeriodSelectPresetId {\n\treturn isPeriodSelectPresetId(value) ? value : DEFAULT_PERIOD_SELECT_PRESET_ID;\n}\n\n/**\n * Создает независимый список встроенных options с порогами доступности и\n * частичными подписями потребителя поверх канонического каталога.\n */\nexport function createPeriodSelectOptions({\n\tmaxDayRangeDays,\n\tmaxWeekRangeWeeks,\n\tlabels\n}: PeriodSelectOptionsConfig = {}): PeriodSelectOption[] {\n\tconst dayLimit = toPositiveInteger(maxDayRangeDays);\n\tconst weekLimit = toPositiveInteger(maxWeekRangeWeeks);\n\n\treturn PERIOD_SELECT_OPTIONS.map((option) => {\n\t\tconst resolvedOption = {\n\t\t\t...option,\n\t\t\tlabel: labels?.[option.id] ?? option.label\n\t\t};\n\n\t\tif (option.id === \"day\" && dayLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...resolvedOption,\n\t\t\t\tmaxRangeDays: dayLimit\n\t\t\t};\n\t\t}\n\n\t\tif (option.id === \"week\" && weekLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...resolvedOption,\n\t\t\t\tmaxRangeDays: weekLimit * 7\n\t\t\t};\n\t\t}\n\n\t\treturn resolvedOption;\n\t});\n}\n\nexport function isPeriodSelectOptionDisabled(option: PeriodSelectOption, dateRange: DateRangeInput | undefined): boolean {\n\tconst maxRangeDays = toPositiveInteger(option.maxRangeDays);\n\tif (maxRangeDays === undefined || dateRange === undefined) {\n\t\treturn false;\n\t}\n\n\tconst rangeDays = countCalendarDaysInDateRange(dateRange);\n\treturn rangeDays !== null && rangeDays > maxRangeDays;\n}\n\nexport function resolvePeriodSelectAvailableValue(\n\tvalue: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[],\n\tdateRange: DateRangeInput | undefined\n): PeriodSelectOption[\"id\"] | undefined {\n\tif (options.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst selectedIndex = value === undefined ? -1 : options.findIndex((option) => option.id === value);\n\tconst selectedOption = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n\tif (selectedOption && !isPeriodSelectOptionDisabled(selectedOption, dateRange)) {\n\t\treturn selectedOption.id;\n\t}\n\n\tconst nextOptions = selectedIndex >= 0 ? options.slice(selectedIndex + 1) : options;\n\tconst nextAvailableOption = nextOptions.find((option) => !isPeriodSelectOptionDisabled(option, dateRange));\n\n\treturn nextAvailableOption?.id ?? options.find((option) => !isPeriodSelectOptionDisabled(option, dateRange))?.id;\n}\n\nexport function normalizePeriodSelectDateRangeConnectors(value: unknown): PeriodSelectDateRangeConnectors | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\n\tconst startConnector = normalizeText(value.start);\n\tconst endConnector = normalizeText(value.end);\n\n\treturn startConnector && endConnector ? { start: startConnector, end: endConnector } : undefined;\n}\n","import { useEffect, useEffectEvent, useMemo, useRef } from \"react\";\n\nimport { PresetSelect } from \"../preset-select\";\n\nimport {\n\tcreatePeriodSelectOptions,\n\tisPeriodSelectOptionDisabled,\n\tnormalizePeriodSelectPresetIds,\n\tresolvePeriodSelectAvailableValue,\n\tresolvePeriodSelectOptionsByIds,\n\ttype PeriodSelectLabels,\n\ttype PeriodSelectOption,\n\ttype PeriodSelectPresetId\n} from \"./lib\";\n\nimport type { UiBaseProps } from \"../types\";\nimport type { DateRangeInput } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nexport interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption[\"id\"] | undefined> {\n\t/**\n\t * Полный список custom options с высшим приоритетом. При его передаче\n\t * встроенные `presetIds`, `labels` и пороги диапазона не применяются.\n\t */\n\toptions?: readonly PeriodSelectOption[];\n\t/**\n\t * Частично заменяет подписи встроенных вариантов, не изменяя их id,\n\t * канонический порядок и правила доступности.\n\t * Не применяется, когда передан собственный `options`.\n\t */\n\tlabels?: Partial<PeriodSelectLabels>;\n\t/**\n\t * Разрешенные встроенные варианты периода. Значение нормализуется в канонический\n\t * порядок, а пустой либо невалидный список безопасно заменяется полным набором.\n\t * Не применяется, когда передан собственный `options`.\n\t */\n\tpresetIds?: readonly PeriodSelectPresetId[];\n\tdateRange?: DateRangeInput;\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n}\n\n/**\n * Select периода детализации, который может ограничивать доступные варианты по диапазону дат.\n */\nexport function PeriodSelect({\n\tvalue,\n\tonChange,\n\toptions,\n\tlabels,\n\tpresetIds,\n\tdateRange,\n\tmaxDayRangeDays,\n\tmaxWeekRangeWeeks,\n\t...props\n}: PeriodSelectProps) {\n\tconst resolvedOptions = useMemo(\n\t\t() =>\n\t\t\toptions ??\n\t\t\tresolvePeriodSelectOptionsByIds(\n\t\t\t\tnormalizePeriodSelectPresetIds(presetIds),\n\t\t\t\tcreatePeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks, labels })\n\t\t\t),\n\t\t[labels, maxDayRangeDays, maxWeekRangeWeeks, options, presetIds]\n\t);\n\tconst availableValue = useMemo(\n\t\t() => resolvePeriodSelectAvailableValue(value, resolvedOptions, dateRange),\n\t\t[dateRange, resolvedOptions, value]\n\t);\n\tconst lastEmittedTransitionRef = useRef<{\n\t\tvalue: PeriodSelectOption[\"id\"] | undefined;\n\t\tavailableValue: PeriodSelectOption[\"id\"] | undefined;\n\t} | null>(null);\n\n\tconst emitAvailableValue = useEffectEvent(() => {\n\t\tif (availableValue === undefined || availableValue === value) {\n\t\t\t// После принятия controlled-значения либо временной блокировки всех опций\n\t\t\t// такой же переход должен снова стать допустимым при следующем изменении условий.\n\t\t\tlastEmittedTransitionRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastTransition = lastEmittedTransitionRef.current;\n\t\tif (lastTransition && lastTransition.value === value && lastTransition.availableValue === availableValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tlastEmittedTransitionRef.current = { value, availableValue };\n\n\t\t// Сигнатура перехода защищает reconciliation от повтора в React StrictMode.\n\t\t// При временной блокировке всех опций внешний controlled-id сохраняется,\n\t\t// поэтому выбор восстановится без потери runtime-параметра после смены диапазона.\n\t\tonChange(availableValue);\n\t});\n\n\tuseEffect(() => {\n\t\temitAvailableValue();\n\t}, [availableValue, value]);\n\n\treturn (\n\t\t<PresetSelect\n\t\t\t{...props}\n\t\t\toptions={resolvedOptions}\n\t\t\tvalue={availableValue}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionDisabled={(option) => isPeriodSelectOptionDisabled(option, dateRange)}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@ import { type PresetOption } from "@ryuzaki13/react-foundation-lib/presets";
|
|
|
5
5
|
*/
|
|
6
6
|
export type PeriodSelectPresetId = "day" | "week" | "month" | "year";
|
|
7
7
|
export type PeriodSelectId = PeriodSelectPresetId | (string & {});
|
|
8
|
+
/**
|
|
9
|
+
* Полный типизированный набор подписей встроенных уровней детализации.
|
|
10
|
+
* Потребитель может передать его частично, сохранив канонические подписи
|
|
11
|
+
* для всех отсутствующих ключей.
|
|
12
|
+
*/
|
|
13
|
+
export type PeriodSelectLabels = Readonly<Record<PeriodSelectPresetId, string>>;
|
|
8
14
|
export interface PeriodSelectOption extends PresetOption<PeriodSelectId> {
|
|
9
15
|
maxRangeDays?: number;
|
|
10
16
|
}
|
|
@@ -19,6 +25,13 @@ export type PeriodSelectThresholds = {
|
|
|
19
25
|
maxDayRangeDays?: number;
|
|
20
26
|
maxWeekRangeWeeks?: number;
|
|
21
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Настройки формирования встроенных options. `labels` изменяет только
|
|
30
|
+
* отображаемый текст и не влияет на id, порядок или ограничения диапазона.
|
|
31
|
+
*/
|
|
32
|
+
export type PeriodSelectOptionsConfig = PeriodSelectThresholds & {
|
|
33
|
+
labels?: Partial<PeriodSelectLabels>;
|
|
34
|
+
};
|
|
22
35
|
export declare const DEFAULT_PERIOD_SELECT_PRESET_ID = "day";
|
|
23
36
|
export declare const DEFAULT_PERIOD_SELECT_MAX_DAY_RANGE_DAYS = 31;
|
|
24
37
|
export declare const DEFAULT_PERIOD_SELECT_MAX_WEEK_RANGE_WEEKS = 26;
|
|
@@ -36,7 +49,11 @@ export declare function normalizePeriodSelectPresetIds(value: unknown, fallbackI
|
|
|
36
49
|
export declare function resolvePeriodSelectOptionsByIds(presetIds: readonly PeriodSelectOption["id"][], options?: readonly PeriodSelectOption[]): PeriodSelectOption[];
|
|
37
50
|
export declare function getPeriodSelectOption(id: PeriodSelectOption["id"] | undefined, options?: readonly PeriodSelectOption[]): PeriodSelectOption | null;
|
|
38
51
|
export declare function resolvePeriodSelectDefaultValue(value: unknown): PeriodSelectPresetId;
|
|
39
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Создает независимый список встроенных options с порогами доступности и
|
|
54
|
+
* частичными подписями потребителя поверх канонического каталога.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createPeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks, labels }?: PeriodSelectOptionsConfig): PeriodSelectOption[];
|
|
40
57
|
export declare function isPeriodSelectOptionDisabled(option: PeriodSelectOption, dateRange: DateRangeInput | undefined): boolean;
|
|
41
58
|
export declare function resolvePeriodSelectAvailableValue(value: PeriodSelectOption["id"] | undefined, options: readonly PeriodSelectOption[], dateRange: DateRangeInput | undefined): PeriodSelectOption["id"] | undefined;
|
|
42
59
|
export declare function normalizePeriodSelectDateRangeConnectors(value: unknown): PeriodSelectDateRangeConnectors | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"periodSelect.d.ts","sourceRoot":"","sources":["../../../src/period-select/lib/periodSelect.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,cAAc,EAGnB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAuC,KAAK,YAAY,EAA6B,MAAM,yCAAyC,CAAC;AAG5I;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElE,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,cAAc,CAAC;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,yBAAyB,GAAG,kBAAkB,GAAG;IACrD,EAAE,EAAE,oBAAoB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,+BAA+B,QAAuC,CAAC;AACpF,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,eAAO,MAAM,0CAA0C,KAAK,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,yBAAyB,EAiBpE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gCAAgC,2CAKQ,CAAC;AAItD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF;AAED,wBAAgB,8BAA8B,CAC7C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,SAAS,oBAAoB,EAAqC,GAC7E,oBAAoB,EAAE,CAQxB;AAED,wBAAgB,+BAA+B,CAC9C,SAAS,EAAE,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC9C,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,EAAE,CAEtB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,EACxC,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,GAAG,IAAI,CAE3B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAEpF;AAED,wBAAgB,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"periodSelect.d.ts","sourceRoot":"","sources":["../../../src/period-select/lib/periodSelect.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,cAAc,EAGnB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAuC,KAAK,YAAY,EAA6B,MAAM,yCAAyC,CAAC;AAG5I;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElE;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhF,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,cAAc,CAAC;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,yBAAyB,GAAG,kBAAkB,GAAG;IACrD,EAAE,EAAE,oBAAoB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,GAAG;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,+BAA+B,QAAuC,CAAC;AACpF,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,eAAO,MAAM,0CAA0C,KAAK,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,yBAAyB,EAiBpE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gCAAgC,2CAKQ,CAAC;AAItD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF;AAED,wBAAgB,8BAA8B,CAC7C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,SAAS,oBAAoB,EAAqC,GAC7E,oBAAoB,EAAE,CAQxB;AAED,wBAAgB,+BAA+B,CAC9C,SAAS,EAAE,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC9C,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,EAAE,CAEtB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,EACxC,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,GAAG,IAAI,CAE3B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAEpF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EACzC,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,GAAE,yBAA8B,GAAG,kBAAkB,EAAE,CA0BvD;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAQvH;AAED,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,SAAS,kBAAkB,EAAE,EACtC,SAAS,EAAE,cAAc,GAAG,SAAS,GACnC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAgBtC;AAED,wBAAgB,wCAAwC,CAAC,KAAK,EAAE,OAAO,GAAG,+BAA+B,GAAG,SAAS,CASpH"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { o as e } from "../chunks/flex-DYZ0IbU6.js";
|
|
2
|
-
import { t } from "../chunks/date-input-
|
|
2
|
+
import { t } from "../chunks/date-input-DBJisPRz.js";
|
|
3
3
|
import { c as n, l as r, r as i, s as a, t as o, u as s } from "../chunks/date-range-preset-select-BLnY47cv.js";
|
|
4
4
|
import { useCallback as c, useMemo as l, useRef as u, useState as d } from "react";
|
|
5
5
|
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "../chunks/radio-group-
|
|
1
|
+
import { n as e, t } from "../chunks/radio-group-CM9Lg_nc.js";
|
|
2
2
|
export { t as Option, e as RadioGroup };
|