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
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,62 @@ and the project uses [Semantic Versioning](https://semver.org/). Until 1.0, mino
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.5.0] - 2026-11-11
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `optikos/build`: one `FieldSpec[]` list gives the grid columns (`buildColumns`, `buildGrid`), the form (`buildFields`,
|
|
13
|
+
`buildForm`, groups become fieldsets) and the filter fields (`buildFilterFields`).
|
|
14
|
+
- `timeEntry()` (a Timeline plugin): create, move, resize and remove entries by pointer or keyboard, with snapping,
|
|
15
|
+
overlap control, locked entries, a total per lane against a `target`, and `before-*` / `create` / `change` / `remove` / `edit` events.
|
|
16
|
+
- `grouping({ controls, choices })`: expand all, collapse all and a "Group by" menu as icon buttons inside the grid, beside the
|
|
17
|
+
pager (and the `exportBar()` buttons, which share the row); each one switchable. Icons `expand`, `collapse`.
|
|
18
|
+
- `exportBar()` (a Grid plugin): CSV, Excel, this-page and Print buttons inside the grid, in one row with the pager, each
|
|
19
|
+
one switchable; `exportGrid` / `printGrid` still work from your own buttons. New icons `download`, `printer`, `table`.
|
|
20
|
+
- Column `format: 'duration'` (minutes as `7h 30m`) and `FieldSpec` type `duration`, so totals of time spent read "Sum 72h".
|
|
21
|
+
- Timeline `direction: 'vertical'` (range mode: time runs top to bottom, one column per lane); `timeEntry()` works on it too.
|
|
22
|
+
- `timeEntry({ form })`: your own dialog fills a new entry and edits one.
|
|
23
|
+
- `columnTotals()` (a Grid plugin): a button on each column header opens a menu of totals (sum, average, minimum, maximum,
|
|
24
|
+
count, your own); the choice shows in a bar under the grid, over every filtered row, or (`show: 'modal' | 'toast'`) as a one-off answer; `position: 'top'` puts the bar under the header. The grid fires `header-paint`.
|
|
25
|
+
- Column `summary` on dates: `min` (earliest), `max` (latest) and `count`.
|
|
26
|
+
|
|
27
|
+
## [0.4.0] - 2026-11-10
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- Window token `--op-window-max-height`. The default is now `85dvh` (was the full viewport height minus a small
|
|
32
|
+
margin), so a long dialog keeps breathing room and scrolls inside.
|
|
33
|
+
- TimeField (`timefield`, `ui.time`): a time of day as `'HH:mm'`, typed (`930`) or stepped with ↑/↓, with `min`/`max`/`step`.
|
|
34
|
+
- `defineTheme` accepts the key `base` beside variants (`radius: { base: '8px', sm: '4px' }`).
|
|
35
|
+
- A lookup filter may be a field instance, not only a config.
|
|
36
|
+
- ImageField (`imagefield`): picks one or more images by click or drop, with previews, `accept`, `maxSize`, `maxFiles`,
|
|
37
|
+
a `reject` event and URLs of images already saved.
|
|
38
|
+
- ImageCanvas (`imagecanvas`): shows an image with zoom and pan (buttons, keys, Ctrl+wheel, double click, pinch).
|
|
39
|
+
- Carousel (`carousel`): a scroll-snap row of any components with arrows, dots, `perView`, `loop` and an autoplay that
|
|
40
|
+
stops on use and respects `prefers-reduced-motion`.
|
|
41
|
+
- Back-office set: **Chart** (bar, line, area, pie, donut, sparkline, fed by a Store), **Stat** (KPI tile), **Timeline** (event log and schedule), **Avatar**, **Image**, **MaskField**, **DateTimeField**.
|
|
42
|
+
- `NumberField`: `format: 'currency' | 'percent'` through `Intl`, `currency`, `locale`, and `scale` (cents as an integer); `setCurrency()`.
|
|
43
|
+
- Permissions: `setPermissionResolver`, `setPermissionMode` and `permission` / `permissionMode` on components, menu and NavMenu items, command palette commands, grid columns and actions.
|
|
44
|
+
- `form.setErrors({ 'items.0.name': '…' })` for server errors by dotted path; `displayFrom` and `setValue({ value, label })` so a lookup shows its text from the loaded record.
|
|
45
|
+
- Live data: `store.applyPatches()` and `store.connect(source)`; `store.fetchAll()` reads every page of a remote store.
|
|
46
|
+
- `exportGrid` (CSV, xlsx) and `printGrid`; print styles in the core.
|
|
47
|
+
- `persistState(key)` (a Grid plugin) and `setStateStorage` / `loadState` / `saveState` for per-user state.
|
|
48
|
+
- `shortcuts`: global and per-screen shortcuts with a help panel on `?`.
|
|
49
|
+
- `Window.confirmDiscard`.
|
|
50
|
+
- `defineTheme`: `seeds` (a light and dark theme from two colors), `fonts` (`@font-face`), `loadFonts`; `checkContrast()`; chart colors `--op-chart-1…8`.
|
|
51
|
+
- `optikos/dev` (warns about ignored config options) and `optikos/testing` (test helpers for apps); `TabPanelConfig` types the tab options of any container.
|
|
52
|
+
- Docs: the back-office recipes guide and the `panel` demo.
|
|
53
|
+
- Grid, Ext parity: `grouping()` (group headers, counts, totals through `Column.summary`), `treeGrid()` (a tree column over flat records with `parentId`, lazy `load`, `flattenTree`), `rowEditing()` (a whole row under a Save / Cancel bar), locked columns (`Column.locked`, `setColumnLocked`, kept in `getColumnState`) and `Grid.setRowLayout()` for plugins that add rows of their own.
|
|
54
|
+
- `optikos/bind`: `viewModel` (data, formulas, a linked record), `bindVM` (`'{record.name}'` bindings) and `bindForm` (a form bound to a record, both ways). New guide and `docs/internal/paridade-ext.md`.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- Window stays on screen when its content grows after opening (a FieldList gaining rows, a step change): it re-centers,
|
|
59
|
+
or, once dragged, moves up just enough to fit. Before, it grew past the bottom of the viewport with no way to scroll.
|
|
60
|
+
- `new Component({ renderTo })` mounts like `create` does (it was ignored), and `config.type` is set on instances made with `new`.
|
|
61
|
+
- Menu items typed from a variable (`const items = [{ text: 'a' }, '-']`) no longer need a cast.
|
|
62
|
+
- StepForm review: a FieldList shows one line per row with what the user sees, instead of `[object Object]`.
|
|
63
|
+
|
|
8
64
|
## [0.3.0] - 2026-11-10
|
|
9
65
|
|
|
10
66
|
### Added
|
|
@@ -157,7 +213,8 @@ First public release.
|
|
|
157
213
|
`corporate`, `soft`, `brutal`, `terminal`, `editorial` and `brand`.
|
|
158
214
|
- Per-component entry points (`optikos/components/<name>`) and stylesheets (`optikos/css/<name>.css`).
|
|
159
215
|
|
|
160
|
-
[Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.
|
|
216
|
+
[Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.4.0...HEAD
|
|
217
|
+
[0.4.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...v0.4.0
|
|
161
218
|
[0.3.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.2.0...v0.3.0
|
|
162
219
|
[0.2.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.1.0...v0.2.0
|
|
163
220
|
[0.1.0]: https://github.com/Denis-Zickuhr/optikos/releases/tag/v0.1.0
|
package/dist/bind.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-4C666HHU.js";var
|
|
1
|
+
import{a as M,b as k}from"./chunk-V5G5JECN.js";import"./chunk-4C666HHU.js";var x=e=>!!e&&typeof e.set=="function"&&"data"in e;function S(e={}){let n=structuredClone(e.data??{}),t=new Map,r=new Map,s=new Map,i=new Map,c=o=>t.get(o)??(t.set(o,l(0)),t.get(o)),u={get(o){c(o)();let d=o.split(".")[0];if(e.formulas&&d in e.formulas){let f=i.get(d);return f||i.set(d,f=b(()=>e.formulas[d](u.get))),M({[d]:f()},o)}return M(n,o)},set(o,d){let[f,...g]=o.split(".");if(e.formulas&&f in e.formulas)throw new Error(`Optikos viewModel: "${f}" is a formula and cannot be set`);let p=r.get(f);p&&g.length===1?p.set(g[0],d):k(n,o,d);for(let[y,T]of t)(y===o||y.startsWith(`${o}.`)||o.startsWith(`${y}.`))&&T.update(m=>m+1)},link(o,d){x(d)?(r.set(o,d),n[o]=d.data):(r.delete(o),n[o]=d),(s.get(o)??(s.set(o,l(0)),s.get(o))).update(f=>f+1);for(let[f,g]of t)(f===o||f.startsWith(`${o}.`))&&g.update(p=>p+1)},linked:o=>(s.get(o)??(s.set(o,l(0)),s.get(o)))()};return u}function V(e,n){let t=/^\{(!?)([\w.]+)\}$/.exec(n);return t?()=>t[1]?!e.get(t[2]):e.get(t[2]):()=>n.replace(/\{([\w.]+)\}/g,(r,s)=>String(e.get(s)??""))}function $(e,n,t){let r={};for(let i in t)r[i]=V(n,t[i]);v(e,r);let s=/^\{([\w.]+)\}$/.exec(t.value??"");s&&e.own(e.on("change",i=>n.set(s[1],i)))}function C(e,n,t="record"){for(let r of e.getFields()){if(!r.name)continue;let s=-1,i=`${t}.${r.name}`;e.own(w(()=>{let c=n.linked(t),u=n.get(i);r.setValue(u===void 0?r.getValue():u,!0),c!==s&&(r.markClean(),s=c)})),e.own(r.on("change",c=>n.get(t)&&n.set(i,c)))}}var a;function l(e){let n=e,t=new Set,r=(()=>(a&&(t.add(a),a.deps.add(t)),n));return r.set=s=>{if(!Object.is(s,n)){n=s;for(let i of[...t])i.run()}},r.update=s=>r.set(s(n)),r}function w(e){let n,t={deps:new Set,run(){for(let s of t.deps)s.delete(t);t.deps.clear(),n?.();let r=a;a=t;try{n=e()}finally{a=r}}};return t.run(),()=>{for(let r of t.deps)r.delete(t);t.deps.clear(),n?.()}}function b(e){let n=l(void 0);return w(()=>n.set(e())),n}function F(e){let n=l(0);return e.subscribe(()=>n.update(t=>t+1)),()=>(n(),e)}function v(e,n){for(let t in n){let r=`set${t[0].toUpperCase()}${t.slice(1)}`,s=e[r];if(typeof s!="function")throw new Error(`Optikos bind: ${e.constructor.name} has no ${r}()`);let i=n[t];e.own(w(()=>{s.call(e,i())}));let c=i.set;t==="value"&&c&&e.own(e.on("change",u=>c(u)))}}export{v as bind,C as bindForm,$ as bindVM,b as computed,w as effect,F as fromStore,l as signal,S as viewModel};
|
|
2
2
|
//# sourceMappingURL=bind.js.map
|
package/dist/bind.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/bind/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
|
|
3
|
+
"sources": ["../src/bind/viewmodel.ts", "../src/bind/index.ts"],
|
|
4
|
+
"sourcesContent": ["// The Ext-style ViewModel on top of the signals: shared data, formulas, a linked record, and `{path}` bindings for components.\nimport type { Component } from '../core/component';\nimport type { Field } from '../core/field';\nimport type { Model } from '../data/model';\nimport { getPath, setPath } from '../core/path';\nimport { signal, computed, effect, bind } from './index';\n\nexport interface ViewModelConfig {\n /** The starting data, nested as you like (`{ qty: 2, record: { name: 'Ada' } }`). */\n data?: Record<string, any>;\n /** Values computed from the data and each other: `{ total: (get) => get('qty') * get('price') }`. They are read like data (`get('total')`) and rerun when what they read changes. */\n formulas?: Record<string, (get: <T = any>(path: string) => T) => unknown>;\n}\n\nexport interface ViewModel {\n /** Reads a dotted path. Inside an `effect`, `computed` or `bind` it makes the reader rerun when that path changes. */\n get<T = any>(path: string): T;\n /** Writes a dotted path and notifies whoever read it, or something under it, or above it. A formula cannot be written. */\n set(path: string, value: unknown): void;\n /** Makes `name` stand for a record (a Model, or a plain object): `link('record', grid.getSelection()[0])`. A write to `record.x` goes through `model.set`, so the record is marked modified. `null` clears it. */\n link(name: string, record: Model | Record<string, any> | null): void;\n /** Counts the `link` calls for `name` (reactive): a form uses it to know it was given a new record. */\n linked(name: string): number;\n}\n\nconst isModel = (v: unknown): v is Model => !!v && typeof (v as Model).set === 'function' && 'data' in (v as object);\n\n/** Shared state for a screen: the Ext `ViewModel` subset that matters (data, formulas, a linked record) without the rest. */\nexport function viewModel(config: ViewModelConfig = {}): ViewModel {\n const data: Record<string, any> = structuredClone(config.data ?? {});\n const versions = new Map<string, ReturnType<typeof signal<number>>>();\n const models = new Map<string, Model>();\n const links = new Map<string, ReturnType<typeof signal<number>>>();\n const formulas = new Map<string, () => unknown>();\n const sig = (path: string) => versions.get(path) ?? (versions.set(path, signal(0)), versions.get(path)!);\n\n const vm: ViewModel = {\n get(path) {\n sig(path)();\n const root = path.split('.')[0];\n if (config.formulas && root in config.formulas) {\n let f = formulas.get(root);\n if (!f) formulas.set(root, (f = computed(() => config.formulas)));\n return getPath({ [root]: f() }, path);\n }\n return getPath(data, path);\n },\n set(path, value) {\n const [root, ...rest] = path.split('.');\n if (config.formulas && root in config.formulas) throw new Error(`Optikos viewModel: \"${root}\" is a formula and cannot be set`);\n const model = models.get(root);\n if (model && rest.length === 1) model.set(rest[0], value);\n else setPath(data, path, value);\n for (const [p, s] of versions) if (p === path || p.startsWith(`${path}.`) || path.startsWith(`${p}.`)) s.update((n) => n + 1);\n },\n link(name, record) {\n if (isModel(record)) (models.set(name, record), (data[name] = record.data));\n else (models.delete(name), (data[name] = record));\n (links.get(name) ?? (links.set(name, signal(0)), links.get(name)!)).update((n) => n + 1);\n for (const [p, s] of versions) if (p === name || p.startsWith(`${name}.`)) s.update((n) => n + 1);\n },\n linked: (name) => (links.get(name) ?? (links.set(name, signal(0)), links.get(name)!))(),\n };\n return vm;\n}\n\n/**\n * What a binding string means: `'{record.name}'` is that value as it is (`'{!busy}'` its negation), anything else is a\n * template (`'Hello {record.name}'`).\n */\nfunction source(vm: ViewModel, spec: string): () => unknown {\n const whole = /^\\{(!?)([\\w.]+)\\}$/.exec(spec);\n if (whole) return () => (whole[1] ? !vm.get(whole[2]) : vm.get(whole[2]));\n return () => spec.replace(/\\{([\\w.]+)\\}/g, (_, p) => String(vm.get(p) ?? ''));\n}\n\n/**\n * Ext's `bind: { text: '{record.name}', disabled: '{!canSave}' }` for any component: each key calls its setter whenever\n * what the string reads changes. A field's `value: '{record.name}'` is two ways: the field's `change` writes back.\n */\nexport function bindVM(cmp: Component<any>, vm: ViewModel, map: Record<string, string>): void {\n const sources: Record<string, () => unknown> = {};\n for (const key in map) sources[key] = source(vm, map[key]);\n bind(cmp, sources);\n const two = /^\\{([\\w.]+)\\}$/.exec(map.value ?? '');\n if (two) cmp.own(cmp.on('change', (v) => vm.set(two[1], v)));\n}\n\n/**\n * Binds every named field of a form to `record.<name>` of the view model, both ways. When the record is replaced (`link`)\n * the form is loaded from it and becomes clean; a change in the form writes through to the record (a Model is marked modified).\n */\nexport function bindForm(form: Component<any> & { getFields(): Array<Field<any>> }, vm: ViewModel, name = 'record'): void {\n for (const f of form.getFields()) {\n if (!f.name) continue;\n let seen = -1;\n const path = `${name}.${f.name}`;\n form.own(\n effect(() => {\n const gen = vm.linked(name);\n const v = vm.get(path);\n f.setValue(v === undefined ? f.getValue() : v, true);\n if (gen !== seen) (f.markClean(), (seen = gen));\n }),\n );\n form.own(f.on('change', (v) => vm.get(name) && vm.set(path, v)));\n }\n}\n", "// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n\nexport { viewModel, bindVM, bindForm, type ViewModel, type ViewModelConfig } from './viewmodel';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isModel", "v", "viewModel", "config", "data", "versions", "models", "links", "formulas", "sig", "path", "signal", "vm", "root", "computed", "getPath", "value", "rest", "model", "setPath", "p", "s", "n", "name", "record", "source", "spec", "whole", "_", "bindVM", "cmp", "map", "sources", "key", "bind", "two", "bindForm", "form", "f", "seen", "effect", "gen", "running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
|
|
7
7
|
}
|
package/dist/build.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a,b,c,d,e}from"./chunk-632LUU52.js";import"./chunk-4OB2IM5L.js";import"./chunk-UCWICDYG.js";import"./chunk-OADWLPSF.js";import"./chunk-ADHKL2GM.js";import"./chunk-2I7HDIOU.js";import"./chunk-SEUIIPHS.js";import"./chunk-BRGT4O6Q.js";import"./chunk-3OA3P37P.js";import"./chunk-QOSTS5I3.js";import"./chunk-TVO3Z2BM.js";import"./chunk-G26R2F3W.js";import"./chunk-6TZJO2G2.js";import"./chunk-S3ILIWSW.js";import"./chunk-BTGJ3MP4.js";import"./chunk-AJN66F32.js";import"./chunk-L6DOWGBO.js";import"./chunk-H25XXQVH.js";import"./chunk-5GCTM37D.js";import"./chunk-NAUSRVB6.js";import"./chunk-EO777UIN.js";import"./chunk-FSR6BDVO.js";import"./chunk-J5BZAKC6.js";import"./chunk-T5OGUCY2.js";import"./chunk-OB3VIRQR.js";import"./chunk-GEJKFE4X.js";import"./chunk-LXWCTCZV.js";import"./chunk-JBOKM5YA.js";import"./chunk-Z6HZY2YG.js";import"./chunk-U25QSLAH.js";import"./chunk-HRW25TMU.js";import"./chunk-3F4MN2BU.js";import"./chunk-SEW5OCQF.js";import"./chunk-LHWY6G6Q.js";import"./chunk-MQEALOU3.js";import"./chunk-6NP4AEV4.js";import"./chunk-AQ3RTHG5.js";import"./chunk-BCVOUMJJ.js";import"./chunk-ESRS5ZQV.js";import"./chunk-DIOJGTUN.js";import"./chunk-2GKIF7A6.js";import"./chunk-OWEQT2HN.js";import"./chunk-BQEFLPDA.js";import"./chunk-QVBDBGS4.js";import"./chunk-E4VNLYO2.js";import"./chunk-676AKAGF.js";import"./chunk-VV7CFMPZ.js";import"./chunk-TIPK3SCJ.js";import"./chunk-UDXO3KM3.js";import"./chunk-PZSHOSOS.js";import"./chunk-IODSL7KU.js";import"./chunk-XFDNXSU5.js";import"./chunk-L5SQQFO7.js";import"./chunk-3VDLX7ET.js";import"./chunk-S4QD5NID.js";import"./chunk-6NCXO5ZP.js";import"./chunk-4AA4FQEM.js";import"./chunk-2UPUC4RK.js";import"./chunk-V5G5JECN.js";import"./chunk-4C666HHU.js";export{a as buildColumns,b as buildFields,c as buildFilterFields,e as buildForm,d as buildGrid};
|
|
2
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{b as S}from"./chunk-MGSCSS7X.js";import{a as A}from"./chunk-JBOKM5YA.js";import{a as E}from"./chunk-MQEALOU3.js";import{c as T}from"./chunk-DIOJGTUN.js";import{b as d}from"./chunk-PZSHOSOS.js";import{b as _}from"./chunk-IODSL7KU.js";import{b as L}from"./chunk-XFDNXSU5.js";import{e as h,f as c}from"./chunk-S4QD5NID.js";h("en",{ctActions:"Column actions: {col}",ctNone:"No total",ctSum:"Sum",ctAvg:"Average",ctMin:"Minimum",ctMax:"Maximum",ctCount:"Count",ctEarliest:"Earliest",ctLatest:"Latest",ctTotals:"Totals",ctResult:"{op} of {col}: {value}",ctRows:"{n} rows"});h("pt-BR",{ctActions:"A\xE7\xF5es da coluna: {col}",ctNone:"Sem total",ctSum:"Soma",ctAvg:"M\xE9dia",ctMin:"M\xEDnimo",ctMax:"M\xE1ximo",ctCount:"Contagem",ctEarliest:"Mais antiga",ctLatest:"Mais recente",ctTotals:"Totais",ctResult:"{op} de {col}: {value}",ctRows:"{n} linhas"});var O=["sum","avg","min","max","count"],k={sum:"ctSum",avg:"ctAvg",min:"ctMin",max:"ctMax",count:"ctCount"},I={number:O,date:["min","max","count"],text:["count"]},q=(i,s)=>{let n=s.map(m=>m.data[i.field]).find(m=>m!=null&&m!=="");return n instanceof Date||typeof n=="string"&&/^\d{4}-\d{2}-\d{2}/.test(n)?"date":typeof n=="number"||typeof n=="string"&&n.trim()!==""&&!isNaN(Number(n))?"number":"text"};function D(i={}){return{init(s){let n=d("div","op-columntotals",{role:"group","aria-label":c("ctTotals")});n.hidden=!0;let m=new E({}),g=s.getStore(),f=()=>g.getFiltered(),v=i.operations??[],b=t=>typeof t.summary=="function"?v.find(l=>l.run===t.summary)?.text:t.summary&&c(k[t.summary]),x=(t,l)=>{let e=_(t,l);return t.summaryRenderer?t.summaryRenderer(e,t):e==null?"":t.format&&typeof t.summary!="function"&&t.summary!=="count"?L(t.format,e):String(e)};function R(t,l){let e=f(),o={...t,summary:l},a=x(o,e),u=c("ctResult",{op:b(o)??"",col:t.header??t.field,value:typeof a=="string"?a:a.textContent??""}),r=c("ctRows",{n:e.length});i.show==="toast"?S({type:"info",title:u,text:r}):A.alert(`${u}
|
|
2
|
+
${r}`,{title:c("ctTotals"),icon:"info"})}function p(){let t=s.getColumns();if(n.hidden=(i.show??"bar")!=="bar"||!t.some(o=>o.summary),n.hidden)return;let l=f(),e=o=>{let a=d("div","op-columntotals__cell"+(o?.align?` op-columntotals__cell--${o.align}`:""),C?{role:"gridcell"}:{});return o?.summary&&a.append(d("span","op-columntotals__op",{},b(o)??""),x(o,l)),a};n.replaceChildren(...s.config.checkboxSelection?[e()]:[],...t.map(e),...s.config.rowActions?.length?[e()]:[])}function N(t,l){let e=q(t,f()),o=i.show===void 0||i.show==="bar",a=r=>{if(!o)return R(t,r);t.summary=t.summary===r?void 0:r,p()},u=r=>o?t.summary===r:void 0;m.setItems([...I[e].map(r=>({text:e==="date"&&r!=="count"?c(r==="min"?"ctEarliest":"ctLatest"):c(k[r]),checked:u(r),handler:()=>a(r)})),...v.map(r=>({text:r.text,checked:u(r.run),handler:()=>a(r.run)})),...o?["-",{text:c("ctNone"),disabled:!t.summary,handler:()=>a(t.summary)}]:[]]),m.showBy(l)}function M(){let t=s.getColumns();for(let l of Array.from(s.el.querySelectorAll(".op-grid__hcell[data-field]"))){let e=t.find(a=>a.field===l.dataset.field);if(!e)continue;let o=d("button","op-columntotals__btn",{type:"button","aria-haspopup":"menu","aria-label":c("ctActions",{col:e.header??e.field})},T("more"));for(let a of["click","pointerdown","keydown"])o.addEventListener(a,u=>u.stopPropagation());o.addEventListener("click",()=>N(e,o)),l.append(o)}p()}let C=i.position==="top";C?(n.classList.add("op-columntotals--top"),n.setAttribute("role","row"),s.el.querySelector(".op-grid__header").after(n)):s.el.querySelector(".op-grid__table").after(n);let y=s.el.querySelector(".op-grid__viewport"),w=()=>n.scrollLeft=y.scrollLeft;y.addEventListener("scroll",w);let B=[s.on("header-paint",M),g.subscribe(p)];return M(),()=>{B.forEach(t=>t()),y.removeEventListener("scroll",w),m.destroy(),n.remove()}}}}export{D as a};
|
|
3
|
+
//# sourceMappingURL=chunk-2CVMT3IW.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/columntotals/columntotals.ts"],
|
|
4
|
+
"sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { format } from '../../../data/format';\nimport { summarize, type Column } from '../../../data/column';\nimport type { Model } from '../../../data/model';\nimport { Menu } from '../../overlays/menu/menu';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\nimport { toast } from '../../overlays/toast/toast';\nimport { iconEl } from '../../base/icon/icon';\nimport type { Grid, GridPlugin } from '../grid/grid';\n\naddMessages('en', { ctActions: 'Column actions: {col}', ctNone: 'No total', ctSum: 'Sum', ctAvg: 'Average', ctMin: 'Minimum', ctMax: 'Maximum', ctCount: 'Count', ctEarliest: 'Earliest', ctLatest: 'Latest', ctTotals: 'Totals', ctResult: '{op} of {col}: {value}', ctRows: '{n} rows' });\naddMessages('pt-BR', { ctActions: 'A\u00E7\u00F5es da coluna: {col}', ctNone: 'Sem total', ctSum: 'Soma', ctAvg: 'M\u00E9dia', ctMin: 'M\u00EDnimo', ctMax: 'M\u00E1ximo', ctCount: 'Contagem', ctEarliest: 'Mais antiga', ctLatest: 'Mais recente', ctTotals: 'Totais', ctResult: '{op} de {col}: {value}', ctRows: '{n} linhas' });\n\n/** An operation offered in the column menu besides the built-in ones. */\nexport interface TotalOperation {\n text: string;\n /** The column's values and the records of every filtered row. */\n run: (values: any[], recs: Model[]) => unknown;\n}\n\nexport interface ColumnTotalsOptions {\n /** Your own operations (a median, a weighted mean...). Offered on every column. */\n operations?: TotalOperation[];\n /**\n * Where the answer goes: `'bar'` (default) keeps it in a bar under the grid; `'modal'` answers in a dialog and `'toast'` in a\n * notice, once, and nothing stays on the grid.\n */\n show?: 'bar' | 'modal' | 'toast';\n /** `bar` only: under the grid (default) or `'top'`, right under the header, above the rows (a row of the grid itself). */\n position?: 'bottom' | 'top';\n}\n\ntype Kind = 'number' | 'date' | 'text';\nconst BUILT_IN = ['sum', 'avg', 'min', 'max', 'count'] as const;\nconst LABEL = { sum: 'ctSum', avg: 'ctAvg', min: 'ctMin', max: 'ctMax', count: 'ctCount' } as const;\nconst FOR: Record<Kind, readonly (typeof BUILT_IN)[number][]> = { number: BUILT_IN, date: ['min', 'max', 'count'], text: ['count'] };\n\nconst kindOf = (col: Column, recs: Model[]): Kind => {\n const v = recs.map((r) => r.data[col.field]).find((x) => x != null && x !== '');\n if (v instanceof Date || (typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(v))) return 'date';\n return typeof v === 'number' || (typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v))) ? 'number' : 'text';\n};\n\n/**\n * A button on every column header opens a menu of totals (sum, average, minimum, maximum, count, your own); the choice\n * shows in a bar under the grid, over every filtered row. A column's `summary` is where it starts and where it is kept.\n */\nexport function columnTotals(options: ColumnTotalsOptions = {}): GridPlugin {\n return {\n init(grid: Grid) {\n const bar = h('div', 'op-columntotals', { role: 'group', 'aria-label': t('ctTotals') });\n bar.hidden = true;\n const menu = new Menu({});\n const store = grid.getStore();\n const rows = () => store.getFiltered();\n const custom = options.operations ?? [];\n const active = (col: Column) => (typeof col.summary === 'function' ? custom.find((o) => o.run === col.summary)?.text : col.summary && t(LABEL[col.summary as keyof typeof LABEL]));\n\n const valueOf = (c: Column, recs: Model[]) => {\n const v = summarize(c, recs);\n return c.summaryRenderer ? c.summaryRenderer(v, c) : v == null ? '' : c.format && typeof c.summary !== 'function' && c.summary !== 'count' ? format(c.format, v) : String(v);\n };\n\n /** `modal` and `toast`: the answer for one choice, without touching the column. */\n function announce(col: Column, summary: Column['summary']) {\n const recs = rows();\n const once = { ...col, summary };\n const value = valueOf(once, recs);\n const text = t('ctResult', { op: active(once) ?? '', col: col.header ?? col.field, value: typeof value === 'string' ? value : value.textContent ?? '' });\n const detail = t('ctRows', { n: recs.length });\n if (options.show === 'toast') toast({ type: 'info', title: text, text: detail });\n else void MessageBox.alert(`${text}\\n${detail}`, { title: t('ctTotals'), icon: 'info' });\n }\n\n function paintBar() {\n const cols = grid.getColumns();\n bar.hidden = (options.show ?? 'bar') !== 'bar' || !cols.some((c) => c.summary);\n if (bar.hidden) return;\n const recs = rows();\n const cell = (c?: Column) => {\n const el = h('div', 'op-columntotals__cell' + (c?.align ? ` op-columntotals__cell--${c.align}` : ''), top ? { role: 'gridcell' } : {});\n if (c?.summary) el.append(h('span', 'op-columntotals__op', {}, active(c) ?? ''), valueOf(c, recs));\n return el;\n };\n bar.replaceChildren(...(grid.config.checkboxSelection ? [cell()] : []), ...cols.map(cell), ...(grid.config.rowActions?.length ? [cell()] : []));\n }\n\n function open(col: Column, btn: HTMLElement) {\n const kind = kindOf(col, rows());\n const bar_ = options.show === undefined || options.show === 'bar';\n const pick = (summary: Column['summary']) => {\n if (!bar_) return announce(col, summary);\n col.summary = col.summary === summary ? undefined : summary;\n paintBar();\n };\n const checked = (summary: Column['summary']) => (bar_ ? col.summary === summary : undefined);\n menu.setItems([\n ...FOR[kind].map((op) => ({ text: kind === 'date' && op !== 'count' ? t(op === 'min' ? 'ctEarliest' : 'ctLatest') : t(LABEL[op]), checked: checked(op), handler: () => pick(op) })),\n ...custom.map((o) => ({ text: o.text, checked: checked(o.run), handler: () => pick(o.run) })),\n ...(bar_ ? ['-', { text: t('ctNone'), disabled: !col.summary, handler: () => pick(col.summary) }] : []),\n ]);\n menu.showBy(btn);\n }\n\n function paintHeader() {\n const cols = grid.getColumns();\n for (const cell of Array.from(grid.el.querySelectorAll<HTMLElement>('.op-grid__hcell[data-field]'))) {\n const col = cols.find((c) => c.field === cell.dataset.field);\n if (!col) continue;\n const btn = h('button', 'op-columntotals__btn', { type: 'button', 'aria-haspopup': 'menu', 'aria-label': t('ctActions', { col: col.header ?? col.field }) }, iconEl('more'));\n // the header cell sorts and drags: the button must not start either\n for (const ev of ['click', 'pointerdown', 'keydown']) btn.addEventListener(ev, (e) => e.stopPropagation());\n btn.addEventListener('click', () => open(col, btn));\n cell.append(btn);\n }\n paintBar();\n }\n\n const top = options.position === 'top';\n if (top) {\n bar.classList.add('op-columntotals--top');\n bar.setAttribute('role', 'row');\n grid.el.querySelector('.op-grid__header')!.after(bar);\n } else grid.el.querySelector('.op-grid__table')!.after(bar);\n const viewport = grid.el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const follow = () => (bar.scrollLeft = viewport.scrollLeft);\n viewport.addEventListener('scroll', follow);\n const offs = [grid.on('header-paint', paintHeader), store.subscribe(paintBar)];\n paintHeader();\n return () => {\n offs.forEach((off) => off());\n viewport.removeEventListener('scroll', follow);\n menu.destroy();\n bar.remove();\n };\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "BUILT_IN", "LABEL", "FOR", "kindOf", "col", "recs", "v", "r", "x", "columnTotals", "options", "grid", "bar", "h", "t", "menu", "Menu", "store", "rows", "custom", "active", "o", "valueOf", "c", "summarize", "format", "announce", "summary", "once", "value", "text", "detail", "toast", "MessageBox", "paintBar", "cols", "cell", "el", "top", "open", "btn", "kind", "bar_", "pick", "checked", "op", "paintHeader", "iconEl", "ev", "e", "viewport", "follow", "offs", "off"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as l}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{d as l}from"./chunk-S4QD5NID.js";import{a as m}from"./chunk-4C666HHU.js";var w={};m(w,{addDays:()=>D,addMonths:()=>y,firstDay:()=>h,formatDate:()=>d,fromISO:()=>s,parseDate:()=>p,toISO:()=>o,today:()=>f});var u=(t,n=2)=>String(t).padStart(n,"0"),o=t=>`${u(t.getFullYear(),4)}-${u(t.getMonth()+1)}-${u(t.getDate())}`;function s(t){let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return null;let e=new Date(+n[1],+n[2]-1,+n[3]);return e.getMonth()===+n[2]-1&&e.getDate()===+n[3]?e:null}var f=()=>o(new Date);function D(t,n){let e=s(t);return e.setDate(e.getDate()+n),o(e)}function y(t,n){let e=s(t),g=e.getDate();return e.setDate(1),e.setMonth(e.getMonth()+n),e.setDate(Math.min(g,new Date(e.getFullYear(),e.getMonth()+1,0).getDate())),o(e)}var d=(t,n={dateStyle:"short"})=>{let e=s(t);return e?new Intl.DateTimeFormat(l()._lang,n).format(e):""};function p(t){if(t=t.trim(),!t)return null;let n=s(t);if(n)return o(n);let e=t.split(/[/.\-\s]+/).map(Number);if(e.length!==3||e.some(a=>!Number.isInteger(a)))return null;let g=new Intl.DateTimeFormat(l()._lang).formatToParts(new Date(2e3,10,25)).filter(a=>a.type==="day"||a.type==="month"||a.type==="year").map(a=>a.type),r={};g.forEach((a,c)=>r[a]=e[c]),r.year<100&&(r.year+=2e3);let i=new Date(r.year,r.month-1,r.day);return i.getFullYear()===r.year&&i.getMonth()===r.month-1&&i.getDate()===r.day?o(i):null}function h(){let t=l();if(t._firstDay&&t._firstDay!=="0")return Number(t._firstDay);try{let n=new Intl.Locale(t._lang).getWeekInfo?.()??new Intl.Locale(t._lang).weekInfo;if(n?.firstDay)return n.firstDay%7}catch{}return 0}export{o as a,s as b,f as c,D as d,y as e,d as f,p as g,h,w as i};
|
|
2
|
+
//# sourceMappingURL=chunk-2GKIF7A6.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as m}from"./chunk-U25QSLAH.js";import{b as f}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{b as p}from"./chunk-PZSHOSOS.js";import{e as d,f as l}from"./chunk-S4QD5NID.js";d("en",{wDockLeft:"Dock to the left",wDockRight:"Dock to the right",wDockTop:"Dock to the top",wDockBottom:"Dock to the bottom",wResize:"Resize"});d("pt-BR",{wDockLeft:"Fixar \xE0 esquerda",wDockRight:"Fixar \xE0 direita",wDockTop:"Fixar em cima",wDockBottom:"Fixar embaixo",wResize:"Redimensionar"});var v=160,w={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},y={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},b=["right","left","top","bottom"],a=class extends m{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;grip;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:w[o],label:l(y[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.setResizable(!!e.resizable),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!b.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of b)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e));this.paintGrip()}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.paintGrip(),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.paintGrip(),this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=h=>this.moveTo(h.clientX-o,h.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}setResizable(e){if(this.config.resizable=e,!this.rendered||(this.grip?.remove(),this.grip=void 0,!e||this.config.floating===!1))return;let t=this.grip=p("div","op-widget__resize",{role:"separator",tabindex:0,"aria-label":l("wResize")});this.el.append(t),this.listen(t,"pointerdown",i=>{if(i.button)return;i.preventDefault();let o=this.el.getBoundingClientRect(),s=i.clientX,n=i.clientY;this.el.classList.add("is-resizing");let r=c=>this.resizeBy(o,c.clientX-s,c.clientY-n),h=()=>{this.el.classList.remove("is-resizing"),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",h)};document.addEventListener("pointermove",r),document.addEventListener("pointerup",h),this.own(h)}),this.listen(t,"keydown",i=>{let o=i.shiftKey?64:16,s={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]};!s[i.key]||i.altKey||(i.preventDefault(),this.resizeBy(this.el.getBoundingClientRect(),...s[i.key]))}),this.paintGrip()}resizeBy(e,t,i){let o=(n,r)=>Math.round(Math.max(v,Math.min(n,r)));if(this.pos)t&&(this.el.style.width=`${o(e.width+t,innerWidth-this.pos.x)}px`),i&&(this.el.style.height=`${o(e.height+i,innerHeight-this.pos.y)}px`);else{let n=this.getSide(),r=n==="left"||n==="right",h=n==="right"?-t:n==="left"?t:n==="bottom"?-i:i;this.setSize(o((r?e.width:e.height)+h,(r?innerWidth:innerHeight)-32))}this.paintGrip();let s=this.el.getBoundingClientRect();this.emit("resize",{width:Math.round(s.width),height:Math.round(s.height)})}paintGrip(){let e=this.grip;if(!e)return;let t=this.getSide(),i=!!this.pos||t==="left"||t==="right",o=this.el.getBoundingClientRect();e.setAttribute("aria-orientation",i?"vertical":"horizontal"),e.setAttribute("aria-valuemin",String(v)),e.setAttribute("aria-valuenow",String(Math.round(i?o.width:o.height)))}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,f(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),e.tabIndex<0&&!e.hasAttribute("tabindex")&&(e.tabIndex=-1),(this.config.autoFocus&&u(this.getBody())[0]||e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};g("widget",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-2I4Y7I7C.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as m}from"./chunk-QVBDBGS4.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as p}from"./chunk-6NCXO5ZP.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-2I7HDIOU.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/dev.ts"],
|
|
4
|
+
"sourcesContent": ["/** True while developing: on localhost, or when `globalThis.__OPTIKOS_DEV__` says so. Dev-only warnings follow it. */\nexport const isDev = (): boolean => {\n const flag = (globalThis as { __OPTIKOS_DEV__?: boolean }).__OPTIKOS_DEV__;\n if (flag !== undefined) return flag;\n return typeof location !== 'undefined' && /^(localhost|127\\.0\\.0\\.1|\\[::1\\]|.*\\.local)$/.test(location.hostname);\n};\n"],
|
|
5
|
+
"mappings": "AACO,IAAMA,EAAQ,IAAe,CAClC,IAAMC,EAAQ,WAA6C,gBAC3D,OAAIA,IAAS,OAAkBA,EACxB,OAAO,SAAa,KAAe,+CAA+C,KAAK,SAAS,QAAQ,CACjH",
|
|
6
|
+
"names": ["isDev", "flag"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as b}from"./chunk-IODSL7KU.js";var U={csv:"text/csv;charset=utf-8",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},y=new TextEncoder,T=t=>typeof t=="string"?t:t.textContent??"",E=t=>/[",\n\r;]/.test(t)?`"${t.replace(/"/g,'""')}"`:t,A=t=>/^[=+@]/.test(t)||/^-[^\d.,]/.test(t)?`'${t}`:t;function k(t,r){let e=t.getColumns();return{head:e.map(n=>n.header??n.field),rows:r.map(n=>e.map(o=>{let c=n.data[o.field];return typeof c=="number"&&!o.format&&!o.renderer?c:A(T(b(o,n)))}))}}var w=(()=>{let t=Array.from({length:256},(r,e)=>{for(let n=0;n<8;n++)e=e&1?3988292384^e>>>1:e>>>1;return e>>>0});return r=>{let e=-1;for(let n of r)e=t[(e^n)&255]^e>>>8;return~e>>>0}})();function C(t){let r=[],e=[],n=0,o=(p,l,a)=>p.setUint32(l,a,!0);for(let[p,l]of Object.entries(t)){let a=y.encode(p),i=y.encode(l),u=new Uint8Array(30+a.length),f=new DataView(u.buffer);o(f,0,67324752),f.setUint16(4,20,!0),f.setUint16(6,2048,!0),o(f,14,w(i)),o(f,18,i.length),o(f,22,i.length),f.setUint16(26,a.length,!0),u.set(a,30);let g=new Uint8Array(46+a.length),h=new DataView(g.buffer);o(h,0,33639248),h.setUint16(4,20,!0),h.setUint16(6,20,!0),h.setUint16(8,2048,!0),o(h,16,w(i)),o(h,20,i.length),o(h,24,i.length),h.setUint16(28,a.length,!0),o(h,42,n),g.set(a,46),e.push(g),r.push(u,i),n+=u.length+i.length}let c=e.reduce((p,l)=>p+l.length,0),s=new Uint8Array(22),m=new DataView(s.buffer);o(m,0,101010256),m.setUint16(8,e.length,!0),m.setUint16(10,e.length,!0),o(m,12,c),o(m,16,n);let d=new Uint8Array(n+c+22),x=0;for(let p of[...r,...e,s])d.set(p,x),x+=p.length;return d}var S=t=>t.replace(/[&<>"]/g,r=>`&#${r.charCodeAt(0)};`).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g,""),v=(t,r)=>{let e="";for(let n=t+1;n>0;n=Math.floor((n-1)/26))e=String.fromCharCode(65+(n-1)%26)+e;return e+(r+1)};function R(t,r){let e=(c,s,m,d=!1)=>typeof c=="number"?`<c r="${v(s,m)}"><v>${c}</v></c>`:`<c r="${v(s,m)}" t="inlineStr"${d?' s="1"':""}><is><t xml:space="preserve">${S(c)}</t></is></c>`,o={"[Content_Types].xml":'<?xml version="1.0" encoding="UTF-8"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/></Types>',"_rels/.rels":'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>',"xl/workbook.xml":'<?xml version="1.0" encoding="UTF-8"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets></workbook>',"xl/_rels/workbook.xml.rels":'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/></Relationships>',"xl/styles.xml":'<?xml version="1.0" encoding="UTF-8"?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="2"><font><sz val="11"/><name val="Calibri"/></font><font><b/><sz val="11"/><name val="Calibri"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border/></borders><cellStyleXfs count="1"><xf/></cellStyleXfs><cellXfs count="2"><xf/><xf fontId="1" applyFont="1"/></cellXfs></styleSheet>',"xl/worksheets/sheet1.xml":`<?xml version="1.0" encoding="UTF-8"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData>${[t,...r].map((c,s)=>`<row r="${s+1}">${c.map((m,d)=>e(m,d,s,s===0)).join("")}</row>`).join("")}</sheetData></worksheet>`};return new Blob([C(o)],{type:U.xlsx})}async function O(t,r={}){let{format:e="csv",filename:n="export",scope:o="all",download:c=!0}=r,s=t.getStore(),m=o==="page"?s.getRange():await s.fetchAll(r.pageSize),{head:d,rows:x}=k(t,m),p=e==="xlsx"?R(d,x):new Blob(["\uFEFF"+[d,...x].map(l=>l.map(a=>E(String(a))).join(",")).join(`\r
|
|
2
|
+
`)],{type:U.csv});if(c){let l=document.createElement("a");l.href=URL.createObjectURL(p),l.download=`${n}.${e}`,document.body.append(l),l.click(),l.remove(),setTimeout(()=>URL.revokeObjectURL(l.href),1e3)}return p}async function $(t,r={}){let e=t.getStore(),n=r.scope==="page"?e.getRange():await e.fetchAll(r.pageSize),{head:o,rows:c}=k(t,n),s=document.createElement("div");s.className="op-print-sheet";let m=(a,i)=>Object.assign(document.createElement(a),{textContent:String(i)}),d=(a,i)=>{let u=document.createElement("tr");return u.append(...i.map(f=>m(a,f))),u},x=document.createElement("table"),p=document.createElement("thead");p.append(d("th",o));let l=document.createElement("tbody");l.append(...c.map(a=>d("td",a))),x.append(p,l),r.title&&s.append(Object.assign(document.createElement("h1"),{textContent:r.title})),s.append(x),document.body.append(s),document.documentElement.classList.add("op-printing"),await new Promise(a=>{let i=()=>{window.removeEventListener("afterprint",i),s.remove(),document.documentElement.classList.remove("op-printing"),a()};window.addEventListener("afterprint",i),window.print(),typeof matchMedia!="function"&&setTimeout(i,0)})}export{O as a,$ as b};
|
|
3
|
+
//# sourceMappingURL=chunk-34KVSA2V.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/gridexport/gridexport.ts"],
|
|
4
|
+
"sourcesContent": ["// Grid export as CSV or Excel (.xlsx), without a library: the columns the user sees, in their order, as shown (formats applied).\nimport { cellContent } from '../../../data/column';\nimport type { Model } from '../../../data/model';\nimport type { Grid } from '../grid/grid';\n\nexport interface ExportOptions {\n format?: 'csv' | 'xlsx';\n /** File name without extension. Default `export`. */\n filename?: string;\n /** `all` (default): every record that matches the sort and filters, across pages (a remote store is read through its proxy). `page`: what the grid shows now. */\n scope?: 'all' | 'page';\n /** Page size for reading a remote store. Default 500. */\n pageSize?: number;\n /** `false` only builds the file and returns it. Default true: the browser downloads it. */\n download?: boolean;\n}\n\nconst MIME = { csv: 'text/csv;charset=utf-8', xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' };\nconst enc = new TextEncoder();\n\nconst textOf = (v: string | Node) => (typeof v === 'string' ? v : (v.textContent ?? ''));\nconst csvCell = (s: string) => (/[\",\\n\\r;]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s);\n// a cell starting with = + - @ would run as a formula in a spreadsheet\nconst safe = (s: string) => (/^[=+@]/.test(s) || /^-[^\\d.,]/.test(s) ? `'${s}` : s);\n\nfunction table(grid: Grid, recs: Model[]): { head: string[]; rows: Array<Array<string | number>> } {\n const cols = grid.getColumns();\n return {\n head: cols.map((c) => c.header ?? c.field),\n rows: recs.map((r) =>\n cols.map((c) => {\n const raw = r.data[c.field];\n // a number nobody formatted stays a number in Excel\n return typeof raw === 'number' && !c.format && !c.renderer ? raw : safe(textOf(cellContent(c, r)));\n }),\n ),\n };\n}\n\nconst crc = (() => {\n const t = Array.from({ length: 256 }, (_, n) => {\n for (let k = 0; k < 8; k++) n = n & 1 ? 0xedb88320 ^ (n >>> 1) : n >>> 1;\n return n >>> 0;\n });\n return (b: Uint8Array) => {\n let c = ~0;\n for (const x of b) c = t[(c ^ x) & 255] ^ (c >>> 8);\n return ~c >>> 0;\n };\n})();\n\n/** A zip with the files stored uncompressed: all an .xlsx needs. */\nfunction zip(files: Record<string, string>): Uint8Array {\n const parts: Uint8Array[] = [];\n const central: Uint8Array[] = [];\n let offset = 0;\n const u32 = (v: DataView, o: number, n: number) => v.setUint32(o, n, true);\n for (const [name, text] of Object.entries(files)) {\n const nameB = enc.encode(name);\n const data = enc.encode(text);\n const head = new Uint8Array(30 + nameB.length);\n const v = new DataView(head.buffer);\n u32(v, 0, 0x04034b50);\n v.setUint16(4, 20, true);\n v.setUint16(6, 0x800, true); // UTF-8 names\n u32(v, 14, crc(data));\n u32(v, 18, data.length);\n u32(v, 22, data.length);\n v.setUint16(26, nameB.length, true);\n head.set(nameB, 30);\n const entry = new Uint8Array(46 + nameB.length);\n const e = new DataView(entry.buffer);\n u32(e, 0, 0x02014b50);\n e.setUint16(4, 20, true);\n e.setUint16(6, 20, true);\n e.setUint16(8, 0x800, true);\n u32(e, 16, crc(data));\n u32(e, 20, data.length);\n u32(e, 24, data.length);\n e.setUint16(28, nameB.length, true);\n u32(e, 42, offset);\n entry.set(nameB, 46);\n central.push(entry);\n parts.push(head, data);\n offset += head.length + data.length;\n }\n const size = central.reduce((n, c) => n + c.length, 0);\n const end = new Uint8Array(22);\n const v = new DataView(end.buffer);\n u32(v, 0, 0x06054b50);\n v.setUint16(8, central.length, true);\n v.setUint16(10, central.length, true);\n u32(v, 12, size);\n u32(v, 16, offset);\n const all = new Uint8Array(offset + size + 22);\n let at = 0;\n for (const p of [...parts, ...central, end]) (all.set(p, at), (at += p.length));\n return all;\n}\n\nconst xml = (s: string) => s.replace(/[&<>\"]/g, (c) => `&#${c.charCodeAt(0)};`).replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]/g, '');\nconst ref = (col: number, row: number) => {\n let s = '';\n for (let n = col + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s;\n return s + (row + 1);\n};\n\nfunction xlsx(head: string[], rows: Array<Array<string | number>>): Blob {\n const cell = (v: string | number, c: number, r: number, bold = false) =>\n typeof v === 'number' ? `<c r=\"${ref(c, r)}\"><v>${v}</v></c>` : `<c r=\"${ref(c, r)}\" t=\"inlineStr\"${bold ? ' s=\"1\"' : ''}><is><t xml:space=\"preserve\">${xml(v)}</t></is></c>`;\n const lines = [head, ...rows].map((row, r) => `<row r=\"${r + 1}\">${row.map((v, c) => cell(v, c, r, r === 0)).join('')}</row>`);\n const files = {\n '[Content_Types].xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/><Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/><Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/></Types>',\n '_rels/.rels': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/></Relationships>',\n 'xl/workbook.xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><sheets><sheet name=\"Sheet1\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>',\n 'xl/_rels/workbook.xml.rels': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/></Relationships>',\n 'xl/styles.xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><fonts count=\"2\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font><font><b/><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts><fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills><borders count=\"1\"><border/></borders><cellStyleXfs count=\"1\"><xf/></cellStyleXfs><cellXfs count=\"2\"><xf/><xf fontId=\"1\" applyFont=\"1\"/></cellXfs></styleSheet>',\n 'xl/worksheets/sheet1.xml': `<?xml version=\"1.0\" encoding=\"UTF-8\"?><worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><sheetData>${lines.join('')}</sheetData></worksheet>`,\n };\n return new Blob([zip(files) as BlobPart], { type: MIME.xlsx });\n}\n\n/**\n * Exports a grid: the visible columns in their current order, values as shown (money, dates...), the current sort and filters.\n * Resolves with the file; downloads it unless `download: false`.\n */\nexport async function exportGrid(grid: Grid, o: ExportOptions = {}): Promise<Blob> {\n const { format = 'csv', filename = 'export', scope = 'all', download = true } = o;\n const store = grid.getStore();\n const recs = scope === 'page' ? store.getRange() : await store.fetchAll(o.pageSize);\n const { head, rows } = table(grid, recs);\n const blob =\n format === 'xlsx'\n ? xlsx(head, rows)\n : // the BOM makes Excel read UTF-8\n new Blob(['\uFEFF' + [head, ...rows].map((r) => r.map((v) => csvCell(String(v))).join(',')).join('\\r\\n')], { type: MIME.csv });\n if (download) {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${filename}.${format}`;\n document.body.append(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n }\n return blob;\n}\n\nexport interface PrintOptions {\n /** A heading above the table. */\n title?: string;\n /** `all` (default) prints every record that matches the filters, which the virtual list on screen does not render. */\n scope?: 'all' | 'page';\n pageSize?: number;\n}\n\n/**\n * Prints a grid as a plain table: every row, the visible columns, the header repeated on each page, and none of the\n * application around it. Resolves after the print dialog closed.\n */\nexport async function printGrid(grid: Grid, o: PrintOptions = {}): Promise<void> {\n const store = grid.getStore();\n const recs = o.scope === 'page' ? store.getRange() : await store.fetchAll(o.pageSize);\n const { head, rows } = table(grid, recs);\n const sheet = document.createElement('div');\n sheet.className = 'op-print-sheet';\n const cell = (tag: 'th' | 'td', v: string | number) => Object.assign(document.createElement(tag), { textContent: String(v) });\n const tr = (tag: 'th' | 'td', cells: Array<string | number>) => {\n const row = document.createElement('tr');\n row.append(...cells.map((v) => cell(tag, v)));\n return row;\n };\n const el = document.createElement('table');\n const thead = document.createElement('thead');\n thead.append(tr('th', head));\n const tbody = document.createElement('tbody');\n tbody.append(...rows.map((r) => tr('td', r)));\n el.append(thead, tbody);\n if (o.title) sheet.append(Object.assign(document.createElement('h1'), { textContent: o.title }));\n sheet.append(el);\n document.body.append(sheet);\n document.documentElement.classList.add('op-printing');\n await new Promise<void>((done) => {\n const finish = () => {\n window.removeEventListener('afterprint', finish);\n sheet.remove();\n document.documentElement.classList.remove('op-printing');\n done();\n };\n window.addEventListener('afterprint', finish);\n window.print();\n // some browsers return from print() without the event\n if (typeof matchMedia !== 'function') setTimeout(finish, 0);\n });\n}\n"],
|
|
5
|
+
"mappings": "wCAiBA,IAAMA,EAAO,CAAE,IAAK,yBAA0B,KAAM,mEAAoE,EAClHC,EAAM,IAAI,YAEVC,EAAUC,GAAsB,OAAOA,GAAM,SAAWA,EAAKA,EAAE,aAAe,GAC9EC,EAAWC,GAAe,YAAY,KAAKA,CAAC,EAAI,IAAIA,EAAE,QAAQ,KAAM,IAAI,CAAC,IAAMA,EAE/EC,EAAQD,GAAe,SAAS,KAAKA,CAAC,GAAK,YAAY,KAAKA,CAAC,EAAI,IAAIA,CAAC,GAAKA,EAEjF,SAASE,EAAMC,EAAYC,EAAwE,CACjG,IAAMC,EAAOF,EAAK,WAAW,EAC7B,MAAO,CACL,KAAME,EAAK,IAAKC,GAAMA,EAAE,QAAUA,EAAE,KAAK,EACzC,KAAMF,EAAK,IAAKG,GACdF,EAAK,IAAKC,GAAM,CACd,IAAME,EAAMD,EAAE,KAAKD,EAAE,KAAK,EAE1B,OAAO,OAAOE,GAAQ,UAAY,CAACF,EAAE,QAAU,CAACA,EAAE,SAAWE,EAAMP,EAAKJ,EAAOY,EAAYH,EAAGC,CAAC,CAAC,CAAC,CACnG,CAAC,CACH,CACF,CACF,CAEA,IAAMG,GAAO,IAAM,CACjB,IAAM,EAAI,MAAM,KAAK,CAAE,OAAQ,GAAI,EAAG,CAACC,EAAGC,IAAM,CAC9C,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAKD,EAAIA,EAAI,EAAI,WAAcA,IAAM,EAAKA,IAAM,EACvE,OAAOA,IAAM,CACf,CAAC,EACD,OAAQE,GAAkB,CACxB,IAAIR,EAAI,GACR,QAAWS,KAAKD,EAAGR,EAAI,GAAGA,EAAIS,GAAK,GAAG,EAAKT,IAAM,EACjD,MAAO,CAACA,IAAM,CAChB,CACF,GAAG,EAGH,SAASU,EAAIC,EAA2C,CACtD,IAAMC,EAAsB,CAAC,EACvBC,EAAwB,CAAC,EAC3BC,EAAS,EACPC,EAAM,CAACvB,EAAawB,EAAWV,IAAcd,EAAE,UAAUwB,EAAGV,EAAG,EAAI,EACzE,OAAW,CAACW,EAAMC,CAAI,IAAK,OAAO,QAAQP,CAAK,EAAG,CAChD,IAAMQ,EAAQ7B,EAAI,OAAO2B,CAAI,EACvBG,EAAO9B,EAAI,OAAO4B,CAAI,EACtBG,EAAO,IAAI,WAAW,GAAKF,EAAM,MAAM,EACvC3B,EAAI,IAAI,SAAS6B,EAAK,MAAM,EAClCN,EAAIvB,EAAG,EAAG,QAAU,EACpBA,EAAE,UAAU,EAAG,GAAI,EAAI,EACvBA,EAAE,UAAU,EAAG,KAAO,EAAI,EAC1BuB,EAAIvB,EAAG,GAAIY,EAAIgB,CAAI,CAAC,EACpBL,EAAIvB,EAAG,GAAI4B,EAAK,MAAM,EACtBL,EAAIvB,EAAG,GAAI4B,EAAK,MAAM,EACtB5B,EAAE,UAAU,GAAI2B,EAAM,OAAQ,EAAI,EAClCE,EAAK,IAAIF,EAAO,EAAE,EAClB,IAAMG,EAAQ,IAAI,WAAW,GAAKH,EAAM,MAAM,EACxCI,EAAI,IAAI,SAASD,EAAM,MAAM,EACnCP,EAAIQ,EAAG,EAAG,QAAU,EACpBA,EAAE,UAAU,EAAG,GAAI,EAAI,EACvBA,EAAE,UAAU,EAAG,GAAI,EAAI,EACvBA,EAAE,UAAU,EAAG,KAAO,EAAI,EAC1BR,EAAIQ,EAAG,GAAInB,EAAIgB,CAAI,CAAC,EACpBL,EAAIQ,EAAG,GAAIH,EAAK,MAAM,EACtBL,EAAIQ,EAAG,GAAIH,EAAK,MAAM,EACtBG,EAAE,UAAU,GAAIJ,EAAM,OAAQ,EAAI,EAClCJ,EAAIQ,EAAG,GAAIT,CAAM,EACjBQ,EAAM,IAAIH,EAAO,EAAE,EACnBN,EAAQ,KAAKS,CAAK,EAClBV,EAAM,KAAKS,EAAMD,CAAI,EACrBN,GAAUO,EAAK,OAASD,EAAK,MAC/B,CACA,IAAMI,EAAOX,EAAQ,OAAO,CAACP,EAAGN,IAAMM,EAAIN,EAAE,OAAQ,CAAC,EAC/CyB,EAAM,IAAI,WAAW,EAAE,EACvBjC,EAAI,IAAI,SAASiC,EAAI,MAAM,EACjCV,EAAIvB,EAAG,EAAG,SAAU,EACpBA,EAAE,UAAU,EAAGqB,EAAQ,OAAQ,EAAI,EACnCrB,EAAE,UAAU,GAAIqB,EAAQ,OAAQ,EAAI,EACpCE,EAAIvB,EAAG,GAAIgC,CAAI,EACfT,EAAIvB,EAAG,GAAIsB,CAAM,EACjB,IAAMY,EAAM,IAAI,WAAWZ,EAASU,EAAO,EAAE,EACzCG,EAAK,EACT,QAAW,IAAK,CAAC,GAAGf,EAAO,GAAGC,EAASY,CAAG,EAAIC,EAAI,IAAI,EAAGC,CAAE,EAAIA,GAAM,EAAE,OACvE,OAAOD,CACT,CAEA,IAAME,EAAOlC,GAAcA,EAAE,QAAQ,UAAYM,GAAM,KAAKA,EAAE,WAAW,CAAC,CAAC,GAAG,EAAE,QAAQ,4CAA6C,EAAE,EACjI6B,EAAM,CAACC,EAAaC,IAAgB,CACxC,IAAIrC,EAAI,GACR,QAAS,EAAIoC,EAAM,EAAG,EAAI,EAAG,EAAI,KAAK,OAAO,EAAI,GAAK,EAAE,EAAGpC,EAAI,OAAO,aAAa,IAAO,EAAI,GAAK,EAAG,EAAIA,EAC1G,OAAOA,GAAKqC,EAAM,EACpB,EAEA,SAASC,EAAKX,EAAgBY,EAA2C,CACvE,IAAMC,EAAO,CAAC1C,EAAoBQ,EAAWC,EAAWkC,EAAO,KAC7D,OAAO3C,GAAM,SAAW,SAASqC,EAAI7B,EAAGC,CAAC,CAAC,QAAQT,CAAC,WAAa,SAASqC,EAAI7B,EAAGC,CAAC,CAAC,kBAAkBkC,EAAO,SAAW,EAAE,gCAAgCP,EAAIpC,CAAC,CAAC,gBAE1JmB,EAAQ,CACZ,sBAAuB,ypBACvB,cAAe,yRACf,kBAAmB,6QACnB,6BAA8B,yZAC9B,gBAAiB,2gBACjB,2BAA4B,iIAPhB,CAACU,EAAM,GAAGY,CAAI,EAAE,IAAI,CAACF,EAAK9B,IAAM,WAAWA,EAAI,CAAC,KAAK8B,EAAI,IAAI,CAACvC,EAAGQ,IAAMkC,EAAK1C,EAAGQ,EAAGC,EAAGA,IAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAOwC,KAAK,EAAE,CAAC,0BAC7K,EACA,OAAO,IAAI,KAAK,CAACS,EAAIC,CAAK,CAAa,EAAG,CAAE,KAAMtB,EAAK,IAAK,CAAC,CAC/D,CAMA,eAAsB+C,EAAWvC,EAAYmB,EAAmB,CAAC,EAAkB,CACjF,GAAM,CAAE,OAAAqB,EAAS,MAAO,SAAAC,EAAW,SAAU,MAAAC,EAAQ,MAAO,SAAAC,EAAW,EAAK,EAAIxB,EAC1EyB,EAAQ5C,EAAK,SAAS,EACtBC,EAAOyC,IAAU,OAASE,EAAM,SAAS,EAAI,MAAMA,EAAM,SAASzB,EAAE,QAAQ,EAC5E,CAAE,KAAAK,EAAM,KAAAY,CAAK,EAAIrC,EAAMC,EAAMC,CAAI,EACjC4C,EACJL,IAAW,OACPL,EAAKX,EAAMY,CAAI,EAEf,IAAI,KAAK,CAAC,SAAM,CAACZ,EAAM,GAAGY,CAAI,EAAE,IAAKhC,GAAMA,EAAE,IAAKT,GAAMC,EAAQ,OAAOD,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK;AAAA,CAAM,CAAC,EAAG,CAAE,KAAMH,EAAK,GAAI,CAAC,EAC9H,GAAImD,EAAU,CACZ,IAAMG,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAO,IAAI,gBAAgBD,CAAI,EACjCC,EAAE,SAAW,GAAGL,CAAQ,IAAID,CAAM,GAClC,SAAS,KAAK,OAAOM,CAAC,EACtBA,EAAE,MAAM,EACRA,EAAE,OAAO,EACT,WAAW,IAAM,IAAI,gBAAgBA,EAAE,IAAI,EAAG,GAAI,CACpD,CACA,OAAOD,CACT,CAcA,eAAsBE,EAAU/C,EAAYmB,EAAkB,CAAC,EAAkB,CAC/E,IAAMyB,EAAQ5C,EAAK,SAAS,EACtBC,EAAOkB,EAAE,QAAU,OAASyB,EAAM,SAAS,EAAI,MAAMA,EAAM,SAASzB,EAAE,QAAQ,EAC9E,CAAE,KAAAK,EAAM,KAAAY,CAAK,EAAIrC,EAAMC,EAAMC,CAAI,EACjC+C,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,iBAClB,IAAMX,EAAO,CAACY,EAAkBtD,IAAuB,OAAO,OAAO,SAAS,cAAcsD,CAAG,EAAG,CAAE,YAAa,OAAOtD,CAAC,CAAE,CAAC,EACtHuD,EAAK,CAACD,EAAkBE,IAAkC,CAC9D,IAAMjB,EAAM,SAAS,cAAc,IAAI,EACvC,OAAAA,EAAI,OAAO,GAAGiB,EAAM,IAAKxD,GAAM0C,EAAKY,EAAKtD,CAAC,CAAC,CAAC,EACrCuC,CACT,EACMkB,EAAK,SAAS,cAAc,OAAO,EACnCC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,OAAOH,EAAG,KAAM1B,CAAI,CAAC,EAC3B,IAAM8B,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,OAAO,GAAGlB,EAAK,IAAKhC,GAAM8C,EAAG,KAAM9C,CAAC,CAAC,CAAC,EAC5CgD,EAAG,OAAOC,EAAOC,CAAK,EAClBnC,EAAE,OAAO6B,EAAM,OAAO,OAAO,OAAO,SAAS,cAAc,IAAI,EAAG,CAAE,YAAa7B,EAAE,KAAM,CAAC,CAAC,EAC/F6B,EAAM,OAAOI,CAAE,EACf,SAAS,KAAK,OAAOJ,CAAK,EAC1B,SAAS,gBAAgB,UAAU,IAAI,aAAa,EACpD,MAAM,IAAI,QAAeO,GAAS,CAChC,IAAMC,EAAS,IAAM,CACnB,OAAO,oBAAoB,aAAcA,CAAM,EAC/CR,EAAM,OAAO,EACb,SAAS,gBAAgB,UAAU,OAAO,aAAa,EACvDO,EAAK,CACP,EACA,OAAO,iBAAiB,aAAcC,CAAM,EAC5C,OAAO,MAAM,EAET,OAAO,YAAe,YAAY,WAAWA,EAAQ,CAAC,CAC5D,CAAC,CACH",
|
|
6
|
+
"names": ["MIME", "enc", "textOf", "v", "csvCell", "s", "safe", "table", "grid", "recs", "cols", "c", "r", "raw", "cellContent", "crc", "_", "n", "k", "b", "x", "zip", "files", "parts", "central", "offset", "u32", "o", "name", "text", "nameB", "data", "head", "entry", "e", "size", "end", "all", "at", "xml", "ref", "col", "row", "xlsx", "rows", "cell", "bold", "exportGrid", "format", "filename", "scope", "download", "store", "blob", "a", "printGrid", "sheet", "tag", "tr", "cells", "el", "thead", "tbody", "done", "finish"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as v}from"./chunk-JBOKM5YA.js";import{a as m}from"./chunk-MQEALOU3.js";import{a as w}from"./chunk-ESRS5ZQV.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{f}from"./chunk-UDXO3KM3.js";import{b as u}from"./chunk-PZSHOSOS.js";import{e as d,f as n}from"./chunk-S4QD5NID.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-37PYJAA2.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/data/viewmanager/viewmanager.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { FilterGroup, Sorter } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\nimport type { Grid, ColumnState } from '../grid/grid';\nimport type { FilterBuilder } from '../filterbuilder/filterbuilder';\n\naddMessages('en', {\n views: 'Views',\n viewsName: 'Name for this view',\n viewsSave: 'Save view',\n viewsSaveAs: 'Save as new view\u2026',\n viewsDefault: 'Open with this view',\n viewsDelete: 'Delete view',\n viewsConfirmDelete: 'Delete the view \"{n}\"?',\n viewsReset: 'Reset to initial',\n});\naddMessages('pt-BR', {\n views: 'Vis\u00F5es',\n viewsName: 'Nome desta vis\u00E3o',\n viewsSave: 'Salvar vis\u00E3o',\n viewsSaveAs: 'Salvar como nova vis\u00E3o\u2026',\n viewsDefault: 'Abrir com esta vis\u00E3o',\n viewsDelete: 'Excluir vis\u00E3o',\n viewsConfirmDelete: 'Excluir a vis\u00E3o \"{n}\"?',\n viewsReset: 'Voltar ao inicial',\n});\n\n/** Everything a view remembers: plain JSON, so it can travel to any backend. */\nexport interface ViewState {\n columns?: ColumnState[];\n filter?: FilterGroup | null;\n sorters?: Sorter[];\n /** Whatever the app registered in `extra` (panel collapsed, density...). */\n extra?: Record<string, unknown>;\n}\nexport interface SavedView {\n id?: string;\n name: string;\n default?: boolean;\n state: ViewState;\n}\n\n/** Where views live. Implement it for your endpoint; `localViewStorage` and `restViewStorage` are ready-made. */\nexport interface ViewStorage {\n list(): Promise<SavedView[]> | SavedView[];\n /** Create (no `id`) or update. May return the stored view (with the id the server gave it). */\n save(view: SavedView): Promise<SavedView | void> | SavedView | void;\n remove(view: SavedView): Promise<void> | void;\n}\n\nconst newId = () => globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n/** Views in the browser (`localStorage` by default) under one key. */\nexport function localViewStorage(key: string, storage: Storage = localStorage): ViewStorage {\n const read = (): SavedView[] => {\n try {\n const v = JSON.parse(storage.getItem(key) ?? '[]');\n return Array.isArray(v) ? v : [];\n } catch {\n return [];\n }\n };\n const write = (v: SavedView[]) => storage.setItem(key, JSON.stringify(v));\n return {\n list: read,\n save(view) {\n const saved = { ...view, id: view.id ?? newId() };\n const all = read();\n const i = all.findIndex((x) => x.id === saved.id);\n if (i < 0) all.push(saved);\n else all[i] = saved;\n write(all);\n return saved;\n },\n remove(view) {\n write(read().filter((x) => x.id !== view.id));\n },\n };\n}\n\nexport interface RestViewStorageConfig {\n /** `GET url` lists, `POST url` creates, `PUT url/:id` updates, `DELETE url/:id` removes. JSON in and out. */\n url: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\n/** Views on your server. Responses must be JSON (the list as an array, create/update returning the stored view). */\nexport function restViewStorage(cfg: RestViewStorageConfig): ViewStorage {\n const call = async (method: string, path = '', body?: unknown) => {\n const res = await (cfg.fetch ?? fetch)(cfg.url + path, { method, headers: { 'Content-Type': 'application/json', ...cfg.headers }, body: body === undefined ? undefined : JSON.stringify(body) });\n if (!res.ok) throw new Error(`Optikos views: ${method} ${cfg.url + path} \u2192 ${res.status}`);\n return res.status === 204 ? undefined : res.json().catch(() => undefined);\n };\n return {\n list: () => call('GET'),\n save: (v) => (v.id ? call('PUT', `/${encodeURIComponent(v.id)}`, v) : call('POST', '', v)),\n remove: (v) => call('DELETE', `/${encodeURIComponent(v.id!)}`).then(() => undefined),\n };\n}\n\nexport interface ViewManagerConfig extends ComponentConfig {\n grid: Grid;\n /** Its filter tree is part of the view. */\n filters?: FilterBuilder;\n storage: ViewStorage;\n /** Extra things to remember: `{ density: { get: () => ..., set: (v) => ... } }`. Stored in `state.extra`. */\n extra?: Record<string, { get(): unknown; set(value: unknown): void }>;\n /** Apply the default view when it opens. Default true. */\n autoLoad?: boolean;\n}\n\n/**\n * \"Views\" button for a Grid (and its FilterBuilder): saves and restores the visible columns and their order, the filters\n * (including nested AND/OR groups) and the sort, under a name, in the storage you give it.\n */\nexport class ViewManager extends Component<ViewManagerConfig> {\n protected override baseCls = 'op-viewmanager';\n private btn!: Button;\n private menu?: Menu;\n private views: SavedView[] = [];\n private current?: SavedView;\n private initial: ViewState = {};\n\n protected override build() {\n this.btn = new Button({ text: t('views'), icon: 'menu', variant: 'ghost', handler: () => this.openMenu() });\n this.btn.el.setAttribute('aria-haspopup', 'menu');\n this.own(() => (this.btn.destroy(), this.menu?.destroy()));\n return h('span', this.baseCls, {}, this.btn.el);\n }\n\n protected override onRender() {\n this.config.grid.render();\n this.config.filters?.render();\n this.initial = this.getState();\n if (this.config.autoLoad !== false) void this.reload();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.btn.notifyMount();\n }\n\n // ---- state ---------------------------------------------------------------------------------\n\n /** The grid's and filter's current setup. */\n getState(): ViewState {\n const { grid, filters, extra } = this.config;\n const state: ViewState = { columns: grid.getColumnState(), filter: filters?.getFilter() ?? null, sorters: [...grid.getStore().getSorters()] };\n if (extra) state.extra = Object.fromEntries(Object.entries(extra).map(([k, e]) => [k, e.get()]));\n return state;\n }\n\n /** Puts a setup on the grid and the filter. */\n setState(s: ViewState): void {\n const { grid, filters, extra } = this.config;\n if (s.columns) grid.setColumnState(s.columns);\n const sort = s.sorters?.[0];\n grid.getStore().sort(sort?.field ?? null, sort?.dir);\n if (filters) {\n filters.setFilter(s.filter ?? null);\n filters.apply();\n }\n for (const k in s.extra) extra?.[k]?.set(s.extra[k]);\n }\n\n // ---- views ---------------------------------------------------------------------------------\n\n getViews(): SavedView[] {\n return this.views;\n }\n getCurrent(): SavedView | undefined {\n return this.current;\n }\n\n /** Reads the views from the storage and applies the default one (unless a view is already active). */\n async reload(): Promise<void> {\n await this.run(async () => {\n this.views = (await this.config.storage.list()) ?? [];\n this.current = this.current && this.views.find((v) => v.id === this.current!.id);\n const def = this.views.find((v) => v.default);\n if (!this.current && def && this.config.autoLoad !== false) this.apply(def);\n this.paint();\n });\n this.emit('load', this.views);\n }\n\n /** Applies a saved view (object or id). */\n apply(view: SavedView | string): void {\n const v = typeof view === 'string' ? this.views.find((x) => x.id === view) : view;\n if (!v || this.emit('before-apply', v) === false) return;\n this.current = v;\n this.setState(v.state);\n this.paint();\n this.emit('apply', v);\n }\n\n /** Saves the current setup into the active view; with none active, asks for a name first. */\n async save(): Promise<void> {\n if (!this.current) return this.saveAs();\n await this.store({ ...this.current, state: this.getState() });\n }\n\n /** Saves the current setup as a view with that name (asked for when omitted); an existing name is overwritten. */\n async saveAs(name?: string): Promise<void> {\n name ??= (await MessageBox.prompt(t('viewsName'), { title: t('viewsSaveAs') })) ?? '';\n name = name.trim();\n if (!name) return;\n const same = this.views.find((v) => v.name.toLowerCase() === name!.toLowerCase());\n await this.store({ ...same, name, state: this.getState() });\n }\n\n /** Marks the active view as the one applied on open (and unmarks the others). */\n async setDefault(on = true): Promise<void> {\n if (!this.current) return;\n for (const v of this.views) if (v !== this.current && v.default) await this.store({ ...v, default: false }, false);\n await this.store({ ...this.current, default: on });\n }\n\n async remove(view = this.current): Promise<void> {\n if (!view || !(await MessageBox.confirm(t('viewsConfirmDelete', { n: view.name }), { danger: true, okText: t('viewsDelete') }))) return;\n await this.run(async () => {\n await this.config.storage.remove(view);\n this.views = this.views.filter((v) => v !== view && v.id !== view.id);\n if (this.current?.id === view.id) this.current = undefined;\n this.paint();\n this.emit('remove', view);\n });\n }\n\n /** Back to the setup the grid had when the manager opened. */\n reset(): void {\n this.current = undefined;\n this.setState(this.initial);\n this.paint();\n this.emit('reset');\n }\n\n private async store(view: SavedView, makeCurrent = true): Promise<void> {\n await this.run(async () => {\n const saved = (await this.config.storage.save(view)) || view;\n const i = this.views.findIndex((v) => (saved.id && v.id === saved.id) || v === view);\n if (i < 0) this.views.push(saved);\n else this.views[i] = saved;\n if (makeCurrent) this.current = saved;\n this.paint();\n this.emit('save', saved);\n });\n }\n\n private async run(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n // ---- UI ------------------------------------------------------------------------------------\n\n private paint(): void {\n this.btn.setText(this.current?.name ?? t('views'));\n }\n\n private openMenu(): void {\n const cur = this.current;\n const items: MenuEntry[] = [\n ...this.views.map((v) => ({ text: v.default ? `${v.name} \u2605` : v.name, checked: v === cur || (!!cur?.id && v.id === cur.id), handler: () => this.apply(v) })),\n ...(this.views.length ? (['-'] as const) : []),\n { text: t('viewsSave'), handler: () => void this.save() },\n { text: t('viewsSaveAs'), handler: () => void this.saveAs() },\n ...(cur ? [{ text: t('viewsDefault'), checked: !!cur.default, handler: () => void this.setDefault(!cur.default) }, { text: t('viewsDelete'), handler: () => void this.remove() }] : []),\n '-',\n { text: t('viewsReset'), handler: () => this.reset() },\n ];\n this.menu ??= new Menu({});\n this.menu.setItems(items);\n this.menu.showBy(this.btn.el);\n }\n}\nregister('viewmanager', ViewManager);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["addMessages", "newId", "localViewStorage", "key", "storage", "read", "v", "write", "view", "saved", "all", "i", "x", "restViewStorage", "cfg", "call", "method", "path", "body", "res", "ViewManager", "Component", "Button", "t", "h", "grid", "filters", "extra", "state", "k", "e", "s", "sort", "def", "name", "MessageBox", "same", "on", "makeCurrent", "fn", "err", "cur", "items", "Menu", "register"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as o}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as s,f as r}from"./chunk-S4QD5NID.js";s("en",{chipRemove:"Remove {text}"});s("pt-BR",{chipRemove:"Remover {text}"});var n=class extends h{baseCls="op-chip";tag="span";main;textEl;removeBtn;onRender(){let e=this.config;this.textEl=i("span","op-chip__text"),this.main=i("button","op-chip__main",{type:"button"},e.icon?o(e.icon):"",this.textEl),this.el.append(this.main),this.listen(this.main,"click",()=>{this.config.disabled||(this.config.selectable&&this.setSelected(!this.config.selected,!0),this.config.handler?.(this),this.emit("click",this))}),e.removable&&(this.removeBtn=i("button","op-chip__remove",{type:"button"},o("x")),this.el.append(this.removeBtn),this.listen(this.removeBtn,"click",()=>!this.config.disabled&&this.emit("remove",this)),this.listen(this.main,"keydown",t=>{(t.key==="Delete"||t.key==="Backspace")&&!this.config.disabled&&this.emit("remove",this)})),this.setText(e.text??""),this.setSelected(!!e.selected),this.setDisabled(!!e.disabled)}setText(e){this.config.text=e,this.rendered&&(this.textEl.textContent=e,this.removeBtn?.setAttribute("aria-label",r("chipRemove",{text:e})))}setSelected(e,t=!1){this.config.selected=e,this.rendered&&(this.el.classList.toggle("is-selected",e),this.config.selectable&&this.main.setAttribute("aria-pressed",String(e)),t&&this.emit("change",e))}isSelected(){return!!this.config.selected}setDisabled(e){super.setDisabled(e),this.rendered&&(this.main.disabled=e,this.removeBtn&&(this.removeBtn.disabled=e))}focusEl(){return this.main}};l("chip",n);export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3BG75P7T.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as o}from"./chunk-BQEFLPDA.js";import{c as i}from"./chunk-VV7CFMPZ.js";import{a as r}from"./chunk-TIPK3SCJ.js";var n="button:not(:disabled)",e=class extends o{baseCls="op-toolbar";rover;shorthand(t){if(t==="->")return{type:"spacer"};if(t==="-")return{type:"spacer",line:!0};if(t===" ")return{type:"spacer",width:8};throw new Error(`Optikos: unknown toolbar shorthand "${t}"`)}build(){let t=super.build();return t.setAttribute("role","toolbar"),this.config.vertical&&t.setAttribute("aria-orientation","vertical"),t}onRender(){this.config.layout??=this.config.vertical?{type:"vbox",align:"stretch"}:{type:"hbox",align:"center"},super.onRender(),this.el.classList.toggle("op-toolbar--vertical",!!this.config.vertical),this.rover=i(this.el,{selector:n,orientation:this.config.vertical?"vertical":"horizontal"}),this.own(()=>this.rover?.destroy())}notifyMount(){super.notifyMount(),this.rover?.sync()}};r("toolbar",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3F4MN2BU.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as i}from"./chunk-TIPK3SCJ.js";import{f as o}from"./chunk-UDXO3KM3.js";import{f as r}from"./chunk-S4QD5NID.js";var e=class extends o{baseCls="op-spinner";tag="span";onRender(){this.el.setAttribute("role","progressbar"),this.setLabel(this.config.label??r("loading"))}setLabel(t){this.config.label=t,this.rendered&&this.el.setAttribute("aria-label",t)}};i("spinner",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3FK52VQX.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as f}from"./chunk-QOSTS5I3.js";import{a as p,c as g,d as m,e as k}from"./chunk-J5BZAKC6.js";import{a as h}from"./chunk-Z6HZY2YG.js";import{c}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as a}from"./chunk-PZSHOSOS.js";import{e as l,f as n}from"./chunk-S4QD5NID.js";l("en",{lookupOpen:"Open search",lookupSelect:"Select"});l("pt-BR",{lookupOpen:"Abrir pesquisa",lookupSelect:"Selecionar"});var d=class extends f{baseCls="op-field op-textfield op-picker op-suggest op-lookup";def;suggestStore;win;constructor(e){let t=g(e.lookup);super({...e,icon:!1,valueField:t.valueField??"id",displayField:t.displayField??"name",query:o=>this.suggest(o)}),this.def=t}async suggest(e){let t=this.suggestStore??=m(this.def),o=this.def.queryField??(this.def.filters?.[0]&&p(this.def.filters[0]).name)??this.config.displayField,i=this.def.filters?.map(p).find(s=>s.name===o)?.field??o;return await t.filter({field:i,op:"contains",value:e}),t.getData()}createControl(){let e=super.createControl(),t=a("button","op-picker__trigger op-lookup__btn",{type:"button",tabindex:-1,"aria-label":n("lookupOpen"),"aria-haspopup":"dialog"},c("search"));return this.listen(t,"mousedown",o=>o.preventDefault()),this.listen(t,"click",()=>this.openDialog()),e.append(t),this.own(()=>this.win?.destroy()),e}onKey(e){e.key==="F4"||e.altKey&&e.key==="ArrowDown"?(e.preventDefault(),this.openDialog()):super.onKey(e)}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-lookup__btn").disabled=e}openDialog(){if(this.win||this.config.disabled||this.config.readonly||!this.rendered)return;this.close();let e=this.def,t=new k({lookup:e,flex:1}),o=this.typed?this.input.value:"";t.on("confirm",r=>i(r));let i=r=>{r[0]&&this.pickRecord(r[0]),s.close()},s=this.win=new h({title:e.title??n("search"),width:e.width??720,height:e.height??520,layout:"fit",items:[t],buttons:[{text:n("cancel"),handler:()=>s.close()},{text:n("lookupSelect"),variant:"primary",handler:()=>i(t.getSelection())}]});s.on("destroy",()=>{this.win=void 0,this.rendered&&this.input.focus()}),s.show(),o&&t.search(o)}pickRecord(e){let{valueField:t,displayField:o}=this.config,i={value:e.get(t),label:String(e.get(o)??e.get(t)??""),raw:e.data};this.pick(i)}};u("lookupfield",d);export{d as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3OA3P37P.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/lookupfield/lookupfield.ts"],
|
|
4
|
+
"sourcesContent": ["import { SuggestField, type SuggestConfig } from '../suggestfield/suggestfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Model } from '../../../data/model';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\nimport { Window } from '../../overlays/window/window';\nimport { SearchGrid, resolveLookup, lookupStore, filterInfo, type LookupDef } from '../../data/searchgrid/searchgrid';\n\naddMessages('en', {\n lookupOpen: 'Open search',\n lookupSelect: 'Select',\n});\naddMessages('pt-BR', {\n lookupOpen: 'Abrir pesquisa',\n lookupSelect: 'Selecionar',\n});\n\nexport interface LookupFieldConfig<V = unknown> extends SuggestConfig<V> {\n /** A definition or the name given to `registerLookup`. */\n lookup: LookupDef | string;\n}\n\n/**\n * Pick a record from a big set: type to get suggestions, or press the magnifier (or F4) to open a search window\n * with filters and a grid. The value is the record's `valueField`; the text is its `displayField`.\n */\nexport class LookupField<V = unknown> extends SuggestField<V> {\n protected override baseCls = 'op-field op-textfield op-picker op-suggest op-lookup';\n private def: LookupDef;\n private suggestStore?: Store<any>;\n private win?: Window;\n\n constructor(config: LookupFieldConfig<V>) {\n const def = resolveLookup(config.lookup);\n super({\n ...config,\n icon: false,\n valueField: def.valueField ?? 'id',\n displayField: def.displayField ?? 'name',\n query: (text) => this.suggest(text),\n });\n this.def = def;\n }\n\n /** Typing: filter a private store by the quick-search field and offer its page of records. */\n private async suggest(text: string) {\n const s = (this.suggestStore ??= lookupStore(this.def));\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name) ?? this.config.displayField!;\n const field = this.def.filters?.map(filterInfo).find((f) => f.name === name)?.field ?? name;\n await s.filter({ field, op: 'contains', value: text });\n return s.getData();\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const btn = h('button', 'op-picker__trigger op-lookup__btn', { type: 'button', tabindex: -1, 'aria-label': t('lookupOpen'), 'aria-haspopup': 'dialog' }, iconEl('search'));\n this.listen(btn, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(btn, 'click', () => this.openDialog());\n wrap.append(btn);\n this.own(() => this.win?.destroy());\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'F4' || (e.altKey && e.key === 'ArrowDown')) {\n e.preventDefault();\n this.openDialog();\n } else super.onKey(e);\n }\n\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-lookup__btn') as HTMLButtonElement).disabled = disabled;\n }\n\n /** Opens the search window; the text typed so far pre-fills the quick-search field. */\n openDialog(): void {\n if (this.win || this.config.disabled || this.config.readonly || !this.rendered) return;\n this.close();\n const d = this.def;\n const sg = new SearchGrid({ lookup: d, flex: 1 });\n const text = this.typed ? this.input.value : '';\n sg.on('confirm', (recs: Model[]) => done(recs));\n const done = (recs: Model[]) => {\n if (recs[0]) this.pickRecord(recs[0]);\n win.close();\n };\n const win: Window = (this.win = new Window({\n title: d.title ?? t('search'),\n width: d.width ?? 720,\n height: d.height ?? 520,\n layout: 'fit',\n items: [sg],\n buttons: [{ text: t('cancel'), handler: () => win.close() }, { text: t('lookupSelect'), variant: 'primary', handler: () => done(sg.getSelection()) }],\n }));\n win.on('destroy', () => {\n this.win = undefined;\n if (this.rendered) this.input.focus();\n });\n win.show();\n if (text) void sg.search(text);\n }\n\n private pickRecord(rec: Model): void {\n const { valueField, displayField } = this.config;\n const item = { value: rec.get(valueField!), label: String(rec.get(displayField!) ?? rec.get(valueField!) ?? ''), raw: rec.data };\n this.pick(item as any);\n }\n}\nregister('lookupfield', LookupField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "LookupField", "SuggestField", "config", "def", "resolveLookup", "text", "s", "lookupStore", "name", "filterInfo", "field", "f", "wrap", "btn", "h", "t", "iconEl", "e", "disabled", "d", "sg", "SearchGrid", "recs", "done", "win", "Window", "rec", "valueField", "displayField", "item", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as d}from"./chunk-DIOJGTUN.js";import{c as g}from"./chunk-BQEFLPDA.js";import{c as u}from"./chunk-VV7CFMPZ.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{c as b,d as h}from"./chunk-UDXO3KM3.js";import{b as r}from"./chunk-PZSHOSOS.js";import{e as p,f as l}from"./chunk-S4QD5NID.js";p("en",{tabErrors:"errors"});p("pt-BR",{tabErrors:"erros"});var f=class extends g{baseCls="op-tabs";barEl;panelsEl;tabs=new Map;pending=new Set;rover;constructor(t={}){super({defaultType:"container",...t});for(let e of this.items.filter(i=>!b(i.config.permission)&&(i.config.permissionMode??h())==="hide"))this.remove(e)}getBody(){return this.panelsEl}build(){let t=this.config.position==="left",e=r("div",`op-tabs${t?" op-tabs--left":""}`);return this.barEl=r("div","op-tabs__bar",{role:"tablist","aria-orientation":t?"vertical":"horizontal"}),this.panelsEl=r("div","op-tabs__panels"),e.append(this.barEl,this.panelsEl),e}onRender(){let t=this.config;t.layout={type:"card",activeItem:t.active??0},this.items.forEach(e=>this.addHeader(e)),this.rover=u(this.barEl,{selector:"[role=tab]",orientation:t.position==="left"?"vertical":"horizontal",onMove:e=>this.setActive(this.items.find(i=>this.tabs.get(i)===e))}),this.own(()=>this.rover?.destroy()),this.on("activate",e=>this.syncHeaders(e)),this.listen(this.barEl,"click",e=>{let i=e.target,s=i.closest("[role=tab]"),o=this.items.find(n=>this.tabs.get(n)===s);o&&(i.closest(".op-tabs__close")?this.closeTab(o):i.closest(".op-tabs__reload")?(this.setActive(o),this.reloadTab(o)):this.setActive(o))}),this.listen(this.barEl,"keydown",e=>{let i=this.items.find(s=>this.tabs.get(s)===e.target.closest("[role=tab]"));e.key==="Delete"&&i?this.closeTab(i):i&&(e.key==="r"||e.key==="R")&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&this.tabConfig(i).reloadable&&this.reloadTab(i)}),super.onRender()}forcing;attach(t,e){if(this.config.lazy!==!1&&t!==this.getActiveItem()&&t!==this.forcing){this.pending.add(t);return}super.attach(t,e),t.el.setAttribute("role","tabpanel"),t.el.tabIndex=0;let i=this.tabs.get(t);i&&(t.el.setAttribute("aria-labelledby",i.id),i.setAttribute("aria-controls",t.el.id))}ensure(t){this.pending.delete(t)&&(this.forcing=t,this.attach(t,this.items.indexOf(t)),this.forcing=void 0)}tabConfig(t){let e=t.config;return{title:e.title??"",icon:e.icon,closable:e.closable??this.config.closable??!1,reloadable:e.reloadable??this.config.reloadable??!1,disabled:!!e.disabled}}addHeader(t){let{title:e,icon:i,closable:s,reloadable:o,disabled:n}=this.tabConfig(t),a=r("div","op-tabs__tab",{role:"tab",id:`${t.id}-tab`,tabindex:-1,"aria-selected":"false","aria-disabled":n?"true":null});a.append(i?d(i):"",r("span","op-tabs__title",{},e)),o&&a.append(r("span","op-tabs__reload",{"aria-hidden":"true","data-op-tip":l("reload")},d("refresh"))),s&&a.append(r("span","op-tabs__close",{"aria-hidden":"true","data-op-tip":l("close")},d("x"))),this.tabs.set(t,a),this.barEl.append(...[...this.items].filter(c=>this.tabs.has(c)).map(c=>this.tabs.get(c)))}syncHeaders(t){for(let[i,s]of this.tabs){let o=i===t;s.setAttribute("aria-selected",String(o)),s.classList.toggle("is-active",o)}let e=t&&this.tabs.get(t);this.rover?.sync(e||void 0)}getActive(){return this.getActiveItem()}setActive(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(s=>s.id===t):t,i=this.getActiveItem();!e||e===i||this.tabConfig(e).disabled||this.emit("before-change",e,i)!==!1&&(this.ensure(e),this.setActiveItem(e),this.emit("change",e,this.items.indexOf(e)))}insert(t,e){let i=super.insert(t,e);return this.rendered&&(this.addHeader(i),this.ensure(i),this.setActive(i)),i}async reloadTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(o=>o.id===t):t,i=e&&this.tabs.get(e);if(!e||i?.classList.contains("is-reloading")||this.emit("before-reload",e)===!1)return!1;i?.classList.add("is-reloading");let s=e.config.onReload?.(e);return s instanceof Promise&&(e.setLoading(!0),await s.catch(()=>{}),e.setLoading(!1)),i?.classList.remove("is-reloading"),this.emit("reload",e),!0}closeTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(i=>i.id===t):t;!e||this.emit("before-close",e)===!1||(this.remove(e),this.emit("close",e))}remove(t,e=!0){let i=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(n=>n.id===t):t,s=i&&this.tabs.get(i)?.contains(document.activeElement),o=super.remove(t,e);if(i){this.tabs.get(i)?.remove(),this.tabs.delete(i),this.pending.delete(i);let n=this.getActiveItem();n&&this.ensure(n),s&&n&&this.tabs.get(n)?.focus()}return o}setTabState(t,e){let i=this.tabs.get(t);if(!i)return;i.classList.toggle("has-error",!!e.errors),i.classList.toggle("is-dirty",!!e.dirty);let s=i.querySelector(".op-tabs__badge");if(!e.errors)return s?.remove();s||(s=r("span","op-tabs__badge"),i.insertBefore(s,i.querySelector(".op-tabs__close"))),s.replaceChildren(String(e.errors),r("span","op-sr-only",{},` ${l("tabErrors")}`))}setTitle(t,e){t.config.title=e;let i=this.tabs.get(t)?.querySelector(".op-tabs__title");i&&(i.textContent=e)}};m("tabs",f);export{f as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3TCITFUU.js.map
|