@ryuzaki13/react-foundation-ui 2.2.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/dialog-Dqq8ZN99.js +50 -0
- package/dist/chunks/dialog-Dqq8ZN99.js.map +1 -0
- package/dist/dialog/index.js +2 -50
- package/dist/styles.css +1 -1
- package/dist/table-editor/index.d.ts +3 -0
- package/dist/table-editor/index.d.ts.map +1 -0
- package/dist/table-editor/index.js +465 -0
- package/dist/table-editor/index.js.map +1 -0
- package/dist/table-editor/model/useTableEditor.d.ts +25 -0
- package/dist/table-editor/model/useTableEditor.d.ts.map +1 -0
- package/dist/table-editor/model/useTableEditorTable.d.ts +10 -0
- package/dist/table-editor/model/useTableEditorTable.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditor.d.ts +21 -0
- package/dist/table-editor/ui/TableEditor.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorGrid.d.ts +14 -0
- package/dist/table-editor/ui/TableEditorGrid.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorStructure.d.ts +10 -0
- package/dist/table-editor/ui/TableEditorStructure.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorToolbar.d.ts +11 -0
- package/dist/table-editor/ui/TableEditorToolbar.d.ts.map +1 -0
- package/package.json +7 -3
- package/storybook-static/assets/{Badge-S6BbyfeX.js → Badge-CPJUZBAx.js} +1 -1
- package/storybook-static/assets/{Badge.stories-mio0RhpX.js → Badge.stories-BV9Ob_Oc.js} +1 -1
- package/storybook-static/assets/{BadgeList-rtyargPY.js → BadgeList-CtdWGEn6.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-DRdXaVuW.js → BarcodeScannerDialog.stories-B_wBhs1h.js} +1 -1
- package/storybook-static/assets/{Button-EVzvXVPh.js → Button-BO03YvyD.js} +1 -1
- package/storybook-static/assets/{Button-CNH5M6QU.js → Button-DJgPWpef.js} +1 -1
- package/storybook-static/assets/{Button.stories-VUvnWRnm.js → Button.stories-DhqncZmo.js} +1 -1
- package/storybook-static/assets/{CalendarView-CfSvCqCr.js → CalendarView-Ctgt0vSh.js} +1 -1
- package/storybook-static/assets/{CheckBox-C3n5T66c.js → CheckBox-BOIYiJm5.js} +1 -1
- package/storybook-static/assets/{CheckBox-Bynxp5UW.js → CheckBox-x4MtRKCD.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-BoF97wxK.js → CheckBox.stories-B-YhjVpn.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-D-Jlgqzt.js → Color-6AOWCN3U-D2hSJGdc.js} +1 -1
- package/storybook-static/assets/{ContextMenu-Dg65Ha7g.js → ContextMenu--tEb29lb.js} +1 -1
- package/storybook-static/assets/{ContextMenu-DwwW3EyB.js → ContextMenu-ConDIkSx.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-D-jRdIZD.js → ContextMenu.stories-DdZB2dQb.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-vfj1vLJM.js → CustomOptionButton-D9_PjL0f.js} +1 -1
- package/storybook-static/assets/{DateInput-DJdh5B2X.js → DateInput-D1XJQ-6l.js} +1 -1
- package/storybook-static/assets/{DateInput-BpuC_NWD.js → DateInput-Dh0ZTlaK.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-C9hB_vFy.js → DateInput.stories-YIy6ns7j.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CDgQfOdZ.js → DateRangePresetSelect-CfCtwULa.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DYPoeqC2.js → DateRangePresetSelect-Xy9xMJwE.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-Bx40H_O0.js → DateRangePresetSelect.stories-Cp8bCPPr.js} +1 -1
- package/storybook-static/assets/{Detail-DWFfdNJH.js → Detail-V4a7PEQy.js} +1 -1
- package/storybook-static/assets/{Detail.stories-C9y_rsbc.js → Detail.stories-CaltBUzP.js} +1 -1
- package/storybook-static/assets/{Dialog-XbR8HVsJ.js → Dialog-CwIJrdeS.js} +1 -1
- package/storybook-static/assets/{Dialog-D8GPZi6H.js → Dialog-TBOx7xuG.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-CoU_PusF.js → Dialog.stories-BWXw_XOW.js} +1 -1
- package/storybook-static/assets/{Disclosure-DrGfFwQt.js → Disclosure-ptHsbm71.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-CsR1_XK7.js → Disclosure.stories-CG2LclkF.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-DvB5K7gZ.js → DisclosureGroup-CseVXRGI.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-B7AkTp2I.js → DocsRenderer-JROSPFPF-Cz6wf1E5.js} +1 -1
- package/storybook-static/assets/{DropZone-DesGY4BW.js → DropZone-CRai68J2.js} +1 -1
- package/storybook-static/assets/{DropZone-DZi2WVu9.js → DropZone-D_zss6IH.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-KVDb6pHQ.js → DropZone.stories-DieoYknx.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-CRoQARS5.js → DropdownMenu-BojaSt_0.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-CWKJIcbQ.js → ExpandableActionPanel-BiS2kSkL.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-D-MYdCJ4.js → ExpandableActionPanel.stories-CMaKcNjZ.js} +1 -1
- package/storybook-static/assets/{Flex-CMPSlVVy.js → Flex-4xyVvQjb.js} +1 -1
- package/storybook-static/assets/{Flex.stories-DQH0Q5EF.js → Flex.stories-C3tQavbS.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-CBWu6Gxj.js → FloatingPopover-D-hgsDWB.js} +1 -1
- package/storybook-static/assets/FormattedTableCell-BIx_wHxt.js +15 -0
- package/storybook-static/assets/{Grid-BlQE5E_9.js → Grid-D_tQSQsa.js} +1 -1
- package/storybook-static/assets/{Grid.stories-CwUCPClP.js → Grid.stories-rm-LBWqc.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-DjaRavSL.js → ImageCropper.stories-TWj6EUhv.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-JGxgpvv2.js → ImageRenderer-fJY5cwIZ.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-DwH6FgEc.js → ImageRenderer.stories-COWaXJSu.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DgYPiNil.js → ImageView.stories-CarFyXxF.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-_y7d3coa.js → ImageViewer.stories-WwLkgsZl.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-CA6JhQ31.js → ImageViewerRuntime-Dg1heG9I.js} +1 -1
- package/storybook-static/assets/{Input-95LKm7aK.js → Input-BqipFubD.js} +1 -1
- package/storybook-static/assets/{Input-CET6HfZH.js → Input-CRMRR0du.js} +1 -1
- package/storybook-static/assets/{Input.stories-BDTI2nIV.js → Input.stories-BZBQd_Yo.js} +1 -1
- package/storybook-static/assets/{InputDateTime-DsRJZVCO.js → InputDateTime-BKzFQcD2.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-Dah3F9Fq.js → InputDateTime.stories-B3dXU0or.js} +1 -1
- package/storybook-static/assets/{InputFile-CF3DRyTX.js → InputFile-C3iCB2fV.js} +1 -1
- package/storybook-static/assets/{InputFile-_65sKWXa.js → InputFile-Dl4khE53.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-B1PFNFPf.js → InputFile.stories-DYqlThPW.js} +1 -1
- package/storybook-static/assets/{InputFiles-RV6K6GmT.js → InputFiles-CWyvWdT6.js} +1 -1
- package/storybook-static/assets/{InputFiles-CUYGDig8.js → InputFiles-fSWRgPQt.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-ZCzYnboY.js → InputFiles.stories-wwrSxxCj.js} +1 -1
- package/storybook-static/assets/{InputFilesList-Co__UO8B.js → InputFilesList-dPZoA3cU.js} +1 -1
- package/storybook-static/assets/{InputImage-De56Jwx9.js → InputImage-DbK6OW82.js} +1 -1
- package/storybook-static/assets/{InputImage-900lIdui.js → InputImage-hI2j2ETf.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-B_R_kcCD.js → InputImage.stories-BmjAuHh6.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-DGTx8enm.js → InteractiveComponents-CP9rMbrV.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-CDZsFUga.js → InteractiveComponents.stories-DWGP7kN9.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CllhDO8J.js → LayoutPicker-B6l0KM01.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BMO8qfbL.js → LayoutPicker-BqPt4z1o.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-F7K4tSxT.js → LayoutPicker.stories-CobjDPnt.js} +1 -1
- package/storybook-static/assets/{Listbox-0kjmvCe-.js → Listbox-D8wHXixj.js} +1 -1
- package/storybook-static/assets/{Listbox-D_2t3NpM.js → Listbox-VYmcGjMI.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-Cp1Eq7Bz.js → Listbox.stories-DwGQUQ0i.js} +1 -1
- package/storybook-static/assets/{Modal-zf0JQ124.js → Modal-J__v8Hop.js} +1 -1
- package/storybook-static/assets/{Modal-vdSwQ6xw.js → Modal-gdYxFkXo.js} +1 -1
- package/storybook-static/assets/{Modal.stories-Cz47rY2B.js → Modal.stories-DIs97N2U.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-C_zd0fqC.js → ModalManagerProvider-LwIYImtY.js} +1 -1
- package/storybook-static/assets/{MultiSelect-Bl3q6kCP.js → MultiSelect-DoJsmrgD.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DE13Ak4N.js → MultiSelect-DxLtgKfo.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-DG6LGTC9.js → MultiSelect.stories-gbsa3dqJ.js} +1 -1
- package/storybook-static/assets/{NoData-B4AGZs5Q.js → NoData-o_sLpPoU.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-CFD2_BpZ.js → NotificationsHost-BMBxunA0.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-CiSu7Vly.js → NotificationsHost.stories-BzoCtqMU.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-PcZYhXlN.js → ODataMultiSelect-CcbmxqpZ.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-xodpVftn.js → ODataMultiSelect.stories-zw67beZc.js} +1 -1
- package/storybook-static/assets/{ODataSelect-BuuZhINP.js → ODataSelect-CXW8j-z7.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-nr7GqOTz.js → ODataSelect.stories-TQM6_DYK.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-BRNITq-6.js → ODataTreeMultiSelect-DGF8-pWk.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-Baxtdxte.js → ODataTreeMultiSelect.stories-Dd_0ra7b.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-BKcyKJr8.js → ODataTreeSelect-VuBknyZd.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-n6LATF6z.js → ODataTreeSelect.stories-BtzFf_u0.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-DXykOSPw.js → OneStepScroller-DZNxJvgJ.js} +1 -1
- package/storybook-static/assets/{Option-Cr3vYgCL.js → Option-B4DvYPy2.js} +1 -1
- package/storybook-static/assets/{OptionButton-v-MO3VgJ.js → OptionButton-C4VuB9n6.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-BQ9_EM63.js → PeriodSelect-B8ox22dv.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DQXZWIBX.js → PeriodSelect-DSxwgwCW.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-S2ndHVEQ.js → PeriodSelect.stories-CjTMQdsC.js} +1 -1
- package/storybook-static/assets/{PickerField-BeAXSQmp.js → PickerField-CIzr66S8.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-D6BjZkrN.js → PickerTriggerActions-jZXgVj2i.js} +1 -1
- package/storybook-static/assets/{Popover-BAp50b4b.js → Popover-BpC72C2z.js} +1 -1
- package/storybook-static/assets/{Popover-CTCfa72M.js → Popover-CtpYUZz7.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CZIBppwE.js → Popover.stories-BujYLT_N.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-EIlQEGr0.js → PresetRangeDateInput-C6Y1OPu2.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-BLAAcq8Y.js → PresetRangeDateInput-v5tpwKOr.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CShR-Eub.js → PresetRangeDateInput.stories-DXJi-hz8.js} +1 -1
- package/storybook-static/assets/{PresetSelect-BcD8EsSb.js → PresetSelect-gK2K5zkH.js} +1 -1
- package/storybook-static/assets/{README-DgFtCu8B.js → README-35Rz4zJn.js} +1 -1
- package/storybook-static/assets/{README-CZJvbdGv.js → README-76skvum6.js} +1 -1
- package/storybook-static/assets/{README-cuvbXAuG.js → README-9FkDpJNL.js} +1 -1
- package/storybook-static/assets/{README-BDMWo0qS.js → README-BARPT1_b.js} +1 -1
- package/storybook-static/assets/{README-N-Gy0UYM.js → README-BC0N2gII.js} +1 -1
- package/storybook-static/assets/{README-B2J2ATaW.js → README-BEvGMEjK.js} +1 -1
- package/storybook-static/assets/{README-Dd3MCsf2.js → README-BFt1rK1m.js} +1 -1
- package/storybook-static/assets/{README-DoZCaKAx.js → README-BJ9k0Np6.js} +1 -1
- package/storybook-static/assets/{README-DDtdZa9N.js → README-BN7MT2Ap.js} +1 -1
- package/storybook-static/assets/{README-CVX-4uJ_.js → README-BNb4F90Z.js} +1 -1
- package/storybook-static/assets/{README-ZZiicHm9.js → README-BNk4sKbP.js} +3 -3
- package/storybook-static/assets/{README-DUfqdm0p.js → README-BPeCkxf5.js} +1 -1
- package/storybook-static/assets/{README-CaECsCl2.js → README-BUvT1PC3.js} +1 -1
- package/storybook-static/assets/{README-BQHgBs-J.js → README-BWp5_vwI.js} +1 -1
- package/storybook-static/assets/{README-Cntj7my4.js → README-BeUl88Dw.js} +1 -1
- package/storybook-static/assets/{README-Bwv6SU5o.js → README-BkP5HRKY.js} +1 -1
- package/storybook-static/assets/{README-DkCWpyid.js → README-BovclOxj.js} +1 -1
- package/storybook-static/assets/{README-DhZbllv1.js → README-BsO3rGAo.js} +1 -1
- package/storybook-static/assets/{README-pvA4fK1E.js → README-ByB4pX-h.js} +1 -1
- package/storybook-static/assets/{README-BdBeQtXQ.js → README-C0ZKA9b-.js} +1 -1
- package/storybook-static/assets/{README-Dn2AIjeS.js → README-C7xESdeZ.js} +1 -1
- package/storybook-static/assets/{README-BIpHKVKI.js → README-C9WDex0g.js} +1 -1
- package/storybook-static/assets/{README-BnTk0DyO.js → README-CEg7RhiN.js} +1 -1
- package/storybook-static/assets/{README-DwvyizD7.js → README-CGVpfLua.js} +1 -1
- package/storybook-static/assets/{README-DehKWpx2.js → README-CHLqXECy.js} +1 -1
- package/storybook-static/assets/{README-DQpji8GH.js → README-CJazQDMs.js} +1 -1
- package/storybook-static/assets/{README-bAu0Uk5O.js → README-CV2hDek-.js} +1 -1
- package/storybook-static/assets/{README-v3TOC_aE.js → README-CYI_EOl0.js} +1 -1
- package/storybook-static/assets/{README-CWeupyTO.js → README-Cgz1iUWg.js} +1 -1
- package/storybook-static/assets/{README-BUlc8wGR.js → README-Cm8APMxg.js} +1 -1
- package/storybook-static/assets/{README-wizqrRgs.js → README-CrMVq7Lw.js} +1 -1
- package/storybook-static/assets/{README-Y4OGhQbo.js → README-DFnpGGTR.js} +1 -1
- package/storybook-static/assets/{README-CMBk39py.js → README-DKn16Q4N.js} +1 -1
- package/storybook-static/assets/{README-sEbspuLw.js → README-DOgmLyjE.js} +1 -1
- package/storybook-static/assets/{README-B8qFKwiq.js → README-DTSAWBmg.js} +1 -1
- package/storybook-static/assets/{README-BW1oyMu_.js → README-DUr25qzJ.js} +1 -1
- package/storybook-static/assets/{README-DsLoV4ax.js → README-DWdFUqVy.js} +1 -1
- package/storybook-static/assets/{README-BkX7iDLJ.js → README-Daf_hy33.js} +1 -1
- package/storybook-static/assets/{README-BBS739kV.js → README-Dd4omKy5.js} +1 -1
- package/storybook-static/assets/{README-CQUlYRLa.js → README-DgvV1tz2.js} +1 -1
- package/storybook-static/assets/{README-jHuA2mq2.js → README-Dj-J1DiV.js} +1 -1
- package/storybook-static/assets/{README-CLiuh-fF.js → README-DjHS3LyZ.js} +1 -1
- package/storybook-static/assets/{README-CuGPdc3G.js → README-DjuBYSZf.js} +1 -1
- package/storybook-static/assets/{README-DwyqrR4I.js → README-DtFIYO3L.js} +1 -1
- package/storybook-static/assets/{README-6vpPfmdC.js → README-DwIqFkLN.js} +1 -1
- package/storybook-static/assets/{README-CLv4OeWw.js → README-PVmZhf60.js} +1 -1
- package/storybook-static/assets/{README-Wd5wEw-J.js → README-SLh2SkXm.js} +1 -1
- package/storybook-static/assets/{README-D7pP2Sxx.js → README-Uy_ptFqX.js} +1 -1
- package/storybook-static/assets/{README-DLQvRDdd.js → README-ZeIvwrze.js} +1 -1
- package/storybook-static/assets/{README-5i5ZfRuh.js → README-fC8saBR0.js} +1 -1
- package/storybook-static/assets/{README-D9Og-Y7l.js → README-p3wyWaCG.js} +1 -1
- package/storybook-static/assets/{README-6iRo8dKK.js → README-tSD_oNwO.js} +1 -1
- package/storybook-static/assets/{README-Dj9EXnja.js → README-tWeRF96t.js} +1 -1
- package/storybook-static/assets/{RadioButton-Ca0kZdMV.js → RadioButton-D-hGkjCE.js} +1 -1
- package/storybook-static/assets/{RadioButton-BUPEsqwH.js → RadioButton-SQQ0XZh_.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-aBnizEak.js → RadioButton.stories-y_RgH92I.js} +1 -1
- package/storybook-static/assets/{RadioGroup-dq6CbxB6.js → RadioGroup-BbZbR0Nd.js} +1 -1
- package/storybook-static/assets/{RadioGroup-34jH28Sk.js → RadioGroup-c4001gHC.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories--lDrmS8V.js → RadioGroup.stories-VUC3P22Z.js} +1 -1
- package/storybook-static/assets/{Scrollable-BJRiyp9q.js → Scrollable-BCbWuy4A.js} +1 -1
- package/storybook-static/assets/{Select-CwNDJSmq.js → Select-B9E7ahIl.js} +1 -1
- package/storybook-static/assets/{Select-DmwCwS8a.js → Select-CJ33Sv-J.js} +1 -1
- package/storybook-static/assets/{Select.stories-BXj7A2gM.js → Select.stories-BcAnEbEn.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-IAtBSK9P.js → SerializableSelect-BPS2hfyJ.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-D8F5WGtk.js → SerializableSelect.stories-CM1ncPEp.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CbyyGlmi.js → SingleDateTimeInput-BHYCHJQE.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-oN2P3eYx.js → SingleDateTimeInput-gTTeUwQu.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BU_wyTmo.js → SingleDateTimeInput.stories-CbmsCFpW.js} +1 -1
- package/storybook-static/assets/{Slider-ClZTrtRk.js → Slider-CGKqjm7X.js} +1 -1
- package/storybook-static/assets/{Slider-CDJhhSWj.js → Slider-RBZi0g2K.js} +1 -1
- package/storybook-static/assets/{Slider.stories-PfQf9es7.js → Slider.stories-PSyMsLLp.js} +1 -1
- package/storybook-static/assets/{SliderInput-C7TRql6-.js → SliderInput-CznPoK1l.js} +1 -1
- package/storybook-static/assets/{SliderInput-BxFUjetO.js → SliderInput-Df9TmEKF.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-yX8DU5pZ.js → SliderInput.stories-BQiRt7bg.js} +1 -1
- package/storybook-static/assets/{Sortable-D8cVwatT.js → Sortable-D42YEoo9.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-BI6_E5k7.js → Sortable.stories-DkJeEE-A.js} +1 -1
- package/storybook-static/assets/{Splitter-B958Wj4G.js → Splitter-DlRtVvJG.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Dl2YOk9H.js → Splitter.stories-CWV7Ofeq.js} +1 -1
- package/storybook-static/assets/{StateSelect-DbV1mGhQ.js → StateSelect-Cx2e1djS.js} +1 -1
- package/storybook-static/assets/{StateSelect-Cs9-kDRC.js → StateSelect-DSmcFkB_.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-D6atguQ6.js → StateSelect.stories-DE36S04p.js} +1 -1
- package/storybook-static/assets/{StatusIndicator--Y-QdjQI.js → StatusIndicator-5q4RVrlX.js} +1 -1
- package/storybook-static/assets/{StatusIndicator.stories-DxkpP6C1.js → StatusIndicator.stories-ChoX8YBt.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-C3mdK5Wx.js → StringToggle.stories-C3yjPy-u.js} +1 -1
- package/storybook-static/assets/{Switch-BTFpnXV9.js → Switch-AbpldWAB.js} +1 -1
- package/storybook-static/assets/{Switch-OPzpWcJw.js → Switch-BVC4Fwd3.js} +1 -1
- package/storybook-static/assets/{Switch.stories-C0rVHcRq.js → Switch.stories-FPuGI2wa.js} +1 -1
- package/storybook-static/assets/{Table-bWKgagHH.js → Table-Supenh30.js} +1 -1
- package/storybook-static/assets/{Table.stories-DOuV4G3p.js → Table.stories-DF5hgk3V.js} +3 -3
- package/storybook-static/assets/TableEditor-CaZCZgKf.css +1 -0
- package/storybook-static/assets/TableEditor.stories-CNBIQyHL.js +61 -0
- package/storybook-static/assets/{Tabs-ae4daDEA.js → Tabs-C039OI9y.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-Br4RCZKR.js → Tabs.stories-B49PmfdF.js} +1 -1
- package/storybook-static/assets/{TabsBox-X_7yoTw3.js → TabsBox-C3l5eozp.js} +1 -1
- package/storybook-static/assets/{TagInput-B2w5W05Z.js → TagInput-CwyrBnFS.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-Db9DaNpW.js → TagInput.stories-coxQ7Em9.js} +1 -1
- package/storybook-static/assets/{Text-BT0cn3Bk.js → Text-Ci8EVxdT.js} +1 -1
- package/storybook-static/assets/{Textarea-B9MNOgmF.js → Textarea-BcSflD0g.js} +1 -1
- package/storybook-static/assets/{Textarea-C_6iOQ3k.js → Textarea-CK323Zvt.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-Ctjb3d47.js → Textarea.stories-DksBPbfd.js} +1 -1
- package/storybook-static/assets/{TimePanel-C5AucKln.js → TimePanel-rc26nbZr.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CiQAJcB_.js → TimePanel.stories-CX33HFgH.js} +1 -1
- package/storybook-static/assets/{Toggle-DxA-Q1KZ.js → Toggle-BJ6a2rYs.js} +1 -1
- package/storybook-static/assets/{Toggle-q8hxq-LP.js → Toggle-Dj9mjhm6.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-C6Jf_KTc.js → Toggle.stories-D2U9YqcP.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BfduPrgB.js → TreeMultiSelect-0bsShZqq.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BKF7COzn.js → TreeMultiSelect-cRTpzovV.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-C-uztFex.js → TreeMultiSelect.stories-BGX0KlJq.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-SVDNn9QY.js → TreePickerBase-BWuxoc3q.js} +1 -1
- package/storybook-static/assets/{TreeSelect-ClJGLBA8.js → TreeSelect-BJ9bYsyd.js} +1 -1
- package/storybook-static/assets/{TreeSelect-Bu9HRTvX.js → TreeSelect-K8QcuBmM.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-C0TeLbpZ.js → TreeSelect.stories-DGVst2IK.js} +1 -1
- package/storybook-static/assets/{TreeTable-BXia_Imm.js → TreeTable-BqgD-2_7.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-Cwo8yjNI.js → TreeTable.stories-BcXMrgLT.js} +2 -2
- package/storybook-static/assets/{array-D-_yMMUK-DYqn1Ozn.js → array-D-_yMMUK-DnJ_b27D.js} +1 -1
- package/storybook-static/assets/{blocks-BmNU_R5E.js → blocks-COtaqhG7.js} +3 -3
- package/storybook-static/assets/{check-HCQdrq3c.js → check-ATe9qlhZ.js} +1 -1
- package/storybook-static/assets/{chevron-down-DHrZ_6vS.js → chevron-down-C8rhgH0F.js} +1 -1
- package/storybook-static/assets/{chevron-left-CaIBhYcr.js → chevron-left-BREifQyg.js} +1 -1
- package/storybook-static/assets/{chevron-right-BpmEWiwv.js → chevron-right-2G3N5a4T.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-DSMfJqhe.js → chunk-W22LQPXL-CseeqzDY.js} +1 -1
- package/storybook-static/assets/{circle-alert-DuupFIr9.js → circle-alert-BA5kPpt-.js} +1 -1
- package/storybook-static/assets/{circle-check-LYBfAR-E.js → circle-check-Cs9mMZi_.js} +1 -1
- package/storybook-static/assets/{components-CBnjb8pL.js → components-C3kWCR3K.js} +3 -3
- package/storybook-static/assets/{contextMenu-BZ-iSJtD.js → contextMenu-BoM0Rrc0.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-CyUQG_f-.js → defaultRenderers-UxEpV_2H.js} +1 -1
- package/storybook-static/assets/{download-CsLGqkEl.js → download-LnWJpQGc.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-VNDOEKPt.js → floating-ui.react-5ooru93I.js} +1 -1
- package/storybook-static/assets/{formatters-DVE1YVNQ-CMsbb5-m.js → formatters-DVE1YVNQ-YIdRxgw-.js} +1 -1
- package/storybook-static/assets/{foundationApi-BMy7_pDS.js → foundationApi-BBE0Q757.js} +1 -1
- package/storybook-static/assets/{foundationLib-o95OqhXl.js → foundationLib-B08SbcPW.js} +1 -1
- package/storybook-static/assets/{hooks-DMFMD13m.js → hooks-C0EM5QXj.js} +1 -1
- package/storybook-static/assets/iframe-B5Pyh1le.js +1 -0
- package/storybook-static/assets/{iframe-BaXmcmyl.js → iframe-Dyg5pyjI.js} +4 -4
- package/storybook-static/assets/{info-ZuWgcD4m.js → info-CwIwVUF0.js} +1 -1
- package/storybook-static/assets/odata-DhMoO1-z.js +1 -0
- package/storybook-static/assets/odataStoryFixtures-gWL6AhyF.js +25 -0
- package/storybook-static/assets/{react-BnjGKE7V.js → react-DKmCseal.js} +1 -1
- package/storybook-static/assets/{refresh-cw-vj55o5c3.js → refresh-cw-cEegR14X.js} +1 -1
- package/storybook-static/assets/{settings-2-PPom9XND.js → settings-2-fhEteCrb.js} +1 -1
- package/storybook-static/assets/{sortable-CztGPJOI.js → sortable-Dn0xMPIF.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-uXmnHQP7.js → syntaxhighlighter-QEQV7K2Y-BSkd404o.js} +1 -1
- package/storybook-static/assets/tableFeatures-Dx3U-F9E.js +1 -0
- package/storybook-static/assets/{trash-2-DEnKoJjZ.js → trash-2-DAG4_F6W.js} +1 -1
- package/storybook-static/assets/{triangle-alert-D-oyPLJL.js → triangle-alert-5OwD01Sy.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-DxsvigTC.js → useODataSelectBase-BKD8wc02.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-Dzxb75-h.js → useODataTreeData-VIqPm8lR.js} +1 -1
- package/storybook-static/assets/{usePickerDefaultFilter-BMBLqfz8.js → usePickerDefaultFilter-ien2ZY7g.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-SCKPS_0f.js → usePickerQuery-qXXh72-v.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-DMA4hla_.js → usePickerTriggerController-DbTYgg-I.js} +1 -1
- package/storybook-static/assets/useTable-CK68Q4S4.js +1 -0
- package/storybook-static/assets/{x-C5QCK6Ts.js → x-sWfOdOu5.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/dist/dialog/index.js.map +0 -1
- package/storybook-static/assets/FormattedTableCell-CIp2ULPe.js +0 -15
- package/storybook-static/assets/iframe-D5qmKm51.js +0 -1
- package/storybook-static/assets/odata-Brls3R5b.js +0 -1
- package/storybook-static/assets/odataStoryFixtures-BmQo4rAJ.js +0 -25
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import { n as e } from "../chunks/button-DF21yxVp.js";
|
|
2
|
+
import { n as t, o as n } from "../chunks/input-DSPKgiCK.js";
|
|
3
|
+
import { t as r } from "../chunks/check-box-CZyhzmR0.js";
|
|
4
|
+
import { t as i } from "../chunks/dialog-Dqq8ZN99.js";
|
|
5
|
+
import { useId as a, useMemo as o, useRef as s, useState as c } from "react";
|
|
6
|
+
import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
7
|
+
import { cellSpanningFeature as f, tableFeatures as p, useTable as m } from "@tanstack/react-table";
|
|
8
|
+
import { assertTableDocument as h, deleteTableDocumentAxisGroup as g, expandTableDocumentRange as _, getTableDocumentAxisGroups as v, getTableDocumentCellRange as y, insertTableDocumentAxis as b, mergeTableDocumentCells as x, moveTableDocumentAxisGroup as S, splitTableDocumentCell as C, updateTableDocumentCell as w } from "@ryuzaki13/react-foundation-lib/table-document";
|
|
9
|
+
import { uuidv4 as T } from "@ryuzaki13/react-foundation-lib/crypto";
|
|
10
|
+
var E = {
|
|
11
|
+
editor: "_6ftNrS",
|
|
12
|
+
toolbar: "tji4uW",
|
|
13
|
+
help: "nVFFYk",
|
|
14
|
+
scroll: "S7CdzG",
|
|
15
|
+
table: "emaqLv",
|
|
16
|
+
cellContent: "VLG992",
|
|
17
|
+
inspector: "Hr0ghz",
|
|
18
|
+
structure: "tuhyZe"
|
|
19
|
+
}, D = p({ cellSpanningFeature: f });
|
|
20
|
+
function O(e) {
|
|
21
|
+
let t = o(() => [...e.rows], [e]), n = o(() => e.columns.map((t, n) => ({
|
|
22
|
+
id: t.id,
|
|
23
|
+
accessorFn: (t, r) => {
|
|
24
|
+
let i = y(e, {
|
|
25
|
+
row: r,
|
|
26
|
+
column: n
|
|
27
|
+
});
|
|
28
|
+
return e.rows[i.row].cells[i.column].id;
|
|
29
|
+
},
|
|
30
|
+
spanRows: !0,
|
|
31
|
+
spanColumns: ({ row: t }) => {
|
|
32
|
+
let r = y(e, {
|
|
33
|
+
row: t.index,
|
|
34
|
+
column: n
|
|
35
|
+
});
|
|
36
|
+
return r.column === n ? r.columnSpan : 1;
|
|
37
|
+
}
|
|
38
|
+
})), [e]);
|
|
39
|
+
return m({
|
|
40
|
+
features: D,
|
|
41
|
+
data: t,
|
|
42
|
+
columns: n,
|
|
43
|
+
getRowId: (e) => e.id
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/table-editor/ui/TableEditorGrid.tsx
|
|
48
|
+
function k({ editor: e, extendSelection: t, disabled: n, renderCell: r, getCellText: i }) {
|
|
49
|
+
let o = a(), c = s(/* @__PURE__ */ new Map()), f = O(e.document), { document: p, selection: m, focus: h } = e;
|
|
50
|
+
return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u("p", {
|
|
51
|
+
id: o,
|
|
52
|
+
className: E.help,
|
|
53
|
+
children: "Стрелки — переход между ячейками. Shift + стрелки или Shift + щелчок — выделение диапазона. Содержимое выбранной ячейки редактируется под таблицей."
|
|
54
|
+
}), /* @__PURE__ */ u("div", {
|
|
55
|
+
className: E.scroll,
|
|
56
|
+
children: /* @__PURE__ */ d("table", {
|
|
57
|
+
role: "grid",
|
|
58
|
+
"aria-label": p.caption || "Редактор таблицы",
|
|
59
|
+
"aria-describedby": o,
|
|
60
|
+
"aria-multiselectable": "true",
|
|
61
|
+
"aria-disabled": n || void 0,
|
|
62
|
+
className: E.table,
|
|
63
|
+
children: [/* @__PURE__ */ u("colgroup", { children: p.columns.map((e) => /* @__PURE__ */ u("col", { style: { width: e.width ?? 180 } }, e.id)) }), /* @__PURE__ */ u("tbody", { children: f.getRowModel().rows.map((a) => /* @__PURE__ */ u("tr", {
|
|
64
|
+
"aria-rowindex": a.index + 1,
|
|
65
|
+
"data-header": a.index < p.headerRowCount || void 0,
|
|
66
|
+
children: a.getAllCells().map((o, s) => {
|
|
67
|
+
if (o.getIsCovered()) return null;
|
|
68
|
+
let l = a.index >= m.row && a.index < m.row + m.rowSpan && s >= m.column && s < m.column + m.columnSpan, f = {
|
|
69
|
+
row: a.index,
|
|
70
|
+
column: s
|
|
71
|
+
}, g = a.original.cells[s], _ = a.index < p.headerRowCount ? "th" : "td";
|
|
72
|
+
return /* @__PURE__ */ d(_, {
|
|
73
|
+
role: a.index < p.headerRowCount ? "columnheader" : "gridcell",
|
|
74
|
+
ref: (e) => {
|
|
75
|
+
e ? c.current.set(g.id, e) : c.current.delete(g.id);
|
|
76
|
+
},
|
|
77
|
+
rowSpan: o.getRowSpan(),
|
|
78
|
+
colSpan: o.getColSpan(),
|
|
79
|
+
"aria-colindex": s + 1,
|
|
80
|
+
"aria-label": `Строка ${a.index + 1}, столбец ${s + 1}: ${i(g) || "Пустая ячейка"}`,
|
|
81
|
+
"aria-selected": l,
|
|
82
|
+
tabIndex: !n && h.row === a.index && h.column === s ? 0 : -1,
|
|
83
|
+
onClick: (r) => {
|
|
84
|
+
n || e.select(f, t || r.shiftKey);
|
|
85
|
+
},
|
|
86
|
+
onPointerEnter: (t) => {
|
|
87
|
+
!n && t.pointerType === "mouse" && t.buttons === 1 && e.select(f, !0);
|
|
88
|
+
},
|
|
89
|
+
onKeyDown: (t) => {
|
|
90
|
+
if (n || t.altKey || t.ctrlKey || t.metaKey) return;
|
|
91
|
+
let r;
|
|
92
|
+
switch (t.key) {
|
|
93
|
+
case "ArrowRight":
|
|
94
|
+
r = {
|
|
95
|
+
...f,
|
|
96
|
+
column: s + o.getColSpan()
|
|
97
|
+
};
|
|
98
|
+
break;
|
|
99
|
+
case "ArrowLeft":
|
|
100
|
+
r = {
|
|
101
|
+
...f,
|
|
102
|
+
column: s - 1
|
|
103
|
+
};
|
|
104
|
+
break;
|
|
105
|
+
case "ArrowDown":
|
|
106
|
+
r = {
|
|
107
|
+
...f,
|
|
108
|
+
row: a.index + o.getRowSpan()
|
|
109
|
+
};
|
|
110
|
+
break;
|
|
111
|
+
case "ArrowUp":
|
|
112
|
+
r = {
|
|
113
|
+
...f,
|
|
114
|
+
row: a.index - 1
|
|
115
|
+
};
|
|
116
|
+
break;
|
|
117
|
+
case "Home":
|
|
118
|
+
r = {
|
|
119
|
+
...f,
|
|
120
|
+
column: 0
|
|
121
|
+
};
|
|
122
|
+
break;
|
|
123
|
+
case "End":
|
|
124
|
+
r = {
|
|
125
|
+
...f,
|
|
126
|
+
column: p.columns.length - 1
|
|
127
|
+
};
|
|
128
|
+
break;
|
|
129
|
+
case " ":
|
|
130
|
+
t.preventDefault(), e.select(f, t.shiftKey);
|
|
131
|
+
return;
|
|
132
|
+
default: return;
|
|
133
|
+
}
|
|
134
|
+
if (t.preventDefault(), r.row < 0 || r.column < 0 || r.row >= p.rows.length || r.column >= p.columns.length) return;
|
|
135
|
+
let i = y(p, r);
|
|
136
|
+
e.select(r, t.shiftKey), c.current.get(p.rows[i.row].cells[i.column].id)?.focus();
|
|
137
|
+
},
|
|
138
|
+
children: [a.index < p.headerRowCount ? /* @__PURE__ */ u("span", {
|
|
139
|
+
className: "visuallyHidden",
|
|
140
|
+
children: i(g) || "Пустой заголовок"
|
|
141
|
+
}) : null, /* @__PURE__ */ u("div", {
|
|
142
|
+
inert: !0,
|
|
143
|
+
className: E.cellContent,
|
|
144
|
+
children: r(g)
|
|
145
|
+
})]
|
|
146
|
+
}, o.id);
|
|
147
|
+
})
|
|
148
|
+
}, a.id)) })]
|
|
149
|
+
})
|
|
150
|
+
})] });
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region src/table-editor/ui/TableEditorStructure.tsx
|
|
154
|
+
function A({ editor: t, createEmptyValue: n, disabled: r }) {
|
|
155
|
+
let [a, o] = c(null), { document: s, focus: f } = t, p = a ? v(s, a).find((e) => f[a] >= e.start && f[a] < e.start + e.count) : null;
|
|
156
|
+
return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ d("details", {
|
|
157
|
+
className: E.structure,
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ u("summary", { children: "Строки и столбцы" }),
|
|
160
|
+
["row", "column"].map((i) => /* @__PURE__ */ d("div", {
|
|
161
|
+
className: E.toolbar,
|
|
162
|
+
role: "group",
|
|
163
|
+
"aria-label": i === "row" ? "Строки" : "Столбцы",
|
|
164
|
+
children: [
|
|
165
|
+
/* @__PURE__ */ u("strong", { children: i === "row" ? "Строка" : "Столбец" }),
|
|
166
|
+
[0, 1].map((a) => /* @__PURE__ */ d(e, {
|
|
167
|
+
disabled: r,
|
|
168
|
+
onClick: () => {
|
|
169
|
+
let e = Array.from({ length: i === "row" ? s.columns.length : s.rows.length }, () => ({
|
|
170
|
+
id: T(),
|
|
171
|
+
value: n()
|
|
172
|
+
})), r = T();
|
|
173
|
+
t.execute((t) => b(t, i, f[i] + a, r, e, f.row < s.headerRowCount ? "header" : "body"));
|
|
174
|
+
},
|
|
175
|
+
children: ["Вставить ", a ? "после" : "перед"]
|
|
176
|
+
}, a)),
|
|
177
|
+
[-1, 1].map((n) => /* @__PURE__ */ d(e, {
|
|
178
|
+
disabled: r,
|
|
179
|
+
onClick: () => t.execute((e) => S(e, i, f[i], n)),
|
|
180
|
+
children: ["Переместить ", i === "row" ? n === -1 ? "выше" : "ниже" : n === -1 ? "левее" : "правее"]
|
|
181
|
+
}, n)),
|
|
182
|
+
/* @__PURE__ */ d(e, {
|
|
183
|
+
tone: "error",
|
|
184
|
+
disabled: r,
|
|
185
|
+
onClick: () => o(i),
|
|
186
|
+
children: ["Удалить ", i === "row" ? "строку" : "столбец"]
|
|
187
|
+
})
|
|
188
|
+
]
|
|
189
|
+
}, i)),
|
|
190
|
+
/* @__PURE__ */ u(e, {
|
|
191
|
+
disabled: r,
|
|
192
|
+
onClick: () => {
|
|
193
|
+
let e = s.columns.map(() => ({
|
|
194
|
+
id: T(),
|
|
195
|
+
value: n()
|
|
196
|
+
})), r = T();
|
|
197
|
+
t.execute((t) => b(t, "row", t.headerRowCount, r, e, "header"));
|
|
198
|
+
},
|
|
199
|
+
children: "Добавить строку заголовка"
|
|
200
|
+
})
|
|
201
|
+
]
|
|
202
|
+
}), /* @__PURE__ */ u(i, {
|
|
203
|
+
open: !!a,
|
|
204
|
+
onClose: () => o(null),
|
|
205
|
+
title: "Удалить часть таблицы?",
|
|
206
|
+
description: `Будет удалено ${p?.count ?? 0} ${a === "row" ? "строк" : "столбцов"}, включая скрытое объединением содержимое. Объединённая группа удаляется целиком. До сохранения действие можно отменить.`,
|
|
207
|
+
children: /* @__PURE__ */ d("div", {
|
|
208
|
+
className: E.toolbar,
|
|
209
|
+
children: [/* @__PURE__ */ u(e, {
|
|
210
|
+
onClick: () => o(null),
|
|
211
|
+
children: "Не удалять"
|
|
212
|
+
}), /* @__PURE__ */ u(e, {
|
|
213
|
+
tone: "error",
|
|
214
|
+
disabled: r,
|
|
215
|
+
onClick: () => {
|
|
216
|
+
a && t.execute((e) => g(e, a, f[a])), o(null);
|
|
217
|
+
},
|
|
218
|
+
children: "Удалить группу"
|
|
219
|
+
})]
|
|
220
|
+
})
|
|
221
|
+
})] });
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
224
|
+
//#region src/table-editor/ui/TableEditorToolbar.tsx
|
|
225
|
+
function j({ editor: t, disabled: n, extendSelection: i, onExtendSelectionChange: a }) {
|
|
226
|
+
let { document: o, selection: s } = t, c = {
|
|
227
|
+
row: s.row + s.rowSpan - 1,
|
|
228
|
+
column: s.column + s.columnSpan - 1
|
|
229
|
+
}, l = s.rowSpan * s.columnSpan === 1, f = s.row < o.headerRowCount && c.row >= o.headerRowCount, p = o.merges.find((e) => e.row === s.row && e.column === s.column && e.rowSpan === s.rowSpan && e.columnSpan === s.columnSpan);
|
|
230
|
+
return /* @__PURE__ */ d("div", {
|
|
231
|
+
className: E.toolbar,
|
|
232
|
+
role: "group",
|
|
233
|
+
"aria-label": "История и объединение",
|
|
234
|
+
children: [
|
|
235
|
+
/* @__PURE__ */ u(e, {
|
|
236
|
+
disabled: n || !t.canUndo,
|
|
237
|
+
onClick: t.undo,
|
|
238
|
+
children: "Отменить"
|
|
239
|
+
}),
|
|
240
|
+
/* @__PURE__ */ u(e, {
|
|
241
|
+
disabled: n || !t.canRedo,
|
|
242
|
+
onClick: t.redo,
|
|
243
|
+
children: "Повторить"
|
|
244
|
+
}),
|
|
245
|
+
/* @__PURE__ */ u(e, {
|
|
246
|
+
disabled: n || l || f || !!p,
|
|
247
|
+
onClick: () => t.execute((e) => x(e, s, c)),
|
|
248
|
+
children: "Объединить ячейки"
|
|
249
|
+
}),
|
|
250
|
+
/* @__PURE__ */ u(e, {
|
|
251
|
+
disabled: n || !p,
|
|
252
|
+
onClick: () => t.execute((e) => C(e, s)),
|
|
253
|
+
children: "Разъединить ячейки"
|
|
254
|
+
}),
|
|
255
|
+
/* @__PURE__ */ u(r, {
|
|
256
|
+
label: "Выделять диапазон",
|
|
257
|
+
value: i,
|
|
258
|
+
disabled: n,
|
|
259
|
+
onChange: a
|
|
260
|
+
}),
|
|
261
|
+
/* @__PURE__ */ d("span", {
|
|
262
|
+
role: "status",
|
|
263
|
+
children: [
|
|
264
|
+
"Выделение: ",
|
|
265
|
+
s.rowSpan,
|
|
266
|
+
" × ",
|
|
267
|
+
s.columnSpan,
|
|
268
|
+
". Шаг ",
|
|
269
|
+
t.historyPosition,
|
|
270
|
+
" из ",
|
|
271
|
+
t.historyLength - 1,
|
|
272
|
+
"."
|
|
273
|
+
]
|
|
274
|
+
}),
|
|
275
|
+
f ? /* @__PURE__ */ u("p", { children: "Заголовок и основную часть нельзя объединить в одну ячейку." }) : null
|
|
276
|
+
]
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
//#endregion
|
|
280
|
+
//#region src/table-editor/ui/TableEditor.tsx
|
|
281
|
+
function M({ editor: e, renderCell: i, getCellText: a, renderValueEditor: o, createEmptyValue: s, disabled: l = !1 }) {
|
|
282
|
+
let [f, p] = c(!1), { document: m, focus: h } = e, g = m.rows[h.row].cells[h.column];
|
|
283
|
+
return /* @__PURE__ */ d("section", {
|
|
284
|
+
className: E.editor,
|
|
285
|
+
"aria-label": "Конструктор таблицы",
|
|
286
|
+
children: [
|
|
287
|
+
/* @__PURE__ */ u(t, {
|
|
288
|
+
label: "Название таблицы",
|
|
289
|
+
value: m.caption,
|
|
290
|
+
disabled: l,
|
|
291
|
+
onChange: (t) => e.change({
|
|
292
|
+
...m,
|
|
293
|
+
caption: t ?? ""
|
|
294
|
+
})
|
|
295
|
+
}),
|
|
296
|
+
/* @__PURE__ */ u(j, {
|
|
297
|
+
editor: e,
|
|
298
|
+
disabled: l,
|
|
299
|
+
extendSelection: f,
|
|
300
|
+
onExtendSelectionChange: p
|
|
301
|
+
}),
|
|
302
|
+
e.error ? /* @__PURE__ */ u("p", {
|
|
303
|
+
role: "alert",
|
|
304
|
+
children: e.error
|
|
305
|
+
}) : null,
|
|
306
|
+
/* @__PURE__ */ u(k, {
|
|
307
|
+
editor: e,
|
|
308
|
+
disabled: l,
|
|
309
|
+
renderCell: i,
|
|
310
|
+
getCellText: a,
|
|
311
|
+
extendSelection: f
|
|
312
|
+
}),
|
|
313
|
+
/* @__PURE__ */ d("div", {
|
|
314
|
+
className: E.inspector,
|
|
315
|
+
children: [
|
|
316
|
+
/* @__PURE__ */ d("strong", { children: [
|
|
317
|
+
"Ячейка: строка ",
|
|
318
|
+
h.row + 1,
|
|
319
|
+
", столбец ",
|
|
320
|
+
h.column + 1
|
|
321
|
+
] }),
|
|
322
|
+
o({
|
|
323
|
+
cell: g,
|
|
324
|
+
disabled: l,
|
|
325
|
+
onChange: (t) => e.change(w(m, h, t))
|
|
326
|
+
}),
|
|
327
|
+
e.selection.rowSpan * e.selection.columnSpan > 1 ? /* @__PURE__ */ u("p", { children: "При объединении показывается верхняя левая ячейка. Остальное содержимое сохранится и снова появится после разъединения." }) : null
|
|
328
|
+
]
|
|
329
|
+
}),
|
|
330
|
+
/* @__PURE__ */ u(A, {
|
|
331
|
+
editor: e,
|
|
332
|
+
disabled: l,
|
|
333
|
+
createEmptyValue: s
|
|
334
|
+
}),
|
|
335
|
+
/* @__PURE__ */ d("div", {
|
|
336
|
+
className: E.toolbar,
|
|
337
|
+
children: [
|
|
338
|
+
/* @__PURE__ */ u(r, {
|
|
339
|
+
label: "Скрыть заголовки при публикации",
|
|
340
|
+
value: m.hideHeaders,
|
|
341
|
+
disabled: l,
|
|
342
|
+
onChange: (t) => e.change({
|
|
343
|
+
...m,
|
|
344
|
+
hideHeaders: t
|
|
345
|
+
})
|
|
346
|
+
}),
|
|
347
|
+
/* @__PURE__ */ u(r, {
|
|
348
|
+
label: "Показывать номера строк",
|
|
349
|
+
value: m.showRowNumbers,
|
|
350
|
+
disabled: l,
|
|
351
|
+
onChange: (t) => e.change({
|
|
352
|
+
...m,
|
|
353
|
+
showRowNumbers: t
|
|
354
|
+
})
|
|
355
|
+
}),
|
|
356
|
+
/* @__PURE__ */ u(n, {
|
|
357
|
+
label: "Ширина выбранного столбца, px",
|
|
358
|
+
value: m.columns[h.column].width ?? void 0,
|
|
359
|
+
min: 40,
|
|
360
|
+
max: 1600,
|
|
361
|
+
disabled: l,
|
|
362
|
+
onChange: (t) => {
|
|
363
|
+
t !== void 0 && (t < 40 || t > 1600) || e.change({
|
|
364
|
+
...m,
|
|
365
|
+
columns: m.columns.map((e, n) => n === h.column ? {
|
|
366
|
+
...e,
|
|
367
|
+
width: t ?? null
|
|
368
|
+
} : e)
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
})
|
|
372
|
+
]
|
|
373
|
+
})
|
|
374
|
+
]
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
//#endregion
|
|
378
|
+
//#region src/table-editor/model/useTableEditor.ts
|
|
379
|
+
function N(e) {
|
|
380
|
+
let [t, n] = c(() => (h(e), {
|
|
381
|
+
documents: [e],
|
|
382
|
+
index: 0,
|
|
383
|
+
anchor: {
|
|
384
|
+
row: 0,
|
|
385
|
+
column: 0
|
|
386
|
+
},
|
|
387
|
+
focus: {
|
|
388
|
+
row: 0,
|
|
389
|
+
column: 0
|
|
390
|
+
},
|
|
391
|
+
error: null
|
|
392
|
+
})), r = t.documents[t.index], i = (e, t = !1) => {
|
|
393
|
+
let i = y(r, e), a = {
|
|
394
|
+
row: i.row,
|
|
395
|
+
column: i.column
|
|
396
|
+
};
|
|
397
|
+
n((e) => ({
|
|
398
|
+
...e,
|
|
399
|
+
anchor: t ? e.anchor : a,
|
|
400
|
+
focus: a,
|
|
401
|
+
error: null
|
|
402
|
+
}));
|
|
403
|
+
}, a = (e) => {
|
|
404
|
+
h(e), n((t) => {
|
|
405
|
+
if (t.documents[t.index] === e) return t;
|
|
406
|
+
let n = [...t.documents.slice(0, t.index + 1), e].slice(-101), r = {
|
|
407
|
+
row: Math.min(t.focus.row, e.rows.length - 1),
|
|
408
|
+
column: Math.min(t.focus.column, e.columns.length - 1)
|
|
409
|
+
}, i = y(e, r), a = {
|
|
410
|
+
row: i.row,
|
|
411
|
+
column: i.column
|
|
412
|
+
};
|
|
413
|
+
return {
|
|
414
|
+
documents: n,
|
|
415
|
+
index: n.length - 1,
|
|
416
|
+
anchor: a,
|
|
417
|
+
focus: a,
|
|
418
|
+
error: null
|
|
419
|
+
};
|
|
420
|
+
});
|
|
421
|
+
}, o = (e) => n((t) => {
|
|
422
|
+
let n = Math.max(0, Math.min(t.index + e, t.documents.length - 1));
|
|
423
|
+
return {
|
|
424
|
+
...t,
|
|
425
|
+
index: n,
|
|
426
|
+
anchor: {
|
|
427
|
+
row: 0,
|
|
428
|
+
column: 0
|
|
429
|
+
},
|
|
430
|
+
focus: {
|
|
431
|
+
row: 0,
|
|
432
|
+
column: 0
|
|
433
|
+
},
|
|
434
|
+
error: null
|
|
435
|
+
};
|
|
436
|
+
});
|
|
437
|
+
return {
|
|
438
|
+
document: r,
|
|
439
|
+
selection: _(r, t.anchor, t.focus),
|
|
440
|
+
focus: t.focus,
|
|
441
|
+
canUndo: t.index > 0,
|
|
442
|
+
canRedo: t.index < t.documents.length - 1,
|
|
443
|
+
historyPosition: t.index,
|
|
444
|
+
historyLength: t.documents.length,
|
|
445
|
+
error: t.error,
|
|
446
|
+
select: i,
|
|
447
|
+
change: a,
|
|
448
|
+
undo: () => o(-1),
|
|
449
|
+
redo: () => o(1),
|
|
450
|
+
execute: (e) => {
|
|
451
|
+
try {
|
|
452
|
+
a(e(r));
|
|
453
|
+
} catch (e) {
|
|
454
|
+
n((t) => ({
|
|
455
|
+
...t,
|
|
456
|
+
error: e instanceof Error ? e.message : "Не удалось изменить таблицу."
|
|
457
|
+
}));
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
//#endregion
|
|
463
|
+
export { M as TableEditor, N as useTableEditor };
|
|
464
|
+
|
|
465
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/table-editor/ui/TableEditor.module.scss","../../src/table-editor/model/useTableEditorTable.ts","../../src/table-editor/ui/TableEditorGrid.tsx","../../src/table-editor/ui/TableEditorStructure.tsx","../../src/table-editor/ui/TableEditorToolbar.tsx","../../src/table-editor/ui/TableEditor.tsx","../../src/table-editor/model/useTableEditor.ts"],"sourcesContent":[".editor {\n\tdisplay: grid;\n\tgap: var(--space-md);\n\tmin-width: 0;\n\tcolor: var(--content-0);\n}\n.toolbar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: var(--space-sm);\n}\n.help {\n\tmargin: 0;\n\tcolor: var(--content-1);\n}\n.scroll {\n\tmax-height: 34rem;\n\toverflow: auto;\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n}\n.table {\n\twidth: max-content;\n\tmin-width: 100%;\n\ttable-layout: fixed;\n\tborder-collapse: collapse;\n\n\ttd,\n\tth {\n\t\tpadding: var(--space-sm);\n\t\tmin-width: 6rem;\n\t\tborder: var(--border);\n\t\tvertical-align: top;\n\t\ttext-align: start;\n\t\tbackground: var(--surface-0);\n\t\tcursor: cell;\n\t\t&[aria-selected=\"true\"] {\n\t\t\tbackground: var(--surface-2);\n\t\t\tbox-shadow: inset 0 0 0 2px var(--content-1);\n\t\t}\n\t\t&:focus {\n\t\t\toutline: 3px solid var(--content-0);\n\t\t\toutline-offset: -3px;\n\t\t}\n\t}\n\ttr[data-header] th {\n\t\tfont-weight: 600;\n\t\t&:not([aria-selected=\"true\"]) {\n\t\t\tbackground: var(--surface-1);\n\t\t}\n\t}\n}\n.cellContent {\n\tmin-height: 2rem;\n\toverflow-wrap: anywhere;\n\tpointer-events: none;\n\tuser-select: none;\n}\n.inspector {\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-md);\n\tborder: var(--border);\n\tbackground: var(--surface-1);\n}\n.structure {\n\tdisplay: grid;\n\tpadding: var(--space-sm);\n\tborder: var(--border);\n\tsummary {\n\t\tcursor: pointer;\n\t\tmargin-bottom: var(--space-sm);\n\t}\n\t.toolbar {\n\t\tmargin-bottom: var(--space-sm);\n\t}\n}\n","import { useMemo } from \"react\";\n\nimport { getTableDocumentCellRange, type TableDocument, type TableDocumentRow } from \"@ryuzaki13/react-foundation-lib/table-document\";\nimport { cellSpanningFeature, tableFeatures, useTable, type ColumnDef } from \"@tanstack/react-table\";\n\nconst features = tableFeatures({ cellSpanningFeature });\n\n/**\n * TanStack 9 получает стабильный anchor как accessor value: одинаковый текст\n * соседних ячеек сам по себе никогда не объединяет их. Порядок документа не\n * сортируется и не фильтруется; authored spans остаются authoritative.\n */\nexport function useTableEditorTable<T>(document: TableDocument<T>) {\n\t// Merge меняет accessor identity даже без изменения rows. Новый snapshot data\n\t// сбрасывает кэш значений TanStack и не оставляет устаревшие spans на экране.\n\tconst data = useMemo(() => [...document.rows], [document]);\n\tconst columns = useMemo<ColumnDef<typeof features, TableDocumentRow<T>>[]>(\n\t\t() =>\n\t\t\tdocument.columns.map((column, c) => ({\n\t\t\t\tid: column.id,\n\t\t\t\taccessorFn: (_row, r) => {\n\t\t\t\t\tconst range = getTableDocumentCellRange(document, { row: r, column: c });\n\t\t\t\t\treturn document.rows[range.row].cells[range.column].id;\n\t\t\t\t},\n\t\t\t\tspanRows: true,\n\t\t\t\tspanColumns: ({ row }) => {\n\t\t\t\t\tconst range = getTableDocumentCellRange(document, { row: row.index, column: c });\n\t\t\t\t\treturn range.column === c ? range.columnSpan : 1;\n\t\t\t\t}\n\t\t\t})),\n\t\t[document]\n\t);\n\treturn useTable({ features, data, columns, getRowId: (row) => row.id });\n}\n","import { useId, useRef, type ReactNode } from \"react\";\n\nimport {\n\tgetTableDocumentCellRange,\n\ttype TableDocumentCell,\n\ttype TableDocumentPosition\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { type TableEditorController } from \"../model/useTableEditor\";\nimport { useTableEditorTable } from \"../model/useTableEditorTable\";\n\nimport styles from \"./TableEditor.module.scss\";\n\ntype TableEditorGridProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly extendSelection: boolean;\n\treadonly disabled?: boolean;\n\treadonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;\n\treadonly getCellText: (cell: TableDocumentCell<T>) => string;\n};\n\n/** Доступная сетка: roving tabindex, стрелки/Shift и выбор диапазона без drag-only действий. */\nexport function TableEditorGrid<T>({ editor, extendSelection, disabled, renderCell, getCellText }: TableEditorGridProps<T>) {\n\tconst helpId = useId();\n\tconst nodes = useRef(new Map<string, HTMLTableCellElement>());\n\tconst table = useTableEditorTable(editor.document);\n\tconst { document, selection, focus } = editor;\n\treturn (\n\t\t<>\n\t\t\t<p id={helpId} className={styles.help}>\n\t\t\t\tСтрелки — переход между ячейками. Shift + стрелки или Shift + щелчок — выделение диапазона. Содержимое выбранной ячейки\n\t\t\t\tредактируется под таблицей.\n\t\t\t</p>\n\t\t\t<div className={styles.scroll}>\n\t\t\t\t<table\n\t\t\t\t\trole=\"grid\"\n\t\t\t\t\taria-label={document.caption || \"Редактор таблицы\"}\n\t\t\t\t\taria-describedby={helpId}\n\t\t\t\t\taria-multiselectable=\"true\"\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tclassName={styles.table}>\n\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t{document.columns.map((column) => (\n\t\t\t\t\t\t\t<col key={column.id} style={{ width: column.width ?? 180 }} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</colgroup>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{table.getRowModel().rows.map((row) => (\n\t\t\t\t\t\t\t<tr key={row.id} aria-rowindex={row.index + 1} data-header={row.index < document.headerRowCount || undefined}>\n\t\t\t\t\t\t\t\t{row.getAllCells().map((cell, column) => {\n\t\t\t\t\t\t\t\t\tif (cell.getIsCovered()) return null;\n\t\t\t\t\t\t\t\t\tconst selected =\n\t\t\t\t\t\t\t\t\t\trow.index >= selection.row &&\n\t\t\t\t\t\t\t\t\t\trow.index < selection.row + selection.rowSpan &&\n\t\t\t\t\t\t\t\t\t\tcolumn >= selection.column &&\n\t\t\t\t\t\t\t\t\t\tcolumn < selection.column + selection.columnSpan;\n\t\t\t\t\t\t\t\t\tconst position = { row: row.index, column };\n\t\t\t\t\t\t\t\t\tconst original = row.original.cells[column];\n\t\t\t\t\t\t\t\t\tconst Cell = row.index < document.headerRowCount ? \"th\" : \"td\";\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Cell\n\t\t\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\t\t\trole={row.index < document.headerRowCount ? \"columnheader\" : \"gridcell\"}\n\t\t\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (node) nodes.current.set(original.id, node);\n\t\t\t\t\t\t\t\t\t\t\t\telse nodes.current.delete(original.id);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\trowSpan={cell.getRowSpan()}\n\t\t\t\t\t\t\t\t\t\t\tcolSpan={cell.getColSpan()}\n\t\t\t\t\t\t\t\t\t\t\taria-colindex={column + 1}\n\t\t\t\t\t\t\t\t\t\t\taria-label={`Строка ${row.index + 1}, столбец ${column + 1}: ${getCellText(original) || \"Пустая ячейка\"}`}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={!disabled && focus.row === row.index && focus.column === column ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!disabled) editor.select(position, extendSelection || event.shiftKey);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonPointerEnter={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!disabled && event.pointerType === \"mouse\" && event.buttons === 1)\n\t\t\t\t\t\t\t\t\t\t\t\t\teditor.select(position, true);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || event.altKey || event.ctrlKey || event.metaKey) return;\n\t\t\t\t\t\t\t\t\t\t\t\tlet next: TableDocumentPosition;\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (event.key) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: column + cell.getColSpan() };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: column - 1 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, row: row.index + cell.getRowSpan() };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, row: row.index - 1 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"Home\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: 0 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"End\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: document.columns.length - 1 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \" \":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\teditor.select(position, event.shiftKey);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.row < 0 ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.column < 0 ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.row >= document.rows.length ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.column >= document.columns.length\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\tconst range = getTableDocumentCellRange(document, next);\n\t\t\t\t\t\t\t\t\t\t\t\teditor.select(next, event.shiftKey);\n\t\t\t\t\t\t\t\t\t\t\t\tnodes.current.get(document.rows[range.row].cells[range.column].id)?.focus();\n\t\t\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t\t\t{/* Preview не должен создавать вложенные tab stops или открывать ссылки вместо выделения. */}\n\t\t\t\t\t\t\t\t\t\t\t{row.index < document.headerRowCount ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"visuallyHidden\">{getCellText(original) || \"Пустой заголовок\"}</span>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t<div inert className={styles.cellContent}>\n\t\t\t\t\t\t\t\t\t\t\t\t{renderCell(original)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</Cell>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { useState } from \"react\";\n\nimport { uuidv4 } from \"@ryuzaki13/react-foundation-lib/crypto\";\nimport {\n\tdeleteTableDocumentAxisGroup,\n\tgetTableDocumentAxisGroups,\n\tinsertTableDocumentAxis,\n\tmoveTableDocumentAxisGroup\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { Button } from \"../../button\";\nimport { Dialog } from \"../../dialog\";\nimport { type TableEditorController } from \"../model/useTableEditor\";\n\nimport styles from \"./TableEditor.module.scss\";\n\ntype TableEditorStructureProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly createEmptyValue: () => T;\n\treadonly disabled?: boolean;\n};\n\n/** Вставка и доступный reorder без обязательного drag; удаление подтверждает весь затронутый блок. */\nexport function TableEditorStructure<T>({ editor, createEmptyValue, disabled }: TableEditorStructureProps<T>) {\n\tconst [removing, setRemoving] = useState<\"row\" | \"column\" | null>(null);\n\tconst { document, focus } = editor;\n\tconst group = removing\n\t\t? getTableDocumentAxisGroups(document, removing).find(\n\t\t\t\t(item) => focus[removing] >= item.start && focus[removing] < item.start + item.count\n\t\t\t)\n\t\t: null;\n\treturn (\n\t\t<>\n\t\t\t<details className={styles.structure}>\n\t\t\t\t<summary>Строки и столбцы</summary>\n\t\t\t\t{([\"row\", \"column\"] as const).map((axis) => (\n\t\t\t\t\t<div key={axis} className={styles.toolbar} role=\"group\" aria-label={axis === \"row\" ? \"Строки\" : \"Столбцы\"}>\n\t\t\t\t\t\t<strong>{axis === \"row\" ? \"Строка\" : \"Столбец\"}</strong>\n\t\t\t\t\t\t{([0, 1] as const).map((offset) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tconst cells = Array.from(\n\t\t\t\t\t\t\t\t\t\t{ length: axis === \"row\" ? document.columns.length : document.rows.length },\n\t\t\t\t\t\t\t\t\t\t() => ({ id: uuidv4(), value: createEmptyValue() })\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst id = uuidv4();\n\t\t\t\t\t\t\t\t\teditor.execute((current) =>\n\t\t\t\t\t\t\t\t\t\tinsertTableDocumentAxis(\n\t\t\t\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\t\t\t\taxis,\n\t\t\t\t\t\t\t\t\t\t\tfocus[axis] + offset,\n\t\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\t\tcells,\n\t\t\t\t\t\t\t\t\t\t\tfocus.row < document.headerRowCount ? \"header\" : \"body\"\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\tВставить {offset ? \"после\" : \"перед\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{([-1, 1] as const).map((direction) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={direction}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\teditor.execute((current) => moveTableDocumentAxisGroup(current, axis, focus[axis], direction))\n\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\tПереместить {axis === \"row\" ? (direction === -1 ? \"выше\" : \"ниже\") : direction === -1 ? \"левее\" : \"правее\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<Button tone=\"error\" disabled={disabled} onClick={() => setRemoving(axis)}>\n\t\t\t\t\t\t\tУдалить {axis === \"row\" ? \"строку\" : \"столбец\"}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t\t<Button\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tconst cells = document.columns.map(() => ({ id: uuidv4(), value: createEmptyValue() }));\n\t\t\t\t\t\tconst id = uuidv4();\n\t\t\t\t\t\teditor.execute((current) => insertTableDocumentAxis(current, \"row\", current.headerRowCount, id, cells, \"header\"));\n\t\t\t\t\t}}>\n\t\t\t\t\tДобавить строку заголовка\n\t\t\t\t</Button>\n\t\t\t</details>\n\t\t\t<Dialog\n\t\t\t\topen={Boolean(removing)}\n\t\t\t\tonClose={() => setRemoving(null)}\n\t\t\t\ttitle=\"Удалить часть таблицы?\"\n\t\t\t\tdescription={`Будет удалено ${group?.count ?? 0} ${removing === \"row\" ? \"строк\" : \"столбцов\"}, включая скрытое объединением содержимое. Объединённая группа удаляется целиком. До сохранения действие можно отменить.`}>\n\t\t\t\t<div className={styles.toolbar}>\n\t\t\t\t\t<Button onClick={() => setRemoving(null)}>Не удалять</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttone=\"error\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (removing) editor.execute((current) => deleteTableDocumentAxisGroup(current, removing, focus[removing]));\n\t\t\t\t\t\t\tsetRemoving(null);\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\tУдалить группу\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</Dialog>\n\t\t</>\n\t);\n}\n","import {\n\tmergeTableDocumentCells,\n\tsplitTableDocumentCell,\n\ttype TableDocumentPosition\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { Button } from \"../../button\";\nimport { CheckBox } from \"../../check-box\";\nimport { type TableEditorController } from \"../model/useTableEditor\";\n\nimport styles from \"./TableEditor.module.scss\";\n\ntype TableEditorToolbarProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly disabled?: boolean;\n\treadonly extendSelection: boolean;\n\treadonly onExtendSelectionChange: (value: boolean) => void;\n};\n\n/** Явные названия действий вместо скрытых режимов merge/split из legacy. */\nexport function TableEditorToolbar<T>({ editor, disabled, extendSelection, onExtendSelectionChange }: TableEditorToolbarProps<T>) {\n\tconst { document, selection } = editor;\n\tconst end: TableDocumentPosition = { row: selection.row + selection.rowSpan - 1, column: selection.column + selection.columnSpan - 1 };\n\tconst isSingle = selection.rowSpan * selection.columnSpan === 1;\n\tconst crossesHeader = selection.row < document.headerRowCount && end.row >= document.headerRowCount;\n\tconst merge = document.merges.find(\n\t\t(range) =>\n\t\t\trange.row === selection.row &&\n\t\t\trange.column === selection.column &&\n\t\t\trange.rowSpan === selection.rowSpan &&\n\t\t\trange.columnSpan === selection.columnSpan\n\t);\n\treturn (\n\t\t<div className={styles.toolbar} role=\"group\" aria-label=\"История и объединение\">\n\t\t\t<Button disabled={disabled || !editor.canUndo} onClick={editor.undo}>\n\t\t\t\tОтменить\n\t\t\t</Button>\n\t\t\t<Button disabled={disabled || !editor.canRedo} onClick={editor.redo}>\n\t\t\t\tПовторить\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tdisabled={disabled || isSingle || crossesHeader || Boolean(merge)}\n\t\t\t\tonClick={() => editor.execute((current) => mergeTableDocumentCells(current, selection, end))}>\n\t\t\t\tОбъединить ячейки\n\t\t\t</Button>\n\t\t\t<Button disabled={disabled || !merge} onClick={() => editor.execute((current) => splitTableDocumentCell(current, selection))}>\n\t\t\t\tРазъединить ячейки\n\t\t\t</Button>\n\t\t\t<CheckBox label=\"Выделять диапазон\" value={extendSelection} disabled={disabled} onChange={onExtendSelectionChange} />\n\t\t\t<span role=\"status\">\n\t\t\t\tВыделение: {selection.rowSpan} × {selection.columnSpan}. Шаг {editor.historyPosition} из {editor.historyLength - 1}.\n\t\t\t</span>\n\t\t\t{crossesHeader ? <p>Заголовок и основную часть нельзя объединить в одну ячейку.</p> : null}\n\t\t</div>\n\t);\n}\n","import { useState, type ReactNode } from \"react\";\n\nimport { updateTableDocumentCell, type TableDocumentCell } from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { CheckBox } from \"../../check-box\";\nimport { Input, InputNumber } from \"../../input\";\nimport { type TableEditorController } from \"../model/useTableEditor\";\n\nimport styles from \"./TableEditor.module.scss\";\nimport { TableEditorGrid } from \"./TableEditorGrid\";\nimport { TableEditorStructure } from \"./TableEditorStructure\";\nimport { TableEditorToolbar } from \"./TableEditorToolbar\";\n\n/** Host задаёт редактор содержимого: plain text, Lexical или ссылки на документы без KTK-зависимости пакета. */\nexport type TableEditorValueProps<T> = {\n\treadonly cell: TableDocumentCell<T>;\n\treadonly disabled: boolean;\n\treadonly onChange: (value: T) => void;\n};\nexport type TableEditorProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;\n\t/** Доступное текстовое представление preview, в котором интерактивные ссылки отключены. */\n\treadonly getCellText: (cell: TableDocumentCell<T>) => string;\n\treadonly renderValueEditor: (props: TableEditorValueProps<T>) => ReactNode;\n\treadonly createEmptyValue: () => T;\n\treadonly disabled?: boolean;\n};\n\n/** Композиция редактора, не владеющая transport, server state или форматом содержимого ячеек. */\nexport function TableEditor<T>({\n\teditor,\n\trenderCell,\n\tgetCellText,\n\trenderValueEditor,\n\tcreateEmptyValue,\n\tdisabled = false\n}: TableEditorProps<T>) {\n\tconst [extendSelection, setExtendSelection] = useState(false);\n\tconst { document, focus } = editor;\n\tconst cell = document.rows[focus.row].cells[focus.column];\n\treturn (\n\t\t<section className={styles.editor} aria-label=\"Конструктор таблицы\">\n\t\t\t<Input\n\t\t\t\tlabel=\"Название таблицы\"\n\t\t\t\tvalue={document.caption}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonChange={(caption) => editor.change({ ...document, caption: caption ?? \"\" })}\n\t\t\t/>\n\t\t\t<TableEditorToolbar\n\t\t\t\teditor={editor}\n\t\t\t\tdisabled={disabled}\n\t\t\t\textendSelection={extendSelection}\n\t\t\t\tonExtendSelectionChange={setExtendSelection}\n\t\t\t/>\n\t\t\t{editor.error ? <p role=\"alert\">{editor.error}</p> : null}\n\t\t\t<TableEditorGrid\n\t\t\t\teditor={editor}\n\t\t\t\tdisabled={disabled}\n\t\t\t\trenderCell={renderCell}\n\t\t\t\tgetCellText={getCellText}\n\t\t\t\textendSelection={extendSelection}\n\t\t\t/>\n\t\t\t<div className={styles.inspector}>\n\t\t\t\t<strong>\n\t\t\t\t\tЯчейка: строка {focus.row + 1}, столбец {focus.column + 1}\n\t\t\t\t</strong>\n\t\t\t\t{renderValueEditor({ cell, disabled, onChange: (value) => editor.change(updateTableDocumentCell(document, focus, value)) })}\n\t\t\t\t{editor.selection.rowSpan * editor.selection.columnSpan > 1 ? (\n\t\t\t\t\t<p>\n\t\t\t\t\t\tПри объединении показывается верхняя левая ячейка. Остальное содержимое сохранится и снова появится после\n\t\t\t\t\t\tразъединения.\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t<TableEditorStructure editor={editor} disabled={disabled} createEmptyValue={createEmptyValue} />\n\t\t\t<div className={styles.toolbar}>\n\t\t\t\t<CheckBox\n\t\t\t\t\tlabel=\"Скрыть заголовки при публикации\"\n\t\t\t\t\tvalue={document.hideHeaders}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(hideHeaders) => editor.change({ ...document, hideHeaders })}\n\t\t\t\t/>\n\t\t\t\t<CheckBox\n\t\t\t\t\tlabel=\"Показывать номера строк\"\n\t\t\t\t\tvalue={document.showRowNumbers}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(showRowNumbers) => editor.change({ ...document, showRowNumbers })}\n\t\t\t\t/>\n\t\t\t\t<InputNumber\n\t\t\t\t\tlabel=\"Ширина выбранного столбца, px\"\n\t\t\t\t\tvalue={document.columns[focus.column].width ?? undefined}\n\t\t\t\t\tmin={40}\n\t\t\t\t\tmax={1600}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(width) => {\n\t\t\t\t\t\tif (width !== undefined && (width < 40 || width > 1600)) return;\n\t\t\t\t\t\teditor.change({\n\t\t\t\t\t\t\t...document,\n\t\t\t\t\t\t\tcolumns: document.columns.map((column, c) =>\n\t\t\t\t\t\t\t\tc === focus.column ? { ...column, width: width ?? null } : column\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","import { useState } from \"react\";\n\nimport {\n\tassertTableDocument,\n\texpandTableDocumentRange,\n\tgetTableDocumentCellRange,\n\ttype TableDocument,\n\ttype TableDocumentPosition,\n\ttype TableDocumentRange\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\n/** Локальный draft: серверные версии, сохранение и конфликты принадлежат host-приложению. */\nexport type TableEditorController<T> = {\n\treadonly document: TableDocument<T>;\n\treadonly selection: TableDocumentRange;\n\treadonly focus: TableDocumentPosition;\n\treadonly canUndo: boolean;\n\treadonly canRedo: boolean;\n\treadonly historyPosition: number;\n\treadonly historyLength: number;\n\treadonly error: string | null;\n\treadonly select: (position: TableDocumentPosition, extend?: boolean) => void;\n\treadonly change: (document: TableDocument<T>) => void;\n\treadonly execute: (command: (document: TableDocument<T>) => TableDocument<T>) => void;\n\treadonly undo: () => void;\n\treadonly redo: () => void;\n};\n\n/**\n * История хранит документы со структурным разделением, а не копии server cache.\n * Новый initialDocument применяется только при новом mount/key: refetch не\n * затирает ввод. Копировальный bounded-copy-stack не подходит — он дедуплицирует\n * элементы и не сохраняет ветку undo/redo. Здесь максимум 100 редакторских шагов.\n */\nexport function useTableEditor<T>(initialDocument: TableDocument<T>): TableEditorController<T> {\n\tconst [state, setState] = useState(() => {\n\t\tassertTableDocument(initialDocument);\n\t\treturn {\n\t\t\tdocuments: [initialDocument],\n\t\t\tindex: 0,\n\t\t\tanchor: { row: 0, column: 0 },\n\t\t\tfocus: { row: 0, column: 0 },\n\t\t\terror: null as string | null\n\t\t};\n\t});\n\tconst document = state.documents[state.index];\n\tconst select = (position: TableDocumentPosition, extend = false) => {\n\t\tconst range = getTableDocumentCellRange(document, position);\n\t\tconst focus = { row: range.row, column: range.column };\n\t\tsetState((current) => ({ ...current, anchor: extend ? current.anchor : focus, focus, error: null }));\n\t};\n\tconst change = (next: TableDocument<T>) => {\n\t\tassertTableDocument(next);\n\t\tsetState((current) => {\n\t\t\tif (current.documents[current.index] === next) return current;\n\t\t\tconst documents = [...current.documents.slice(0, current.index + 1), next].slice(-101);\n\t\t\tconst position = {\n\t\t\t\trow: Math.min(current.focus.row, next.rows.length - 1),\n\t\t\t\tcolumn: Math.min(current.focus.column, next.columns.length - 1)\n\t\t\t};\n\t\t\tconst range = getTableDocumentCellRange(next, position);\n\t\t\tconst focus = { row: range.row, column: range.column };\n\t\t\treturn { documents, index: documents.length - 1, anchor: focus, focus, error: null };\n\t\t});\n\t};\n\tconst travel = (direction: -1 | 1) =>\n\t\tsetState((current) => {\n\t\t\tconst index = Math.max(0, Math.min(current.index + direction, current.documents.length - 1));\n\t\t\treturn { ...current, index, anchor: { row: 0, column: 0 }, focus: { row: 0, column: 0 }, error: null };\n\t\t});\n\treturn {\n\t\tdocument,\n\t\tselection: expandTableDocumentRange(document, state.anchor, state.focus),\n\t\tfocus: state.focus,\n\t\tcanUndo: state.index > 0,\n\t\tcanRedo: state.index < state.documents.length - 1,\n\t\thistoryPosition: state.index,\n\t\thistoryLength: state.documents.length,\n\t\terror: state.error,\n\t\tselect,\n\t\tchange,\n\t\tundo: () => travel(-1),\n\t\tredo: () => travel(1),\n\t\texecute: (command) => {\n\t\t\ttry {\n\t\t\t\tchange(command(document));\n\t\t\t} catch (error) {\n\t\t\t\t// Геометрические предусловия отклоняют команду, сохраняя draft и историю.\n\t\t\t\tsetState((current) => ({ ...current, error: error instanceof Error ? error.message : \"Не удалось изменить таблицу.\" }));\n\t\t\t}\n\t\t}\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type TableDocument, type TableDocumentPosition, type TableDocumentRange } from "@ryuzaki13/react-foundation-lib/table-document";
|
|
2
|
+
/** Локальный draft: серверные версии, сохранение и конфликты принадлежат host-приложению. */
|
|
3
|
+
export type TableEditorController<T> = {
|
|
4
|
+
readonly document: TableDocument<T>;
|
|
5
|
+
readonly selection: TableDocumentRange;
|
|
6
|
+
readonly focus: TableDocumentPosition;
|
|
7
|
+
readonly canUndo: boolean;
|
|
8
|
+
readonly canRedo: boolean;
|
|
9
|
+
readonly historyPosition: number;
|
|
10
|
+
readonly historyLength: number;
|
|
11
|
+
readonly error: string | null;
|
|
12
|
+
readonly select: (position: TableDocumentPosition, extend?: boolean) => void;
|
|
13
|
+
readonly change: (document: TableDocument<T>) => void;
|
|
14
|
+
readonly execute: (command: (document: TableDocument<T>) => TableDocument<T>) => void;
|
|
15
|
+
readonly undo: () => void;
|
|
16
|
+
readonly redo: () => void;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* История хранит документы со структурным разделением, а не копии server cache.
|
|
20
|
+
* Новый initialDocument применяется только при новом mount/key: refetch не
|
|
21
|
+
* затирает ввод. Копировальный bounded-copy-stack не подходит — он дедуплицирует
|
|
22
|
+
* элементы и не сохраняет ветку undo/redo. Здесь максимум 100 редакторских шагов.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useTableEditor<T>(initialDocument: TableDocument<T>): TableEditorController<T>;
|
|
25
|
+
//# sourceMappingURL=useTableEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableEditor.d.ts","sourceRoot":"","sources":["../../../src/table-editor/model/useTableEditor.ts"],"names":[],"mappings":"AAEA,OAAO,EAIN,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,MAAM,gDAAgD,CAAC;AAExD,6FAA6F;AAC7F,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACtC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CA0D7F"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TableDocument, type TableDocumentRow } from "@ryuzaki13/react-foundation-lib/table-document";
|
|
2
|
+
/**
|
|
3
|
+
* TanStack 9 получает стабильный anchor как accessor value: одинаковый текст
|
|
4
|
+
* соседних ячеек сам по себе никогда не объединяет их. Порядок документа не
|
|
5
|
+
* сортируется и не фильтруется; authored spans остаются authoritative.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useTableEditorTable<T>(document: TableDocument<T>): import("@tanstack/react-table").ReactTable<{
|
|
8
|
+
cellSpanningFeature: import("@tanstack/table-core").TableFeature;
|
|
9
|
+
}, TableDocumentRow<T>, {}>;
|
|
10
|
+
//# sourceMappingURL=useTableEditorTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableEditorTable.d.ts","sourceRoot":"","sources":["../../../src/table-editor/model/useTableEditorTable.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAKtI;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;;4BAqBhE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type TableDocumentCell } from "@ryuzaki13/react-foundation-lib/table-document";
|
|
3
|
+
import { type TableEditorController } from "../model/useTableEditor";
|
|
4
|
+
/** Host задаёт редактор содержимого: plain text, Lexical или ссылки на документы без KTK-зависимости пакета. */
|
|
5
|
+
export type TableEditorValueProps<T> = {
|
|
6
|
+
readonly cell: TableDocumentCell<T>;
|
|
7
|
+
readonly disabled: boolean;
|
|
8
|
+
readonly onChange: (value: T) => void;
|
|
9
|
+
};
|
|
10
|
+
export type TableEditorProps<T> = {
|
|
11
|
+
readonly editor: TableEditorController<T>;
|
|
12
|
+
readonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;
|
|
13
|
+
/** Доступное текстовое представление preview, в котором интерактивные ссылки отключены. */
|
|
14
|
+
readonly getCellText: (cell: TableDocumentCell<T>) => string;
|
|
15
|
+
readonly renderValueEditor: (props: TableEditorValueProps<T>) => ReactNode;
|
|
16
|
+
readonly createEmptyValue: () => T;
|
|
17
|
+
readonly disabled?: boolean;
|
|
18
|
+
};
|
|
19
|
+
/** Композиция редактора, не владеющая transport, server state или форматом содержимого ячеек. */
|
|
20
|
+
export declare function TableEditor<T>({ editor, renderCell, getCellText, renderValueEditor, createEmptyValue, disabled }: TableEditorProps<T>): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=TableEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableEditor.d.ts","sourceRoot":"","sources":["../../../src/table-editor/ui/TableEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAIjH,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOrE,gHAAgH;AAChH,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CACtC,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IACjC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC/D,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IAC7D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC3E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAC9B,MAAM,EACN,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,QAAgB,EAChB,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BAuErB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type TableDocumentCell } from "@ryuzaki13/react-foundation-lib/table-document";
|
|
3
|
+
import { type TableEditorController } from "../model/useTableEditor";
|
|
4
|
+
type TableEditorGridProps<T> = {
|
|
5
|
+
readonly editor: TableEditorController<T>;
|
|
6
|
+
readonly extendSelection: boolean;
|
|
7
|
+
readonly disabled?: boolean;
|
|
8
|
+
readonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;
|
|
9
|
+
readonly getCellText: (cell: TableDocumentCell<T>) => string;
|
|
10
|
+
};
|
|
11
|
+
/** Доступная сетка: roving tabindex, стрелки/Shift и выбор диапазона без drag-only действий. */
|
|
12
|
+
export declare function TableEditorGrid<T>({ editor, extendSelection, disabled, renderCell, getCellText }: TableEditorGridProps<T>): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=TableEditorGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableEditorGrid.d.ts","sourceRoot":"","sources":["../../../src/table-editor/ui/TableEditorGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EAEN,KAAK,iBAAiB,EAEtB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKrE,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC9B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC/D,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;CAC7D,CAAC;AAEF,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,+BAoHzH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TableEditorController } from "../model/useTableEditor";
|
|
2
|
+
type TableEditorStructureProps<T> = {
|
|
3
|
+
readonly editor: TableEditorController<T>;
|
|
4
|
+
readonly createEmptyValue: () => T;
|
|
5
|
+
readonly disabled?: boolean;
|
|
6
|
+
};
|
|
7
|
+
/** Вставка и доступный reorder без обязательного drag; удаление подтверждает весь затронутый блок. */
|
|
8
|
+
export declare function TableEditorStructure<T>({ editor, createEmptyValue, disabled }: TableEditorStructureProps<T>): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=TableEditorStructure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableEditorStructure.d.ts","sourceRoot":"","sources":["../../../src/table-editor/ui/TableEditorStructure.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIrE,KAAK,yBAAyB,CAAC,CAAC,IAAI;IACnC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC,+BAoF3G"}
|