optikos 0.3.0 → 0.4.0
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/CHANGELOG.md +39 -1
- package/dist/bind.js +1 -1
- package/dist/bind.js.map +4 -4
- package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
- package/dist/chunk-2HNQ2XRY.js +2 -0
- package/dist/chunk-2HNQ2XRY.js.map +7 -0
- package/dist/chunk-2QMI2RRB.js +2 -0
- package/dist/chunk-2QMI2RRB.js.map +7 -0
- package/dist/{chunk-W3H7GTJY.js → chunk-2YRQULDC.js} +2 -2
- package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
- package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
- package/dist/chunk-3FCIZKIN.js +2 -0
- package/dist/chunk-3FCIZKIN.js.map +7 -0
- package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
- package/dist/chunk-3QRA3XOA.js +2 -0
- package/dist/chunk-3QRA3XOA.js.map +7 -0
- package/dist/chunk-3TCITFUU.js +2 -0
- package/dist/chunk-3TCITFUU.js.map +7 -0
- package/dist/chunk-3VDLX7ET.js +2 -0
- package/dist/chunk-3VDLX7ET.js.map +7 -0
- package/dist/{chunk-3TAW4AKH.js → chunk-4AZ44KV4.js} +2 -2
- package/dist/{chunk-TZOQWCVH.js → chunk-4CWYF4O7.js} +2 -2
- package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
- package/dist/{chunk-2YZB6XQR.js → chunk-4S3HRFQB.js} +2 -2
- package/dist/chunk-5BMG5ZBY.js +2 -0
- package/dist/{chunk-KLLAY2IM.js.map → chunk-5BMG5ZBY.js.map} +2 -2
- package/dist/chunk-5PWPAN62.js +2 -0
- package/dist/chunk-5PWPAN62.js.map +7 -0
- package/dist/chunk-5PYJ6FJK.js +2 -0
- package/dist/chunk-5PYJ6FJK.js.map +7 -0
- package/dist/{chunk-OGRFQTXA.js → chunk-643FOYQB.js} +2 -2
- package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
- package/dist/chunk-6LJK4QWF.js +2 -0
- package/dist/chunk-6LJK4QWF.js.map +7 -0
- package/dist/{chunk-JK74QK3M.js → chunk-6PZPBPAD.js} +2 -2
- package/dist/chunk-7Y2GHQRB.js +2 -0
- package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
- package/dist/{chunk-M242VYZA.js → chunk-AT7VFZRB.js} +2 -2
- package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
- package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
- package/dist/chunk-BJWREA76.js +2 -0
- package/dist/chunk-BJWREA76.js.map +7 -0
- package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
- package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
- package/dist/{chunk-FEHGU6EP.js → chunk-C3MWS7P2.js} +2 -2
- package/dist/{chunk-G2KUK6AT.js → chunk-CFGCB37K.js} +2 -2
- package/dist/{chunk-JI265XFO.js → chunk-CMV3F6HR.js} +2 -2
- package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
- package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
- package/dist/chunk-DJUSVBD5.js +2 -0
- package/dist/chunk-DJUSVBD5.js.map +7 -0
- package/dist/{chunk-HXDTGP2K.js → chunk-DWA45BWR.js} +2 -2
- package/dist/chunk-DWTDNKXX.js +2 -0
- package/dist/chunk-DWTDNKXX.js.map +7 -0
- package/dist/chunk-ESCLDVFS.js +2 -0
- package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
- package/dist/chunk-EXIADWI7.js +2 -0
- package/dist/chunk-EXIADWI7.js.map +7 -0
- package/dist/{chunk-5QUY72FX.js → chunk-F4HZUAKM.js} +2 -2
- package/dist/chunk-FCJI2JF7.js +3 -0
- package/dist/chunk-FCJI2JF7.js.map +7 -0
- package/dist/{chunk-Q26YZYTD.js → chunk-FPU53CCV.js} +2 -2
- package/dist/{chunk-3S24ZRPK.js → chunk-GEBAYD6N.js} +2 -2
- package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
- package/dist/chunk-GFFZTFQH.js +2 -0
- package/dist/chunk-GFFZTFQH.js.map +7 -0
- package/dist/chunk-GFJRGBQR.js +2 -0
- package/dist/chunk-GFJRGBQR.js.map +7 -0
- package/dist/chunk-GZIDE5K2.js +2 -0
- package/dist/chunk-GZIDE5K2.js.map +7 -0
- package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
- package/dist/chunk-HG7OOHGD.js +2 -0
- package/dist/chunk-HG7OOHGD.js.map +7 -0
- package/dist/{chunk-2ZUZ5HDL.js → chunk-HLS5FI55.js} +2 -2
- package/dist/chunk-HRW25TMU.js +2 -0
- package/dist/chunk-HX6TWXTX.js +2 -0
- package/dist/chunk-HX6TWXTX.js.map +7 -0
- package/dist/chunk-I5A74NMJ.js +2 -0
- package/dist/chunk-I5A74NMJ.js.map +7 -0
- package/dist/chunk-IUOEPAWG.js +2 -0
- package/dist/chunk-IUOEPAWG.js.map +7 -0
- package/dist/{chunk-IHE2MQ3W.js → chunk-J5QPFJ7M.js} +2 -2
- package/dist/chunk-JE56CJX2.js +2 -0
- package/dist/chunk-JE56CJX2.js.map +7 -0
- package/dist/chunk-JJLOUMCJ.js +2 -0
- package/dist/chunk-JJLOUMCJ.js.map +7 -0
- package/dist/chunk-JLKIHXZP.js +3 -0
- package/dist/chunk-JLKIHXZP.js.map +7 -0
- package/dist/{chunk-5BC72727.js → chunk-JSEI44A7.js} +2 -2
- package/dist/chunk-L5SQQFO7.js +2 -0
- package/dist/chunk-L5SQQFO7.js.map +7 -0
- package/dist/chunk-M2ZRKHE4.js +2 -0
- package/dist/chunk-M2ZRKHE4.js.map +7 -0
- package/dist/chunk-M7FNPRV4.js +2 -0
- package/dist/chunk-M7FNPRV4.js.map +7 -0
- package/dist/chunk-MNSDGJKA.js +3 -0
- package/dist/chunk-MNSDGJKA.js.map +7 -0
- package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
- package/dist/chunk-N2LS4JD6.js +2 -0
- package/dist/chunk-N2LS4JD6.js.map +7 -0
- package/dist/chunk-NJ5IFOPR.js +4 -0
- package/dist/{chunk-XX2MVWFS.js.map → chunk-NJ5IFOPR.js.map} +1 -1
- package/dist/{chunk-NXSTUFS7.js → chunk-NNR2FNHG.js} +2 -2
- package/dist/chunk-NQV4THNE.js +2 -0
- package/dist/{chunk-UXXJOU5J.js.map → chunk-NQV4THNE.js.map} +1 -1
- package/dist/{chunk-XHOBNSBO.js → chunk-P4O57S6N.js} +2 -2
- package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
- package/dist/chunk-PMOXLQ72.js +2 -0
- package/dist/chunk-PMOXLQ72.js.map +7 -0
- package/dist/chunk-Q6FY4L2F.js +2 -0
- package/dist/chunk-Q6FY4L2F.js.map +7 -0
- package/dist/chunk-R32HPK7R.js +2 -0
- package/dist/chunk-R32HPK7R.js.map +7 -0
- package/dist/{chunk-Z2JBUHKA.js → chunk-RG6SHPHF.js} +2 -2
- package/dist/{chunk-EDUMAMK4.js → chunk-S2CMWKVB.js} +2 -2
- package/dist/chunk-S4QD5NID.js +2 -0
- package/dist/chunk-S4QD5NID.js.map +7 -0
- package/dist/chunk-SB4ICXBV.js +2 -0
- package/dist/chunk-SB4ICXBV.js.map +7 -0
- package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
- package/dist/chunk-SWCB2GMN.js +2 -0
- package/dist/chunk-SWCB2GMN.js.map +7 -0
- package/dist/chunk-TQPQ4UEA.js +2 -0
- package/dist/chunk-TQPQ4UEA.js.map +7 -0
- package/dist/{chunk-Z2Z52GFT.js → chunk-U5L76VVB.js} +2 -2
- package/dist/chunk-UDXO3KM3.js +2 -0
- package/dist/chunk-UDXO3KM3.js.map +7 -0
- package/dist/{chunk-LQRFNQ2N.js → chunk-UQRQH2JW.js} +2 -2
- package/dist/chunk-V5G5JECN.js +2 -0
- package/dist/chunk-V5G5JECN.js.map +7 -0
- package/dist/{chunk-JBLRAM7Z.js → chunk-XFIREDWO.js} +2 -2
- package/dist/chunk-XQHATUKN.js +2 -0
- package/dist/{chunk-LW2WRUVL.js.map → chunk-XQHATUKN.js.map} +4 -4
- package/dist/chunk-XR677UYD.js +2 -0
- package/dist/chunk-XR677UYD.js.map +7 -0
- package/dist/{chunk-RNN55473.js → chunk-YDX2PCVL.js} +2 -2
- package/dist/{chunk-RNN55473.js.map → chunk-YDX2PCVL.js.map} +1 -1
- package/dist/chunk-YJTUFK4P.js +2 -0
- package/dist/chunk-YLFSCQL3.js +2 -0
- package/dist/chunk-YLFSCQL3.js.map +7 -0
- package/dist/chunk-YXOKWCYS.js +2 -0
- package/dist/chunk-YXOKWCYS.js.map +7 -0
- package/dist/{chunk-I4SP6JTU.js → chunk-Z6L55FTN.js} +2 -2
- package/dist/{chunk-6VBK2I5B.js → chunk-ZSPJZ3ZH.js} +2 -2
- package/dist/components/avatar.js +2 -0
- package/dist/components/avatar.js.map +7 -0
- package/dist/components/badge.js +1 -1
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/carousel.js +2 -0
- package/dist/components/carousel.js.map +7 -0
- package/dist/components/cellediting.js +1 -1
- package/dist/components/chart.js +2 -0
- package/dist/components/chart.js.map +7 -0
- package/dist/components/chat.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkboxgroup.js +1 -1
- package/dist/components/chip.js +1 -1
- package/dist/components/codeviewer.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/commandpalette.js +1 -1
- package/dist/components/container.js +1 -1
- package/dist/components/dataview.js +1 -1
- package/dist/components/datefield.js +1 -1
- package/dist/components/daterangefield.js +1 -1
- package/dist/components/datetimefield.js +2 -0
- package/dist/components/datetimefield.js.map +7 -0
- package/dist/components/dial.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/fieldgroup.js +1 -1
- package/dist/components/fieldlist.js +1 -1
- package/dist/components/fieldset.js +1 -1
- package/dist/components/filterbuilder.js +1 -1
- package/dist/components/form.js +1 -1
- package/dist/components/formactions.js +1 -1
- package/dist/components/formerrors.js +1 -1
- package/dist/components/formsection.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/gridexport.js +2 -0
- package/dist/components/gridexport.js.map +7 -0
- package/dist/components/gridstate.js +2 -0
- package/dist/components/gridstate.js.map +7 -0
- package/dist/components/grouping.js +2 -0
- package/dist/components/grouping.js.map +7 -0
- package/dist/components/icon.js +1 -1
- package/dist/components/image.js +2 -0
- package/dist/components/image.js.map +7 -0
- package/dist/components/imagecanvas.js +2 -0
- package/dist/components/imagecanvas.js.map +7 -0
- package/dist/components/imagefield.js +2 -0
- package/dist/components/imagefield.js.map +7 -0
- package/dist/components/inputgroup.js +1 -1
- package/dist/components/label.js +1 -1
- package/dist/components/listbox.js +1 -1
- package/dist/components/lookupfield.js +1 -1
- package/dist/components/maskfield.js +2 -0
- package/dist/components/maskfield.js.map +7 -0
- package/dist/components/menu.js +1 -1
- package/dist/components/messagebox.js +1 -1
- package/dist/components/navmenu.js +1 -1
- package/dist/components/numberfield.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/panel.js +1 -1
- package/dist/components/pickerfield.js +1 -1
- package/dist/components/radiogroup.js +1 -1
- package/dist/components/rowediting.js +2 -0
- package/dist/components/rowediting.js.map +7 -0
- package/dist/components/searchgrid.js +1 -1
- package/dist/components/secretfield.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/shortcuts.js +2 -0
- package/dist/components/shortcuts.js.map +7 -0
- package/dist/components/slider.js +1 -1
- package/dist/components/spacer.js +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/stat.js +2 -0
- package/dist/components/stat.js.map +7 -0
- package/dist/components/stepform.js +1 -1
- package/dist/components/stepper.js +1 -1
- package/dist/components/suggestfield.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/textfield.js +1 -1
- package/dist/components/timefield.js +2 -0
- package/dist/components/timefield.js.map +7 -0
- package/dist/components/timeline.js +2 -0
- package/dist/components/timeline.js.map +7 -0
- package/dist/components/toast.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toolbar.js +1 -1
- package/dist/components/tree.js +1 -1
- package/dist/components/treegrid.js +2 -0
- package/dist/components/treegrid.js.map +7 -0
- package/dist/components/viewmanager.js +1 -1
- package/dist/components/viewport.js +1 -1
- package/dist/components/widget.js +1 -1
- package/dist/components/window.js +1 -1
- package/dist/core.js +1 -1
- package/dist/css/avatar.css +68 -0
- package/dist/css/base.css +9 -0
- package/dist/css/carousel.css +119 -0
- package/dist/css/chart.css +168 -0
- package/dist/css/core.css +36 -0
- package/dist/css/datetimefield.css +15 -0
- package/dist/css/grid.css +40 -0
- package/dist/css/gridexport.css +35 -0
- package/dist/css/grouping.css +49 -0
- package/dist/css/image.css +46 -0
- package/dist/css/imagecanvas.css +75 -0
- package/dist/css/imagefield.css +103 -0
- package/dist/css/rowediting.css +39 -0
- package/dist/css/shortcuts.css +34 -0
- package/dist/css/stat.css +64 -0
- package/dist/css/stepform.css +1 -0
- package/dist/css/timeline.css +140 -0
- package/dist/css/treegrid.css +35 -0
- package/dist/css/window.css +2 -2
- package/dist/data.js +1 -1
- package/dist/dev.js +2 -0
- package/dist/dev.js.map +7 -0
- package/dist/index.js +16 -5
- package/dist/index.js.map +4 -4
- package/dist/optikos.css +1111 -21
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +7 -0
- package/dist/themes/dark.css +7 -0
- package/dist/types/bind/index.d.ts +1 -1
- package/dist/types/bind/viewmodel.d.ts +33 -0
- package/dist/types/components/avatar.d.ts +1 -0
- package/dist/types/components/base/avatar/avatar.d.ts +22 -0
- package/dist/types/components/base/image/image.d.ts +25 -0
- package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
- package/dist/types/components/carousel.d.ts +1 -0
- package/dist/types/components/chart.d.ts +1 -0
- package/dist/types/components/charts/chart/chart.d.ts +64 -0
- package/dist/types/components/charts/stat/stat.d.ts +34 -0
- package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
- package/dist/types/components/data/grid/grid.d.ts +37 -0
- package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
- package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
- package/dist/types/components/data/grouping/grouping.d.ts +31 -0
- package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
- package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
- package/dist/types/components/data/timeline/timeline.d.ts +60 -0
- package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
- package/dist/types/components/datetimefield.d.ts +1 -0
- package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
- package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
- package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
- package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
- package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
- package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
- package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
- package/dist/types/components/form/form/form.d.ts +5 -0
- package/dist/types/components/form/stepform/stepform.d.ts +1 -1
- package/dist/types/components/gridexport.d.ts +1 -0
- package/dist/types/components/gridstate.d.ts +1 -0
- package/dist/types/components/grouping.d.ts +1 -0
- package/dist/types/components/image.d.ts +1 -0
- package/dist/types/components/imagecanvas.d.ts +1 -0
- package/dist/types/components/imagefield.d.ts +1 -0
- package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
- package/dist/types/components/maskfield.d.ts +1 -0
- package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
- package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
- package/dist/types/components/overlays/menu/menu.d.ts +4 -1
- package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
- package/dist/types/components/overlays/window/window.d.ts +14 -1
- package/dist/types/components/rowediting.d.ts +1 -0
- package/dist/types/components/shortcuts.d.ts +1 -0
- package/dist/types/components/stat.d.ts +1 -0
- package/dist/types/components/timefield.d.ts +1 -0
- package/dist/types/components/timeline.d.ts +1 -0
- package/dist/types/components/treegrid.d.ts +1 -0
- package/dist/types/core/component.d.ts +7 -0
- package/dist/types/core/container.d.ts +10 -1
- package/dist/types/core/dev.d.ts +2 -0
- package/dist/types/core/field.d.ts +4 -0
- package/dist/types/core/i18n.d.ts +2 -0
- package/dist/types/core/index.d.ts +4 -1
- package/dist/types/core/path.d.ts +2 -0
- package/dist/types/core/permission.d.ts +11 -0
- package/dist/types/core/state.d.ts +9 -0
- package/dist/types/data/column.d.ts +8 -0
- package/dist/types/data/index.d.ts +1 -1
- package/dist/types/data/model.d.ts +2 -0
- package/dist/types/data/store.d.ts +21 -0
- package/dist/types/dev/index.d.ts +2 -0
- package/dist/types/dev/keys.d.ts +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/testing/index.d.ts +25 -0
- package/dist/types/themes/color.d.ts +14 -0
- package/dist/types/themes/contrast.d.ts +15 -0
- package/dist/types/themes/define.d.ts +25 -3
- package/dist/types/themes/index.d.ts +3 -1
- package/dist/types/themes/seeds.d.ts +11 -0
- package/dist/types/ui/ui.d.ts +6 -0
- package/dist/ui.js +1 -1
- package/package.json +9 -1
- package/dist/chunk-2ZRNGG2N.js +0 -2
- package/dist/chunk-2ZRNGG2N.js.map +0 -7
- package/dist/chunk-4EQEHJB3.js +0 -2
- package/dist/chunk-4EQEHJB3.js.map +0 -7
- package/dist/chunk-4LZZ244E.js +0 -2
- package/dist/chunk-4LZZ244E.js.map +0 -7
- package/dist/chunk-4SYIIX5A.js +0 -2
- package/dist/chunk-4SYIIX5A.js.map +0 -7
- package/dist/chunk-7KMIFXHZ.js +0 -2
- package/dist/chunk-7KMIFXHZ.js.map +0 -7
- package/dist/chunk-A2NKDOYN.js +0 -2
- package/dist/chunk-A2NKDOYN.js.map +0 -7
- package/dist/chunk-CKXS375P.js +0 -2
- package/dist/chunk-CKXS375P.js.map +0 -7
- package/dist/chunk-EJGWCKE4.js +0 -2
- package/dist/chunk-EJGWCKE4.js.map +0 -7
- package/dist/chunk-ELYARUCN.js +0 -2
- package/dist/chunk-EV73ADN2.js +0 -2
- package/dist/chunk-EV73ADN2.js.map +0 -7
- package/dist/chunk-GD5JGKM7.js +0 -2
- package/dist/chunk-GD5JGKM7.js.map +0 -7
- package/dist/chunk-GZ7X34QP.js +0 -2
- package/dist/chunk-KCEUD232.js +0 -2
- package/dist/chunk-KCEUD232.js.map +0 -7
- package/dist/chunk-KLLAY2IM.js +0 -2
- package/dist/chunk-LBJSMXLV.js +0 -2
- package/dist/chunk-LBJSMXLV.js.map +0 -7
- package/dist/chunk-LW2WRUVL.js +0 -2
- package/dist/chunk-MW3RWBZ7.js +0 -2
- package/dist/chunk-MW3RWBZ7.js.map +0 -7
- package/dist/chunk-OEAXCCVM.js +0 -2
- package/dist/chunk-OEAXCCVM.js.map +0 -7
- package/dist/chunk-UB5RYS7T.js +0 -2
- package/dist/chunk-UB5RYS7T.js.map +0 -7
- package/dist/chunk-UXXJOU5J.js +0 -2
- package/dist/chunk-VU3GIDZ3.js +0 -2
- package/dist/chunk-VU3GIDZ3.js.map +0 -7
- package/dist/chunk-W2BAFOCN.js +0 -3
- package/dist/chunk-W2BAFOCN.js.map +0 -7
- package/dist/chunk-WFGTQZIQ.js +0 -2
- package/dist/chunk-WFGTQZIQ.js.map +0 -7
- package/dist/chunk-XX2MVWFS.js +0 -4
- package/dist/chunk-XYZ6VZ5T.js +0 -2
- package/dist/chunk-YBAYEU25.js +0 -2
- package/dist/chunk-YF75HKL6.js +0 -2
- package/dist/chunk-YF75HKL6.js.map +0 -7
- /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
- /package/dist/{chunk-W3H7GTJY.js.map → chunk-2YRQULDC.js.map} +0 -0
- /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
- /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
- /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
- /package/dist/{chunk-3TAW4AKH.js.map → chunk-4AZ44KV4.js.map} +0 -0
- /package/dist/{chunk-TZOQWCVH.js.map → chunk-4CWYF4O7.js.map} +0 -0
- /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
- /package/dist/{chunk-2YZB6XQR.js.map → chunk-4S3HRFQB.js.map} +0 -0
- /package/dist/{chunk-OGRFQTXA.js.map → chunk-643FOYQB.js.map} +0 -0
- /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
- /package/dist/{chunk-JK74QK3M.js.map → chunk-6PZPBPAD.js.map} +0 -0
- /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
- /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
- /package/dist/{chunk-M242VYZA.js.map → chunk-AT7VFZRB.js.map} +0 -0
- /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
- /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
- /package/dist/{chunk-FEHGU6EP.js.map → chunk-C3MWS7P2.js.map} +0 -0
- /package/dist/{chunk-G2KUK6AT.js.map → chunk-CFGCB37K.js.map} +0 -0
- /package/dist/{chunk-JI265XFO.js.map → chunk-CMV3F6HR.js.map} +0 -0
- /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
- /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
- /package/dist/{chunk-HXDTGP2K.js.map → chunk-DWA45BWR.js.map} +0 -0
- /package/dist/{chunk-5QUY72FX.js.map → chunk-F4HZUAKM.js.map} +0 -0
- /package/dist/{chunk-Q26YZYTD.js.map → chunk-FPU53CCV.js.map} +0 -0
- /package/dist/{chunk-3S24ZRPK.js.map → chunk-GEBAYD6N.js.map} +0 -0
- /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
- /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
- /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-HLS5FI55.js.map} +0 -0
- /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
- /package/dist/{chunk-IHE2MQ3W.js.map → chunk-J5QPFJ7M.js.map} +0 -0
- /package/dist/{chunk-5BC72727.js.map → chunk-JSEI44A7.js.map} +0 -0
- /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
- /package/dist/{chunk-NXSTUFS7.js.map → chunk-NNR2FNHG.js.map} +0 -0
- /package/dist/{chunk-XHOBNSBO.js.map → chunk-P4O57S6N.js.map} +0 -0
- /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
- /package/dist/{chunk-Z2JBUHKA.js.map → chunk-RG6SHPHF.js.map} +0 -0
- /package/dist/{chunk-EDUMAMK4.js.map → chunk-S2CMWKVB.js.map} +0 -0
- /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
- /package/dist/{chunk-Z2Z52GFT.js.map → chunk-U5L76VVB.js.map} +0 -0
- /package/dist/{chunk-LQRFNQ2N.js.map → chunk-UQRQH2JW.js.map} +0 -0
- /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XFIREDWO.js.map} +0 -0
- /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
- /package/dist/{chunk-I4SP6JTU.js.map → chunk-Z6L55FTN.js.map} +0 -0
- /package/dist/{chunk-6VBK2I5B.js.map → chunk-ZSPJZ3ZH.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/searchgrid/searchgrid.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { FilterOp, FilterSpec } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Grid } from '../grid/grid';\n\n/** A filter field of a lookup: a field config or a field instance (`ui.text(...)`); `op` and `field` say how its value is matched. */\nexport type LookupFilter = (AnyConfig & { name: string; op?: FilterOp; field?: string }) | Component;\n\n/** `name`, `op`, `field` and `type` of a filter, whether it was given as a config or an instance. */\nexport const filterInfo = (f: LookupFilter) => (f instanceof Component ? f.config : f) as { name: string; op?: FilterOp; field?: string; type?: string };\n\n/** Everything that describes \"search for a record\": shared by SearchGrid and LookupField. */\nexport interface LookupDef {\n /** A function gives every instance its own store (recommended when the definition is reused). */\n store: Store<any> | (() => Store<any>);\n columns: Column[];\n filters?: LookupFilter[];\n /** Name of the filter that receives the quick text (LookupField typing). Default: the first filter. */\n queryField?: string;\n valueField?: string;\n displayField?: string;\n selection?: 'single' | 'multi';\n paging?: boolean;\n /** Search when shown. Default true. */\n autoSearch?: boolean;\n title?: string;\n width?: number;\n height?: number;\n}\n\nconst defs = new Map<string, LookupDef>();\n/** Registers a lookup definition for declarative use by name (`lookup: 'people'`). */\nexport function registerLookup(name: string, def: LookupDef): void {\n defs.set(name, def);\n}\nexport function resolveLookup(lookup: LookupDef | string): LookupDef {\n const d = typeof lookup === 'string' ? defs.get(lookup) : lookup;\n if (!d) throw new Error(`Optikos: unknown lookup \"${lookup}\". Did you call registerLookup?`);\n return d;\n}\nexport const lookupStore = (def: LookupDef): Store<any> => (typeof def.store === 'function' ? def.store() : def.store);\n\nexport interface SearchGridConfig extends ComponentConfig {\n lookup: LookupDef | string;\n}\n\nconst textual = (type?: string) => !type || type === 'textfield' || type === 'textarea';\nconst blank = (v: unknown) => v == null || v === '' || (Array.isArray(v) && !v.length);\n\n/** Filters on top, results grid below. The Store does the searching; this component only turns the filter fields into specs. */\nexport class SearchGrid extends Component<SearchGridConfig> {\n protected override baseCls = 'op-searchgrid';\n private def!: LookupDef;\n private store!: Store<any>;\n private fields: Array<{ cfg: ReturnType<typeof filterInfo>; cmp: Component; own: boolean }> = [];\n private grid!: Grid;\n private form!: HTMLElement;\n\n protected override build() {\n this.def = resolveLookup(this.config.lookup);\n this.store = lookupStore(this.def);\n const d = this.def;\n this.form = h('div', 'op-searchgrid__filters', { role: 'search' });\n const btns = [\n new Button({ text: t('search'), icon: 'search', variant: 'primary', handler: () => void this.search() }),\n new Button({ text: t('clear'), handler: () => this.clear() }),\n ];\n this.fields = (d.filters ?? []).map((f) => {\n const cfg = filterInfo(f);\n const { op: _o, field: _f, ...fieldCfg } = cfg;\n const cmp = f instanceof Component ? f : create({ ...fieldCfg, renderTo: undefined } as AnyConfig);\n cmp.on('enter', () => void this.search());\n return { cfg, cmp, own: !(f instanceof Component) };\n });\n this.form.append(...this.fields.map((f) => f.cmp.el), h('div', 'op-searchgrid__buttons', {}, ...btns.map((b) => b.el)));\n this.grid = new Grid({ store: this.store, columns: d.columns, selection: d.selection ?? 'single', paging: d.paging !== false, flex: 1 });\n this.grid.on('select', (recs: Model[]) => this.emit('select', recs));\n this.grid.on('row-activate', () => this.confirm());\n this.grid.on('row-dblclick', () => this.confirm());\n this.own(() => [...btns, this.grid, ...this.fields.filter((f) => f.own).map((f) => f.cmp)].forEach((c) => c.destroy()));\n return h('div', this.baseCls, {}, this.form, this.grid.el);\n }\n\n protected override onRender() {\n if (this.def.autoSearch !== false) void this.search();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.fields.forEach((f) => f.cmp.notifyMount());\n this.grid.notifyMount();\n }\n\n private confirm() {\n const recs = this.grid.getSelection();\n if (recs.length) this.emit('confirm', recs);\n }\n\n /** The non-empty filter fields as filter specs. */\n getFilters(): FilterSpec[] {\n return this.fields.flatMap(({ cfg, cmp }) => {\n const v = (cmp as any).getValue?.();\n if (blank(v)) return [];\n const field = cfg.field ?? cfg.name;\n if (typeof v === 'object' && !Array.isArray(v) && 'start' in v) return v.start ? [{ field, op: 'between' as const, value: [v.start, v.end ?? v.start] }] : [];\n return [{ field, op: cfg.op ?? (textual(cfg.type) ? 'contains' : 'eq'), value: v }];\n });\n }\n\n /** Filters the store with the current fields (or loads it, when there are none). Resolves when the results are in. */\n async search(query?: string): Promise<void> {\n if (query != null) this.setQuery(query);\n const specs = this.getFilters();\n if (this.emit('before-search', specs) === false) return;\n await (specs.length ? this.store.filter(specs) : this.store.clearFilter());\n this.emit('search', specs);\n }\n\n /** Empties the filter fields and searches again. */\n clear(): void {\n this.fields.forEach((f) => (f.cmp as any).clear?.());\n void this.search();\n }\n\n /** Fills the quick-search field (`queryField`, default the first filter) without searching. */\n setQuery(text: string): void {\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name);\n (this.fields.find((f) => f.cfg.name === name)?.cmp as any)?.setValue?.(text);\n }\n\n getSelection(): Model[] {\n return this.grid.getSelection();\n }\n getGrid(): Grid {\n return this.grid;\n }\n getStore(): Store<any> {\n return this.store;\n }\n override focus(): void {\n (this.fields[0]?.cmp ?? this.grid).focus();\n }\n}\nregister('searchgrid', SearchGrid);\n"],
|
|
5
|
+
"mappings": "uPAeO,IAAMA,EAAcC,GAAqBA,aAAaC,EAAYD,EAAE,OAASA,EAqB9EE,EAAO,IAAI,IAEV,SAASC,EAAeC,EAAcC,EAAsB,CACjEH,EAAK,IAAIE,EAAMC,CAAG,CACpB,CACO,SAASC,EAAcC,EAAuC,CACnE,IAAMC,EAAI,OAAOD,GAAW,SAAWL,EAAK,IAAIK,CAAM,EAAIA,EAC1D,GAAI,CAACC,EAAG,MAAM,IAAI,MAAM,4BAA4BD,CAAM,iCAAiC,EAC3F,OAAOC,CACT,CACO,IAAMC,EAAeJ,GAAgC,OAAOA,EAAI,OAAU,WAAaA,EAAI,MAAM,EAAIA,EAAI,MAM1GK,EAAWC,GAAkB,CAACA,GAAQA,IAAS,aAAeA,IAAS,WACvEC,EAASC,GAAeA,GAAK,MAAQA,IAAM,IAAO,MAAM,QAAQA,CAAC,GAAK,CAACA,EAAE,OAGlEC,EAAN,cAAyBb,CAA4B,CACvC,QAAU,gBACrB,IACA,MACA,OAAsF,CAAC,EACvF,KACA,KAEW,OAAQ,CACzB,KAAK,IAAMK,EAAc,KAAK,OAAO,MAAM,EAC3C,KAAK,MAAQG,EAAY,KAAK,GAAG,EACjC,IAAMD,EAAI,KAAK,IACf,KAAK,KAAOO,EAAE,MAAO,yBAA0B,CAAE,KAAM,QAAS,CAAC,EACjE,IAAMC,EAAO,CACX,IAAIC,EAAO,CAAE,KAAMC,EAAE,QAAQ,EAAG,KAAM,SAAU,QAAS,UAAW,QAAS,IAAG,CAAQ,KAAK,OAAO,EAAE,CAAC,EACvG,IAAID,EAAO,CAAE,KAAMC,EAAE,OAAO,EAAG,QAAS,IAAM,KAAK,MAAM,CAAE,CAAC,CAC9D,EACA,YAAK,QAAUV,EAAE,SAAW,CAAC,GAAG,IAAKR,GAAM,CACzC,IAAMmB,EAAMpB,EAAWC,CAAC,EAClB,CAAE,GAAIoB,EAAI,MAAOC,EAAI,GAAGC,CAAS,EAAIH,EACrCI,EAAMvB,aAAaC,EAAYD,EAAIwB,EAAO,CAAE,GAAGF,EAAU,SAAU,MAAU,CAAc,EACjG,OAAAC,EAAI,GAAG,QAAS,IAAG,CAAQ,KAAK,OAAO,EAAC,EACjC,CAAE,IAAAJ,EAAK,IAAAI,EAAK,IAAK,EAAEvB,aAAaC,EAAW,CACpD,CAAC,EACD,KAAK,KAAK,OAAO,GAAG,KAAK,OAAO,IAAKD,GAAMA,EAAE,IAAI,EAAE,EAAGe,EAAE,MAAO,yBAA0B,CAAC,EAAG,GAAGC,EAAK,IAAKS,GAAMA,EAAE,EAAE,CAAC,CAAC,EACtH,KAAK,KAAO,IAAIC,EAAK,CAAE,MAAO,KAAK,MAAO,QAASlB,EAAE,QAAS,UAAWA,EAAE,WAAa,SAAU,OAAQA,EAAE,SAAW,GAAO,KAAM,CAAE,CAAC,EACvI,KAAK,KAAK,GAAG,SAAWmB,GAAkB,KAAK,KAAK,SAAUA,CAAI,CAAC,EACnE,KAAK,KAAK,GAAG,eAAgB,IAAM,KAAK,QAAQ,CAAC,EACjD,KAAK,KAAK,GAAG,eAAgB,IAAM,KAAK,QAAQ,CAAC,EACjD,KAAK,IAAI,IAAM,CAAC,GAAGX,EAAM,KAAK,KAAM,GAAG,KAAK,OAAO,OAAQhB,GAAMA,EAAE,GAAG,EAAE,IAAKA,GAAMA,EAAE,GAAG,CAAC,EAAE,QAAS4B,GAAMA,EAAE,QAAQ,CAAC,CAAC,EAC/Gb,EAAE,MAAO,KAAK,QAAS,CAAC,EAAG,KAAK,KAAM,KAAK,KAAK,EAAE,CAC3D,CAEmB,UAAW,CACxB,KAAK,IAAI,aAAe,IAAY,KAAK,OAAO,CACtD,CAES,aAAc,CACrB,MAAM,YAAY,EAClB,KAAK,OAAO,QAASf,GAAMA,EAAE,IAAI,YAAY,CAAC,EAC9C,KAAK,KAAK,YAAY,CACxB,CAEQ,SAAU,CAChB,IAAM2B,EAAO,KAAK,KAAK,aAAa,EAChCA,EAAK,QAAQ,KAAK,KAAK,UAAWA,CAAI,CAC5C,CAGA,YAA2B,CACzB,OAAO,KAAK,OAAO,QAAQ,CAAC,CAAE,IAAAR,EAAK,IAAAI,CAAI,IAAM,CAC3C,IAAMV,EAAKU,EAAY,WAAW,EAClC,GAAIX,EAAMC,CAAC,EAAG,MAAO,CAAC,EACtB,IAAMgB,EAAQV,EAAI,OAASA,EAAI,KAC/B,OAAI,OAAON,GAAM,UAAY,CAAC,MAAM,QAAQA,CAAC,GAAK,UAAWA,EAAUA,EAAE,MAAQ,CAAC,CAAE,MAAAgB,EAAO,GAAI,UAAoB,MAAO,CAAChB,EAAE,MAAOA,EAAE,KAAOA,EAAE,KAAK,CAAE,CAAC,EAAI,CAAC,EACrJ,CAAC,CAAE,MAAAgB,EAAO,GAAIV,EAAI,KAAOT,EAAQS,EAAI,IAAI,EAAI,WAAa,MAAO,MAAON,CAAE,CAAC,CACpF,CAAC,CACH,CAGA,MAAM,OAAOiB,EAA+B,CACtCA,GAAS,MAAM,KAAK,SAASA,CAAK,EACtC,IAAMC,EAAQ,KAAK,WAAW,EAC1B,KAAK,KAAK,gBAAiBA,CAAK,IAAM,KAC1C,MAAOA,EAAM,OAAS,KAAK,MAAM,OAAOA,CAAK,EAAI,KAAK,MAAM,YAAY,GACxE,KAAK,KAAK,SAAUA,CAAK,EAC3B,CAGA,OAAc,CACZ,KAAK,OAAO,QAAS/B,GAAOA,EAAE,IAAY,QAAQ,CAAC,EAC9C,KAAK,OAAO,CACnB,CAGA,SAASgC,EAAoB,CAC3B,IAAM5B,EAAO,KAAK,IAAI,aAAe,KAAK,IAAI,UAAU,CAAC,GAAKL,EAAW,KAAK,IAAI,QAAQ,CAAC,CAAC,EAAE,MAC7F,KAAK,OAAO,KAAMC,GAAMA,EAAE,IAAI,OAASI,CAAI,GAAG,KAAa,WAAW4B,CAAI,CAC7E,CAEA,cAAwB,CACtB,OAAO,KAAK,KAAK,aAAa,CAChC,CACA,SAAgB,CACd,OAAO,KAAK,IACd,CACA,UAAuB,CACrB,OAAO,KAAK,KACd,CACS,OAAc,EACpB,KAAK,OAAO,CAAC,GAAG,KAAO,KAAK,MAAM,MAAM,CAC3C,CACF,EACAC,EAAS,aAAcnB,CAAU",
|
|
6
|
+
"names": ["filterInfo", "f", "Component", "defs", "registerLookup", "name", "def", "resolveLookup", "lookup", "d", "lookupStore", "textual", "type", "blank", "v", "SearchGrid", "h", "btns", "Button", "t", "cfg", "_o", "_f", "fieldCfg", "cmp", "create", "b", "Grid", "recs", "c", "field", "query", "specs", "text", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as p}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-676AKAGF.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{g as f,h as u}from"./chunk-4AA4FQEM.js";import{f as d}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{f as h}from"./chunk-S4QD5NID.js";var n={duration:4e3,position:"top-right",max:5},g={info:"info",success:"success",warning:"alert",error:"error"};function v(e){let t=l().querySelector(`.op-toast-region[data-pos="${e}"]`);return t||(t=i("div","op-toast-region",{"data-pos":e}),l().appendChild(t)),t}var r=class extends d{baseCls="op-toast";cancelTimer;remaining=0;started=0;build(){let t=this.config,s=t.type??"info",o=i("div",`op-toast op-toast--${s}`,{role:s==="error"?"alert":"status"}),a=i("div","op-toast__body",{},t.title?i("div","op-toast__title",{},t.title):null,i("div","op-toast__text",{},t.text??""));if(o.append(i("span","op-toast__icon",{},p(g[s])),a),t.closable!==!1){let c=i("button","op-toast__close",{type:"button","aria-label":h("close")},p("x"));this.listen(c,"click",()=>this.close()),o.append(c)}return this.listen(o,"pointerenter",()=>this.pause()),this.listen(o,"pointerleave",()=>this.resume()),this.listen(o,"focusin",()=>this.pause()),this.listen(o,"focusout",()=>this.resume()),o}show(){let t=this.config.position??n.position,s=v(t);t.startsWith("bottom")?s.append(this.el):s.prepend(this.el);for(let o of Array.from(s.children).filter(a=>a!==this.el).slice(n.max-1))o.dispatchEvent(new Event("op-dismiss"));this.listen(this.el,"op-dismiss",()=>this.close()),this.remaining=this.config.duration??n.duration,this.resume(),u(this.el,{dy:10}),this.config.type==="success"&&f(this.el.querySelector(".op-toast__icon")??this.el),this.emit("show")}pause(){this.cancelTimer&&(this.cancelTimer(),this.cancelTimer=void 0,this.remaining-=Date.now()-this.started)}resume(){this.cancelTimer||this.remaining<=0||this.destroyed||(this.started=Date.now(),this.cancelTimer=this.later(()=>this.close(),this.remaining))}close(){this.destroyed||(this.emit("close"),this.destroy())}};m("toast",r);function y(e){let t=new r(typeof e=="string"?{text:e}:e);return t.show(),{close:()=>t.close()}}y.configure=e=>Object.assign(n,e);export{r as a,y as b};
|
|
2
|
+
//# sourceMappingURL=chunk-J5QPFJ7M.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as k}from"./chunk-UQRQH2JW.js";import{b as d,c as u}from"./chunk-676AKAGF.js";import{a as c,b as g}from"./chunk-VV7CFMPZ.js";import{a as v}from"./chunk-TIPK3SCJ.js";import{b,c as y}from"./chunk-4AA4FQEM.js";import{c as r}from"./chunk-2UPUC4RK.js";import{b as m}from"./chunk-PZSHOSOS.js";import{e as l,f as a}from"./chunk-S4QD5NID.js";l("en",{discardText:"Discard your unsaved changes?",discard:"Discard",keepEditing:"Keep editing"});l("pt-BR",{discardText:"Descartar as altera\xE7\xF5es n\xE3o salvas?",discard:"Descartar",keepEditing:"Continuar editando"});var p=class h extends k{baseCls="op-panel op-window";backdrop;visible=!1;cleanup=[];opener=null;moved=!1;leaving=0;constructor(e={}){super({closable:!0,...e})}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","dialog"),this.el.tabIndex=-1,e.modal!==!1&&this.el.setAttribute("aria-modal","true"),e.draggable!==!1&&this.initDrag()}initDrag(){this.headerEl.classList.add("op-window__handle"),this.listen(this.headerEl,"pointerdown",e=>{if(e.target.closest(".op-panel__tool")||e.button)return;let t=this.el.getBoundingClientRect(),i=e.clientX-t.left,n=e.clientY-t.top;this.el.classList.add("is-dragging");let o=f=>{this.el.style.left=`${Math.max(0,Math.min(f.clientX-i,innerWidth-40))}px`,this.el.style.top=`${Math.max(0,Math.min(f.clientY-n,innerHeight-40))}px`,this.moved=!0},s=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s)};document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),this.cleanup.push(s)})}setMask(e){this.config.mask=e,this.backdrop?.classList.toggle("is-clear",!e)}isVisible(){return this.visible}center(){let e=this.el;e.style.left=`${Math.max(0,(innerWidth-e.offsetWidth)/2)}px`,e.style.top=`${Math.max(0,(innerHeight-e.offsetHeight)/3)}px`}keepInView(){if(!this.moved)return this.center();let e=this.el;e.style.top=`${Math.max(0,Math.min(parseFloat(e.style.top)||0,innerHeight-e.offsetHeight))}px`}show(){if(this.visible||this.destroyed||this.emit("before-show")===!1)return;let e=this.config,t=this.el;this.opener=document.activeElement,e.modal!==!1?(this.backdrop=m("div",`op-window-backdrop${e.mask===!1?" is-clear":""}`,{},t),d(this.backdrop,this.opener),this.cleanup.push(u(this.backdrop)),this.listen(this.backdrop,"pointerdown",s=>{s.target===this.backdrop&&(e.closeOnBackdrop?this.close():t.focus())})):d(t,this.opener),this.visible=!0,this.leaving++,t.getAnimations?.().forEach(s=>s.cancel()),this.notifyMount(),this.center(),b(t,this.opener??void 0,"modal"),this.backdrop?.animate?.([{opacity:0},{opacity:1}],{duration:r.ms("modal"),easing:r.easing("enter")}),this.cleanup.push(g(t));let i=s=>{s.key==="Escape"&&e.closeOnEsc!==!1&&!s.defaultPrevented&&(s.stopPropagation(),this.close())};t.addEventListener("keydown",i);let n=()=>this.keepInView();window.addEventListener("resize",n);let o=typeof ResizeObserver=="function"?new ResizeObserver(n):null;o?.observe(t),this.cleanup.push(()=>t.removeEventListener("keydown",i),()=>window.removeEventListener("resize",n),()=>o?.disconnect()),e.autoFocus?this.focusFirst():t.focus(),this.emit("show")}focusFirst(){let e=c(this.bodyEl)[0],t=this.el.querySelector(".op-panel__footer .op-button--primary");(e??t??c(this.el).find(i=>!i.classList.contains("op-panel__tool"))??this.el).focus()}static ask;close(){let e=this.config.confirmDiscard;if(!e||!this.query(i=>i.isDirty?.()===!0).length)return super.close();let t=typeof e=="string"?e:a("discardText");(h.ask?h.ask(t,{okText:a("discard"),cancelText:a("keepEditing")}):Promise.resolve(confirm(t))).then(i=>{!i||this.destroyed||(this.config.confirmDiscard=!1,super.close(),this.config.confirmDiscard=e)})}hide(){!this.visible||this.emit("before-hide")===!1||(this.release(),this.emit("hide"))}release(e=!0){this.visible=!1,this.cleanup.splice(0).reverse().forEach(o=>o());let t=this.backdrop;this.backdrop=void 0;let i=t??this.el,n=e?y(this.el,this.opener??void 0,"modal"):null;if(n){let o=++this.leaving;t?.animate?.([{opacity:1},{opacity:0}],{duration:r.ms("modal","exit"),easing:r.easing("exit"),fill:"forwards"}),n.then(()=>o===this.leaving&&!this.visible&&(i.remove(),t?.remove()))}else i.remove(),t?.remove();this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus()}onDestroy(){this.visible?this.release(!1):this.leaving&&(this.el.closest(".op-window-backdrop")??this.el).remove(),super.onDestroy()}};v("window",p);export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-JE56CJX2.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/window/window.ts"],
|
|
4
|
+
"sourcesContent": ["import { Panel, type PanelConfig } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus, focusables } from '../../../core/focus';\nimport { popIn, popOut } from '../../../motion/core';\nimport { motion } from '../../../motion/config';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { discardText: 'Discard your unsaved changes?', discard: 'Discard', keepEditing: 'Keep editing' });\naddMessages('pt-BR', { discardText: 'Descartar as altera\u00E7\u00F5es n\u00E3o salvas?', discard: 'Descartar', keepEditing: 'Continuar editando' });\n\nexport interface WindowConfig extends PanelConfig {\n modal?: boolean;\n /** Dims the page behind a modal window. `false` keeps it modal (inert page, trapped focus) but clear. Default true. */\n mask?: boolean;\n draggable?: boolean;\n closeOnEsc?: boolean;\n closeOnBackdrop?: boolean;\n /**\n * On show the focus goes to the dialog itself (it is modal: the focus must be inside), so a phone keyboard does not\n * pop up. `true` focuses its first field instead. Default false.\n */\n autoFocus?: boolean;\n /** Closing while a field inside is changed asks first. `true` uses a standard text; a string is the question. */\n confirmDiscard?: boolean | string;\n}\n\n/** Floating dialog. Modal by default: the page behind becomes inert and Tab stays inside. */\nexport class Window extends Panel<WindowConfig> {\n protected override baseCls = 'op-panel op-window';\n private backdrop?: HTMLElement;\n private visible = false;\n private cleanup: Array<() => void> = [];\n private opener: Element | null = null;\n private moved = false;\n private leaving = 0;\n\n constructor(config: WindowConfig = {}) {\n super({ closable: true, ...config });\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'dialog');\n this.el.tabIndex = -1;\n if (c.modal !== false) this.el.setAttribute('aria-modal', 'true');\n if (c.draggable !== false) this.initDrag();\n }\n\n private initDrag() {\n this.headerEl.classList.add('op-window__handle');\n this.listen(this.headerEl, 'pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).closest('.op-panel__tool') || e.button) return;\n const r = this.el.getBoundingClientRect();\n const dx = e.clientX - r.left;\n const dy = e.clientY - r.top;\n this.el.classList.add('is-dragging');\n const move = (m: PointerEvent) => {\n this.el.style.left = `${Math.max(0, Math.min(m.clientX - dx, innerWidth - 40))}px`;\n this.el.style.top = `${Math.max(0, Math.min(m.clientY - dy, innerHeight - 40))}px`;\n this.moved = true;\n };\n const up = () => {\n this.el.classList.remove('is-dragging');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.cleanup.push(up);\n });\n }\n\n /** Dims (true) or not (false) the page behind the modal window. */\n setMask(mask: boolean): void {\n this.config.mask = mask;\n this.backdrop?.classList.toggle('is-clear', !mask);\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n /** Centers in the viewport (also done on show, on resize and when the content grows, until the user drags it). */\n center(): void {\n const el = this.el;\n el.style.left = `${Math.max(0, (innerWidth - el.offsetWidth) / 2)}px`;\n el.style.top = `${Math.max(0, (innerHeight - el.offsetHeight) / 3)}px`;\n }\n\n /** Keeps the window on screen: centered, or (once dragged) pulled up just enough to fit. */\n private keepInView(): void {\n if (!this.moved) return this.center();\n const el = this.el;\n el.style.top = `${Math.max(0, Math.min(parseFloat(el.style.top) || 0, innerHeight - el.offsetHeight))}px`;\n }\n\n override show(): void {\n if (this.visible || this.destroyed || this.emit('before-show') === false) return;\n const c = this.config;\n const el = this.el;\n this.opener = document.activeElement;\n if (c.modal !== false) {\n this.backdrop = h('div', `op-window-backdrop${c.mask === false ? ' is-clear' : ''}`, {}, el);\n toLayer(this.backdrop, this.opener);\n this.cleanup.push(lockModal(this.backdrop));\n this.listen(this.backdrop, 'pointerdown', (e: Event) => {\n if (e.target !== this.backdrop) return;\n if (c.closeOnBackdrop) this.close();\n else el.focus();\n });\n } else toLayer(el, this.opener);\n this.visible = true;\n this.leaving++;\n el.getAnimations?.().forEach((a) => a.cancel());\n this.notifyMount();\n this.center();\n void popIn(el, this.opener ?? undefined, 'modal'); // grows out of the button that opened it\n this.backdrop?.animate?.([{ opacity: 0 }, { opacity: 1 }], { duration: motion.ms('modal'), easing: motion.easing('enter') });\n this.cleanup.push(trapFocus(el));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented) {\n e.stopPropagation();\n this.close();\n }\n };\n el.addEventListener('keydown', onKey);\n const onResize = () => this.keepInView();\n window.addEventListener('resize', onResize);\n const grow = typeof ResizeObserver === 'function' ? new ResizeObserver(onResize) : null;\n grow?.observe(el);\n this.cleanup.push(() => el.removeEventListener('keydown', onKey), () => window.removeEventListener('resize', onResize), () => grow?.disconnect());\n if (c.autoFocus) this.focusFirst();\n else el.focus();\n this.emit('show');\n }\n\n private focusFirst() {\n const inBody = focusables(this.bodyEl)[0];\n const primary = this.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary');\n (inBody ?? primary ?? focusables(this.el).find((e) => !e.classList.contains('op-panel__tool')) ?? this.el).focus();\n }\n\n /**\n * How `confirmDiscard` asks. MessageBox sets it when it is loaded (it needs Window itself, so Window cannot import it);\n * without MessageBox the browser's own `confirm` is used.\n */\n static ask?: (text: string, o: { okText: string; cancelText: string }) => Promise<boolean>;\n\n override close(): void {\n const ask = this.config.confirmDiscard;\n // a Form or a field: anything that knows whether it was changed\n if (!ask || !this.query((c) => (c as { isDirty?: () => boolean }).isDirty?.() === true).length) return super.close();\n const text = typeof ask === 'string' ? ask : t('discardText');\n void (Window.ask ? Window.ask(text, { okText: t('discard'), cancelText: t('keepEditing') }) : Promise.resolve(confirm(text))).then((yes) => {\n if (!yes || this.destroyed) return;\n this.config.confirmDiscard = false;\n super.close();\n this.config.confirmDiscard = ask;\n });\n }\n\n override hide(): void {\n if (!this.visible || this.emit('before-hide') === false) return;\n this.release();\n this.emit('hide');\n }\n\n /** Cleans up at once (the page is usable again) and takes the window off the screen: shrinking toward its opener, 20 % faster than it came. */\n private release(animate = true) {\n this.visible = false;\n this.cleanup.splice(0).reverse().forEach((f) => f());\n const bd = this.backdrop;\n this.backdrop = undefined;\n const target = bd ?? this.el;\n const out = animate ? popOut(this.el, this.opener ?? undefined, 'modal') : null;\n if (out) {\n const id = ++this.leaving;\n bd?.animate?.([{ opacity: 1 }, { opacity: 0 }], { duration: motion.ms('modal', 'exit'), easing: motion.easing('exit'), fill: 'forwards' });\n void out.then(() => id === this.leaving && !this.visible && (target.remove(), bd?.remove()));\n } else {\n target.remove();\n bd?.remove();\n }\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n }\n\n protected override onDestroy() {\n if (this.visible) this.release(false);\n else if (this.leaving) (this.el.closest('.op-window-backdrop') ?? this.el).remove();\n super.onDestroy();\n }\n}\nregister('window', Window);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "Window", "_Window", "Panel", "config", "c", "r", "dx", "dy", "move", "m", "up", "mask", "el", "h", "toLayer", "lockModal", "e", "a", "popIn", "motion", "trapFocus", "onKey", "onResize", "grow", "inBody", "focusables", "primary", "ask", "text", "t", "yes", "animate", "f", "bd", "target", "out", "popOut", "id", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as f}from"./chunk-4CWYF4O7.js";import{a as h}from"./chunk-JE56CJX2.js";import{a as p,c as g,d as m,e as k}from"./chunk-IUOEPAWG.js";import{c}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as a}from"./chunk-PZSHOSOS.js";import{e as l,f as n}from"./chunk-S4QD5NID.js";l("en",{lookupOpen:"Open search",lookupSelect:"Select"});l("pt-BR",{lookupOpen:"Abrir pesquisa",lookupSelect:"Selecionar"});var d=class extends f{baseCls="op-field op-textfield op-picker op-suggest op-lookup";def;suggestStore;win;constructor(e){let t=g(e.lookup);super({...e,icon:!1,valueField:t.valueField??"id",displayField:t.displayField??"name",query:o=>this.suggest(o)}),this.def=t}async suggest(e){let t=this.suggestStore??=m(this.def),o=this.def.queryField??(this.def.filters?.[0]&&p(this.def.filters[0]).name)??this.config.displayField,i=this.def.filters?.map(p).find(s=>s.name===o)?.field??o;return await t.filter({field:i,op:"contains",value:e}),t.getData()}createControl(){let e=super.createControl(),t=a("button","op-picker__trigger op-lookup__btn",{type:"button",tabindex:-1,"aria-label":n("lookupOpen"),"aria-haspopup":"dialog"},c("search"));return this.listen(t,"mousedown",o=>o.preventDefault()),this.listen(t,"click",()=>this.openDialog()),e.append(t),this.own(()=>this.win?.destroy()),e}onKey(e){e.key==="F4"||e.altKey&&e.key==="ArrowDown"?(e.preventDefault(),this.openDialog()):super.onKey(e)}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-lookup__btn").disabled=e}openDialog(){if(this.win||this.config.disabled||this.config.readonly||!this.rendered)return;this.close();let e=this.def,t=new k({lookup:e,flex:1}),o=this.typed?this.input.value:"";t.on("confirm",r=>i(r));let i=r=>{r[0]&&this.pickRecord(r[0]),s.close()},s=this.win=new h({title:e.title??n("search"),width:e.width??720,height:e.height??520,layout:"fit",items:[t],buttons:[{text:n("cancel"),handler:()=>s.close()},{text:n("lookupSelect"),variant:"primary",handler:()=>i(t.getSelection())}]});s.on("destroy",()=>{this.win=void 0,this.rendered&&this.input.focus()}),s.show(),o&&t.search(o)}pickRecord(e){let{valueField:t,displayField:o}=this.config,i={value:e.get(t),label:String(e.get(o)??e.get(t)??""),raw:e.data};this.pick(i)}};u("lookupfield",d);export{d as a};
|
|
2
|
+
//# sourceMappingURL=chunk-JJLOUMCJ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/lookupfield/lookupfield.ts"],
|
|
4
|
+
"sourcesContent": ["import { SuggestField, type SuggestConfig } from '../suggestfield/suggestfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Model } from '../../../data/model';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\nimport { Window } from '../../overlays/window/window';\nimport { SearchGrid, resolveLookup, lookupStore, filterInfo, type LookupDef } from '../../data/searchgrid/searchgrid';\n\naddMessages('en', {\n lookupOpen: 'Open search',\n lookupSelect: 'Select',\n});\naddMessages('pt-BR', {\n lookupOpen: 'Abrir pesquisa',\n lookupSelect: 'Selecionar',\n});\n\nexport interface LookupFieldConfig<V = unknown> extends SuggestConfig<V> {\n /** A definition or the name given to `registerLookup`. */\n lookup: LookupDef | string;\n}\n\n/**\n * Pick a record from a big set: type to get suggestions, or press the magnifier (or F4) to open a search window\n * with filters and a grid. The value is the record's `valueField`; the text is its `displayField`.\n */\nexport class LookupField<V = unknown> extends SuggestField<V> {\n protected override baseCls = 'op-field op-textfield op-picker op-suggest op-lookup';\n private def: LookupDef;\n private suggestStore?: Store<any>;\n private win?: Window;\n\n constructor(config: LookupFieldConfig<V>) {\n const def = resolveLookup(config.lookup);\n super({\n ...config,\n icon: false,\n valueField: def.valueField ?? 'id',\n displayField: def.displayField ?? 'name',\n query: (text) => this.suggest(text),\n });\n this.def = def;\n }\n\n /** Typing: filter a private store by the quick-search field and offer its page of records. */\n private async suggest(text: string) {\n const s = (this.suggestStore ??= lookupStore(this.def));\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name) ?? this.config.displayField!;\n const field = this.def.filters?.map(filterInfo).find((f) => f.name === name)?.field ?? name;\n await s.filter({ field, op: 'contains', value: text });\n return s.getData();\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const btn = h('button', 'op-picker__trigger op-lookup__btn', { type: 'button', tabindex: -1, 'aria-label': t('lookupOpen'), 'aria-haspopup': 'dialog' }, iconEl('search'));\n this.listen(btn, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(btn, 'click', () => this.openDialog());\n wrap.append(btn);\n this.own(() => this.win?.destroy());\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'F4' || (e.altKey && e.key === 'ArrowDown')) {\n e.preventDefault();\n this.openDialog();\n } else super.onKey(e);\n }\n\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-lookup__btn') as HTMLButtonElement).disabled = disabled;\n }\n\n /** Opens the search window; the text typed so far pre-fills the quick-search field. */\n openDialog(): void {\n if (this.win || this.config.disabled || this.config.readonly || !this.rendered) return;\n this.close();\n const d = this.def;\n const sg = new SearchGrid({ lookup: d, flex: 1 });\n const text = this.typed ? this.input.value : '';\n sg.on('confirm', (recs: Model[]) => done(recs));\n const done = (recs: Model[]) => {\n if (recs[0]) this.pickRecord(recs[0]);\n win.close();\n };\n const win: Window = (this.win = new Window({\n title: d.title ?? t('search'),\n width: d.width ?? 720,\n height: d.height ?? 520,\n layout: 'fit',\n items: [sg],\n buttons: [{ text: t('cancel'), handler: () => win.close() }, { text: t('lookupSelect'), variant: 'primary', handler: () => done(sg.getSelection()) }],\n }));\n win.on('destroy', () => {\n this.win = undefined;\n if (this.rendered) this.input.focus();\n });\n win.show();\n if (text) void sg.search(text);\n }\n\n private pickRecord(rec: Model): void {\n const { valueField, displayField } = this.config;\n const item = { value: rec.get(valueField!), label: String(rec.get(displayField!) ?? rec.get(valueField!) ?? ''), raw: rec.data };\n this.pick(item as any);\n }\n}\nregister('lookupfield', LookupField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "LookupField", "SuggestField", "config", "def", "resolveLookup", "text", "s", "lookupStore", "name", "filterInfo", "field", "f", "wrap", "btn", "h", "t", "iconEl", "e", "disabled", "d", "sg", "SearchGrid", "recs", "done", "win", "Window", "rec", "valueField", "displayField", "item", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as S}from"./chunk-6BOM5KZR.js";import{a as F}from"./chunk-3FCIZKIN.js";import{a as w}from"./chunk-3F4MN2BU.js";import{a as f}from"./chunk-HLS5FI55.js";import{c as d}from"./chunk-BQEFLPDA.js";import{a as x}from"./chunk-XR677UYD.js";import{a as y}from"./chunk-TIPK3SCJ.js";import{f as b}from"./chunk-UDXO3KM3.js";import{b as h}from"./chunk-PZSHOSOS.js";import{e as c,f as l}from"./chunk-S4QD5NID.js";c("en",{stepBack:"Back",stepNext:"Next",stepFinish:"Finish",stepReview:"Review"});c("pt-BR",{stepBack:"Voltar",stepNext:"Pr\xF3ximo",stepFinish:"Concluir",stepReview:"Revis\xE3o"});var u=class extends b{baseCls="op-stepform__review";setContent(e){this.el.replaceChildren(...e)}},m=class extends F{baseCls="op-form op-stepform";stepper;body;pane;backBtn;nextBtn;finishBtn;index=0;pending;notes=[];noteEl;constructor(e){let n,t=e.steps??[],i=e.review?new u:void 0,s=new S({steps:[...t.map(({title:a,description:_,icon:k,optional:R})=>({title:a,description:_,icon:k,optional:R})),...i?[{title:e.reviewTitle??l("stepReview")}]:[]]}),r=[...t.map(a=>({type:"container",title:a.title,cls:"op-stepform__step",layout:a.layout??{type:"grid",columns:2,gap:12},items:a.items})),...i?[{type:"container",title:e.reviewTitle??l("stepReview"),cls:"op-stepform__step",items:[i]}]:[]],o=new d({cls:"op-stepform__body",flex:1,layout:{type:"card"},items:r}),p=new f({text:e.backText??l("stepBack"),handler:()=>n.back()}),g=new f({text:e.nextText??l("stepNext"),variant:"primary",handler:()=>n.next()}),v=new f({text:e.finishText??l("stepFinish"),variant:"primary",htmlType:"submit"}),B=e.cancelText?[new f({text:e.cancelText,variant:"ghost",handler:()=>n.emit("cancel")})]:[],T=new w({cls:"op-stepform__footer",items:[...B,"->",p,g,v]});super({...e,layout:{type:"vbox"},items:[s,o,T]}),n=this,Object.assign(this,{stepper:s,body:o,pane:i,backBtn:p,nextBtn:g,finishBtn:v}),s.on("before-select",a=>(n.goTo(a),!1)),o.on("activate",()=>n.onActivate()),this.own(()=>this.stop())}cfg(){return this.config}count(){return this.body.items.length}real(){return this.count()-(this.pane?1:0)}getStep(){return this.index}getStepCount(){return this.count()}getStepper(){return this.stepper}stepFields(e){let n=this.body.items[e];return n instanceof d?n.query(t=>t instanceof x):[]}validateStep(e){if(e>=this.real())return!0;let n=this.stepFields(e).filter(t=>!t.validate());return this.stepper.setStepState(e,n.length?"error":"done"),!n.length}note(e,n){this.notes[e]=n,e===this.index&&this.showNote()}showNote(){if(!this.rendered)return;let e=this.notes[this.index]??"";if(!this.noteEl){if(!e)return;this.body.el.before(this.noteEl=h("div","op-stepform__note",{role:"alert"}))}this.noteEl.textContent=e,this.noteEl.hidden=!e}busy(e){this.el.classList.toggle("is-validating",e),this.nextBtn.setLoading(e),this.finishBtn.setLoading(e)}stop(){this.pending&&(this.pending.abort(),this.pending=void 0,this.busy(!1))}async check(e){let n=this.cfg().steps[e]?.validate;if(!n)return!0;this.stop();let t=this.pending=new AbortController;this.busy(!0);let i;try{i=await n(this.getValues(),this,t.signal)}catch(r){i=String(r?.message??r)}if(t.signal.aborted)return!1;this.pending=void 0,this.busy(!1);let s=i===!0||i==null;if(this.note(e,typeof i=="string"?i:""),!s&&typeof i=="object")for(let[r,o]of Object.entries(i))this.getField(r)?.setError(o);return s||this.stepper.setStepState(e,"error"),s}goTo(e){if(e<0||e>=this.count()||e===this.index||this.pending&&e>this.index||(this.stop(),this.emit("before-step-change",this.index,e)===!1))return Promise.resolve(!1);let n=this.index,t=s=>this.index!==n?!1:(s!==this.index&&this.body.setActiveItem(s),s!==e&&this.stepFields(s).find(r=>r.getError())?.focus(),s===e);if(this.cfg().linear===!1||e<n)return Promise.resolve(t(e));let i=s=>{for(;s<e;s++){if(!this.validateStep(s))return t(s);if(this.cfg().steps[s]?.validate)return this.check(s).then(r=>r?i(s+1):t(s))}return t(e)};return Promise.resolve(i(n))}next(){return this.goTo(this.index+1)}back(){return this.goTo(this.index-1)}onActivate(){let e=this.body.items.indexOf(this.body.getActiveItem());if(e<0)return;let n=this.index;this.index=e,this.stepper.setActive(e);let t=this.count()-1;this.backBtn.config.hidden=e===0,this.nextBtn.config.hidden=e===t,this.finishBtn.config.hidden=e!==t;for(let[i,s]of[[this.backBtn,e===0],[this.nextBtn,e===t],[this.finishBtn,e!==t]])i.rendered&&(i.el.hidden=s);if(this.pane&&e===t&&this.refreshReview(),this.showNote(),e!==n&&(this.emit("step-change",e,n),this.rendered&&this.el.isConnected&&!this.stepFields(e).some(i=>i.getError()))){let i=this.body.items[e]?.el;this.config.autoFocus?this.stepFields(e)[0]?.focus():i&&(i.tabIndex=-1,i.focus())}}refreshReview(){let e=this.getValues(),n=this.cfg().review;if(typeof n=="function")return this.pane.setContent([n(e,this)]);let t=[];for(let i=0;i<this.real();i++){let s=this.stepFields(i).filter(r=>r.name);s.length&&(t.push(h("h3","op-stepform__review-title",{},String(this.body.items[i].config.title??""))),t.push(h("dl","op-stepform__review-list",{},...s.flatMap(r=>[h("dt","",{},r.config.label??r.config.boxLabel??r.name),h("dd","",{},this.show_(r))]))))}this.pane.setContent(t)}show_(e){let n=e;if(n.getRows)return n.getRows().map((r,o)=>n.getRowFields(o).map(p=>this.show_(p)).filter(p=>p!=="\u2014").join(" \xB7 ")).join(`
|
|
2
|
+
`)||"\u2014";let t=e.getValue();if(typeof t=="boolean")return t?"\u2713":"\u2014";if(e.config.inputType==="password")return t?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":"\u2014";let i=e.getDisplayText();if(i)return i;let s=r=>Array.isArray(r)?r.map(s).join(", "):r&&typeof r=="object"?Object.values(r).map(s).join(" \u2013 "):`${r??""}`;return s(t)||"\u2014"}submit(){if(this.index<this.count()-1)return this.next(),!1;let e=()=>{for(let t=0;t<this.real();t++)this.stepper.setStepState(t,this.stepFields(t).some(i=>i.getError())?"error":"done")};if(this.cfg().steps.some(t=>t.validate)){if(this.pending||this.emit("before-submit")===!1||!this.validate())return e(),!1;let t=this.index;return(async()=>{for(let s=0;s<this.real();s++)if(!await this.check(s)){if(this.index!==t||this.destroyed)return;s!==t&&this.body.setActiveItem(s),this.stepFields(s).find(r=>r.getError())?.focus();return}e();let i=this.getValues();this.emit("submit",i),this.emit("finish",i)})(),!1}let n=super.submit();return e(),n&&this.emit("finish",this.getValues()),n}reset(){this.stop(),this.notes=[],super.reset(),this.clearErrors();for(let e=0;e<this.count();e++)this.stepper.setStepState(e,"pending");this.index!==0&&this.body.setActiveItem(0),this.showNote()}};y("stepform",m);export{m as a};
|
|
3
|
+
//# sourceMappingURL=chunk-JLKIHXZP.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/stepform/stepform.ts"],
|
|
4
|
+
"sourcesContent": ["import { Form, type FormConfig } from '../form/form';\nimport { Container, type ContainerConfig } from '../../../core/container';\nimport { Component } from '../../../core/component';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Stepper } from '../../navigation/stepper/stepper';\nimport { Button } from '../../base/button/button';\nimport { Toolbar } from '../../layout/toolbar/toolbar';\nimport '../../layout/container/container';\n\naddMessages('en', {\n stepBack: 'Back',\n stepNext: 'Next',\n stepFinish: 'Finish',\n stepReview: 'Review',\n});\naddMessages('pt-BR', {\n stepBack: 'Voltar',\n stepNext: 'Pr\u00F3ximo',\n stepFinish: 'Concluir',\n stepReview: 'Revis\u00E3o',\n});\n\nexport interface FormStep {\n title: string;\n description?: string;\n icon?: string;\n /** May be left alone: the stepper says \"optional\" (its fields are still validated if filled wrongly). */\n optional?: boolean;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n /**\n * A check that may ask the server (an email already taken, a free slug), run when leaving the step forward and on Finish.\n * Return `true`, a message for the whole step, or `{ field: message }`. The signal aborts when the user goes elsewhere.\n */\n validate?: (values: Record<string, any>, form: StepForm, signal: AbortSignal) => StepCheck | Promise<StepCheck>;\n}\n\n/** The result of a step's `validate`: ok, a message for the whole step, or messages per field name. */\nexport type StepCheck = true | string | Record<string, string>;\n\nexport interface StepFormConfig extends FormConfig {\n steps: FormStep[];\n /** Moving forward validates the steps on the way. `false` lets the user click any step. Default true. */\n linear?: boolean;\n /** Adds a last \"Review\" step with a summary of the values; a function renders the summary yourself. */\n review?: boolean | ((values: Record<string, any>, form: StepForm) => string | Node);\n reviewTitle?: string;\n backText?: string;\n nextText?: string;\n finishText?: string;\n /** Shows a Cancel button (fires `cancel`). */\n cancelText?: string;\n /** On a new step, focus its first field (a phone keyboard pops up). Default false: the step panel gets the focus. */\n autoFocus?: boolean;\n}\n\n/** The summary pane of the review step. */\nclass ReviewPane extends Component {\n protected override baseCls = 'op-stepform__review';\n setContent(nodes: Array<Node | string>) {\n this.el.replaceChildren(...nodes);\n }\n}\n\n/** One form, several steps: a Stepper on top, one step at a time, Back / Next / Finish, validation per step and an optional review. */\nexport class StepForm extends Form {\n protected override baseCls = 'op-form op-stepform';\n private stepper!: Stepper;\n private body!: Container;\n private pane?: ReviewPane;\n private backBtn!: Button;\n private nextBtn!: Button;\n private finishBtn!: Button;\n private index = 0;\n /** The step check in flight (Next waits for it; going elsewhere aborts it). */\n private pending?: AbortController;\n /** Each step's general message (from its `validate`), shown in one alert line above the steps. */\n private notes: string[] = [];\n private noteEl?: HTMLElement;\n\n constructor(config: StepFormConfig) {\n let me!: StepForm;\n const steps = config.steps ?? [];\n const review = config.review ? new ReviewPane() : undefined;\n const stepper = new Stepper({ steps: [...steps.map(({ title, description, icon, optional }) => ({ title, description, icon, optional })), ...(review ? [{ title: config.reviewTitle ?? t('stepReview') }] : [])] });\n const panels = [\n ...steps.map((s) => ({ type: 'container', title: s.title, cls: 'op-stepform__step', layout: s.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: s.items })),\n ...(review ? [{ type: 'container', title: config.reviewTitle ?? t('stepReview'), cls: 'op-stepform__step', items: [review] }] : []),\n ];\n const body = new Container({ cls: 'op-stepform__body', flex: 1, layout: { type: 'card' }, items: panels });\n const backBtn = new Button({ text: config.backText ?? t('stepBack'), handler: () => me.back() });\n const nextBtn = new Button({ text: config.nextText ?? t('stepNext'), variant: 'primary', handler: () => me.next() });\n const finishBtn = new Button({ text: config.finishText ?? t('stepFinish'), variant: 'primary', htmlType: 'submit' });\n const cancel = config.cancelText ? [new Button({ text: config.cancelText, variant: 'ghost', handler: () => me.emit('cancel') })] : [];\n const footer = new Toolbar({ cls: 'op-stepform__footer', items: [...cancel, '->', backBtn, nextBtn, finishBtn] });\n super({ ...config, layout: { type: 'vbox' }, items: [stepper, body, footer] });\n me = this;\n Object.assign(this, { stepper, body, pane: review, backBtn, nextBtn, finishBtn });\n stepper.on('before-select', (i: number) => (me.goTo(i), false));\n body.on('activate', () => me.onActivate());\n this.own(() => this.stop());\n }\n\n private cfg(): StepFormConfig {\n return this.config as unknown as StepFormConfig;\n }\n\n private count(): number {\n return this.body.items.length;\n }\n private real(): number {\n return this.count() - (this.pane ? 1 : 0);\n }\n\n getStep(): number {\n return this.index;\n }\n getStepCount(): number {\n return this.count();\n }\n getStepper(): Stepper {\n return this.stepper;\n }\n\n private stepFields(i: number): Field<any>[] {\n const step = this.body.items[i];\n return step instanceof Container ? (step.query((c) => c instanceof Field) as Field<any>[]) : [];\n }\n\n /** Validates one step's fields (marks the errors, sets its state on the stepper). */\n validateStep(i: number): boolean {\n if (i >= this.real()) return true;\n const bad = this.stepFields(i).filter((f) => !f.validate());\n this.stepper.setStepState(i, bad.length ? 'error' : 'done');\n return !bad.length;\n }\n\n /** Sets step `i`'s general message ('' clears it); it shows while that step is the current one. */\n private note(i: number, text: string): void {\n this.notes[i] = text;\n if (i === this.index) this.showNote();\n }\n private showNote(): void {\n if (!this.rendered) return;\n const text = this.notes[this.index] ?? '';\n if (!this.noteEl) {\n if (!text) return;\n this.body.el.before((this.noteEl = h('div', 'op-stepform__note', { role: 'alert' })));\n }\n this.noteEl.textContent = text;\n this.noteEl.hidden = !text;\n }\n\n /** Busy while a step check runs: Next and Finish show their loading state. */\n private busy(on: boolean): void {\n this.el.classList.toggle('is-validating', on);\n this.nextBtn.setLoading(on);\n this.finishBtn.setLoading(on);\n }\n /** Cancels the step check in flight, if any. */\n private stop(): void {\n if (!this.pending) return;\n this.pending.abort();\n this.pending = undefined;\n this.busy(false);\n }\n\n /** Runs step `k`'s `validate`. A failure marks the fields or shows the step's message. Resolves false when aborted too. */\n private async check(k: number): Promise<boolean> {\n const fn = this.cfg().steps[k]?.validate;\n if (!fn) return true;\n this.stop();\n const ctl = (this.pending = new AbortController());\n this.busy(true);\n let res: StepCheck;\n try {\n res = await fn(this.getValues(), this, ctl.signal);\n } catch (e) {\n res = String((e as Error)?.message ?? e); // a failing check is a message, not a broken wizard\n }\n if (ctl.signal.aborted) return false; // gone elsewhere (or destroyed) meanwhile\n this.pending = undefined;\n this.busy(false);\n const ok = res === true || res == null;\n this.note(k, typeof res === 'string' ? res : '');\n if (!ok && typeof res === 'object') for (const [name, msg] of Object.entries(res)) this.getField(name)?.setError(msg);\n if (!ok) this.stepper.setStepState(k, 'error');\n return ok;\n }\n\n /**\n * Moves to a step. Forward with `linear` validates the steps on the way (their fields, then their `validate`) and stops\n * at the first invalid one. Resolves with whether it got there; without a step `validate` on the way it moves at once.\n */\n goTo(j: number): Promise<boolean> {\n if (j < 0 || j >= this.count() || j === this.index) return Promise.resolve(false);\n if (this.pending && j > this.index) return Promise.resolve(false); // a check is running: a second Next does nothing\n this.stop(); // going back cancels it\n if (this.emit('before-step-change', this.index, j) === false) return Promise.resolve(false);\n const from = this.index;\n const land = (target: number) => {\n if (this.index !== from) return false; // the user moved on while a check was running\n if (target !== this.index) this.body.setActiveItem(target);\n if (target !== j) this.stepFields(target).find((f) => f.getError())?.focus();\n return target === j;\n };\n if (this.cfg().linear === false || j < from) return Promise.resolve(land(j));\n const walk = (k: number): boolean | Promise<boolean> => {\n for (; k < j; k++) {\n if (!this.validateStep(k)) return land(k);\n if (this.cfg().steps[k]?.validate) return this.check(k).then((ok) => (ok ? walk(k + 1) : land(k)));\n }\n return land(j);\n };\n return Promise.resolve(walk(from));\n }\n next(): Promise<boolean> {\n return this.goTo(this.index + 1);\n }\n back(): Promise<boolean> {\n return this.goTo(this.index - 1);\n }\n\n /** The card layout changed the visible step (by `goTo`, or because `validate` brought an invalid field into view). */\n private onActivate(): void {\n const i = this.body.items.indexOf(this.body.getActiveItem()!);\n if (i < 0) return;\n const from = this.index;\n this.index = i;\n this.stepper.setActive(i);\n const last = this.count() - 1;\n this.backBtn.config.hidden = i === 0;\n this.nextBtn.config.hidden = i === last;\n this.finishBtn.config.hidden = i !== last;\n for (const [b, hide] of [[this.backBtn, i === 0], [this.nextBtn, i === last], [this.finishBtn, i !== last]] as const) if (b.rendered) b.el.hidden = hide;\n if (this.pane && i === last) this.refreshReview();\n this.showNote();\n if (i !== from) {\n this.emit('step-change', i, from);\n if (this.rendered && this.el.isConnected && !this.stepFields(i).some((f) => f.getError())) {\n const panel = this.body.items[i]?.el;\n if ((this.config as StepFormConfig).autoFocus) this.stepFields(i)[0]?.focus();\n else if (panel) ((panel.tabIndex = -1), panel.focus());\n }\n }\n }\n\n private refreshReview(): void {\n const values = this.getValues();\n const fn = this.cfg().review;\n if (typeof fn === 'function') return this.pane!.setContent([fn(values, this)]);\n const out: Array<Node | string> = [];\n for (let i = 0; i < this.real(); i++) {\n const rows = this.stepFields(i).filter((f) => f.name);\n if (!rows.length) continue;\n out.push(h('h3', 'op-stepform__review-title', {}, String((this.body.items[i].config as { title?: string }).title ?? '')));\n out.push(h('dl', 'op-stepform__review-list', {}, ...rows.flatMap((f) => [h('dt', '', {}, f.config.label ?? (f.config as { boxLabel?: string }).boxLabel ?? f.name!), h('dd', '', {}, this.show_(f))])));\n }\n this.pane!.setContent(out);\n }\n\n /** What the user sees for a field (its display text; ticks for booleans, dots for passwords; one line per FieldList row). */\n private show_(f: Field<any>): string {\n const fl = f as Field<any> & { getRows?(): unknown[]; getRowFields(i: number): Field<any>[] };\n if (fl.getRows)\n return fl.getRows().map((_, i) => fl.getRowFields(i).map((x) => this.show_(x)).filter((t) => t !== '\u2014').join(' \u00B7 ')).join('\\n') || '\u2014';\n const v = f.getValue();\n if (typeof v === 'boolean') return v ? '\u2713' : '\u2014';\n if ((f.config as { inputType?: string }).inputType === 'password') return v ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '\u2014';\n const text = f.getDisplayText();\n if (text) return text;\n const flat = (x: unknown): string => (Array.isArray(x) ? x.map(flat).join(', ') : x && typeof x === 'object' ? Object.values(x).map(flat).join(' \u2013 ') : `${x ?? ''}`);\n return flat(v) || '\u2014';\n }\n\n /** Enter and the Finish button: Next on every step but the last; on the last, validate everything and `finish`. */\n override submit(): boolean {\n if (this.index < this.count() - 1) {\n void this.next();\n return false;\n }\n const states = () => {\n for (let i = 0; i < this.real(); i++) this.stepper.setStepState(i, this.stepFields(i).some((f) => f.getError()) ? 'error' : 'done');\n };\n // with step checks, Finish waits for them (it returns false now; `finish` fires when they pass)\n if (this.cfg().steps.some((s) => s.validate)) {\n if (this.pending || this.emit('before-submit') === false || !this.validate()) return states(), false;\n const at = this.index;\n void (async () => {\n for (let k = 0; k < this.real(); k++) {\n if (!(await this.check(k))) {\n if (this.index !== at || this.destroyed) return; // the user went back: the check was aborted\n if (k !== at) this.body.setActiveItem(k);\n this.stepFields(k).find((f) => f.getError())?.focus();\n return;\n }\n }\n states();\n const values = this.getValues();\n this.emit('submit', values);\n this.emit('finish', values);\n })();\n return false;\n }\n const ok = super.submit();\n states();\n if (ok) this.emit('finish', this.getValues());\n return ok;\n }\n\n /** Clears the values and goes back to the first step. */\n override reset(): void {\n this.stop();\n this.notes = [];\n super.reset();\n this.clearErrors();\n for (let i = 0; i < this.count(); i++) this.stepper.setStepState(i, 'pending');\n if (this.index !== 0) this.body.setActiveItem(0);\n this.showNote();\n }\n}\nregister('stepform', StepForm);\n"],
|
|
5
|
+
"mappings": "uZAaAA,EAAY,KAAM,CAChB,SAAU,OACV,SAAU,OACV,WAAY,SACZ,WAAY,QACd,CAAC,EACDA,EAAY,QAAS,CACnB,SAAU,SACV,SAAU,aACV,WAAY,WACZ,WAAY,YACd,CAAC,EAsCD,IAAMC,EAAN,cAAyBC,CAAU,CACd,QAAU,sBAC7B,WAAWC,EAA6B,CACtC,KAAK,GAAG,gBAAgB,GAAGA,CAAK,CAClC,CACF,EAGaC,EAAN,cAAuBC,CAAK,CACd,QAAU,sBACrB,QACA,KACA,KACA,QACA,QACA,UACA,MAAQ,EAER,QAEA,MAAkB,CAAC,EACnB,OAER,YAAYC,EAAwB,CAClC,IAAIC,EACEC,EAAQF,EAAO,OAAS,CAAC,EACzBG,EAASH,EAAO,OAAS,IAAIL,EAAe,OAC5CS,EAAU,IAAIC,EAAQ,CAAE,MAAO,CAAC,GAAGH,EAAM,IAAI,CAAC,CAAE,MAAAI,EAAO,YAAAC,EAAa,KAAAC,EAAM,SAAAC,CAAS,KAAO,CAAE,MAAAH,EAAO,YAAAC,EAAa,KAAAC,EAAM,SAAAC,CAAS,EAAE,EAAG,GAAIN,EAAS,CAAC,CAAE,MAAOH,EAAO,aAAeU,EAAE,YAAY,CAAE,CAAC,EAAI,CAAC,CAAE,CAAE,CAAC,EAC5MC,EAAS,CACb,GAAGT,EAAM,IAAKU,IAAO,CAAE,KAAM,YAAa,MAAOA,EAAE,MAAO,IAAK,oBAAqB,OAAQA,EAAE,QAAU,CAAE,KAAM,OAAQ,QAAS,EAAG,IAAK,EAAG,EAAG,MAAOA,EAAE,KAAM,EAAE,EAChK,GAAIT,EAAS,CAAC,CAAE,KAAM,YAAa,MAAOH,EAAO,aAAeU,EAAE,YAAY,EAAG,IAAK,oBAAqB,MAAO,CAACP,CAAM,CAAE,CAAC,EAAI,CAAC,CACnI,EACMU,EAAO,IAAIC,EAAU,CAAE,IAAK,oBAAqB,KAAM,EAAG,OAAQ,CAAE,KAAM,MAAO,EAAG,MAAOH,CAAO,CAAC,EACnGI,EAAU,IAAIC,EAAO,CAAE,KAAMhB,EAAO,UAAYU,EAAE,UAAU,EAAG,QAAS,IAAMT,EAAG,KAAK,CAAE,CAAC,EACzFgB,EAAU,IAAID,EAAO,CAAE,KAAMhB,EAAO,UAAYU,EAAE,UAAU,EAAG,QAAS,UAAW,QAAS,IAAMT,EAAG,KAAK,CAAE,CAAC,EAC7GiB,EAAY,IAAIF,EAAO,CAAE,KAAMhB,EAAO,YAAcU,EAAE,YAAY,EAAG,QAAS,UAAW,SAAU,QAAS,CAAC,EAC7GS,EAASnB,EAAO,WAAa,CAAC,IAAIgB,EAAO,CAAE,KAAMhB,EAAO,WAAY,QAAS,QAAS,QAAS,IAAMC,EAAG,KAAK,QAAQ,CAAE,CAAC,CAAC,EAAI,CAAC,EAC9HmB,EAAS,IAAIC,EAAQ,CAAE,IAAK,sBAAuB,MAAO,CAAC,GAAGF,EAAQ,KAAMJ,EAASE,EAASC,CAAS,CAAE,CAAC,EAChH,MAAM,CAAE,GAAGlB,EAAQ,OAAQ,CAAE,KAAM,MAAO,EAAG,MAAO,CAACI,EAASS,EAAMO,CAAM,CAAE,CAAC,EAC7EnB,EAAK,KACL,OAAO,OAAO,KAAM,CAAE,QAAAG,EAAS,KAAAS,EAAM,KAAMV,EAAQ,QAAAY,EAAS,QAAAE,EAAS,UAAAC,CAAU,CAAC,EAChFd,EAAQ,GAAG,gBAAkBkB,IAAerB,EAAG,KAAKqB,CAAC,EAAG,GAAM,EAC9DT,EAAK,GAAG,WAAY,IAAMZ,EAAG,WAAW,CAAC,EACzC,KAAK,IAAI,IAAM,KAAK,KAAK,CAAC,CAC5B,CAEQ,KAAsB,CAC5B,OAAO,KAAK,MACd,CAEQ,OAAgB,CACtB,OAAO,KAAK,KAAK,MAAM,MACzB,CACQ,MAAe,CACrB,OAAO,KAAK,MAAM,GAAK,KAAK,KAAO,EAAI,EACzC,CAEA,SAAkB,CAChB,OAAO,KAAK,KACd,CACA,cAAuB,CACrB,OAAO,KAAK,MAAM,CACpB,CACA,YAAsB,CACpB,OAAO,KAAK,OACd,CAEQ,WAAWqB,EAAyB,CAC1C,IAAMC,EAAO,KAAK,KAAK,MAAMD,CAAC,EAC9B,OAAOC,aAAgBT,EAAaS,EAAK,MAAOC,GAAMA,aAAaC,CAAK,EAAqB,CAAC,CAChG,CAGA,aAAaH,EAAoB,CAC/B,GAAIA,GAAK,KAAK,KAAK,EAAG,MAAO,GAC7B,IAAMI,EAAM,KAAK,WAAWJ,CAAC,EAAE,OAAQK,GAAM,CAACA,EAAE,SAAS,CAAC,EAC1D,YAAK,QAAQ,aAAaL,EAAGI,EAAI,OAAS,QAAU,MAAM,EACnD,CAACA,EAAI,MACd,CAGQ,KAAKJ,EAAWM,EAAoB,CAC1C,KAAK,MAAMN,CAAC,EAAIM,EACZN,IAAM,KAAK,OAAO,KAAK,SAAS,CACtC,CACQ,UAAiB,CACvB,GAAI,CAAC,KAAK,SAAU,OACpB,IAAMM,EAAO,KAAK,MAAM,KAAK,KAAK,GAAK,GACvC,GAAI,CAAC,KAAK,OAAQ,CAChB,GAAI,CAACA,EAAM,OACX,KAAK,KAAK,GAAG,OAAQ,KAAK,OAAS,EAAE,MAAO,oBAAqB,CAAE,KAAM,OAAQ,CAAC,CAAE,CACtF,CACA,KAAK,OAAO,YAAcA,EAC1B,KAAK,OAAO,OAAS,CAACA,CACxB,CAGQ,KAAKC,EAAmB,CAC9B,KAAK,GAAG,UAAU,OAAO,gBAAiBA,CAAE,EAC5C,KAAK,QAAQ,WAAWA,CAAE,EAC1B,KAAK,UAAU,WAAWA,CAAE,CAC9B,CAEQ,MAAa,CACd,KAAK,UACV,KAAK,QAAQ,MAAM,EACnB,KAAK,QAAU,OACf,KAAK,KAAK,EAAK,EACjB,CAGA,MAAc,MAAMC,EAA6B,CAC/C,IAAMC,EAAK,KAAK,IAAI,EAAE,MAAMD,CAAC,GAAG,SAChC,GAAI,CAACC,EAAI,MAAO,GAChB,KAAK,KAAK,EACV,IAAMC,EAAO,KAAK,QAAU,IAAI,gBAChC,KAAK,KAAK,EAAI,EACd,IAAIC,EACJ,GAAI,CACFA,EAAM,MAAMF,EAAG,KAAK,UAAU,EAAG,KAAMC,EAAI,MAAM,CACnD,OAASE,EAAG,CACVD,EAAM,OAAQC,GAAa,SAAWA,CAAC,CACzC,CACA,GAAIF,EAAI,OAAO,QAAS,MAAO,GAC/B,KAAK,QAAU,OACf,KAAK,KAAK,EAAK,EACf,IAAMG,EAAKF,IAAQ,IAAQA,GAAO,KAElC,GADA,KAAK,KAAKH,EAAG,OAAOG,GAAQ,SAAWA,EAAM,EAAE,EAC3C,CAACE,GAAM,OAAOF,GAAQ,SAAU,OAAW,CAACG,EAAMC,CAAG,IAAK,OAAO,QAAQJ,CAAG,EAAG,KAAK,SAASG,CAAI,GAAG,SAASC,CAAG,EACpH,OAAKF,GAAI,KAAK,QAAQ,aAAaL,EAAG,OAAO,EACtCK,CACT,CAMA,KAAKG,EAA6B,CAIhC,GAHIA,EAAI,GAAKA,GAAK,KAAK,MAAM,GAAKA,IAAM,KAAK,OACzC,KAAK,SAAWA,EAAI,KAAK,QAC7B,KAAK,KAAK,EACN,KAAK,KAAK,qBAAsB,KAAK,MAAOA,CAAC,IAAM,IAAO,OAAO,QAAQ,QAAQ,EAAK,EAC1F,IAAMC,EAAO,KAAK,MACZC,EAAQC,GACR,KAAK,QAAUF,EAAa,IAC5BE,IAAW,KAAK,OAAO,KAAK,KAAK,cAAcA,CAAM,EACrDA,IAAWH,GAAG,KAAK,WAAWG,CAAM,EAAE,KAAMd,GAAMA,EAAE,SAAS,CAAC,GAAG,MAAM,EACpEc,IAAWH,GAEpB,GAAI,KAAK,IAAI,EAAE,SAAW,IAASA,EAAIC,EAAM,OAAO,QAAQ,QAAQC,EAAKF,CAAC,CAAC,EAC3E,IAAMI,EAAQZ,GAA0C,CACtD,KAAOA,EAAIQ,EAAGR,IAAK,CACjB,GAAI,CAAC,KAAK,aAAaA,CAAC,EAAG,OAAOU,EAAKV,CAAC,EACxC,GAAI,KAAK,IAAI,EAAE,MAAMA,CAAC,GAAG,SAAU,OAAO,KAAK,MAAMA,CAAC,EAAE,KAAMK,GAAQA,EAAKO,EAAKZ,EAAI,CAAC,EAAIU,EAAKV,CAAC,CAAE,CACnG,CACA,OAAOU,EAAKF,CAAC,CACf,EACA,OAAO,QAAQ,QAAQI,EAAKH,CAAI,CAAC,CACnC,CACA,MAAyB,CACvB,OAAO,KAAK,KAAK,KAAK,MAAQ,CAAC,CACjC,CACA,MAAyB,CACvB,OAAO,KAAK,KAAK,KAAK,MAAQ,CAAC,CACjC,CAGQ,YAAmB,CACzB,IAAMjB,EAAI,KAAK,KAAK,MAAM,QAAQ,KAAK,KAAK,cAAc,CAAE,EAC5D,GAAIA,EAAI,EAAG,OACX,IAAMiB,EAAO,KAAK,MAClB,KAAK,MAAQjB,EACb,KAAK,QAAQ,UAAUA,CAAC,EACxB,IAAMqB,EAAO,KAAK,MAAM,EAAI,EAC5B,KAAK,QAAQ,OAAO,OAASrB,IAAM,EACnC,KAAK,QAAQ,OAAO,OAASA,IAAMqB,EACnC,KAAK,UAAU,OAAO,OAASrB,IAAMqB,EACrC,OAAW,CAACC,EAAGC,CAAI,GAAK,CAAC,CAAC,KAAK,QAASvB,IAAM,CAAC,EAAG,CAAC,KAAK,QAASA,IAAMqB,CAAI,EAAG,CAAC,KAAK,UAAWrB,IAAMqB,CAAI,CAAC,EAAgBC,EAAE,WAAUA,EAAE,GAAG,OAASC,GAGpJ,GAFI,KAAK,MAAQvB,IAAMqB,GAAM,KAAK,cAAc,EAChD,KAAK,SAAS,EACVrB,IAAMiB,IACR,KAAK,KAAK,cAAejB,EAAGiB,CAAI,EAC5B,KAAK,UAAY,KAAK,GAAG,aAAe,CAAC,KAAK,WAAWjB,CAAC,EAAE,KAAMK,GAAMA,EAAE,SAAS,CAAC,GAAG,CACzF,IAAMmB,EAAQ,KAAK,KAAK,MAAMxB,CAAC,GAAG,GAC7B,KAAK,OAA0B,UAAW,KAAK,WAAWA,CAAC,EAAE,CAAC,GAAG,MAAM,EACnEwB,IAASA,EAAM,SAAW,GAAKA,EAAM,MAAM,EACtD,CAEJ,CAEQ,eAAsB,CAC5B,IAAMC,EAAS,KAAK,UAAU,EACxBhB,EAAK,KAAK,IAAI,EAAE,OACtB,GAAI,OAAOA,GAAO,WAAY,OAAO,KAAK,KAAM,WAAW,CAACA,EAAGgB,EAAQ,IAAI,CAAC,CAAC,EAC7E,IAAMC,EAA4B,CAAC,EACnC,QAAS,EAAI,EAAG,EAAI,KAAK,KAAK,EAAG,IAAK,CACpC,IAAMC,EAAO,KAAK,WAAW,CAAC,EAAE,OAAQtB,GAAMA,EAAE,IAAI,EAC/CsB,EAAK,SACVD,EAAI,KAAK,EAAE,KAAM,4BAA6B,CAAC,EAAG,OAAQ,KAAK,KAAK,MAAM,CAAC,EAAE,OAA8B,OAAS,EAAE,CAAC,CAAC,EACxHA,EAAI,KAAK,EAAE,KAAM,2BAA4B,CAAC,EAAG,GAAGC,EAAK,QAAStB,GAAM,CAAC,EAAE,KAAM,GAAI,CAAC,EAAGA,EAAE,OAAO,OAAUA,EAAE,OAAiC,UAAYA,EAAE,IAAK,EAAG,EAAE,KAAM,GAAI,CAAC,EAAG,KAAK,MAAMA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxM,CACA,KAAK,KAAM,WAAWqB,CAAG,CAC3B,CAGQ,MAAMrB,EAAuB,CACnC,IAAMuB,EAAKvB,EACX,GAAIuB,EAAG,QACL,OAAOA,EAAG,QAAQ,EAAE,IAAI,CAACC,EAAG7B,IAAM4B,EAAG,aAAa5B,CAAC,EAAE,IAAK8B,GAAM,KAAK,MAAMA,CAAC,CAAC,EAAE,OAAQ1C,GAAMA,IAAM,QAAG,EAAE,KAAK,QAAK,CAAC,EAAE,KAAK;AAAA,CAAI,GAAK,SACrI,IAAM2C,EAAI1B,EAAE,SAAS,EACrB,GAAI,OAAO0B,GAAM,UAAW,OAAOA,EAAI,SAAM,SAC7C,GAAK1B,EAAE,OAAkC,YAAc,WAAY,OAAO0B,EAAI,mDAAa,SAC3F,IAAMzB,EAAOD,EAAE,eAAe,EAC9B,GAAIC,EAAM,OAAOA,EACjB,IAAM0B,EAAQF,GAAwB,MAAM,QAAQA,CAAC,EAAIA,EAAE,IAAIE,CAAI,EAAE,KAAK,IAAI,EAAIF,GAAK,OAAOA,GAAM,SAAW,OAAO,OAAOA,CAAC,EAAE,IAAIE,CAAI,EAAE,KAAK,UAAK,EAAI,GAAGF,GAAK,EAAE,GAClK,OAAOE,EAAKD,CAAC,GAAK,QACpB,CAGS,QAAkB,CACzB,GAAI,KAAK,MAAQ,KAAK,MAAM,EAAI,EAC9B,OAAK,KAAK,KAAK,EACR,GAET,IAAME,EAAS,IAAM,CACnB,QAASjC,EAAI,EAAGA,EAAI,KAAK,KAAK,EAAGA,IAAK,KAAK,QAAQ,aAAaA,EAAG,KAAK,WAAWA,CAAC,EAAE,KAAMK,GAAMA,EAAE,SAAS,CAAC,EAAI,QAAU,MAAM,CACpI,EAEA,GAAI,KAAK,IAAI,EAAE,MAAM,KAAMf,GAAMA,EAAE,QAAQ,EAAG,CAC5C,GAAI,KAAK,SAAW,KAAK,KAAK,eAAe,IAAM,IAAS,CAAC,KAAK,SAAS,EAAG,OAAO2C,EAAO,EAAG,GAC/F,IAAMC,EAAK,KAAK,MAChB,OAAM,SAAY,CAChB,QAAS1B,EAAI,EAAGA,EAAI,KAAK,KAAK,EAAGA,IAC/B,GAAI,CAAE,MAAM,KAAK,MAAMA,CAAC,EAAI,CAC1B,GAAI,KAAK,QAAU0B,GAAM,KAAK,UAAW,OACrC1B,IAAM0B,GAAI,KAAK,KAAK,cAAc1B,CAAC,EACvC,KAAK,WAAWA,CAAC,EAAE,KAAMH,GAAMA,EAAE,SAAS,CAAC,GAAG,MAAM,EACpD,MACF,CAEF4B,EAAO,EACP,IAAMR,EAAS,KAAK,UAAU,EAC9B,KAAK,KAAK,SAAUA,CAAM,EAC1B,KAAK,KAAK,SAAUA,CAAM,CAC5B,GAAG,EACI,EACT,CACA,IAAMZ,EAAK,MAAM,OAAO,EACxB,OAAAoB,EAAO,EACHpB,GAAI,KAAK,KAAK,SAAU,KAAK,UAAU,CAAC,EACrCA,CACT,CAGS,OAAc,CACrB,KAAK,KAAK,EACV,KAAK,MAAQ,CAAC,EACd,MAAM,MAAM,EACZ,KAAK,YAAY,EACjB,QAASb,EAAI,EAAGA,EAAI,KAAK,MAAM,EAAGA,IAAK,KAAK,QAAQ,aAAaA,EAAG,SAAS,EACzE,KAAK,QAAU,GAAG,KAAK,KAAK,cAAc,CAAC,EAC/C,KAAK,SAAS,CAChB,CACF,EACAmC,EAAS,WAAY3D,CAAQ",
|
|
6
|
+
"names": ["addMessages", "ReviewPane", "Component", "nodes", "StepForm", "Form", "config", "me", "steps", "review", "stepper", "Stepper", "title", "description", "icon", "optional", "t", "panels", "s", "body", "Container", "backBtn", "Button", "nextBtn", "finishBtn", "cancel", "footer", "Toolbar", "i", "step", "c", "Field", "bad", "f", "text", "on", "k", "fn", "ctl", "res", "e", "ok", "name", "msg", "j", "from", "land", "target", "walk", "last", "b", "hide", "panel", "values", "out", "rows", "fl", "_", "x", "v", "flat", "states", "at", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as m}from"./chunk-UQRQH2JW.js";import{b as f}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{b as p}from"./chunk-PZSHOSOS.js";import{e as d,f as l}from"./chunk-S4QD5NID.js";d("en",{wDockLeft:"Dock to the left",wDockRight:"Dock to the right",wDockTop:"Dock to the top",wDockBottom:"Dock to the bottom",wResize:"Resize"});d("pt-BR",{wDockLeft:"Fixar \xE0 esquerda",wDockRight:"Fixar \xE0 direita",wDockTop:"Fixar em cima",wDockBottom:"Fixar embaixo",wResize:"Redimensionar"});var v=160,w={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},y={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},b=["right","left","top","bottom"],a=class extends m{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;grip;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:w[o],label:l(y[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.setResizable(!!e.resizable),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!b.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of b)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e));this.paintGrip()}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.paintGrip(),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.paintGrip(),this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=h=>this.moveTo(h.clientX-o,h.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}setResizable(e){if(this.config.resizable=e,!this.rendered||(this.grip?.remove(),this.grip=void 0,!e||this.config.floating===!1))return;let t=this.grip=p("div","op-widget__resize",{role:"separator",tabindex:0,"aria-label":l("wResize")});this.el.append(t),this.listen(t,"pointerdown",i=>{if(i.button)return;i.preventDefault();let o=this.el.getBoundingClientRect(),s=i.clientX,n=i.clientY;this.el.classList.add("is-resizing");let r=c=>this.resizeBy(o,c.clientX-s,c.clientY-n),h=()=>{this.el.classList.remove("is-resizing"),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",h)};document.addEventListener("pointermove",r),document.addEventListener("pointerup",h),this.own(h)}),this.listen(t,"keydown",i=>{let o=i.shiftKey?64:16,s={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]};!s[i.key]||i.altKey||(i.preventDefault(),this.resizeBy(this.el.getBoundingClientRect(),...s[i.key]))}),this.paintGrip()}resizeBy(e,t,i){let o=(n,r)=>Math.round(Math.max(v,Math.min(n,r)));if(this.pos)t&&(this.el.style.width=`${o(e.width+t,innerWidth-this.pos.x)}px`),i&&(this.el.style.height=`${o(e.height+i,innerHeight-this.pos.y)}px`);else{let n=this.getSide(),r=n==="left"||n==="right",h=n==="right"?-t:n==="left"?t:n==="bottom"?-i:i;this.setSize(o((r?e.width:e.height)+h,(r?innerWidth:innerHeight)-32))}this.paintGrip();let s=this.el.getBoundingClientRect();this.emit("resize",{width:Math.round(s.width),height:Math.round(s.height)})}paintGrip(){let e=this.grip;if(!e)return;let t=this.getSide(),i=!!this.pos||t==="left"||t==="right",o=this.el.getBoundingClientRect();e.setAttribute("aria-orientation",i?"vertical":"horizontal"),e.setAttribute("aria-valuemin",String(v)),e.setAttribute("aria-valuenow",String(Math.round(i?o.width:o.height)))}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,f(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),e.tabIndex<0&&!e.hasAttribute("tabindex")&&(e.tabIndex=-1),(this.config.autoFocus&&u(this.getBody())[0]||e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};g("widget",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-JSEI44A7.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as y}from"./chunk-3VDLX7ET.js";var T=0;function u(s,r){return s==null||!r?.type?s:r.type==="number"?s===""?null:Number(s):r.type==="boolean"?s==="false"?!1:!!s:String(s)}var f=class{constructor(r={},e={}){this.def=e;let t={...r};for(let i in e.fields){let o=e.fields[i];t[i]=u(t[i]===void 0?o.default:t[i],o)}this.data=t,this.phantom=this.data[e.idField??"id"]===void 0}def;data;phantom;owner;clientId=`c${++T}`;original={};get id(){return this.data[this.def.idField??"id"]??this.clientId}get(r){return this.data[r]}set(r,e){let t=u(e,this.def.fields?.[r]);this.data[r]!==t&&(r in this.original||(this.original[r]=this.data[r]),this.data[r]=t,this.owner?.recordChanged(this,r))}patch(r){let e=!1;for(let t in r){let i=u(r[t],this.def.fields?.[t]);t in this.original||this.data[t]===i||(this.data[t]=i,e=!0)}return e}isDirty(){return Object.keys(this.original).length>0}getChanges(){let r={};for(let e in this.original)r[e]=this.data[e];return r}commit(){this.original={},this.phantom=!1}reject(){Object.assign(this.data,this.original),this.original={}}};var b,w=(s,r)=>s==null?r==null?0:1:r==null?-1:typeof s=="string"&&typeof r=="string"?(b??=new Intl.Collator(void 0,{numeric:!0})).compare(s,r):s<r?-1:s>r?1:0,h=s=>String(s??"").toLowerCase(),g=s=>s==null||s===""||Array.isArray(s)&&!s.length,x=/^\d{4}-\d{2}-\d{2}(T[\d:.]+Z?)?$/,l=s=>s instanceof Date?s.getTime():typeof s=="string"&&x.test(s)?Date.parse(s):s;function M(s,r){let e=s.value,t=l(r),i=()=>!g(r)&&t>=l(e[0])&&t<=l(e[1]),o=()=>e.some(n=>l(n)==t);switch(s.op??"eq"){case"eq":return t==l(e);case"ne":return t!=l(e);case"contains":return h(r).includes(h(e));case"notContains":return!h(r).includes(h(e));case"startsWith":return h(r).startsWith(h(e));case"endsWith":return h(r).endsWith(h(e));case"gt":return t>l(e);case"ge":return t>=l(e);case"lt":return t<l(e);case"le":return t<=l(e);case"between":return i();case"notBetween":return!i();case"in":return o();case"nin":return!o();case"empty":return g(r);case"notEmpty":return!g(r)}}function m(s,r){return"filters"in s?s.filters.length?s.op==="or"?s.filters.some(e=>m(e,r)):s.filters.every(e=>m(e,r)):!0:M(s,r[s.field])}var v=class extends y{constructor(e={}){super();this.cfg=e;this.sorters=e.sorters??[],this.pageLen=e.pageSize??0;for(let t in e.listeners)this.on(t,e.listeners[t]);e.proxy&&(this.proxy=typeof e.proxy=="function"?{read:e.proxy}:e.proxy),e.data&&this.setRecords(e.data.map(t=>this.wrap(t)),e.data.length),e.autoLoad&&this.proxy&&this.load()}cfg;all=[];rows=[];visible=[];removed=[];sorters;filters=[];params={};proxy;pageNo=1;pageLen;total=0;abort;loading=!1;get remote(){return!!this.cfg.remote&&!!this.proxy}wrap(e){let t=e instanceof f?e:new f(e,this.cfg.model);return t.owner=this,t}fire(e,...t){this.emit(e,...t),this.emit("change",{type:e})}get count(){return this.visible.length}get totalCount(){return this.remote?this.total:this.rows.length}getFiltered(){return this.rows}getAt(e){return this.visible[e]}getRange(e=0,t=this.visible.length){return this.visible.slice(e,t)}getById(e){return this.all.find(t=>t.id===e)}indexOf(e){return this.visible.indexOf(e)}getData(){return this.visible.map(e=>e.data)}each(e){this.visible.forEach(e)}loadData(e){this.removed=[],this.setRecords(e.map(t=>this.wrap(t)),e.length),this.fire("load")}async load(e){if(!this.proxy)throw new Error("Optikos Store: load() needs a proxy");e&&(this.params=e);let t={...this.params};if(this.remote&&Object.assign(t,{page:this.pageNo,pageSize:this.pageLen||void 0,sorters:this.sorters,filters:this.filters.filter(o=>typeof o!="function")}),this.emit("before-load",t)===!1)return;this.abort?.abort();let i=this.abort=new AbortController;this.loading=!0,this.emit("loading",!0);try{let o=await this.proxy.read(t,i.signal);if(i.signal.aborted)return;let{data:n,total:a}=Array.isArray(o)?{data:o,total:o.length}:o;this.removed=[],this.setRecords(n.map(d=>this.wrap(d)),a??n.length),this.loading=!1,this.emit("loading",!1),this.fire("load")}catch(o){if(i.signal.aborted)return;this.loading=!1,this.emit("loading",!1),this.emit("load-error",o)}}async fetchAll(e=500){if(!this.remote)return this.rows;let t=[],i={...this.params,pageSize:e,sorters:this.sorters,filters:this.filters.filter(o=>typeof o!="function")};for(let o=1;;o++){let n=await this.proxy.read({...i,page:o}),{data:a,total:d}=Array.isArray(n)?{data:n,total:n.length}:n;if(t.push(...a.map(c=>new f(c,this.cfg.model))),!a.length||t.length>=(d??0)||a.length<e)return t}}setRecords(e,t){this.all=e,this.total=t,this.refreshView()}refreshView(){if(this.remote){this.rows=this.visible=this.all;return}let e=this.all;this.filters.length&&(e=e.filter(i=>this.filters.every(o=>typeof o=="function"?o(i):m(o,i.data)))),this.sorters.length&&(e=[...e].sort((i,o)=>{for(let n of this.sorters){let a=w(i.data[n.field],o.data[n.field]);if(a)return n.dir==="desc"?-a:a}return 0})),this.rows=e;let t=this.pageCount;this.pageNo>t&&(this.pageNo=t),this.visible=this.pageLen?e.slice((this.pageNo-1)*this.pageLen,this.pageNo*this.pageLen):e}getSorters(){return this.sorters}sort(e,t){let i=this.sorters[0];this.sorters=e?[{field:e,dir:t??(i?.field===e&&i.dir==="asc"?"desc":"asc")}]:[],this.pageNo=1,this.changeView("sort")}filter(e){return this.filters=Array.isArray(e)?e:[e],this.pageNo=1,this.changeView("filter")}clearFilter(){return this.filters=[],this.pageNo=1,this.changeView("filter")}getFilters(){return this.filters.filter(e=>typeof e!="function")}changeView(e){return this.remote?this.load():(this.refreshView(),this.fire(e),Promise.resolve())}get page(){return this.pageNo}get pageSize(){return this.pageLen}get pageCount(){return this.pageLen?Math.max(1,Math.ceil(this.totalCount/this.pageLen)):1}setPage(e){e=Math.min(Math.max(1,e),this.pageCount),e!==this.pageNo&&(this.pageNo=e,this.remote?this.load():(this.refreshView(),this.fire("page")))}setPageSize(e){this.pageLen=e,this.pageNo=1,this.changeView("page")}add(e){let t=(Array.isArray(e)?e:[e]).map(i=>this.wrap(i));return this.all=[...this.all,...t],this.total+=t.length,this.refreshView(),this.fire("add",t),t}insert(e,t){let i=this.wrap(t);return this.all=[...this.all.slice(0,e),i,...this.all.slice(e)],this.total++,this.refreshView(),this.fire("add",[i]),i}remove(e){let i=(Array.isArray(e)?e:[typeof e=="number"?this.visible[e]:e]).filter(o=>o&&this.all.includes(o));i.length&&(this.all=this.all.filter(o=>!i.includes(o)),this.removed.push(...i.filter(o=>!o.phantom)),this.total-=i.length,this.refreshView(),this.fire("remove",i))}applyPatches(e){let t=this.cfg.model?.idField??"id",i=new Map(this.all.map(a=>[a.id,a])),o=[],n=!1;for(let a of e){let d=a.id??a.data?.[t],c=d===void 0?void 0:i.get(d);if(a.op==="remove"){if(!c)continue;i.delete(d),this.all=this.all.filter(p=>p!==c),this.total--,n=!0}else if(c)n=c.patch(a.data)||n;else if(a.data){let p=this.wrap(a.data);o.push(p),i.set(p.id,p)}}o.length&&(this.all=[...this.all,...o],this.total+=o.length),!(!o.length&&!n)&&(this.refreshView(),this.fire("patch",e))}connect(e,t=i=>typeof i=="string"?JSON.parse(i):i){let i=o=>{let n=t(o.data);this.applyPatches(Array.isArray(n)?n:[n])};return e.addEventListener("message",i),()=>e.removeEventListener("message",i)}clear(){this.removed.push(...this.all.filter(e=>!e.phantom)),this.setRecords([],0),this.fire("remove",[])}recordChanged(e,t){(this.sorters.some(i=>i.field===t)||this.filters.length)&&this.refreshView(),this.fire("update",e,t)}getModified(){return this.all.filter(e=>e.phantom||e.isDirty())}getRemoved(){return this.removed}commitChanges(){this.all.forEach(e=>e.commit()),this.removed=[]}async sync(){let e=this.proxy;if(!e)throw new Error("Optikos Store: sync() needs a proxy");for(let t of this.removed)await e.destroy?.(t.data);this.removed=[];for(let t of this.all){if(t.phantom)Object.assign(t.data,await e.create?.(t.data)??{});else if(t.isDirty())Object.assign(t.data,await e.update?.(t.data)??{});else continue;t.commit()}this.fire("sync")}subscribe(e){return this.on("change",e)}};export{f as a,m as b,v as c};
|
|
2
|
+
//# sourceMappingURL=chunk-L5SQQFO7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/data/model.ts", "../src/data/store.ts"],
|
|
4
|
+
"sourcesContent": ["export interface FieldDef {\n type?: 'string' | 'number' | 'boolean';\n default?: unknown;\n}\nexport interface ModelDef {\n idField?: string;\n fields?: Record<string, FieldDef>;\n}\n\nexport interface RecordOwner {\n recordChanged(rec: Model, field: string): void;\n}\n\nlet cid = 0;\n\nfunction convert(v: unknown, def?: FieldDef): unknown {\n if (v == null || !def?.type) return v;\n if (def.type === 'number') return v === '' ? null : Number(v);\n if (def.type === 'boolean') return v === 'false' ? false : Boolean(v);\n return String(v);\n}\n\n/** One record. `data` holds the values; `set` tracks the original value of each changed field. */\nexport class Model<T extends Record<string, any> = Record<string, any>> {\n data: T;\n phantom: boolean;\n owner?: RecordOwner;\n private readonly clientId = `c${++cid}`;\n private original: Partial<T> = {};\n\n constructor(raw: Partial<T> = {}, private def: ModelDef = {}) {\n const data: Record<string, unknown> = { ...raw };\n for (const f in def.fields) {\n const fd = def.fields[f];\n data[f] = convert(data[f] === undefined ? fd.default : data[f], fd);\n }\n this.data = data as T;\n this.phantom = this.data[def.idField ?? 'id'] === undefined;\n }\n\n get id(): string | number {\n return this.data[this.def.idField ?? 'id'] ?? this.clientId;\n }\n\n get<K extends keyof T>(field: K): T[K] {\n return this.data[field];\n }\n\n set<K extends keyof T>(field: K, value: T[K]): void {\n const v = convert(value, this.def.fields?.[field as string]) as T[K];\n if (this.data[field] === v) return;\n if (!(field in this.original)) this.original[field] = this.data[field];\n this.data[field] = v;\n this.owner?.recordChanged(this as Model, field as string);\n }\n\n /** Applies values that came from the server. It is not an edit (nothing becomes dirty), and a field the user already changed keeps their value. */\n patch(raw: Partial<T>): boolean {\n let changed = false;\n for (const k in raw) {\n const v = convert(raw[k], this.def.fields?.[k]) as T[typeof k];\n if (k in this.original || this.data[k] === v) continue;\n this.data[k] = v;\n changed = true;\n }\n return changed;\n }\n\n isDirty(): boolean {\n return Object.keys(this.original).length > 0;\n }\n getChanges(): Partial<T> {\n const out: Partial<T> = {};\n for (const k in this.original) out[k] = this.data[k];\n return out;\n }\n commit(): void {\n this.original = {};\n this.phantom = false;\n }\n reject(): void {\n Object.assign(this.data, this.original);\n this.original = {};\n }\n}\n", "import { Emitter } from '../core/emitter';\nimport { Model, type ModelDef, type RecordOwner } from './model';\nimport type { FilterNode, FilterSpec, Proxy, ReadParams, ReadResult, Sorter } from './proxy';\n\nexport type StoreProxy<T> = Proxy<T> | ((params: ReadParams, signal?: AbortSignal) => Promise<ReadResult<T> | T[]> | ReadResult<T> | T[]);\nexport type FilterFn<T extends Record<string, any>> = (rec: Model<T>) => boolean;\n\n/** One live change: `upsert` merges `data` into the record with the same id (or adds it), `remove` drops the record with `id`. */\nexport interface Patch<T> {\n op?: 'upsert' | 'remove';\n data?: Partial<T>;\n id?: string | number;\n}\n/** What `connect` needs from a source: an `EventSource` or a `WebSocket` both fit. */\nexport interface LiveSource {\n addEventListener(type: 'message', fn: (e: { data: any }) => void): void;\n removeEventListener(type: 'message', fn: (e: { data: any }) => void): void;\n}\n\nexport interface StoreConfig<T extends Record<string, any>> {\n data?: Partial<T>[];\n model?: ModelDef;\n proxy?: StoreProxy<T>;\n /** 0 = no paging. */\n pageSize?: number;\n /** Sort, filter and paging are done by the proxy (it receives them in `read`). Default false: done locally. */\n remote?: boolean;\n sorters?: Sorter[];\n autoLoad?: boolean;\n listeners?: Record<string, (...a: any[]) => unknown>;\n}\n\n// One collator, made on first use: `localeCompare` with options builds a new one per call (100k rows: 5.4 s \u2192 0.4 s).\nlet collator: Intl.Collator | undefined;\nconst cmp = (a: any, b: any) => (a == null ? (b == null ? 0 : 1) : b == null ? -1 : typeof a === 'string' && typeof b === 'string' ? (collator ??= new Intl.Collator(undefined, { numeric: true })).compare(a, b) : a < b ? -1 : a > b ? 1 : 0);\n\nconst text = (v: any) => String(v ?? '').toLowerCase();\nconst empty = (v: any) => v == null || v === '' || (Array.isArray(v) && !v.length);\nconst ISO = /^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+Z?)?$/;\n/** Dates (Date objects or ISO strings) compare by time; anything else compares as is. */\nconst num = (v: any) => (v instanceof Date ? v.getTime() : typeof v === 'string' && ISO.test(v) ? Date.parse(v) : v);\n\nfunction test(spec: FilterSpec, raw: any): boolean {\n const x = spec.value as any;\n const v = num(raw);\n const between = () => !empty(raw) && v >= num(x[0]) && v <= num(x[1]);\n const listed = () => (x as unknown[]).some((i) => num(i) == v);\n switch (spec.op ?? 'eq') {\n case 'eq': return v == num(x);\n case 'ne': return v != num(x);\n case 'contains': return text(raw).includes(text(x));\n case 'notContains': return !text(raw).includes(text(x));\n case 'startsWith': return text(raw).startsWith(text(x));\n case 'endsWith': return text(raw).endsWith(text(x));\n case 'gt': return v > num(x);\n case 'ge': return v >= num(x);\n case 'lt': return v < num(x);\n case 'le': return v <= num(x);\n case 'between': return between();\n case 'notBetween': return !between();\n case 'in': return listed();\n case 'nin': return !listed();\n case 'empty': return empty(raw);\n case 'notEmpty': return !empty(raw);\n }\n}\n\n/** Does a record's data satisfy a filter node? Groups are AND/OR; an empty group matches everything. */\nexport function matchFilter(node: FilterNode, data: Record<string, any>): boolean {\n if ('filters' in node) {\n if (!node.filters.length) return true;\n return node.op === 'or' ? node.filters.some((f) => matchFilter(f, data)) : node.filters.every((f) => matchFilter(f, data));\n }\n return test(node, data[node.field]);\n}\n\n/**\n * Records + a view over them (filtered, sorted, paged). Events: `load`, `before-load`, `load-error`, `add`, `remove`,\n * `update`, `sort`, `filter`, `page`, `sync`, and `change` for any of them (payload `{ type }`).\n */\nexport class Store<T extends Record<string, any> = Record<string, any>> extends Emitter implements RecordOwner {\n private all: Model<T>[] = [];\n private rows: Model<T>[] = [];\n private visible: Model<T>[] = [];\n private removed: Model<T>[] = [];\n private sorters: Sorter[];\n private filters: Array<FilterNode | FilterFn<T>> = [];\n private params: Record<string, unknown> = {};\n private proxy?: Proxy<T>;\n private pageNo = 1;\n private pageLen: number;\n private total = 0;\n private abort?: AbortController;\n loading = false;\n\n constructor(private cfg: StoreConfig<T> = {}) {\n super();\n this.sorters = cfg.sorters ?? [];\n this.pageLen = cfg.pageSize ?? 0;\n for (const k in cfg.listeners) this.on(k, cfg.listeners[k]);\n if (cfg.proxy) this.proxy = typeof cfg.proxy === 'function' ? { read: cfg.proxy } : cfg.proxy;\n if (cfg.data) this.setRecords(cfg.data.map((r) => this.wrap(r)), cfg.data.length);\n if (cfg.autoLoad && this.proxy) void this.load();\n }\n\n private get remote() {\n return !!this.cfg.remote && !!this.proxy;\n }\n private wrap(raw: Partial<T> | Model<T>): Model<T> {\n const m = raw instanceof Model ? raw : new Model<T>(raw, this.cfg.model);\n m.owner = this;\n return m;\n }\n private fire(type: string, ...args: unknown[]) {\n this.emit(type, ...args);\n this.emit('change', { type });\n }\n\n // ---- reading -------------------------------------------------------------------------------\n\n /** Number of records in the current view (the current page). */\n get count(): number {\n return this.visible.length;\n }\n /** Records matching the filters, across pages (remote: what the server reported). */\n get totalCount(): number {\n return this.remote ? this.total : this.rows.length;\n }\n /** Every record matching the filters, across pages (a remote store only knows the loaded page). */\n getFiltered(): Model<T>[] {\n return this.rows;\n }\n getAt(i: number): Model<T> | undefined {\n return this.visible[i];\n }\n getRange(start = 0, end = this.visible.length): Model<T>[] {\n return this.visible.slice(start, end);\n }\n getById(id: string | number): Model<T> | undefined {\n return this.all.find((r) => r.id === id);\n }\n indexOf(rec: Model<T>): number {\n return this.visible.indexOf(rec);\n }\n /** Plain data of the current view. */\n getData(): T[] {\n return this.visible.map((r) => r.data);\n }\n each(fn: (rec: Model<T>, i: number) => void): void {\n this.visible.forEach(fn);\n }\n\n // ---- loading -------------------------------------------------------------------------------\n\n /** Replaces all records with local data. */\n loadData(data: Partial<T>[]): void {\n this.removed = [];\n this.setRecords(data.map((r) => this.wrap(r)), data.length);\n this.fire('load');\n }\n\n /** Reads through the proxy. Extra `params` are sent to it and remembered for later reloads. A newer load cancels the older one. */\n async load(params?: Record<string, unknown>): Promise<void> {\n if (!this.proxy) throw new Error('Optikos Store: load() needs a proxy');\n if (params) this.params = params;\n const req: ReadParams = { ...this.params };\n if (this.remote) Object.assign(req, { page: this.pageNo, pageSize: this.pageLen || undefined, sorters: this.sorters, filters: this.filters.filter((f): f is FilterNode => typeof f !== 'function') });\n if (this.emit('before-load', req) === false) return;\n this.abort?.abort();\n const ctl = (this.abort = new AbortController());\n this.loading = true;\n this.emit('loading', true);\n try {\n const res = await this.proxy.read(req, ctl.signal);\n if (ctl.signal.aborted) return;\n const { data, total } = Array.isArray(res) ? { data: res, total: res.length } : res;\n this.removed = [];\n this.setRecords(data.map((r) => this.wrap(r)), total ?? data.length);\n this.loading = false;\n this.emit('loading', false);\n this.fire('load');\n } catch (err) {\n if (ctl.signal.aborted) return;\n this.loading = false;\n this.emit('loading', false);\n this.emit('load-error', err);\n }\n }\n\n /** Every record that matches the current sort and filters: a local store has them; a remote one is read page by page through its proxy. */\n async fetchAll(pageSize = 500): Promise<Model<T>[]> {\n if (!this.remote) return this.rows;\n const out: Model<T>[] = [];\n const base = { ...this.params, pageSize, sorters: this.sorters, filters: this.filters.filter((f): f is FilterNode => typeof f !== 'function') };\n for (let page = 1; ; page++) {\n const res = await this.proxy!.read({ ...base, page });\n const { data, total } = Array.isArray(res) ? { data: res, total: res.length } : res;\n out.push(...data.map((r) => new Model<T>(r, this.cfg.model)));\n if (!data.length || out.length >= (total ?? 0) || data.length < pageSize) return out;\n }\n }\n\n private setRecords(recs: Model<T>[], total: number) {\n this.all = recs;\n this.total = total;\n this.refreshView();\n }\n\n /** Recomputes filtered/sorted/paged rows from `all`. */\n private refreshView() {\n if (this.remote) {\n this.rows = this.visible = this.all;\n return;\n }\n let rows = this.all;\n if (this.filters.length) rows = rows.filter((r) => this.filters.every((f) => (typeof f === 'function' ? f(r) : matchFilter(f, r.data))));\n if (this.sorters.length) {\n rows = [...rows].sort((a, b) => {\n for (const s of this.sorters) {\n const d = cmp(a.data[s.field], b.data[s.field]);\n if (d) return s.dir === 'desc' ? -d : d;\n }\n return 0;\n });\n }\n this.rows = rows;\n const pages = this.pageCount;\n if (this.pageNo > pages) this.pageNo = pages;\n this.visible = this.pageLen ? rows.slice((this.pageNo - 1) * this.pageLen, this.pageNo * this.pageLen) : rows;\n }\n\n // ---- sort / filter / paging ----------------------------------------------------------------\n\n getSorters(): Sorter[] {\n return this.sorters;\n }\n /** `sort('name')` toggles asc/desc when already sorted by it; `sort('name', 'desc')` is explicit; `sort(null)` clears. */\n sort(field: string | null, dir?: 'asc' | 'desc'): void {\n const cur = this.sorters[0];\n this.sorters = field ? [{ field, dir: dir ?? (cur?.field === field && cur.dir === 'asc' ? 'desc' : 'asc') }] : [];\n this.pageNo = 1;\n this.changeView('sort');\n }\n\n /**\n * Replaces the filters (top level = AND). Accepts specs, groups (`{ op: 'or', filters }`), or a predicate.\n * Resolves when the view is up to date (for a remote store, after the reload).\n */\n filter(f: FilterNode | FilterNode[] | FilterFn<T>): Promise<void> {\n this.filters = Array.isArray(f) ? f : [f];\n this.pageNo = 1;\n return this.changeView('filter');\n }\n clearFilter(): Promise<void> {\n this.filters = [];\n this.pageNo = 1;\n return this.changeView('filter');\n }\n /** The active filter nodes (predicates are not included). */\n getFilters(): FilterNode[] {\n return this.filters.filter((f): f is FilterNode => typeof f !== 'function');\n }\n\n private changeView(type: string): Promise<void> {\n if (this.remote) return this.load();\n this.refreshView();\n this.fire(type);\n return Promise.resolve();\n }\n\n get page(): number {\n return this.pageNo;\n }\n get pageSize(): number {\n return this.pageLen;\n }\n get pageCount(): number {\n return this.pageLen ? Math.max(1, Math.ceil(this.totalCount / this.pageLen)) : 1;\n }\n setPage(n: number): void {\n n = Math.min(Math.max(1, n), this.pageCount);\n if (n === this.pageNo) return;\n this.pageNo = n;\n if (this.remote) void this.load();\n else {\n this.refreshView();\n this.fire('page');\n }\n }\n setPageSize(n: number): void {\n this.pageLen = n;\n this.pageNo = 1;\n this.changeView('page');\n }\n\n // ---- editing -------------------------------------------------------------------------------\n\n add(raw: Partial<T> | Partial<T>[]): Model<T>[] {\n const recs = (Array.isArray(raw) ? raw : [raw]).map((r) => this.wrap(r));\n this.all = [...this.all, ...recs];\n this.total += recs.length;\n this.refreshView();\n this.fire('add', recs);\n return recs;\n }\n\n insert(index: number, raw: Partial<T>): Model<T> {\n const rec = this.wrap(raw);\n this.all = [...this.all.slice(0, index), rec, ...this.all.slice(index)];\n this.total++;\n this.refreshView();\n this.fire('add', [rec]);\n return rec;\n }\n\n remove(target: Model<T> | number | Array<Model<T>>): void {\n const list = Array.isArray(target) ? target : [typeof target === 'number' ? this.visible[target] : target];\n const gone = list.filter((r) => r && this.all.includes(r));\n if (!gone.length) return;\n this.all = this.all.filter((r) => !gone.includes(r));\n this.removed.push(...gone.filter((r) => !r.phantom));\n this.total -= gone.length;\n this.refreshView();\n this.fire('remove', gone);\n }\n\n /** Applies live changes in place, with one repaint: known ids are patched (not marked as edits), unknown ones are added, `remove` drops. */\n applyPatches(patches: Array<Patch<T>>): void {\n const idf = this.cfg.model?.idField ?? 'id';\n const byId = new Map(this.all.map((r) => [r.id, r]));\n const added: Model<T>[] = [];\n let touched = false;\n for (const p of patches) {\n const id = p.id ?? p.data?.[idf];\n const rec = id === undefined ? undefined : byId.get(id);\n if (p.op === 'remove') {\n if (!rec) continue;\n byId.delete(id!);\n this.all = this.all.filter((r) => r !== rec);\n this.total--;\n touched = true;\n } else if (rec) touched = rec.patch(p.data!) || touched;\n else if (p.data) {\n const m = this.wrap(p.data);\n added.push(m);\n byId.set(m.id, m);\n }\n }\n if (added.length) {\n this.all = [...this.all, ...added];\n this.total += added.length;\n }\n if (!added.length && !touched) return;\n this.refreshView();\n this.fire('patch', patches);\n }\n\n /** Applies what a source sends as it arrives (`{ op, data, id }`, or an array of them; text is parsed as JSON). Returns the function that stops it. */\n connect(source: LiveSource, parse: (data: any) => Patch<T> | Array<Patch<T>> = (d) => (typeof d === 'string' ? JSON.parse(d) : d)): () => void {\n const fn = (e: { data: any }) => {\n const p = parse(e.data);\n this.applyPatches(Array.isArray(p) ? p : [p]);\n };\n source.addEventListener('message', fn);\n return () => source.removeEventListener('message', fn);\n }\n\n clear(): void {\n this.removed.push(...this.all.filter((r) => !r.phantom));\n this.setRecords([], 0);\n this.fire('remove', []);\n }\n\n recordChanged(rec: Model, field: string): void {\n if (this.sorters.some((s) => s.field === field) || this.filters.length) this.refreshView();\n this.fire('update', rec, field);\n }\n\n getModified(): Model<T>[] {\n return this.all.filter((r) => r.phantom || r.isDirty());\n }\n getRemoved(): Model<T>[] {\n return this.removed;\n }\n commitChanges(): void {\n this.all.forEach((r) => r.commit());\n this.removed = [];\n }\n\n /** Writes pending changes through the proxy: deletes, then creates and updates, one at a time. */\n async sync(): Promise<void> {\n const p = this.proxy;\n if (!p) throw new Error('Optikos Store: sync() needs a proxy');\n for (const r of this.removed) await p.destroy?.(r.data);\n this.removed = [];\n for (const r of this.all) {\n if (r.phantom) Object.assign(r.data, (await p.create?.(r.data)) ?? {});\n else if (r.isDirty()) Object.assign(r.data, (await p.update?.(r.data)) ?? {});\n else continue;\n r.commit();\n }\n this.fire('sync');\n }\n\n /** Observable interface used by `optikos/bind`: calls `fn` on any change; returns the unsubscribe function. */\n subscribe(fn: (change: { type: string }) => void): () => void {\n return this.on('change', fn);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["cid", "convert", "v", "def", "Model", "raw", "data", "f", "fd", "field", "value", "changed", "k", "out", "collator", "cmp", "a", "b", "text", "v", "empty", "ISO", "num", "test", "spec", "raw", "x", "between", "listed", "i", "matchFilter", "node", "data", "f", "Store", "Emitter", "cfg", "k", "r", "m", "Model", "type", "args", "start", "end", "id", "rec", "fn", "params", "req", "ctl", "res", "total", "err", "pageSize", "out", "base", "page", "recs", "rows", "s", "d", "pages", "field", "dir", "cur", "n", "index", "target", "gone", "patches", "idf", "byId", "added", "touched", "p", "source", "parse", "e"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as k}from"./chunk-TIPK3SCJ.js";function v(g,o){let n=g.editor;return n&&typeof n=="object"?{...n}:typeof n=="string"?{type:n}:{type:typeof o=="number"?"numberfield":typeof o=="boolean"?"checkbox":"textfield"}}function x(g={}){let o,n,E=(e,t)=>!!e.editor&&(e.editable?.(t)??!0),m=e=>o.getColumns().filter(t=>E(t,e));function p(e){if(!E(e.column,e.record)||o.emit("before-edit",e.record,e.column.field)===!1)return!1;s(!0);let t=e.record.get(e.column.field),l=k({...v(e.column,t),value:t,stableSize:!1,ariaLabel:e.column.header??e.column.field,cls:"op-grid__editor"});return e.el.classList.add("is-editing"),e.el.replaceChildren(l.el),l.notifyMount(),n={cell:e,field:l,old:t},l.focus(),l.el.querySelector("input")?.select(),!0}function s(e){let t=n;if(!t)return!0;if(e&&!t.field.validate())return!1;n=void 0;let l=t.field.getValue();t.field.destroy(),t.cell.el.classList.remove("is-editing");let{record:d,column:c}=t.cell;return e&&!Object.is(l,t.old)?(d.set(c.field,l),o.emit("edit",d,c.field,l,t.old)):(o.refresh(),e||o.emit("edit-cancel",d,c.field)),!0}function C(e){if(!n)return;let t=o.getStore(),l=n.cell.index,d=m(n.cell.record),c=d.indexOf(n.cell.column)+e;for(let f=0;f<500;f++){if(c>=0&&c<d.length){o.scrollToRow(l);let a=o.getCell(l,d[c].field),r=t.getAt(l);return a?{index:l,record:r,column:d[c],el:a}:void 0}l+=e;let u=t.getAt(l);if(!u)return;d=m(u),c=e>0?0:d.length-1}}return{init(e){o=e;let t=e.el,l=t.querySelector("[role=grid]"),d=r=>{let i=e.cellAt(r.target);i&&!(n&&i.el===n.cell.el)&&p(i)},c=r=>{if(n&&n.cell.el.contains(r.target)){if(r.key==="Escape")s(!1);else if(r.key==="Enter"&&!r.shiftKey)s(!0)&&l.focus();else if(r.key==="Tab"){let i=C(r.shiftKey?-1:1);if(!s(!0))return void r.preventDefault();i?p({...i,el:o.getCell(i.index,i.column.field)??i.el}):l.focus()}else return;r.preventDefault(),r.stopPropagation()}else if(r.target===l&&(r.key==="F2"||r.key==="Enter")&&e.getActive()>=0){let i=e.getStore().getAt(e.getActive()),y=m(i)[0],b=y&&e.getCell(e.getActive(),y.field);b&&p({index:e.getActive(),record:i,column:y,el:b})&&(r.preventDefault(),r.stopPropagation())}},f=r=>{if(!n||!n.cell.el.contains(r.target))return;let i=r.relatedTarget;i&&(n.cell.el.contains(i)||i.closest(".op-layer"))||s(!0)},u=t.querySelector(".op-grid__viewport"),a=()=>n&&s(!0);return t.addEventListener(g.trigger==="click"?"click":"dblclick",d),t.addEventListener("keydown",c,!0),t.addEventListener("focusout",f),u.addEventListener("scroll",a,{passive:!0}),()=>{n?.field.destroy(),n=void 0,t.removeEventListener(g.trigger==="click"?"click":"dblclick",d),t.removeEventListener("keydown",c,!0),t.removeEventListener("focusout",f),u.removeEventListener("scroll",a)}}}}export{v as a,x as b};
|
|
2
|
+
//# sourceMappingURL=chunk-M2ZRKHE4.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/cellediting/cellediting.ts"],
|
|
4
|
+
"sourcesContent": ["// Inline cell editing for the Grid, as a plugin: `plugins: [cellEditing()]` and `editor` on the columns to edit.\n// Editors are regular fields created by type (`create({ type })`), so this module imports none of them: with\n// per-component imports, import the field types your columns use (`optikos/components/select`...).\nimport { create } from '../../../core/registry';\nimport type { Field } from '../../../core/field';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { Grid, GridPlugin, GridCell } from '../grid/grid';\n\nexport interface CellEditingOptions {\n /** What starts editing with the pointer: a double click (default) or a single click. F2 and Enter always do. */\n trigger?: 'dblclick' | 'click';\n}\n\ninterface Editing { cell: GridCell; field: Field<any>; old: unknown }\n\n/** The field config for a column's editor: from `editor`, else from the type of the current value. */\nexport function editorConfig(col: Column, value: unknown): Record<string, any> {\n const e = col.editor;\n if (e && typeof e === 'object') return { ...e };\n if (typeof e === 'string') return { type: e };\n return { type: typeof value === 'number' ? 'numberfield' : typeof value === 'boolean' ? 'checkbox' : 'textfield' };\n}\n\n/**\n * Inline editing plugin. Events on the grid: `before-edit(record, field)` (cancelable), `edit(record, field, value, old)`\n * after a valid value was written to the record (`record.set`, so it is marked modified), `edit-cancel(record, field)`.\n */\nexport function cellEditing(options: CellEditingOptions = {}): GridPlugin {\n let grid!: Grid;\n let editing: Editing | undefined;\n\n const editable = (c: Column, rec: Model) => !!c.editor && (c.editable?.(rec) ?? true);\n const editableCols = (rec: Model) => grid.getColumns().filter((c) => editable(c, rec));\n\n function start(cell: GridCell): boolean {\n if (!editable(cell.column, cell.record) || grid.emit('before-edit', cell.record, cell.column.field) === false) return false;\n finish(true);\n const old = cell.record.get(cell.column.field);\n const field = create<Field<any>>({ ...editorConfig(cell.column, old), value: old, stableSize: false, ariaLabel: cell.column.header ?? cell.column.field, cls: 'op-grid__editor' });\n cell.el.classList.add('is-editing');\n cell.el.replaceChildren(field.el);\n field.notifyMount();\n editing = { cell, field, old };\n field.focus();\n field.el.querySelector('input')?.select();\n return true;\n }\n\n /** Commits (or cancels) the current edit. A commit that fails validation keeps the editor open. */\n function finish(commit: boolean): boolean {\n const e = editing;\n if (!e) return true;\n if (commit && !e.field.validate()) return false;\n editing = undefined;\n const value = e.field.getValue();\n e.field.destroy();\n e.cell.el.classList.remove('is-editing');\n const { record, column } = e.cell;\n if (commit && !Object.is(value, e.old)) {\n record.set(column.field, value); // the store re-renders the row\n grid.emit('edit', record, column.field, value, e.old);\n } else {\n grid.refresh(); // puts the cell content back\n if (!commit) grid.emit('edit-cancel', record, column.field);\n }\n return true;\n }\n\n /** The next (or previous) editable cell after the current one, row by row. */\n function step(dir: 1 | -1): GridCell | undefined {\n if (!editing) return;\n const store = grid.getStore();\n let i = editing.cell.index;\n let cols = editableCols(editing.cell.record);\n let c = cols.indexOf(editing.cell.column) + dir;\n for (let guard = 0; guard < 500; guard++) {\n if (c >= 0 && c < cols.length) {\n grid.scrollToRow(i);\n const el = grid.getCell(i, cols[c].field);\n const rec = store.getAt(i)!;\n return el ? { index: i, record: rec, column: cols[c], el } : undefined;\n }\n i += dir;\n const rec = store.getAt(i);\n if (!rec) return;\n cols = editableCols(rec);\n c = dir > 0 ? 0 : cols.length - 1;\n }\n }\n\n return {\n init(g: Grid) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n const onPointer = (ev: Event) => {\n const cell = g.cellAt(ev.target);\n if (cell && !(editing && cell.el === editing.cell.el)) start(cell);\n };\n // capture: these run before the grid's own key handling (Enter would otherwise activate the row)\n const onKey = (ev: KeyboardEvent) => {\n if (editing && editing.cell.el.contains(ev.target as Node)) {\n if (ev.key === 'Escape') finish(false);\n else if (ev.key === 'Enter' && !ev.shiftKey) finish(true) && table.focus();\n else if (ev.key === 'Tab') {\n const next = step(ev.shiftKey ? -1 : 1);\n if (!finish(true)) return void ev.preventDefault();\n if (next) start({ ...next, el: grid.getCell(next.index, next.column.field) ?? next.el });\n else table.focus();\n } else return;\n ev.preventDefault();\n ev.stopPropagation();\n } else if (ev.target === table && (ev.key === 'F2' || ev.key === 'Enter') && g.getActive() >= 0) {\n const rec = g.getStore().getAt(g.getActive())!;\n const col = editableCols(rec)[0];\n const cellEl = col && g.getCell(g.getActive(), col.field);\n if (cellEl && start({ index: g.getActive(), record: rec, column: col, el: cellEl })) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n }\n };\n // leaving the cell commits, unless the focus went into the editor's own popup (a select list, a calendar)\n const onFocusOut = (ev: FocusEvent) => {\n if (!editing || !editing.cell.el.contains(ev.target as Node)) return;\n const to = ev.relatedTarget as HTMLElement | null;\n if (to && (editing.cell.el.contains(to) || to.closest('.op-layer'))) return;\n finish(true);\n };\n const viewport = el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const onScroll = () => editing && finish(true);\n el.addEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.addEventListener('keydown', onKey, true);\n el.addEventListener('focusout', onFocusOut);\n viewport.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n editing?.field.destroy();\n editing = undefined;\n el.removeEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.removeEventListener('keydown', onKey, true);\n el.removeEventListener('focusout', onFocusOut);\n viewport.removeEventListener('scroll', onScroll);\n };\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["editorConfig", "col", "value", "e", "cellEditing", "options", "grid", "editing", "editable", "c", "rec", "editableCols", "start", "cell", "finish", "old", "field", "create", "commit", "record", "column", "step", "dir", "store", "i", "cols", "guard", "el", "g", "table", "onPointer", "ev", "onKey", "next", "cellEl", "onFocusOut", "to", "viewport", "onScroll"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as d}from"./chunk-2YRQULDC.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{e as l,f as s}from"./chunk-S4QD5NID.js";l("en",{time:"Enter a time like 09:30"});l("pt-BR",{time:"Informe uma hora, como 09:30"});var p=1440,u=n=>String(n).padStart(2,"0"),a=n=>Number(n.slice(0,2))*60+Number(n.slice(3)),f=n=>`${u(Math.floor(n/60))}:${u(n%60)}`,m=class extends d{baseCls="op-field op-textfield op-timefield";garbage=!1;emptyValue(){return null}isEmpty(e){return e==null}parse(e){this.garbage=!1;let t=e.trim();if(!t)return null;let r=/^(\d{1,2})(?::?(\d{2}))?$/.exec(t)??/^(\d)(\d{2})$/.exec(t),i=r&&Number(r[1]),o=r&&Number(r[2]??0);return!r||i>23||o>59?(this.garbage=!0,null):`${u(i)}:${u(o)}`}createControl(){let e=super.createControl();return this.input.setAttribute("inputmode","numeric"),this.listen(this.input,"blur",()=>{this.garbage||(this.input.value=this.display(this.value))}),e}onInput(){super.onInput(),this.garbage?this.setError(s("time")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}check(){if(this.garbage)return s("time");let e=super.check(),t=this.value,{min:r,max:i}=this.config;return e||t==null?e:r&&i&&(t<r||t>i)?s("range",{min:r,max:i}):r&&t<r?s("min",{n:r}):i&&t>i?s("max",{n:i}):""}onKey(e){let t=e.key==="PageUp"||e.key==="PageDown";e.key==="ArrowUp"||e.key==="ArrowDown"||t?(e.preventDefault(),this.bump((e.key.endsWith("Up")?1:-1)*(t?60:this.config.step??1))):super.onKey(e)}bump(e){let{min:t,max:r}=this.config,i=(this.value?a(this.value):t?a(t):0)+e,o=t?a(t):0,g=r?a(r):p-1;this.setValue(f(t||r?Math.min(g,Math.max(o,i)):(i+p)%p))}setMin(e){this.config.min=e}setMax(e){this.config.max=e}};c("timefield",m);export{m as a};
|
|
2
|
+
//# sourceMappingURL=chunk-M7FNPRV4.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/timefield/timefield.ts"],
|
|
4
|
+
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { time: 'Enter a time like 09:30' });\naddMessages('pt-BR', { time: 'Informe uma hora, como 09:30' });\n\nexport interface TimeFieldConfig extends TextFieldConfig<string | null> {\n /** Earliest and latest time, `'HH:mm'`. */\n min?: string;\n max?: string;\n /** Minutes moved by \u2191/\u2193 (PageUp/PageDown move an hour). Default 1. */\n step?: number;\n}\n\nconst DAY = 1440;\nconst pad = (n: number) => String(n).padStart(2, '0');\nconst toMin = (v: string) => Number(v.slice(0, 2)) * 60 + Number(v.slice(3));\nconst fromMin = (n: number) => `${pad(Math.floor(n / 60))}:${pad(n % 60)}`;\n\n/** A time of day. The value is `'HH:mm'` (24 h) or `null`. Type `930`, `9:30` or `09:30`; \u2191/\u2193 step it. */\nexport class TimeField extends TextField<string | null, TimeFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-timefield';\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: string | null) {\n return v == null;\n }\n\n protected override parse(text: string): string | null {\n this.garbage = false;\n const s = text.trim();\n if (!s) return null;\n const m = /^(\\d{1,2})(?::?(\\d{2}))?$/.exec(s) ?? /^(\\d)(\\d{2})$/.exec(s);\n const h = m && Number(m[1]);\n const min = m && Number(m[2] ?? 0);\n if (!m || h! > 23 || min! > 59) return ((this.garbage = true), null);\n return `${pad(h!)}:${pad(min!)}`;\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n this.input.setAttribute('inputmode', 'numeric');\n this.listen(this.input, 'blur', () => {\n if (!this.garbage) this.input.value = this.display(this.value);\n });\n return wrap;\n }\n\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('time'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: string | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n\n protected override check(): string {\n if (this.garbage) return t('time');\n const base = super.check();\n const v = this.value;\n const { min, max } = this.config;\n if (base || v == null) return base;\n if (min && max && (v < min || v > max)) return t('range', { min, max });\n if (min && v < min) return t('min', { n: min });\n if (max && v > max) return t('max', { n: max });\n return '';\n }\n\n protected override onKey(e: KeyboardEvent) {\n const big = e.key === 'PageUp' || e.key === 'PageDown';\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || big) {\n e.preventDefault();\n this.bump((e.key.endsWith('Up') ? 1 : -1) * (big ? 60 : this.config.step ?? 1));\n } else super.onKey(e);\n }\n\n private bump(minutes: number) {\n const { min, max } = this.config;\n const n = (this.value ? toMin(this.value) : min ? toMin(min) : 0) + minutes;\n const lo = min ? toMin(min) : 0;\n const hi = max ? toMin(max) : DAY - 1;\n // with no limits the clock wraps around midnight\n this.setValue(fromMin(min || max ? Math.min(hi, Math.max(lo, n)) : (n + DAY) % DAY));\n }\n\n setMin(min: string | undefined) {\n this.config.min = min;\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n }\n}\nregister('timefield', TimeField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "DAY", "pad", "toMin", "v", "fromMin", "TimeField", "TextField", "text", "s", "m", "h", "min", "wrap", "t", "base", "max", "big", "minutes", "n", "lo", "hi", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as E}from"./chunk-RG6SHPHF.js";import{c as u}from"./chunk-DIOJGTUN.js";import{c as b}from"./chunk-VV7CFMPZ.js";import{a as f}from"./chunk-TIPK3SCJ.js";import{e as v}from"./chunk-4AA4FQEM.js";import{e as d,f as m}from"./chunk-UDXO3KM3.js";import{b as s}from"./chunk-PZSHOSOS.js";import{f as h}from"./chunk-S4QD5NID.js";var n=".op-menu__item",p=class y extends m{baseCls="op-menu";parentMenu;dd;sub;subOwner;opener=null;hoverCancel;list;searchEl;emptyEl;build(){return s("div","op-menu")}shell(){let t=!!this.config.search;t&&!this.searchEl&&(this.searchEl=s("input","op-menu__search",{type:"search",placeholder:`${h("search")}\u2026`,"aria-label":h("search"),autocomplete:"off"}),this.emptyEl=s("div","op-menu__empty",{},h("noResults")),this.listen(this.searchEl,"input",()=>this.filter()),this.listen(this.searchEl,"keydown",e=>{let i=this.first();i&&(e.key==="ArrowDown"||e.key==="Enter")&&(e.preventDefault(),e.key==="Enter"?this.activate(i):i.focus())})),this.list=t?this.list!==this.el&&this.list||s("div","op-menu__list",{role:"menu"}):this.el,this.el.setAttribute("role",t?"none":"menu"),t&&this.el.replaceChildren(this.searchEl,this.list,this.emptyEl)}first(){return this.list.querySelector(`${n}:not([hidden]):not([aria-disabled=true])`)}filter(){let t=(this.searchEl?.value??"").trim().toLowerCase();this.el.classList.toggle("is-searching",!!t);for(let e of Array.from(this.list.querySelectorAll(n))){let i=e.parentElement.getAttribute("aria-label")??"";e.hidden=!!t&&!`${i}
|
|
2
|
+
${e.textContent}`.toLowerCase().includes(t)}this.emptyEl&&(this.emptyEl.hidden=!!this.first()||!this.list.querySelector(n))}onRender(){this.shell(),this.renderItems();let t=b(this.el,{selector:n,orientation:"vertical"});this.own(()=>t.destroy()),this.listen(this.el,"click",e=>{let i=e.target.closest(n);i&&this.activate(i)}),this.listen(this.el,"keydown",e=>{let i=e.target.closest(n);if(e.target!==this.searchEl){if(e.key==="Tab")return this.closeAll();if(this.searchEl&&e.key.length===1&&e.key!==" "&&!e.ctrlKey&&!e.metaKey&&!e.altKey)return e.preventDefault(),this.searchEl.focus(),this.searchEl.value+=e.key,this.filter();i&&(e.key==="Enter"||e.key===" "?(e.preventDefault(),this.activate(i)):e.key==="ArrowRight"&&i.getAttribute("aria-haspopup")?(e.preventDefault(),this.openSub(i,!0)):e.key==="ArrowLeft"&&this.parentMenu&&(e.preventDefault(),this.hide()))}}),this.listen(this.el,"pointerover",e=>{let i=e.target.closest(n);!i||i.getAttribute("aria-disabled")==="true"||(this.hoverCancel?.(),i.focus(),i.getAttribute("aria-haspopup")?this.hoverCancel=this.later(()=>this.openSub(i,!1),150):this.sub?.hide())})}entries(){return(this.config.items??[]).flatMap(t=>typeof t=="string"?["-"]:d([t])??[])}renderItems(){let t=this.entries(),e=t.map((r,o)=>{if(r==="-")return s("div","op-menu__sep",{role:"separator"});let a=r.checked!==void 0,l=s("div","op-menu__item",{role:a?"menuitemcheckbox":"menuitem",tabindex:-1,"data-i":o,"aria-disabled":r.disabled?"true":null,"aria-checked":a?String(!!r.checked):null,"aria-haspopup":r.items?"menu":null,"aria-expanded":r.items?"false":null});return l.append(s("span","op-menu__icon",{},r.icon?u(r.icon):a&&r.checked?u("check"):null),s("span","op-menu__text",{},r.text??"")),r.badge!=null&&r.badge!==""&&l.append(s("span","op-menu__badge",{},String(r.badge))),r.items&&l.append(s("span","op-menu__arrow",{},u("chevron-right"))),l}),i=r=>t[r]==="-"?"":t[r].group??"",c=[...new Set(t.map((r,o)=>i(o)).filter(Boolean))];if(!c.length)return this.list.replaceChildren(...e),this.filter();this.list.replaceChildren(...e.filter((r,o)=>!i(o)),...c.map(r=>s("div","op-menu__group",{role:"group","aria-label":r},s("div","op-menu__group-label",{"aria-hidden":"true"},r),...e.filter((o,a)=>i(a)===r)))),this.filter()}setItems(t){this.config.items=t,this.rendered&&this.renderItems()}setSearch(t){this.config.search=t,this.rendered&&(this.shell(),this.renderItems())}activate(t){let e=this.entries()[Number(t.dataset.i)];if(!(!e||e.disabled)){if(e.items)return this.openSub(t,!0);e.checked!==void 0&&(e.checked=!e.checked),e.handler?.(e),this.root().emit("click",e),this.root().hide()}}root(){return this.parentMenu?this.parentMenu.root():this}openSub(t,e){let i=this.entries()[Number(t.dataset.i)];if(this.sub&&this.subOwner===t&&this.sub.isOpen())return e?this.sub.focusFirst():void 0;this.sub?.destroy(),this.sub=new y({items:i.items}),this.sub.parentMenu=this,this.subOwner=t,this.sub.on("hide",()=>t.setAttribute("aria-expanded","false")),t.setAttribute("aria-expanded","true"),this.sub.showBy(t,"right-start",e)}isOpen(){return!!this.dd?.isOpen()}focusFirst(){this.first()?.focus()}showBy(t,e="bottom-start",i=!0){this.open({anchor:t,placement:e},i)}showAt(t,e){this.open({anchor:{x:t,y:e},placement:"bottom-start"},!0)}open(t,e){this.opener=document.activeElement,this.dd?(this.dd.setAnchor(t.anchor),this.dd.setPlacement(t.placement)):(this.dd=new E({...t,content:this.el,role:"presentation",flip:!0}),this.dd.on("close",()=>{this.sub?.hide(),this.emit("hide")})),this.searchEl&&this.config.search&&(this.searchEl.value="",this.filter()),this.dd.open(),v(Array.from(this.el.querySelectorAll(n)),{dy:4}),e&&this.focusFirst(),this.emit("show")}hide(){if(!this.dd?.isOpen())return;this.dd.close();let t=this.parentMenu?this.parentMenu.subOwner:this.opener;t instanceof HTMLElement&&t.isConnected&&t.focus()}closeAll(){this.root().hide()}onDestroy(){this.sub?.destroy(),this.dd?.destroy()}};f("menu",p);export{p as a};
|
|
3
|
+
//# sourceMappingURL=chunk-MNSDGJKA.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/menu/menu.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport type { Placement } from '../../../core/position';\nimport { gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../dropdown/dropdown';\nimport { stagger } from '../../../motion/core';\n\nexport interface MenuItem {\n text?: string;\n icon?: string;\n handler?: (item: MenuItem) => void;\n disabled?: boolean;\n /** Present (true/false) makes it a checkable item. */\n checked?: boolean;\n items?: MenuEntry[];\n /** Items with the same group sit together under its name (ungrouped items come first). */\n group?: string;\n /** A count or short label at the end of the row. */\n badge?: string | number;\n /** Hidden (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n}\n/** An item, or `'-'` for a separator (typed `string` so an array built in a variable still fits). */\nexport type MenuEntry = MenuItem | string;\n\nexport interface MenuConfig extends ComponentConfig {\n items?: MenuEntry[];\n /** A search field over the items: filters as you type; a search that names a group shows the whole group. */\n search?: boolean;\n}\n\nconst ITEM = '.op-menu__item';\n\n/** Floating menu with submenus. Use `showBy(button)` for button menus and `showAt(x, y)` for context menus. */\nexport class Menu extends Component<MenuConfig> {\n protected override baseCls = 'op-menu';\n parentMenu?: Menu;\n private dd?: Dropdown;\n private sub?: Menu;\n private subOwner?: HTMLElement;\n private opener: Element | null = null;\n private hoverCancel?: () => void;\n /** The `role=menu` element: the root itself, or a list under the search field. */\n private list!: HTMLElement;\n private searchEl?: HTMLInputElement;\n private emptyEl?: HTMLElement;\n\n protected override build() {\n return h('div', 'op-menu');\n }\n\n /** Without search the root is the menu; with it, the root holds the field, the menu and the \"no results\" line. */\n private shell() {\n const on = !!this.config.search;\n if (on && !this.searchEl) {\n this.searchEl = h('input', 'op-menu__search', { type: 'search', placeholder: `${t('search')}\u2026`, 'aria-label': t('search'), autocomplete: 'off' });\n this.emptyEl = h('div', 'op-menu__empty', {}, t('noResults'));\n this.listen(this.searchEl, 'input', () => this.filter());\n this.listen(this.searchEl, 'keydown', (e: KeyboardEvent) => {\n const first = this.first();\n if (first && (e.key === 'ArrowDown' || e.key === 'Enter')) (e.preventDefault(), e.key === 'Enter' ? this.activate(first) : first.focus());\n });\n }\n this.list = on ? (this.list !== this.el && this.list) || h('div', 'op-menu__list', { role: 'menu' }) : this.el;\n this.el.setAttribute('role', on ? 'none' : 'menu');\n if (on) this.el.replaceChildren(this.searchEl!, this.list, this.emptyEl!);\n }\n\n private first(): HTMLElement | null {\n return this.list.querySelector<HTMLElement>(`${ITEM}:not([hidden]):not([aria-disabled=true])`);\n }\n\n /** Hides the items that do not match the search (a group whose name matches keeps all of them); empty groups hide in CSS. */\n private filter() {\n const q = (this.searchEl?.value ?? '').trim().toLowerCase();\n this.el.classList.toggle('is-searching', !!q);\n for (const row of Array.from(this.list.querySelectorAll<HTMLElement>(ITEM))) {\n const group = row.parentElement!.getAttribute('aria-label') ?? '';\n row.hidden = !!q && !`${group}\\n${row.textContent}`.toLowerCase().includes(q);\n }\n if (this.emptyEl) this.emptyEl.hidden = !!this.first() || !this.list.querySelector(ITEM);\n }\n\n protected override onRender() {\n this.shell();\n this.renderItems();\n const rover = roving(this.el, { selector: ITEM, orientation: 'vertical' });\n this.own(() => rover.destroy());\n this.listen(this.el, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (row) this.activate(row);\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (e.target === this.searchEl) return;\n if (e.key === 'Tab') return this.closeAll();\n // type to search: a printable key on an item goes to the search field\n if (this.searchEl && e.key.length === 1 && e.key !== ' ' && !e.ctrlKey && !e.metaKey && !e.altKey) {\n e.preventDefault();\n this.searchEl.focus();\n this.searchEl.value += e.key;\n return this.filter();\n }\n if (!row) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.activate(row);\n } else if (e.key === 'ArrowRight' && row.getAttribute('aria-haspopup')) {\n e.preventDefault();\n this.openSub(row, true);\n } else if (e.key === 'ArrowLeft' && this.parentMenu) {\n e.preventDefault();\n this.hide();\n }\n });\n this.listen(this.el, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (!row || row.getAttribute('aria-disabled') === 'true') return;\n this.hoverCancel?.();\n row.focus();\n if (row.getAttribute('aria-haspopup')) this.hoverCancel = this.later(() => this.openSub(row, false), 150);\n else this.sub?.hide();\n });\n }\n\n private entries(): Array<MenuItem | '-'> {\n return (this.config.items ?? []).flatMap((e): Array<MenuItem | '-'> => (typeof e === 'string' ? ['-'] : (gate([e]) ?? [])));\n }\n\n private renderItems() {\n const entries = this.entries();\n const rows = entries.map((it, i) => {\n if (it === '-') return h('div', 'op-menu__sep', { role: 'separator' });\n const checkable = it.checked !== undefined;\n const row = h('div', 'op-menu__item', {\n role: checkable ? 'menuitemcheckbox' : 'menuitem',\n tabindex: -1,\n 'data-i': i,\n 'aria-disabled': it.disabled ? 'true' : null,\n 'aria-checked': checkable ? String(!!it.checked) : null,\n 'aria-haspopup': it.items ? 'menu' : null,\n 'aria-expanded': it.items ? 'false' : null,\n });\n row.append(h('span', 'op-menu__icon', {}, it.icon ? iconEl(it.icon) : checkable && it.checked ? iconEl('check') : null), h('span', 'op-menu__text', {}, it.text ?? ''));\n if (it.badge != null && it.badge !== '') row.append(h('span', 'op-menu__badge', {}, String(it.badge)));\n if (it.items) row.append(h('span', 'op-menu__arrow', {}, iconEl('chevron-right')));\n return row;\n });\n const groupOf = (i: number) => (entries[i] === '-' ? '' : ((entries[i] as MenuItem).group ?? ''));\n const groups = [...new Set(entries.map((_, i) => groupOf(i)).filter(Boolean))];\n if (!groups.length) return (this.list.replaceChildren(...rows), this.filter());\n // ungrouped entries first, then one role=group per name (its header is only visual: the group carries the name)\n this.list.replaceChildren(\n ...rows.filter((_, i) => !groupOf(i)),\n ...groups.map((g) => h('div', 'op-menu__group', { role: 'group', 'aria-label': g }, h('div', 'op-menu__group-label', { 'aria-hidden': 'true' }, g), ...rows.filter((_, i) => groupOf(i) === g))),\n );\n this.filter();\n }\n\n setItems(items: MenuEntry[]) {\n this.config.items = items;\n if (this.rendered) this.renderItems();\n }\n\n /** Turns the search field on or off. */\n setSearch(search: boolean) {\n this.config.search = search;\n if (!this.rendered) return;\n this.shell();\n this.renderItems();\n }\n\n private activate(row: HTMLElement) {\n const item = this.entries()[Number(row.dataset.i)] as MenuItem;\n if (!item || item.disabled) return;\n if (item.items) return this.openSub(row, true);\n if (item.checked !== undefined) item.checked = !item.checked;\n item.handler?.(item);\n this.root().emit('click', item);\n this.root().hide();\n }\n\n private root(): Menu {\n return this.parentMenu ? this.parentMenu.root() : this;\n }\n\n private openSub(row: HTMLElement, focus: boolean) {\n const item = this.entries()[Number(row.dataset.i)] as MenuItem;\n if (this.sub && this.subOwner === row && this.sub.isOpen()) return focus ? this.sub.focusFirst() : undefined;\n this.sub?.destroy();\n this.sub = new Menu({ items: item.items });\n this.sub.parentMenu = this;\n this.subOwner = row;\n this.sub.on('hide', () => row.setAttribute('aria-expanded', 'false'));\n row.setAttribute('aria-expanded', 'true');\n this.sub.showBy(row, 'right-start', focus);\n }\n\n isOpen(): boolean {\n return !!this.dd?.isOpen();\n }\n\n private focusFirst() {\n this.first()?.focus(); // never the search field on open: a phone keyboard would cover the menu\n }\n\n showBy(anchor: HTMLElement | Component, placement: Placement = 'bottom-start', focus = true) {\n this.open({ anchor, placement }, focus);\n }\n\n showAt(x: number, y: number) {\n this.open({ anchor: { x, y }, placement: 'bottom-start' }, true);\n }\n\n private open(cfg: { anchor: HTMLElement | Component | { x: number; y: number }; placement: Placement }, focus: boolean) {\n this.opener = document.activeElement;\n if (!this.dd) {\n this.dd = new Dropdown({ ...cfg, content: this.el, role: 'presentation', flip: true });\n this.dd.on('close', () => {\n this.sub?.hide();\n this.emit('hide');\n });\n } else {\n this.dd.setAnchor(cfg.anchor);\n this.dd.setPlacement(cfg.placement);\n }\n if (this.searchEl && this.config.search) {\n this.searchEl.value = '';\n this.filter();\n }\n this.dd.open();\n void stagger(Array.from(this.el.querySelectorAll(ITEM)), { dy: 4 }); // the rows settle one after the other\n if (focus) this.focusFirst();\n this.emit('show');\n }\n\n override hide() {\n if (!this.dd?.isOpen()) return;\n this.dd.close();\n // Closing a submenu returns to its parent item; closing the root returns to whatever opened it.\n const back = this.parentMenu ? this.parentMenu.subOwner : this.opener;\n if (back instanceof HTMLElement && back.isConnected) back.focus();\n }\n\n closeAll() {\n this.root().hide();\n }\n\n protected override onDestroy() {\n this.sub?.destroy();\n this.dd?.destroy();\n }\n}\nregister('menu', Menu);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ITEM", "Menu", "_Menu", "Component", "h", "on", "t", "first", "q", "row", "group", "rover", "roving", "e", "gate", "entries", "rows", "it", "i", "checkable", "iconEl", "groupOf", "groups", "_", "g", "items", "search", "item", "focus", "anchor", "placement", "x", "y", "cfg", "Dropdown", "stagger", "back", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c}from"./chunk-DIOJGTUN.js";import{a as k}from"./chunk-TIPK3SCJ.js";import{f as m}from"./chunk-UDXO3KM3.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as f,f as u}from"./chunk-S4QD5NID.js";f("en",{treeLoading:"Loading\u2026",treeEmpty:"Nothing here"});f("pt-BR",{treeLoading:"Carregando\u2026",treeEmpty:"Nada aqui"});var g=class extends m{baseCls="op-tree";items=[];open=new Set;selected=new Set;loading=new Set;query="";focusId;root;onRender(){let e=this.config;this.items=e.items??[];let t=i=>i.forEach(s=>(s.expanded&&this.open.add(s.id),s.children&&t(s.children)));t(this.items),this.root=o("ul","op-tree__root",{role:"tree","aria-label":e.ariaLabel??null,"aria-multiselectable":e.selection==="multi"?"true":null}),this.el.removeAttribute("aria-label"),this.el.append(this.root),this.listen(this.root,"click",i=>{let s=i.target.closest(".op-tree__item");if(!s)return;let r=s.dataset.id;if(this.focusId=r,i.target.closest(".op-tree__toggle"))return this.toggle(r);if(i.target.closest(".op-tree__check"))return this.toggleChecked(r);this.pick(r,i.ctrlKey||i.metaKey)}),this.listen(this.root,"dblclick",i=>{let s=i.target.closest(".op-tree__item"),r=s&&this.getNode(s.dataset.id);r&&!r.disabled&&this.emit("activate",r)}),this.listen(this.root,"keydown",i=>this.onKey(i)),this.paint()}getNode(e,t=this.items){for(let i of t){if(i.id===e)return i;let s=i.children&&this.getNode(e,i.children);if(s)return s}}getPath(e,t=this.items,i=[]){for(let s of t){if(s.id===e)return i;let r=s.children&&this.getPath(e,s.children,[...i,s]);if(r)return r}}isLeaf(e){return e.leaf??(!e.children&&!this.config.load)}matches(e,t){return e.text.toLowerCase().includes(t)||!!e.children?.some(i=>this.matches(i,t))}walk(e,t){for(let i of e)t(i),i.children&&this.walk(i.children,t)}paint(){let e=this.items.filter(s=>!this.query||this.matches(s,this.query));this.root.replaceChildren(...e.map(s=>this.node(s,1))),e.length||this.root.append(o("li","op-tree__empty",{role:"none"},this.config.emptyText??u("treeEmpty")));let t=this.rows(),i=t.find(s=>s.dataset.id===this.focusId)??t.find(s=>s.getAttribute("aria-selected")==="true")??t[0];t.forEach(s=>s.tabIndex=s===i?0:-1)}node(e,t){let i=this.isLeaf(e),s=!i&&(this.query?!0:this.open.has(e.id)),r=this.loading.has(e.id),h=this.selected.has(e.id),l=this.config.selection??"single",n=this.checkState(e),d=o("li","op-tree__node",{role:"none"}),a=o("div",`op-tree__item${h?" is-selected":""}${e.disabled?" is-disabled":""}${s?" is-expanded":""}${r?" is-loading":""}`,{role:"treeitem","data-id":e.id,"aria-level":t,tabindex:-1,"aria-expanded":i?null:String(s),"aria-selected":l==="none"?null:String(h),"aria-checked":this.config.checkboxes?String(n):null,"aria-disabled":e.disabled?"true":null,"aria-busy":r?"true":null});if(a.style.setProperty("--_level",String(t-1)),a.append(o("span","op-tree__toggle",{"aria-hidden":"true"},i?"":r?o("span","op-spinner op-tree__spinner"):c("chevron-right"))),this.config.checkboxes&&a.append(o("span",`op-tree__check${n===!0?" is-checked":n==="mixed"?" is-mixed":""}`,{"aria-hidden":"true"},n==="mixed"?c("minus"):n?c("check"):"")),e.icon&&a.append(o("span","op-tree__icon",{},c(e.icon))),a.append(o("span","op-tree__text",{},e.text)),d.append(a),s&&e.children?.length){let b=e.children.filter(p=>!this.query||this.matches(p,this.query));d.append(o("ul","op-tree__group",{role:"group"},...b.map(p=>this.node(p,t+1))))}return d}async expand(e){let t=this.getNode(e);if(!(!t||this.isLeaf(t)||this.open.has(e)||this.loading.has(e))){if(!t.children&&this.config.load){this.loading.add(e),this.rendered&&this.paint();try{t.children=await this.config.load(t),this.config.checkboxes&&this.checkState(t)===!0&&t.children.forEach(i=>this.setBranch(i,!0)),this.emit("load",t,t.children)}catch(i){this.loading.delete(e),this.rendered&&this.paint(),this.emit("error",i,t);return}this.loading.delete(e)}this.open.add(e),this.rendered&&this.paint(),this.emit("expand",t)}}collapse(e){let t=this.getNode(e);!t||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",t))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}expandAll(){this.walk(this.items,e=>e.children?.length&&this.open.add(e.id)),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.rendered&&this.paint()}pick(e,t){let i=this.getNode(e),s=this.config.selection??"single";!i||i.disabled||s==="none"||(s==="multi"&&t?this.selected.delete(e)||this.selected.add(e):(this.selected.clear(),this.selected.add(e)),this.rendered&&this.paint(),this.emit("select",this.getSelection()))}select(e,t={}){for(let i of this.getPath(e)??[])this.open.add(i.id);this.focusId=e,this.pick(e,!!t.add)}getSelection(){return[...this.selected].map(e=>this.getNode(e)).filter(e=>!!e)}deselectAll(){this.selected.clear(),this.rendered&&this.paint(),this.emit("select",[])}checkState(e){if(!e.children?.length)return!!e.checked;let t=e.children.map(i=>this.checkState(i));return t.every(i=>i===!0)?!0:t.some(i=>i!==!1)?"mixed":!1}setBranch(e,t){e.checked=t,e.children?.forEach(i=>this.setBranch(i,t))}setChecked(e,t){let i=this.getNode(e);!i||i.disabled||(this.setBranch(i,t),this.rendered&&this.paint(),this.emit("check",this.getChecked(),i))}toggleChecked(e){let t=this.getNode(e);t&&this.setChecked(e,this.checkState(t)!==!0)}getChecked(){let e=[];return this.walk(this.items,t=>this.checkState(t)===!0&&e.push(t)),e}setItems(e){this.items=e,this.config.items=e,this.selected.clear(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-tree__item"))}focusRow(e){e&&(this.rows().forEach(t=>t.tabIndex=t===e?0:-1),this.focusId=e.dataset.id,e.focus())}onKey(e){let t=e.target.closest(".op-tree__item");if(!t)return;let i=this.rows(),s=i.indexOf(t),r=this.getNode(t.dataset.id),h=t.getAttribute("aria-expanded")==="true",l=t.getAttribute("aria-expanded")==="false";switch(e.key){case"ArrowDown":this.focusRow(i[s+1]);break;case"ArrowUp":this.focusRow(i[s-1]);break;case"Home":this.focusRow(i[0]);break;case"End":this.focusRow(i[i.length-1]);break;case"ArrowRight":l?this.expand(r.id):h&&this.focusRow(i[s+1]);break;case"ArrowLeft":if(h)this.collapse(r.id);else{let d=this.getPath(r.id)?.pop();d&&this.focusRow(i.find(a=>a.dataset.id===d.id))}break;case" ":this.config.checkboxes?this.toggleChecked(r.id):this.pick(r.id,this.config.selection==="multi");break;case"Enter":this.pick(r.id,!1),r.disabled||this.emit("activate",r);break;default:return}e.preventDefault();let n=this.root.querySelector(`[data-id="${CSS.escape(this.focusId??r.id)}"]`);n&&document.activeElement!==n&&this.focusRow(n)}};k("tree",g);export{g as a};
|
|
2
|
+
//# sourceMappingURL=chunk-MQ5BYGFY.js.map
|