optikos 0.3.0 → 0.5.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 +58 -1
- package/dist/bind.js +1 -1
- package/dist/bind.js.map +4 -4
- package/dist/build.js +2 -0
- package/dist/build.js.map +7 -0
- package/dist/chunk-2CVMT3IW.js +3 -0
- package/dist/chunk-2CVMT3IW.js.map +7 -0
- package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
- package/dist/{chunk-5BC72727.js → chunk-2I4Y7I7C.js} +2 -2
- package/dist/{chunk-Z2Z52GFT.js → chunk-2I7HDIOU.js} +2 -2
- package/dist/chunk-2QMI2RRB.js +2 -0
- package/dist/chunk-2QMI2RRB.js.map +7 -0
- package/dist/chunk-34KVSA2V.js +3 -0
- package/dist/chunk-34KVSA2V.js.map +7 -0
- package/dist/chunk-37PYJAA2.js +2 -0
- package/dist/{chunk-UXXJOU5J.js.map → chunk-37PYJAA2.js.map} +1 -1
- package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
- package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
- package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
- package/dist/chunk-3OA3P37P.js +2 -0
- package/dist/chunk-3OA3P37P.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-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
- package/dist/chunk-5G5PHOZJ.js +2 -0
- package/dist/chunk-5G5PHOZJ.js.map +7 -0
- package/dist/{chunk-EDUMAMK4.js → chunk-5GCTM37D.js} +2 -2
- package/dist/chunk-5PYJ6FJK.js +2 -0
- package/dist/chunk-5PYJ6FJK.js.map +7 -0
- package/dist/chunk-632LUU52.js +2 -0
- package/dist/chunk-632LUU52.js.map +7 -0
- package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
- package/dist/{chunk-Z2JBUHKA.js → chunk-6NP4AEV4.js} +2 -2
- package/dist/chunk-6PPRYSLN.js +2 -0
- package/dist/chunk-6PPRYSLN.js.map +7 -0
- package/dist/{chunk-NXSTUFS7.js → chunk-6TZJO2G2.js} +2 -2
- package/dist/chunk-7Y2GHQRB.js +2 -0
- package/dist/chunk-A36JFIA3.js +2 -0
- package/dist/chunk-A36JFIA3.js.map +7 -0
- package/dist/{chunk-G2KUK6AT.js → chunk-ADHKL2GM.js} +2 -2
- package/dist/{chunk-JI265XFO.js → chunk-AJN66F32.js} +2 -2
- package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.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-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
- package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
- package/dist/{chunk-HXDTGP2K.js → chunk-BRGT4O6Q.js} +2 -2
- package/dist/{chunk-OGRFQTXA.js → chunk-BTGJ3MP4.js} +2 -2
- package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
- package/dist/{chunk-M242VYZA.js → chunk-CXZKCBQE.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-DLRGB5NY.js +2 -0
- package/dist/chunk-DLRGB5NY.js.map +7 -0
- package/dist/chunk-DY3ZYMXD.js +2 -0
- package/dist/chunk-DY3ZYMXD.js.map +7 -0
- package/dist/chunk-EO777UIN.js +2 -0
- package/dist/chunk-EO777UIN.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-2ZUZ5HDL.js → chunk-ESRS5ZQV.js} +2 -2
- package/dist/{chunk-RNN55473.js → chunk-FNZI6MFG.js} +2 -2
- package/dist/{chunk-RNN55473.js.map → chunk-FNZI6MFG.js.map} +1 -1
- package/dist/{chunk-JK74QK3M.js → chunk-FSR6BDVO.js} +2 -2
- package/dist/{chunk-6VBK2I5B.js → chunk-G26R2F3W.js} +2 -2
- package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
- package/dist/chunk-GFJRGBQR.js +2 -0
- package/dist/chunk-GFJRGBQR.js.map +7 -0
- package/dist/chunk-GLAY4RJF.js +2 -0
- package/dist/chunk-GLAY4RJF.js.map +7 -0
- package/dist/chunk-GNKVLJ5H.js +2 -0
- package/dist/chunk-GNKVLJ5H.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-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-IODSL7KU.js +2 -0
- package/dist/chunk-IODSL7KU.js.map +7 -0
- package/dist/chunk-J2TCHWYD.js +2 -0
- package/dist/chunk-J2TCHWYD.js.map +7 -0
- package/dist/chunk-J5BZAKC6.js +2 -0
- package/dist/chunk-J5BZAKC6.js.map +7 -0
- package/dist/chunk-JBOKM5YA.js +2 -0
- package/dist/{chunk-KLLAY2IM.js.map → chunk-JBOKM5YA.js.map} +2 -2
- package/dist/chunk-L5SQQFO7.js +2 -0
- package/dist/chunk-L5SQQFO7.js.map +7 -0
- package/dist/chunk-L6DOWGBO.js +2 -0
- package/dist/chunk-L6DOWGBO.js.map +7 -0
- package/dist/{chunk-W3H7GTJY.js → chunk-LHWY6G6Q.js} +2 -2
- package/dist/chunk-LLHDEUIA.js +2 -0
- package/dist/chunk-LLHDEUIA.js.map +7 -0
- package/dist/chunk-LXWCTCZV.js +2 -0
- package/dist/chunk-LXWCTCZV.js.map +7 -0
- package/dist/chunk-M2ZRKHE4.js +2 -0
- package/dist/chunk-M2ZRKHE4.js.map +7 -0
- package/dist/{chunk-Q26YZYTD.js → chunk-M7HLHGQV.js} +2 -2
- package/dist/{chunk-IHE2MQ3W.js → chunk-MGSCSS7X.js} +2 -2
- package/dist/chunk-MM2OC66E.js +4 -0
- package/dist/{chunk-XX2MVWFS.js.map → chunk-MM2OC66E.js.map} +1 -1
- package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
- package/dist/chunk-MQEALOU3.js +3 -0
- package/dist/chunk-MQEALOU3.js.map +7 -0
- package/dist/chunk-NAUSRVB6.js +2 -0
- package/dist/chunk-NAUSRVB6.js.map +7 -0
- package/dist/chunk-NEVDHDJ4.js +3 -0
- package/dist/chunk-NEVDHDJ4.js.map +7 -0
- package/dist/{chunk-5QUY72FX.js → chunk-NWHH3CYH.js} +2 -2
- package/dist/chunk-OADWLPSF.js +2 -0
- package/dist/chunk-OADWLPSF.js.map +7 -0
- package/dist/{chunk-3TAW4AKH.js → chunk-OB3VIRQR.js} +2 -2
- package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
- package/dist/chunk-Q6FY4L2F.js +2 -0
- package/dist/chunk-Q6FY4L2F.js.map +7 -0
- package/dist/{chunk-TZOQWCVH.js → chunk-QOSTS5I3.js} +2 -2
- package/dist/chunk-QVBDBGS4.js +2 -0
- package/dist/chunk-QVBDBGS4.js.map +7 -0
- package/dist/{chunk-3S24ZRPK.js → chunk-RMATRKXV.js} +2 -2
- package/dist/{chunk-I4SP6JTU.js → chunk-S3ILIWSW.js} +2 -2
- package/dist/chunk-S4QD5NID.js +2 -0
- package/dist/chunk-S4QD5NID.js.map +7 -0
- package/dist/{chunk-XHOBNSBO.js → chunk-SEUIIPHS.js} +2 -2
- package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
- package/dist/chunk-T5OGUCY2.js +2 -0
- package/dist/chunk-T5OGUCY2.js.map +7 -0
- package/dist/chunk-TMBGEZSD.js +2 -0
- package/dist/chunk-TMBGEZSD.js.map +7 -0
- package/dist/chunk-TVO3Z2BM.js +2 -0
- package/dist/chunk-TVO3Z2BM.js.map +7 -0
- package/dist/{chunk-LQRFNQ2N.js → chunk-U25QSLAH.js} +2 -2
- package/dist/chunk-UCWICDYG.js +2 -0
- package/dist/chunk-UCWICDYG.js.map +7 -0
- package/dist/chunk-UDXO3KM3.js +2 -0
- package/dist/chunk-UDXO3KM3.js.map +7 -0
- package/dist/{chunk-FEHGU6EP.js → chunk-UL364TLO.js} +2 -2
- package/dist/chunk-UUAGMZD2.js +2 -0
- package/dist/chunk-UUAGMZD2.js.map +7 -0
- package/dist/chunk-V5G5JECN.js +2 -0
- package/dist/chunk-V5G5JECN.js.map +7 -0
- package/dist/chunk-XFDNXSU5.js +2 -0
- package/dist/chunk-XFDNXSU5.js.map +7 -0
- package/dist/{chunk-JBLRAM7Z.js → chunk-XNRZJP4E.js} +2 -2
- 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-Z6HZY2YG.js +2 -0
- package/dist/chunk-Z6HZY2YG.js.map +7 -0
- package/dist/chunk-ZEIE2OCQ.js +2 -0
- package/dist/chunk-ZEIE2OCQ.js.map +7 -0
- package/dist/{chunk-2YZB6XQR.js → chunk-ZLYZFHEN.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/columntotals.js +2 -0
- package/dist/components/columntotals.js.map +7 -0
- 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/exportbar.js +2 -0
- package/dist/components/exportbar.js.map +7 -0
- 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/timeentry.js +2 -0
- package/dist/components/timeentry.js.map +7 -0
- 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/columntotals.css +56 -0
- package/dist/css/core.css +36 -0
- package/dist/css/datetimefield.css +15 -0
- package/dist/css/exportbar.css +9 -0
- package/dist/css/grid.css +52 -0
- package/dist/css/gridexport.css +35 -0
- package/dist/css/grouping.css +56 -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/timeentry.css +116 -0
- package/dist/css/timeline.css +185 -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 +1480 -142
- 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/build/build.d.ts +49 -0
- package/dist/types/build/index.d.ts +1 -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/columntotals.d.ts +1 -0
- package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
- package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
- package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
- package/dist/types/components/data/grid/footer.d.ts +6 -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/controls.d.ts +27 -0
- package/dist/types/components/data/grouping/grouping.d.ts +43 -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/timeentry/timeentry.d.ts +37 -0
- package/dist/types/components/data/timeline/timeline.d.ts +63 -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/exportbar.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/timeentry.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 +11 -1
- 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 +21 -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 +13 -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-LW2WRUVL.js.map +0 -7
- 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-5BC72727.js.map → chunk-2I4Y7I7C.js.map} +0 -0
- /package/dist/{chunk-Z2Z52GFT.js.map → chunk-2I7HDIOU.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-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
- /package/dist/{chunk-EDUMAMK4.js.map → chunk-5GCTM37D.js.map} +0 -0
- /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
- /package/dist/{chunk-Z2JBUHKA.js.map → chunk-6NP4AEV4.js.map} +0 -0
- /package/dist/{chunk-NXSTUFS7.js.map → chunk-6TZJO2G2.js.map} +0 -0
- /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
- /package/dist/{chunk-G2KUK6AT.js.map → chunk-ADHKL2GM.js.map} +0 -0
- /package/dist/{chunk-JI265XFO.js.map → chunk-AJN66F32.js.map} +0 -0
- /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.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-HXDTGP2K.js.map → chunk-BRGT4O6Q.js.map} +0 -0
- /package/dist/{chunk-OGRFQTXA.js.map → chunk-BTGJ3MP4.js.map} +0 -0
- /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
- /package/dist/{chunk-M242VYZA.js.map → chunk-CXZKCBQE.js.map} +0 -0
- /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
- /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-ESRS5ZQV.js.map} +0 -0
- /package/dist/{chunk-JK74QK3M.js.map → chunk-FSR6BDVO.js.map} +0 -0
- /package/dist/{chunk-6VBK2I5B.js.map → chunk-G26R2F3W.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-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
- /package/dist/{chunk-W3H7GTJY.js.map → chunk-LHWY6G6Q.js.map} +0 -0
- /package/dist/{chunk-Q26YZYTD.js.map → chunk-M7HLHGQV.js.map} +0 -0
- /package/dist/{chunk-IHE2MQ3W.js.map → chunk-MGSCSS7X.js.map} +0 -0
- /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
- /package/dist/{chunk-5QUY72FX.js.map → chunk-NWHH3CYH.js.map} +0 -0
- /package/dist/{chunk-3TAW4AKH.js.map → chunk-OB3VIRQR.js.map} +0 -0
- /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
- /package/dist/{chunk-TZOQWCVH.js.map → chunk-QOSTS5I3.js.map} +0 -0
- /package/dist/{chunk-3S24ZRPK.js.map → chunk-RMATRKXV.js.map} +0 -0
- /package/dist/{chunk-I4SP6JTU.js.map → chunk-S3ILIWSW.js.map} +0 -0
- /package/dist/{chunk-XHOBNSBO.js.map → chunk-SEUIIPHS.js.map} +0 -0
- /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
- /package/dist/{chunk-LQRFNQ2N.js.map → chunk-U25QSLAH.js.map} +0 -0
- /package/dist/{chunk-FEHGU6EP.js.map → chunk-UL364TLO.js.map} +0 -0
- /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XNRZJP4E.js.map} +0 -0
- /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
- /package/dist/{chunk-2YZB6XQR.js.map → chunk-ZLYZFHEN.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/form/fieldlist/fieldlist.ts"],
|
|
4
|
-
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { Container } from '../../../core/container';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Component } from '../../../core/component';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', { flAdd: 'Add', flRemove: 'Remove {row}', flUp: 'Move {row} up', flDown: 'Move {row} down', flEmpty: 'Nothing added yet', flMin: 'Add at least {n}', flMax: 'At most {n}' });\naddMessages('pt-BR', { flAdd: 'Adicionar', flRemove: 'Remover {row}', flUp: 'Subir {row}', flDown: 'Descer {row}', flEmpty: 'Nada adicionado ainda', flMin: 'Adicione pelo menos {n}', flMax: 'No m\u00E1ximo {n}' });\n\ntype Row = Record<string, any>;\n\nexport interface FieldListConfig extends FieldConfig<Row[]> {\n /** The fields of one row (configs or instances such as `ui.text(...)`). Names are relative to the row (nested allowed). */\n items?: Array<AnyConfig | Component>;\n min?: number;\n max?: number;\n addText?: string;\n reorderable?: boolean;\n /** Values for a new row, or a function that returns them. */\n newRow?: Row | (() => Row);\n /** Layout of a row. Default `hbox` (the fields share the row). */\n rowLayout?: LayoutSpec;\n}\n\nconst getPath = (o: any, path: string) => path.split('.').reduce((v, k) => v?.[k], o);\nfunction setPath(o: any, path: string, value: unknown) {\n const keys = path.split('.');\n const last = keys.pop()!;\n keys.reduce((v, k) => (v[k] ??= {}), o)[last] = value;\n}\n\n/** A repeating block of fields: add, remove and reorder rows; the value is an array of row objects. */\nexport class FieldList extends Field<Row[], FieldListConfig> {\n protected override baseCls = 'op-field op-fieldlist';\n private rowsEl!: HTMLElement;\n private addBtn!: HTMLButtonElement;\n private emptyEl!: HTMLElement;\n private rows: Container[] = [];\n private syncing = false;\n\n protected override emptyValue(): Row[] {\n return [];\n }\n protected override isEmpty(v: Row[]): boolean {\n return !v?.length;\n }\n\n protected createControl() {\n this.rowsEl = h('div', 'op-fieldlist__rows', { role: 'group' });\n this.emptyEl = h('div', 'op-fieldlist__empty', {}, t('flEmpty'));\n this.addBtn = h('button', 'op-fieldlist__add', { type: 'button' }, iconEl('plus'), h('span', '', {}, this.config.addText ?? t('flAdd')));\n this.listen(this.addBtn, 'click', () => this.addRow());\n this.inputEl = this.addBtn;\n return h('div', 'op-fieldlist__box', {}, this.rowsEl, this.emptyEl, this.addBtn);\n }\n\n protected override onRender() {\n super.onRender();\n this.rowsEl.setAttribute('aria-labelledby', (this.el.querySelector('.op-field__label') as HTMLElement).id ||= `${this.id}-label`);\n }\n\n // ---- rows ---------------------------------------------------------------------------------\n\n private label(i: number): string {\n return `${this.config.label ?? ''} ${i + 1}`.trim();\n }\n\n private makeRow(values: Row): Container {\n // every row gets fresh fields: a config is copied, an instance (`ui.text(...)`) is rebuilt from a copy of its config\n const fresh = (c: AnyConfig | Component): AnyConfig | Component => {\n const cfg = (c instanceof Component ? c.config : c) as AnyConfig;\n const copy = { ...cfg, ...(Array.isArray(cfg.items) ? { items: (cfg.items as Array<AnyConfig | Component>).map(fresh) } : {}) };\n return c instanceof Component ? new (c.constructor as new (cfg: object) => Component)(copy) : copy;\n };\n const row = new Container({ cls: 'op-fieldlist__row', layout: this.config.rowLayout ?? { type: 'hbox', align: 'flex-start' }, items: (this.config.items ?? []).map(fresh) });\n for (const c of row.items) if (c.config.width != null && c.config.flex == null) c.config.flex = 'none'; // a set width is kept\n for (const f of this.rowFields(row)) {\n const v = f.name ? getPath(values, f.name) : undefined;\n if (v !== undefined) f.setValue(v, true);\n f.on('change', () => this.syncing || this.commitRows());\n }\n return row;\n }\n\n private rowFields(row: Container): Field<any>[] {\n return row.query((c) => c instanceof Field) as Field<any>[];\n }\n\n private collect(): Row[] {\n return this.rows.map((row) => {\n const out: Row = {};\n for (const f of this.rowFields(row)) if (f.name) setPath(out, f.name, f.getValue());\n return out;\n });\n }\n\n private commitRows() {\n this.commit(this.collect());\n this.paintRows();\n if (this.getError()) this.validate();\n }\n\n /** Puts every row in place: its group name, tools, and which tools are allowed. */\n private paintRows() {\n if (!this.rendered) return;\n const { min = 0, max = Infinity, reorderable = true } = this.config;\n this.rowsEl.replaceChildren(\n ...this.rows.map((row, i) => {\n const el = row.el;\n el.setAttribute('role', 'group');\n el.setAttribute('aria-label', this.label(i));\n el.classList.toggle('is-first', i === 0);\n el.querySelector(':scope > .op-fieldlist__tools')?.remove();\n const tool = (icon: string, key: string, disabled: boolean, run: () => void) => {\n const b = h('button', 'op-fieldlist__tool', { type: 'button', 'data-act': key, 'aria-label': t(key, { row: this.label(i) }), 'data-op-tip': t(key, { row: this.label(i) }) }, iconEl(icon));\n b.disabled = disabled || !!this.config.disabled || !!this.config.readonly;\n b.addEventListener('click', run);\n return b;\n };\n const tools = h('div', 'op-fieldlist__tools');\n if (reorderable) tools.append(tool('chevron-up', 'flUp', i === 0, () => this.moveRow(i, i - 1)), tool('chevron-down', 'flDown', i === this.rows.length - 1, () => this.moveRow(i, i + 1)));\n tools.append(tool('trash', 'flRemove', this.rows.length <= min, () => this.removeRow(i)));\n el.append(tools);\n return el;\n }),\n );\n this.emptyEl.hidden = this.rows.length > 0;\n this.el.classList.toggle('is-empty', !this.rows.length);\n this.addBtn.disabled = this.rows.length >= max || !!this.config.disabled || !!this.config.readonly;\n }\n\n protected applyValue(value: Row[]): void {\n this.syncing = true;\n this.rows.forEach((r) => r.destroy());\n this.rows = (value ?? []).map((v) => this.makeRow(v));\n this.syncing = false;\n const was = this.isEqual(this.original, value);\n this.value = this.collect(); // what the rows actually hold (a missing key becomes the field's empty value)\n if (was) this.original = this.value; // normalizing the starting value does not make the form dirty\n this.paintRows();\n }\n\n /** Adds a row (at the end) and focuses its first field. */\n addRow(values?: Row): void {\n const max = this.config.max ?? Infinity;\n if (this.rows.length >= max) return;\n const n = this.config.newRow;\n this.rows.push(this.makeRow(values ?? (typeof n === 'function' ? n() : { ...n })));\n this.commitRows();\n this.emit('add', this.rows.length - 1);\n this.rowFields(this.rows[this.rows.length - 1])[0]?.focus();\n }\n\n removeRow(index: number): void {\n if (!this.rows[index] || this.rows.length <= (this.config.min ?? 0) || this.emit('before-remove', index) === false) return;\n const [row] = this.rows.splice(index, 1);\n row.destroy();\n this.commitRows();\n this.emit('remove', index);\n const next = this.rows[Math.min(index, this.rows.length - 1)];\n if (next) this.rowFields(next)[0]?.focus();\n else if (this.rendered) this.addBtn.focus();\n }\n\n moveRow(from: number, to: number): void {\n if (!this.rows[from] || to < 0 || to >= this.rows.length || from === to) return;\n const [row] = this.rows.splice(from, 1);\n this.rows.splice(to, 0, row);\n this.commitRows();\n this.emit('move', from, to);\n // the focus follows the row: the same tool if it can still move that way, the other one at the end of the list\n const tools = ['flUp', 'flDown'].map((k) => row.el.querySelector<HTMLButtonElement>(`[data-act=\"${k}\"]`));\n (to < from ? tools : tools.reverse()).find((b) => b && !b.disabled)?.focus();\n }\n\n getRows(): Container[] {\n return this.rows;\n }\n getRowFields(index: number): Field<any>[] {\n return this.rows[index] ? this.rowFields(this.rows[index]) : [];\n }\n\n setAddText(text: string): void {\n this.config.addText = text;\n if (this.rendered) this.addBtn.lastElementChild!.textContent = text;\n }\n\n setMin(min: number): void {\n this.config.min = min;\n this.paintRows();\n }\n setMax(max: number): void {\n this.config.max = max;\n this.paintRows();\n }\n\n // ---- validation ---------------------------------------------------------------------------\n\n protected override check(): string {\n const n = this.value?.length ?? 0;\n const { min = 0, max = Infinity } = this.config;\n if (n && n < min) return t('flMin', { n: min });\n if (n > max) return t('flMax', { n: max });\n return super.check();\n }\n\n /** Validates every row too; the list is valid when its own rules and every field inside pass. */\n override validate(): boolean {\n const inner = this.rows.flatMap((r) => this.rowFields(r)).map((f) => f.validate()).every(Boolean);\n return super.validate() && inner;\n }\n\n override isValid(): boolean {\n return super.isValid() && this.rows.every((r) => this.rowFields(r).every((f) => f.isValid()));\n }\n\n /** The first invalid field inside, or the add button. */\n override focus(): void {\n const bad = this.rows.flatMap((r) => this.rowFields(r)).find((f) => f.getError());\n if (bad) bad.focus();\n else this.addBtn?.focus();\n }\n\n protected override onDisabled(disabled: boolean) {\n this.rows.forEach((r) => r.setDisabled(disabled));\n this.paintRows();\n }\n protected override onReadonly(readonly: boolean) {\n this.rows.forEach((r) => this.rowFields(r).forEach((f) => f.setReadonly(readonly)));\n this.paintRows();\n }\n\n protected override onDestroy(): void {\n this.rows.forEach((r) => r.destroy());\n super.onDestroy();\n }\n}\nregister('fieldlist', FieldList);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "getPath", "o", "path", "v", "k", "setPath", "value", "keys", "last", "FieldList", "Field", "h", "t", "iconEl", "i", "values", "fresh", "c", "cfg", "Component", "copy", "row", "Container", "f", "out", "min", "max", "reorderable", "el", "tool", "icon", "key", "disabled", "run", "b", "tools", "r", "was", "n", "index", "next", "from", "to", "text", "inner", "bad", "readonly", "register"]
|
|
7
|
-
}
|
package/dist/chunk-LW2WRUVL.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as o}from"./chunk-MW3RWBZ7.js";var n=()=>o()._lang,a=(t,e)=>{if(t==null||t==="")return"";let r=t instanceof Date?t:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?new Date(+t.slice(0,4),+t.slice(5,7)-1,+t.slice(8,10)):new Date(t);return isNaN(+r)?String(t):new Intl.DateTimeFormat(n(),e).format(r)},i={number:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(n(),e).format(t),money:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(n(),{style:"currency",currency:o()._currency,...e}).format(t),percent:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(n(),{style:"percent",maximumFractionDigits:1,...e}).format(t),date:(t,e)=>a(t,{dateStyle:"medium",...e}),datetime:(t,e)=>a(t,{dateStyle:"medium",timeStyle:"short",...e}),bool:t=>t?"\u2713":""};function s(t,e){i[t]=e}function m(t,e){let r=typeof t=="function"?t:i[t];if(!r)throw new Error(`Optikos: unknown format "${t}"`);return r(e)}function c(t,e){let r=e.data[t.field];return t.renderer?t.renderer(r,e,t):t.format?m(t.format,r):r==null?"":String(r)}export{s as a,m as b,c};
|
|
2
|
-
//# sourceMappingURL=chunk-LW2WRUVL.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/data/format.ts", "../src/data/column.ts"],
|
|
4
|
-
"sourcesContent": ["import { getLocale } from '../core/i18n';\n\nexport type Formatter = (value: any, options?: Record<string, any>) => string;\n\nconst lang = () => getLocale()._lang;\nconst date = (v: any, opts: Intl.DateTimeFormatOptions) => {\n if (v == null || v === '') return '';\n // ISO dates without time are local dates, not UTC.\n const d = v instanceof Date ? v : typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? new Date(+v.slice(0, 4), +v.slice(5, 7) - 1, +v.slice(8, 10)) : new Date(v);\n return isNaN(+d) ? String(v) : new Intl.DateTimeFormat(lang(), opts).format(d);\n};\n\nconst formats: Record<string, Formatter> = {\n number: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), o).format(v)),\n money: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'currency', currency: getLocale()._currency, ...o }).format(v)),\n percent: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'percent', maximumFractionDigits: 1, ...o }).format(v)),\n date: (v, o) => date(v, { dateStyle: 'medium', ...o }),\n datetime: (v, o) => date(v, { dateStyle: 'medium', timeStyle: 'short', ...o }),\n bool: (v) => (v ? '\u2713' : ''),\n};\n\n/** Registers a named formatter, usable as `format: 'name'` in columns. */\nexport function registerFormat(name: string, fn: Formatter): void {\n formats[name] = fn;\n}\n\nexport function format(fmt: string | Formatter, value: unknown): string {\n const fn = typeof fmt === 'function' ? fmt : formats[fmt];\n if (!fn) throw new Error(`Optikos: unknown format \"${fmt}\"`);\n return fn(value);\n}\n", "import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\n/** A grid/table column. `T` is the record shape: `field` then autocompletes its keys (any string still works). */\nexport interface Column<T extends Record<string, any> = any> {\n field: Extract<keyof T, string> | (string & {});\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model<T>, col: Column<T>) => string | Node;\n cls?: string;\n /** With the `cellEditing()` grid plugin: `true` (an editor for the value's type), a field type (`'select'`) or a field config. */\n editor?: boolean | string | Record<string, any>;\n /** With `cellEditing()`: whether this record's cell can be edited (default: every record, when `editor` is set). */\n editable?: (rec: Model<T>) => boolean;\n}\n\n/** Cell content for a record: `renderer` first, then `format`, then the plain value. */\nexport function cellContent<T extends Record<string, any>>(col: Column<T>, rec: Model<T>): string | Node {\n const v = rec.data[col.field];\n if (col.renderer) return col.renderer(v, rec, col);\n if (col.format) return format(col.format, v);\n return v == null ? '' : String(v);\n}\n"],
|
|
5
|
-
"mappings": "wCAIA,IAAMA,EAAO,IAAMC,EAAU,EAAE,MACzBC,EAAO,CAACC,EAAQC,IAAqC,CACzD,GAAID,GAAK,MAAQA,IAAM,GAAI,MAAO,GAElC,IAAME,EAAIF,aAAa,KAAOA,EAAI,OAAOA,GAAM,UAAY,sBAAsB,KAAKA,CAAC,EAAI,IAAI,KAAK,CAACA,EAAE,MAAM,EAAG,CAAC,EAAG,CAACA,EAAE,MAAM,EAAG,CAAC,EAAI,EAAG,CAACA,EAAE,MAAM,EAAG,EAAE,CAAC,EAAI,IAAI,KAAKA,CAAC,EACrK,OAAO,MAAM,CAACE,CAAC,EAAI,OAAOF,CAAC,EAAI,IAAI,KAAK,eAAeH,EAAK,EAAGI,CAAI,EAAE,OAAOC,CAAC,CAC/E,EAEMC,EAAqC,CACzC,OAAQ,CAACH,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAGO,CAAC,EAAE,OAAOJ,CAAC,EACzF,MAAO,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,WAAY,SAAUC,EAAU,EAAE,UAAW,GAAGM,CAAE,CAAC,EAAE,OAAOJ,CAAC,EACnJ,QAAS,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,UAAW,sBAAuB,EAAG,GAAGO,CAAE,CAAC,EAAE,OAAOJ,CAAC,EAC7I,KAAM,CAACA,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,GAAGI,CAAE,CAAC,EACrD,SAAU,CAACJ,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,UAAW,QAAS,GAAGI,CAAE,CAAC,EAC7E,KAAOJ,GAAOA,EAAI,SAAM,EAC1B,EAGO,SAASK,EAAeC,EAAcC,EAAqB,CAChEJ,EAAQG,CAAI,EAAIC,CAClB,CAEO,SAASC,EAAOC,EAAyBC,EAAwB,CACtE,IAAMH,EAAK,OAAOE,GAAQ,WAAaA,EAAMN,EAAQM,CAAG,EACxD,GAAI,CAACF,EAAI,MAAM,IAAI,MAAM,4BAA4BE,CAAG,GAAG,EAC3D,OAAOF,EAAGG,CAAK,CACjB,CCGO,SAASC,EAA2CC,EAAgBC,EAA8B,CACvG,IAAMC,EAAID,EAAI,KAAKD,EAAI,KAAK,EAC5B,OAAIA,EAAI,SAAiBA,EAAI,SAASE,EAAGD,EAAKD,CAAG,EAC7CA,EAAI,OAAeG,EAAOH,EAAI,OAAQE,CAAC,EACpCA,GAAK,KAAO,GAAK,OAAOA,CAAC,CAClC",
|
|
6
|
-
"names": ["lang", "getLocale", "date", "v", "opts", "d", "formats", "o", "registerFormat", "name", "fn", "format", "fmt", "value", "cellContent", "col", "rec", "v", "format"]
|
|
7
|
-
}
|
package/dist/chunk-MW3RWBZ7.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var l=class{handlers=new Map;on(e,n){let t=this.handlers.get(e);return t?t.push(n):this.handlers.set(e,[n]),()=>this.off(e,n)}once(e,n){let t=this.on(e,(...a)=>(t(),n(...a)));return t}off(e,n){if(!n)this.handlers.delete(e);else{let t=this.handlers.get(e);t&&this.handlers.set(e,t.filter(a=>a!==n))}}emit(e,...n){let t=!0;for(let a of this.handlers.get(e)??[])a(...n)===!1&&(t=!1);return t}clearListeners(){this.handlers.clear()}};var i={_lang:"en",_currency:"USD",_firstDay:"0",required:"This field is required",minLength:"Enter at least {n} characters",maxLength:"Enter at most {n} characters",pattern:"Invalid format",email:"Enter a valid email address",min:"Must be at least {n}",max:"Must be at most {n}",range:"Must be between {min} and {max}",number:"Enter a valid number",date:"Enter a valid date",loading:"Loading",close:"Close",ok:"OK",cancel:"Cancel",clear:"Clear",collapse:"Collapse",expand:"Expand",empty:"No data",search:"Search",noResults:"No results",results:"{n} results"},c={_lang:"pt-BR",_currency:"BRL",_firstDay:"0",required:"Campo obrigat\xF3rio",minLength:"Informe ao menos {n} caracteres",maxLength:"Informe no m\xE1ximo {n} caracteres",pattern:"Formato inv\xE1lido",email:"Informe um e-mail v\xE1lido",min:"Deve ser no m\xEDnimo {n}",max:"Deve ser no m\xE1ximo {n}",range:"Deve estar entre {min} e {max}",number:"Informe um n\xFAmero v\xE1lido",date:"Informe uma data v\xE1lida",loading:"Carregando",close:"Fechar",ok:"OK",cancel:"Cancelar",clear:"Limpar",collapse:"Recolher",expand:"Expandir",empty:"Sem dados",search:"Pesquisar",noResults:"Nenhum resultado",results:"{n} resultados"},s={en:i,"pt-BR":c},o=i;function m(r){typeof r=="string"?o=s[r]??s[Object.keys(s).find(e=>e.startsWith(r.split("-")[0]))??"en"]:(o={...i,...r},r._lang&&(s[r._lang]=o))}var g=()=>o;function u(r,e){let n=s[r]??={_lang:r};for(let t in e)t in n||(n[t]=e[t])}function h(r,e){let n=o[r]??i[r]??r;return e?n.replace(/\{(\w+)\}/g,(t,a)=>String(e[a]??"")):n}export{l as a,s as b,m as c,g as d,u as e,h as f};
|
|
2
|
-
//# sourceMappingURL=chunk-MW3RWBZ7.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/core/emitter.ts", "../src/core/i18n.ts"],
|
|
4
|
-
"sourcesContent": ["export type Handler = (...args: any[]) => unknown;\n\n/** Minimal observer. A handler that returns `false` makes `emit` return `false` (used by `before-*` events). */\nexport class Emitter {\n private handlers = new Map<string, Handler[]>();\n\n /** Subscribes; returns the unsubscribe function. */\n on(name: string, fn: Handler): () => void {\n const list = this.handlers.get(name);\n if (list) list.push(fn);\n else this.handlers.set(name, [fn]);\n return () => this.off(name, fn);\n }\n\n once(name: string, fn: Handler): () => void {\n const off = this.on(name, (...a) => {\n off();\n return fn(...a);\n });\n return off;\n }\n\n off(name: string, fn?: Handler): void {\n if (!fn) this.handlers.delete(name);\n else {\n const list = this.handlers.get(name);\n if (list) this.handlers.set(name, list.filter((f) => f !== fn));\n }\n }\n\n /** Returns `false` if any handler returned `false` (the event was cancelled). */\n emit(name: string, ...args: unknown[]): boolean {\n let ok = true;\n for (const fn of this.handlers.get(name) ?? []) if (fn(...args) === false) ok = false;\n return ok;\n }\n\n clearListeners(): void {\n this.handlers.clear();\n }\n}\n", "export type Locale = Record<string, string>;\n\n// Messages shared by the core and several components. Component-only keys live with the component (addMessages).\nconst en: Locale = {\n _lang: 'en',\n _currency: 'USD',\n _firstDay: '0',\n required: 'This field is required',\n minLength: 'Enter at least {n} characters',\n maxLength: 'Enter at most {n} characters',\n pattern: 'Invalid format',\n email: 'Enter a valid email address',\n min: 'Must be at least {n}',\n max: 'Must be at most {n}',\n range: 'Must be between {min} and {max}',\n number: 'Enter a valid number',\n date: 'Enter a valid date',\n loading: 'Loading',\n close: 'Close',\n ok: 'OK',\n cancel: 'Cancel',\n clear: 'Clear',\n collapse: 'Collapse',\n expand: 'Expand',\n empty: 'No data',\n search: 'Search',\n noResults: 'No results',\n results: '{n} results',\n};\n\nconst ptBR: Locale = {\n _lang: 'pt-BR',\n _currency: 'BRL',\n _firstDay: '0',\n required: 'Campo obrigat\u00F3rio',\n minLength: 'Informe ao menos {n} caracteres',\n maxLength: 'Informe no m\u00E1ximo {n} caracteres',\n pattern: 'Formato inv\u00E1lido',\n email: 'Informe um e-mail v\u00E1lido',\n min: 'Deve ser no m\u00EDnimo {n}',\n max: 'Deve ser no m\u00E1ximo {n}',\n range: 'Deve estar entre {min} e {max}',\n number: 'Informe um n\u00FAmero v\u00E1lido',\n date: 'Informe uma data v\u00E1lida',\n loading: 'Carregando',\n close: 'Fechar',\n ok: 'OK',\n cancel: 'Cancelar',\n clear: 'Limpar',\n collapse: 'Recolher',\n expand: 'Expandir',\n empty: 'Sem dados',\n search: 'Pesquisar',\n noResults: 'Nenhum resultado',\n results: '{n} resultados',\n};\n\nexport const locales: Record<string, Locale> = { en, 'pt-BR': ptBR };\nlet current: Locale = en;\n\n/** Picks a registered locale by name (`'pt-BR'`, or `'pt'` as a prefix) or merges a custom object over English. */\nexport function setLocale(l: string | Locale): void {\n if (typeof l === 'string') {\n current = locales[l] ?? locales[Object.keys(locales).find((k) => k.startsWith(l.split('-')[0])) ?? 'en'];\n } else {\n current = { ...en, ...l };\n if (l._lang) locales[l._lang] = current;\n }\n}\n\nexport const getLocale = (): Locale => current;\n\n/**\n * Adds messages to a locale (created if missing). Keys already there are kept, so an app's own overrides win.\n * Each component registers its own keys this way, so its messages only ship with it.\n */\nexport function addMessages(lang: string, messages: Locale): void {\n const target = (locales[lang] ??= { _lang: lang });\n for (const k in messages) if (!(k in target)) target[k] = messages[k];\n}\n\n/** Translates a key, replacing `{name}` placeholders. */\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const s = current[key] ?? en[key] ?? key;\n return vars ? s.replace(/\\{(\\w+)\\}/g, (_, k) => String(vars[k] ?? '')) : s;\n}\n"],
|
|
5
|
-
"mappings": "AAGO,IAAMA,EAAN,KAAc,CACX,SAAW,IAAI,IAGvB,GAAGC,EAAcC,EAAyB,CACxC,IAAMC,EAAO,KAAK,SAAS,IAAIF,CAAI,EACnC,OAAIE,EAAMA,EAAK,KAAKD,CAAE,EACjB,KAAK,SAAS,IAAID,EAAM,CAACC,CAAE,CAAC,EAC1B,IAAM,KAAK,IAAID,EAAMC,CAAE,CAChC,CAEA,KAAKD,EAAcC,EAAyB,CAC1C,IAAME,EAAM,KAAK,GAAGH,EAAM,IAAI,KAC5BG,EAAI,EACGF,EAAG,GAAG,CAAC,EACf,EACD,OAAOE,CACT,CAEA,IAAIH,EAAcC,EAAoB,CACpC,GAAI,CAACA,EAAI,KAAK,SAAS,OAAOD,CAAI,MAC7B,CACH,IAAME,EAAO,KAAK,SAAS,IAAIF,CAAI,EAC/BE,GAAM,KAAK,SAAS,IAAIF,EAAME,EAAK,OAAQE,GAAMA,IAAMH,CAAE,CAAC,CAChE,CACF,CAGA,KAAKD,KAAiBK,EAA0B,CAC9C,IAAIC,EAAK,GACT,QAAWL,KAAM,KAAK,SAAS,IAAID,CAAI,GAAK,CAAC,EAAOC,EAAG,GAAGI,CAAI,IAAM,KAAOC,EAAK,IAChF,OAAOA,CACT,CAEA,gBAAuB,CACrB,KAAK,SAAS,MAAM,CACtB,CACF,ECrCA,IAAMC,EAAa,CACjB,MAAO,KACP,UAAW,MACX,UAAW,IACX,SAAU,yBACV,UAAW,gCACX,UAAW,+BACX,QAAS,iBACT,MAAO,8BACP,IAAK,uBACL,IAAK,sBACL,MAAO,kCACP,OAAQ,uBACR,KAAM,qBACN,QAAS,UACT,MAAO,QACP,GAAI,KACJ,OAAQ,SACR,MAAO,QACP,SAAU,WACV,OAAQ,SACR,MAAO,UACP,OAAQ,SACR,UAAW,aACX,QAAS,aACX,EAEMC,EAAe,CACnB,MAAO,QACP,UAAW,MACX,UAAW,IACX,SAAU,uBACV,UAAW,kCACX,UAAW,sCACX,QAAS,sBACT,MAAO,8BACP,IAAK,4BACL,IAAK,4BACL,MAAO,iCACP,OAAQ,iCACR,KAAM,6BACN,QAAS,aACT,MAAO,SACP,GAAI,KACJ,OAAQ,WACR,MAAO,SACP,SAAU,WACV,OAAQ,WACR,MAAO,YACP,OAAQ,YACR,UAAW,mBACX,QAAS,gBACX,EAEaC,EAAkC,CAAE,GAAAF,EAAI,QAASC,CAAK,EAC/DE,EAAkBH,EAGf,SAASI,EAAUC,EAA0B,CAC9C,OAAOA,GAAM,SACfF,EAAUD,EAAQG,CAAC,GAAKH,EAAQ,OAAO,KAAKA,CAAO,EAAE,KAAMI,GAAMA,EAAE,WAAWD,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAK,IAAI,GAEvGF,EAAU,CAAE,GAAGH,EAAI,GAAGK,CAAE,EACpBA,EAAE,QAAOH,EAAQG,EAAE,KAAK,EAAIF,GAEpC,CAEO,IAAMI,EAAY,IAAcJ,EAMhC,SAASK,EAAYC,EAAcC,EAAwB,CAChE,IAAMC,EAAUT,EAAQO,CAAI,IAAM,CAAE,MAAOA,CAAK,EAChD,QAAWH,KAAKI,EAAgBJ,KAAKK,IAASA,EAAOL,CAAC,EAAII,EAASJ,CAAC,EACtE,CAGO,SAASM,EAAEC,EAAaC,EAAgD,CAC7E,IAAMC,EAAIZ,EAAQU,CAAG,GAAKb,EAAGa,CAAG,GAAKA,EACrC,OAAOC,EAAOC,EAAE,QAAQ,aAAc,CAACC,EAAGV,IAAM,OAAOQ,EAAKR,CAAC,GAAK,EAAE,CAAC,EAAIS,CAC3E",
|
|
6
|
-
"names": ["Emitter", "name", "fn", "list", "off", "f", "args", "ok", "en", "ptBR", "locales", "current", "setLocale", "l", "k", "getLocale", "addMessages", "lang", "messages", "target", "t", "key", "vars", "s", "_"]
|
|
7
|
-
}
|
package/dist/chunk-OEAXCCVM.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as p}from"./chunk-MW3RWBZ7.js";var y=0;function f(r,i){return r==null||!i?.type?r:i.type==="number"?r===""?null:Number(r):i.type==="boolean"?r==="false"?!1:!!r:String(r)}var d=class{constructor(i={},e={}){this.def=e;let t={...i};for(let s in e.fields){let o=e.fields[s];t[s]=f(t[s]===void 0?o.default:t[s],o)}this.data=t,this.phantom=this.data[e.idField??"id"]===void 0}def;data;phantom;owner;clientId=`c${++y}`;original={};get id(){return this.data[this.def.idField??"id"]??this.clientId}get(i){return this.data[i]}set(i,e){let t=f(e,this.def.fields?.[i]);this.data[i]!==t&&(i in this.original||(this.original[i]=this.data[i]),this.data[i]=t,this.owner?.recordChanged(this,i))}isDirty(){return Object.keys(this.original).length>0}getChanges(){let i={};for(let e in this.original)i[e]=this.data[e];return i}commit(){this.original={},this.phantom=!1}reject(){Object.assign(this.data,this.original),this.original={}}};var v,T=(r,i)=>r==null?i==null?0:1:i==null?-1:typeof r=="string"&&typeof i=="string"?(v??=new Intl.Collator(void 0,{numeric:!0})).compare(r,i):r<i?-1:r>i?1:0,l=r=>String(r??"").toLowerCase(),c=r=>r==null||r===""||Array.isArray(r)&&!r.length,b=/^\d{4}-\d{2}-\d{2}(T[\d:.]+Z?)?$/,n=r=>r instanceof Date?r.getTime():typeof r=="string"&&b.test(r)?Date.parse(r):r;function w(r,i){let e=r.value,t=n(i),s=()=>!c(i)&&t>=n(e[0])&&t<=n(e[1]),o=()=>e.some(a=>n(a)==t);switch(r.op??"eq"){case"eq":return t==n(e);case"ne":return t!=n(e);case"contains":return l(i).includes(l(e));case"notContains":return!l(i).includes(l(e));case"startsWith":return l(i).startsWith(l(e));case"endsWith":return l(i).endsWith(l(e));case"gt":return t>n(e);case"ge":return t>=n(e);case"lt":return t<n(e);case"le":return t<=n(e);case"between":return s();case"notBetween":return!s();case"in":return o();case"nin":return!o();case"empty":return c(i);case"notEmpty":return!c(i)}}function u(r,i){return"filters"in r?r.filters.length?r.op==="or"?r.filters.some(e=>u(e,i)):r.filters.every(e=>u(e,i)):!0:w(r,i[r.field])}var g=class extends p{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 d?e:new d(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 s=this.abort=new AbortController;this.loading=!0,this.emit("loading",!0);try{let o=await this.proxy.read(t,s.signal);if(s.signal.aborted)return;let{data:a,total:h}=Array.isArray(o)?{data:o,total:o.length}:o;this.removed=[],this.setRecords(a.map(m=>this.wrap(m)),h??a.length),this.loading=!1,this.emit("loading",!1),this.fire("load")}catch(o){if(s.signal.aborted)return;this.loading=!1,this.emit("loading",!1),this.emit("load-error",o)}}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(s=>this.filters.every(o=>typeof o=="function"?o(s):u(o,s.data)))),this.sorters.length&&(e=[...e].sort((s,o)=>{for(let a of this.sorters){let h=T(s.data[a.field],o.data[a.field]);if(h)return a.dir==="desc"?-h:h}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 s=this.sorters[0];this.sorters=e?[{field:e,dir:t??(s?.field===e&&s.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(s=>this.wrap(s));return this.all=[...this.all,...t],this.total+=t.length,this.refreshView(),this.fire("add",t),t}insert(e,t){let s=this.wrap(t);return this.all=[...this.all.slice(0,e),s,...this.all.slice(e)],this.total++,this.refreshView(),this.fire("add",[s]),s}remove(e){let s=(Array.isArray(e)?e:[typeof e=="number"?this.visible[e]:e]).filter(o=>o&&this.all.includes(o));s.length&&(this.all=this.all.filter(o=>!s.includes(o)),this.removed.push(...s.filter(o=>!o.phantom)),this.total-=s.length,this.refreshView(),this.fire("remove",s))}clear(){this.removed.push(...this.all.filter(e=>!e.phantom)),this.setRecords([],0),this.fire("remove",[])}recordChanged(e,t){(this.sorters.some(s=>s.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{d as a,u as b,g as c};
|
|
2
|
-
//# sourceMappingURL=chunk-OEAXCCVM.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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 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\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 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 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", "out", "k", "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", "recs", "rows", "s", "d", "pages", "field", "dir", "cur", "n", "index", "target", "gone", "p"]
|
|
7
|
-
}
|
package/dist/chunk-UB5RYS7T.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as c}from"./chunk-TZOQWCVH.js";import{b as h,c as g,d as k}from"./chunk-EJGWCKE4.js";import{a as f}from"./chunk-4LZZ244E.js";import{c as u}from"./chunk-4EZJ5FKJ.js";import{b as d}from"./chunk-PZSHOSOS.js";import{a}from"./chunk-TIPK3SCJ.js";import{e as l,f as s}from"./chunk-MW3RWBZ7.js";l("en",{lookupOpen:"Open search",lookupSelect:"Select"});l("pt-BR",{lookupOpen:"Abrir pesquisa",lookupSelect:"Selecionar"});var p=class extends c{baseCls="op-field op-textfield op-picker op-suggest op-lookup";def;suggestStore;win;constructor(e){let t=h(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??=g(this.def),o=this.def.queryField??this.def.filters?.[0]?.name??this.config.displayField,i=this.def.filters?.find(n=>n.name===o)?.field??o;return await t.filter({field:i,op:"contains",value:e}),t.getData()}createControl(){let e=super.createControl(),t=d("button","op-picker__trigger op-lookup__btn",{type:"button",tabindex:-1,"aria-label":s("lookupOpen"),"aria-haspopup":"dialog"},u("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]),n.close()},n=this.win=new f({title:e.title??s("search"),width:e.width??720,height:e.height??520,layout:"fit",items:[t],buttons:[{text:s("cancel"),handler:()=>n.close()},{text:s("lookupSelect"),variant:"primary",handler:()=>i(t.getSelection())}]});n.on("destroy",()=>{this.win=void 0,this.rendered&&this.input.focus()}),n.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)}};a("lookupfield",p);export{p as a};
|
|
2
|
-
//# sourceMappingURL=chunk-UB5RYS7T.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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, 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]?.name ?? this.config.displayField!;\n const field = this.def.filters?.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", "field", "f", "wrap", "btn", "h", "t", "iconEl", "e", "disabled", "d", "sg", "SearchGrid", "recs", "done", "win", "Window", "rec", "valueField", "displayField", "item", "register"]
|
|
7
|
-
}
|
package/dist/chunk-UXXJOU5J.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as v}from"./chunk-KLLAY2IM.js";import{a as m}from"./chunk-W2BAFOCN.js";import{a as w}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as u}from"./chunk-PZSHOSOS.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{e as d,f as n}from"./chunk-MW3RWBZ7.js";d("en",{views:"Views",viewsName:"Name for this view",viewsSave:"Save view",viewsSaveAs:"Save as new view\u2026",viewsDefault:"Open with this view",viewsDelete:"Delete view",viewsConfirmDelete:'Delete the view "{n}"?',viewsReset:"Reset to initial"});d("pt-BR",{views:"Vis\xF5es",viewsName:"Nome desta vis\xE3o",viewsSave:"Salvar vis\xE3o",viewsSaveAs:"Salvar como nova vis\xE3o\u2026",viewsDefault:"Abrir com esta vis\xE3o",viewsDelete:"Excluir vis\xE3o",viewsConfirmDelete:'Excluir a vis\xE3o "{n}"?',viewsReset:"Voltar ao inicial"});var g=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function M(a,e=localStorage){let t=()=>{try{let s=JSON.parse(e.getItem(a)??"[]");return Array.isArray(s)?s:[]}catch{return[]}},i=s=>e.setItem(a,JSON.stringify(s));return{list:t,save(s){let r={...s,id:s.id??g()},o=t(),h=o.findIndex(p=>p.id===r.id);return h<0?o.push(r):o[h]=r,i(o),r},remove(s){i(t().filter(r=>r.id!==s.id))}}}function P(a){let e=async(t,i="",s)=>{let r=await(a.fetch??fetch)(a.url+i,{method:t,headers:{"Content-Type":"application/json",...a.headers},body:s===void 0?void 0:JSON.stringify(s)});if(!r.ok)throw new Error(`Optikos views: ${t} ${a.url+i} \u2192 ${r.status}`);return r.status===204?void 0:r.json().catch(()=>{})};return{list:()=>e("GET"),save:t=>t.id?e("PUT",`/${encodeURIComponent(t.id)}`,t):e("POST","",t),remove:t=>e("DELETE",`/${encodeURIComponent(t.id)}`).then(()=>{})}}var l=class extends f{baseCls="op-viewmanager";btn;menu;views=[];current;initial={};build(){return this.btn=new w({text:n("views"),icon:"menu",variant:"ghost",handler:()=>this.openMenu()}),this.btn.el.setAttribute("aria-haspopup","menu"),this.own(()=>(this.btn.destroy(),this.menu?.destroy())),u("span",this.baseCls,{},this.btn.el)}onRender(){this.config.grid.render(),this.config.filters?.render(),this.initial=this.getState(),this.config.autoLoad!==!1&&this.reload()}notifyMount(){super.notifyMount(),this.btn.notifyMount()}getState(){let{grid:e,filters:t,extra:i}=this.config,s={columns:e.getColumnState(),filter:t?.getFilter()??null,sorters:[...e.getStore().getSorters()]};return i&&(s.extra=Object.fromEntries(Object.entries(i).map(([r,o])=>[r,o.get()]))),s}setState(e){let{grid:t,filters:i,extra:s}=this.config;e.columns&&t.setColumnState(e.columns);let r=e.sorters?.[0];t.getStore().sort(r?.field??null,r?.dir),i&&(i.setFilter(e.filter??null),i.apply());for(let o in e.extra)s?.[o]?.set(e.extra[o])}getViews(){return this.views}getCurrent(){return this.current}async reload(){await this.run(async()=>{this.views=await this.config.storage.list()??[],this.current=this.current&&this.views.find(t=>t.id===this.current.id);let e=this.views.find(t=>t.default);!this.current&&e&&this.config.autoLoad!==!1&&this.apply(e),this.paint()}),this.emit("load",this.views)}apply(e){let t=typeof e=="string"?this.views.find(i=>i.id===e):e;!t||this.emit("before-apply",t)===!1||(this.current=t,this.setState(t.state),this.paint(),this.emit("apply",t))}async save(){if(!this.current)return this.saveAs();await this.store({...this.current,state:this.getState()})}async saveAs(e){if(e??=await v.prompt(n("viewsName"),{title:n("viewsSaveAs")})??"",e=e.trim(),!e)return;let t=this.views.find(i=>i.name.toLowerCase()===e.toLowerCase());await this.store({...t,name:e,state:this.getState()})}async setDefault(e=!0){if(this.current){for(let t of this.views)t!==this.current&&t.default&&await this.store({...t,default:!1},!1);await this.store({...this.current,default:e})}}async remove(e=this.current){!e||!await v.confirm(n("viewsConfirmDelete",{n:e.name}),{danger:!0,okText:n("viewsDelete")})||await this.run(async()=>{await this.config.storage.remove(e),this.views=this.views.filter(t=>t!==e&&t.id!==e.id),this.current?.id===e.id&&(this.current=void 0),this.paint(),this.emit("remove",e)})}reset(){this.current=void 0,this.setState(this.initial),this.paint(),this.emit("reset")}async store(e,t=!0){await this.run(async()=>{let i=await this.config.storage.save(e)||e,s=this.views.findIndex(r=>i.id&&r.id===i.id||r===e);s<0?this.views.push(i):this.views[s]=i,t&&(this.current=i),this.paint(),this.emit("save",i)})}async run(e){try{await e()}catch(t){this.emit("error",t)}}paint(){this.btn.setText(this.current?.name??n("views"))}openMenu(){let e=this.current,t=[...this.views.map(i=>({text:i.default?`${i.name} \u2605`:i.name,checked:i===e||!!e?.id&&i.id===e.id,handler:()=>this.apply(i)})),...this.views.length?["-"]:[],{text:n("viewsSave"),handler:()=>{this.save()}},{text:n("viewsSaveAs"),handler:()=>{this.saveAs()}},...e?[{text:n("viewsDefault"),checked:!!e.default,handler:()=>{this.setDefault(!e.default)}},{text:n("viewsDelete"),handler:()=>{this.remove()}}]:[],"-",{text:n("viewsReset"),handler:()=>this.reset()}];this.menu??=new m({}),this.menu.setItems(t),this.menu.showBy(this.btn.el)}};c("viewmanager",l);export{M as a,P as b,l as c};
|
|
2
|
-
//# sourceMappingURL=chunk-UXXJOU5J.js.map
|
package/dist/chunk-VU3GIDZ3.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as a}from"./chunk-ZWNQREWS.js";import{a as o}from"./chunk-2ZRNGG2N.js";import{e as c}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";var y=(n,e)=>e.split(".").reduce((t,i)=>t?.[i],n);function u(n,e,t){let i=e.split("."),s=i.pop(),r=i.reduce((l,d)=>l[d]??={},n);r[s]=t}var f=class extends a{baseCls="op-form";tag="form";ruledOut=new Set;dirty=!1;constructor(e={}){let t=[...e.items??[]];e.tabs&&t.push({type:"tabs",flex:1,items:e.tabs.map(i=>({type:"container",title:i.title,icon:i.icon,cls:"op-form__tab",layout:i.layout??{type:"grid",columns:2,gap:12},items:i.items}))}),super({...e,items:t})}build(){let e=super.build();return e.setAttribute("novalidate",""),e}onRender(){if(this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},this.config.labelWidth!=null&&this.setLabelWidth(this.config.labelWidth),this.config.labelPos)for(let e of this.getFields())e.config.labelPos??=this.config.labelPos;super.onRender(),this.config.readonly&&this.setReadonly(!0);for(let e of this.getFields())for(let t of["invalid","valid","dirty-change","change"])e.on(t,()=>this.syncTabs());for(let e of this.getFields())e.on("change",()=>this.changed());for(let e of this.getFields())e.on("dirty-change",()=>this.changed());this.applyRules(),this.listen(this.el,"submit",e=>{e.preventDefault(),this.submit()}),this.listen(this.el,"keydown",e=>{let t=e.target;e.key==="Enter"&&t instanceof HTMLInputElement&&!e.defaultPrevented&&t.type!=="button"&&(e.preventDefault(),this.submit())})}getFields(){return this.query(e=>e instanceof o)}getField(e){return this.getFields().find(t=>t.name===e)}getValues(e={}){let t={};for(let i of this.counted())i.name&&(!e.dirtyOnly||i.isDirty())&&u(t,i.name,i.getValue());return t}counted(){return this.getFields().filter(e=>{for(let t=e;t&&t!==this;t=t.parent)if(this.ruledOut.has(t))return!1;return!0})}changed(){this.applyRules();let e=this.isDirty();e!==this.dirty&&this.emit("dirty-change",this.dirty=e)}applyRules(){let e={};for(let t of this.getFields())t.name&&u(e,t.name,t.getValue());for(let t of this.query(i=>!!(i.config.showIf||i.config.enableIf))){let{showIf:i,enableIf:s}=t.config;if(i){let r=!!i(e);if(r===this.ruledOut.has(t))if(r)this.ruledOut.delete(t),t.show();else{this.ruledOut.add(t),t.hide();for(let l of t instanceof o?[t]:t instanceof a?t.query(d=>d instanceof o):[])l.clearError()}}s&&t.setDisabled(!s(e))}}focusField(e){this.reveal(e),e.focus()}setValues(e){for(let t of this.getFields()){let i=t.name?y(e,t.name):void 0;i!==void 0&&t.setValue(i,!0)}}load(e){this.setValues("data"in e&&"get"in e?e.data:e),this.markClean(),this.clearErrors(),this.emit("load",e)}reveal(e){let t=e;for(;t.parent;){let i=t.parent;i.items?.includes(t)&&(typeof i.setActive=="function"?i.setActive(t):i.layout?.activate&&i.layout.activate(i,t)),t=i}}syncTabs(){for(let e of this.query(t=>typeof t.setTabState=="function"))for(let t of e.items){let i=t instanceof a?t.query(s=>s instanceof o):[];e.setTabState(t,{errors:i.filter(s=>s.getError()).length,dirty:i.some(s=>s.isDirty())})}}updateRecord(e){let t=this.getValues(),i=new Set(this.getFields().filter(s=>s.name&&s.isDirty()).map(s=>s.name.split(".")[0]));for(let s of i)e.set(s,t[s])}markClean(){this.getFields().forEach(e=>e.markClean()),this.syncTabs()}reset(){this.getFields().forEach(e=>e.reset()),this.syncTabs()}isDirty(){return this.getFields().some(e=>e.isDirty())}isValid(){return this.counted().every(e=>e.config.disabled||e.isValid())}clearErrors(){this.getFields().forEach(e=>e.clearError()),this.syncTabs()}validate(){let e=this.counted().filter(i=>!i.config.disabled);for(let i of this.getFields())e.includes(i)||i.clearError();let t=e.filter(i=>!i.validate());return this.syncTabs(),t.length&&(this.reveal(t[0]),t[0].focus(),this.emit("invalid",t)),this.el.classList.toggle("is-invalid",!!t.length),!t.length}submit(){return this.emit("before-submit")===!1||!this.validate()?!1:(this.emit("submit",this.getValues()),!0)}setLabelWidth(e){this.config.labelWidth=e,this.rendered&&this.el.style.setProperty("--op-field-label-width",c(e))}setReadonly(e){this.config.readonly=e,this.getFields().forEach(t=>t.setReadonly(e))}};h("form",f);export{f as a};
|
|
2
|
-
//# sourceMappingURL=chunk-VU3GIDZ3.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/form/form/form.ts"],
|
|
4
|
-
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport type { Model } from '../../../data/model';\nimport type { Component } from '../../../core/component';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { px } from '../../../core/dom';\n\nexport interface FormTab {\n title: string;\n icon?: string;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface FormConfig extends ContainerConfig {\n /** Shortcut: the fields in tabs, still one form (one `getValues`, one `validate`, one dirty). */\n tabs?: FormTab[];\n /** Default `labelPos` for fields that do not set their own. */\n labelPos?: 'top' | 'left';\n /** Width of the labels on the left (`labelPos: 'left'`), so they line up in a column. Number = px. */\n labelWidth?: number | string;\n /** Shortcut for a responsive grid layout (one column on narrow screens); items take `colspan` (a number or `'full'`). */\n columns?: number;\n readonly?: boolean;\n}\n\nconst getPath = (o: any, path: string) => path.split('.').reduce((v, k) => v?.[k], o);\nfunction setPath(o: any, path: string, value: unknown) {\n const keys = path.split('.');\n const last = keys.pop()!;\n const target = keys.reduce((v, k) => (v[k] ??= {}), o);\n target[last] = value;\n}\n\nexport class Form extends Container<FormConfig> {\n protected override baseCls = 'op-form';\n protected override tag = 'form' as const;\n /** Components hidden by their `showIf` rule: their fields do not count (no validation, not in `getValues`). */\n private ruledOut = new Set<Component>();\n private dirty = false;\n\n constructor(config: FormConfig = {}) {\n const items = [...(config.items ?? [])];\n if (config.tabs) {\n items.push({\n type: 'tabs',\n flex: 1,\n items: config.tabs.map((t) => ({ type: 'container', title: t.title, icon: t.icon, cls: 'op-form__tab', layout: t.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: t.items })),\n } as never);\n }\n super({ ...config, items });\n }\n\n protected override build() {\n const el = super.build();\n el.setAttribute('novalidate', '');\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= this.config.columns ? { type: 'grid', columns: this.config.columns } : { type: 'vbox' };\n if (this.config.labelWidth != null) this.setLabelWidth(this.config.labelWidth);\n if (this.config.labelPos) for (const f of this.getFields()) f.config.labelPos ??= this.config.labelPos;\n super.onRender();\n if (this.config.readonly) this.setReadonly(true);\n for (const f of this.getFields()) for (const ev of ['invalid', 'valid', 'dirty-change', 'change']) f.on(ev, () => this.syncTabs());\n for (const f of this.getFields()) f.on('change', () => this.changed());\n for (const f of this.getFields()) f.on('dirty-change', () => this.changed());\n this.applyRules();\n // Native submit (a `type=submit` button) and Enter inside a single-line field both go through submit().\n this.listen(this.el, 'submit', (e: Event) => {\n e.preventDefault();\n this.submit();\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const t = e.target as HTMLElement;\n if (e.key === 'Enter' && t instanceof HTMLInputElement && !e.defaultPrevented && t.type !== 'button') {\n e.preventDefault();\n this.submit();\n }\n });\n }\n\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getField(name: string): Field<any> | undefined {\n return this.getFields().find((f) => f.name === name);\n }\n\n /** Nested object built from field names (`address.city` \u2192 `{ address: { city } }`). Fields hidden by `showIf` are left out. */\n getValues(opts: { dirtyOnly?: boolean } = {}): Record<string, any> {\n const out: Record<string, any> = {};\n for (const f of this.counted()) if (f.name && (!opts.dirtyOnly || f.isDirty())) setPath(out, f.name, f.getValue());\n return out;\n }\n\n /** The fields that count: not inside something its `showIf` rule hid. */\n private counted(): Field<any>[] {\n return this.getFields().filter((f) => {\n for (let c: Component | undefined = f; c && c !== this; c = c.parent as Component | undefined) if (this.ruledOut.has(c)) return false;\n return true;\n });\n }\n\n /** A field changed: rerun the `showIf`/`enableIf` rules and say when the form as a whole became (un)changed. */\n private changed(): void {\n this.applyRules();\n const d = this.isDirty();\n if (d !== this.dirty) this.emit('dirty-change', (this.dirty = d));\n }\n\n /** Shows/hides and enables/disables every item that has a rule, from the current values (hidden fields included). */\n applyRules(): void {\n const values: Record<string, any> = {};\n for (const f of this.getFields()) if (f.name) setPath(values, f.name, f.getValue());\n for (const c of this.query((x) => !!(x.config.showIf || x.config.enableIf))) {\n const { showIf, enableIf } = c.config;\n if (showIf) {\n const show = !!showIf(values);\n if (show === this.ruledOut.has(c)) {\n if (show) (this.ruledOut.delete(c), c.show());\n else {\n this.ruledOut.add(c);\n c.hide();\n // what nobody can see has nothing to fix: its errors go with it\n for (const f of c instanceof Field ? [c] : c instanceof Container ? (c.query((x) => x instanceof Field) as Field<any>[]) : []) f.clearError();\n }\n }\n }\n if (enableIf) c.setDisabled(!enableIf(values));\n }\n }\n\n /** Brings a field into view (opening its tab or step) and focuses it. */\n focusField(field: Field<any>): void {\n this.reveal(field);\n field.focus();\n }\n\n /** Sets the fields present in `values` (silently). */\n setValues(values: Record<string, any>): void {\n for (const f of this.getFields()) {\n const v = f.name ? getPath(values, f.name) : undefined;\n if (v !== undefined) f.setValue(v, true);\n }\n }\n\n /** Fills the form from a plain object or a Model, and makes it the \"clean\" state. */\n load(record: Record<string, any> | Model): void {\n this.setValues('data' in record && 'get' in record ? (record as Model).data : record);\n this.markClean();\n this.clearErrors();\n this.emit('load', record);\n }\n\n /** Brings a field into view: asks every ancestor that shows one child at a time (Tabs, a card layout) to show the branch. */\n protected reveal(field: Component): void {\n let node: Component = field;\n while (node.parent) {\n const p = node.parent as any;\n if (p.items?.includes(node)) {\n if (typeof p.setActive === 'function') p.setActive(node);\n else if (p.layout?.activate) p.layout.activate(p, node);\n }\n node = p;\n }\n }\n\n /** Error counts and \"changed\" dots on the headers of every Tabs inside the form. */\n protected syncTabs(): void {\n for (const tabs of this.query((c) => typeof (c as any).setTabState === 'function') as any[]) {\n for (const panel of tabs.items as Component[]) {\n const fields = panel instanceof Container ? (panel.query((c) => c instanceof Field) as Field<any>[]) : [];\n tabs.setTabState(panel, { errors: fields.filter((f) => f.getError()).length, dirty: fields.some((f) => f.isDirty()) });\n }\n }\n }\n\n /** Writes the changed fields back into a Model. */\n updateRecord(model: Model): void {\n const all = this.getValues();\n const keys = new Set(this.getFields().filter((f) => f.name && f.isDirty()).map((f) => f.name!.split('.')[0]));\n for (const k of keys) model.set(k, all[k]);\n }\n\n markClean(): void {\n this.getFields().forEach((f) => f.markClean());\n this.syncTabs();\n }\n reset(): void {\n this.getFields().forEach((f) => f.reset());\n this.syncTabs();\n }\n isDirty(): boolean {\n return this.getFields().some((f) => f.isDirty());\n }\n isValid(): boolean {\n return this.counted().every((f) => f.config.disabled || f.isValid());\n }\n clearErrors(): void {\n this.getFields().forEach((f) => f.clearError());\n this.syncTabs();\n }\n\n /** Validates every field that counts (marks errors) and focuses the first invalid one. */\n validate(): boolean {\n // a hidden or disabled field is not validated: the user could not fix it\n const counted = this.counted().filter((f) => !f.config.disabled);\n for (const f of this.getFields()) if (!counted.includes(f)) f.clearError();\n const bad = counted.filter((f) => !f.validate());\n this.syncTabs();\n if (bad.length) {\n this.reveal(bad[0]); // the tab / step that holds it comes forward first\n bad[0].focus();\n this.emit('invalid', bad);\n }\n this.el.classList.toggle('is-invalid', !!bad.length);\n return !bad.length;\n }\n\n submit(): boolean {\n if (this.emit('before-submit') === false) return false;\n if (!this.validate()) return false;\n this.emit('submit', this.getValues());\n return true;\n }\n\n /** Width of the labels on the left (number = px); they line up in a column. */\n setLabelWidth(width: number | string): void {\n this.config.labelWidth = width;\n if (this.rendered) this.el.style.setProperty('--op-field-label-width', px(width));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n this.getFields().forEach((f) => f.setReadonly(readonly));\n }\n}\nregister('form', Form);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["getPath", "o", "path", "v", "k", "setPath", "value", "keys", "last", "target", "Form", "Container", "config", "items", "t", "el", "f", "ev", "c", "Field", "name", "opts", "out", "d", "values", "x", "showIf", "enableIf", "show", "field", "record", "node", "p", "tabs", "panel", "fields", "model", "all", "counted", "bad", "width", "px", "readonly", "register"]
|
|
7
|
-
}
|
package/dist/chunk-W2BAFOCN.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{a as v}from"./chunk-Z2JBUHKA.js";import{c as f}from"./chunk-VV7CFMPZ.js";import{e as b}from"./chunk-4AA4FQEM.js";import{c as u}from"./chunk-4EZJ5FKJ.js";import{a as d}from"./chunk-A2NKDOYN.js";import{b as s}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-MW3RWBZ7.js";var n=".op-menu__item",p=class E extends d{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=f(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??[]}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 E({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 v({...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(),b(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()}};m("menu",p);export{p as a};
|
|
3
|
-
//# sourceMappingURL=chunk-W2BAFOCN.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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 { 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}\nexport type MenuEntry = MenuItem | '-';\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(): MenuEntry[] {\n return this.config.items ?? [];\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", "entries", "rows", "it", "i", "checkable", "iconEl", "groupOf", "groups", "_", "g", "items", "search", "item", "focus", "anchor", "placement", "x", "y", "cfg", "Dropdown", "stagger", "back", "register"]
|
|
7
|
-
}
|
package/dist/chunk-WFGTQZIQ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as F}from"./chunk-JOFQJGZK.js";import{a as S}from"./chunk-VU3GIDZ3.js";import{a as w}from"./chunk-GNU4VOOE.js";import{c}from"./chunk-ZWNQREWS.js";import{a as y}from"./chunk-2ZRNGG2N.js";import{a as l}from"./chunk-2ZUZ5HDL.js";import{a as b}from"./chunk-A2NKDOYN.js";import{b as a}from"./chunk-PZSHOSOS.js";import{a as x}from"./chunk-TIPK3SCJ.js";import{e as f,f as p}from"./chunk-MW3RWBZ7.js";f("en",{stepBack:"Back",stepNext:"Next",stepFinish:"Finish",stepReview:"Review"});f("pt-BR",{stepBack:"Voltar",stepNext:"Pr\xF3ximo",stepFinish:"Concluir",stepReview:"Revis\xE3o"});var d=class extends b{baseCls="op-stepform__review";setContent(e){this.el.replaceChildren(...e)}},u=class extends S{baseCls="op-form op-stepform";stepper;body;pane;backBtn;nextBtn;finishBtn;index=0;pending;notes=[];noteEl;constructor(e){let t,i=e.steps??[],s=e.review?new d:void 0,r=new F({steps:[...i.map(({title:o,description:_,icon:A,optional:k})=>({title:o,description:_,icon:A,optional:k})),...s?[{title:e.reviewTitle??p("stepReview")}]:[]]}),n=[...i.map(o=>({type:"container",title:o.title,cls:"op-stepform__step",layout:o.layout??{type:"grid",columns:2,gap:12},items:o.items})),...s?[{type:"container",title:e.reviewTitle??p("stepReview"),cls:"op-stepform__step",items:[s]}]:[]],h=new c({cls:"op-stepform__body",flex:1,layout:{type:"card"},items:n}),m=new l({text:e.backText??p("stepBack"),handler:()=>t.back()}),g=new l({text:e.nextText??p("stepNext"),variant:"primary",handler:()=>t.next()}),v=new l({text:e.finishText??p("stepFinish"),variant:"primary",htmlType:"submit"}),B=e.cancelText?[new l({text:e.cancelText,variant:"ghost",handler:()=>t.emit("cancel")})]:[],T=new w({cls:"op-stepform__footer",items:[...B,"->",m,g,v]});super({...e,layout:{type:"vbox"},items:[r,h,T]}),t=this,Object.assign(this,{stepper:r,body:h,pane:s,backBtn:m,nextBtn:g,finishBtn:v}),r.on("before-select",o=>(t.goTo(o),!1)),h.on("activate",()=>t.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 t=this.body.items[e];return t instanceof c?t.query(i=>i instanceof y):[]}validateStep(e){if(e>=this.real())return!0;let t=this.stepFields(e).filter(i=>!i.validate());return this.stepper.setStepState(e,t.length?"error":"done"),!t.length}note(e,t){this.notes[e]=t,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=a("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 t=this.cfg().steps[e]?.validate;if(!t)return!0;this.stop();let i=this.pending=new AbortController;this.busy(!0);let s;try{s=await t(this.getValues(),this,i.signal)}catch(n){s=String(n?.message??n)}if(i.signal.aborted)return!1;this.pending=void 0,this.busy(!1);let r=s===!0||s==null;if(this.note(e,typeof s=="string"?s:""),!r&&typeof s=="object")for(let[n,h]of Object.entries(s))this.getField(n)?.setError(h);return r||this.stepper.setStepState(e,"error"),r}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 t=this.index,i=r=>this.index!==t?!1:(r!==this.index&&this.body.setActiveItem(r),r!==e&&this.stepFields(r).find(n=>n.getError())?.focus(),r===e);if(this.cfg().linear===!1||e<t)return Promise.resolve(i(e));let s=r=>{for(;r<e;r++){if(!this.validateStep(r))return i(r);if(this.cfg().steps[r]?.validate)return this.check(r).then(n=>n?s(r+1):i(r))}return i(e)};return Promise.resolve(s(t))}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 t=this.index;this.index=e,this.stepper.setActive(e);let i=this.count()-1;this.backBtn.config.hidden=e===0,this.nextBtn.config.hidden=e===i,this.finishBtn.config.hidden=e!==i;for(let[s,r]of[[this.backBtn,e===0],[this.nextBtn,e===i],[this.finishBtn,e!==i]])s.rendered&&(s.el.hidden=r);if(this.pane&&e===i&&this.refreshReview(),this.showNote(),e!==t&&(this.emit("step-change",e,t),this.rendered&&this.el.isConnected&&!this.stepFields(e).some(s=>s.getError()))){let s=this.body.items[e]?.el;this.config.autoFocus?this.stepFields(e)[0]?.focus():s&&(s.tabIndex=-1,s.focus())}}refreshReview(){let e=this.getValues(),t=this.cfg().review;if(typeof t=="function")return this.pane.setContent([t(e,this)]);let i=[];for(let s=0;s<this.real();s++){let r=this.stepFields(s).filter(n=>n.name);r.length&&(i.push(a("h3","op-stepform__review-title",{},String(this.body.items[s].config.title??""))),i.push(a("dl","op-stepform__review-list",{},...r.flatMap(n=>[a("dt","",{},n.config.label??n.config.boxLabel??n.name),a("dd","",{},this.show_(n))]))))}this.pane.setContent(i)}show_(e){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();return i||(t&&typeof t=="object"&&!Array.isArray(t)?Object.values(t).filter(Boolean).join(" \u2013 ")||"\u2014":Array.isArray(t)&&t.join(", ")||"\u2014")}submit(){if(this.index<this.count()-1)return this.next(),!1;let e=()=>{for(let i=0;i<this.real();i++)this.stepper.setStepState(i,this.stepFields(i).some(s=>s.getError())?"error":"done")};if(this.cfg().steps.some(i=>i.validate)){if(this.pending||this.emit("before-submit")===!1||!this.validate())return e(),!1;let i=this.index;return(async()=>{for(let r=0;r<this.real();r++)if(!await this.check(r)){if(this.index!==i||this.destroyed)return;r!==i&&this.body.setActiveItem(r),this.stepFields(r).find(n=>n.getError())?.focus();return}e();let s=this.getValues();this.emit("submit",s),this.emit("finish",s)})(),!1}let t=super.submit();return e(),t&&this.emit("finish",this.getValues()),t}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()}};x("stepform",u);export{u as a};
|
|
2
|
-
//# sourceMappingURL=chunk-WFGTQZIQ.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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 as never });\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). */\n private show_(f: Field<any>): string {\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 return v && typeof v === 'object' && !Array.isArray(v) ? Object.values(v).filter(Boolean).join(' \u2013 ') || '\u2014' : Array.isArray(v) ? v.join(', ') || '\u2014' : '\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": "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",
|
|
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", "h", "on", "k", "fn", "ctl", "res", "e", "ok", "name", "msg", "j", "from", "land", "target", "walk", "last", "b", "hide", "panel", "values", "out", "rows", "v", "states", "at", "register"]
|
|
7
|
-
}
|
package/dist/chunk-XX2MVWFS.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{a as b}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as r}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{e as g,f as p}from"./chunk-MW3RWBZ7.js";g("en",{codeCopy:"Copy",codeCopied:"Copied"});g("pt-BR",{codeCopy:"Copiar",codeCopied:"Copiado"});var w={ts:"TypeScript",js:"JavaScript",json:"JSON",css:"CSS",html:"HTML",sh:"Shell",text:"Text"},y="import|from|export|default|function|return|const|let|var|new|await|async|if|else|for|of|in|while|do|switch|case|break|continue|throw|try|catch|finally|class|extends|implements|interface|type|enum|as|typeof|instanceof|keyof|readonly|public|private|protected|static|this|void|true|false|null|undefined",c=`'(?:[^'\\\\\\n]|\\\\.)*'|"(?:[^"\\\\\\n]|\\\\.)*"`,l={ts:[new RegExp(`(\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\/)|(${c}|\`(?:[^\`\\\\]|\\\\.)*\`)|\\b(${y})\\b|\\b(\\d+(?:\\.\\d+)?)\\b`,"g"),["comment","string","keyword","number"]],js:[/./g,[]],json:[new RegExp(`("(?:[^"\\\\\\n]|\\\\.)*")(?=\\s*:)|(${c})|\\b(true|false|null)\\b|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)`,"g"),["property","string","keyword","number"]],css:[new RegExp(`(\\/\\*[\\s\\S]*?\\*\\/)|(${c})|(@[\\w-]+)|([\\w-]+)(?=\\s*:[^:{;]*[;}\\n])|(#[0-9a-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:%|[a-z]+)?)`,"g"),["comment","string","keyword","property","number"]],html:[new RegExp(`(<!--[\\s\\S]*?-->)|(<\\/?[\\w-]+|\\/?>)|([\\w:-]+)(?==)|(${c})`,"g"),["comment","tag","attr","string"]],sh:[new RegExp(`(#[^\\n]*)|(${c})|\\b(if|then|else|fi|for|in|do|done|case|esac|while|function|export|return|sudo)\\b|(\\$\\{?[\\w]+\\}?|--?[\\w-]+)`,"g"),["comment","string","keyword","attr"]]};l.js=l.ts;function x(s,e="ts"){if(e==="text"||!l[e])return[["",s]];let[t,a]=l[e],i=[],n=0;for(let o of s.matchAll(t))o.index>n&&i.push(["",s.slice(n,o.index)]),i.push([a[o.slice(1).findIndex(d=>d!==void 0)]??"",o[0]]),n=o.index+o[0].length;return n<s.length&&i.push(["",s.slice(n)]),i}var v=s=>{if(Array.isArray(s))return new Set(s);let e=new Set;for(let t of(s??"").split(",")){let[a,i]=t.split("-").map(n=>Number(n.trim()));if(Number.isFinite(a))for(let n=a;n<=(Number.isFinite(i)?i:a);n++)e.add(n)}return e},u=class extends f{baseCls="op-codeviewer";titleEl;bar;pre;codeEl;status;copyBtn;build(){return this.titleEl=r("span","op-codeviewer__title"),this.copyBtn=new b({text:p("codeCopy"),icon:"file",variant:"ghost",handler:()=>{this.copy()}}),this.status=r("span","op-sr-only op-codeviewer__status",{"aria-live":"polite"}),this.bar=r("div","op-codeviewer__bar",{},this.titleEl,this.copyBtn.el,this.status),this.codeEl=r("code","op-codeviewer__code"),this.pre=r("pre","op-codeviewer__pre",{tabindex:0},this.codeEl),r("div","op-codeviewer",{},this.bar,this.pre)}onRender(){this.own(()=>this.copyBtn.destroy()),this.paintBar(),this.paintCode(),this.setWrap(!!this.config.wrap),this.setMaxHeight(this.config.maxHeight)}get language(){return this.config.language??"ts"}paintBar(){let e=this.config,t=e.title??w[this.language]??this.language;this.titleEl.textContent=t,this.pre.setAttribute("aria-label",t),this.bar.hidden=e.bar===!1,this.copyBtn.el.hidden=e.copyable===!1}paintCode(){let e=this.config,t=e.startLine??1,a=v(e.highlight),i=[r("span","op-codeviewer__line")];for(let[o,d]of x(e.code??"",this.language))d.split(`
|
|
2
|
-
`).forEach((h,C)=>{C&&i.push(r("span","op-codeviewer__line")),h&&i[i.length-1].append(o?r("span",`op-codeviewer__tok--${o}`,{},h):h)});i.forEach((o,d)=>{a.has(t+d)&&o.classList.add("is-marked"),d<i.length-1&&o.append(`
|
|
3
|
-
`)}),this.codeEl.replaceChildren(...i);let n=e.lineNumbers!==!1;this.el.classList.toggle("has-numbers",n),this.codeEl.style.counterReset=`op-codeline ${t-1}`,this.codeEl.style.setProperty("--op-codeviewer-gutter",`${String(t+i.length-1).length}ch`)}getCode(){return this.config.code??""}async copy(){let e=this.getCode();try{await navigator.clipboard.writeText(e)}catch{let t=document.createRange();return t.selectNodeContents(this.codeEl),getSelection()?.removeAllRanges(),getSelection()?.addRange(t),!1}return this.copyBtn.setText(p("codeCopied")),this.copyBtn.setIcon("check"),this.status.textContent=p("codeCopied"),this.later(()=>{this.copyBtn.setText(p("codeCopy")),this.copyBtn.setIcon("file"),this.status.textContent=""},1600),this.emit("copy",e),!0}update(e,t=!1){Object.assign(this.config,e),this.rendered&&(t&&this.paintBar(),this.paintCode())}setCode(e){this.update({code:e})}setLanguage(e){this.update({language:e},!0)}setTitle(e){this.update({title:e},!0)}setLineNumbers(e){this.update({lineNumbers:e})}setStartLine(e){this.update({startLine:e})}setHighlight(e){this.update({highlight:e})}setWrap(e){this.config.wrap=e,this.rendered&&this.el.classList.toggle("is-wrapped",e)}setMaxHeight(e){this.config.maxHeight=e,this.rendered&&(this.pre.style.maxBlockSize=e==null?"":typeof e=="number"?`${e}px`:e)}};m("codeviewer",u);export{x as a,u as b};
|
|
4
|
-
//# sourceMappingURL=chunk-XX2MVWFS.js.map
|
package/dist/chunk-XYZ6VZ5T.js
DELETED
package/dist/chunk-YBAYEU25.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{e as n,f}from"./chunk-MW3RWBZ7.js";n("en",{feOne:"Fix 1 problem before saving",feMany:"Fix {n} problems before saving"});n("pt-BR",{feOne:"Corrija 1 problema antes de salvar",feMany:"Corrija {n} problemas antes de salvar"});var l=class extends a{baseCls="op-formerrors";titleEl;listEl;form;active=!1;build(){return this.titleEl=o("div","op-formerrors__title"),this.listEl=o("ul","op-formerrors__list"),o("div","op-formerrors",{role:"alert",tabindex:-1},this.titleEl,this.listEl)}onRender(){this.el.hidden=!0;let e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;let t=this.form=e;if(t){t.on("invalid",()=>{this.active=!0,this.refresh(),this.config.focus&&this.el.focus()});for(let r of t.getFields())for(let i of["invalid","valid"])r.on(i,()=>this.active&&this.refresh());this.listen(this.listEl,"click",r=>{let i=Number(r.target.closest("[data-i]")?.dataset.i),s=this.getErrors()[i];s&&(t.focusField(s),this.emit("go",s))})}}getErrors(){return this.form?.getFields().filter(e=>e.getError())??[]}refresh(){let e=this.getErrors(),t=e.length,r=this.config.title;this.titleEl.textContent=typeof r=="function"?r(t):r??f(t===1?"feOne":"feMany",{n:t}),this.listEl.replaceChildren(...e.map((i,s)=>o("li","",{},o("button","op-formerrors__link",{type:"button","data-i":s},`${i.config.label??i.name??""}: ${i.getError()}`)))),this.el.hidden=!t}};m("formerrors",l);export{l as a};
|
|
2
|
-
//# sourceMappingURL=chunk-YBAYEU25.js.map
|
package/dist/chunk-YF75HKL6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as R}from"./chunk-ZVK4L5GK.js";import{a as z}from"./chunk-W2BAFOCN.js";import{a as H}from"./chunk-Z2JBUHKA.js";import{a as k}from"./chunk-W3H7GTJY.js";import{a as T,b as E}from"./chunk-OWEQT2HN.js";import{c as A}from"./chunk-LW2WRUVL.js";import{c as x}from"./chunk-OEAXCCVM.js";import{a as v}from"./chunk-2ZUZ5HDL.js";import{c as C}from"./chunk-4EZJ5FKJ.js";import{a as M}from"./chunk-A2NKDOYN.js";import{b as d}from"./chunk-PZSHOSOS.js";import{a as S}from"./chunk-TIPK3SCJ.js";import{e as y,f as u}from"./chunk-MW3RWBZ7.js";y("en",{gridSelected:"{n} selected",gridSelectAll:"Select all {n}",gridClearSel:"Clear selection",gridSelectRow:"Select row",gridSelectPage:"Select all rows",gridRowActions:"Row actions",gridColumns:"Columns",gridResize:"Resize column",gridGroupAll:"All",gridOtherCols:"Other",gridGroups:"Column groups",gridColumnSearch:"Search columns",gridNoColumns:"No matching columns"});y("pt-BR",{gridSelected:"{n} selecionado(s)",gridSelectAll:"Selecionar todos os {n}",gridClearSel:"Limpar sele\xE7\xE3o",gridSelectRow:"Selecionar linha",gridSelectPage:"Selecionar todas as linhas",gridRowActions:"A\xE7\xF5es da linha",gridColumns:"Colunas",gridResize:"Redimensionar coluna",gridGroupAll:"Todas",gridOtherCols:"Outras",gridGroups:"Grupos de colunas",gridColumnSearch:"Buscar colunas",gridNoColumns:"Nenhuma coluna encontrada"});var f="__select",p="__actions",D={field:f,width:44,align:"center",cls:"op-grid__selcell"},K={field:p,width:44,align:"center",cls:"op-grid__actcell"},$="var(--op-grid-row-height, var(--op-row-height))",L=class extends M{baseCls="op-grid";store;offStore;headEl;headRow;viewport;emptyEl;table;pager;v;selected=new Set;active=-1;anchor=-1;justDragged=!1;cv=0;selAll;barEl;bulkEl;bulkCount;bulkBtns=[];selectAllBtn;rowMenu;colDd;colList;colSearch;colChips;colGroup="";cols(){let e=this.config;return[...e.checkboxSelection?[D]:[],...this.userCols(),...e.rowActions?.length?[K]:[]]}userCols(){return(this.config.columns??[]).filter(e=>!e.hidden)}visibleActions(){return this.config.rowActionsMode==="visible"&&!!this.config.rowActions?.length}mode(){return this.config.checkboxSelection?"multi":this.config.selection??"single"}build(){let e=this.config,i=d("div",this.baseCls);return this.headRow=d("div","op-grid__row op-grid__header-row",{role:"row"}),this.headEl=d("div","op-grid__header",{},this.headRow),this.viewport=d("div","op-grid__viewport"),this.emptyEl=d("div","op-grid__empty"),(e.columnMenu||e.bulkActions?.length)&&(this.bulkEl=d("div","op-grid__bulk"),this.bulkEl.hidden=!0,this.barEl=d("div","op-grid__bar",{},this.bulkEl),i.append(this.barEl)),this.table=d("div","op-grid__table",{role:"grid",tabindex:0,"aria-multiselectable":e.selection==="multi"||e.checkboxSelection?"true":null},this.headEl,this.viewport,this.emptyEl),i.append(this.table),i.classList.toggle("op-grid--striped",!!e.striped),e.paging&&(this.pager=new R({cls:"op-grid__pager"}),i.append(this.pager.el)),i}onRender(){let e=this.config;if(this.bindStore(e.store??new x({data:e.data??[]})),this.buildHeader(),this.buildBar(),this.v=T({scroller:this.viewport,count:this.store.count,rowHeight:e.rowHeight??(E(this.el,$)||36),render:(i,t)=>this.renderRow(i,t),rowCls:"op-grid__row op-grid__body-row"}),this.own(()=>this.v.destroy()),this.sync(),this.listen(this.viewport,"scroll",()=>this.headEl.scrollLeft=this.viewport.scrollLeft,{passive:!0}),this.listen(this.viewport,"click",i=>this.onRowEvent(i,"row-click")),this.listen(this.viewport,"dblclick",i=>this.onRowEvent(i,"row-dblclick")),this.listen(this.el,"keydown",i=>this.onKey(i)),this.listen(this.headRow,"change",i=>{i.target===this.selAll&&(this.selAll.checked?this.store.each(t=>this.selected.add(t)):this.config.keepSelection?this.store.each(t=>this.selected.delete(t)):this.selected.clear(),this.changed())}),e.reorderableColumns&&this.initColumnDrag(),e.resizableColumns&&this.initColumnResize(),this.listen(this.headRow,"click",i=>{if(this.justDragged||i.target.closest(".op-grid__resizer"))return;let t=i.target.closest("[data-field]"),s=t&&this.userCols().find(n=>n.field===t.dataset.field);s&&(this.emit("column-click",s),s.sortable&&this.sortBy(s))}),typeof ResizeObserver<"u"){let i=new ResizeObserver(()=>this.layout());i.observe(this.viewport),this.own(()=>i.disconnect())}this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(e.pageSize??20)),this.own(()=>this.pager?.destroy());for(let i of e.plugins??[]){let t=i.init(this);t&&this.own(t),i.destroy&&this.own(()=>i.destroy())}}cellAt(e){let i=e?.closest?.(".op-grid__body-row .op-grid__cell"),t=Number(i?.parentElement?.dataset.i),s=i&&this.cols()[Number(i.getAttribute("aria-colindex"))-1],n=i&&this.store.getAt(t);return s&&n&&![f,p].includes(s.field)?{index:t,record:n,column:s,el:i}:void 0}getCell(e,i){let t=this.cols().findIndex(s=>s.field===i);return document.getElementById(`${this.id}-r${e}`)?.querySelector(`[aria-colindex="${t+1}"]`)??void 0}getColumns(){return this.userCols()}getActive(){return this.active}notifyMount(){super.notifyMount(),this.layout(),this.pager?.notifyMount()}layout(){if(this.rendered){if(!this.config.rowHeight){let e=E(this.el,$);e&&this.v.setRowHeight(e)}this.headEl.style.paddingInlineEnd=`${this.viewport.offsetWidth-this.viewport.clientWidth}px`,this.v.refresh()}}bindStore(e){this.offStore?.(),this.store=e;let i=e.subscribe(s=>{this.rendered&&(this.sync(),s.type==="sort"&&this.paintSort())}),t=e.on("loading",s=>this.setLoading(s));this.offStore=()=>(i(),t()),this.own(()=>this.offStore?.())}sync(){let e=this.selected.size;if(!this.config.keepSelection)for(let i of this.selected)this.store.indexOf(i)<0&&this.selected.delete(i);this.active=Math.min(this.active,this.store.count-1),this.v.setCount(this.store.count),this.table.setAttribute("aria-rowcount",String(this.store.totalCount+1)),this.emptyEl.textContent=this.config.emptyText??u("empty"),this.emptyEl.hidden=this.store.count>0||!!this.config.loading,this.el.classList.toggle("is-empty",this.store.count===0),this.updateActiveDescendant(),this.paintSelection(),this.selected.size!==e&&this.emit("select",this.getSelection())}setStore(e){this.config.store=e,this.selected.clear(),this.active=this.anchor=-1,this.rendered&&(this.bindStore(e),this.pager?.setStore(e),this.paintSort(),this.sync())}getStore(){return this.render(),this.store}layoutColumns(){let e=this.cols(),i=this.visibleActions()?this.config.rowActions.length:1,t=n=>n.field===p?`calc(${i} * var(--op-grid-action-size) + ${i+1} * var(--op-grid-action-gap))`:`${n.width}px`,s=e.map(n=>n.field===p?t(n):n.width?`${n.width}px`:`minmax(${n.minWidth??96}px, ${n.flex??1}fr)`).join(" ");this.el.style.setProperty("--op-grid-cols",s),this.el.style.setProperty("--op-grid-min-width",`${e.reduce((n,o)=>n+(o.field===p?i*36:o.width??o.minWidth??96),0)}px`)}buildHeader(){let e=this.cols();this.layoutColumns(),this.el.classList.toggle("op-grid--actions-visible",this.visibleActions()),this.el.classList.toggle("op-grid--reorderable",!!this.config.reorderableColumns),this.el.classList.toggle("op-grid--resizable",!!this.config.resizableColumns),this.table.setAttribute("aria-colcount",String(e.length)),this.selAll=void 0,this.headRow.replaceChildren(...e.map((t,s)=>{let n=t.header??t.field,o=d("div",`op-grid__cell op-grid__hcell${t.align?` op-grid__cell--${t.align}`:""}${t.sortable?" is-sortable":""}`,{role:"columnheader","aria-colindex":s+1,"data-field":t.field});t.field===f?o.append(this.selAll=d("input","op-grid__check",{type:"checkbox","aria-label":u("gridSelectPage")})):t.field===p?o.append(d("span","op-sr-only",{},u("gridRowActions"))):t.sortable?o.append(d("button","op-grid__sort",{type:"button"},d("span","op-grid__label",{},n),d("span","op-grid__arrow",{"aria-hidden":"true"},C("arrow-up")))):o.append(d("span","op-grid__label",{},n));let r=t.field!==f&&t.field!==p;return this.config.reorderableColumns&&r&&o.classList.add("is-reorderable"),this.canResize(t)&&o.append(d("span","op-grid__resizer",{role:"separator","aria-orientation":"vertical","aria-label":`${u("gridResize")} ${n}`})),r&&!t.sortable&&(this.config.reorderableColumns||this.canResize(t))&&(o.tabIndex=0),o}));let i=this.groupBand(e);this.headEl.replaceChildren(...i?[i]:[],this.headRow),this.paintSort()}groupBand(e){if(this.config.groupHeaders===!1||!e.some(s=>s.group))return null;let i=[],t=0;for(;t<e.length;){let s=e[t].group??"",n=1;for(;t+n<e.length&&(e[t+n].group??"")===s;)n++;let o=d("div",`op-grid__gcell${s?"":" is-empty"}`,{role:"columnheader","aria-colindex":t+1,"aria-colspan":n},s);o.style.gridColumn=`span ${n}`,i.push(o),t+=n}return d("div","op-grid__row op-grid__group-row",{role:"row"},...i)}getColumnGroups(){return[...new Set(this.config.columns.map(e=>e.group).filter(e=>!!e))]}setColumnGroupVisible(e,i){let t=this.config.columns.filter(s=>(s.group??"")===e);if(t.length){for(let s of t)s.hidden=!i;this.config.columns.some(s=>!s.hidden)||(t[0].hidden=!1),this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}}setColumns(e){this.config.columns=e,this.rendered&&(this.cv++,this.buildHeader(),this.paintSelection(),this.v.refresh())}getColumnState(){return this.config.columns.map(e=>({field:e.field,hidden:!!e.hidden,width:e.width}))}setColumnState(e){let i=new Map(this.config.columns.map(s=>[s.field,s])),t=e.flatMap(s=>{let n=i.get(s.field);return i.delete(s.field),n?[{...n,hidden:s.hidden,width:s.width??n.width}]:[]});this.setColumns([...t,...i.values()]),this.emit("columns-change",this.getColumnState())}canResize(e){return!!this.config.resizableColumns&&e.field!==f&&e.field!==p&&e.resizable!==!1}setColumnWidth(e,i){let t=this.config.columns.find(s=>s.field===e);t&&(t.width=i==null?void 0:Math.round(Math.max(t.minWidth??48,Math.min(i,t.maxWidth??1/0))),this.layoutColumns(),this.emit("column-resize",e,t.width),this.emit("columns-change",this.getColumnState()))}initColumnResize(){let e=this.headRow;this.listen(e,"pointerdown",i=>{let t=i.target.closest(".op-grid__resizer");if(!t||i.button)return;i.preventDefault();let s=t.parentElement,n=s.dataset.field,o=this.config.columns.find(g=>g.field===n),r=i.clientX,l=s.getBoundingClientRect().width||o.width||96;this.el.classList.add("is-resizing");let h=o.width,c=g=>{let m=Math.round(Math.max(o.minWidth??48,Math.min(l+(g.clientX-r)*(this.dir()==="rtl"?-1:1),o.maxWidth??1/0)));o.width=h=m,this.layoutColumns()},a=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a),this.el.classList.remove("is-resizing"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),h!==void 0&&(this.emit("column-resize",n,h),this.emit("columns-change",this.getColumnState()))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",a),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a)))}),this.listen(e,"dblclick",i=>{let t=i.target.closest(".op-grid__resizer");t&&this.setColumnWidth(t.parentElement.dataset.field,void 0)}),this.listen(e,"keydown",i=>{if(!(i.altKey&&i.shiftKey)||i.key!=="ArrowLeft"&&i.key!=="ArrowRight")return;let t=i.target.closest(".op-grid__hcell"),s=t&&this.config.columns.find(o=>o.field===t.dataset.field);if(!t||!s||!this.canResize(s))return;i.preventDefault();let n=t.getBoundingClientRect().width||s.width||96;this.setColumnWidth(s.field,n+(i.key==="ArrowRight"?16:-16))})}dir(){return getComputedStyle(this.el).direction}moveColumn(e,i){let t=this.config.columns,s=t.find(a=>a.field===e);if(!s||e===i)return;let n=this.userCols(),o=n.indexOf(s),r=[...t.filter(a=>a!==s)],l=i==null?void 0:r.find(a=>a.field===i),h=n.filter(a=>a!==s).pop(),c=l?r.indexOf(l):h?r.indexOf(h)+1:r.length;r.splice(c,0,s),!r.every((a,g)=>a===t[g])&&(this.setColumns(r),this.emit("column-move",e,o,this.userCols().indexOf(s)),this.emit("columns-change",this.getColumnState()))}initColumnDrag(){let e=this.headRow,i=()=>Array.from(e.querySelectorAll(".is-reorderable"));this.listen(e,"pointerdown",t=>{let s=t.target.closest(".is-reorderable");if(!s||t.button||t.target.closest(".op-grid__resizer"))return;let n=s.dataset.field,o=t.clientX,r,l,h=null,c=g=>{if(!r){if(Math.abs(g.clientX-o)<6)return;r=d("div","op-grid__ghost",{},s.textContent??""),l=d("div","op-grid__drop"),this.el.append(r),this.headEl.append(l),s.classList.add("is-dragging-col")}r.style.left=`${g.clientX}px`,r.style.top=`${g.clientY}px`;let m=i(),b=m.find(B=>{let _=B.getBoundingClientRect();return g.clientX<_.left+_.width/2});h=b?b.dataset.field:null;let w=(b??m[m.length-1])?.getBoundingClientRect(),G=this.headEl.getBoundingClientRect();w&&l&&(l.style.left=`${(b?w.left:w.right)-G.left+this.headEl.scrollLeft}px`)},a=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a),r&&(r.remove(),l?.remove(),s.classList.remove("is-dragging-col"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),this.moveColumn(n,h))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",a),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a)))}),this.listen(e,"keydown",t=>{if(!t.altKey||t.shiftKey||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;let s=t.target.closest(".is-reorderable");if(!s)return;t.preventDefault();let n=this.userCols(),o=n.findIndex(h=>h.field===s.dataset.field),r=t.key==="ArrowLeft"?o-1:o+1;if(r<0||r>=n.length)return;this.moveColumn(n[o].field,t.key==="ArrowLeft"?n[r].field:n[r+1]?.field??null);let l=e.querySelector(`[data-field="${CSS.escape(n[o].field)}"]`);(l?.querySelector("button")??l)?.focus()})}paintSort(){let e=this.store.getSorters()[0];for(let i of Array.from(this.headRow.children)){let t=!!e&&i.dataset.field===e.field;i.classList.toggle("is-sorted-asc",t&&e.dir==="asc"),i.classList.toggle("is-sorted-desc",t&&e.dir==="desc"),i.classList.contains("is-sortable")&&i.setAttribute("aria-sort",t?e.dir==="asc"?"ascending":"descending":"none")}}sortBy(e){let i=this.store.getSorters()[0],t=i?.field===e.field?i.dir==="asc"?"desc":null:"asc";this.emit("before-sort",e.field,t)!==!1&&(this.store.sort(t?e.field:null,t??void 0),this.emit("sort",e.field,t))}rowIndexOffset(){return this.store.pageSize?(this.store.page-1)*this.store.pageSize:0}renderRow(e,i){let t=this.store.getAt(i);if(!t)return;let s=this.cols();e.id=`${this.id}-r${i}`,e.dataset.i=String(i),e.setAttribute("role","row"),e.setAttribute("aria-rowindex",String(this.rowIndexOffset()+i+2));let n=this.selected.has(t);e.setAttribute("aria-selected",this.mode()==="none"?"false":String(n)),e.classList.toggle("is-selected",n),e.classList.toggle("is-active",i===this.active),e.classList.toggle("is-odd",i%2===1),(e.dataset.cv!==String(this.cv)||e.children.length!==s.length)&&(e.dataset.cv=String(this.cv),e.replaceChildren(...s.map((o,r)=>d("div",`op-grid__cell${o.align?` op-grid__cell--${o.align}`:""}${o.cls?` ${o.cls}`:""}`,{role:"gridcell","aria-colindex":r+1})))),s.forEach((o,r)=>{let l=e.children[r];if(o.field===f){let c=l.firstElementChild??l.appendChild(d("input","op-grid__check",{type:"checkbox",tabindex:-1,"aria-label":u("gridSelectRow")}));c.checked=n;return}if(o.field===p){let c=this.config.rowActions??[];if(!this.visibleActions()){l.firstChild||l.append(d("button","op-grid__actbtn",{type:"button",tabindex:-1,"aria-label":u("gridRowActions"),"aria-haspopup":"menu"},C("more")));return}(l.children.length!==c.length||l.firstElementChild?.dataset.a==null)&&l.replaceChildren(...c.map((a,g)=>d("button",`op-grid__actbtn${a.variant==="danger"?" is-danger":""}`,{type:"button",tabindex:-1,"data-a":g,"aria-label":a.text,title:a.text},a.icon?C(a.icon):a.text))),c.forEach((a,g)=>l.children[g].disabled=!!a.disabled?.(t));return}let h=A(o,t);typeof h=="string"?l.textContent=h:l.replaceChildren(h)})}indexOfEvent(e){let i=e.target.closest(".op-grid__body-row");return i?Number(i.dataset.i):-1}onRowEvent(e,i){let t=this.indexOfEvent(e),s=this.store.getAt(t);if(s){if(i==="row-click"){let n=e.target.closest(".op-grid__actbtn");if(n){if(n.dataset.a==null)return this.openRowMenu(s,n);n.disabled||this.config.rowActions[Number(n.dataset.a)].handler(s,this);return}this.setActive(t,!1),this.pick(t,e)}this.emit(i,s,t,e)}}getSelection(){return[...this.selected]}select(e,i={}){let t=typeof e=="number"?this.store.getAt(e):e,s=this.mode();!t||s==="none"||((s==="single"||!i.add)&&this.selected.clear(),this.selected.add(t),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.v?.refresh(),this.paintSelection(),this.emit("select",this.getSelection())}selectAllFiltered(){if(this.mode()==="multi"){for(let e of this.store.getFiltered())this.selected.add(e);this.changed()}}pick(e,i){let t=this.mode(),s=this.store.getAt(e);if(!(!s||t==="none")){if(t==="multi"&&i.shiftKey&&this.anchor>=0){this.config.checkboxSelection||this.selected.clear();for(let n of this.store.getRange(Math.min(this.anchor,e),Math.max(this.anchor,e)+1))this.selected.add(n)}else t==="multi"&&(i.ctrlKey||i.metaKey||this.config.checkboxSelection)?(this.selected.delete(s)||this.selected.add(s),this.anchor=e):(this.selected.clear(),this.selected.add(s),this.anchor=e);this.changed()}}setActive(e,i=!0){this.active=e,i&&e>=0&&this.v.scrollTo(e),this.v.refresh(),this.updateActiveDescendant()}updateActiveDescendant(){this.active>=0&&this.active<this.store.count?this.table.setAttribute("aria-activedescendant",`${this.id}-r${this.active}`):this.table.removeAttribute("aria-activedescendant")}focusRow(e){this.render(),this.setActive(Math.max(0,Math.min(e,this.store.count-1))),this.table.focus()}focusEl(){return this.table}scrollToRow(e){this.v?.scrollTo(e)}onKey(e){let i=e.target;if(i.closest(".op-grid__header")||i!==this.table&&i.matches("input:not([type=checkbox]),textarea,select,[contenteditable]"))return;let t=this.store.count;if(!t)return;if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&this.active>=0&&this.config.rowActions?.length)return e.preventDefault(),this.openRowMenu(this.store.getAt(this.active),document.getElementById(`${this.id}-r${this.active}`)??this.el);let s=Math.max(1,Math.floor((this.viewport.clientHeight||400)/this.config.rowHeight||10)),n=this.active<0?0:this.active,o=this.mode(),r={ArrowDown:Math.min(t-1,this.active<0?0:n+1),ArrowUp:Math.max(0,n-1),Home:0,End:t-1,PageDown:Math.min(t-1,n+s),PageUp:Math.max(0,n-s)};if(e.key in r){e.preventDefault();let l=r[e.key];this.setActive(l),(o==="single"||o==="multi"&&!e.ctrlKey&&!e.metaKey&&!this.config.checkboxSelection)&&this.pick(l,e)}else e.key===" "&&this.active>=0?(e.preventDefault(),o==="multi"?this.pick(this.active,{ctrlKey:!0}):this.pick(this.active,e)):e.key==="Enter"&&this.active>=0?this.emit("row-activate",this.store.getAt(this.active),this.active):(e.key==="a"||e.key==="A")&&(e.ctrlKey||e.metaKey)&&o==="multi"&&(e.preventDefault(),this.store.each(l=>this.selected.add(l)),this.changed())}refresh(){this.v?.refresh()}buildBar(){let e=this.config;if(!this.barEl)return;this.bulkCount=d("span","op-grid__count",{"aria-live":"polite"}),this.selectAllBtn=new v({text:"",variant:"ghost",handler:()=>this.selectAllFiltered()}),this.bulkBtns=(e.bulkActions??[]).map(t=>new v({text:t.text,icon:t.icon,variant:t.variant==="danger"?"danger":"default",handler:()=>t.handler(this.getSelection(),this)}));let i=new v({text:u("gridClearSel"),variant:"ghost",handler:()=>this.deselectAll()});this.bulkEl.append(this.bulkCount,this.selectAllBtn.el,...this.bulkBtns.map(t=>t.el),i.el),this.own(()=>[this.selectAllBtn,...this.bulkBtns,i].forEach(t=>t?.destroy())),e.columnMenu&&this.buildColumnMenu(),this.paintSelection()}paintSelection(){if(!this.rendered)return;let e=this.store.count,i=0;if(this.store.each(n=>this.selected.has(n)&&i++),this.selAll&&(this.selAll.checked=e>0&&i===e,this.selAll.indeterminate=i>0&&i<e),!this.bulkEl)return;let t=this.selected.size;if(this.bulkEl.hidden=!t||!this.config.bulkActions?.length,this.bulkEl.hidden)return;this.bulkCount.textContent=u("gridSelected",{n:t});let s=this.store.getFiltered().length;this.selectAllBtn.el.hidden=!(this.mode()==="multi"&&i===e&&s>e&&t<s),this.selectAllBtn.setText(u("gridSelectAll",{n:s}))}openRowMenu(e,i){this.rowMenu??=new z({}),this.rowMenu.setItems((this.config.rowActions??[]).map(t=>({text:t.text,icon:t.icon,disabled:!!t.disabled?.(e),handler:()=>t.handler(e,this)}))),this.rowMenu.showBy(i)}buildColumnMenu(){let e=new v({text:u("gridColumns"),icon:"columns",variant:"ghost"});this.colSearch=new k({placeholder:u("gridColumnSearch"),clearable:!0}),this.colChips=d("div","op-grid__colchips",{role:"group","aria-label":u("gridGroups")}),this.colList=d("div","op-grid__collist",{role:"group","aria-label":u("gridColumns")});let i=d("div","op-grid__colempty",{},u("gridNoColumns"));i.hidden=!0;let t=d("div","op-grid__colmenu",{},this.colSearch.el,this.colChips,this.colList,i);this.colDd=new H({anchor:e.el,content:t,placement:"bottom-end",role:"dialog",autoFocus:!1}),this.barEl.append(e.el),this.own(()=>e.destroy());let s=()=>{let n=(this.colSearch.getValue()??"").toLowerCase(),o=0,r,l=0,h=()=>r&&(r.hidden=l===0);for(let c of Array.from(this.colList.children)){if(c.classList.contains("op-grid__colgroup")){h(),r=c,l=0;continue}let a=c.dataset.group??"",g=!this.colGroup||a===this.colGroup,m=!n||a.toLowerCase().includes(n)||c.textContent.toLowerCase().includes(n);c.hidden=!(g&&m),c.hidden||(o++,l++)}h(),i.hidden=o>0};this.colSearch.on("change",s),this.listen(this.colChips,"click",n=>{let o=n.target.closest("[data-g]");o&&(this.colGroup=o.dataset.g,this.paintColumnList(),s())}),e.on("click",()=>{if(this.colDd.isOpen())return this.colDd.close();this.colSearch.setValue(""),this.colGroup="",this.paintColumnList(),this.colDd.open(),this.colList.querySelector("input")?.focus()}),this.listen(this.colList,"change",n=>{let o=n.target;if(o.dataset.groupToggle!=null)this.setColumnGroupVisible(o.dataset.groupToggle,o.checked);else{let r=this.config.columns.find(l=>l.field===o.value);if(!r)return;r.hidden=!o.checked,this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}this.paintColumnList(),s()})}paintColumnList(){let e=this.config.columns,i=this.getColumnGroups(),t=this.userCols().length===1?this.userCols()[0]:null,s=o=>{let r=d("input","op-grid__check",{type:"checkbox",value:o.field});return r.checked=!o.hidden,r.disabled=o===t,d("label","op-grid__colitem",{"data-group":o.group??""},r,d("span","",{},o.header??o.field))};if(this.colChips.hidden=i.length<2,this.colChips.replaceChildren(...[["",u("gridGroupAll")],...i.map(o=>[o,o])].map(([o,r])=>d("button",`op-grid__colchip${this.colGroup===o?" is-on":""}`,{type:"button","data-g":o,"aria-pressed":String(this.colGroup===o)},r))),!i.length)return this.colList.replaceChildren(...e.map(s));let n=[];for(let o of[...i,""]){let r=e.filter(c=>(c.group??"")===o);if(!r.length)continue;let l=r.filter(c=>!c.hidden).length,h=d("input","op-grid__check",{type:"checkbox","data-group-toggle":o,"aria-label":o||u("gridOtherCols")});h.checked=l===r.length,h.indeterminate=l>0&&l<r.length,n.push(d("div","op-grid__colgroup",{"data-group":o},d("label","",{},h,d("span","",{},o||u("gridOtherCols"))),d("span","op-grid__colcount",{},`${l}/${r.length}`)),...r.map(s))}this.colList.replaceChildren(...n)}onDestroy(){this.pager?.destroy(),this.rowMenu?.destroy(),this.colDd?.destroy(),this.colSearch?.destroy()}};S("grid",L);export{L as a};
|
|
2
|
-
//# sourceMappingURL=chunk-YF75HKL6.js.map
|