@ryuzaki13/react-foundation-ui 1.8.12 → 1.8.13
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/package.json +2 -2
- package/storybook-static/assets/{Badge-CveIo2LZ.js → Badge-BFhBl7yM.js} +1 -1
- package/storybook-static/assets/{Badge.stories-Bd8M64xJ.js → Badge.stories-BEu55X4s.js} +1 -1
- package/storybook-static/assets/{BadgeList-xT41a0VL.js → BadgeList-mqmnGtRR.js} +1 -1
- package/storybook-static/assets/{Button-C5bBSb3k.js → Button-CESdnWrO.js} +1 -1
- package/storybook-static/assets/{Button-DkDgfpHL.js → Button-_YPAu9sd.js} +1 -1
- package/storybook-static/assets/{Button.stories-CeKPeGK5.js → Button.stories-B0Y_T17B.js} +1 -1
- package/storybook-static/assets/{CalendarView-CEqcrblx.js → CalendarView-DLuO2Ywz.js} +1 -1
- package/storybook-static/assets/{CheckBox-DKeFkdOt.js → CheckBox-CGiNmAPT.js} +1 -1
- package/storybook-static/assets/{CheckBox-OVvAarW-.js → CheckBox-l0pbBm9z.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CfZ0p1yo.js → CheckBox.stories-ROPAnqh8.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-BWW7zrfs.js → Color-6AOWCN3U-kPaRN0HS.js} +1 -1
- package/storybook-static/assets/{ContextMenu-xn2GtiLR.js → ContextMenu-Bob4DtRn.js} +1 -1
- package/storybook-static/assets/{ContextMenu-kia7is1N.js → ContextMenu-DxfUAeJS.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-CYuy9uXF.js → ContextMenu.stories-DCJmWy5n.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-C4w-APws.js → CustomOptionButton-DuEz9CXt.js} +1 -1
- package/storybook-static/assets/{DateInput-BiUFIihm.js → DateInput-BQ8SoeLE.js} +1 -1
- package/storybook-static/assets/{DateInput-DAzE5mCE.js → DateInput-DmNLD4Dz.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-BcowGCRD.js → DateInput.stories-sTpYf7Ob.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CQm4dNLR.js → DateRangePresetSelect-DRq4eJ2n.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-RIyqNBk9.js → DateRangePresetSelect-fgJfLaLO.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-ypGyuGfy.js → DateRangePresetSelect.stories-ib7Qh_BB.js} +1 -1
- package/storybook-static/assets/{Detail-CEypL2Nh.js → Detail-CJniLn1R.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DNkT7B-u.js → Detail.stories-BXjdNaL-.js} +1 -1
- package/storybook-static/assets/{Dialog-BVFFQJDH.js → Dialog-D6a_qzr3.js} +1 -1
- package/storybook-static/assets/{Dialog-DD0grLG3.js → Dialog-DOYnnXlU.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-DSCypHqR.js → Dialog.stories-B1cZLRK3.js} +1 -1
- package/storybook-static/assets/{Disclosure-DauUgrev.js → Disclosure-Chh5o_0s.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-B1qB8vQZ.js → Disclosure.stories-Cvdvf7V8.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-D9oCCeHf.js → DisclosureGroup-CRnQOgVj.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CmSf6tXp.js → DocsRenderer-JROSPFPF-BBiErkeC.js} +1 -1
- package/storybook-static/assets/{DropZone-D8hbPCAv.js → DropZone-Bm5gqdi9.js} +1 -1
- package/storybook-static/assets/{DropZone-D42ueN1w.js → DropZone-C4L7JAlq.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-DO-T_Bh4.js → DropZone.stories-BhA9q8Qv.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-CknJDoji.js → DropdownMenu-DtZNSUHF.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Dqi_bo3c.js → ExpandableActionPanel-0ugXlJy_.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-BD9QZGZN.js → ExpandableActionPanel.stories-CLgMlA9k.js} +1 -1
- package/storybook-static/assets/{Flex-CaVn1IOP.js → Flex-CJlia-8f.js} +1 -1
- package/storybook-static/assets/{Flex.stories-Bp9Y6q6b.js → Flex.stories-DCvfi1EY.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-U7tx-Jlw.js → FloatingPopover-CsnfPiwV.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-pmmhsAbN.js → FormattedTableCell-Dz5xWVYO.js} +1 -1
- package/storybook-static/assets/{Grid-CEpMNurH.js → Grid-C-KwTRAM.js} +1 -1
- package/storybook-static/assets/{Grid.stories-BM-gO5DN.js → Grid.stories-CzbqknNR.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BWz5XU6U.js → ImageCropper.stories-DaE-gm-b.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BTYZEX5t.js → ImageRenderer-IsNCXCrZ.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-Dz2STM95.js → ImageRenderer.stories-BbsjUEfJ.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DBVe0an3.js → ImageView.stories-DY0UITYz.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-C4Px97lD.js → ImageViewer.stories--9q9b9nv.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-TJtlJVfa.js → ImageViewerRuntime-CNEH3XGN.js} +1 -1
- package/storybook-static/assets/{Input-CIPgijvW.js → Input-DLubbE7P.js} +1 -1
- package/storybook-static/assets/{Input-D8io9jVS.js → Input-Dw2JblYt.js} +1 -1
- package/storybook-static/assets/{Input.stories-SUk3aYaC.js → Input.stories-DQeyDULG.js} +1 -1
- package/storybook-static/assets/{InputDateTime-DA5pIDuE.js → InputDateTime-BRzl8Vrt.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-DeudzDSU.js → InputDateTime.stories-BJTj5v8J.js} +1 -1
- package/storybook-static/assets/{InputFile-CGAC7ruP.js → InputFile-B8UroZji.js} +1 -1
- package/storybook-static/assets/{InputFile-C5mp5Y5I.js → InputFile-DPftxjGw.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-Cx1xQ6PE.js → InputFile.stories-C7yyqHqc.js} +1 -1
- package/storybook-static/assets/{InputFiles-B7OBcPJN.js → InputFiles-BQVXHVLy.js} +1 -1
- package/storybook-static/assets/{InputFiles-Hzl89Ghf.js → InputFiles-UD_9S7-N.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CG6QjDZH.js → InputFiles.stories-DjjJS5pZ.js} +1 -1
- package/storybook-static/assets/{InputFilesList-B6htWHF1.js → InputFilesList-BNjijD3Y.js} +1 -1
- package/storybook-static/assets/{InputImage-BTa4S4Wp.js → InputImage-C-pHr-Sx.js} +1 -1
- package/storybook-static/assets/{InputImage-CQnoblAE.js → InputImage-DbcbqIhY.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-CEI44Eyz.js → InputImage.stories-D-TC9r9t.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-B0ypWz1x.js → InteractiveComponents-DbhWgM9y.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-BadApta9.js → InteractiveComponents.stories-B4mkVSea.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-C_Uz7Tnj.js → LayoutPicker-BoV_E3qt.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-COB9GlV_.js → LayoutPicker-w1EsRpYP.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-Btp0IcaL.js → LayoutPicker.stories--ChGnGxf.js} +1 -1
- package/storybook-static/assets/{Listbox-AAaZGSAl.js → Listbox-CzZRsr6a.js} +1 -1
- package/storybook-static/assets/{Listbox-CyfuZw7w.js → Listbox-qZdTi11b.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-NDKQmjyQ.js → Listbox.stories-C9k_1850.js} +1 -1
- package/storybook-static/assets/{Modal-BJDnJ4zv.js → Modal-DCpul8QM.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D_X5lTLO.js → Modal.stories-Cy0Xd4LF.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-ShDjozpW.js → ModalManagerProvider-BrPVMcHV.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DqXfrjcH.js → MultiSelect-BEQdl-F4.js} +1 -1
- package/storybook-static/assets/{MultiSelect-B5CElQ3-.js → MultiSelect-Dy4X94E2.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-fB3mcFmx.js → MultiSelect.stories-FuzejJmz.js} +1 -1
- package/storybook-static/assets/{NoData-DDb0G7T8.js → NoData-BsQ9EfkA.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-CIGL-pKX.js → NotificationsHost-BSrODvw7.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-B_MRb3fs.js → NotificationsHost.stories-DeiWspcY.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-DQAitH4N.js → ODataMultiSelect-BEz9gcd2.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-DwW221S9.js → ODataMultiSelect.stories-BwMgAkbE.js} +1 -1
- package/storybook-static/assets/{ODataSelect-tiZhOIhE.js → ODataSelect-BgC7GHOv.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-BhaatPjK.js → ODataSelect.stories-DEIRAB-s.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-B9WqJ-Un.js → ODataTreeMultiSelect-WyZZuX0_.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CAfKuhfU.js → ODataTreeMultiSelect.stories-B6cxuagy.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Cel1phxZ.js → ODataTreeSelect-OJGi3-S7.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-BpBCpBA9.js → ODataTreeSelect.stories-wGRGErCH.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-BSeGbz02.js → OneStepScroller-DycQ3RuL.js} +1 -1
- package/storybook-static/assets/{Option-BBtQ3GdK.js → Option-taxbFfjo.js} +1 -1
- package/storybook-static/assets/{OptionButton-B9nZuqqW.js → OptionButton-Q0QaPCII.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DA_zjcdA.js → PeriodSelect-DUJ2nF3F.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-BGvhR3to.js → PeriodSelect-DnM7x-uC.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-DDP1eXyM.js → PeriodSelect.stories-Db0bqe3J.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-BgvzqRBd.js → PickerTriggerActions-CGJd7xmR.js} +1 -1
- package/storybook-static/assets/{Popover-C0NebUMz.js → Popover-B6oidz5p.js} +1 -1
- package/storybook-static/assets/{Popover-BQql18MF.js → Popover-Tbhf8T81.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CIyDUtlz.js → Popover.stories-DE1LxZvv.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-BsgzPwCV.js → PresetRangeDateInput-CQ5FfmrL.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-htbxc3ni.js → PresetRangeDateInput-DfgoR0My.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-ClHM5Kah.js → PresetRangeDateInput.stories-CgoYAYBG.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Dcx0BOTx.js → PresetSelect-BPtAknAr.js} +1 -1
- package/storybook-static/assets/{README-BSh5XUR9.js → README--TpGcM95.js} +1 -1
- package/storybook-static/assets/{README-ByALXSEH.js → README-4iBHWAP5.js} +1 -1
- package/storybook-static/assets/{README-CHbo4O3Z.js → README-98KIgy5G.js} +1 -1
- package/storybook-static/assets/{README-eHCINzP3.js → README-B6II8p0W.js} +1 -1
- package/storybook-static/assets/{README-DDBqoI-T.js → README-B6vU5_7I.js} +1 -1
- package/storybook-static/assets/README-BFJVjjZR.js +325 -0
- package/storybook-static/assets/README-BIT4HlFP.js +441 -0
- package/storybook-static/assets/{README-DvAlDsh9.js → README-BK6Epio1.js} +1 -1
- package/storybook-static/assets/{README-5M8ajrJp.js → README-BRlPB5_k.js} +1 -1
- package/storybook-static/assets/{README-CH_6ZIO2.js → README-BTFpEaXG.js} +1 -1
- package/storybook-static/assets/{README-DnA-4W65.js → README-BWhXgC_o.js} +1 -1
- package/storybook-static/assets/{README-Byo6DxIF.js → README-BbNHvOoR.js} +1 -1
- package/storybook-static/assets/{README-Bqnqu1bC.js → README-BbunUo8b.js} +1 -1
- package/storybook-static/assets/{README-CsoHGRve.js → README-BmYpfZKr.js} +1 -1
- package/storybook-static/assets/{README-C8E1O7DQ.js → README-Bu5uvhAT.js} +1 -1
- package/storybook-static/assets/{README-DE2wk9-v.js → README-Bx6fvSBE.js} +1 -1
- package/storybook-static/assets/{README-Am6Fa6-b.js → README-Bx6gIGiA.js} +1 -1
- package/storybook-static/assets/README-ByhxsX44.js +324 -0
- package/storybook-static/assets/{README-qHKxXU95.js → README-Byi1FFpw.js} +1 -1
- package/storybook-static/assets/{README-D9OypaFB.js → README-C3Is3a3B.js} +1 -1
- package/storybook-static/assets/{README-CNHemCS2.js → README-C6prwAXw.js} +1 -1
- package/storybook-static/assets/{README-BmhhWWEk.js → README-C9S83J_G.js} +1 -1
- package/storybook-static/assets/{README-CM-7E-Jf.js → README-CGgxP5Zo.js} +1 -1
- package/storybook-static/assets/{README-BIq-FXcN.js → README-CJ2ZVG2U.js} +1 -1
- package/storybook-static/assets/{README-B45Cwj2a.js → README-CNGCAm5d.js} +1 -1
- package/storybook-static/assets/{README-CAGQnLsv.js → README-Cb_q420B.js} +1 -1
- package/storybook-static/assets/{README-BxjYCoYA.js → README-CtIDPNJ3.js} +1 -1
- package/storybook-static/assets/{README-C9eh0JLs.js → README-CzO3Dchr.js} +1 -1
- package/storybook-static/assets/{README-DEj2wSK0.js → README-D0rzQthv.js} +1 -1
- package/storybook-static/assets/{README-Dl92E69Z.js → README-DEQu7djz.js} +1 -1
- package/storybook-static/assets/{README-BYSgTTZt.js → README-DFihT_sm.js} +1 -1
- package/storybook-static/assets/{README-CIGfHKKE.js → README-DMiWsyv_.js} +1 -1
- package/storybook-static/assets/{README-B3bFglqG.js → README-DOx8lXXk.js} +1 -1
- package/storybook-static/assets/{README-CWfPiPIB.js → README-DPhDjr43.js} +1 -1
- package/storybook-static/assets/{README-DJHVgrpj.js → README-D_NqWPa9.js} +1 -1
- package/storybook-static/assets/README-DhJ5Rb1w.js +355 -0
- package/storybook-static/assets/{README-DV4fCpqN.js → README-DlwhWCvQ.js} +1 -1
- package/storybook-static/assets/README-Dxi73a2Q.js +740 -0
- package/storybook-static/assets/README-Dycov6NP.js +583 -0
- package/storybook-static/assets/README-GTBkSG4_.js +3591 -0
- package/storybook-static/assets/{README-ui-uanyg.js → README-Gfd9tLTw.js} +1 -1
- package/storybook-static/assets/{README-B6ltJiw3.js → README-Kfawetke.js} +1 -1
- package/storybook-static/assets/{README-DjCArsA5.js → README-UDBM7ZMT.js} +1 -1
- package/storybook-static/assets/{README-DIbfpC-2.js → README-VTWQxLm_.js} +1 -1
- package/storybook-static/assets/README-YHNWrTZv.js +400 -0
- package/storybook-static/assets/README-_0Otw0eD.js +448 -0
- package/storybook-static/assets/{README-Ss-3t1nX.js → README-aw2Xu9xu.js} +1 -1
- package/storybook-static/assets/{README-BuMMG4_N.js → README-eg1emlll.js} +1 -1
- package/storybook-static/assets/{README-B6Nq7NCU.js → README-iqQHdhZ4.js} +1 -1
- package/storybook-static/assets/{README-BB_JPejH.js → README-llxZAtCj.js} +1 -1
- package/storybook-static/assets/{README-5NhzH8VL.js → README-wFnEIGl4.js} +1 -1
- package/storybook-static/assets/{README-CeK4kfFO.js → README-webB1yH0.js} +1 -1
- package/storybook-static/assets/{README-C3UcjOGB.js → README-wtreGRCe.js} +1 -1
- package/storybook-static/assets/{RadioButton-YIQXt0wx.js → RadioButton-CNOLDk_o.js} +1 -1
- package/storybook-static/assets/{RadioButton-CWtjclwT.js → RadioButton-Ce05_q7s.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-Ah-CBpeC.js → RadioButton.stories-CPd4lTl0.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BnO-GL7A.js → RadioGroup-BtfD5Szd.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CUS0etBD.js → RadioGroup-Ccm7G-dv.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-DGwCawtU.js → RadioGroup.stories-D-RRPHwi.js} +1 -1
- package/storybook-static/assets/{Scrollable-D85fA6pO.js → Scrollable-DvdBIeig.js} +1 -1
- package/storybook-static/assets/{Select-gRnfvfGh.js → Select-8PV9PBKF.js} +1 -1
- package/storybook-static/assets/{Select-CGCxJjL9.js → Select-G04B41FM.js} +1 -1
- package/storybook-static/assets/{Select.stories-CMwt4F9i.js → Select.stories-Cf6CBhV8.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-BLXfKJ38.js → SerializableSelect-CdQdHIVp.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Bca1a9ZU.js → SerializableSelect.stories-0AKUGpbS.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CyeQN0Rd.js → SingleDateTimeInput-DWT1ORhL.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-xrmZckzw.js → SingleDateTimeInput-DattLt6w.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BYFTQM9z.js → SingleDateTimeInput.stories-BLJV3jzV.js} +1 -1
- package/storybook-static/assets/{Slider-D8GtXVGI.js → Slider-DKEI4cDd.js} +1 -1
- package/storybook-static/assets/{Slider-1yJ3uVeR.js → Slider-Dci-mJt_.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CyQ3ns_C.js → Slider.stories-Dp7oQueF.js} +1 -1
- package/storybook-static/assets/{SliderInput-ISSx9vH_.js → SliderInput-BGPQmlgY.js} +1 -1
- package/storybook-static/assets/{SliderInput-BOzHhEUA.js → SliderInput-BhjqGOKt.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-7ooTghrS.js → SliderInput.stories-DXNhRU3X.js} +1 -1
- package/storybook-static/assets/{Sortable-CCLiMmfZ.js → Sortable-CMd9l1Gd.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-B36szI6t.js → Sortable.stories-BN1cFEFJ.js} +1 -1
- package/storybook-static/assets/{Splitter-DQGhgRwx.js → Splitter-GL65TlI9.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Hsq1wYaq.js → Splitter.stories-q5PlI6rB.js} +1 -1
- package/storybook-static/assets/{StateSelect-C6hldFgO.js → StateSelect-Byik5-iZ.js} +1 -1
- package/storybook-static/assets/{StateSelect-DieNn4VC.js → StateSelect-CT0JF2V6.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-CvAhDMix.js → StateSelect.stories-pPEPmgnN.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CUT1tvt-.js → StringToggle.stories-BQlFmCE7.js} +1 -1
- package/storybook-static/assets/{Switch-CX9p_uYU.js → Switch--xGPiYk-.js} +1 -1
- package/storybook-static/assets/{Switch-nEMRtcWe.js → Switch-DhaLI9CG.js} +1 -1
- package/storybook-static/assets/{Switch.stories-CPsHa2_m.js → Switch.stories-5DisgIyj.js} +1 -1
- package/storybook-static/assets/{Table-BhtITVtj.js → Table-Bf6MicdG.js} +1 -1
- package/storybook-static/assets/{Table.stories-nWNhSydG.js → Table.stories-CS7rQgj9.js} +1 -1
- package/storybook-static/assets/{Tabs-DMQFh2BJ.js → Tabs-B4y4y8Ap.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-D23_xvom.js → Tabs.stories-C0SpdGkh.js} +1 -1
- package/storybook-static/assets/{TabsBox-B5BsD_j_.js → TabsBox-C5LLLhnj.js} +1 -1
- package/storybook-static/assets/{TagInput-DO17z100.js → TagInput-D4BpuCoH.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-CMMFnIzb.js → TagInput.stories-rn2wtZP_.js} +1 -1
- package/storybook-static/assets/{Text-ClnbDqRk.js → Text-BhBt9e7C.js} +1 -1
- package/storybook-static/assets/{Textarea-DkhohiNc.js → Textarea-B-Hz7ujq.js} +1 -1
- package/storybook-static/assets/{Textarea-C2IO_zsP.js → Textarea-BHHxY5sd.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-NL6Aq8Vc.js → Textarea.stories-CZ2kWz20.js} +1 -1
- package/storybook-static/assets/{TimePanel-DNEPDlSW.js → TimePanel-Cg8fgFsn.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-DlfdPsz1.js → TimePanel.stories-BxdwtK2e.js} +1 -1
- package/storybook-static/assets/{Toggle-Cc6Ca-HI.js → Toggle-BWwfk9fi.js} +1 -1
- package/storybook-static/assets/{Toggle-3U5CceQN.js → Toggle-Ce9rbjBc.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-BR-hVLDp.js → Toggle.stories-0fzcmzKy.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-D9hMQN2O.js → TreeMultiSelect-B06Y0lIc.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-B0oBc-4y.js → TreeMultiSelect-CrAdR_jM.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-CslpbvPR.js → TreeMultiSelect.stories-CAVoj56E.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B_dMCe45.js → TreePickerBase-qU2xPlar.js} +1 -1
- package/storybook-static/assets/{TreeSelect-2lj0Q8gm.js → TreeSelect-BIHydJFy.js} +1 -1
- package/storybook-static/assets/{TreeSelect-DEKNYF2b.js → TreeSelect-BKnWu0C7.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-CVDxn8Vm.js → TreeSelect.stories-Dp_8ybAf.js} +1 -1
- package/storybook-static/assets/{TreeTable-CBIpzYRL.js → TreeTable-pVXjU9dG.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-BMzrr2Kc.js → TreeTable.stories-CV_8Ui6R.js} +1 -1
- package/storybook-static/assets/{blocks-B5YBxaaS.js → blocks-BY40djCc.js} +3 -3
- package/storybook-static/assets/{check-BjtdCRaW.js → check-CVkPTDzp.js} +1 -1
- package/storybook-static/assets/{chevron-down-B4u-y8Z1.js → chevron-down-BtNO4Vhe.js} +1 -1
- package/storybook-static/assets/{chevron-left-BQfWs7Ah.js → chevron-left-kceSK3sZ.js} +1 -1
- package/storybook-static/assets/{chevron-right-ChokKd-f.js → chevron-right-BA_LO2El.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-meOkhzk4.js → chunk-W22LQPXL-yJiFPv6e.js} +1 -1
- package/storybook-static/assets/{circle-alert-B1AnDRf_.js → circle-alert-B2m4a1zz.js} +1 -1
- package/storybook-static/assets/{circle-check-JYnlcC1F.js → circle-check-Cfjhotlm.js} +1 -1
- package/storybook-static/assets/{components-C_wl1sL5.js → components-D6yV8PLX.js} +3 -3
- package/storybook-static/assets/{contextMenu-B-TUGs_1.js → contextMenu-B0pQBIW0.js} +1 -1
- package/storybook-static/assets/{download-eR3X8I-h.js → download-Lba8elK9.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-D95VPQ0b.js → floating-ui.react-BFNvfMpU.js} +1 -1
- package/storybook-static/assets/{foundationApi-QhHXpYLB.js → foundationApi-DZhnQ2cC.js} +1 -1
- package/storybook-static/assets/{foundationLib-CEAjnstw.js → foundationLib-CoVTo22U.js} +1 -1
- package/storybook-static/assets/{hooks-awde7r2r.js → hooks-Cc6eXN6U.js} +1 -1
- package/storybook-static/assets/iframe-BXM-JBuH.js +1 -0
- package/storybook-static/assets/{iframe-FSp_AjJa.js → iframe-o7sH2IXC.js} +3 -3
- package/storybook-static/assets/{info-12vmb1sT.js → info-BpsVP_dM.js} +1 -1
- package/storybook-static/assets/{odata-C0Kpvttz.js → odata-CXsbxsRY.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-BXZnk_C7.js → odataStoryFixtures-Dj_bzRqh.js} +1 -1
- package/storybook-static/assets/{react-BlCqWuXr.js → react-DeJ0JTHb.js} +1 -1
- package/storybook-static/assets/{refresh-cw-Bf5ufPte.js → refresh-cw-BvGyjEXe.js} +1 -1
- package/storybook-static/assets/{settings-2-DR-dTXIC.js → settings-2-BdXxnHos.js} +1 -1
- package/storybook-static/assets/{sortable-B5e5yb_-.js → sortable-XkyN-9r5.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-EVJARTec.js → syntaxhighlighter-QEQV7K2Y-Cafn3LV1.js} +1 -1
- package/storybook-static/assets/{trash-2-QP7TS18H.js → trash-2-uPH9-fND.js} +1 -1
- package/storybook-static/assets/{triangle-alert-qw19mxHr.js → triangle-alert-tT01vSMw.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-Csu_Cct9.js → useODataSelectBase-B2LlOwPZ.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-BAv-Twqf.js → useODataTreeData-CU7Rqcb9.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-Da-XM_Y0.js → usePickerQuery-D8GHQ6KR.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-C0TdC2Pz.js → usePickerTriggerController-CcK1jmDy.js} +1 -1
- package/storybook-static/assets/{x-aCjYTirW.js → x-BlAURbAH.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/README--LCKbep-.js +0 -110
- package/storybook-static/assets/README-BXJneZAJ.js +0 -147
- package/storybook-static/assets/README-C6BOdXNV.js +0 -322
- package/storybook-static/assets/README-CC00hlZK.js +0 -527
- package/storybook-static/assets/README-Cj2e6HrF.js +0 -178
- package/storybook-static/assets/README-DN9HKtp_.js +0 -124
- package/storybook-static/assets/README-DNricOkt.js +0 -136
- package/storybook-static/assets/README-DoCA4JXf.js +0 -273
- package/storybook-static/assets/README-tm9QH9cF.js +0 -103
- package/storybook-static/assets/iframe-DzQq_POR.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{n}from"./iframe-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{n}from"./iframe-o7sH2IXC.js";import{n as r,t as i}from"./Text-BhBt9e7C.js";import{a,b as o,y as s}from"./formatters-D33Uh3si-CxrG0jsB.js";import{n as c,t as l}from"./createControlledStoryRender-BouhvX-R.js";import{n as u,t as d}from"./GridContainer-fKYgDsLl.js";import{r as f,t as p}from"./DateInput-BQ8SoeLE.js";import{i as m,n as h,r as g,t as _}from"./PeriodSelect-DUJ2nF3F.js";var v=t({AllAllowedOptionsDisabled:()=>A,AlternativeLabels:()=>k,AutoSwitchByRange:()=>D,Controlled:()=>E,Disabled:()=>j,MonthAndYear:()=>O,__namedExportsOrder:()=>M,default:()=>w});function y(e){return e!==void 0&&o(e)?e:null}var b,x,S,C,w,T,E,D,O,k,A,j,M;function N(){return(N=e((()=>{s(),f(),c(),u(),r(),m(),h(),b=n(),{fn:x}=__STORYBOOK_MODULE_TEST__,S=[new Date(2026,2,1,0,0,0),new Date(2026,2,14,23,59,59)],C=[new Date(2026,0,1,0,0,0),new Date(2026,4,20,23,59,59)],w={title:`Shared/UI/PeriodSelect`,component:_,args:{label:`Период детализации`,description:`Выберите уровень группировки дат.`,placeholder:`Выберите период`,value:`day`,onChange:x(),presetIds:g,dateRange:S,maxDayRangeDays:31,maxWeekRangeWeeks:26,disabled:!1,size:`md`},parameters:{atomicCanvas:!0,layout:`padded`,docs:{description:{component:`Select периода детализации дат. Компонент работает с id периода и может блокировать слишком детальные варианты по переданному диапазону дат.`}}},argTypes:{label:{description:`Заголовок поля.`,control:`text`},description:{description:`Описание под заголовком.`,control:`text`},placeholder:{description:`Текст, когда период не выбран.`,control:`text`},value:{description:`Текущий id периода.`,control:`select`,options:g},onChange:{description:`Вызывается с id выбранного периода.`,control:!1},options:{description:"Кастомный список периодов по контракту `PeriodSelectOption`; имеет приоритет над `presetIds`, `labels` и порогами диапазона.",control:!1},labels:{description:`Частичные подписи встроенных периодов поверх канонического каталога.`,control:`object`},presetIds:{description:"Разрешенные встроенные периоды. Порядок отображения остается `day → week → month → year`.",control:`check`,options:g},dateRange:{description:`Диапазон дат, по которому вычисляются заблокированные периоды.`,control:!1},maxDayRangeDays:{description:"Максимальное количество дней, при котором доступен период `day`.",control:{type:`number`,min:1,step:1}},maxWeekRangeWeeks:{description:"Максимальное количество недель, при котором доступен период `week`.",control:{type:`number`,min:1,step:1}},disabled:{description:`Блокирует взаимодействие с полем.`,control:`boolean`},size:{description:`Размер поля и подписей.`,control:`select`,options:[`xs`,`sm`,`md`,`lg`,`xl`]}}},T=l((e,t)=>{let n=y(e.dateRange),r=a(e.dateRange??null);return(0,b.jsxs)(d,{gap:`md`,children:[(0,b.jsx)(_,{...e,onChange:n=>{e.onChange(n),t({value:n})}}),(0,b.jsx)(p,{label:`Связанный диапазон дат`,placeholder:`дд.мм.гггг - дд.мм.гггг`,value:n,onChange:e=>t({dateRange:e??void 0})}),(0,b.jsxs)(i,{as:`p`,color:`secondary`,"aria-live":`polite`,children:[`Выбрано: `,(0,b.jsx)(i,{as:`code`,children:e.value??`не выбрано`}),`. Дней в диапазоне:`,` `,(0,b.jsx)(i,{as:`code`,children:r??`не задано`}),`.`]})]})}),E={name:`Контролируемый выбор`,render:T},D={name:`Автопереключение по диапазону`,args:{value:`day`,dateRange:C,maxDayRangeDays:31,maxWeekRangeWeeks:8},render:T},O={name:`Только месяцы и годы`,args:{value:`month`,presetIds:[`month`,`year`]},render:T},k={name:`Альтернативные подписи`,args:{value:`month`,labels:{day:`за день`,week:`за неделю`,month:`за месяц`,year:`за год`}},render:T},A={name:`Все разрешенные варианты недоступны`,args:{value:`day`,presetIds:[`day`,`week`],dateRange:C,maxDayRangeDays:31,maxWeekRangeWeeks:8},render:T},j={name:`Заблокированный контрол`,args:{disabled:!0,value:`week`}},E.parameters={...E.parameters,docs:{...E.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
name: "Контролируемый выбор",
|
|
3
3
|
render: renderPeriodSelectStory
|
|
4
4
|
}`,...E.parameters?.docs?.source},description:{story:"Контролируемый сценарий синхронизирует `value` и `dateRange` через Storybook args.",...E.parameters?.docs?.description}}},D.parameters={...D.parameters,docs:{...D.parameters?.docs,source:{originalSource:`{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t,t as n}from"./chevron-down-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t,t as n}from"./chevron-down-BtNO4Vhe.js";import{n as r}from"./iframe-o7sH2IXC.js";import{a as i,i as a}from"./utils-tg3ibbzi.js";import{n as o,t as s}from"./ui.module-Cat84Nza.js";function c({open:e,disabled:t,children:r,onToggleMouseDown:a,onToggleClick:s,openAriaLabel:c=`Открыть список`,closeAriaLabel:u=`Закрыть список`}){return(0,l.jsxs)(`div`,{className:o.uiToggleButtonContainer,"data-disabled":t||void 0,children:[r,(0,l.jsx)(`div`,{className:o.uiButtonSeparator}),(0,l.jsx)(`button`,{type:`button`,disabled:t,"aria-label":e?u:c,className:o.uiToggleButton,onMouseDown:a,onClick:s,children:(0,l.jsx)(n,{className:i(o.uiToggleIcon,e&&o.uiToggleIconOpen)})})]})}var l;function u(){return(u=e((()=>{a(),t(),s(),l=r(),c.__docgenInfo={description:``,methods:[],displayName:`PickerTriggerActions`,props:{open:{required:!0,tsType:{name:`boolean`},description:``},disabled:{required:!1,tsType:{name:`boolean`},description:``},children:{required:!1,tsType:{name:`ReactNode`},description:``},onToggleMouseDown:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(event: MouseEvent<HTMLButtonElement>) => void`,signature:{arguments:[{type:{name:`MouseEvent`,elements:[{name:`HTMLButtonElement`}],raw:`MouseEvent<HTMLButtonElement>`},name:`event`}],return:{name:`void`}}},description:``},onToggleClick:{required:!0,tsType:{name:`signature`,type:`function`,raw:`() => void`,signature:{arguments:[],return:{name:`void`}}},description:``},openAriaLabel:{required:!1,tsType:{name:`string`},description:``,defaultValue:{value:`"Открыть список"`,computed:!1}},closeAriaLabel:{required:!1,tsType:{name:`string`},description:``,defaultValue:{value:`"Закрыть список"`,computed:!1}}}}})))()}export{u as n,c as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-
|
|
1
|
+
import{a as e,n as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-o7sH2IXC.js";import{a as i,i as a}from"./utils-tg3ibbzi.js";import{a as o,d as s,g as c,l,m as u,n as d,p as f,r as p}from"./floating-ui.react-BFNvfMpU.js";import{a as m,i as h,n as g,r as _}from"./dom-DBd_DWF8.js";import{i as v,r as y}from"./FloatingPopover-CsnfPiwV.js";import{n as b}from"./error-De9R4E_F.js";var x,S,C,w;function T(){return(T=t((()=>{x=`JK2Y7t`,S=`_5QtpCJ`,C=`hZuysP`,w={popover:x,primary:S,secondary:C}})))()}function E(){let e=(0,D.useContext)(O);if(!e)throw b({hookName:`usePopoverContext`,providerName:`Popover`});return e}var D,O;function k(){return(k=t((()=>{D=n(),O=(0,D.createContext)(null)})))()}var A,j,M;function N(){return(N=t((()=>{A=e(n(),1),p(),_(),a(),v(),T(),k(),j=r(),M=({children:e,onClose:t,closeOnOutside:n=!0,closeOnEscape:r=!0,disableOutsideClick:a=!1,background:o=`secondary`})=>{let{open:s,setOpen:c,refs:l,floatingStyles:u,middlewareData:f,placement:p,arrowRef:_}=E(),v=(0,A.useRef)(null),b=(0,A.useCallback)(e=>{v.current=e,l.setFloating(e)},[l]),x=m({active:s,initialFocus:`container`,restoreFocus:!0,containerRef:v}),S=(0,A.useCallback)(()=>{s&&(c(!1),t?.())},[c,t,s]);g({active:s,enabled:r,onDismiss:S,containerRef:x});let C=(0,A.useCallback)(()=>{!s||a||n&&S()},[s,a,n,S]);return h([l.floating,l.reference],C),s?(0,j.jsx)(d,{children:(0,j.jsxs)(`div`,{ref:b,style:u,className:i(w.popover,w[o]),role:`dialog`,"aria-modal":`true`,tabIndex:-1,children:[typeof e==`function`?e({setClose:S}):e,(0,j.jsx)(y,{ref:_,placement:p,middlewareData:f})]})}):null},M.__docgenInfo={description:`Содержимое Popover, отображаемое в портале.`,methods:[],displayName:`PopoverContent`,props:{children:{required:!0,tsType:{name:`union`,raw:`React.ReactNode | ((ctx: { setClose: () => void }) => React.ReactNode)`,elements:[{name:`ReactReactNode`,raw:`React.ReactNode`},{name:`unknown`}]},description:``},onClose:{required:!1,tsType:{name:`signature`,type:`function`,raw:`() => void`,signature:{arguments:[],return:{name:`void`}}},description:``},closeOnOutside:{required:!1,tsType:{name:`boolean`},description:``,defaultValue:{value:`true`,computed:!1}},closeOnEscape:{required:!1,tsType:{name:`boolean`},description:``,defaultValue:{value:`true`,computed:!1}},disableOutsideClick:{required:!1,tsType:{name:`boolean`},description:``,defaultValue:{value:`false`,computed:!1}},background:{required:!1,tsType:{name:`union`,raw:`"primary" | "secondary"`,elements:[{name:`literal`,value:`"primary"`},{name:`literal`,value:`"secondary"`}]},description:``,defaultValue:{value:`"secondary"`,computed:!1}}}}})))()}var P,F;function I(){return(I=t((()=>{P=n(),k(),F=({passive:e,children:t})=>{let{open:n,setOpen:r,refs:i}=E(),a=(0,P.useCallback)(n=>{t.props.onClick&&t.props.onClick(n),!n.defaultPrevented&&(n.preventDefault(),n.stopPropagation(),!e&&r(e=>!e))},[t,r,e]);return(0,P.cloneElement)(t,{ref:i.setReference,"aria-expanded":n,onClick:a})},F.__docgenInfo={description:``,methods:[],displayName:`PopoverTrigger`,props:{passive:{required:!1,tsType:{name:`literal`,value:`true`},description:``},children:{required:!0,tsType:{name:`ReactReactElement`,raw:`React.ReactElement<React.HTMLAttributes<Element> & { ref?: React.Ref<Element> }>`,elements:[{name:`intersection`,raw:`React.HTMLAttributes<Element> & { ref?: React.Ref<Element> }`,elements:[{name:`ReactHTMLAttributes`,raw:`React.HTMLAttributes<Element>`,elements:[{name:`Element`}]},{name:`signature`,type:`object`,raw:`{ ref?: React.Ref<Element> }`,signature:{properties:[{key:`ref`,value:{name:`ReactRef`,raw:`React.Ref<Element>`,elements:[{name:`Element`}],required:!1}}]}}]}]},description:``}}}})))()}var L,R,z,B;function V(){return(V=t((()=>{L=e(n(),1),p(),N(),k(),I(),R=r(),z=({children:e,open:t,defaultOpen:n,onOpenChange:r,placement:i=`bottom`})=>{let[a,d]=(0,L.useState)(n??!1),p=t!==void 0,m=p?t:a,h=(0,L.useCallback)(e=>{let t=typeof e==`function`?e(m):e;p||d(t),r?.(t)},[p,r,m]),g=(0,L.useRef)(null),{refs:_,floatingStyles:v,middlewareData:y,placement:b}=o({open:m,onOpenChange:h,placement:i,middleware:[f(8),s(),u({padding:16}),l({element:g.current})],whileElementsMounted:c});return(0,R.jsx)(O.Provider,{value:{open:m,setOpen:h,refs:_,floatingStyles:v,placement:b,middlewareData:y,arrowRef:g},children:e})},B=Object.assign(z,{Trigger:F,Content:M}),z.__docgenInfo={description:`Контролируемый Popover.
|
|
2
2
|
Используется в связке с Popover.Trigger и Popover.Content.`,methods:[],displayName:`PopoverRoot`,props:{children:{required:!0,tsType:{name:`ReactReactNode`,raw:`React.ReactNode`},description:``},placement:{required:!1,tsType:{name:`Placement`},description:``,defaultValue:{value:`"bottom"`,computed:!1}},open:{required:!1,tsType:{name:`boolean`},description:``},defaultOpen:{required:!1,tsType:{name:`boolean`},description:``},onOpenChange:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(open: boolean) => void`,signature:{arguments:[{type:{name:`boolean`},name:`open`}],return:{name:`void`}}},description:``}}}})))()}export{V as n,B as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-BY40djCc.js";import{a as p,i as m,n as h,o as g,r as _,t as v}from"./Popover.stories-DE1LxZvv.js";function y(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(s,{of:m,parameters:{docs:{toc:!0}}}),`
|
|
2
2
|
`,(0,x.jsx)(u,{children:`Popover`}),`
|
|
3
3
|
`,(0,x.jsx)(o,{children:`Всплывающий контейнер, привязанный к trigger-элементу и поддерживающий управляемое открытие`}),`
|
|
4
4
|
`,(0,x.jsx)(t.p,{children:`Popover уже имеет живые stories, а эта страница собирает их в структурированную документацию с краткими рекомендациями, примерами подключения и API.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-o7sH2IXC.js";import{n as i,t as a}from"./Popover-B6oidz5p.js";import{n as o,t as s}from"./Button-_YPAu9sd.js";import{n as c,t as l}from"./createControlledStoryRender-BouhvX-R.js";import{l as u,t as d}from"./Input-DLubbE7P.js";var f=t({AnchorPlacement:()=>w,Controlled:()=>C,Default:()=>S,WithInteractiveContent:()=>T,__namedExportsOrder:()=>E,default:()=>x});function p({args:e,updateArgs:t,trigger:n,children:r}){return(0,_.jsxs)(a,{placement:e.placement,open:e.open,defaultOpen:e.defaultOpen,onOpenChange:n=>{e.onOpenChange?.(n),t({open:n})},children:[(0,_.jsx)(a.Trigger,{passive:e.passive,children:n(e.open===!0)}),(0,_.jsx)(a.Content,{onClose:()=>e.onClose?.(),closeOnOutside:e.closeOnOutside,closeOnEscape:e.closeOnEscape,disableOutsideClick:e.disableOutsideClick,background:e.background,children:r})]})}function m(e,t){return l((n,r)=>(0,_.jsx)(p,{args:n,updateArgs:r,trigger:e,children:t}))}function h({args:e,updateArgs:t}){let[n,r]=(0,g.useState)(``);return(0,_.jsx)(p,{args:e,updateArgs:t,trigger:()=>(0,_.jsx)(`button`,{type:`button`,children:`Форма`}),children:e=>(0,_.jsxs)(`form`,{onSubmit:t=>{t.preventDefault(),e.setClose()},style:{display:`flex`,flexDirection:`column`,gap:8,padding:12,width:180},children:[(0,_.jsx)(d,{label:`Имя`,placeholder:`Введите имя`,value:n,onChange:r}),(0,_.jsx)(s,{children:`Отправить`})]})})}var g,_,v,y,b,x,S,C,w,T,E;function D(){return(D=e((()=>{g=n(),o(),c(),u(),i(),_=r(),{useArgs:v}=__STORYBOOK_MODULE_PREVIEW_API__,{fn:y}=__STORYBOOK_MODULE_TEST__,b=[`top`,`top-start`,`top-end`,`right`,`right-start`,`right-end`,`bottom`,`bottom-start`,`bottom-end`,`left`,`left-start`,`left-end`],x={title:`Shared/UI/Popover`,component:a,args:{children:null,placement:`bottom`,open:!1,defaultOpen:!1,onOpenChange:y(),onClose:y(),closeOnOutside:!0,closeOnEscape:!0,disableOutsideClick:!1,background:`secondary`},parameters:{atomicCanvas:!0,layout:`centered`},argTypes:{children:{description:"Композиция из `Popover.Trigger` и `Popover.Content`.",control:!1},placement:{description:`Предпочтительное положение панели относительно trigger.`,control:`select`,options:b},open:{description:`Контролируемая видимость popover.`,control:`boolean`},defaultOpen:{description:`Начальная видимость в uncontrolled-режиме.`,control:`boolean`},onOpenChange:{description:`Вызывается при открытии и закрытии popover.`,control:!1},passive:{description:`Оставляет trigger пассивным: он получает reference, но не переключает popover по клику.`,control:`boolean`},onClose:{description:"Вызывается после закрытия Content через Escape, клик снаружи или `setClose`.",control:!1},closeOnOutside:{description:`Закрывает Content по клику снаружи.`,control:`boolean`},closeOnEscape:{description:`Закрывает Content по клавише Escape.`,control:`boolean`},disableOutsideClick:{description:`Игнорирует клики снаружи Content.`,control:`boolean`},background:{description:`Тема фона Content.`,control:`inline-radio`,options:[`primary`,`secondary`]}}},S={render:m(()=>(0,_.jsx)(`button`,{type:`button`,children:`Открыть`}),e=>(0,_.jsxs)(`div`,{style:{padding:12,maxWidth:160},children:[(0,_.jsx)(`p`,{children:`Пример простого поповера`}),(0,_.jsx)(`button`,{type:`button`,onClick:e.setClose,children:`Закрыть`})]}))},C={render:m(e=>(0,_.jsx)(`button`,{type:`button`,children:e?`Закрыть`:`Открыть`}),(0,_.jsx)(`div`,{style:{padding:12},children:`Контролируемый режим`}))},w={render:function(){let[e,t]=v(),n=(n,r)=>{e.onOpenChange?.(n),t(n?{open:!0,placement:r}:{open:!1})};return(0,_.jsx)(`div`,{style:{display:`flex`,gap:32,flexWrap:`wrap`,justifyContent:`center`},children:b.map(t=>(0,_.jsxs)(a,{placement:t,open:e.open===!0&&e.placement===t,defaultOpen:e.defaultOpen,onOpenChange:e=>n(e,t),children:[(0,_.jsx)(a.Trigger,{passive:e.passive,children:(0,_.jsx)(`button`,{type:`button`,children:t})}),(0,_.jsx)(a.Content,{onClose:()=>e.onClose?.(),closeOnOutside:e.closeOnOutside,closeOnEscape:e.closeOnEscape,disableOutsideClick:e.disableOutsideClick,background:e.background,children:(0,_.jsx)(`div`,{style:{padding:8},children:t})})]},t))})}},T={render:l((e,t)=>(0,_.jsx)(h,{args:e,updateArgs:t}))},S.parameters={...S.parameters,docs:{...S.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: createPopoverStoryRender(() => <button type="button">Открыть</button>, ctx => <div style={{
|
|
3
3
|
padding: 12,
|
|
4
4
|
maxWidth: 160
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{t}from"./react-BZJXY1be.js";import{n}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{t}from"./react-BZJXY1be.js";import{n}from"./iframe-o7sH2IXC.js";import{n as r,t as i}from"./FlexContainer-BWyPlTMB.js";import{r as a,t as o}from"./DateInput-BQ8SoeLE.js";import{a as s,c,l,n as u,o as d,r as f,s as p,t as m}from"./DateRangePresetSelect-fgJfLaLO.js";function h(e){return e??`__empty__`}function g({value:e,onChange:t,presetId:n,onPresetIdChange:r,referenceDate:a,presetIds:s,presetOptions:u,presetLabel:g,presetDescription:y,presetPlaceholder:b=`Выберите пресет диапазона`,presetDisabled:x,...S}){let[C]=(0,_.useState)(()=>new Date),w=a??C,T=(0,_.useMemo)(()=>u??c(d(s,f)),[s,u]),E=e??null,D=(0,_.useMemo)(()=>p(E,w,T),[E,T,w]),O=n??D??void 0,k=(0,_.useRef)(``),A=(0,_.useCallback)(e=>{if(!r)return;let t=h(e);t!==k.current&&(k.current=t,r(e))},[r]),j=e=>{let n=l(e,w,T);if(!n){A(null);return}A(n.id),t(n.range)},M=e=>{t(e),A(p(e,w,T))};return(0,v.jsxs)(i,{gap:`sm`,align:`end`,children:[(0,v.jsx)(m,{size:S.size,label:g,description:y,placeholder:b,disabled:x??S.disabled,value:O,onChange:j,options:T,referenceDate:w}),(0,v.jsx)(o,{...S,value:E,onChange:M})]})}var _,v;function y(){return(y=e((()=>{_=t(),a(),u(),s(),r(),v=n(),g.__docgenInfo={description:`Составной компонент выбора диапазона дат через пресет или ручной ввод.`,methods:[],displayName:`PresetRangeDateInput`,props:{presetId:{required:!1,tsType:{name:`union`,raw:`DateRangePresetOption["id"] | null`,elements:[{name:`DateRangePresetOption["id"]`,raw:`DateRangePresetOption["id"]`},{name:`null`}]},description:``},onPresetIdChange:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(presetId: DateRangePresetOption["id"] | null) => void`,signature:{arguments:[{type:{name:`union`,raw:`DateRangePresetOption["id"] | null`,elements:[{name:`DateRangePresetOption["id"]`,raw:`DateRangePresetOption["id"]`},{name:`null`}]},name:`presetId`}],return:{name:`void`}}},description:``},referenceDate:{required:!1,tsType:{name:`Date`},description:``},presetIds:{required:!1,tsType:{name:`unknown`},description:``},presetOptions:{required:!1,tsType:{name:`unknown`},description:``},presetLabel:{required:!1,tsType:{name:`ReactNode`},description:``},presetDescription:{required:!1,tsType:{name:`string`},description:``},presetPlaceholder:{required:!1,tsType:{name:`string`},description:``,defaultValue:{value:`"Выберите пресет диапазона"`,computed:!1}},presetDisabled:{required:!1,tsType:{name:`boolean`},description:``}},composes:[`Omit`]}})))()}export{y as n,g as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-BY40djCc.js";import{n as p,r as m,t as h}from"./PresetRangeDateInput.stories-CgoYAYBG.js";function g(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(s,{of:p,parameters:{docs:{toc:!0}}}),`
|
|
2
2
|
`,(0,v.jsx)(u,{children:`PresetRangeDateInput`}),`
|
|
3
3
|
`,(0,v.jsx)(o,{children:`Составной контрол диапазона дат с синхронизацией ручного ввода и готовых пресетов`}),`
|
|
4
4
|
`,(0,v.jsx)(t.p,{children:`PresetRangeDateInput уже имеет живые stories, а эта страница собирает их в структурированную документацию с краткими рекомендациями, примерами подключения и API.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{a as n,i as r,r as i}from"./CalendarView-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{a as n,i as r,r as i}from"./CalendarView-DLuO2Ywz.js";import{n as a}from"./iframe-o7sH2IXC.js";import{n as o,t as s}from"./Text-BhBt9e7C.js";import{n as c,t as l}from"./FlexContainer-BWyPlTMB.js";import{n as u,t as d}from"./createControlledStoryRender-BouhvX-R.js";import{a as f,r as p}from"./DateRangePresetSelect-fgJfLaLO.js";import{n as m,t as h}from"./PresetRangeDateInput-CQ5FfmrL.js";var g=t({Default:()=>x,__namedExportsOrder:()=>S,default:()=>y}),_,v,y,b,x,S;function C(){return(C=e((()=>{n(),f(),u(),c(),o(),m(),_=a(),{fn:v}=__STORYBOOK_MODULE_TEST__,y={title:`Shared/UI/PresetRangeDateInput`,component:h,args:{label:`Диапазон дат`,placeholder:`дд.мм.гггг - дд.мм.гггг`,value:[new Date(2026,2,10,0,0,0),new Date(2026,2,10,23,59,59)],onChange:v(),presetId:`today`,onPresetIdChange:v(),referenceDate:new Date(2026,2,10,12,0,0),presetLabel:`Быстрый диапазон`,size:`md`},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{presetId:{description:"Контролируемый ID выбранного быстрого пресета. `null` снимает внешний выбор.",control:`select`,options:[...p,null]},onPresetIdChange:{description:`Вызывается, когда выбор пресета меняется из-за preset или ручного диапазона.`,control:!1},referenceDate:{description:`Опорная дата для вычисления встроенных быстрых диапазонов.`,control:`date`},presetIds:{description:"Разрешённые встроенные ID пресетов, если не передан `presetOptions`.",control:`check`,options:p},presetOptions:{description:`Кастомный каталог быстрых диапазонов с функциями вычисления.`,control:!1},presetLabel:{description:`Заголовок поля быстрого выбора.`,control:`text`},presetDescription:{description:`Описание под полем быстрого выбора.`,control:`text`},presetPlaceholder:{description:`Текст до выбора быстрого диапазона.`,control:`text`},presetDisabled:{description:`Блокирует только выбор быстрого пресета.`,control:`boolean`},label:{description:`Заголовок ручного поля диапазона.`,control:`text`},description:{description:`Описание ручного поля диапазона.`,control:`text`},placeholder:{description:`Текст до выбора ручного диапазона.`,control:`text`},value:{description:`Текущий ручной диапазон дат.`,control:!1},onChange:{description:`Вызывается при изменении ручного диапазона или выборе пресета.`,control:!1},error:{description:`Текст внешней ошибки ручного поля.`,control:`text`},onClearError:{description:`Сбрасывает внешнюю ошибку после ввода или выбора.`,control:!1},minDate:{description:`Минимально доступная дата ручного диапазона.`,control:`date`},maxDate:{description:`Максимально доступная дата ручного диапазона.`,control:`date`},datePreset:{description:`Пресет форматирования выбранного ручного диапазона.`,control:`text`},datePickerLevel:{description:`Минимальный уровень навигации календаря ручного поля.`,control:`select`,options:[`day`,`month`,`year`]},selectionMode:{description:`Размер периода, который выбирает ручное поле.`,control:`select`,options:i},weekEndDay:{description:`Последний включённый день недели в режиме week.`,control:`select`,options:r},allowSelectionModeChange:{description:`Показывает runtime-переключатель размера периода.`,control:`boolean`},selectionModeOptions:{description:`Ограничивает доступные режимы в runtime-переключателе.`,control:`check`,options:i},onSelectionModeChange:{description:`Вызывается при runtime-смене размера периода.`,control:!1},disabled:{description:"Блокирует ручное поле и, если `presetDisabled` не задан, быстрый выбор.",control:`boolean`},size:{description:`Размер обоих полей.`,control:`select`,options:[`xs`,`sm`,`md`,`lg`,`xl`]}}},b=d((e,t)=>(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(l,{gap:`sm`,align:`end`,children:(0,_.jsx)(h,{...e,value:e.value??null,onChange:n=>{e.onChange(n),t({value:n})},onPresetIdChange:n=>{e.onPresetIdChange?.(n),t({presetId:n})},onSelectionModeChange:n=>{e.onSelectionModeChange?.(n),t({selectionMode:n})},onClearError:()=>{e.onClearError?.(),t({error:void 0})}})}),(0,_.jsxs)(s,{as:`p`,className:`marginBlockSm`,children:[`Активный presetId: `,(0,_.jsx)(s,{as:`code`,children:e.presetId??`null`})]})]})),x={render:b},x.parameters={...x.parameters,docs:{...x.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: renderPresetRangeDateInputStory
|
|
3
3
|
}`,...x.parameters?.docs?.source},description:{story:`Демонстрирует совместную работу пресета и ручного диапазона.`,...x.parameters?.docs?.description}}},S=[`Default`]})))()}export{g as n,C as r,x as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{n,t as r}from"./Select-G04B41FM.js";function i(e,t,n=[]){if(!Array.isArray(e))return[...n];let r=[];for(let n of e)!t(n)||r.includes(n)||r.push(n);return r}function a(e,t){let n=new Map(t.map(e=>[e.id,e])),r=[],i=new Set;for(let t of e){if(i.has(t))continue;let e=n.get(t);e&&(r.push(e),i.add(t))}return r}function o(e,t){return e?t.find(t=>t.id===e)??null:null}function s(){return(s=e((()=>{})))()}function c({options:e,value:t,onChange:n,getOptionDisabled:i,getOptionCode:a,getOptionAriaLabel:s,renderOption:c,renderValue:u,className:d,buttonClassName:f,optionsClassName:p,clearable:m,...h}){let g=o(t,e)??void 0;return(0,l.jsx)(r,{...h,options:e,value:g,onChange:e=>n(e?.id),getOptionKey:e=>e.id,getOptionLabel:e=>e.label,getOptionCode:a,getOptionDisabled:i,getOptionAriaLabel:s,renderOption:c,renderValue:u,className:d,buttonClassName:f,optionsClassName:p,clearable:m})}var l;function u(){return(u=e((()=>{n(),l=t(),c.__docgenInfo={description:"Базовый Select для пресетов с контрактом `id/label`.",methods:[],displayName:`PresetSelect`,props:{label:{required:!1,tsType:{name:`ReactNode`},description:``},description:{required:!1,tsType:{name:`string`},description:``},placeholder:{required:!1,tsType:{name:`string`},description:``},disabled:{required:!1,tsType:{name:`boolean`},description:``},size:{required:!1,tsType:{name:`union`,raw:`"xs" | "sm" | "md" | "lg" | "xl"`,elements:[{name:`literal`,value:`"xs"`},{name:`literal`,value:`"sm"`},{name:`literal`,value:`"md"`},{name:`literal`,value:`"lg"`},{name:`literal`,value:`"xl"`}]},description:``},value:{required:!0,tsType:{name:`V`},description:"Если начальное состояние может быть `null | undefined`\nзначит `onChange` тоже должен ументь сбрасывать.\nПоэтому такой контрол явно должен передавать `UiBaseProps<AnyType | undefined>`"},onChange:{required:!0,tsType:{name:`signature`,type:`function`,raw:`(value: T) => void`,signature:{arguments:[{type:{name:`C`},name:`value`}],return:{name:`void`}}},description:``},options:{required:!0,tsType:{name:`unknown`},description:``},getOptionDisabled:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption) => boolean`,signature:{arguments:[{type:{name:`TOption`},name:`option`}],return:{name:`boolean`}}},description:``},getOptionCode:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption) => string`,signature:{arguments:[{type:{name:`TOption`},name:`option`}],return:{name:`string`}}},description:``},getOptionAriaLabel:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption) => string`,signature:{arguments:[{type:{name:`TOption`},name:`option`}],return:{name:`string`}}},description:``},renderOption:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption, state: SelectOptionState) => ReactNode`,signature:{arguments:[{type:{name:`TOption`},name:`option`},{type:{name:`signature`,type:`object`,raw:`{
|
|
2
2
|
active: boolean;
|
|
3
3
|
selected: boolean;
|
|
4
4
|
disabled: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Range Output`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`подстановка-открытых-границ-через-ryuzaki13react-foundation-librange-output`,children:[`Подстановка открытых границ через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/range-output`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль хранит в UI открытые границы диапазона как `,(0,c.jsx)(t.code,{children:`null`}),`, но позволяет подставить конкретные значения при внешнем выводе или сохранении.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/DOM`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`browser-dom-и-focus-helpers-через-ryuzaki13react-foundation-libdom`,children:[`Browser DOM и focus helpers через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/dom`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`dom`}),` содержит небольшие browser helpers и React hooks для типовых инфраструктурных задач:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Forms/Form Errors`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`чтение-первой-ошибки-формы-через-ryuzaki13react-foundation-libform`,children:[`Чтение первой ошибки формы через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/form`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит одну функцию `,(0,c.jsx)(t.code,{children:`readFirstFormError`}),`. Она получает неоднородный массив ошибок и возвращает первое найденное текстовое сообщение.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Validation/Runtime Guards`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`runtime-guards-и-validators-через-ryuzaki13react-foundation-libvalidators`,children:[`Runtime guards и validators через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/validators`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит небольшие проверки для `,(0,c.jsx)(t.code,{children:`unknown`}),`, object-like значений, image extensions, positive integer, URL и Floating UI DOM reference.`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.blockquote,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Binary`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`работа-с-бинарными-данными-через-ryuzaki13react-foundation-libbinary`,children:[`Работа с бинарными данными через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/binary`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`binary`}),` преобразует строковое бинарное содержимое в браузерный `,(0,c.jsx)(t.code,{children:`Blob`}),`, определяет предполагаемый MIME-тип документа и предоставляет React hook для типового сценария «base64 → `,(0,c.jsx)(t.code,{children:`{ blob, mime }`}),`».`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Основной сценарий:`}),`
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/SAP/ADT Transports`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`sap-adt-transports-через-ryuzaki13react-foundation-apiadt`,children:[`SAP ADT transports через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/adt`})]}),`
|
|
3
|
+
`,(0,c.jsx)(t.p,{children:`Модуль получает transport requests текущего пользователя из SAP ADT endpoint и преобразует XML в простой массив объектов.`}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
5
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
6
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C`,children:`Когда использовать`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82`,children:`Установка и импорт`})}),`
|
|
8
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82`,children:`Быстрый старт`})}),`
|
|
9
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#fetchusertransports`,children:(0,c.jsx)(t.code,{children:`fetchUserTransports`})})}),`
|
|
10
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#parseusertransportsxml`,children:(0,c.jsx)(t.code,{children:`parseUserTransportsXml`})})}),`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0`,children:`Формат результата`})}),`
|
|
12
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-%D0%B8-%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F`,children:`Ошибки и ограничения`})}),`
|
|
13
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-api`,children:`Полный API`})}),`
|
|
14
|
+
`]}),`
|
|
15
|
+
`,(0,c.jsx)(t.h2,{id:`когда-использовать`,children:`Когда использовать`}),`
|
|
16
|
+
`,(0,c.jsxs)(t.p,{children:[`Используйте `,(0,c.jsx)(t.code,{children:`adt`}),`, если backend доступен по `,(0,c.jsx)(t.code,{children:`/sap/bc/adt/cts/transports`}),` и возвращает ADT XML. Если нужны отдельные UI2 списки workbench/customizing в JSON, используйте `,(0,c.jsx)(t.a,{href:`../transport/README.mdx`,children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/transport`})}),`.`]}),`
|
|
17
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`SAP ADT XML
|
|
18
|
+
│
|
|
19
|
+
▼
|
|
20
|
+
parseUserTransportsXml
|
|
21
|
+
│
|
|
22
|
+
▼
|
|
23
|
+
UserTransport[]
|
|
24
|
+
`})}),`
|
|
25
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
26
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-api @ryuzaki13/react-foundation-lib fast-xml-parser
|
|
27
|
+
`})}),`
|
|
28
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { fetchUserTransports, parseUserTransportsXml } from "@ryuzaki13/react-foundation-api/adt";
|
|
29
|
+
|
|
30
|
+
import type { UserTransport } from "@ryuzaki13/react-foundation-api/adt";
|
|
31
|
+
`})}),`
|
|
32
|
+
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
33
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`async function loadTransports() {
|
|
34
|
+
try {
|
|
35
|
+
const transports = await fetchUserTransports();
|
|
36
|
+
return transports;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error("Не удалось получить transports", error);
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`})}),`
|
|
43
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`fetchUserTransports`}),` возвращает Promise. Пока он выполняется, данных ещё нет; ошибку нужно обработать через `,(0,c.jsx)(t.code,{children:`try/catch`}),`, TanStack Query или error boundary владельца сценария.`]}),`
|
|
44
|
+
`,(0,c.jsx)(t.h2,{id:`fetchusertransports`,children:(0,c.jsx)(t.code,{children:`fetchUserTransports`})}),`
|
|
45
|
+
`,(0,c.jsx)(t.p,{children:`Функция выполняет GET:`}),`
|
|
46
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`/sap/bc/adt/cts/transports?_action=FIND&trfunction=K
|
|
47
|
+
`})}),`
|
|
48
|
+
`,(0,c.jsx)(t.p,{children:`Запрос отправляется через SAP/OData transport пакета с:`}),`
|
|
49
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
50
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Accept: application/xml, text/xml, */*`}),`;`]}),`
|
|
51
|
+
`,(0,c.jsxs)(t.li,{children:[`cookies через `,(0,c.jsx)(t.code,{children:`credentials: include`}),`;`]}),`
|
|
52
|
+
`,(0,c.jsx)(t.li,{children:`SAP language/client и SSO policy общего OData transport;`}),`
|
|
53
|
+
`,(0,c.jsxs)(t.li,{children:[`пустым base URL, потому что ADT endpoint уже содержит `,(0,c.jsx)(t.code,{children:`/sap/...`}),`.`]}),`
|
|
54
|
+
`]}),`
|
|
55
|
+
`,(0,c.jsxs)(t.p,{children:[`Ответ читается как text и передаётся `,(0,c.jsx)(t.code,{children:`parseUserTransportsXml`}),`.`]}),`
|
|
56
|
+
`,(0,c.jsx)(t.p,{children:`Если сервер вместо XML вернул HTML login/error page, функция выбросит ошибку. Это защищает UI от ситуации, когда HTML ошибочно принимается за пустой список transports.`}),`
|
|
57
|
+
`,(0,c.jsx)(t.h2,{id:`parseusertransportsxml`,children:(0,c.jsx)(t.code,{children:`parseUserTransportsXml`})}),`
|
|
58
|
+
`,(0,c.jsx)(t.p,{children:`Parser можно использовать отдельно, например в тесте или при получении XML другим transport:`}),`
|
|
59
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const xml = \`
|
|
60
|
+
<root>
|
|
61
|
+
<CTS_REQ_HEADER>
|
|
62
|
+
<TRKORR>DEVK900001</TRKORR>
|
|
63
|
+
<AS4TEXT>Исправление отчёта</AS4TEXT>
|
|
64
|
+
<AS4USER>IVANOV</AS4USER>
|
|
65
|
+
<TARSYSTEM>QAS</TARSYSTEM>
|
|
66
|
+
<TRFUNCTION>K</TRFUNCTION>
|
|
67
|
+
<TRSTATUS>D</TRSTATUS>
|
|
68
|
+
</CTS_REQ_HEADER>
|
|
69
|
+
</root>\`;
|
|
70
|
+
|
|
71
|
+
const transports = parseUserTransportsXml(xml);
|
|
72
|
+
`})}),`
|
|
73
|
+
`,(0,c.jsx)(t.p,{children:`Алгоритм:`}),`
|
|
74
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
75
|
+
`,(0,c.jsxs)(t.li,{children:[`Пустая или состоящая из пробелов строка превращается в `,(0,c.jsx)(t.code,{children:`[]`}),`.`]}),`
|
|
76
|
+
`,(0,c.jsxs)(t.li,{children:[`XML разбирается `,(0,c.jsx)(t.code,{children:`fast-xml-parser`}),`.`]}),`
|
|
77
|
+
`,(0,c.jsxs)(t.li,{children:[`Во вложенной структуре рекурсивно ищутся узлы `,(0,c.jsx)(t.code,{children:`CTS_REQ_HEADER`}),`.`]}),`
|
|
78
|
+
`,(0,c.jsxs)(t.li,{children:[`Поля преобразуются в `,(0,c.jsx)(t.code,{children:`UserTransport`}),`.`]}),`
|
|
79
|
+
`,(0,c.jsxs)(t.li,{children:[`Записи без непустого `,(0,c.jsx)(t.code,{children:`TRKORR`}),` отбрасываются.`]}),`
|
|
80
|
+
`,(0,c.jsxs)(t.li,{children:[`Дубликаты `,(0,c.jsx)(t.code,{children:`transportNo`}),` удаляются; сохраняется первая запись.`]}),`
|
|
81
|
+
`,(0,c.jsxs)(t.li,{children:[`Если header-узлы не найдены, parser ищет вложенные `,(0,c.jsx)(t.code,{children:`TRKORR`}),` и создаёт минимальные записи.`]}),`
|
|
82
|
+
`]}),`
|
|
83
|
+
`,(0,c.jsxs)(t.p,{children:[`Parser делает `,(0,c.jsx)(t.code,{children:`trim`}),` строковых полей, но не декодирует бизнес-значения статуса/function и не проверяет их по справочнику SAP.`]}),`
|
|
84
|
+
`,(0,c.jsx)(t.p,{children:`Некорректный XML может привести к исключению parser-а. Функция не заменяет его пустым массивом: повреждённый ответ должен быть виден как ошибка.`}),`
|
|
85
|
+
`,(0,c.jsx)(t.h2,{id:`формат-результата`,children:`Формат результата`}),`
|
|
86
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface UserTransport {
|
|
87
|
+
transportNo: string;
|
|
88
|
+
description: string | undefined;
|
|
89
|
+
owner: string | undefined;
|
|
90
|
+
targetSystem: string | undefined;
|
|
91
|
+
functionCode: string | undefined;
|
|
92
|
+
statusCode: string | undefined;
|
|
93
|
+
parentTransportNo: string | undefined;
|
|
94
|
+
}
|
|
95
|
+
`})}),`
|
|
96
|
+
`,(0,c.jsx)(t.p,{children:`Соответствие XML:`}),`
|
|
97
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`XML`}),(0,c.jsx)(t.th,{children:`Поле`}),(0,c.jsx)(t.th,{children:`Значение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`TRKORR`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`transportNo`})}),(0,c.jsx)(t.td,{children:`Обязательный номер transport`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`AS4TEXT`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`description`})}),(0,c.jsx)(t.td,{children:`Описание`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`AS4USER`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`owner`})}),(0,c.jsx)(t.td,{children:`Владелец`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`TARSYSTEM`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`targetSystem`})}),(0,c.jsx)(t.td,{children:`Целевая система`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`TRFUNCTION`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`functionCode`})}),(0,c.jsx)(t.td,{children:`SAP transport function code`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`TRSTATUS`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`statusCode`})}),(0,c.jsx)(t.td,{children:`SAP status code`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`STRKORR`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parentTransportNo`})}),(0,c.jsx)(t.td,{children:`Родительский request/task`})]})]})]}),`
|
|
98
|
+
`,(0,c.jsxs)(t.p,{children:[`Optional-поле может быть `,(0,c.jsx)(t.code,{children:`undefined`}),`. Проверяйте его перед отображением:`]}),`
|
|
99
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:"const label = transport.description\n ? `${transport.transportNo} — ${transport.description}`\n : transport.transportNo;\n"})}),`
|
|
100
|
+
`,(0,c.jsx)(t.h2,{id:`как-устроен-adt-response`,children:`Как устроен ADT response`}),`
|
|
101
|
+
`,(0,c.jsx)(t.p,{children:`ADT endpoint возвращает не OData JSON, а ABAP XML. Реальный документ обычно содержит namespace и несколько служебных обёрток:`}),`
|
|
102
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-xml`,children:`<?xml version="1.0" encoding="UTF-8"?>
|
|
103
|
+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
104
|
+
<asx:values>
|
|
105
|
+
<DATA>
|
|
106
|
+
<CTS_REQ_HEADER>
|
|
107
|
+
<TRKORR>DEVK900001</TRKORR>
|
|
108
|
+
<AS4TEXT>Исправление отчёта</AS4TEXT>
|
|
109
|
+
<AS4USER>IVANOV</AS4USER>
|
|
110
|
+
<TARSYSTEM>QAS</TARSYSTEM>
|
|
111
|
+
<TRFUNCTION>K</TRFUNCTION>
|
|
112
|
+
<TRSTATUS>D</TRSTATUS>
|
|
113
|
+
<STRKORR>DEVK900000</STRKORR>
|
|
114
|
+
</CTS_REQ_HEADER>
|
|
115
|
+
</DATA>
|
|
116
|
+
</asx:values>
|
|
117
|
+
</asx:abap>
|
|
118
|
+
`})}),`
|
|
119
|
+
`,(0,c.jsxs)(t.p,{children:[`Parser намеренно не зависит от точного положения `,(0,c.jsx)(t.code,{children:`CTS_REQ_HEADER`}),`: он рекурсивно обходит objects и arrays. Поэтому дополнительная server wrapper-структура не ломает parsing, пока имена полезных tags остаются прежними.`]}),`
|
|
120
|
+
`,(0,c.jsx)(t.h3,{id:`request-parameters-endpoint`,children:`Request parameters endpoint`}),`
|
|
121
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`_action=FIND
|
|
122
|
+
trfunction=K
|
|
123
|
+
`})}),`
|
|
124
|
+
`,(0,c.jsxs)(t.p,{children:[`Они зафиксированы внутри `,(0,c.jsx)(t.code,{children:`fetchUserTransports`}),`. Consumer не может изменить owner, function, status или paging через options. Если нужен другой ADT query, создайте отдельный API у владельца package, а не подменяйте поведение этой функции string manipulation-ом.`]}),`
|
|
125
|
+
`,(0,c.jsx)(t.h3,{id:`почему-используется-общий-sap-transport`,children:`Почему используется общий SAP transport`}),`
|
|
126
|
+
`,(0,c.jsxs)(t.p,{children:[`Хотя response не OData, `,(0,c.jsx)(t.code,{children:`fetchUserTransports`}),` использует `,(0,c.jsx)(t.code,{children:`fetchBase`}),` из `,(0,c.jsx)(t.code,{children:`/odata`}),`, потому что ему нужны те же infrastructure concerns:`]}),`
|
|
127
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
128
|
+
`,(0,c.jsx)(t.li,{children:`cookies текущей SAP session;`}),`
|
|
129
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`sap-language`}),` и configured `,(0,c.jsx)(t.code,{children:`sap-client`}),`;`]}),`
|
|
130
|
+
`,(0,c.jsx)(t.li,{children:`manual redirect detection;`}),`
|
|
131
|
+
`,(0,c.jsx)(t.li,{children:`automatic SSO recovery;`}),`
|
|
132
|
+
`,(0,c.jsx)(t.li,{children:`единая HTTP error policy.`}),`
|
|
133
|
+
`]}),`
|
|
134
|
+
`,(0,c.jsxs)(t.p,{children:[`Base URL передаётся как пустая строка, потому что path уже начинается с `,(0,c.jsx)(t.code,{children:`/sap/bc/adt`}),`.`]}),`
|
|
135
|
+
`,(0,c.jsx)(t.h2,{id:`подробный-алгоритм-parser-а`,children:`Подробный алгоритм parser-а`}),`
|
|
136
|
+
`,(0,c.jsx)(t.h3,{id:`1-пустой-документ`,children:`1. Пустой документ`}),`
|
|
137
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`parseUserTransportsXml("");
|
|
138
|
+
// []
|
|
139
|
+
|
|
140
|
+
parseUserTransportsXml(" \\n\\t");
|
|
141
|
+
// []
|
|
142
|
+
`})}),`
|
|
143
|
+
`,(0,c.jsx)(t.p,{children:`Whitespace-only input не отправляется в XML parser.`}),`
|
|
144
|
+
`,(0,c.jsx)(t.h3,{id:`2-xml-остаётся-строковым`,children:`2. XML остаётся строковым`}),`
|
|
145
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`fast-xml-parser`}),` настроен с `,(0,c.jsx)(t.code,{children:`parseTagValue: false`}),`. Значения вроде `,(0,c.jsx)(t.code,{children:`0001`}),`, `,(0,c.jsx)(t.code,{children:`D`}),` или transport number не превращаются автоматически в numbers/booleans.`]}),`
|
|
146
|
+
`,(0,c.jsx)(t.p,{children:`Это важно:`}),`
|
|
147
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-xml`,children:`<TRKORR>DEVK900001</TRKORR>
|
|
148
|
+
`})}),`
|
|
149
|
+
`,(0,c.jsx)(t.p,{children:`должен остаться exact identifier, а не пройти numeric coercion.`}),`
|
|
150
|
+
`,(0,c.jsx)(t.h3,{id:`3-поиск-всех-headers`,children:`3. Поиск всех headers`}),`
|
|
151
|
+
`,(0,c.jsxs)(t.p,{children:[`Parser собирает каждый nested value по key `,(0,c.jsx)(t.code,{children:`CTS_REQ_HEADER`}),`. Один XML parser может представить:`]}),`
|
|
152
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
153
|
+
`,(0,c.jsx)(t.li,{children:`один header как object;`}),`
|
|
154
|
+
`,(0,c.jsx)(t.li,{children:`несколько соседних headers как array;`}),`
|
|
155
|
+
`,(0,c.jsx)(t.li,{children:`headers внутри дополнительных wrappers.`}),`
|
|
156
|
+
`]}),`
|
|
157
|
+
`,(0,c.jsx)(t.p,{children:`Оба случая нормализуются к одному массиву.`}),`
|
|
158
|
+
`,(0,c.jsx)(t.h3,{id:`4-runtime-narrowing`,children:`4. Runtime narrowing`}),`
|
|
159
|
+
`,(0,c.jsx)(t.p,{children:`Любой найденный value сначала проверяется как record. Primitive/null не превращаются в transport.`}),`
|
|
160
|
+
`,(0,c.jsx)(t.h3,{id:`5-нормализация-text`,children:`5. Нормализация text`}),`
|
|
161
|
+
`,(0,c.jsx)(t.p,{children:`Все SAP fields проходят text normalization:`}),`
|
|
162
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`" DEVK900001 " -> "DEVK900001"
|
|
163
|
+
" " -> undefined
|
|
164
|
+
null -> undefined
|
|
165
|
+
`})}),`
|
|
166
|
+
`,(0,c.jsxs)(t.p,{children:[`Запись без `,(0,c.jsx)(t.code,{children:`transportNo`}),` отбрасывается полностью.`]}),`
|
|
167
|
+
`,(0,c.jsx)(t.h3,{id:`6-дедупликация`,children:`6. Дедупликация`}),`
|
|
168
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`parseUserTransportsXml(\`
|
|
169
|
+
<root>
|
|
170
|
+
<CTS_REQ_HEADER>
|
|
171
|
+
<TRKORR>DEVK900001</TRKORR>
|
|
172
|
+
<AS4TEXT>Первое описание</AS4TEXT>
|
|
173
|
+
</CTS_REQ_HEADER>
|
|
174
|
+
<CTS_REQ_HEADER>
|
|
175
|
+
<TRKORR>DEVK900001</TRKORR>
|
|
176
|
+
<AS4TEXT>Второе описание</AS4TEXT>
|
|
177
|
+
</CTS_REQ_HEADER>
|
|
178
|
+
</root>
|
|
179
|
+
\`);
|
|
180
|
+
`})}),`
|
|
181
|
+
`,(0,c.jsx)(t.p,{children:`Вернёт первую запись. Parser не объединяет optional fields дубликатов.`}),`
|
|
182
|
+
`,(0,c.jsxs)(t.h3,{id:`7-fallback-без-cts_req_header`,children:[`7. Fallback без `,(0,c.jsx)(t.code,{children:`CTS_REQ_HEADER`})]}),`
|
|
183
|
+
`,(0,c.jsxs)(t.p,{children:[`Некоторые responses содержат только nested `,(0,c.jsx)(t.code,{children:`TRKORR`}),`. Тогда parser формирует минимальные records:`]}),`
|
|
184
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`parseUserTransportsXml(\`
|
|
185
|
+
<root>
|
|
186
|
+
<RESULT><TRKORR>DEVK900003</TRKORR></RESULT>
|
|
187
|
+
<RESULT><TRKORR>DEVK900004</TRKORR></RESULT>
|
|
188
|
+
</root>
|
|
189
|
+
\`);
|
|
190
|
+
`})}),`
|
|
191
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`[
|
|
192
|
+
{
|
|
193
|
+
transportNo: "DEVK900003",
|
|
194
|
+
description: undefined,
|
|
195
|
+
owner: undefined,
|
|
196
|
+
targetSystem: undefined,
|
|
197
|
+
functionCode: undefined,
|
|
198
|
+
statusCode: undefined,
|
|
199
|
+
parentTransportNo: undefined
|
|
200
|
+
},
|
|
201
|
+
// ...
|
|
202
|
+
]
|
|
203
|
+
`})}),`
|
|
204
|
+
`,(0,c.jsx)(t.p,{children:`Fallback включается только если ни одного корректного header record не найдено.`}),`
|
|
205
|
+
`,(0,c.jsx)(t.h2,{id:`использование-с-tanstack-query`,children:`Использование с TanStack Query`}),`
|
|
206
|
+
`,(0,c.jsx)(t.p,{children:`Модуль не навязывает query key/stale policy. Их определяет feature:`}),`
|
|
207
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { queryOptions, useQuery } from "@tanstack/react-query";
|
|
208
|
+
import { fetchUserTransports } from "@ryuzaki13/react-foundation-api/adt";
|
|
209
|
+
|
|
210
|
+
const adtTransportKeys = {
|
|
211
|
+
all: ["adt-transports"] as const,
|
|
212
|
+
list: () => [...adtTransportKeys.all, "list"] as const
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
export const adtTransportsQueryOptions = () =>
|
|
216
|
+
queryOptions({
|
|
217
|
+
queryKey: adtTransportKeys.list(),
|
|
218
|
+
queryFn: fetchUserTransports,
|
|
219
|
+
staleTime: 5 * 60 * 1000
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
function TransportSelect() {
|
|
223
|
+
const query = useQuery(adtTransportsQueryOptions());
|
|
224
|
+
|
|
225
|
+
if (query.isPending) return <p>Загрузка транспортов…</p>;
|
|
226
|
+
if (query.isError) return <p>{query.error.message}</p>;
|
|
227
|
+
if (query.data.length === 0) return <p>Доступных транспортов нет</p>;
|
|
228
|
+
|
|
229
|
+
return (
|
|
230
|
+
<select>
|
|
231
|
+
{query.data.map((item) => (
|
|
232
|
+
<option key={item.transportNo} value={item.transportNo}>
|
|
233
|
+
{item.transportNo}
|
|
234
|
+
{item.description ? \` — \${item.description}\` : ""}
|
|
235
|
+
</option>
|
|
236
|
+
))}
|
|
237
|
+
</select>
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
`})}),`
|
|
241
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`fetchUserTransports`}),` не принимает `,(0,c.jsx)(t.code,{children:`AbortSignal`}),`, поэтому query cancellation не прерывает underlying fetch через этот API. Не обещайте UI мгновенный transport abort. Если это станет обязательным, контракт должен быть расширен в package.`]}),`
|
|
242
|
+
`,(0,c.jsx)(t.p,{children:`Query key не должен содержать user secrets. Если список зависит от logged-in user, смена user/session должна сопровождаться очисткой auth-sensitive Query cache на project boundary.`}),`
|
|
243
|
+
`,(0,c.jsx)(t.h2,{id:`parent-request-и-task`,children:`Parent request и task`}),`
|
|
244
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`parentTransportNo`}),` обычно помогает отличить task от верхнеуровневого request:`]}),`
|
|
245
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function getTransportLabel(transport: UserTransport) {
|
|
246
|
+
const kind = transport.parentTransportNo ? "Задача" : "Запрос";
|
|
247
|
+
return \`\${kind}: \${transport.transportNo}\`;
|
|
248
|
+
}
|
|
249
|
+
`})}),`
|
|
250
|
+
`,(0,c.jsx)(t.p,{children:`Это только presentation inference. Модуль не интерпретирует SAP status/function codes и не гарантирует бизнес-классификацию. Для правил конкретной системы используйте domain mapping приложения.`}),`
|
|
251
|
+
`,(0,c.jsx)(t.h2,{id:`тестирование`,children:`Тестирование`}),`
|
|
252
|
+
`,(0,c.jsx)(t.p,{children:`Parser — pure function, поэтому тестируйте fixtures без network:`}),`
|
|
253
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { describe, expect, it } from "vitest";
|
|
254
|
+
import { parseUserTransportsXml } from "@ryuzaki13/react-foundation-api/adt";
|
|
255
|
+
|
|
256
|
+
it("сохраняет leading zeros и optional fields", () => {
|
|
257
|
+
const result = parseUserTransportsXml(\`
|
|
258
|
+
<root>
|
|
259
|
+
<CTS_REQ_HEADER>
|
|
260
|
+
<TRKORR>DEVK900001</TRKORR>
|
|
261
|
+
<TRSTATUS>D</TRSTATUS>
|
|
262
|
+
</CTS_REQ_HEADER>
|
|
263
|
+
</root>
|
|
264
|
+
\`);
|
|
265
|
+
|
|
266
|
+
expect(result).toEqual([
|
|
267
|
+
{
|
|
268
|
+
transportNo: "DEVK900001",
|
|
269
|
+
description: undefined,
|
|
270
|
+
owner: undefined,
|
|
271
|
+
targetSystem: undefined,
|
|
272
|
+
functionCode: undefined,
|
|
273
|
+
statusCode: "D",
|
|
274
|
+
parentTransportNo: undefined
|
|
275
|
+
}
|
|
276
|
+
]);
|
|
277
|
+
});
|
|
278
|
+
`})}),`
|
|
279
|
+
`,(0,c.jsx)(t.p,{children:`Минимальный набор cases:`}),`
|
|
280
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
281
|
+
`,(0,c.jsx)(t.li,{children:`single header;`}),`
|
|
282
|
+
`,(0,c.jsx)(t.li,{children:`array headers;`}),`
|
|
283
|
+
`,(0,c.jsx)(t.li,{children:`nested wrappers/namespaces;`}),`
|
|
284
|
+
`,(0,c.jsx)(t.li,{children:`duplicate number;`}),`
|
|
285
|
+
`,(0,c.jsx)(t.li,{children:`whitespace fields;`}),`
|
|
286
|
+
`,(0,c.jsx)(t.li,{children:`empty XML;`}),`
|
|
287
|
+
`,(0,c.jsxs)(t.li,{children:[`fallback `,(0,c.jsx)(t.code,{children:`TRKORR`}),`;`]}),`
|
|
288
|
+
`,(0,c.jsx)(t.li,{children:`malformed XML и ожидаемая ошибка.`}),`
|
|
289
|
+
`]}),`
|
|
290
|
+
`,(0,c.jsxs)(t.p,{children:[`Для transport integration mock-айте `,(0,c.jsx)(t.code,{children:`fetch`}),`/MSW и проверяйте Content-Type `,(0,c.jsx)(t.code,{children:`text/html`}),`, XML body и HTTP error. Не используйте real SAP credentials в tests.`]}),`
|
|
291
|
+
`,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
|
|
292
|
+
`,(0,c.jsxs)(t.h3,{id:`использовать-поля-function-и-status`,children:[`Использовать поля `,(0,c.jsx)(t.code,{children:`function`}),` и `,(0,c.jsx)(t.code,{children:`status`})]}),`
|
|
293
|
+
`,(0,c.jsxs)(t.p,{children:[`Правильные имена public contract — `,(0,c.jsx)(t.code,{children:`functionCode`}),` и `,(0,c.jsx)(t.code,{children:`statusCode`}),`.`]}),`
|
|
294
|
+
`,(0,c.jsx)(t.h3,{id:`считать-status-code-готовым-label`,children:`Считать status code готовым label`}),`
|
|
295
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`"D"`}),` остаётся строкой `,(0,c.jsx)(t.code,{children:`"D"`}),`. Расшифровка зависит от SAP contract проекта и не выполняется package-ом.`]}),`
|
|
296
|
+
`,(0,c.jsx)(t.h3,{id:`принимать-пустой-array-за-любую-ошибку`,children:`Принимать пустой array за любую ошибку`}),`
|
|
297
|
+
`,(0,c.jsxs)(t.p,{children:[`Пустой или whitespace XML даёт `,(0,c.jsx)(t.code,{children:`[]`}),`, но HTTP, HTML и malformed XML errors выбрасываются. Обрабатывайте error отдельно от empty state.`]}),`
|
|
298
|
+
`,(0,c.jsx)(t.h3,{id:`объединять-adt-и-ui2-records-без-mapper-а`,children:`Объединять ADT и UI2 records без mapper-а`}),`
|
|
299
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`/adt`}),` и `,(0,c.jsx)(t.code,{children:`/transport`}),` имеют разные source contracts. Если feature показывает их вместе, создайте явную domain model и collision policy.`]}),`
|
|
300
|
+
`,(0,c.jsx)(t.h3,{id:`deep-import-parser-а`,children:`Deep import parser-а`}),`
|
|
301
|
+
`,(0,c.jsx)(t.p,{children:`Используйте только:`}),`
|
|
302
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { parseUserTransportsXml } from "@ryuzaki13/react-foundation-api/adt";
|
|
303
|
+
`})}),`
|
|
304
|
+
`,(0,c.jsx)(t.h2,{id:`ошибки-и-ограничения`,children:`Ошибки и ограничения`}),`
|
|
305
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
306
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`fast-xml-parser`}),` должен быть установлен в host, использующем этот entrypoint.`]}),`
|
|
307
|
+
`,(0,c.jsx)(t.li,{children:`Это не generic ADT client: endpoint и query parameters зафиксированы.`}),`
|
|
308
|
+
`,(0,c.jsx)(t.li,{children:`Функция не создаёт/не освобождает transport и не проверяет authorization.`}),`
|
|
309
|
+
`,(0,c.jsxs)(t.li,{children:[`SSO/cookies требуют browser/proxy окружения SAP. На server runtime поведение зависит от переданного глобального `,(0,c.jsx)(t.code,{children:`fetch`}),` и cookie boundary.`]}),`
|
|
310
|
+
`,(0,c.jsxs)(t.li,{children:[`HTML-response, HTTP error и XML parse error не превращаются в `,(0,c.jsx)(t.code,{children:`[]`}),`.`]}),`
|
|
311
|
+
`,(0,c.jsxs)(t.li,{children:[`Дедупликация выполняется только по `,(0,c.jsx)(t.code,{children:`transportNo`}),` и сохраняет первую найденную запись.`]}),`
|
|
312
|
+
`]}),`
|
|
313
|
+
`,(0,c.jsx)(t.h2,{id:`faq`,children:`FAQ`}),`
|
|
314
|
+
`,(0,c.jsx)(t.h3,{id:`можно-ли-передать-другой-endpoint`,children:`Можно ли передать другой endpoint?`}),`
|
|
315
|
+
`,(0,c.jsxs)(t.p,{children:[`Нет. `,(0,c.jsx)(t.code,{children:`fetchUserTransports`}),` — конкретный ADT use case с фиксированным endpoint.`]}),`
|
|
316
|
+
`,(0,c.jsx)(t.h3,{id:`можно-ли-получить-только-transports-конкретного-owner`,children:`Можно ли получить только transports конкретного owner?`}),`
|
|
317
|
+
`,(0,c.jsx)(t.p,{children:`Не через текущий public API. Фильтруйте result локально либо расширьте package contract, если server-side filter является общей потребностью.`}),`
|
|
318
|
+
`,(0,c.jsx)(t.h3,{id:`parser-меняет-исходную-xml-string`,children:`Parser меняет исходную XML string?`}),`
|
|
319
|
+
`,(0,c.jsx)(t.p,{children:`Нет. Он создаёт новые JS objects.`}),`
|
|
320
|
+
`,(0,c.jsxs)(t.h3,{id:`почему-optional-fields-явно-содержат-undefined`,children:[`Почему optional fields явно содержат `,(0,c.jsx)(t.code,{children:`undefined`}),`?`]}),`
|
|
321
|
+
`,(0,c.jsxs)(t.p,{children:[`Таков стабильный `,(0,c.jsx)(t.code,{children:`UserTransport`}),` shape. Consumer может безопасно destructure поля без проверки их наличия как properties.`]}),`
|
|
322
|
+
`,(0,c.jsx)(t.h3,{id:`работает-ли-в-node`,children:`Работает ли в Node?`}),`
|
|
323
|
+
`,(0,c.jsxs)(t.p,{children:[`Pure parser работает при наличии `,(0,c.jsx)(t.code,{children:`fast-xml-parser`}),`. Network function зависит от общего SAP transport, URL/cookies/build constants и в первую очередь рассчитана на browser application.`]}),`
|
|
324
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
325
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fetchUserTransports`})}),(0,c.jsx)(t.td,{children:`Загружает и разбирает ADT XML`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseUserTransportsXml`})}),(0,c.jsx)(t.td,{children:`Преобразует XML string в массив`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`UserTransport`})}),(0,c.jsx)(t.td,{children:`Контракт результата`})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|