@ryuzaki13/react-foundation-ui 1.8.11 → 1.8.12
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/defaultRenderers-u_Vep6Pj.js.map +1 -1
- package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -1
- package/dist/chunks/select-MN6zDPKM.js.map +1 -1
- package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
- package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
- package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/defaultRenderers.d.ts +1 -1
- package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
- package/dist/select/model/useODataSelect.d.ts +1 -1
- package/dist/select/model/useODataSelect.d.ts.map +1 -1
- package/dist/select/model/useODataSelectBase.d.ts +1 -1
- package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
- package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
- package/package.json +3 -3
- package/storybook-static/assets/{Badge-BojMuOws.js → Badge-CveIo2LZ.js} +1 -1
- package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-Bd8M64xJ.js} +1 -1
- package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-xT41a0VL.js} +1 -1
- package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-C5bBSb3k.js} +1 -1
- package/storybook-static/assets/{Button-CrTHXWYk.js → Button-DkDgfpHL.js} +1 -1
- package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-CeKPeGK5.js} +1 -1
- package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-CEqcrblx.js} +1 -1
- package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-DKeFkdOt.js} +1 -1
- package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-OVvAarW-.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-CfZ0p1yo.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-BWW7zrfs.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-kia7is1N.js} +1 -1
- package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-xn2GtiLR.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-CYuy9uXF.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-C4w-APws.js} +1 -1
- package/storybook-static/assets/DateInput-BiUFIihm.js +1 -0
- package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DAzE5mCE.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-BcowGCRD.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-CQm4dNLR.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-RIyqNBk9.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ypGyuGfy.js} +1 -1
- package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CEypL2Nh.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-DNkT7B-u.js} +1 -1
- package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-BVFFQJDH.js} +1 -1
- package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DD0grLG3.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-DSCypHqR.js} +1 -1
- package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-DauUgrev.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-B1qB8vQZ.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-D9oCCeHf.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-CmSf6tXp.js} +1 -1
- package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-D42ueN1w.js} +1 -1
- package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-D8hbPCAv.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-DO-T_Bh4.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-CknJDoji.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-Dqi_bo3c.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-BD9QZGZN.js} +1 -1
- package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CaVn1IOP.js} +1 -1
- package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-Bp9Y6q6b.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-U7tx-Jlw.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-pmmhsAbN.js} +1 -1
- package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-CEpMNurH.js} +1 -1
- package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-BM-gO5DN.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-BWz5XU6U.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-BTYZEX5t.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-Dz2STM95.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DBVe0an3.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories-C4Px97lD.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-TJtlJVfa.js} +1 -1
- package/storybook-static/assets/{Input-op4j7Beh.js → Input-CIPgijvW.js} +1 -1
- package/storybook-static/assets/{Input-BUDNR96c.js → Input-D8io9jVS.js} +1 -1
- package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-SUk3aYaC.js} +1 -1
- package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-DA5pIDuE.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-DeudzDSU.js} +1 -1
- package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-C5mp5Y5I.js} +1 -1
- package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-CGAC7ruP.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-Cx1xQ6PE.js} +1 -1
- package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-B7OBcPJN.js} +1 -1
- package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-Hzl89Ghf.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-CG6QjDZH.js} +1 -1
- package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-B6htWHF1.js} +1 -1
- package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-BTa4S4Wp.js} +1 -1
- package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-CQnoblAE.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-CEI44Eyz.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-B0ypWz1x.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-BadApta9.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-COB9GlV_.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-C_Uz7Tnj.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories-Btp0IcaL.js} +1 -1
- package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-AAaZGSAl.js} +1 -1
- package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-CyfuZw7w.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-NDKQmjyQ.js} +1 -1
- package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-BJDnJ4zv.js} +1 -1
- package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-D_X5lTLO.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-ShDjozpW.js} +1 -1
- package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-B5CElQ3-.js} +1 -1
- package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-DqXfrjcH.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-fB3mcFmx.js} +1 -1
- package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-DDb0G7T8.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-CIGL-pKX.js} +1 -1
- package/storybook-static/assets/NotificationsHost.stories-B_MRb3fs.js +29 -0
- package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-DQAitH4N.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-DwW221S9.js} +2 -2
- package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-tiZhOIhE.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-BhaatPjK.js} +2 -2
- package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-B9WqJ-Un.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-CAfKuhfU.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-Cel1phxZ.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-BpBCpBA9.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-BSeGbz02.js} +1 -1
- package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-BBtQ3GdK.js} +1 -1
- package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-B9nZuqqW.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-BGvhR3to.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DA_zjcdA.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-DDP1eXyM.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-BgvzqRBd.js} +1 -1
- package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-BQql18MF.js} +1 -1
- package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-C0NebUMz.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-CIyDUtlz.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-BsgzPwCV.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-htbxc3ni.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-ClHM5Kah.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-Dcx0BOTx.js} +1 -1
- package/storybook-static/assets/README--LCKbep-.js +110 -0
- package/storybook-static/assets/{README-DRnlD7y8.js → README-5M8ajrJp.js} +1 -1
- package/storybook-static/assets/README-5NhzH8VL.js +95 -0
- package/storybook-static/assets/README-Am6Fa6-b.js +69 -0
- package/storybook-static/assets/README-B3bFglqG.js +82 -0
- package/storybook-static/assets/README-B45Cwj2a.js +95 -0
- package/storybook-static/assets/README-B6Nq7NCU.js +416 -0
- package/storybook-static/assets/{README-B4zYJg6u.js → README-B6ltJiw3.js} +1 -1
- package/storybook-static/assets/{README-BdPlV5nA.js → README-BB_JPejH.js} +1 -1
- package/storybook-static/assets/README-BIq-FXcN.js +2124 -0
- package/storybook-static/assets/README-BSh5XUR9.js +110 -0
- package/storybook-static/assets/README-BXJneZAJ.js +147 -0
- package/storybook-static/assets/README-BYSgTTZt.js +296 -0
- package/storybook-static/assets/{README-BzVni2ve.js → README-BmhhWWEk.js} +1 -1
- package/storybook-static/assets/README-Bqnqu1bC.js +118 -0
- package/storybook-static/assets/README-BuMMG4_N.js +192 -0
- package/storybook-static/assets/README-BxjYCoYA.js +186 -0
- package/storybook-static/assets/{README-MzcO5Z_P.js → README-ByALXSEH.js} +1 -1
- package/storybook-static/assets/README-Byo6DxIF.js +101 -0
- package/storybook-static/assets/README-C3UcjOGB.js +208 -0
- package/storybook-static/assets/README-C6BOdXNV.js +322 -0
- package/storybook-static/assets/README-C8E1O7DQ.js +230 -0
- package/storybook-static/assets/README-C9eh0JLs.js +64 -0
- package/storybook-static/assets/README-CAGQnLsv.js +90 -0
- package/storybook-static/assets/README-CC00hlZK.js +527 -0
- package/storybook-static/assets/README-CH_6ZIO2.js +64 -0
- package/storybook-static/assets/README-CHbo4O3Z.js +75 -0
- package/storybook-static/assets/{README-CTIBG4zH.js → README-CIGfHKKE.js} +1 -1
- package/storybook-static/assets/{README-BHw6MVjD.js → README-CM-7E-Jf.js} +1 -1
- package/storybook-static/assets/{README-C0BwTe5N.js → README-CNHemCS2.js} +1 -1
- package/storybook-static/assets/{README-DzTc6XmY.js → README-CWfPiPIB.js} +1 -1
- package/storybook-static/assets/{README-Dx3cpFMr.js → README-CeK4kfFO.js} +1 -1
- package/storybook-static/assets/README-Cj2e6HrF.js +178 -0
- package/storybook-static/assets/README-CsoHGRve.js +1844 -0
- package/storybook-static/assets/README-D9OypaFB.js +208 -0
- package/storybook-static/assets/{README-CkWglKbS.js → README-DDBqoI-T.js} +1 -1
- package/storybook-static/assets/README-DE2wk9-v.js +1282 -0
- package/storybook-static/assets/README-DEj2wSK0.js +264 -0
- package/storybook-static/assets/{README-D-XjRtAE.js → README-DIbfpC-2.js} +1 -1
- package/storybook-static/assets/{README-Dki94Nf2.js → README-DJHVgrpj.js} +1 -1
- package/storybook-static/assets/README-DN9HKtp_.js +124 -0
- package/storybook-static/assets/README-DNricOkt.js +136 -0
- package/storybook-static/assets/README-DV4fCpqN.js +1146 -0
- package/storybook-static/assets/{README-BzVHwvgo.js → README-DjCArsA5.js} +1 -1
- package/storybook-static/assets/README-Dl92E69Z.js +1704 -0
- package/storybook-static/assets/README-DnA-4W65.js +226 -0
- package/storybook-static/assets/README-DoCA4JXf.js +273 -0
- package/storybook-static/assets/{README-DqQDgJN-.js → README-DvAlDsh9.js} +1 -1
- package/storybook-static/assets/README-Ss-3t1nX.js +158 -0
- package/storybook-static/assets/README-eHCINzP3.js +154 -0
- package/storybook-static/assets/README-qHKxXU95.js +98 -0
- package/storybook-static/assets/README-tm9QH9cF.js +103 -0
- package/storybook-static/assets/README-ui-uanyg.js +672 -0
- package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-CWtjclwT.js} +1 -1
- package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-YIQXt0wx.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-Ah-CBpeC.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BnO-GL7A.js} +1 -1
- package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-CUS0etBD.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-DGwCawtU.js} +1 -1
- package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-D85fA6pO.js} +1 -1
- package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-CGCxJjL9.js} +1 -1
- package/storybook-static/assets/{Select-DQMoVjn4.js → Select-gRnfvfGh.js} +1 -1
- package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-CMwt4F9i.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-BLXfKJ38.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-Bca1a9ZU.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-CyeQN0Rd.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-xrmZckzw.js} +1 -1
- package/storybook-static/assets/SingleDateTimeInput.stories-BYFTQM9z.js +48 -0
- package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-1yJ3uVeR.js} +1 -1
- package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-D8GtXVGI.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-CyQ3ns_C.js} +1 -1
- package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BOzHhEUA.js} +1 -1
- package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-ISSx9vH_.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-7ooTghrS.js} +1 -1
- package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CCLiMmfZ.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-B36szI6t.js} +1 -1
- package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-DQGhgRwx.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-Hsq1wYaq.js} +1 -1
- package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-C6hldFgO.js} +1 -1
- package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-DieNn4VC.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-CvAhDMix.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-CUT1tvt-.js} +1 -1
- package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch-CX9p_uYU.js} +1 -1
- package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-nEMRtcWe.js} +1 -1
- package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-CPsHa2_m.js} +1 -1
- package/storybook-static/assets/{Table-BFAEcUde.js → Table-BhtITVtj.js} +1 -1
- package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-nWNhSydG.js} +2 -2
- package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-DMQFh2BJ.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-D23_xvom.js} +1 -1
- package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-B5BsD_j_.js} +1 -1
- package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-DO17z100.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-CMMFnIzb.js} +1 -1
- package/storybook-static/assets/{Text-DK4jN26J.js → Text-ClnbDqRk.js} +1 -1
- package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-C2IO_zsP.js} +1 -1
- package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-DkhohiNc.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-NL6Aq8Vc.js} +1 -1
- package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-DNEPDlSW.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-DlfdPsz1.js} +1 -1
- package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-3U5CceQN.js} +1 -1
- package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-Cc6Ca-HI.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-BR-hVLDp.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-B0oBc-4y.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-D9hMQN2O.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CslpbvPR.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-B_dMCe45.js} +1 -1
- package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-2lj0Q8gm.js} +1 -1
- package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-DEKNYF2b.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-CVDxn8Vm.js} +1 -1
- package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-CBIpzYRL.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-BMzrr2Kc.js} +2 -2
- package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-B5YBxaaS.js} +3 -3
- package/storybook-static/assets/{check-CLkTJVXe.js → check-BjtdCRaW.js} +1 -1
- package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-B4u-y8Z1.js} +1 -1
- package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-BQfWs7Ah.js} +1 -1
- package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-ChokKd-f.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-meOkhzk4.js} +1 -1
- package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B1AnDRf_.js} +1 -1
- package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-JYnlcC1F.js} +1 -1
- package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-C_wl1sL5.js} +3 -3
- package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B-TUGs_1.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
- package/storybook-static/assets/{download-eAKjms6q.js → download-eR3X8I-h.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-D95VPQ0b.js} +1 -1
- package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
- package/storybook-static/assets/foundationApi-QhHXpYLB.js +59 -0
- package/storybook-static/assets/foundationLib-CEAjnstw.js +30 -0
- package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-awde7r2r.js} +1 -1
- package/storybook-static/assets/iframe-DzQq_POR.js +1 -0
- package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-FSp_AjJa.js} +4 -4
- package/storybook-static/assets/{info-DhJTzwcL.js → info-12vmb1sT.js} +1 -1
- package/storybook-static/assets/odata-C0Kpvttz.js +1 -0
- package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
- package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-BXZnk_C7.js} +1 -1
- package/storybook-static/assets/{react-YFbUKK0m.js → react-BlCqWuXr.js} +1 -1
- package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-Bf5ufPte.js} +1 -1
- package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-DR-dTXIC.js} +1 -1
- package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-B5e5yb_-.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-EVJARTec.js} +1 -1
- package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-QP7TS18H.js} +1 -1
- package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-qw19mxHr.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-Csu_Cct9.js} +1 -1
- package/storybook-static/assets/useODataTreeData-BAv-Twqf.js +1 -0
- package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-Da-XM_Y0.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-C0TdC2Pz.js} +1 -1
- package/storybook-static/assets/{x-CqPSvWfo.js → x-aCjYTirW.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/DateInput-05Iy69_a.js +0 -1
- package/storybook-static/assets/NotificationsHost.stories-CgbFboVD.js +0 -29
- package/storybook-static/assets/SingleDateTimeInput.stories-C2RuBRAF.js +0 -48
- package/storybook-static/assets/async-SjiCjIjO.js +0 -625
- package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
- package/storybook-static/assets/foundationLib-DRrox3tN.js +0 -25
- package/storybook-static/assets/iframe-DQo-3eW2.js +0 -1
- package/storybook-static/assets/odata-DhISMZkE.js +0 -1
- package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
- package/storybook-static/assets/odataFetchFn-Dv6Xi5CI.js +0 -763
- package/storybook-static/assets/persisted-CUFiw53N.js +0 -600
- package/storybook-static/assets/useODataTreeData-CKuavbWc.js +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,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/String Comparison`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`сравнение-строк-через-ryuzaki13react-foundation-libstring-comparison`,children:[`Сравнение строк через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/string-comparison`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`compareStrings`}),` задаёт единый порядок строк для русскоязычных UI-списков, смешанной кириллицы/латиницы и числовых суффиксов.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
5
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { compareStrings } from "@ryuzaki13/react-foundation-lib/string-comparison";
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль использует стандартный `,(0,c.jsx)(t.code,{children:`Intl.Collator`}),` и не зависит от React.`]}),`
|
|
8
|
+
`,(0,c.jsx)(t.h2,{id:`использование`,children:`Использование`}),`
|
|
9
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const names = ["item10", "item2", "item1"];
|
|
10
|
+
const sorted = [...names].sort(compareStrings);
|
|
11
|
+
|
|
12
|
+
console.log(sorted); // ["item1", "item2", "item10"].
|
|
13
|
+
console.log(names); // Исходный массив не изменён из-за [...names].
|
|
14
|
+
`})}),`
|
|
15
|
+
`,(0,c.jsxs)(t.p,{children:[`Важно: сам `,(0,c.jsx)(t.code,{children:`Array.prototype.sort`}),` мутирует массив. `,(0,c.jsx)(t.code,{children:`compareStrings`}),` только comparator.`]}),`
|
|
16
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`names.sort(compareStrings); // names изменится.
|
|
17
|
+
`})}),`
|
|
18
|
+
`,(0,c.jsx)(t.h2,{id:`правила-сравнения`,children:`Правила сравнения`}),`
|
|
19
|
+
`,(0,c.jsx)(t.p,{children:`Основной collator настроен так:`}),`
|
|
20
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`new Intl.Collator("ru-RU", {
|
|
21
|
+
usage: "sort",
|
|
22
|
+
sensitivity: "base",
|
|
23
|
+
numeric: true
|
|
24
|
+
});
|
|
25
|
+
`})}),`
|
|
26
|
+
`,(0,c.jsx)(t.p,{children:`Это означает:`}),`
|
|
27
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
28
|
+
`,(0,c.jsxs)(t.li,{children:[`locale фиксирован как `,(0,c.jsx)(t.code,{children:`ru-RU`}),`, а не зависит от системного языка;`]}),`
|
|
29
|
+
`,(0,c.jsxs)(t.li,{children:[`числовые части сравниваются как числа: `,(0,c.jsx)(t.code,{children:`item2`}),` раньше `,(0,c.jsx)(t.code,{children:`item10`}),`;`]}),`
|
|
30
|
+
`,(0,c.jsx)(t.li,{children:`основной проход не различает регистр и часть диакритики;`}),`
|
|
31
|
+
`,(0,c.jsx)(t.li,{children:`если collator считает разные строки равными, применяется строгий UTF-16 fallback;`}),`
|
|
32
|
+
`,(0,c.jsxs)(t.li,{children:[`результат нормализуется до `,(0,c.jsx)(t.code,{children:`-1`}),`, `,(0,c.jsx)(t.code,{children:`0`}),` или `,(0,c.jsx)(t.code,{children:`1`}),`.`]}),`
|
|
33
|
+
`]}),`
|
|
34
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`["a", "A"].sort(compareStrings); // ["A", "a"].
|
|
35
|
+
`})}),`
|
|
36
|
+
`,(0,c.jsx)(t.p,{children:`UTF-16 fallback нужен для детерминированного порядка, а не для лингвистической оценки регистра.`}),`
|
|
37
|
+
`,(0,c.jsx)(t.h2,{id:`контракт-comparator`,children:`Контракт comparator`}),`
|
|
38
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function compareStrings(left: string, right: string): number;
|
|
39
|
+
`})}),`
|
|
40
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{style:{textAlign:`right`},children:`Результат`}),(0,c.jsx)(t.th,{children:`Значение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{style:{textAlign:`right`},children:(0,c.jsx)(t.code,{children:`-1`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`left`}),` должен находиться раньше `,(0,c.jsx)(t.code,{children:`right`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{style:{textAlign:`right`},children:(0,c.jsx)(t.code,{children:`0`})}),(0,c.jsx)(t.td,{children:`строки полностью равны для итогового comparator`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{style:{textAlign:`right`},children:(0,c.jsx)(t.code,{children:`1`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`left`}),` должен находиться позже `,(0,c.jsx)(t.code,{children:`right`})]})]})]})]}),`
|
|
41
|
+
`,(0,c.jsx)(t.p,{children:`Подходящие места:`}),`
|
|
42
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
43
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`array.sort`}),` / `,(0,c.jsx)(t.code,{children:`toSorted`}),`;`]}),`
|
|
44
|
+
`,(0,c.jsx)(t.li,{children:`сортировка labels справочника;`}),`
|
|
45
|
+
`,(0,c.jsx)(t.li,{children:`предсказуемый порядок смешанных технических и русских названий;`}),`
|
|
46
|
+
`,(0,c.jsx)(t.li,{children:`tie-breaker после бизнес-сортировки.`}),`
|
|
47
|
+
`]}),`
|
|
48
|
+
`,(0,c.jsx)(t.h2,{id:`ограничения`,children:`Ограничения`}),`
|
|
49
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
50
|
+
`,(0,c.jsxs)(t.li,{children:[`Аргументы должны быть strings; функция не приводит `,(0,c.jsx)(t.code,{children:`null`}),`/число.`]}),`
|
|
51
|
+
`,(0,c.jsxs)(t.li,{children:[`Это UI-сортировка, а не database collation или backend `,(0,c.jsx)(t.code,{children:`$orderby`}),`.`]}),`
|
|
52
|
+
`,(0,c.jsx)(t.li,{children:`Не используйте comparator для equality/identity: разные строки могут быть близки по основной collation.`}),`
|
|
53
|
+
`,(0,c.jsx)(t.li,{children:`Порядок не является Unicode normalization; при необходимости нормализуйте вход на явной boundary.`}),`
|
|
54
|
+
`,(0,c.jsx)(t.li,{children:`Для server-side таблицы сортировку полного набора должен выполнять backend, а не одна загруженная страница.`}),`
|
|
55
|
+
`,(0,c.jsxs)(t.li,{children:[`Runtime должен поддерживать `,(0,c.jsx)(t.code,{children:`Intl.Collator`}),` и locale data `,(0,c.jsx)(t.code,{children:`ru-RU`}),`.`]}),`
|
|
56
|
+
`]}),`
|
|
57
|
+
`,(0,c.jsx)(t.h2,{id:`пример-с-объектами`,children:`Пример с объектами`}),`
|
|
58
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type Option = { id: string; label: string };
|
|
59
|
+
|
|
60
|
+
const sortedOptions = options.toSorted((left, right) => {
|
|
61
|
+
const byLabel = compareStrings(left.label, right.label);
|
|
62
|
+
return byLabel !== 0 ? byLabel : compareStrings(left.id, right.id);
|
|
63
|
+
});
|
|
64
|
+
`})})]})}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};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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
|
+
`,(0,c.jsxs)(t.h1,{id:`чтение-первой-ошибки-формы-через-ryuzaki13react-foundation-libform`,children:[`Чтение первой ошибки формы через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/form`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит одну функцию `,(0,c.jsx)(t.code,{children:`readFirstFormError`}),`. Она получает неоднородный массив ошибок и возвращает первое найденное текстовое сообщение.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
5
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { readFirstFormError } from "@ryuzaki13/react-foundation-lib/form";
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.p,{children:`Модуль ESM, не зависит от React и не привязан к конкретной form library.`}),`
|
|
8
|
+
`,(0,c.jsx)(t.h2,{id:`поддерживаемые-формы-ошибки`,children:`Поддерживаемые формы ошибки`}),`
|
|
9
|
+
`,(0,c.jsx)(t.p,{children:`Функция понимает:`}),`
|
|
10
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:`Строку.`}),`
|
|
12
|
+
`,(0,c.jsxs)(t.li,{children:[`Объект с непустым строковым полем `,(0,c.jsx)(t.code,{children:`message`}),`.`]}),`
|
|
13
|
+
`,(0,c.jsx)(t.li,{children:`Вложенный массив таких значений.`}),`
|
|
14
|
+
`]}),`
|
|
15
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`readFirstFormError([undefined, { message: "Поле обязательно" }]);
|
|
16
|
+
// "Поле обязательно".
|
|
17
|
+
|
|
18
|
+
readFirstFormError([[null, "Неверный формат"], "Другая ошибка"]);
|
|
19
|
+
// "Неверный формат".
|
|
20
|
+
`})}),`
|
|
21
|
+
`,(0,c.jsxs)(t.p,{children:[`Обычный `,(0,c.jsx)(t.code,{children:`Error`}),` также подходит, потому что имеет строковое поле `,(0,c.jsx)(t.code,{children:`message`}),`:`]}),`
|
|
22
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`readFirstFormError([new Error("Ошибка проверки")]);
|
|
23
|
+
// "Ошибка проверки".
|
|
24
|
+
`})}),`
|
|
25
|
+
`,(0,c.jsx)(t.h2,{id:`алгоритм`,children:`Алгоритм`}),`
|
|
26
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`errors отсутствует ──► undefined
|
|
27
|
+
│
|
|
28
|
+
▼
|
|
29
|
+
обход слева направо
|
|
30
|
+
│
|
|
31
|
+
├─ string ─────────► вернуть строку
|
|
32
|
+
├─ array ──────────► рекурсивно найти первую строку
|
|
33
|
+
├─ { message } ────► вернуть непустой string message
|
|
34
|
+
└─ другое ─────────► пропустить
|
|
35
|
+
`})}),`
|
|
36
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const message = readFirstFormError(errors);
|
|
37
|
+
|
|
38
|
+
if (message) {
|
|
39
|
+
showFieldError(message);
|
|
40
|
+
}
|
|
41
|
+
`})}),`
|
|
42
|
+
`,(0,c.jsx)(t.h2,{id:`точные-правила`,children:`Точные правила`}),`
|
|
43
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
44
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`undefined`}),` вместо массива возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
45
|
+
`,(0,c.jsxs)(t.li,{children:[`Пустой массив возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
46
|
+
`,(0,c.jsx)(t.li,{children:`Поиск идёт в исходном порядке.`}),`
|
|
47
|
+
`,(0,c.jsx)(t.li,{children:`Пустая строка не является результатом и поиск продолжается.`}),`
|
|
48
|
+
`,(0,c.jsx)(t.li,{children:`Строка из пробелов считается непустой и возвращается буквально.`}),`
|
|
49
|
+
`,(0,c.jsxs)(t.li,{children:[`Числа, boolean, functions, `,(0,c.jsx)(t.code,{children:`null`}),` и объекты без string `,(0,c.jsx)(t.code,{children:`message`}),` пропускаются.`]}),`
|
|
50
|
+
`,(0,c.jsx)(t.li,{children:`Массивы обходятся рекурсивно без ограничения глубины.`}),`
|
|
51
|
+
`,(0,c.jsx)(t.li,{children:`Входные массивы и objects не изменяются.`}),`
|
|
52
|
+
`]}),`
|
|
53
|
+
`,(0,c.jsx)(t.h2,{id:`пример-в-react`,children:`Пример в React`}),`
|
|
54
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`type FieldErrorProps = {
|
|
55
|
+
errors?: readonly unknown[];
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export function FieldError({ errors }: FieldErrorProps) {
|
|
59
|
+
const message = readFirstFormError(errors);
|
|
60
|
+
|
|
61
|
+
return message ? <p role="alert">{message}</p> : null;
|
|
62
|
+
}
|
|
63
|
+
`})}),`
|
|
64
|
+
`,(0,c.jsx)(t.p,{children:`Для нескольких ошибок, summary списка, локализации и сопоставления ошибки конкретному field нужен отдельный form-layer host-приложения.`}),`
|
|
65
|
+
`,(0,c.jsx)(t.h2,{id:`ограничения-и-ошибки`,children:`Ограничения и ошибки`}),`
|
|
66
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
67
|
+
`,(0,c.jsx)(t.li,{children:`Функция не выполняет trim или перевод сообщений.`}),`
|
|
68
|
+
`,(0,c.jsx)(t.li,{children:`Она не проверяет schema form-library.`}),`
|
|
69
|
+
`,(0,c.jsx)(t.li,{children:`Возвращается только первое сообщение; остальные теряются для этого вызова.`}),`
|
|
70
|
+
`,(0,c.jsx)(t.li,{children:`Циклический массив приведёт к бесконечной рекурсии/ошибке call stack.`}),`
|
|
71
|
+
`,(0,c.jsx)(t.li,{children:`Не передавайте backend payload напрямую без runtime-проверки и безопасного отображения.`}),`
|
|
72
|
+
`]}),`
|
|
73
|
+
`,(0,c.jsx)(t.h2,{id:`api`,children:`API`}),`
|
|
74
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function readFirstFormError(errors: readonly unknown[] | undefined): string | undefined;
|
|
75
|
+
`})})]})}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};
|
|
@@ -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-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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/Array`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`работа-с-массивами-через-ryuzaki13react-foundation-libarray`,children:[`Работа с массивами через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/array`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`array`}),` содержит небольшие типизированные функции для типовых операций с массивами:`]}),`
|
|
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-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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/Formatters/Row-Based`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`row-based-форматтеры`,children:`Row-based форматтеры`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`rowBased`}),` — небольшой runtime-слой для формул, которые вычисляют отображаемое значение одной ячейки на основании других полей той же строки.`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.p,{children:[`Он используется шагом `,(0,c.jsx)(t.code,{children:`rowBasedOverride`}),` в `,(0,c.jsx)(t.a,{href:`../pipeline/README.mdx`,children:`formatter pipeline`}),`. Сам модуль не содержит бизнес-формул: host-приложение создаёт их, собирает в реестр и один раз передаёт реестр библиотеке.`]}),`
|
|
@@ -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-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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/Formatters/Number`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`числовые-форматтеры`,children:`Числовые форматтеры`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль форматирует числа для интерфейса, читает распространённые SAP-подобные числовые строки и управляет реестром именованных presets.`}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Все API доступны через один публичный entrypoint:`}),`
|
|
@@ -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-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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/Formatters/Strings`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`строковые-форматтеры`,children:`Строковые форматтеры`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль содержит небольшие предсказуемые функции для подготовки пользовательского текста: обрезки пробелов, безопасного преобразования в строку, удаления ведущих нулей, сокращения длинного текста и выбора русской формы слова.`}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Все функции экспортируются через один публичный entrypoint:`}),`
|
|
@@ -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-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,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/Formatters/Date`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`даты-время-и-календарные-диапазоны`,children:`Даты, время и календарные диапазоны`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль решает четыре связанные задачи:`}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,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/Orchestration/Async Tasks`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`асинхронные-задачи-через-ryuzaki13react-foundation-apiasync`,children:[`Асинхронные задачи через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/async`})]}),`
|
|
3
|
+
`,(0,c.jsx)(t.p,{children:`Модуль запускает независимые Promise-задачи, сохраняет связь результата с исходным элементом и формирует удобную сводку для UI/логов.`}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`какой-runner-выбрать`,children:`Какой runner выбрать`}),`
|
|
5
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(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:`Задач немного, можно начать все одновременно, любая ошибка должна завершить batch исключением`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`runAsyncTasks`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нужно ограничить число одновременных запросов, показать progress или поддержать abort`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`runConcurrentTasks`})})]})]})]}),`
|
|
6
|
+
`,(0,c.jsx)(t.p,{children:`Обе функции выполняют задачи параллельно. Они не создают web workers и не ускоряют CPU-bound JavaScript: Promise-concurrency полезна прежде всего для I/O — HTTP, чтения storage и других async операций.`}),`
|
|
7
|
+
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
8
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
9
|
+
AsyncTasksError,
|
|
10
|
+
ConcurrencyPartialError,
|
|
11
|
+
runAsyncTasks,
|
|
12
|
+
runConcurrentTasks
|
|
13
|
+
} from "@ryuzaki13/react-foundation-api/async";
|
|
14
|
+
|
|
15
|
+
import type {
|
|
16
|
+
AsyncTask,
|
|
17
|
+
RunAsyncTasksResult,
|
|
18
|
+
RunConcurrentTasksOptions,
|
|
19
|
+
RunConcurrentTasksResult
|
|
20
|
+
} from "@ryuzaki13/react-foundation-api/async";
|
|
21
|
+
`})}),`
|
|
22
|
+
`,(0,c.jsx)(t.p,{children:`Модуль не требует React или TanStack Query.`}),`
|
|
23
|
+
`,(0,c.jsxs)(t.h2,{id:`база-async-promise-и-await`,children:[`База: `,(0,c.jsx)(t.code,{children:`async`}),`, `,(0,c.jsx)(t.code,{children:`Promise`}),` и `,(0,c.jsx)(t.code,{children:`await`})]}),`
|
|
24
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`async`}),`-функция всегда возвращает `,(0,c.jsx)(t.code,{children:`Promise`}),`. `,(0,c.jsx)(t.code,{children:`await`}),` приостанавливает только текущую async-функцию, а не весь browser thread:`]}),`
|
|
25
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`async function loadName() {
|
|
26
|
+
const response = await fetch("/api/me");
|
|
27
|
+
return response.text();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const namePromise = loadName(); // Promise<string>.
|
|
31
|
+
const name = await namePromise; // string.
|
|
32
|
+
`})}),`
|
|
33
|
+
`,(0,c.jsxs)(t.p,{children:[`Ошибку Promise обрабатывают через `,(0,c.jsx)(t.code,{children:`try/catch`}),` вокруг `,(0,c.jsx)(t.code,{children:`await`}),`.`]}),`
|
|
34
|
+
`,(0,c.jsx)(t.h2,{id:`runasynctasks`,children:(0,c.jsx)(t.code,{children:`runAsyncTasks`})}),`
|
|
35
|
+
`,(0,c.jsx)(t.h3,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
36
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runAsyncTasks([
|
|
37
|
+
{ name: "profile", run: () => fetchProfile() },
|
|
38
|
+
{ name: "settings", run: () => fetchSettings() }
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
console.log(result.summary);
|
|
42
|
+
// { total: 2, succeeded: 2, failed: 0 }
|
|
43
|
+
`})}),`
|
|
44
|
+
`,(0,c.jsxs)(t.p,{children:[`Все `,(0,c.jsx)(t.code,{children:`run`}),` запускаются сразу через `,(0,c.jsx)(t.code,{children:`Promise.all`}),`. Важное отличие от обычного `,(0,c.jsx)(t.code,{children:`Promise.all`}),`: ошибка одной задачи перехватывается внутри runner-а, поэтому остальные задачи успевают завершиться. После завершения всего batch функция либо возвращает полный результат, либо бросает `,(0,c.jsx)(t.code,{children:`AsyncTasksError`}),` с тем же полным результатом.`]}),`
|
|
45
|
+
`,(0,c.jsx)(t.h3,{id:`обработка-частичного-успеха`,children:`Обработка частичного успеха`}),`
|
|
46
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`try {
|
|
47
|
+
const result = await runAsyncTasks(tasks, {
|
|
48
|
+
errorMessage: "Не все стартовые данные загрузились"
|
|
49
|
+
});
|
|
50
|
+
useData(result.successes);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof AsyncTasksError) {
|
|
53
|
+
usePartialData(error.result.successes);
|
|
54
|
+
showErrors(error.result.errors);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
`})}),`
|
|
61
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`AsyncTasksError.result`}),` содержит:`]}),`
|
|
62
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type RunAsyncTasksResult<TResult> = {
|
|
63
|
+
settled: readonly AsyncTaskSettled<TResult>[];
|
|
64
|
+
successes: readonly AsyncTaskSuccess<TResult>[];
|
|
65
|
+
errors: readonly AsyncTaskFailure[];
|
|
66
|
+
summary: {
|
|
67
|
+
total: number;
|
|
68
|
+
succeeded: number;
|
|
69
|
+
failed: number;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
`})}),`
|
|
73
|
+
`,(0,c.jsxs)(t.p,{children:[`Элементы `,(0,c.jsx)(t.code,{children:`settled`}),`, `,(0,c.jsx)(t.code,{children:`successes`}),` и `,(0,c.jsx)(t.code,{children:`errors`}),` сохраняют порядок исходного массива. Каждый элемент содержит `,(0,c.jsx)(t.code,{children:`index`}),` и `,(0,c.jsx)(t.code,{children:`name`}),`.`]}),`
|
|
74
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`if (item.status === "fulfilled") {
|
|
75
|
+
console.log(item.data);
|
|
76
|
+
} else {
|
|
77
|
+
console.error(item.error);
|
|
78
|
+
}
|
|
79
|
+
`})}),`
|
|
80
|
+
`,(0,c.jsxs)(t.p,{children:[`TypeScript сужает union по `,(0,c.jsx)(t.code,{children:`status`}),`.`]}),`
|
|
81
|
+
`,(0,c.jsxs)(t.p,{children:[`Пустой список возвращает успешный пустой результат. `,(0,c.jsx)(t.code,{children:`runAsyncTasks`}),` не имеет встроенного concurrency limit и AbortSignal.`]}),`
|
|
82
|
+
`,(0,c.jsx)(t.h2,{id:`runconcurrenttasks`,children:(0,c.jsx)(t.code,{children:`runConcurrentTasks`})}),`
|
|
83
|
+
`,(0,c.jsx)(t.h3,{id:`ограничение-одновременных-запросов`,children:`Ограничение одновременных запросов`}),`
|
|
84
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runConcurrentTasks(
|
|
85
|
+
userIds,
|
|
86
|
+
async (userId, { signal }) => {
|
|
87
|
+
const response = await fetch(\`/api/users/\${userId}\`, { signal });
|
|
88
|
+
if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
|
|
89
|
+
return response.json();
|
|
90
|
+
},
|
|
91
|
+
{ concurrency: 4 }
|
|
92
|
+
);
|
|
93
|
+
`})}),`
|
|
94
|
+
`,(0,c.jsxs)(t.p,{children:[`Не более четырёх задач будут находиться в работе одновременно. Значение по умолчанию — `,(0,c.jsx)(t.code,{children:`4`}),`. Если элементов меньше, workers создаются только по числу элементов.`]}),`
|
|
95
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`concurrency`}),` обязан быть целым числом не меньше `,(0,c.jsx)(t.code,{children:`1`}),`:`]}),`
|
|
96
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(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:`4`})}),(0,c.jsx)(t.td,{children:`Работает`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`1`})}),(0,c.jsx)(t.td,{children:`Последовательное выполнение`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`0`}),`, `,(0,c.jsx)(t.code,{children:`-1`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`RangeError`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`1.5`}),`, `,(0,c.jsx)(t.code,{children:`NaN`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`TypeError`})})]})]})]}),`
|
|
97
|
+
`,(0,c.jsx)(t.h3,{id:`ошибки-отдельных-элементов`,children:`Ошибки отдельных элементов`}),`
|
|
98
|
+
`,(0,c.jsxs)(t.p,{children:[`Runner не бросает ошибки отдельных задач. Он помещает их в `,(0,c.jsx)(t.code,{children:`result.errors`}),` и продолжает обработку:`]}),`
|
|
99
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runConcurrentTasks(inputs, task);
|
|
100
|
+
|
|
101
|
+
if (result.errors.length > 0) {
|
|
102
|
+
for (const failure of result.errors) {
|
|
103
|
+
console.error(failure.index, failure.input, failure.error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
`})}),`
|
|
107
|
+
`,(0,c.jsxs)(t.p,{children:[`Исключение самой функции возможно при невалидном `,(0,c.jsx)(t.code,{children:`concurrency`}),` или если callback `,(0,c.jsx)(t.code,{children:`onProgress`}),`/`,(0,c.jsx)(t.code,{children:`onItemSuccess`}),`/`,(0,c.jsx)(t.code,{children:`onItemError`}),` сам бросил ошибку. Callbacks должны быть безопасными и быстрыми.`]}),`
|
|
108
|
+
`,(0,c.jsx)(t.h3,{id:`progress`,children:`Progress`}),`
|
|
109
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await runConcurrentTasks(files, uploadFile, {
|
|
110
|
+
concurrency: 3,
|
|
111
|
+
onProgress(progress) {
|
|
112
|
+
setProgress(progress.percentage);
|
|
113
|
+
},
|
|
114
|
+
onItemSuccess(item) {
|
|
115
|
+
console.log("Загружен", item.input.name);
|
|
116
|
+
},
|
|
117
|
+
onItemError(item) {
|
|
118
|
+
console.error("Ошибка", item.input.name, item.error);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
`})}),`
|
|
122
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`onProgress`}),` вызывается после каждой завершённой задачи. В первом вызове процент уже больше нуля; отдельного начального события `,(0,c.jsx)(t.code,{children:`0%`}),` нет.`]}),`
|
|
123
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ConcurrentTaskProgress<TInput, TResult> = {
|
|
124
|
+
total: number;
|
|
125
|
+
completed: number;
|
|
126
|
+
succeeded: number;
|
|
127
|
+
failed: number;
|
|
128
|
+
running: number;
|
|
129
|
+
pending: number;
|
|
130
|
+
percentage: number;
|
|
131
|
+
aborted: boolean;
|
|
132
|
+
lastSettled?: ConcurrentTaskSettled<TInput, TResult>;
|
|
133
|
+
};
|
|
134
|
+
`})}),`
|
|
135
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`percentage`}),` округляется через `,(0,c.jsx)(t.code,{children:`Math.round`}),`.`]}),`
|
|
136
|
+
`,(0,c.jsx)(t.h3,{id:`abort`,children:`Abort`}),`
|
|
137
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const controller = new AbortController();
|
|
138
|
+
|
|
139
|
+
const promise = runConcurrentTasks(urls, async (url, { signal }) => {
|
|
140
|
+
const response = await fetch(url, { signal });
|
|
141
|
+
return response.text();
|
|
142
|
+
}, {
|
|
143
|
+
concurrency: 2,
|
|
144
|
+
signal: controller.signal
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
controller.abort();
|
|
148
|
+
const result = await promise;
|
|
149
|
+
`})}),`
|
|
150
|
+
`,(0,c.jsxs)(t.p,{children:[`После abort новые задачи не стартуют. Уже начатая операция прервётся только если сама использует переданный `,(0,c.jsx)(t.code,{children:`signal`}),`. Runner ждёт завершения начатых tasks и возвращает:`]}),`
|
|
151
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
152
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`aborted: true`}),`;`]}),`
|
|
153
|
+
`,(0,c.jsxs)(t.li,{children:[`обработанные элементы в `,(0,c.jsx)(t.code,{children:`settled`}),`;`]}),`
|
|
154
|
+
`,(0,c.jsxs)(t.li,{children:[`не начатые элементы в `,(0,c.jsx)(t.code,{children:`unprocessed`}),`.`]}),`
|
|
155
|
+
`]}),`
|
|
156
|
+
`,(0,c.jsxs)(t.p,{children:[`Abort не является ошибкой runner-а и сам по себе не приводит к `,(0,c.jsx)(t.code,{children:`throw`}),`.`]}),`
|
|
157
|
+
`,(0,c.jsx)(t.h3,{id:`порядок-результата`,children:`Порядок результата`}),`
|
|
158
|
+
`,(0,c.jsxs)(t.p,{children:[`Tasks могут завершаться в любом порядке, callbacks идут в порядке фактического завершения. Итоговые `,(0,c.jsx)(t.code,{children:`settled`}),`, `,(0,c.jsx)(t.code,{children:`successes`}),`, `,(0,c.jsx)(t.code,{children:`errors`}),` и `,(0,c.jsx)(t.code,{children:`unprocessed`}),` собираются по исходным индексам, поэтому результат детерминирован относительно input.`]}),`
|
|
159
|
+
`,(0,c.jsx)(t.h2,{id:`concurrencypartialerror`,children:(0,c.jsx)(t.code,{children:`ConcurrencyPartialError`})}),`
|
|
160
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`runConcurrentTasks`}),` сам не создаёт этот error. Класс нужен, если слой приложения хочет преобразовать частичный результат в исключение:`]}),`
|
|
161
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runConcurrentTasks(inputs, task);
|
|
162
|
+
|
|
163
|
+
if (result.errors.length > 0 || result.aborted) {
|
|
164
|
+
throw new ConcurrencyPartialError("Batch выполнен частично", result);
|
|
165
|
+
}
|
|
166
|
+
`})}),`
|
|
167
|
+
`,(0,c.jsxs)(t.p,{children:[`Не путайте его с `,(0,c.jsx)(t.code,{children:`AsyncTasksError`}),`: первый создаёт consumer по своей policy, второй автоматически бросает `,(0,c.jsx)(t.code,{children:`runAsyncTasks`}),`.`]}),`
|
|
168
|
+
`,(0,c.jsx)(t.h2,{id:`практические-рекомендации`,children:`Практические рекомендации`}),`
|
|
169
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
170
|
+
`,(0,c.jsx)(t.li,{children:`Не ставьте слишком большой concurrency: browser, proxy и backend имеют свои лимиты.`}),`
|
|
171
|
+
`,(0,c.jsx)(t.li,{children:`Для write-операций продумайте идемпотентность: retry может повторить уже выполненное действие.`}),`
|
|
172
|
+
`,(0,c.jsx)(t.li,{children:`Не меняйте input objects внутри task, если те же значения использует UI.`}),`
|
|
173
|
+
`,(0,c.jsxs)(t.li,{children:[`Обрабатывайте `,(0,c.jsx)(t.code,{children:`unknown`}),` error через безопасный normalizer.`]}),`
|
|
174
|
+
`,(0,c.jsx)(t.li,{children:`Не используйте runner вместо TanStack Query cache для одного и того же resource.`}),`
|
|
175
|
+
`,(0,c.jsx)(t.li,{children:`Если задача зависит от результата предыдущей, это не независимый batch: выполните зависимые шаги последовательно.`}),`
|
|
176
|
+
`]}),`
|
|
177
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
178
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Группа`}),(0,c.jsx)(t.th,{children:`Exports`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`All-at-once`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`runAsyncTasks`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTasksError`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTask`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTaskSuccess`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTaskFailure`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTaskSettled`}),`, `,(0,c.jsx)(t.code,{children:`RunAsyncTasksResult`}),`, `,(0,c.jsx)(t.code,{children:`RunAsyncTasksOptions`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Bounded concurrency`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`runConcurrentTasks`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrencyPartialError`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskContext`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskFn`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskSuccess`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskError`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskSettled`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskUnprocessed`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskProgress`}),`, `,(0,c.jsx)(t.code,{children:`RunConcurrentTasksOptions`}),`, `,(0,c.jsx)(t.code,{children:`RunConcurrentTasksResult`})]})]})]})]})]})}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};
|