optikos 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  5. package/dist/chunk-2HNQ2XRY.js +2 -0
  6. package/dist/chunk-2HNQ2XRY.js.map +7 -0
  7. package/dist/chunk-2QMI2RRB.js +2 -0
  8. package/dist/chunk-2QMI2RRB.js.map +7 -0
  9. package/dist/{chunk-W3H7GTJY.js → chunk-2YRQULDC.js} +2 -2
  10. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  11. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  12. package/dist/chunk-3FCIZKIN.js +2 -0
  13. package/dist/chunk-3FCIZKIN.js.map +7 -0
  14. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  15. package/dist/chunk-3QRA3XOA.js +2 -0
  16. package/dist/chunk-3QRA3XOA.js.map +7 -0
  17. package/dist/chunk-3TCITFUU.js +2 -0
  18. package/dist/chunk-3TCITFUU.js.map +7 -0
  19. package/dist/chunk-3VDLX7ET.js +2 -0
  20. package/dist/chunk-3VDLX7ET.js.map +7 -0
  21. package/dist/{chunk-3TAW4AKH.js → chunk-4AZ44KV4.js} +2 -2
  22. package/dist/{chunk-TZOQWCVH.js → chunk-4CWYF4O7.js} +2 -2
  23. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  24. package/dist/{chunk-2YZB6XQR.js → chunk-4S3HRFQB.js} +2 -2
  25. package/dist/chunk-5BMG5ZBY.js +2 -0
  26. package/dist/{chunk-KLLAY2IM.js.map → chunk-5BMG5ZBY.js.map} +2 -2
  27. package/dist/chunk-5PWPAN62.js +2 -0
  28. package/dist/chunk-5PWPAN62.js.map +7 -0
  29. package/dist/chunk-5PYJ6FJK.js +2 -0
  30. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  31. package/dist/{chunk-OGRFQTXA.js → chunk-643FOYQB.js} +2 -2
  32. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  33. package/dist/chunk-6LJK4QWF.js +2 -0
  34. package/dist/chunk-6LJK4QWF.js.map +7 -0
  35. package/dist/{chunk-JK74QK3M.js → chunk-6PZPBPAD.js} +2 -2
  36. package/dist/chunk-7Y2GHQRB.js +2 -0
  37. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  38. package/dist/{chunk-M242VYZA.js → chunk-AT7VFZRB.js} +2 -2
  39. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  40. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  41. package/dist/chunk-BJWREA76.js +2 -0
  42. package/dist/chunk-BJWREA76.js.map +7 -0
  43. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  44. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  45. package/dist/{chunk-FEHGU6EP.js → chunk-C3MWS7P2.js} +2 -2
  46. package/dist/{chunk-G2KUK6AT.js → chunk-CFGCB37K.js} +2 -2
  47. package/dist/{chunk-JI265XFO.js → chunk-CMV3F6HR.js} +2 -2
  48. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  49. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  50. package/dist/chunk-DJUSVBD5.js +2 -0
  51. package/dist/chunk-DJUSVBD5.js.map +7 -0
  52. package/dist/{chunk-HXDTGP2K.js → chunk-DWA45BWR.js} +2 -2
  53. package/dist/chunk-DWTDNKXX.js +2 -0
  54. package/dist/chunk-DWTDNKXX.js.map +7 -0
  55. package/dist/chunk-ESCLDVFS.js +2 -0
  56. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  57. package/dist/chunk-EXIADWI7.js +2 -0
  58. package/dist/chunk-EXIADWI7.js.map +7 -0
  59. package/dist/{chunk-5QUY72FX.js → chunk-F4HZUAKM.js} +2 -2
  60. package/dist/chunk-FCJI2JF7.js +3 -0
  61. package/dist/chunk-FCJI2JF7.js.map +7 -0
  62. package/dist/{chunk-Q26YZYTD.js → chunk-FPU53CCV.js} +2 -2
  63. package/dist/{chunk-3S24ZRPK.js → chunk-GEBAYD6N.js} +2 -2
  64. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  65. package/dist/chunk-GFFZTFQH.js +2 -0
  66. package/dist/chunk-GFFZTFQH.js.map +7 -0
  67. package/dist/chunk-GFJRGBQR.js +2 -0
  68. package/dist/chunk-GFJRGBQR.js.map +7 -0
  69. package/dist/chunk-GZIDE5K2.js +2 -0
  70. package/dist/chunk-GZIDE5K2.js.map +7 -0
  71. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  72. package/dist/chunk-HG7OOHGD.js +2 -0
  73. package/dist/chunk-HG7OOHGD.js.map +7 -0
  74. package/dist/{chunk-2ZUZ5HDL.js → chunk-HLS5FI55.js} +2 -2
  75. package/dist/chunk-HRW25TMU.js +2 -0
  76. package/dist/chunk-HX6TWXTX.js +2 -0
  77. package/dist/chunk-HX6TWXTX.js.map +7 -0
  78. package/dist/chunk-I5A74NMJ.js +2 -0
  79. package/dist/chunk-I5A74NMJ.js.map +7 -0
  80. package/dist/chunk-IUOEPAWG.js +2 -0
  81. package/dist/chunk-IUOEPAWG.js.map +7 -0
  82. package/dist/{chunk-IHE2MQ3W.js → chunk-J5QPFJ7M.js} +2 -2
  83. package/dist/chunk-JE56CJX2.js +2 -0
  84. package/dist/chunk-JE56CJX2.js.map +7 -0
  85. package/dist/chunk-JJLOUMCJ.js +2 -0
  86. package/dist/chunk-JJLOUMCJ.js.map +7 -0
  87. package/dist/chunk-JLKIHXZP.js +3 -0
  88. package/dist/chunk-JLKIHXZP.js.map +7 -0
  89. package/dist/{chunk-5BC72727.js → chunk-JSEI44A7.js} +2 -2
  90. package/dist/chunk-L5SQQFO7.js +2 -0
  91. package/dist/chunk-L5SQQFO7.js.map +7 -0
  92. package/dist/chunk-M2ZRKHE4.js +2 -0
  93. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  94. package/dist/chunk-M7FNPRV4.js +2 -0
  95. package/dist/chunk-M7FNPRV4.js.map +7 -0
  96. package/dist/chunk-MNSDGJKA.js +3 -0
  97. package/dist/chunk-MNSDGJKA.js.map +7 -0
  98. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  99. package/dist/chunk-N2LS4JD6.js +2 -0
  100. package/dist/chunk-N2LS4JD6.js.map +7 -0
  101. package/dist/chunk-NJ5IFOPR.js +4 -0
  102. package/dist/{chunk-XX2MVWFS.js.map → chunk-NJ5IFOPR.js.map} +1 -1
  103. package/dist/{chunk-NXSTUFS7.js → chunk-NNR2FNHG.js} +2 -2
  104. package/dist/chunk-NQV4THNE.js +2 -0
  105. package/dist/{chunk-UXXJOU5J.js.map → chunk-NQV4THNE.js.map} +1 -1
  106. package/dist/{chunk-XHOBNSBO.js → chunk-P4O57S6N.js} +2 -2
  107. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  108. package/dist/chunk-PMOXLQ72.js +2 -0
  109. package/dist/chunk-PMOXLQ72.js.map +7 -0
  110. package/dist/chunk-Q6FY4L2F.js +2 -0
  111. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  112. package/dist/chunk-R32HPK7R.js +2 -0
  113. package/dist/chunk-R32HPK7R.js.map +7 -0
  114. package/dist/{chunk-Z2JBUHKA.js → chunk-RG6SHPHF.js} +2 -2
  115. package/dist/{chunk-EDUMAMK4.js → chunk-S2CMWKVB.js} +2 -2
  116. package/dist/chunk-S4QD5NID.js +2 -0
  117. package/dist/chunk-S4QD5NID.js.map +7 -0
  118. package/dist/chunk-SB4ICXBV.js +2 -0
  119. package/dist/chunk-SB4ICXBV.js.map +7 -0
  120. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  121. package/dist/chunk-SWCB2GMN.js +2 -0
  122. package/dist/chunk-SWCB2GMN.js.map +7 -0
  123. package/dist/chunk-TQPQ4UEA.js +2 -0
  124. package/dist/chunk-TQPQ4UEA.js.map +7 -0
  125. package/dist/{chunk-Z2Z52GFT.js → chunk-U5L76VVB.js} +2 -2
  126. package/dist/chunk-UDXO3KM3.js +2 -0
  127. package/dist/chunk-UDXO3KM3.js.map +7 -0
  128. package/dist/{chunk-LQRFNQ2N.js → chunk-UQRQH2JW.js} +2 -2
  129. package/dist/chunk-V5G5JECN.js +2 -0
  130. package/dist/chunk-V5G5JECN.js.map +7 -0
  131. package/dist/{chunk-JBLRAM7Z.js → chunk-XFIREDWO.js} +2 -2
  132. package/dist/chunk-XQHATUKN.js +2 -0
  133. package/dist/{chunk-LW2WRUVL.js.map → chunk-XQHATUKN.js.map} +4 -4
  134. package/dist/chunk-XR677UYD.js +2 -0
  135. package/dist/chunk-XR677UYD.js.map +7 -0
  136. package/dist/{chunk-RNN55473.js → chunk-YDX2PCVL.js} +2 -2
  137. package/dist/{chunk-RNN55473.js.map → chunk-YDX2PCVL.js.map} +1 -1
  138. package/dist/chunk-YJTUFK4P.js +2 -0
  139. package/dist/chunk-YLFSCQL3.js +2 -0
  140. package/dist/chunk-YLFSCQL3.js.map +7 -0
  141. package/dist/chunk-YXOKWCYS.js +2 -0
  142. package/dist/chunk-YXOKWCYS.js.map +7 -0
  143. package/dist/{chunk-I4SP6JTU.js → chunk-Z6L55FTN.js} +2 -2
  144. package/dist/{chunk-6VBK2I5B.js → chunk-ZSPJZ3ZH.js} +2 -2
  145. package/dist/components/avatar.js +2 -0
  146. package/dist/components/avatar.js.map +7 -0
  147. package/dist/components/badge.js +1 -1
  148. package/dist/components/breadcrumb.js +1 -1
  149. package/dist/components/button.js +1 -1
  150. package/dist/components/calendar.js +1 -1
  151. package/dist/components/carousel.js +2 -0
  152. package/dist/components/carousel.js.map +7 -0
  153. package/dist/components/cellediting.js +1 -1
  154. package/dist/components/chart.js +2 -0
  155. package/dist/components/chart.js.map +7 -0
  156. package/dist/components/chat.js +1 -1
  157. package/dist/components/checkbox.js +1 -1
  158. package/dist/components/checkboxgroup.js +1 -1
  159. package/dist/components/chip.js +1 -1
  160. package/dist/components/codeviewer.js +1 -1
  161. package/dist/components/combobox.js +1 -1
  162. package/dist/components/commandpalette.js +1 -1
  163. package/dist/components/container.js +1 -1
  164. package/dist/components/dataview.js +1 -1
  165. package/dist/components/datefield.js +1 -1
  166. package/dist/components/daterangefield.js +1 -1
  167. package/dist/components/datetimefield.js +2 -0
  168. package/dist/components/datetimefield.js.map +7 -0
  169. package/dist/components/dial.js +1 -1
  170. package/dist/components/dropdown.js +1 -1
  171. package/dist/components/fieldgroup.js +1 -1
  172. package/dist/components/fieldlist.js +1 -1
  173. package/dist/components/fieldset.js +1 -1
  174. package/dist/components/filterbuilder.js +1 -1
  175. package/dist/components/form.js +1 -1
  176. package/dist/components/formactions.js +1 -1
  177. package/dist/components/formerrors.js +1 -1
  178. package/dist/components/formsection.js +1 -1
  179. package/dist/components/grid.js +1 -1
  180. package/dist/components/gridexport.js +2 -0
  181. package/dist/components/gridexport.js.map +7 -0
  182. package/dist/components/gridstate.js +2 -0
  183. package/dist/components/gridstate.js.map +7 -0
  184. package/dist/components/grouping.js +2 -0
  185. package/dist/components/grouping.js.map +7 -0
  186. package/dist/components/icon.js +1 -1
  187. package/dist/components/image.js +2 -0
  188. package/dist/components/image.js.map +7 -0
  189. package/dist/components/imagecanvas.js +2 -0
  190. package/dist/components/imagecanvas.js.map +7 -0
  191. package/dist/components/imagefield.js +2 -0
  192. package/dist/components/imagefield.js.map +7 -0
  193. package/dist/components/inputgroup.js +1 -1
  194. package/dist/components/label.js +1 -1
  195. package/dist/components/listbox.js +1 -1
  196. package/dist/components/lookupfield.js +1 -1
  197. package/dist/components/maskfield.js +2 -0
  198. package/dist/components/maskfield.js.map +7 -0
  199. package/dist/components/menu.js +1 -1
  200. package/dist/components/messagebox.js +1 -1
  201. package/dist/components/navmenu.js +1 -1
  202. package/dist/components/numberfield.js +1 -1
  203. package/dist/components/pagination.js +1 -1
  204. package/dist/components/panel.js +1 -1
  205. package/dist/components/pickerfield.js +1 -1
  206. package/dist/components/radiogroup.js +1 -1
  207. package/dist/components/rowediting.js +2 -0
  208. package/dist/components/rowediting.js.map +7 -0
  209. package/dist/components/searchgrid.js +1 -1
  210. package/dist/components/secretfield.js +1 -1
  211. package/dist/components/select.js +1 -1
  212. package/dist/components/shortcuts.js +2 -0
  213. package/dist/components/shortcuts.js.map +7 -0
  214. package/dist/components/slider.js +1 -1
  215. package/dist/components/spacer.js +1 -1
  216. package/dist/components/spinner.js +1 -1
  217. package/dist/components/stat.js +2 -0
  218. package/dist/components/stat.js.map +7 -0
  219. package/dist/components/stepform.js +1 -1
  220. package/dist/components/stepper.js +1 -1
  221. package/dist/components/suggestfield.js +1 -1
  222. package/dist/components/table.js +1 -1
  223. package/dist/components/tabs.js +1 -1
  224. package/dist/components/textarea.js +1 -1
  225. package/dist/components/textfield.js +1 -1
  226. package/dist/components/timefield.js +2 -0
  227. package/dist/components/timefield.js.map +7 -0
  228. package/dist/components/timeline.js +2 -0
  229. package/dist/components/timeline.js.map +7 -0
  230. package/dist/components/toast.js +1 -1
  231. package/dist/components/toggle.js +1 -1
  232. package/dist/components/toolbar.js +1 -1
  233. package/dist/components/tree.js +1 -1
  234. package/dist/components/treegrid.js +2 -0
  235. package/dist/components/treegrid.js.map +7 -0
  236. package/dist/components/viewmanager.js +1 -1
  237. package/dist/components/viewport.js +1 -1
  238. package/dist/components/widget.js +1 -1
  239. package/dist/components/window.js +1 -1
  240. package/dist/core.js +1 -1
  241. package/dist/css/avatar.css +68 -0
  242. package/dist/css/base.css +9 -0
  243. package/dist/css/carousel.css +119 -0
  244. package/dist/css/chart.css +168 -0
  245. package/dist/css/core.css +36 -0
  246. package/dist/css/datetimefield.css +15 -0
  247. package/dist/css/grid.css +40 -0
  248. package/dist/css/gridexport.css +35 -0
  249. package/dist/css/grouping.css +49 -0
  250. package/dist/css/image.css +46 -0
  251. package/dist/css/imagecanvas.css +75 -0
  252. package/dist/css/imagefield.css +103 -0
  253. package/dist/css/rowediting.css +39 -0
  254. package/dist/css/shortcuts.css +34 -0
  255. package/dist/css/stat.css +64 -0
  256. package/dist/css/stepform.css +1 -0
  257. package/dist/css/timeline.css +140 -0
  258. package/dist/css/treegrid.css +35 -0
  259. package/dist/css/window.css +2 -2
  260. package/dist/data.js +1 -1
  261. package/dist/dev.js +2 -0
  262. package/dist/dev.js.map +7 -0
  263. package/dist/index.js +16 -5
  264. package/dist/index.js.map +4 -4
  265. package/dist/optikos.css +1111 -21
  266. package/dist/testing.js +2 -0
  267. package/dist/testing.js.map +7 -0
  268. package/dist/themes/dark.css +7 -0
  269. package/dist/types/bind/index.d.ts +1 -1
  270. package/dist/types/bind/viewmodel.d.ts +33 -0
  271. package/dist/types/components/avatar.d.ts +1 -0
  272. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  273. package/dist/types/components/base/image/image.d.ts +25 -0
  274. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  275. package/dist/types/components/carousel.d.ts +1 -0
  276. package/dist/types/components/chart.d.ts +1 -0
  277. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  278. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  279. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  280. package/dist/types/components/data/grid/grid.d.ts +37 -0
  281. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  282. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  283. package/dist/types/components/data/grouping/grouping.d.ts +31 -0
  284. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  285. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  286. package/dist/types/components/data/timeline/timeline.d.ts +60 -0
  287. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  288. package/dist/types/components/datetimefield.d.ts +1 -0
  289. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  290. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  291. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  292. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  293. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  294. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  295. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  296. package/dist/types/components/form/form/form.d.ts +5 -0
  297. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  298. package/dist/types/components/gridexport.d.ts +1 -0
  299. package/dist/types/components/gridstate.d.ts +1 -0
  300. package/dist/types/components/grouping.d.ts +1 -0
  301. package/dist/types/components/image.d.ts +1 -0
  302. package/dist/types/components/imagecanvas.d.ts +1 -0
  303. package/dist/types/components/imagefield.d.ts +1 -0
  304. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  305. package/dist/types/components/maskfield.d.ts +1 -0
  306. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  307. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  308. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  309. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  310. package/dist/types/components/overlays/window/window.d.ts +14 -1
  311. package/dist/types/components/rowediting.d.ts +1 -0
  312. package/dist/types/components/shortcuts.d.ts +1 -0
  313. package/dist/types/components/stat.d.ts +1 -0
  314. package/dist/types/components/timefield.d.ts +1 -0
  315. package/dist/types/components/timeline.d.ts +1 -0
  316. package/dist/types/components/treegrid.d.ts +1 -0
  317. package/dist/types/core/component.d.ts +7 -0
  318. package/dist/types/core/container.d.ts +10 -1
  319. package/dist/types/core/dev.d.ts +2 -0
  320. package/dist/types/core/field.d.ts +4 -0
  321. package/dist/types/core/i18n.d.ts +2 -0
  322. package/dist/types/core/index.d.ts +4 -1
  323. package/dist/types/core/path.d.ts +2 -0
  324. package/dist/types/core/permission.d.ts +11 -0
  325. package/dist/types/core/state.d.ts +9 -0
  326. package/dist/types/data/column.d.ts +8 -0
  327. package/dist/types/data/index.d.ts +1 -1
  328. package/dist/types/data/model.d.ts +2 -0
  329. package/dist/types/data/store.d.ts +21 -0
  330. package/dist/types/dev/index.d.ts +2 -0
  331. package/dist/types/dev/keys.d.ts +1 -0
  332. package/dist/types/index.d.ts +17 -0
  333. package/dist/types/testing/index.d.ts +25 -0
  334. package/dist/types/themes/color.d.ts +14 -0
  335. package/dist/types/themes/contrast.d.ts +15 -0
  336. package/dist/types/themes/define.d.ts +25 -3
  337. package/dist/types/themes/index.d.ts +3 -1
  338. package/dist/types/themes/seeds.d.ts +11 -0
  339. package/dist/types/ui/ui.d.ts +6 -0
  340. package/dist/ui.js +1 -1
  341. package/package.json +9 -1
  342. package/dist/chunk-2ZRNGG2N.js +0 -2
  343. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  344. package/dist/chunk-4EQEHJB3.js +0 -2
  345. package/dist/chunk-4EQEHJB3.js.map +0 -7
  346. package/dist/chunk-4LZZ244E.js +0 -2
  347. package/dist/chunk-4LZZ244E.js.map +0 -7
  348. package/dist/chunk-4SYIIX5A.js +0 -2
  349. package/dist/chunk-4SYIIX5A.js.map +0 -7
  350. package/dist/chunk-7KMIFXHZ.js +0 -2
  351. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  352. package/dist/chunk-A2NKDOYN.js +0 -2
  353. package/dist/chunk-A2NKDOYN.js.map +0 -7
  354. package/dist/chunk-CKXS375P.js +0 -2
  355. package/dist/chunk-CKXS375P.js.map +0 -7
  356. package/dist/chunk-EJGWCKE4.js +0 -2
  357. package/dist/chunk-EJGWCKE4.js.map +0 -7
  358. package/dist/chunk-ELYARUCN.js +0 -2
  359. package/dist/chunk-EV73ADN2.js +0 -2
  360. package/dist/chunk-EV73ADN2.js.map +0 -7
  361. package/dist/chunk-GD5JGKM7.js +0 -2
  362. package/dist/chunk-GD5JGKM7.js.map +0 -7
  363. package/dist/chunk-GZ7X34QP.js +0 -2
  364. package/dist/chunk-KCEUD232.js +0 -2
  365. package/dist/chunk-KCEUD232.js.map +0 -7
  366. package/dist/chunk-KLLAY2IM.js +0 -2
  367. package/dist/chunk-LBJSMXLV.js +0 -2
  368. package/dist/chunk-LBJSMXLV.js.map +0 -7
  369. package/dist/chunk-LW2WRUVL.js +0 -2
  370. package/dist/chunk-MW3RWBZ7.js +0 -2
  371. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  372. package/dist/chunk-OEAXCCVM.js +0 -2
  373. package/dist/chunk-OEAXCCVM.js.map +0 -7
  374. package/dist/chunk-UB5RYS7T.js +0 -2
  375. package/dist/chunk-UB5RYS7T.js.map +0 -7
  376. package/dist/chunk-UXXJOU5J.js +0 -2
  377. package/dist/chunk-VU3GIDZ3.js +0 -2
  378. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  379. package/dist/chunk-W2BAFOCN.js +0 -3
  380. package/dist/chunk-W2BAFOCN.js.map +0 -7
  381. package/dist/chunk-WFGTQZIQ.js +0 -2
  382. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  383. package/dist/chunk-XX2MVWFS.js +0 -4
  384. package/dist/chunk-XYZ6VZ5T.js +0 -2
  385. package/dist/chunk-YBAYEU25.js +0 -2
  386. package/dist/chunk-YF75HKL6.js +0 -2
  387. package/dist/chunk-YF75HKL6.js.map +0 -7
  388. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  389. /package/dist/{chunk-W3H7GTJY.js.map → chunk-2YRQULDC.js.map} +0 -0
  390. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  391. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  392. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  393. /package/dist/{chunk-3TAW4AKH.js.map → chunk-4AZ44KV4.js.map} +0 -0
  394. /package/dist/{chunk-TZOQWCVH.js.map → chunk-4CWYF4O7.js.map} +0 -0
  395. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  396. /package/dist/{chunk-2YZB6XQR.js.map → chunk-4S3HRFQB.js.map} +0 -0
  397. /package/dist/{chunk-OGRFQTXA.js.map → chunk-643FOYQB.js.map} +0 -0
  398. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  399. /package/dist/{chunk-JK74QK3M.js.map → chunk-6PZPBPAD.js.map} +0 -0
  400. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  401. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  402. /package/dist/{chunk-M242VYZA.js.map → chunk-AT7VFZRB.js.map} +0 -0
  403. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  404. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  405. /package/dist/{chunk-FEHGU6EP.js.map → chunk-C3MWS7P2.js.map} +0 -0
  406. /package/dist/{chunk-G2KUK6AT.js.map → chunk-CFGCB37K.js.map} +0 -0
  407. /package/dist/{chunk-JI265XFO.js.map → chunk-CMV3F6HR.js.map} +0 -0
  408. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  409. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  410. /package/dist/{chunk-HXDTGP2K.js.map → chunk-DWA45BWR.js.map} +0 -0
  411. /package/dist/{chunk-5QUY72FX.js.map → chunk-F4HZUAKM.js.map} +0 -0
  412. /package/dist/{chunk-Q26YZYTD.js.map → chunk-FPU53CCV.js.map} +0 -0
  413. /package/dist/{chunk-3S24ZRPK.js.map → chunk-GEBAYD6N.js.map} +0 -0
  414. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  415. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  416. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-HLS5FI55.js.map} +0 -0
  417. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  418. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-J5QPFJ7M.js.map} +0 -0
  419. /package/dist/{chunk-5BC72727.js.map → chunk-JSEI44A7.js.map} +0 -0
  420. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  421. /package/dist/{chunk-NXSTUFS7.js.map → chunk-NNR2FNHG.js.map} +0 -0
  422. /package/dist/{chunk-XHOBNSBO.js.map → chunk-P4O57S6N.js.map} +0 -0
  423. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  424. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-RG6SHPHF.js.map} +0 -0
  425. /package/dist/{chunk-EDUMAMK4.js.map → chunk-S2CMWKVB.js.map} +0 -0
  426. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  427. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-U5L76VVB.js.map} +0 -0
  428. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-UQRQH2JW.js.map} +0 -0
  429. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XFIREDWO.js.map} +0 -0
  430. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  431. /package/dist/{chunk-I4SP6JTU.js.map → chunk-Z6L55FTN.js.map} +0 -0
  432. /package/dist/{chunk-6VBK2I5B.js.map → chunk-ZSPJZ3ZH.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/searchgrid/searchgrid.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { FilterOp, FilterSpec } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Grid } from '../grid/grid';\n\n/** A filter field of a lookup: a field config or a field instance (`ui.text(...)`); `op` and `field` say how its value is matched. */\nexport type LookupFilter = (AnyConfig & { name: string; op?: FilterOp; field?: string }) | Component;\n\n/** `name`, `op`, `field` and `type` of a filter, whether it was given as a config or an instance. */\nexport const filterInfo = (f: LookupFilter) => (f instanceof Component ? f.config : f) as { name: string; op?: FilterOp; field?: string; type?: string };\n\n/** Everything that describes \"search for a record\": shared by SearchGrid and LookupField. */\nexport interface LookupDef {\n /** A function gives every instance its own store (recommended when the definition is reused). */\n store: Store<any> | (() => Store<any>);\n columns: Column[];\n filters?: LookupFilter[];\n /** Name of the filter that receives the quick text (LookupField typing). Default: the first filter. */\n queryField?: string;\n valueField?: string;\n displayField?: string;\n selection?: 'single' | 'multi';\n paging?: boolean;\n /** Search when shown. Default true. */\n autoSearch?: boolean;\n title?: string;\n width?: number;\n height?: number;\n}\n\nconst defs = new Map<string, LookupDef>();\n/** Registers a lookup definition for declarative use by name (`lookup: 'people'`). */\nexport function registerLookup(name: string, def: LookupDef): void {\n defs.set(name, def);\n}\nexport function resolveLookup(lookup: LookupDef | string): LookupDef {\n const d = typeof lookup === 'string' ? defs.get(lookup) : lookup;\n if (!d) throw new Error(`Optikos: unknown lookup \"${lookup}\". Did you call registerLookup?`);\n return d;\n}\nexport const lookupStore = (def: LookupDef): Store<any> => (typeof def.store === 'function' ? def.store() : def.store);\n\nexport interface SearchGridConfig extends ComponentConfig {\n lookup: LookupDef | string;\n}\n\nconst textual = (type?: string) => !type || type === 'textfield' || type === 'textarea';\nconst blank = (v: unknown) => v == null || v === '' || (Array.isArray(v) && !v.length);\n\n/** Filters on top, results grid below. The Store does the searching; this component only turns the filter fields into specs. */\nexport class SearchGrid extends Component<SearchGridConfig> {\n protected override baseCls = 'op-searchgrid';\n private def!: LookupDef;\n private store!: Store<any>;\n private fields: Array<{ cfg: ReturnType<typeof filterInfo>; cmp: Component; own: boolean }> = [];\n private grid!: Grid;\n private form!: HTMLElement;\n\n protected override build() {\n this.def = resolveLookup(this.config.lookup);\n this.store = lookupStore(this.def);\n const d = this.def;\n this.form = h('div', 'op-searchgrid__filters', { role: 'search' });\n const btns = [\n new Button({ text: t('search'), icon: 'search', variant: 'primary', handler: () => void this.search() }),\n new Button({ text: t('clear'), handler: () => this.clear() }),\n ];\n this.fields = (d.filters ?? []).map((f) => {\n const cfg = filterInfo(f);\n const { op: _o, field: _f, ...fieldCfg } = cfg;\n const cmp = f instanceof Component ? f : create({ ...fieldCfg, renderTo: undefined } as AnyConfig);\n cmp.on('enter', () => void this.search());\n return { cfg, cmp, own: !(f instanceof Component) };\n });\n this.form.append(...this.fields.map((f) => f.cmp.el), h('div', 'op-searchgrid__buttons', {}, ...btns.map((b) => b.el)));\n this.grid = new Grid({ store: this.store, columns: d.columns, selection: d.selection ?? 'single', paging: d.paging !== false, flex: 1 });\n this.grid.on('select', (recs: Model[]) => this.emit('select', recs));\n this.grid.on('row-activate', () => this.confirm());\n this.grid.on('row-dblclick', () => this.confirm());\n this.own(() => [...btns, this.grid, ...this.fields.filter((f) => f.own).map((f) => f.cmp)].forEach((c) => c.destroy()));\n return h('div', this.baseCls, {}, this.form, this.grid.el);\n }\n\n protected override onRender() {\n if (this.def.autoSearch !== false) void this.search();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.fields.forEach((f) => f.cmp.notifyMount());\n this.grid.notifyMount();\n }\n\n private confirm() {\n const recs = this.grid.getSelection();\n if (recs.length) this.emit('confirm', recs);\n }\n\n /** The non-empty filter fields as filter specs. */\n getFilters(): FilterSpec[] {\n return this.fields.flatMap(({ cfg, cmp }) => {\n const v = (cmp as any).getValue?.();\n if (blank(v)) return [];\n const field = cfg.field ?? cfg.name;\n if (typeof v === 'object' && !Array.isArray(v) && 'start' in v) return v.start ? [{ field, op: 'between' as const, value: [v.start, v.end ?? v.start] }] : [];\n return [{ field, op: cfg.op ?? (textual(cfg.type) ? 'contains' : 'eq'), value: v }];\n });\n }\n\n /** Filters the store with the current fields (or loads it, when there are none). Resolves when the results are in. */\n async search(query?: string): Promise<void> {\n if (query != null) this.setQuery(query);\n const specs = this.getFilters();\n if (this.emit('before-search', specs) === false) return;\n await (specs.length ? this.store.filter(specs) : this.store.clearFilter());\n this.emit('search', specs);\n }\n\n /** Empties the filter fields and searches again. */\n clear(): void {\n this.fields.forEach((f) => (f.cmp as any).clear?.());\n void this.search();\n }\n\n /** Fills the quick-search field (`queryField`, default the first filter) without searching. */\n setQuery(text: string): void {\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name);\n (this.fields.find((f) => f.cfg.name === name)?.cmp as any)?.setValue?.(text);\n }\n\n getSelection(): Model[] {\n return this.grid.getSelection();\n }\n getGrid(): Grid {\n return this.grid;\n }\n getStore(): Store<any> {\n return this.store;\n }\n override focus(): void {\n (this.fields[0]?.cmp ?? this.grid).focus();\n }\n}\nregister('searchgrid', SearchGrid);\n"],
5
+ "mappings": "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",
6
+ "names": ["filterInfo", "f", "Component", "defs", "registerLookup", "name", "def", "resolveLookup", "lookup", "d", "lookupStore", "textual", "type", "blank", "v", "SearchGrid", "h", "btns", "Button", "t", "cfg", "_o", "_f", "fieldCfg", "cmp", "create", "b", "Grid", "recs", "c", "field", "query", "specs", "text", "register"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as l}from"./chunk-676AKAGF.js";import{g as f,h as u}from"./chunk-4AA4FQEM.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{a as d}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-MW3RWBZ7.js";var n={duration:4e3,position:"top-right",max:5},g={info:"info",success:"success",warning:"alert",error:"error"};function v(e){let t=l().querySelector(`.op-toast-region[data-pos="${e}"]`);return t||(t=i("div","op-toast-region",{"data-pos":e}),l().appendChild(t)),t}var r=class extends d{baseCls="op-toast";cancelTimer;remaining=0;started=0;build(){let t=this.config,s=t.type??"info",o=i("div",`op-toast op-toast--${s}`,{role:s==="error"?"alert":"status"}),a=i("div","op-toast__body",{},t.title?i("div","op-toast__title",{},t.title):null,i("div","op-toast__text",{},t.text??""));if(o.append(i("span","op-toast__icon",{},p(g[s])),a),t.closable!==!1){let c=i("button","op-toast__close",{type:"button","aria-label":h("close")},p("x"));this.listen(c,"click",()=>this.close()),o.append(c)}return this.listen(o,"pointerenter",()=>this.pause()),this.listen(o,"pointerleave",()=>this.resume()),this.listen(o,"focusin",()=>this.pause()),this.listen(o,"focusout",()=>this.resume()),o}show(){let t=this.config.position??n.position,s=v(t);t.startsWith("bottom")?s.append(this.el):s.prepend(this.el);for(let o of Array.from(s.children).filter(a=>a!==this.el).slice(n.max-1))o.dispatchEvent(new Event("op-dismiss"));this.listen(this.el,"op-dismiss",()=>this.close()),this.remaining=this.config.duration??n.duration,this.resume(),u(this.el,{dy:10}),this.config.type==="success"&&f(this.el.querySelector(".op-toast__icon")??this.el),this.emit("show")}pause(){this.cancelTimer&&(this.cancelTimer(),this.cancelTimer=void 0,this.remaining-=Date.now()-this.started)}resume(){this.cancelTimer||this.remaining<=0||this.destroyed||(this.started=Date.now(),this.cancelTimer=this.later(()=>this.close(),this.remaining))}close(){this.destroyed||(this.emit("close"),this.destroy())}};m("toast",r);function y(e){let t=new r(typeof e=="string"?{text:e}:e);return t.show(),{close:()=>t.close()}}y.configure=e=>Object.assign(n,e);export{r as a,y as b};
2
- //# sourceMappingURL=chunk-IHE2MQ3W.js.map
1
+ import{c as p}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-676AKAGF.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{g as f,h as u}from"./chunk-4AA4FQEM.js";import{f as d}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{f as h}from"./chunk-S4QD5NID.js";var n={duration:4e3,position:"top-right",max:5},g={info:"info",success:"success",warning:"alert",error:"error"};function v(e){let t=l().querySelector(`.op-toast-region[data-pos="${e}"]`);return t||(t=i("div","op-toast-region",{"data-pos":e}),l().appendChild(t)),t}var r=class extends d{baseCls="op-toast";cancelTimer;remaining=0;started=0;build(){let t=this.config,s=t.type??"info",o=i("div",`op-toast op-toast--${s}`,{role:s==="error"?"alert":"status"}),a=i("div","op-toast__body",{},t.title?i("div","op-toast__title",{},t.title):null,i("div","op-toast__text",{},t.text??""));if(o.append(i("span","op-toast__icon",{},p(g[s])),a),t.closable!==!1){let c=i("button","op-toast__close",{type:"button","aria-label":h("close")},p("x"));this.listen(c,"click",()=>this.close()),o.append(c)}return this.listen(o,"pointerenter",()=>this.pause()),this.listen(o,"pointerleave",()=>this.resume()),this.listen(o,"focusin",()=>this.pause()),this.listen(o,"focusout",()=>this.resume()),o}show(){let t=this.config.position??n.position,s=v(t);t.startsWith("bottom")?s.append(this.el):s.prepend(this.el);for(let o of Array.from(s.children).filter(a=>a!==this.el).slice(n.max-1))o.dispatchEvent(new Event("op-dismiss"));this.listen(this.el,"op-dismiss",()=>this.close()),this.remaining=this.config.duration??n.duration,this.resume(),u(this.el,{dy:10}),this.config.type==="success"&&f(this.el.querySelector(".op-toast__icon")??this.el),this.emit("show")}pause(){this.cancelTimer&&(this.cancelTimer(),this.cancelTimer=void 0,this.remaining-=Date.now()-this.started)}resume(){this.cancelTimer||this.remaining<=0||this.destroyed||(this.started=Date.now(),this.cancelTimer=this.later(()=>this.close(),this.remaining))}close(){this.destroyed||(this.emit("close"),this.destroy())}};m("toast",r);function y(e){let t=new r(typeof e=="string"?{text:e}:e);return t.show(),{close:()=>t.close()}}y.configure=e=>Object.assign(n,e);export{r as a,y as b};
2
+ //# sourceMappingURL=chunk-J5QPFJ7M.js.map
@@ -0,0 +1,2 @@
1
+ import{a as k}from"./chunk-UQRQH2JW.js";import{b as d,c as u}from"./chunk-676AKAGF.js";import{a as c,b as g}from"./chunk-VV7CFMPZ.js";import{a as v}from"./chunk-TIPK3SCJ.js";import{b,c as y}from"./chunk-4AA4FQEM.js";import{c as r}from"./chunk-2UPUC4RK.js";import{b as m}from"./chunk-PZSHOSOS.js";import{e as l,f as a}from"./chunk-S4QD5NID.js";l("en",{discardText:"Discard your unsaved changes?",discard:"Discard",keepEditing:"Keep editing"});l("pt-BR",{discardText:"Descartar as altera\xE7\xF5es n\xE3o salvas?",discard:"Descartar",keepEditing:"Continuar editando"});var p=class h extends k{baseCls="op-panel op-window";backdrop;visible=!1;cleanup=[];opener=null;moved=!1;leaving=0;constructor(e={}){super({closable:!0,...e})}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","dialog"),this.el.tabIndex=-1,e.modal!==!1&&this.el.setAttribute("aria-modal","true"),e.draggable!==!1&&this.initDrag()}initDrag(){this.headerEl.classList.add("op-window__handle"),this.listen(this.headerEl,"pointerdown",e=>{if(e.target.closest(".op-panel__tool")||e.button)return;let t=this.el.getBoundingClientRect(),i=e.clientX-t.left,n=e.clientY-t.top;this.el.classList.add("is-dragging");let o=f=>{this.el.style.left=`${Math.max(0,Math.min(f.clientX-i,innerWidth-40))}px`,this.el.style.top=`${Math.max(0,Math.min(f.clientY-n,innerHeight-40))}px`,this.moved=!0},s=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s)};document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),this.cleanup.push(s)})}setMask(e){this.config.mask=e,this.backdrop?.classList.toggle("is-clear",!e)}isVisible(){return this.visible}center(){let e=this.el;e.style.left=`${Math.max(0,(innerWidth-e.offsetWidth)/2)}px`,e.style.top=`${Math.max(0,(innerHeight-e.offsetHeight)/3)}px`}keepInView(){if(!this.moved)return this.center();let e=this.el;e.style.top=`${Math.max(0,Math.min(parseFloat(e.style.top)||0,innerHeight-e.offsetHeight))}px`}show(){if(this.visible||this.destroyed||this.emit("before-show")===!1)return;let e=this.config,t=this.el;this.opener=document.activeElement,e.modal!==!1?(this.backdrop=m("div",`op-window-backdrop${e.mask===!1?" is-clear":""}`,{},t),d(this.backdrop,this.opener),this.cleanup.push(u(this.backdrop)),this.listen(this.backdrop,"pointerdown",s=>{s.target===this.backdrop&&(e.closeOnBackdrop?this.close():t.focus())})):d(t,this.opener),this.visible=!0,this.leaving++,t.getAnimations?.().forEach(s=>s.cancel()),this.notifyMount(),this.center(),b(t,this.opener??void 0,"modal"),this.backdrop?.animate?.([{opacity:0},{opacity:1}],{duration:r.ms("modal"),easing:r.easing("enter")}),this.cleanup.push(g(t));let i=s=>{s.key==="Escape"&&e.closeOnEsc!==!1&&!s.defaultPrevented&&(s.stopPropagation(),this.close())};t.addEventListener("keydown",i);let n=()=>this.keepInView();window.addEventListener("resize",n);let o=typeof ResizeObserver=="function"?new ResizeObserver(n):null;o?.observe(t),this.cleanup.push(()=>t.removeEventListener("keydown",i),()=>window.removeEventListener("resize",n),()=>o?.disconnect()),e.autoFocus?this.focusFirst():t.focus(),this.emit("show")}focusFirst(){let e=c(this.bodyEl)[0],t=this.el.querySelector(".op-panel__footer .op-button--primary");(e??t??c(this.el).find(i=>!i.classList.contains("op-panel__tool"))??this.el).focus()}static ask;close(){let e=this.config.confirmDiscard;if(!e||!this.query(i=>i.isDirty?.()===!0).length)return super.close();let t=typeof e=="string"?e:a("discardText");(h.ask?h.ask(t,{okText:a("discard"),cancelText:a("keepEditing")}):Promise.resolve(confirm(t))).then(i=>{!i||this.destroyed||(this.config.confirmDiscard=!1,super.close(),this.config.confirmDiscard=e)})}hide(){!this.visible||this.emit("before-hide")===!1||(this.release(),this.emit("hide"))}release(e=!0){this.visible=!1,this.cleanup.splice(0).reverse().forEach(o=>o());let t=this.backdrop;this.backdrop=void 0;let i=t??this.el,n=e?y(this.el,this.opener??void 0,"modal"):null;if(n){let o=++this.leaving;t?.animate?.([{opacity:1},{opacity:0}],{duration:r.ms("modal","exit"),easing:r.easing("exit"),fill:"forwards"}),n.then(()=>o===this.leaving&&!this.visible&&(i.remove(),t?.remove()))}else i.remove(),t?.remove();this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus()}onDestroy(){this.visible?this.release(!1):this.leaving&&(this.el.closest(".op-window-backdrop")??this.el).remove(),super.onDestroy()}};v("window",p);export{p as a};
2
+ //# sourceMappingURL=chunk-JE56CJX2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/window/window.ts"],
4
+ "sourcesContent": ["import { Panel, type PanelConfig } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus, focusables } from '../../../core/focus';\nimport { popIn, popOut } from '../../../motion/core';\nimport { motion } from '../../../motion/config';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { discardText: 'Discard your unsaved changes?', discard: 'Discard', keepEditing: 'Keep editing' });\naddMessages('pt-BR', { discardText: 'Descartar as altera\u00E7\u00F5es n\u00E3o salvas?', discard: 'Descartar', keepEditing: 'Continuar editando' });\n\nexport interface WindowConfig extends PanelConfig {\n modal?: boolean;\n /** Dims the page behind a modal window. `false` keeps it modal (inert page, trapped focus) but clear. Default true. */\n mask?: boolean;\n draggable?: boolean;\n closeOnEsc?: boolean;\n closeOnBackdrop?: boolean;\n /**\n * On show the focus goes to the dialog itself (it is modal: the focus must be inside), so a phone keyboard does not\n * pop up. `true` focuses its first field instead. Default false.\n */\n autoFocus?: boolean;\n /** Closing while a field inside is changed asks first. `true` uses a standard text; a string is the question. */\n confirmDiscard?: boolean | string;\n}\n\n/** Floating dialog. Modal by default: the page behind becomes inert and Tab stays inside. */\nexport class Window extends Panel<WindowConfig> {\n protected override baseCls = 'op-panel op-window';\n private backdrop?: HTMLElement;\n private visible = false;\n private cleanup: Array<() => void> = [];\n private opener: Element | null = null;\n private moved = false;\n private leaving = 0;\n\n constructor(config: WindowConfig = {}) {\n super({ closable: true, ...config });\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'dialog');\n this.el.tabIndex = -1;\n if (c.modal !== false) this.el.setAttribute('aria-modal', 'true');\n if (c.draggable !== false) this.initDrag();\n }\n\n private initDrag() {\n this.headerEl.classList.add('op-window__handle');\n this.listen(this.headerEl, 'pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).closest('.op-panel__tool') || e.button) return;\n const r = this.el.getBoundingClientRect();\n const dx = e.clientX - r.left;\n const dy = e.clientY - r.top;\n this.el.classList.add('is-dragging');\n const move = (m: PointerEvent) => {\n this.el.style.left = `${Math.max(0, Math.min(m.clientX - dx, innerWidth - 40))}px`;\n this.el.style.top = `${Math.max(0, Math.min(m.clientY - dy, innerHeight - 40))}px`;\n this.moved = true;\n };\n const up = () => {\n this.el.classList.remove('is-dragging');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.cleanup.push(up);\n });\n }\n\n /** Dims (true) or not (false) the page behind the modal window. */\n setMask(mask: boolean): void {\n this.config.mask = mask;\n this.backdrop?.classList.toggle('is-clear', !mask);\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n /** Centers in the viewport (also done on show, on resize and when the content grows, until the user drags it). */\n center(): void {\n const el = this.el;\n el.style.left = `${Math.max(0, (innerWidth - el.offsetWidth) / 2)}px`;\n el.style.top = `${Math.max(0, (innerHeight - el.offsetHeight) / 3)}px`;\n }\n\n /** Keeps the window on screen: centered, or (once dragged) pulled up just enough to fit. */\n private keepInView(): void {\n if (!this.moved) return this.center();\n const el = this.el;\n el.style.top = `${Math.max(0, Math.min(parseFloat(el.style.top) || 0, innerHeight - el.offsetHeight))}px`;\n }\n\n override show(): void {\n if (this.visible || this.destroyed || this.emit('before-show') === false) return;\n const c = this.config;\n const el = this.el;\n this.opener = document.activeElement;\n if (c.modal !== false) {\n this.backdrop = h('div', `op-window-backdrop${c.mask === false ? ' is-clear' : ''}`, {}, el);\n toLayer(this.backdrop, this.opener);\n this.cleanup.push(lockModal(this.backdrop));\n this.listen(this.backdrop, 'pointerdown', (e: Event) => {\n if (e.target !== this.backdrop) return;\n if (c.closeOnBackdrop) this.close();\n else el.focus();\n });\n } else toLayer(el, this.opener);\n this.visible = true;\n this.leaving++;\n el.getAnimations?.().forEach((a) => a.cancel());\n this.notifyMount();\n this.center();\n void popIn(el, this.opener ?? undefined, 'modal'); // grows out of the button that opened it\n this.backdrop?.animate?.([{ opacity: 0 }, { opacity: 1 }], { duration: motion.ms('modal'), easing: motion.easing('enter') });\n this.cleanup.push(trapFocus(el));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented) {\n e.stopPropagation();\n this.close();\n }\n };\n el.addEventListener('keydown', onKey);\n const onResize = () => this.keepInView();\n window.addEventListener('resize', onResize);\n const grow = typeof ResizeObserver === 'function' ? new ResizeObserver(onResize) : null;\n grow?.observe(el);\n this.cleanup.push(() => el.removeEventListener('keydown', onKey), () => window.removeEventListener('resize', onResize), () => grow?.disconnect());\n if (c.autoFocus) this.focusFirst();\n else el.focus();\n this.emit('show');\n }\n\n private focusFirst() {\n const inBody = focusables(this.bodyEl)[0];\n const primary = this.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary');\n (inBody ?? primary ?? focusables(this.el).find((e) => !e.classList.contains('op-panel__tool')) ?? this.el).focus();\n }\n\n /**\n * How `confirmDiscard` asks. MessageBox sets it when it is loaded (it needs Window itself, so Window cannot import it);\n * without MessageBox the browser's own `confirm` is used.\n */\n static ask?: (text: string, o: { okText: string; cancelText: string }) => Promise<boolean>;\n\n override close(): void {\n const ask = this.config.confirmDiscard;\n // a Form or a field: anything that knows whether it was changed\n if (!ask || !this.query((c) => (c as { isDirty?: () => boolean }).isDirty?.() === true).length) return super.close();\n const text = typeof ask === 'string' ? ask : t('discardText');\n void (Window.ask ? Window.ask(text, { okText: t('discard'), cancelText: t('keepEditing') }) : Promise.resolve(confirm(text))).then((yes) => {\n if (!yes || this.destroyed) return;\n this.config.confirmDiscard = false;\n super.close();\n this.config.confirmDiscard = ask;\n });\n }\n\n override hide(): void {\n if (!this.visible || this.emit('before-hide') === false) return;\n this.release();\n this.emit('hide');\n }\n\n /** Cleans up at once (the page is usable again) and takes the window off the screen: shrinking toward its opener, 20 % faster than it came. */\n private release(animate = true) {\n this.visible = false;\n this.cleanup.splice(0).reverse().forEach((f) => f());\n const bd = this.backdrop;\n this.backdrop = undefined;\n const target = bd ?? this.el;\n const out = animate ? popOut(this.el, this.opener ?? undefined, 'modal') : null;\n if (out) {\n const id = ++this.leaving;\n bd?.animate?.([{ opacity: 1 }, { opacity: 0 }], { duration: motion.ms('modal', 'exit'), easing: motion.easing('exit'), fill: 'forwards' });\n void out.then(() => id === this.leaving && !this.visible && (target.remove(), bd?.remove()));\n } else {\n target.remove();\n bd?.remove();\n }\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n }\n\n protected override onDestroy() {\n if (this.visible) this.release(false);\n else if (this.leaving) (this.el.closest('.op-window-backdrop') ?? this.el).remove();\n super.onDestroy();\n }\n}\nregister('window', Window);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "Window", "_Window", "Panel", "config", "c", "r", "dx", "dy", "move", "m", "up", "mask", "el", "h", "toLayer", "lockModal", "e", "a", "popIn", "motion", "trapFocus", "onKey", "onResize", "grow", "inBody", "focusables", "primary", "ask", "text", "t", "yes", "animate", "f", "bd", "target", "out", "popOut", "id", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as f}from"./chunk-4CWYF4O7.js";import{a as h}from"./chunk-JE56CJX2.js";import{a as p,c as g,d as m,e as k}from"./chunk-IUOEPAWG.js";import{c}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as a}from"./chunk-PZSHOSOS.js";import{e as l,f as n}from"./chunk-S4QD5NID.js";l("en",{lookupOpen:"Open search",lookupSelect:"Select"});l("pt-BR",{lookupOpen:"Abrir pesquisa",lookupSelect:"Selecionar"});var d=class extends f{baseCls="op-field op-textfield op-picker op-suggest op-lookup";def;suggestStore;win;constructor(e){let t=g(e.lookup);super({...e,icon:!1,valueField:t.valueField??"id",displayField:t.displayField??"name",query:o=>this.suggest(o)}),this.def=t}async suggest(e){let t=this.suggestStore??=m(this.def),o=this.def.queryField??(this.def.filters?.[0]&&p(this.def.filters[0]).name)??this.config.displayField,i=this.def.filters?.map(p).find(s=>s.name===o)?.field??o;return await t.filter({field:i,op:"contains",value:e}),t.getData()}createControl(){let e=super.createControl(),t=a("button","op-picker__trigger op-lookup__btn",{type:"button",tabindex:-1,"aria-label":n("lookupOpen"),"aria-haspopup":"dialog"},c("search"));return this.listen(t,"mousedown",o=>o.preventDefault()),this.listen(t,"click",()=>this.openDialog()),e.append(t),this.own(()=>this.win?.destroy()),e}onKey(e){e.key==="F4"||e.altKey&&e.key==="ArrowDown"?(e.preventDefault(),this.openDialog()):super.onKey(e)}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-lookup__btn").disabled=e}openDialog(){if(this.win||this.config.disabled||this.config.readonly||!this.rendered)return;this.close();let e=this.def,t=new k({lookup:e,flex:1}),o=this.typed?this.input.value:"";t.on("confirm",r=>i(r));let i=r=>{r[0]&&this.pickRecord(r[0]),s.close()},s=this.win=new h({title:e.title??n("search"),width:e.width??720,height:e.height??520,layout:"fit",items:[t],buttons:[{text:n("cancel"),handler:()=>s.close()},{text:n("lookupSelect"),variant:"primary",handler:()=>i(t.getSelection())}]});s.on("destroy",()=>{this.win=void 0,this.rendered&&this.input.focus()}),s.show(),o&&t.search(o)}pickRecord(e){let{valueField:t,displayField:o}=this.config,i={value:e.get(t),label:String(e.get(o)??e.get(t)??""),raw:e.data};this.pick(i)}};u("lookupfield",d);export{d as a};
2
+ //# sourceMappingURL=chunk-JJLOUMCJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/lookupfield/lookupfield.ts"],
4
+ "sourcesContent": ["import { SuggestField, type SuggestConfig } from '../suggestfield/suggestfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Model } from '../../../data/model';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\nimport { Window } from '../../overlays/window/window';\nimport { SearchGrid, resolveLookup, lookupStore, filterInfo, type LookupDef } from '../../data/searchgrid/searchgrid';\n\naddMessages('en', {\n lookupOpen: 'Open search',\n lookupSelect: 'Select',\n});\naddMessages('pt-BR', {\n lookupOpen: 'Abrir pesquisa',\n lookupSelect: 'Selecionar',\n});\n\nexport interface LookupFieldConfig<V = unknown> extends SuggestConfig<V> {\n /** A definition or the name given to `registerLookup`. */\n lookup: LookupDef | string;\n}\n\n/**\n * Pick a record from a big set: type to get suggestions, or press the magnifier (or F4) to open a search window\n * with filters and a grid. The value is the record's `valueField`; the text is its `displayField`.\n */\nexport class LookupField<V = unknown> extends SuggestField<V> {\n protected override baseCls = 'op-field op-textfield op-picker op-suggest op-lookup';\n private def: LookupDef;\n private suggestStore?: Store<any>;\n private win?: Window;\n\n constructor(config: LookupFieldConfig<V>) {\n const def = resolveLookup(config.lookup);\n super({\n ...config,\n icon: false,\n valueField: def.valueField ?? 'id',\n displayField: def.displayField ?? 'name',\n query: (text) => this.suggest(text),\n });\n this.def = def;\n }\n\n /** Typing: filter a private store by the quick-search field and offer its page of records. */\n private async suggest(text: string) {\n const s = (this.suggestStore ??= lookupStore(this.def));\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name) ?? this.config.displayField!;\n const field = this.def.filters?.map(filterInfo).find((f) => f.name === name)?.field ?? name;\n await s.filter({ field, op: 'contains', value: text });\n return s.getData();\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const btn = h('button', 'op-picker__trigger op-lookup__btn', { type: 'button', tabindex: -1, 'aria-label': t('lookupOpen'), 'aria-haspopup': 'dialog' }, iconEl('search'));\n this.listen(btn, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(btn, 'click', () => this.openDialog());\n wrap.append(btn);\n this.own(() => this.win?.destroy());\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'F4' || (e.altKey && e.key === 'ArrowDown')) {\n e.preventDefault();\n this.openDialog();\n } else super.onKey(e);\n }\n\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-lookup__btn') as HTMLButtonElement).disabled = disabled;\n }\n\n /** Opens the search window; the text typed so far pre-fills the quick-search field. */\n openDialog(): void {\n if (this.win || this.config.disabled || this.config.readonly || !this.rendered) return;\n this.close();\n const d = this.def;\n const sg = new SearchGrid({ lookup: d, flex: 1 });\n const text = this.typed ? this.input.value : '';\n sg.on('confirm', (recs: Model[]) => done(recs));\n const done = (recs: Model[]) => {\n if (recs[0]) this.pickRecord(recs[0]);\n win.close();\n };\n const win: Window = (this.win = new Window({\n title: d.title ?? t('search'),\n width: d.width ?? 720,\n height: d.height ?? 520,\n layout: 'fit',\n items: [sg],\n buttons: [{ text: t('cancel'), handler: () => win.close() }, { text: t('lookupSelect'), variant: 'primary', handler: () => done(sg.getSelection()) }],\n }));\n win.on('destroy', () => {\n this.win = undefined;\n if (this.rendered) this.input.focus();\n });\n win.show();\n if (text) void sg.search(text);\n }\n\n private pickRecord(rec: Model): void {\n const { valueField, displayField } = this.config;\n const item = { value: rec.get(valueField!), label: String(rec.get(displayField!) ?? rec.get(valueField!) ?? ''), raw: rec.data };\n this.pick(item as any);\n }\n}\nregister('lookupfield', LookupField);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "LookupField", "SuggestField", "config", "def", "resolveLookup", "text", "s", "lookupStore", "name", "filterInfo", "field", "f", "wrap", "btn", "h", "t", "iconEl", "e", "disabled", "d", "sg", "SearchGrid", "recs", "done", "win", "Window", "rec", "valueField", "displayField", "item", "register"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import{a as S}from"./chunk-6BOM5KZR.js";import{a as F}from"./chunk-3FCIZKIN.js";import{a as w}from"./chunk-3F4MN2BU.js";import{a as f}from"./chunk-HLS5FI55.js";import{c as d}from"./chunk-BQEFLPDA.js";import{a as x}from"./chunk-XR677UYD.js";import{a as y}from"./chunk-TIPK3SCJ.js";import{f as b}from"./chunk-UDXO3KM3.js";import{b as h}from"./chunk-PZSHOSOS.js";import{e as c,f as l}from"./chunk-S4QD5NID.js";c("en",{stepBack:"Back",stepNext:"Next",stepFinish:"Finish",stepReview:"Review"});c("pt-BR",{stepBack:"Voltar",stepNext:"Pr\xF3ximo",stepFinish:"Concluir",stepReview:"Revis\xE3o"});var u=class extends b{baseCls="op-stepform__review";setContent(e){this.el.replaceChildren(...e)}},m=class extends F{baseCls="op-form op-stepform";stepper;body;pane;backBtn;nextBtn;finishBtn;index=0;pending;notes=[];noteEl;constructor(e){let n,t=e.steps??[],i=e.review?new u:void 0,s=new S({steps:[...t.map(({title:a,description:_,icon:k,optional:R})=>({title:a,description:_,icon:k,optional:R})),...i?[{title:e.reviewTitle??l("stepReview")}]:[]]}),r=[...t.map(a=>({type:"container",title:a.title,cls:"op-stepform__step",layout:a.layout??{type:"grid",columns:2,gap:12},items:a.items})),...i?[{type:"container",title:e.reviewTitle??l("stepReview"),cls:"op-stepform__step",items:[i]}]:[]],o=new d({cls:"op-stepform__body",flex:1,layout:{type:"card"},items:r}),p=new f({text:e.backText??l("stepBack"),handler:()=>n.back()}),g=new f({text:e.nextText??l("stepNext"),variant:"primary",handler:()=>n.next()}),v=new f({text:e.finishText??l("stepFinish"),variant:"primary",htmlType:"submit"}),B=e.cancelText?[new f({text:e.cancelText,variant:"ghost",handler:()=>n.emit("cancel")})]:[],T=new w({cls:"op-stepform__footer",items:[...B,"->",p,g,v]});super({...e,layout:{type:"vbox"},items:[s,o,T]}),n=this,Object.assign(this,{stepper:s,body:o,pane:i,backBtn:p,nextBtn:g,finishBtn:v}),s.on("before-select",a=>(n.goTo(a),!1)),o.on("activate",()=>n.onActivate()),this.own(()=>this.stop())}cfg(){return this.config}count(){return this.body.items.length}real(){return this.count()-(this.pane?1:0)}getStep(){return this.index}getStepCount(){return this.count()}getStepper(){return this.stepper}stepFields(e){let n=this.body.items[e];return n instanceof d?n.query(t=>t instanceof x):[]}validateStep(e){if(e>=this.real())return!0;let n=this.stepFields(e).filter(t=>!t.validate());return this.stepper.setStepState(e,n.length?"error":"done"),!n.length}note(e,n){this.notes[e]=n,e===this.index&&this.showNote()}showNote(){if(!this.rendered)return;let e=this.notes[this.index]??"";if(!this.noteEl){if(!e)return;this.body.el.before(this.noteEl=h("div","op-stepform__note",{role:"alert"}))}this.noteEl.textContent=e,this.noteEl.hidden=!e}busy(e){this.el.classList.toggle("is-validating",e),this.nextBtn.setLoading(e),this.finishBtn.setLoading(e)}stop(){this.pending&&(this.pending.abort(),this.pending=void 0,this.busy(!1))}async check(e){let n=this.cfg().steps[e]?.validate;if(!n)return!0;this.stop();let t=this.pending=new AbortController;this.busy(!0);let i;try{i=await n(this.getValues(),this,t.signal)}catch(r){i=String(r?.message??r)}if(t.signal.aborted)return!1;this.pending=void 0,this.busy(!1);let s=i===!0||i==null;if(this.note(e,typeof i=="string"?i:""),!s&&typeof i=="object")for(let[r,o]of Object.entries(i))this.getField(r)?.setError(o);return s||this.stepper.setStepState(e,"error"),s}goTo(e){if(e<0||e>=this.count()||e===this.index||this.pending&&e>this.index||(this.stop(),this.emit("before-step-change",this.index,e)===!1))return Promise.resolve(!1);let n=this.index,t=s=>this.index!==n?!1:(s!==this.index&&this.body.setActiveItem(s),s!==e&&this.stepFields(s).find(r=>r.getError())?.focus(),s===e);if(this.cfg().linear===!1||e<n)return Promise.resolve(t(e));let i=s=>{for(;s<e;s++){if(!this.validateStep(s))return t(s);if(this.cfg().steps[s]?.validate)return this.check(s).then(r=>r?i(s+1):t(s))}return t(e)};return Promise.resolve(i(n))}next(){return this.goTo(this.index+1)}back(){return this.goTo(this.index-1)}onActivate(){let e=this.body.items.indexOf(this.body.getActiveItem());if(e<0)return;let n=this.index;this.index=e,this.stepper.setActive(e);let t=this.count()-1;this.backBtn.config.hidden=e===0,this.nextBtn.config.hidden=e===t,this.finishBtn.config.hidden=e!==t;for(let[i,s]of[[this.backBtn,e===0],[this.nextBtn,e===t],[this.finishBtn,e!==t]])i.rendered&&(i.el.hidden=s);if(this.pane&&e===t&&this.refreshReview(),this.showNote(),e!==n&&(this.emit("step-change",e,n),this.rendered&&this.el.isConnected&&!this.stepFields(e).some(i=>i.getError()))){let i=this.body.items[e]?.el;this.config.autoFocus?this.stepFields(e)[0]?.focus():i&&(i.tabIndex=-1,i.focus())}}refreshReview(){let e=this.getValues(),n=this.cfg().review;if(typeof n=="function")return this.pane.setContent([n(e,this)]);let t=[];for(let i=0;i<this.real();i++){let s=this.stepFields(i).filter(r=>r.name);s.length&&(t.push(h("h3","op-stepform__review-title",{},String(this.body.items[i].config.title??""))),t.push(h("dl","op-stepform__review-list",{},...s.flatMap(r=>[h("dt","",{},r.config.label??r.config.boxLabel??r.name),h("dd","",{},this.show_(r))]))))}this.pane.setContent(t)}show_(e){let n=e;if(n.getRows)return n.getRows().map((r,o)=>n.getRowFields(o).map(p=>this.show_(p)).filter(p=>p!=="\u2014").join(" \xB7 ")).join(`
2
+ `)||"\u2014";let t=e.getValue();if(typeof t=="boolean")return t?"\u2713":"\u2014";if(e.config.inputType==="password")return t?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":"\u2014";let i=e.getDisplayText();if(i)return i;let s=r=>Array.isArray(r)?r.map(s).join(", "):r&&typeof r=="object"?Object.values(r).map(s).join(" \u2013 "):`${r??""}`;return s(t)||"\u2014"}submit(){if(this.index<this.count()-1)return this.next(),!1;let e=()=>{for(let t=0;t<this.real();t++)this.stepper.setStepState(t,this.stepFields(t).some(i=>i.getError())?"error":"done")};if(this.cfg().steps.some(t=>t.validate)){if(this.pending||this.emit("before-submit")===!1||!this.validate())return e(),!1;let t=this.index;return(async()=>{for(let s=0;s<this.real();s++)if(!await this.check(s)){if(this.index!==t||this.destroyed)return;s!==t&&this.body.setActiveItem(s),this.stepFields(s).find(r=>r.getError())?.focus();return}e();let i=this.getValues();this.emit("submit",i),this.emit("finish",i)})(),!1}let n=super.submit();return e(),n&&this.emit("finish",this.getValues()),n}reset(){this.stop(),this.notes=[],super.reset(),this.clearErrors();for(let e=0;e<this.count();e++)this.stepper.setStepState(e,"pending");this.index!==0&&this.body.setActiveItem(0),this.showNote()}};y("stepform",m);export{m as a};
3
+ //# sourceMappingURL=chunk-JLKIHXZP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/form/stepform/stepform.ts"],
4
+ "sourcesContent": ["import { Form, type FormConfig } from '../form/form';\nimport { Container, type ContainerConfig } from '../../../core/container';\nimport { Component } from '../../../core/component';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Stepper } from '../../navigation/stepper/stepper';\nimport { Button } from '../../base/button/button';\nimport { Toolbar } from '../../layout/toolbar/toolbar';\nimport '../../layout/container/container';\n\naddMessages('en', {\n stepBack: 'Back',\n stepNext: 'Next',\n stepFinish: 'Finish',\n stepReview: 'Review',\n});\naddMessages('pt-BR', {\n stepBack: 'Voltar',\n stepNext: 'Pr\u00F3ximo',\n stepFinish: 'Concluir',\n stepReview: 'Revis\u00E3o',\n});\n\nexport interface FormStep {\n title: string;\n description?: string;\n icon?: string;\n /** May be left alone: the stepper says \"optional\" (its fields are still validated if filled wrongly). */\n optional?: boolean;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n /**\n * A check that may ask the server (an email already taken, a free slug), run when leaving the step forward and on Finish.\n * Return `true`, a message for the whole step, or `{ field: message }`. The signal aborts when the user goes elsewhere.\n */\n validate?: (values: Record<string, any>, form: StepForm, signal: AbortSignal) => StepCheck | Promise<StepCheck>;\n}\n\n/** The result of a step's `validate`: ok, a message for the whole step, or messages per field name. */\nexport type StepCheck = true | string | Record<string, string>;\n\nexport interface StepFormConfig extends FormConfig {\n steps: FormStep[];\n /** Moving forward validates the steps on the way. `false` lets the user click any step. Default true. */\n linear?: boolean;\n /** Adds a last \"Review\" step with a summary of the values; a function renders the summary yourself. */\n review?: boolean | ((values: Record<string, any>, form: StepForm) => string | Node);\n reviewTitle?: string;\n backText?: string;\n nextText?: string;\n finishText?: string;\n /** Shows a Cancel button (fires `cancel`). */\n cancelText?: string;\n /** On a new step, focus its first field (a phone keyboard pops up). Default false: the step panel gets the focus. */\n autoFocus?: boolean;\n}\n\n/** The summary pane of the review step. */\nclass ReviewPane extends Component {\n protected override baseCls = 'op-stepform__review';\n setContent(nodes: Array<Node | string>) {\n this.el.replaceChildren(...nodes);\n }\n}\n\n/** One form, several steps: a Stepper on top, one step at a time, Back / Next / Finish, validation per step and an optional review. */\nexport class StepForm extends Form {\n protected override baseCls = 'op-form op-stepform';\n private stepper!: Stepper;\n private body!: Container;\n private pane?: ReviewPane;\n private backBtn!: Button;\n private nextBtn!: Button;\n private finishBtn!: Button;\n private index = 0;\n /** The step check in flight (Next waits for it; going elsewhere aborts it). */\n private pending?: AbortController;\n /** Each step's general message (from its `validate`), shown in one alert line above the steps. */\n private notes: string[] = [];\n private noteEl?: HTMLElement;\n\n constructor(config: StepFormConfig) {\n let me!: StepForm;\n const steps = config.steps ?? [];\n const review = config.review ? new ReviewPane() : undefined;\n const stepper = new Stepper({ steps: [...steps.map(({ title, description, icon, optional }) => ({ title, description, icon, optional })), ...(review ? [{ title: config.reviewTitle ?? t('stepReview') }] : [])] });\n const panels = [\n ...steps.map((s) => ({ type: 'container', title: s.title, cls: 'op-stepform__step', layout: s.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: s.items })),\n ...(review ? [{ type: 'container', title: config.reviewTitle ?? t('stepReview'), cls: 'op-stepform__step', items: [review] }] : []),\n ];\n const body = new Container({ cls: 'op-stepform__body', flex: 1, layout: { type: 'card' }, items: panels });\n const backBtn = new Button({ text: config.backText ?? t('stepBack'), handler: () => me.back() });\n const nextBtn = new Button({ text: config.nextText ?? t('stepNext'), variant: 'primary', handler: () => me.next() });\n const finishBtn = new Button({ text: config.finishText ?? t('stepFinish'), variant: 'primary', htmlType: 'submit' });\n const cancel = config.cancelText ? [new Button({ text: config.cancelText, variant: 'ghost', handler: () => me.emit('cancel') })] : [];\n const footer = new Toolbar({ cls: 'op-stepform__footer', items: [...cancel, '->', backBtn, nextBtn, finishBtn] });\n super({ ...config, layout: { type: 'vbox' }, items: [stepper, body, footer] });\n me = this;\n Object.assign(this, { stepper, body, pane: review, backBtn, nextBtn, finishBtn });\n stepper.on('before-select', (i: number) => (me.goTo(i), false));\n body.on('activate', () => me.onActivate());\n this.own(() => this.stop());\n }\n\n private cfg(): StepFormConfig {\n return this.config as unknown as StepFormConfig;\n }\n\n private count(): number {\n return this.body.items.length;\n }\n private real(): number {\n return this.count() - (this.pane ? 1 : 0);\n }\n\n getStep(): number {\n return this.index;\n }\n getStepCount(): number {\n return this.count();\n }\n getStepper(): Stepper {\n return this.stepper;\n }\n\n private stepFields(i: number): Field<any>[] {\n const step = this.body.items[i];\n return step instanceof Container ? (step.query((c) => c instanceof Field) as Field<any>[]) : [];\n }\n\n /** Validates one step's fields (marks the errors, sets its state on the stepper). */\n validateStep(i: number): boolean {\n if (i >= this.real()) return true;\n const bad = this.stepFields(i).filter((f) => !f.validate());\n this.stepper.setStepState(i, bad.length ? 'error' : 'done');\n return !bad.length;\n }\n\n /** Sets step `i`'s general message ('' clears it); it shows while that step is the current one. */\n private note(i: number, text: string): void {\n this.notes[i] = text;\n if (i === this.index) this.showNote();\n }\n private showNote(): void {\n if (!this.rendered) return;\n const text = this.notes[this.index] ?? '';\n if (!this.noteEl) {\n if (!text) return;\n this.body.el.before((this.noteEl = h('div', 'op-stepform__note', { role: 'alert' })));\n }\n this.noteEl.textContent = text;\n this.noteEl.hidden = !text;\n }\n\n /** Busy while a step check runs: Next and Finish show their loading state. */\n private busy(on: boolean): void {\n this.el.classList.toggle('is-validating', on);\n this.nextBtn.setLoading(on);\n this.finishBtn.setLoading(on);\n }\n /** Cancels the step check in flight, if any. */\n private stop(): void {\n if (!this.pending) return;\n this.pending.abort();\n this.pending = undefined;\n this.busy(false);\n }\n\n /** Runs step `k`'s `validate`. A failure marks the fields or shows the step's message. Resolves false when aborted too. */\n private async check(k: number): Promise<boolean> {\n const fn = this.cfg().steps[k]?.validate;\n if (!fn) return true;\n this.stop();\n const ctl = (this.pending = new AbortController());\n this.busy(true);\n let res: StepCheck;\n try {\n res = await fn(this.getValues(), this, ctl.signal);\n } catch (e) {\n res = String((e as Error)?.message ?? e); // a failing check is a message, not a broken wizard\n }\n if (ctl.signal.aborted) return false; // gone elsewhere (or destroyed) meanwhile\n this.pending = undefined;\n this.busy(false);\n const ok = res === true || res == null;\n this.note(k, typeof res === 'string' ? res : '');\n if (!ok && typeof res === 'object') for (const [name, msg] of Object.entries(res)) this.getField(name)?.setError(msg);\n if (!ok) this.stepper.setStepState(k, 'error');\n return ok;\n }\n\n /**\n * Moves to a step. Forward with `linear` validates the steps on the way (their fields, then their `validate`) and stops\n * at the first invalid one. Resolves with whether it got there; without a step `validate` on the way it moves at once.\n */\n goTo(j: number): Promise<boolean> {\n if (j < 0 || j >= this.count() || j === this.index) return Promise.resolve(false);\n if (this.pending && j > this.index) return Promise.resolve(false); // a check is running: a second Next does nothing\n this.stop(); // going back cancels it\n if (this.emit('before-step-change', this.index, j) === false) return Promise.resolve(false);\n const from = this.index;\n const land = (target: number) => {\n if (this.index !== from) return false; // the user moved on while a check was running\n if (target !== this.index) this.body.setActiveItem(target);\n if (target !== j) this.stepFields(target).find((f) => f.getError())?.focus();\n return target === j;\n };\n if (this.cfg().linear === false || j < from) return Promise.resolve(land(j));\n const walk = (k: number): boolean | Promise<boolean> => {\n for (; k < j; k++) {\n if (!this.validateStep(k)) return land(k);\n if (this.cfg().steps[k]?.validate) return this.check(k).then((ok) => (ok ? walk(k + 1) : land(k)));\n }\n return land(j);\n };\n return Promise.resolve(walk(from));\n }\n next(): Promise<boolean> {\n return this.goTo(this.index + 1);\n }\n back(): Promise<boolean> {\n return this.goTo(this.index - 1);\n }\n\n /** The card layout changed the visible step (by `goTo`, or because `validate` brought an invalid field into view). */\n private onActivate(): void {\n const i = this.body.items.indexOf(this.body.getActiveItem()!);\n if (i < 0) return;\n const from = this.index;\n this.index = i;\n this.stepper.setActive(i);\n const last = this.count() - 1;\n this.backBtn.config.hidden = i === 0;\n this.nextBtn.config.hidden = i === last;\n this.finishBtn.config.hidden = i !== last;\n for (const [b, hide] of [[this.backBtn, i === 0], [this.nextBtn, i === last], [this.finishBtn, i !== last]] as const) if (b.rendered) b.el.hidden = hide;\n if (this.pane && i === last) this.refreshReview();\n this.showNote();\n if (i !== from) {\n this.emit('step-change', i, from);\n if (this.rendered && this.el.isConnected && !this.stepFields(i).some((f) => f.getError())) {\n const panel = this.body.items[i]?.el;\n if ((this.config as StepFormConfig).autoFocus) this.stepFields(i)[0]?.focus();\n else if (panel) ((panel.tabIndex = -1), panel.focus());\n }\n }\n }\n\n private refreshReview(): void {\n const values = this.getValues();\n const fn = this.cfg().review;\n if (typeof fn === 'function') return this.pane!.setContent([fn(values, this)]);\n const out: Array<Node | string> = [];\n for (let i = 0; i < this.real(); i++) {\n const rows = this.stepFields(i).filter((f) => f.name);\n if (!rows.length) continue;\n out.push(h('h3', 'op-stepform__review-title', {}, String((this.body.items[i].config as { title?: string }).title ?? '')));\n out.push(h('dl', 'op-stepform__review-list', {}, ...rows.flatMap((f) => [h('dt', '', {}, f.config.label ?? (f.config as { boxLabel?: string }).boxLabel ?? f.name!), h('dd', '', {}, this.show_(f))])));\n }\n this.pane!.setContent(out);\n }\n\n /** What the user sees for a field (its display text; ticks for booleans, dots for passwords; one line per FieldList row). */\n private show_(f: Field<any>): string {\n const fl = f as Field<any> & { getRows?(): unknown[]; getRowFields(i: number): Field<any>[] };\n if (fl.getRows)\n return fl.getRows().map((_, i) => fl.getRowFields(i).map((x) => this.show_(x)).filter((t) => t !== '\u2014').join(' \u00B7 ')).join('\\n') || '\u2014';\n const v = f.getValue();\n if (typeof v === 'boolean') return v ? '\u2713' : '\u2014';\n if ((f.config as { inputType?: string }).inputType === 'password') return v ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '\u2014';\n const text = f.getDisplayText();\n if (text) return text;\n const flat = (x: unknown): string => (Array.isArray(x) ? x.map(flat).join(', ') : x && typeof x === 'object' ? Object.values(x).map(flat).join(' \u2013 ') : `${x ?? ''}`);\n return flat(v) || '\u2014';\n }\n\n /** Enter and the Finish button: Next on every step but the last; on the last, validate everything and `finish`. */\n override submit(): boolean {\n if (this.index < this.count() - 1) {\n void this.next();\n return false;\n }\n const states = () => {\n for (let i = 0; i < this.real(); i++) this.stepper.setStepState(i, this.stepFields(i).some((f) => f.getError()) ? 'error' : 'done');\n };\n // with step checks, Finish waits for them (it returns false now; `finish` fires when they pass)\n if (this.cfg().steps.some((s) => s.validate)) {\n if (this.pending || this.emit('before-submit') === false || !this.validate()) return states(), false;\n const at = this.index;\n void (async () => {\n for (let k = 0; k < this.real(); k++) {\n if (!(await this.check(k))) {\n if (this.index !== at || this.destroyed) return; // the user went back: the check was aborted\n if (k !== at) this.body.setActiveItem(k);\n this.stepFields(k).find((f) => f.getError())?.focus();\n return;\n }\n }\n states();\n const values = this.getValues();\n this.emit('submit', values);\n this.emit('finish', values);\n })();\n return false;\n }\n const ok = super.submit();\n states();\n if (ok) this.emit('finish', this.getValues());\n return ok;\n }\n\n /** Clears the values and goes back to the first step. */\n override reset(): void {\n this.stop();\n this.notes = [];\n super.reset();\n this.clearErrors();\n for (let i = 0; i < this.count(); i++) this.stepper.setStepState(i, 'pending');\n if (this.index !== 0) this.body.setActiveItem(0);\n this.showNote();\n }\n}\nregister('stepform', StepForm);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "ReviewPane", "Component", "nodes", "StepForm", "Form", "config", "me", "steps", "review", "stepper", "Stepper", "title", "description", "icon", "optional", "t", "panels", "s", "body", "Container", "backBtn", "Button", "nextBtn", "finishBtn", "cancel", "footer", "Toolbar", "i", "step", "c", "Field", "bad", "f", "text", "on", "k", "fn", "ctl", "res", "e", "ok", "name", "msg", "j", "from", "land", "target", "walk", "last", "b", "hide", "panel", "values", "out", "rows", "fl", "_", "x", "v", "flat", "states", "at", "register"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as m}from"./chunk-LQRFNQ2N.js";import{b as f}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{b as p}from"./chunk-PZSHOSOS.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{e as d,f as l}from"./chunk-MW3RWBZ7.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-5BC72727.js.map
1
+ import{a as m}from"./chunk-UQRQH2JW.js";import{b as f}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{b as p}from"./chunk-PZSHOSOS.js";import{e as d,f as l}from"./chunk-S4QD5NID.js";d("en",{wDockLeft:"Dock to the left",wDockRight:"Dock to the right",wDockTop:"Dock to the top",wDockBottom:"Dock to the bottom",wResize:"Resize"});d("pt-BR",{wDockLeft:"Fixar \xE0 esquerda",wDockRight:"Fixar \xE0 direita",wDockTop:"Fixar em cima",wDockBottom:"Fixar embaixo",wResize:"Redimensionar"});var v=160,w={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},y={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},b=["right","left","top","bottom"],a=class extends m{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;grip;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:w[o],label:l(y[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.setResizable(!!e.resizable),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!b.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of b)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e));this.paintGrip()}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.paintGrip(),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.paintGrip(),this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=h=>this.moveTo(h.clientX-o,h.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}setResizable(e){if(this.config.resizable=e,!this.rendered||(this.grip?.remove(),this.grip=void 0,!e||this.config.floating===!1))return;let t=this.grip=p("div","op-widget__resize",{role:"separator",tabindex:0,"aria-label":l("wResize")});this.el.append(t),this.listen(t,"pointerdown",i=>{if(i.button)return;i.preventDefault();let o=this.el.getBoundingClientRect(),s=i.clientX,n=i.clientY;this.el.classList.add("is-resizing");let r=c=>this.resizeBy(o,c.clientX-s,c.clientY-n),h=()=>{this.el.classList.remove("is-resizing"),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",h)};document.addEventListener("pointermove",r),document.addEventListener("pointerup",h),this.own(h)}),this.listen(t,"keydown",i=>{let o=i.shiftKey?64:16,s={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]};!s[i.key]||i.altKey||(i.preventDefault(),this.resizeBy(this.el.getBoundingClientRect(),...s[i.key]))}),this.paintGrip()}resizeBy(e,t,i){let o=(n,r)=>Math.round(Math.max(v,Math.min(n,r)));if(this.pos)t&&(this.el.style.width=`${o(e.width+t,innerWidth-this.pos.x)}px`),i&&(this.el.style.height=`${o(e.height+i,innerHeight-this.pos.y)}px`);else{let n=this.getSide(),r=n==="left"||n==="right",h=n==="right"?-t:n==="left"?t:n==="bottom"?-i:i;this.setSize(o((r?e.width:e.height)+h,(r?innerWidth:innerHeight)-32))}this.paintGrip();let s=this.el.getBoundingClientRect();this.emit("resize",{width:Math.round(s.width),height:Math.round(s.height)})}paintGrip(){let e=this.grip;if(!e)return;let t=this.getSide(),i=!!this.pos||t==="left"||t==="right",o=this.el.getBoundingClientRect();e.setAttribute("aria-orientation",i?"vertical":"horizontal"),e.setAttribute("aria-valuemin",String(v)),e.setAttribute("aria-valuenow",String(Math.round(i?o.width:o.height)))}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,f(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),e.tabIndex<0&&!e.hasAttribute("tabindex")&&(e.tabIndex=-1),(this.config.autoFocus&&u(this.getBody())[0]||e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};g("widget",a);export{a};
2
+ //# sourceMappingURL=chunk-JSEI44A7.js.map
@@ -0,0 +1,2 @@
1
+ import{a as y}from"./chunk-3VDLX7ET.js";var T=0;function u(s,r){return s==null||!r?.type?s:r.type==="number"?s===""?null:Number(s):r.type==="boolean"?s==="false"?!1:!!s:String(s)}var f=class{constructor(r={},e={}){this.def=e;let t={...r};for(let i in e.fields){let o=e.fields[i];t[i]=u(t[i]===void 0?o.default:t[i],o)}this.data=t,this.phantom=this.data[e.idField??"id"]===void 0}def;data;phantom;owner;clientId=`c${++T}`;original={};get id(){return this.data[this.def.idField??"id"]??this.clientId}get(r){return this.data[r]}set(r,e){let t=u(e,this.def.fields?.[r]);this.data[r]!==t&&(r in this.original||(this.original[r]=this.data[r]),this.data[r]=t,this.owner?.recordChanged(this,r))}patch(r){let e=!1;for(let t in r){let i=u(r[t],this.def.fields?.[t]);t in this.original||this.data[t]===i||(this.data[t]=i,e=!0)}return e}isDirty(){return Object.keys(this.original).length>0}getChanges(){let r={};for(let e in this.original)r[e]=this.data[e];return r}commit(){this.original={},this.phantom=!1}reject(){Object.assign(this.data,this.original),this.original={}}};var b,w=(s,r)=>s==null?r==null?0:1:r==null?-1:typeof s=="string"&&typeof r=="string"?(b??=new Intl.Collator(void 0,{numeric:!0})).compare(s,r):s<r?-1:s>r?1:0,h=s=>String(s??"").toLowerCase(),g=s=>s==null||s===""||Array.isArray(s)&&!s.length,x=/^\d{4}-\d{2}-\d{2}(T[\d:.]+Z?)?$/,l=s=>s instanceof Date?s.getTime():typeof s=="string"&&x.test(s)?Date.parse(s):s;function M(s,r){let e=s.value,t=l(r),i=()=>!g(r)&&t>=l(e[0])&&t<=l(e[1]),o=()=>e.some(n=>l(n)==t);switch(s.op??"eq"){case"eq":return t==l(e);case"ne":return t!=l(e);case"contains":return h(r).includes(h(e));case"notContains":return!h(r).includes(h(e));case"startsWith":return h(r).startsWith(h(e));case"endsWith":return h(r).endsWith(h(e));case"gt":return t>l(e);case"ge":return t>=l(e);case"lt":return t<l(e);case"le":return t<=l(e);case"between":return i();case"notBetween":return!i();case"in":return o();case"nin":return!o();case"empty":return g(r);case"notEmpty":return!g(r)}}function m(s,r){return"filters"in s?s.filters.length?s.op==="or"?s.filters.some(e=>m(e,r)):s.filters.every(e=>m(e,r)):!0:M(s,r[s.field])}var v=class extends y{constructor(e={}){super();this.cfg=e;this.sorters=e.sorters??[],this.pageLen=e.pageSize??0;for(let t in e.listeners)this.on(t,e.listeners[t]);e.proxy&&(this.proxy=typeof e.proxy=="function"?{read:e.proxy}:e.proxy),e.data&&this.setRecords(e.data.map(t=>this.wrap(t)),e.data.length),e.autoLoad&&this.proxy&&this.load()}cfg;all=[];rows=[];visible=[];removed=[];sorters;filters=[];params={};proxy;pageNo=1;pageLen;total=0;abort;loading=!1;get remote(){return!!this.cfg.remote&&!!this.proxy}wrap(e){let t=e instanceof f?e:new f(e,this.cfg.model);return t.owner=this,t}fire(e,...t){this.emit(e,...t),this.emit("change",{type:e})}get count(){return this.visible.length}get totalCount(){return this.remote?this.total:this.rows.length}getFiltered(){return this.rows}getAt(e){return this.visible[e]}getRange(e=0,t=this.visible.length){return this.visible.slice(e,t)}getById(e){return this.all.find(t=>t.id===e)}indexOf(e){return this.visible.indexOf(e)}getData(){return this.visible.map(e=>e.data)}each(e){this.visible.forEach(e)}loadData(e){this.removed=[],this.setRecords(e.map(t=>this.wrap(t)),e.length),this.fire("load")}async load(e){if(!this.proxy)throw new Error("Optikos Store: load() needs a proxy");e&&(this.params=e);let t={...this.params};if(this.remote&&Object.assign(t,{page:this.pageNo,pageSize:this.pageLen||void 0,sorters:this.sorters,filters:this.filters.filter(o=>typeof o!="function")}),this.emit("before-load",t)===!1)return;this.abort?.abort();let i=this.abort=new AbortController;this.loading=!0,this.emit("loading",!0);try{let o=await this.proxy.read(t,i.signal);if(i.signal.aborted)return;let{data:n,total:a}=Array.isArray(o)?{data:o,total:o.length}:o;this.removed=[],this.setRecords(n.map(d=>this.wrap(d)),a??n.length),this.loading=!1,this.emit("loading",!1),this.fire("load")}catch(o){if(i.signal.aborted)return;this.loading=!1,this.emit("loading",!1),this.emit("load-error",o)}}async fetchAll(e=500){if(!this.remote)return this.rows;let t=[],i={...this.params,pageSize:e,sorters:this.sorters,filters:this.filters.filter(o=>typeof o!="function")};for(let o=1;;o++){let n=await this.proxy.read({...i,page:o}),{data:a,total:d}=Array.isArray(n)?{data:n,total:n.length}:n;if(t.push(...a.map(c=>new f(c,this.cfg.model))),!a.length||t.length>=(d??0)||a.length<e)return t}}setRecords(e,t){this.all=e,this.total=t,this.refreshView()}refreshView(){if(this.remote){this.rows=this.visible=this.all;return}let e=this.all;this.filters.length&&(e=e.filter(i=>this.filters.every(o=>typeof o=="function"?o(i):m(o,i.data)))),this.sorters.length&&(e=[...e].sort((i,o)=>{for(let n of this.sorters){let a=w(i.data[n.field],o.data[n.field]);if(a)return n.dir==="desc"?-a:a}return 0})),this.rows=e;let t=this.pageCount;this.pageNo>t&&(this.pageNo=t),this.visible=this.pageLen?e.slice((this.pageNo-1)*this.pageLen,this.pageNo*this.pageLen):e}getSorters(){return this.sorters}sort(e,t){let i=this.sorters[0];this.sorters=e?[{field:e,dir:t??(i?.field===e&&i.dir==="asc"?"desc":"asc")}]:[],this.pageNo=1,this.changeView("sort")}filter(e){return this.filters=Array.isArray(e)?e:[e],this.pageNo=1,this.changeView("filter")}clearFilter(){return this.filters=[],this.pageNo=1,this.changeView("filter")}getFilters(){return this.filters.filter(e=>typeof e!="function")}changeView(e){return this.remote?this.load():(this.refreshView(),this.fire(e),Promise.resolve())}get page(){return this.pageNo}get pageSize(){return this.pageLen}get pageCount(){return this.pageLen?Math.max(1,Math.ceil(this.totalCount/this.pageLen)):1}setPage(e){e=Math.min(Math.max(1,e),this.pageCount),e!==this.pageNo&&(this.pageNo=e,this.remote?this.load():(this.refreshView(),this.fire("page")))}setPageSize(e){this.pageLen=e,this.pageNo=1,this.changeView("page")}add(e){let t=(Array.isArray(e)?e:[e]).map(i=>this.wrap(i));return this.all=[...this.all,...t],this.total+=t.length,this.refreshView(),this.fire("add",t),t}insert(e,t){let i=this.wrap(t);return this.all=[...this.all.slice(0,e),i,...this.all.slice(e)],this.total++,this.refreshView(),this.fire("add",[i]),i}remove(e){let i=(Array.isArray(e)?e:[typeof e=="number"?this.visible[e]:e]).filter(o=>o&&this.all.includes(o));i.length&&(this.all=this.all.filter(o=>!i.includes(o)),this.removed.push(...i.filter(o=>!o.phantom)),this.total-=i.length,this.refreshView(),this.fire("remove",i))}applyPatches(e){let t=this.cfg.model?.idField??"id",i=new Map(this.all.map(a=>[a.id,a])),o=[],n=!1;for(let a of e){let d=a.id??a.data?.[t],c=d===void 0?void 0:i.get(d);if(a.op==="remove"){if(!c)continue;i.delete(d),this.all=this.all.filter(p=>p!==c),this.total--,n=!0}else if(c)n=c.patch(a.data)||n;else if(a.data){let p=this.wrap(a.data);o.push(p),i.set(p.id,p)}}o.length&&(this.all=[...this.all,...o],this.total+=o.length),!(!o.length&&!n)&&(this.refreshView(),this.fire("patch",e))}connect(e,t=i=>typeof i=="string"?JSON.parse(i):i){let i=o=>{let n=t(o.data);this.applyPatches(Array.isArray(n)?n:[n])};return e.addEventListener("message",i),()=>e.removeEventListener("message",i)}clear(){this.removed.push(...this.all.filter(e=>!e.phantom)),this.setRecords([],0),this.fire("remove",[])}recordChanged(e,t){(this.sorters.some(i=>i.field===t)||this.filters.length)&&this.refreshView(),this.fire("update",e,t)}getModified(){return this.all.filter(e=>e.phantom||e.isDirty())}getRemoved(){return this.removed}commitChanges(){this.all.forEach(e=>e.commit()),this.removed=[]}async sync(){let e=this.proxy;if(!e)throw new Error("Optikos Store: sync() needs a proxy");for(let t of this.removed)await e.destroy?.(t.data);this.removed=[];for(let t of this.all){if(t.phantom)Object.assign(t.data,await e.create?.(t.data)??{});else if(t.isDirty())Object.assign(t.data,await e.update?.(t.data)??{});else continue;t.commit()}this.fire("sync")}subscribe(e){return this.on("change",e)}};export{f as a,m as b,v as c};
2
+ //# sourceMappingURL=chunk-L5SQQFO7.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/data/model.ts", "../src/data/store.ts"],
4
+ "sourcesContent": ["export interface FieldDef {\n type?: 'string' | 'number' | 'boolean';\n default?: unknown;\n}\nexport interface ModelDef {\n idField?: string;\n fields?: Record<string, FieldDef>;\n}\n\nexport interface RecordOwner {\n recordChanged(rec: Model, field: string): void;\n}\n\nlet cid = 0;\n\nfunction convert(v: unknown, def?: FieldDef): unknown {\n if (v == null || !def?.type) return v;\n if (def.type === 'number') return v === '' ? null : Number(v);\n if (def.type === 'boolean') return v === 'false' ? false : Boolean(v);\n return String(v);\n}\n\n/** One record. `data` holds the values; `set` tracks the original value of each changed field. */\nexport class Model<T extends Record<string, any> = Record<string, any>> {\n data: T;\n phantom: boolean;\n owner?: RecordOwner;\n private readonly clientId = `c${++cid}`;\n private original: Partial<T> = {};\n\n constructor(raw: Partial<T> = {}, private def: ModelDef = {}) {\n const data: Record<string, unknown> = { ...raw };\n for (const f in def.fields) {\n const fd = def.fields[f];\n data[f] = convert(data[f] === undefined ? fd.default : data[f], fd);\n }\n this.data = data as T;\n this.phantom = this.data[def.idField ?? 'id'] === undefined;\n }\n\n get id(): string | number {\n return this.data[this.def.idField ?? 'id'] ?? this.clientId;\n }\n\n get<K extends keyof T>(field: K): T[K] {\n return this.data[field];\n }\n\n set<K extends keyof T>(field: K, value: T[K]): void {\n const v = convert(value, this.def.fields?.[field as string]) as T[K];\n if (this.data[field] === v) return;\n if (!(field in this.original)) this.original[field] = this.data[field];\n this.data[field] = v;\n this.owner?.recordChanged(this as Model, field as string);\n }\n\n /** Applies values that came from the server. It is not an edit (nothing becomes dirty), and a field the user already changed keeps their value. */\n patch(raw: Partial<T>): boolean {\n let changed = false;\n for (const k in raw) {\n const v = convert(raw[k], this.def.fields?.[k]) as T[typeof k];\n if (k in this.original || this.data[k] === v) continue;\n this.data[k] = v;\n changed = true;\n }\n return changed;\n }\n\n isDirty(): boolean {\n return Object.keys(this.original).length > 0;\n }\n getChanges(): Partial<T> {\n const out: Partial<T> = {};\n for (const k in this.original) out[k] = this.data[k];\n return out;\n }\n commit(): void {\n this.original = {};\n this.phantom = false;\n }\n reject(): void {\n Object.assign(this.data, this.original);\n this.original = {};\n }\n}\n", "import { Emitter } from '../core/emitter';\nimport { Model, type ModelDef, type RecordOwner } from './model';\nimport type { FilterNode, FilterSpec, Proxy, ReadParams, ReadResult, Sorter } from './proxy';\n\nexport type StoreProxy<T> = Proxy<T> | ((params: ReadParams, signal?: AbortSignal) => Promise<ReadResult<T> | T[]> | ReadResult<T> | T[]);\nexport type FilterFn<T extends Record<string, any>> = (rec: Model<T>) => boolean;\n\n/** One live change: `upsert` merges `data` into the record with the same id (or adds it), `remove` drops the record with `id`. */\nexport interface Patch<T> {\n op?: 'upsert' | 'remove';\n data?: Partial<T>;\n id?: string | number;\n}\n/** What `connect` needs from a source: an `EventSource` or a `WebSocket` both fit. */\nexport interface LiveSource {\n addEventListener(type: 'message', fn: (e: { data: any }) => void): void;\n removeEventListener(type: 'message', fn: (e: { data: any }) => void): void;\n}\n\nexport interface StoreConfig<T extends Record<string, any>> {\n data?: Partial<T>[];\n model?: ModelDef;\n proxy?: StoreProxy<T>;\n /** 0 = no paging. */\n pageSize?: number;\n /** Sort, filter and paging are done by the proxy (it receives them in `read`). Default false: done locally. */\n remote?: boolean;\n sorters?: Sorter[];\n autoLoad?: boolean;\n listeners?: Record<string, (...a: any[]) => unknown>;\n}\n\n// One collator, made on first use: `localeCompare` with options builds a new one per call (100k rows: 5.4 s \u2192 0.4 s).\nlet collator: Intl.Collator | undefined;\nconst cmp = (a: any, b: any) => (a == null ? (b == null ? 0 : 1) : b == null ? -1 : typeof a === 'string' && typeof b === 'string' ? (collator ??= new Intl.Collator(undefined, { numeric: true })).compare(a, b) : a < b ? -1 : a > b ? 1 : 0);\n\nconst text = (v: any) => String(v ?? '').toLowerCase();\nconst empty = (v: any) => v == null || v === '' || (Array.isArray(v) && !v.length);\nconst ISO = /^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+Z?)?$/;\n/** Dates (Date objects or ISO strings) compare by time; anything else compares as is. */\nconst num = (v: any) => (v instanceof Date ? v.getTime() : typeof v === 'string' && ISO.test(v) ? Date.parse(v) : v);\n\nfunction test(spec: FilterSpec, raw: any): boolean {\n const x = spec.value as any;\n const v = num(raw);\n const between = () => !empty(raw) && v >= num(x[0]) && v <= num(x[1]);\n const listed = () => (x as unknown[]).some((i) => num(i) == v);\n switch (spec.op ?? 'eq') {\n case 'eq': return v == num(x);\n case 'ne': return v != num(x);\n case 'contains': return text(raw).includes(text(x));\n case 'notContains': return !text(raw).includes(text(x));\n case 'startsWith': return text(raw).startsWith(text(x));\n case 'endsWith': return text(raw).endsWith(text(x));\n case 'gt': return v > num(x);\n case 'ge': return v >= num(x);\n case 'lt': return v < num(x);\n case 'le': return v <= num(x);\n case 'between': return between();\n case 'notBetween': return !between();\n case 'in': return listed();\n case 'nin': return !listed();\n case 'empty': return empty(raw);\n case 'notEmpty': return !empty(raw);\n }\n}\n\n/** Does a record's data satisfy a filter node? Groups are AND/OR; an empty group matches everything. */\nexport function matchFilter(node: FilterNode, data: Record<string, any>): boolean {\n if ('filters' in node) {\n if (!node.filters.length) return true;\n return node.op === 'or' ? node.filters.some((f) => matchFilter(f, data)) : node.filters.every((f) => matchFilter(f, data));\n }\n return test(node, data[node.field]);\n}\n\n/**\n * Records + a view over them (filtered, sorted, paged). Events: `load`, `before-load`, `load-error`, `add`, `remove`,\n * `update`, `sort`, `filter`, `page`, `sync`, and `change` for any of them (payload `{ type }`).\n */\nexport class Store<T extends Record<string, any> = Record<string, any>> extends Emitter implements RecordOwner {\n private all: Model<T>[] = [];\n private rows: Model<T>[] = [];\n private visible: Model<T>[] = [];\n private removed: Model<T>[] = [];\n private sorters: Sorter[];\n private filters: Array<FilterNode | FilterFn<T>> = [];\n private params: Record<string, unknown> = {};\n private proxy?: Proxy<T>;\n private pageNo = 1;\n private pageLen: number;\n private total = 0;\n private abort?: AbortController;\n loading = false;\n\n constructor(private cfg: StoreConfig<T> = {}) {\n super();\n this.sorters = cfg.sorters ?? [];\n this.pageLen = cfg.pageSize ?? 0;\n for (const k in cfg.listeners) this.on(k, cfg.listeners[k]);\n if (cfg.proxy) this.proxy = typeof cfg.proxy === 'function' ? { read: cfg.proxy } : cfg.proxy;\n if (cfg.data) this.setRecords(cfg.data.map((r) => this.wrap(r)), cfg.data.length);\n if (cfg.autoLoad && this.proxy) void this.load();\n }\n\n private get remote() {\n return !!this.cfg.remote && !!this.proxy;\n }\n private wrap(raw: Partial<T> | Model<T>): Model<T> {\n const m = raw instanceof Model ? raw : new Model<T>(raw, this.cfg.model);\n m.owner = this;\n return m;\n }\n private fire(type: string, ...args: unknown[]) {\n this.emit(type, ...args);\n this.emit('change', { type });\n }\n\n // ---- reading -------------------------------------------------------------------------------\n\n /** Number of records in the current view (the current page). */\n get count(): number {\n return this.visible.length;\n }\n /** Records matching the filters, across pages (remote: what the server reported). */\n get totalCount(): number {\n return this.remote ? this.total : this.rows.length;\n }\n /** Every record matching the filters, across pages (a remote store only knows the loaded page). */\n getFiltered(): Model<T>[] {\n return this.rows;\n }\n getAt(i: number): Model<T> | undefined {\n return this.visible[i];\n }\n getRange(start = 0, end = this.visible.length): Model<T>[] {\n return this.visible.slice(start, end);\n }\n getById(id: string | number): Model<T> | undefined {\n return this.all.find((r) => r.id === id);\n }\n indexOf(rec: Model<T>): number {\n return this.visible.indexOf(rec);\n }\n /** Plain data of the current view. */\n getData(): T[] {\n return this.visible.map((r) => r.data);\n }\n each(fn: (rec: Model<T>, i: number) => void): void {\n this.visible.forEach(fn);\n }\n\n // ---- loading -------------------------------------------------------------------------------\n\n /** Replaces all records with local data. */\n loadData(data: Partial<T>[]): void {\n this.removed = [];\n this.setRecords(data.map((r) => this.wrap(r)), data.length);\n this.fire('load');\n }\n\n /** Reads through the proxy. Extra `params` are sent to it and remembered for later reloads. A newer load cancels the older one. */\n async load(params?: Record<string, unknown>): Promise<void> {\n if (!this.proxy) throw new Error('Optikos Store: load() needs a proxy');\n if (params) this.params = params;\n const req: ReadParams = { ...this.params };\n if (this.remote) Object.assign(req, { page: this.pageNo, pageSize: this.pageLen || undefined, sorters: this.sorters, filters: this.filters.filter((f): f is FilterNode => typeof f !== 'function') });\n if (this.emit('before-load', req) === false) return;\n this.abort?.abort();\n const ctl = (this.abort = new AbortController());\n this.loading = true;\n this.emit('loading', true);\n try {\n const res = await this.proxy.read(req, ctl.signal);\n if (ctl.signal.aborted) return;\n const { data, total } = Array.isArray(res) ? { data: res, total: res.length } : res;\n this.removed = [];\n this.setRecords(data.map((r) => this.wrap(r)), total ?? data.length);\n this.loading = false;\n this.emit('loading', false);\n this.fire('load');\n } catch (err) {\n if (ctl.signal.aborted) return;\n this.loading = false;\n this.emit('loading', false);\n this.emit('load-error', err);\n }\n }\n\n /** Every record that matches the current sort and filters: a local store has them; a remote one is read page by page through its proxy. */\n async fetchAll(pageSize = 500): Promise<Model<T>[]> {\n if (!this.remote) return this.rows;\n const out: Model<T>[] = [];\n const base = { ...this.params, pageSize, sorters: this.sorters, filters: this.filters.filter((f): f is FilterNode => typeof f !== 'function') };\n for (let page = 1; ; page++) {\n const res = await this.proxy!.read({ ...base, page });\n const { data, total } = Array.isArray(res) ? { data: res, total: res.length } : res;\n out.push(...data.map((r) => new Model<T>(r, this.cfg.model)));\n if (!data.length || out.length >= (total ?? 0) || data.length < pageSize) return out;\n }\n }\n\n private setRecords(recs: Model<T>[], total: number) {\n this.all = recs;\n this.total = total;\n this.refreshView();\n }\n\n /** Recomputes filtered/sorted/paged rows from `all`. */\n private refreshView() {\n if (this.remote) {\n this.rows = this.visible = this.all;\n return;\n }\n let rows = this.all;\n if (this.filters.length) rows = rows.filter((r) => this.filters.every((f) => (typeof f === 'function' ? f(r) : matchFilter(f, r.data))));\n if (this.sorters.length) {\n rows = [...rows].sort((a, b) => {\n for (const s of this.sorters) {\n const d = cmp(a.data[s.field], b.data[s.field]);\n if (d) return s.dir === 'desc' ? -d : d;\n }\n return 0;\n });\n }\n this.rows = rows;\n const pages = this.pageCount;\n if (this.pageNo > pages) this.pageNo = pages;\n this.visible = this.pageLen ? rows.slice((this.pageNo - 1) * this.pageLen, this.pageNo * this.pageLen) : rows;\n }\n\n // ---- sort / filter / paging ----------------------------------------------------------------\n\n getSorters(): Sorter[] {\n return this.sorters;\n }\n /** `sort('name')` toggles asc/desc when already sorted by it; `sort('name', 'desc')` is explicit; `sort(null)` clears. */\n sort(field: string | null, dir?: 'asc' | 'desc'): void {\n const cur = this.sorters[0];\n this.sorters = field ? [{ field, dir: dir ?? (cur?.field === field && cur.dir === 'asc' ? 'desc' : 'asc') }] : [];\n this.pageNo = 1;\n this.changeView('sort');\n }\n\n /**\n * Replaces the filters (top level = AND). Accepts specs, groups (`{ op: 'or', filters }`), or a predicate.\n * Resolves when the view is up to date (for a remote store, after the reload).\n */\n filter(f: FilterNode | FilterNode[] | FilterFn<T>): Promise<void> {\n this.filters = Array.isArray(f) ? f : [f];\n this.pageNo = 1;\n return this.changeView('filter');\n }\n clearFilter(): Promise<void> {\n this.filters = [];\n this.pageNo = 1;\n return this.changeView('filter');\n }\n /** The active filter nodes (predicates are not included). */\n getFilters(): FilterNode[] {\n return this.filters.filter((f): f is FilterNode => typeof f !== 'function');\n }\n\n private changeView(type: string): Promise<void> {\n if (this.remote) return this.load();\n this.refreshView();\n this.fire(type);\n return Promise.resolve();\n }\n\n get page(): number {\n return this.pageNo;\n }\n get pageSize(): number {\n return this.pageLen;\n }\n get pageCount(): number {\n return this.pageLen ? Math.max(1, Math.ceil(this.totalCount / this.pageLen)) : 1;\n }\n setPage(n: number): void {\n n = Math.min(Math.max(1, n), this.pageCount);\n if (n === this.pageNo) return;\n this.pageNo = n;\n if (this.remote) void this.load();\n else {\n this.refreshView();\n this.fire('page');\n }\n }\n setPageSize(n: number): void {\n this.pageLen = n;\n this.pageNo = 1;\n this.changeView('page');\n }\n\n // ---- editing -------------------------------------------------------------------------------\n\n add(raw: Partial<T> | Partial<T>[]): Model<T>[] {\n const recs = (Array.isArray(raw) ? raw : [raw]).map((r) => this.wrap(r));\n this.all = [...this.all, ...recs];\n this.total += recs.length;\n this.refreshView();\n this.fire('add', recs);\n return recs;\n }\n\n insert(index: number, raw: Partial<T>): Model<T> {\n const rec = this.wrap(raw);\n this.all = [...this.all.slice(0, index), rec, ...this.all.slice(index)];\n this.total++;\n this.refreshView();\n this.fire('add', [rec]);\n return rec;\n }\n\n remove(target: Model<T> | number | Array<Model<T>>): void {\n const list = Array.isArray(target) ? target : [typeof target === 'number' ? this.visible[target] : target];\n const gone = list.filter((r) => r && this.all.includes(r));\n if (!gone.length) return;\n this.all = this.all.filter((r) => !gone.includes(r));\n this.removed.push(...gone.filter((r) => !r.phantom));\n this.total -= gone.length;\n this.refreshView();\n this.fire('remove', gone);\n }\n\n /** Applies live changes in place, with one repaint: known ids are patched (not marked as edits), unknown ones are added, `remove` drops. */\n applyPatches(patches: Array<Patch<T>>): void {\n const idf = this.cfg.model?.idField ?? 'id';\n const byId = new Map(this.all.map((r) => [r.id, r]));\n const added: Model<T>[] = [];\n let touched = false;\n for (const p of patches) {\n const id = p.id ?? p.data?.[idf];\n const rec = id === undefined ? undefined : byId.get(id);\n if (p.op === 'remove') {\n if (!rec) continue;\n byId.delete(id!);\n this.all = this.all.filter((r) => r !== rec);\n this.total--;\n touched = true;\n } else if (rec) touched = rec.patch(p.data!) || touched;\n else if (p.data) {\n const m = this.wrap(p.data);\n added.push(m);\n byId.set(m.id, m);\n }\n }\n if (added.length) {\n this.all = [...this.all, ...added];\n this.total += added.length;\n }\n if (!added.length && !touched) return;\n this.refreshView();\n this.fire('patch', patches);\n }\n\n /** Applies what a source sends as it arrives (`{ op, data, id }`, or an array of them; text is parsed as JSON). Returns the function that stops it. */\n connect(source: LiveSource, parse: (data: any) => Patch<T> | Array<Patch<T>> = (d) => (typeof d === 'string' ? JSON.parse(d) : d)): () => void {\n const fn = (e: { data: any }) => {\n const p = parse(e.data);\n this.applyPatches(Array.isArray(p) ? p : [p]);\n };\n source.addEventListener('message', fn);\n return () => source.removeEventListener('message', fn);\n }\n\n clear(): void {\n this.removed.push(...this.all.filter((r) => !r.phantom));\n this.setRecords([], 0);\n this.fire('remove', []);\n }\n\n recordChanged(rec: Model, field: string): void {\n if (this.sorters.some((s) => s.field === field) || this.filters.length) this.refreshView();\n this.fire('update', rec, field);\n }\n\n getModified(): Model<T>[] {\n return this.all.filter((r) => r.phantom || r.isDirty());\n }\n getRemoved(): Model<T>[] {\n return this.removed;\n }\n commitChanges(): void {\n this.all.forEach((r) => r.commit());\n this.removed = [];\n }\n\n /** Writes pending changes through the proxy: deletes, then creates and updates, one at a time. */\n async sync(): Promise<void> {\n const p = this.proxy;\n if (!p) throw new Error('Optikos Store: sync() needs a proxy');\n for (const r of this.removed) await p.destroy?.(r.data);\n this.removed = [];\n for (const r of this.all) {\n if (r.phantom) Object.assign(r.data, (await p.create?.(r.data)) ?? {});\n else if (r.isDirty()) Object.assign(r.data, (await p.update?.(r.data)) ?? {});\n else continue;\n r.commit();\n }\n this.fire('sync');\n }\n\n /** Observable interface used by `optikos/bind`: calls `fn` on any change; returns the unsubscribe function. */\n subscribe(fn: (change: { type: string }) => void): () => void {\n return this.on('change', fn);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["cid", "convert", "v", "def", "Model", "raw", "data", "f", "fd", "field", "value", "changed", "k", "out", "collator", "cmp", "a", "b", "text", "v", "empty", "ISO", "num", "test", "spec", "raw", "x", "between", "listed", "i", "matchFilter", "node", "data", "f", "Store", "Emitter", "cfg", "k", "r", "m", "Model", "type", "args", "start", "end", "id", "rec", "fn", "params", "req", "ctl", "res", "total", "err", "pageSize", "out", "base", "page", "recs", "rows", "s", "d", "pages", "field", "dir", "cur", "n", "index", "target", "gone", "patches", "idf", "byId", "added", "touched", "p", "source", "parse", "e"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as k}from"./chunk-TIPK3SCJ.js";function v(g,o){let n=g.editor;return n&&typeof n=="object"?{...n}:typeof n=="string"?{type:n}:{type:typeof o=="number"?"numberfield":typeof o=="boolean"?"checkbox":"textfield"}}function x(g={}){let o,n,E=(e,t)=>!!e.editor&&(e.editable?.(t)??!0),m=e=>o.getColumns().filter(t=>E(t,e));function p(e){if(!E(e.column,e.record)||o.emit("before-edit",e.record,e.column.field)===!1)return!1;s(!0);let t=e.record.get(e.column.field),l=k({...v(e.column,t),value:t,stableSize:!1,ariaLabel:e.column.header??e.column.field,cls:"op-grid__editor"});return e.el.classList.add("is-editing"),e.el.replaceChildren(l.el),l.notifyMount(),n={cell:e,field:l,old:t},l.focus(),l.el.querySelector("input")?.select(),!0}function s(e){let t=n;if(!t)return!0;if(e&&!t.field.validate())return!1;n=void 0;let l=t.field.getValue();t.field.destroy(),t.cell.el.classList.remove("is-editing");let{record:d,column:c}=t.cell;return e&&!Object.is(l,t.old)?(d.set(c.field,l),o.emit("edit",d,c.field,l,t.old)):(o.refresh(),e||o.emit("edit-cancel",d,c.field)),!0}function C(e){if(!n)return;let t=o.getStore(),l=n.cell.index,d=m(n.cell.record),c=d.indexOf(n.cell.column)+e;for(let f=0;f<500;f++){if(c>=0&&c<d.length){o.scrollToRow(l);let a=o.getCell(l,d[c].field),r=t.getAt(l);return a?{index:l,record:r,column:d[c],el:a}:void 0}l+=e;let u=t.getAt(l);if(!u)return;d=m(u),c=e>0?0:d.length-1}}return{init(e){o=e;let t=e.el,l=t.querySelector("[role=grid]"),d=r=>{let i=e.cellAt(r.target);i&&!(n&&i.el===n.cell.el)&&p(i)},c=r=>{if(n&&n.cell.el.contains(r.target)){if(r.key==="Escape")s(!1);else if(r.key==="Enter"&&!r.shiftKey)s(!0)&&l.focus();else if(r.key==="Tab"){let i=C(r.shiftKey?-1:1);if(!s(!0))return void r.preventDefault();i?p({...i,el:o.getCell(i.index,i.column.field)??i.el}):l.focus()}else return;r.preventDefault(),r.stopPropagation()}else if(r.target===l&&(r.key==="F2"||r.key==="Enter")&&e.getActive()>=0){let i=e.getStore().getAt(e.getActive()),y=m(i)[0],b=y&&e.getCell(e.getActive(),y.field);b&&p({index:e.getActive(),record:i,column:y,el:b})&&(r.preventDefault(),r.stopPropagation())}},f=r=>{if(!n||!n.cell.el.contains(r.target))return;let i=r.relatedTarget;i&&(n.cell.el.contains(i)||i.closest(".op-layer"))||s(!0)},u=t.querySelector(".op-grid__viewport"),a=()=>n&&s(!0);return t.addEventListener(g.trigger==="click"?"click":"dblclick",d),t.addEventListener("keydown",c,!0),t.addEventListener("focusout",f),u.addEventListener("scroll",a,{passive:!0}),()=>{n?.field.destroy(),n=void 0,t.removeEventListener(g.trigger==="click"?"click":"dblclick",d),t.removeEventListener("keydown",c,!0),t.removeEventListener("focusout",f),u.removeEventListener("scroll",a)}}}}export{v as a,x as b};
2
+ //# sourceMappingURL=chunk-M2ZRKHE4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/cellediting/cellediting.ts"],
4
+ "sourcesContent": ["// Inline cell editing for the Grid, as a plugin: `plugins: [cellEditing()]` and `editor` on the columns to edit.\n// Editors are regular fields created by type (`create({ type })`), so this module imports none of them: with\n// per-component imports, import the field types your columns use (`optikos/components/select`...).\nimport { create } from '../../../core/registry';\nimport type { Field } from '../../../core/field';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { Grid, GridPlugin, GridCell } from '../grid/grid';\n\nexport interface CellEditingOptions {\n /** What starts editing with the pointer: a double click (default) or a single click. F2 and Enter always do. */\n trigger?: 'dblclick' | 'click';\n}\n\ninterface Editing { cell: GridCell; field: Field<any>; old: unknown }\n\n/** The field config for a column's editor: from `editor`, else from the type of the current value. */\nexport function editorConfig(col: Column, value: unknown): Record<string, any> {\n const e = col.editor;\n if (e && typeof e === 'object') return { ...e };\n if (typeof e === 'string') return { type: e };\n return { type: typeof value === 'number' ? 'numberfield' : typeof value === 'boolean' ? 'checkbox' : 'textfield' };\n}\n\n/**\n * Inline editing plugin. Events on the grid: `before-edit(record, field)` (cancelable), `edit(record, field, value, old)`\n * after a valid value was written to the record (`record.set`, so it is marked modified), `edit-cancel(record, field)`.\n */\nexport function cellEditing(options: CellEditingOptions = {}): GridPlugin {\n let grid!: Grid;\n let editing: Editing | undefined;\n\n const editable = (c: Column, rec: Model) => !!c.editor && (c.editable?.(rec) ?? true);\n const editableCols = (rec: Model) => grid.getColumns().filter((c) => editable(c, rec));\n\n function start(cell: GridCell): boolean {\n if (!editable(cell.column, cell.record) || grid.emit('before-edit', cell.record, cell.column.field) === false) return false;\n finish(true);\n const old = cell.record.get(cell.column.field);\n const field = create<Field<any>>({ ...editorConfig(cell.column, old), value: old, stableSize: false, ariaLabel: cell.column.header ?? cell.column.field, cls: 'op-grid__editor' });\n cell.el.classList.add('is-editing');\n cell.el.replaceChildren(field.el);\n field.notifyMount();\n editing = { cell, field, old };\n field.focus();\n field.el.querySelector('input')?.select();\n return true;\n }\n\n /** Commits (or cancels) the current edit. A commit that fails validation keeps the editor open. */\n function finish(commit: boolean): boolean {\n const e = editing;\n if (!e) return true;\n if (commit && !e.field.validate()) return false;\n editing = undefined;\n const value = e.field.getValue();\n e.field.destroy();\n e.cell.el.classList.remove('is-editing');\n const { record, column } = e.cell;\n if (commit && !Object.is(value, e.old)) {\n record.set(column.field, value); // the store re-renders the row\n grid.emit('edit', record, column.field, value, e.old);\n } else {\n grid.refresh(); // puts the cell content back\n if (!commit) grid.emit('edit-cancel', record, column.field);\n }\n return true;\n }\n\n /** The next (or previous) editable cell after the current one, row by row. */\n function step(dir: 1 | -1): GridCell | undefined {\n if (!editing) return;\n const store = grid.getStore();\n let i = editing.cell.index;\n let cols = editableCols(editing.cell.record);\n let c = cols.indexOf(editing.cell.column) + dir;\n for (let guard = 0; guard < 500; guard++) {\n if (c >= 0 && c < cols.length) {\n grid.scrollToRow(i);\n const el = grid.getCell(i, cols[c].field);\n const rec = store.getAt(i)!;\n return el ? { index: i, record: rec, column: cols[c], el } : undefined;\n }\n i += dir;\n const rec = store.getAt(i);\n if (!rec) return;\n cols = editableCols(rec);\n c = dir > 0 ? 0 : cols.length - 1;\n }\n }\n\n return {\n init(g: Grid) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n const onPointer = (ev: Event) => {\n const cell = g.cellAt(ev.target);\n if (cell && !(editing && cell.el === editing.cell.el)) start(cell);\n };\n // capture: these run before the grid's own key handling (Enter would otherwise activate the row)\n const onKey = (ev: KeyboardEvent) => {\n if (editing && editing.cell.el.contains(ev.target as Node)) {\n if (ev.key === 'Escape') finish(false);\n else if (ev.key === 'Enter' && !ev.shiftKey) finish(true) && table.focus();\n else if (ev.key === 'Tab') {\n const next = step(ev.shiftKey ? -1 : 1);\n if (!finish(true)) return void ev.preventDefault();\n if (next) start({ ...next, el: grid.getCell(next.index, next.column.field) ?? next.el });\n else table.focus();\n } else return;\n ev.preventDefault();\n ev.stopPropagation();\n } else if (ev.target === table && (ev.key === 'F2' || ev.key === 'Enter') && g.getActive() >= 0) {\n const rec = g.getStore().getAt(g.getActive())!;\n const col = editableCols(rec)[0];\n const cellEl = col && g.getCell(g.getActive(), col.field);\n if (cellEl && start({ index: g.getActive(), record: rec, column: col, el: cellEl })) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n }\n };\n // leaving the cell commits, unless the focus went into the editor's own popup (a select list, a calendar)\n const onFocusOut = (ev: FocusEvent) => {\n if (!editing || !editing.cell.el.contains(ev.target as Node)) return;\n const to = ev.relatedTarget as HTMLElement | null;\n if (to && (editing.cell.el.contains(to) || to.closest('.op-layer'))) return;\n finish(true);\n };\n const viewport = el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const onScroll = () => editing && finish(true);\n el.addEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.addEventListener('keydown', onKey, true);\n el.addEventListener('focusout', onFocusOut);\n viewport.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n editing?.field.destroy();\n editing = undefined;\n el.removeEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.removeEventListener('keydown', onKey, true);\n el.removeEventListener('focusout', onFocusOut);\n viewport.removeEventListener('scroll', onScroll);\n };\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["editorConfig", "col", "value", "e", "cellEditing", "options", "grid", "editing", "editable", "c", "rec", "editableCols", "start", "cell", "finish", "old", "field", "create", "commit", "record", "column", "step", "dir", "store", "i", "cols", "guard", "el", "g", "table", "onPointer", "ev", "onKey", "next", "cellEl", "onFocusOut", "to", "viewport", "onScroll"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as d}from"./chunk-2YRQULDC.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{e as l,f as s}from"./chunk-S4QD5NID.js";l("en",{time:"Enter a time like 09:30"});l("pt-BR",{time:"Informe uma hora, como 09:30"});var p=1440,u=n=>String(n).padStart(2,"0"),a=n=>Number(n.slice(0,2))*60+Number(n.slice(3)),f=n=>`${u(Math.floor(n/60))}:${u(n%60)}`,m=class extends d{baseCls="op-field op-textfield op-timefield";garbage=!1;emptyValue(){return null}isEmpty(e){return e==null}parse(e){this.garbage=!1;let t=e.trim();if(!t)return null;let r=/^(\d{1,2})(?::?(\d{2}))?$/.exec(t)??/^(\d)(\d{2})$/.exec(t),i=r&&Number(r[1]),o=r&&Number(r[2]??0);return!r||i>23||o>59?(this.garbage=!0,null):`${u(i)}:${u(o)}`}createControl(){let e=super.createControl();return this.input.setAttribute("inputmode","numeric"),this.listen(this.input,"blur",()=>{this.garbage||(this.input.value=this.display(this.value))}),e}onInput(){super.onInput(),this.garbage?this.setError(s("time")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}check(){if(this.garbage)return s("time");let e=super.check(),t=this.value,{min:r,max:i}=this.config;return e||t==null?e:r&&i&&(t<r||t>i)?s("range",{min:r,max:i}):r&&t<r?s("min",{n:r}):i&&t>i?s("max",{n:i}):""}onKey(e){let t=e.key==="PageUp"||e.key==="PageDown";e.key==="ArrowUp"||e.key==="ArrowDown"||t?(e.preventDefault(),this.bump((e.key.endsWith("Up")?1:-1)*(t?60:this.config.step??1))):super.onKey(e)}bump(e){let{min:t,max:r}=this.config,i=(this.value?a(this.value):t?a(t):0)+e,o=t?a(t):0,g=r?a(r):p-1;this.setValue(f(t||r?Math.min(g,Math.max(o,i)):(i+p)%p))}setMin(e){this.config.min=e}setMax(e){this.config.max=e}};c("timefield",m);export{m as a};
2
+ //# sourceMappingURL=chunk-M7FNPRV4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/timefield/timefield.ts"],
4
+ "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { time: 'Enter a time like 09:30' });\naddMessages('pt-BR', { time: 'Informe uma hora, como 09:30' });\n\nexport interface TimeFieldConfig extends TextFieldConfig<string | null> {\n /** Earliest and latest time, `'HH:mm'`. */\n min?: string;\n max?: string;\n /** Minutes moved by \u2191/\u2193 (PageUp/PageDown move an hour). Default 1. */\n step?: number;\n}\n\nconst DAY = 1440;\nconst pad = (n: number) => String(n).padStart(2, '0');\nconst toMin = (v: string) => Number(v.slice(0, 2)) * 60 + Number(v.slice(3));\nconst fromMin = (n: number) => `${pad(Math.floor(n / 60))}:${pad(n % 60)}`;\n\n/** A time of day. The value is `'HH:mm'` (24 h) or `null`. Type `930`, `9:30` or `09:30`; \u2191/\u2193 step it. */\nexport class TimeField extends TextField<string | null, TimeFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-timefield';\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: string | null) {\n return v == null;\n }\n\n protected override parse(text: string): string | null {\n this.garbage = false;\n const s = text.trim();\n if (!s) return null;\n const m = /^(\\d{1,2})(?::?(\\d{2}))?$/.exec(s) ?? /^(\\d)(\\d{2})$/.exec(s);\n const h = m && Number(m[1]);\n const min = m && Number(m[2] ?? 0);\n if (!m || h! > 23 || min! > 59) return ((this.garbage = true), null);\n return `${pad(h!)}:${pad(min!)}`;\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n this.input.setAttribute('inputmode', 'numeric');\n this.listen(this.input, 'blur', () => {\n if (!this.garbage) this.input.value = this.display(this.value);\n });\n return wrap;\n }\n\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('time'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: string | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n\n protected override check(): string {\n if (this.garbage) return t('time');\n const base = super.check();\n const v = this.value;\n const { min, max } = this.config;\n if (base || v == null) return base;\n if (min && max && (v < min || v > max)) return t('range', { min, max });\n if (min && v < min) return t('min', { n: min });\n if (max && v > max) return t('max', { n: max });\n return '';\n }\n\n protected override onKey(e: KeyboardEvent) {\n const big = e.key === 'PageUp' || e.key === 'PageDown';\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || big) {\n e.preventDefault();\n this.bump((e.key.endsWith('Up') ? 1 : -1) * (big ? 60 : this.config.step ?? 1));\n } else super.onKey(e);\n }\n\n private bump(minutes: number) {\n const { min, max } = this.config;\n const n = (this.value ? toMin(this.value) : min ? toMin(min) : 0) + minutes;\n const lo = min ? toMin(min) : 0;\n const hi = max ? toMin(max) : DAY - 1;\n // with no limits the clock wraps around midnight\n this.setValue(fromMin(min || max ? Math.min(hi, Math.max(lo, n)) : (n + DAY) % DAY));\n }\n\n setMin(min: string | undefined) {\n this.config.min = min;\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n }\n}\nregister('timefield', TimeField);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "DAY", "pad", "toMin", "v", "fromMin", "TimeField", "TextField", "text", "s", "m", "h", "min", "wrap", "t", "base", "max", "big", "minutes", "n", "lo", "hi", "register"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import{a as E}from"./chunk-RG6SHPHF.js";import{c as u}from"./chunk-DIOJGTUN.js";import{c as b}from"./chunk-VV7CFMPZ.js";import{a as f}from"./chunk-TIPK3SCJ.js";import{e as v}from"./chunk-4AA4FQEM.js";import{e as d,f as m}from"./chunk-UDXO3KM3.js";import{b as s}from"./chunk-PZSHOSOS.js";import{f as h}from"./chunk-S4QD5NID.js";var n=".op-menu__item",p=class y extends m{baseCls="op-menu";parentMenu;dd;sub;subOwner;opener=null;hoverCancel;list;searchEl;emptyEl;build(){return s("div","op-menu")}shell(){let t=!!this.config.search;t&&!this.searchEl&&(this.searchEl=s("input","op-menu__search",{type:"search",placeholder:`${h("search")}\u2026`,"aria-label":h("search"),autocomplete:"off"}),this.emptyEl=s("div","op-menu__empty",{},h("noResults")),this.listen(this.searchEl,"input",()=>this.filter()),this.listen(this.searchEl,"keydown",e=>{let i=this.first();i&&(e.key==="ArrowDown"||e.key==="Enter")&&(e.preventDefault(),e.key==="Enter"?this.activate(i):i.focus())})),this.list=t?this.list!==this.el&&this.list||s("div","op-menu__list",{role:"menu"}):this.el,this.el.setAttribute("role",t?"none":"menu"),t&&this.el.replaceChildren(this.searchEl,this.list,this.emptyEl)}first(){return this.list.querySelector(`${n}:not([hidden]):not([aria-disabled=true])`)}filter(){let t=(this.searchEl?.value??"").trim().toLowerCase();this.el.classList.toggle("is-searching",!!t);for(let e of Array.from(this.list.querySelectorAll(n))){let i=e.parentElement.getAttribute("aria-label")??"";e.hidden=!!t&&!`${i}
2
+ ${e.textContent}`.toLowerCase().includes(t)}this.emptyEl&&(this.emptyEl.hidden=!!this.first()||!this.list.querySelector(n))}onRender(){this.shell(),this.renderItems();let t=b(this.el,{selector:n,orientation:"vertical"});this.own(()=>t.destroy()),this.listen(this.el,"click",e=>{let i=e.target.closest(n);i&&this.activate(i)}),this.listen(this.el,"keydown",e=>{let i=e.target.closest(n);if(e.target!==this.searchEl){if(e.key==="Tab")return this.closeAll();if(this.searchEl&&e.key.length===1&&e.key!==" "&&!e.ctrlKey&&!e.metaKey&&!e.altKey)return e.preventDefault(),this.searchEl.focus(),this.searchEl.value+=e.key,this.filter();i&&(e.key==="Enter"||e.key===" "?(e.preventDefault(),this.activate(i)):e.key==="ArrowRight"&&i.getAttribute("aria-haspopup")?(e.preventDefault(),this.openSub(i,!0)):e.key==="ArrowLeft"&&this.parentMenu&&(e.preventDefault(),this.hide()))}}),this.listen(this.el,"pointerover",e=>{let i=e.target.closest(n);!i||i.getAttribute("aria-disabled")==="true"||(this.hoverCancel?.(),i.focus(),i.getAttribute("aria-haspopup")?this.hoverCancel=this.later(()=>this.openSub(i,!1),150):this.sub?.hide())})}entries(){return(this.config.items??[]).flatMap(t=>typeof t=="string"?["-"]:d([t])??[])}renderItems(){let t=this.entries(),e=t.map((r,o)=>{if(r==="-")return s("div","op-menu__sep",{role:"separator"});let a=r.checked!==void 0,l=s("div","op-menu__item",{role:a?"menuitemcheckbox":"menuitem",tabindex:-1,"data-i":o,"aria-disabled":r.disabled?"true":null,"aria-checked":a?String(!!r.checked):null,"aria-haspopup":r.items?"menu":null,"aria-expanded":r.items?"false":null});return l.append(s("span","op-menu__icon",{},r.icon?u(r.icon):a&&r.checked?u("check"):null),s("span","op-menu__text",{},r.text??"")),r.badge!=null&&r.badge!==""&&l.append(s("span","op-menu__badge",{},String(r.badge))),r.items&&l.append(s("span","op-menu__arrow",{},u("chevron-right"))),l}),i=r=>t[r]==="-"?"":t[r].group??"",c=[...new Set(t.map((r,o)=>i(o)).filter(Boolean))];if(!c.length)return this.list.replaceChildren(...e),this.filter();this.list.replaceChildren(...e.filter((r,o)=>!i(o)),...c.map(r=>s("div","op-menu__group",{role:"group","aria-label":r},s("div","op-menu__group-label",{"aria-hidden":"true"},r),...e.filter((o,a)=>i(a)===r)))),this.filter()}setItems(t){this.config.items=t,this.rendered&&this.renderItems()}setSearch(t){this.config.search=t,this.rendered&&(this.shell(),this.renderItems())}activate(t){let e=this.entries()[Number(t.dataset.i)];if(!(!e||e.disabled)){if(e.items)return this.openSub(t,!0);e.checked!==void 0&&(e.checked=!e.checked),e.handler?.(e),this.root().emit("click",e),this.root().hide()}}root(){return this.parentMenu?this.parentMenu.root():this}openSub(t,e){let i=this.entries()[Number(t.dataset.i)];if(this.sub&&this.subOwner===t&&this.sub.isOpen())return e?this.sub.focusFirst():void 0;this.sub?.destroy(),this.sub=new y({items:i.items}),this.sub.parentMenu=this,this.subOwner=t,this.sub.on("hide",()=>t.setAttribute("aria-expanded","false")),t.setAttribute("aria-expanded","true"),this.sub.showBy(t,"right-start",e)}isOpen(){return!!this.dd?.isOpen()}focusFirst(){this.first()?.focus()}showBy(t,e="bottom-start",i=!0){this.open({anchor:t,placement:e},i)}showAt(t,e){this.open({anchor:{x:t,y:e},placement:"bottom-start"},!0)}open(t,e){this.opener=document.activeElement,this.dd?(this.dd.setAnchor(t.anchor),this.dd.setPlacement(t.placement)):(this.dd=new E({...t,content:this.el,role:"presentation",flip:!0}),this.dd.on("close",()=>{this.sub?.hide(),this.emit("hide")})),this.searchEl&&this.config.search&&(this.searchEl.value="",this.filter()),this.dd.open(),v(Array.from(this.el.querySelectorAll(n)),{dy:4}),e&&this.focusFirst(),this.emit("show")}hide(){if(!this.dd?.isOpen())return;this.dd.close();let t=this.parentMenu?this.parentMenu.subOwner:this.opener;t instanceof HTMLElement&&t.isConnected&&t.focus()}closeAll(){this.root().hide()}onDestroy(){this.sub?.destroy(),this.dd?.destroy()}};f("menu",p);export{p as a};
3
+ //# sourceMappingURL=chunk-MNSDGJKA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/menu/menu.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport type { Placement } from '../../../core/position';\nimport { gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../dropdown/dropdown';\nimport { stagger } from '../../../motion/core';\n\nexport interface MenuItem {\n text?: string;\n icon?: string;\n handler?: (item: MenuItem) => void;\n disabled?: boolean;\n /** Present (true/false) makes it a checkable item. */\n checked?: boolean;\n items?: MenuEntry[];\n /** Items with the same group sit together under its name (ungrouped items come first). */\n group?: string;\n /** A count or short label at the end of the row. */\n badge?: string | number;\n /** Hidden (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n}\n/** An item, or `'-'` for a separator (typed `string` so an array built in a variable still fits). */\nexport type MenuEntry = MenuItem | string;\n\nexport interface MenuConfig extends ComponentConfig {\n items?: MenuEntry[];\n /** A search field over the items: filters as you type; a search that names a group shows the whole group. */\n search?: boolean;\n}\n\nconst ITEM = '.op-menu__item';\n\n/** Floating menu with submenus. Use `showBy(button)` for button menus and `showAt(x, y)` for context menus. */\nexport class Menu extends Component<MenuConfig> {\n protected override baseCls = 'op-menu';\n parentMenu?: Menu;\n private dd?: Dropdown;\n private sub?: Menu;\n private subOwner?: HTMLElement;\n private opener: Element | null = null;\n private hoverCancel?: () => void;\n /** The `role=menu` element: the root itself, or a list under the search field. */\n private list!: HTMLElement;\n private searchEl?: HTMLInputElement;\n private emptyEl?: HTMLElement;\n\n protected override build() {\n return h('div', 'op-menu');\n }\n\n /** Without search the root is the menu; with it, the root holds the field, the menu and the \"no results\" line. */\n private shell() {\n const on = !!this.config.search;\n if (on && !this.searchEl) {\n this.searchEl = h('input', 'op-menu__search', { type: 'search', placeholder: `${t('search')}\u2026`, 'aria-label': t('search'), autocomplete: 'off' });\n this.emptyEl = h('div', 'op-menu__empty', {}, t('noResults'));\n this.listen(this.searchEl, 'input', () => this.filter());\n this.listen(this.searchEl, 'keydown', (e: KeyboardEvent) => {\n const first = this.first();\n if (first && (e.key === 'ArrowDown' || e.key === 'Enter')) (e.preventDefault(), e.key === 'Enter' ? this.activate(first) : first.focus());\n });\n }\n this.list = on ? (this.list !== this.el && this.list) || h('div', 'op-menu__list', { role: 'menu' }) : this.el;\n this.el.setAttribute('role', on ? 'none' : 'menu');\n if (on) this.el.replaceChildren(this.searchEl!, this.list, this.emptyEl!);\n }\n\n private first(): HTMLElement | null {\n return this.list.querySelector<HTMLElement>(`${ITEM}:not([hidden]):not([aria-disabled=true])`);\n }\n\n /** Hides the items that do not match the search (a group whose name matches keeps all of them); empty groups hide in CSS. */\n private filter() {\n const q = (this.searchEl?.value ?? '').trim().toLowerCase();\n this.el.classList.toggle('is-searching', !!q);\n for (const row of Array.from(this.list.querySelectorAll<HTMLElement>(ITEM))) {\n const group = row.parentElement!.getAttribute('aria-label') ?? '';\n row.hidden = !!q && !`${group}\\n${row.textContent}`.toLowerCase().includes(q);\n }\n if (this.emptyEl) this.emptyEl.hidden = !!this.first() || !this.list.querySelector(ITEM);\n }\n\n protected override onRender() {\n this.shell();\n this.renderItems();\n const rover = roving(this.el, { selector: ITEM, orientation: 'vertical' });\n this.own(() => rover.destroy());\n this.listen(this.el, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (row) this.activate(row);\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (e.target === this.searchEl) return;\n if (e.key === 'Tab') return this.closeAll();\n // type to search: a printable key on an item goes to the search field\n if (this.searchEl && e.key.length === 1 && e.key !== ' ' && !e.ctrlKey && !e.metaKey && !e.altKey) {\n e.preventDefault();\n this.searchEl.focus();\n this.searchEl.value += e.key;\n return this.filter();\n }\n if (!row) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.activate(row);\n } else if (e.key === 'ArrowRight' && row.getAttribute('aria-haspopup')) {\n e.preventDefault();\n this.openSub(row, true);\n } else if (e.key === 'ArrowLeft' && this.parentMenu) {\n e.preventDefault();\n this.hide();\n }\n });\n this.listen(this.el, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>(ITEM);\n if (!row || row.getAttribute('aria-disabled') === 'true') return;\n this.hoverCancel?.();\n row.focus();\n if (row.getAttribute('aria-haspopup')) this.hoverCancel = this.later(() => this.openSub(row, false), 150);\n else this.sub?.hide();\n });\n }\n\n private entries(): Array<MenuItem | '-'> {\n return (this.config.items ?? []).flatMap((e): Array<MenuItem | '-'> => (typeof e === 'string' ? ['-'] : (gate([e]) ?? [])));\n }\n\n private renderItems() {\n const entries = this.entries();\n const rows = entries.map((it, i) => {\n if (it === '-') return h('div', 'op-menu__sep', { role: 'separator' });\n const checkable = it.checked !== undefined;\n const row = h('div', 'op-menu__item', {\n role: checkable ? 'menuitemcheckbox' : 'menuitem',\n tabindex: -1,\n 'data-i': i,\n 'aria-disabled': it.disabled ? 'true' : null,\n 'aria-checked': checkable ? String(!!it.checked) : null,\n 'aria-haspopup': it.items ? 'menu' : null,\n 'aria-expanded': it.items ? 'false' : null,\n });\n row.append(h('span', 'op-menu__icon', {}, it.icon ? iconEl(it.icon) : checkable && it.checked ? iconEl('check') : null), h('span', 'op-menu__text', {}, it.text ?? ''));\n if (it.badge != null && it.badge !== '') row.append(h('span', 'op-menu__badge', {}, String(it.badge)));\n if (it.items) row.append(h('span', 'op-menu__arrow', {}, iconEl('chevron-right')));\n return row;\n });\n const groupOf = (i: number) => (entries[i] === '-' ? '' : ((entries[i] as MenuItem).group ?? ''));\n const groups = [...new Set(entries.map((_, i) => groupOf(i)).filter(Boolean))];\n if (!groups.length) return (this.list.replaceChildren(...rows), this.filter());\n // ungrouped entries first, then one role=group per name (its header is only visual: the group carries the name)\n this.list.replaceChildren(\n ...rows.filter((_, i) => !groupOf(i)),\n ...groups.map((g) => h('div', 'op-menu__group', { role: 'group', 'aria-label': g }, h('div', 'op-menu__group-label', { 'aria-hidden': 'true' }, g), ...rows.filter((_, i) => groupOf(i) === g))),\n );\n this.filter();\n }\n\n setItems(items: MenuEntry[]) {\n this.config.items = items;\n if (this.rendered) this.renderItems();\n }\n\n /** Turns the search field on or off. */\n setSearch(search: boolean) {\n this.config.search = search;\n if (!this.rendered) return;\n this.shell();\n this.renderItems();\n }\n\n private activate(row: HTMLElement) {\n const item = this.entries()[Number(row.dataset.i)] as MenuItem;\n if (!item || item.disabled) return;\n if (item.items) return this.openSub(row, true);\n if (item.checked !== undefined) item.checked = !item.checked;\n item.handler?.(item);\n this.root().emit('click', item);\n this.root().hide();\n }\n\n private root(): Menu {\n return this.parentMenu ? this.parentMenu.root() : this;\n }\n\n private openSub(row: HTMLElement, focus: boolean) {\n const item = this.entries()[Number(row.dataset.i)] as MenuItem;\n if (this.sub && this.subOwner === row && this.sub.isOpen()) return focus ? this.sub.focusFirst() : undefined;\n this.sub?.destroy();\n this.sub = new Menu({ items: item.items });\n this.sub.parentMenu = this;\n this.subOwner = row;\n this.sub.on('hide', () => row.setAttribute('aria-expanded', 'false'));\n row.setAttribute('aria-expanded', 'true');\n this.sub.showBy(row, 'right-start', focus);\n }\n\n isOpen(): boolean {\n return !!this.dd?.isOpen();\n }\n\n private focusFirst() {\n this.first()?.focus(); // never the search field on open: a phone keyboard would cover the menu\n }\n\n showBy(anchor: HTMLElement | Component, placement: Placement = 'bottom-start', focus = true) {\n this.open({ anchor, placement }, focus);\n }\n\n showAt(x: number, y: number) {\n this.open({ anchor: { x, y }, placement: 'bottom-start' }, true);\n }\n\n private open(cfg: { anchor: HTMLElement | Component | { x: number; y: number }; placement: Placement }, focus: boolean) {\n this.opener = document.activeElement;\n if (!this.dd) {\n this.dd = new Dropdown({ ...cfg, content: this.el, role: 'presentation', flip: true });\n this.dd.on('close', () => {\n this.sub?.hide();\n this.emit('hide');\n });\n } else {\n this.dd.setAnchor(cfg.anchor);\n this.dd.setPlacement(cfg.placement);\n }\n if (this.searchEl && this.config.search) {\n this.searchEl.value = '';\n this.filter();\n }\n this.dd.open();\n void stagger(Array.from(this.el.querySelectorAll(ITEM)), { dy: 4 }); // the rows settle one after the other\n if (focus) this.focusFirst();\n this.emit('show');\n }\n\n override hide() {\n if (!this.dd?.isOpen()) return;\n this.dd.close();\n // Closing a submenu returns to its parent item; closing the root returns to whatever opened it.\n const back = this.parentMenu ? this.parentMenu.subOwner : this.opener;\n if (back instanceof HTMLElement && back.isConnected) back.focus();\n }\n\n closeAll() {\n this.root().hide();\n }\n\n protected override onDestroy() {\n this.sub?.destroy();\n this.dd?.destroy();\n }\n}\nregister('menu', Menu);\n"],
5
+ "mappings": "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",
6
+ "names": ["ITEM", "Menu", "_Menu", "Component", "h", "on", "t", "first", "q", "row", "group", "rover", "roving", "e", "gate", "entries", "rows", "it", "i", "checkable", "iconEl", "groupOf", "groups", "_", "g", "items", "search", "item", "focus", "anchor", "placement", "x", "y", "cfg", "Dropdown", "stagger", "back", "register"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{c}from"./chunk-4EZJ5FKJ.js";import{a as m}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as k}from"./chunk-TIPK3SCJ.js";import{e as f,f as u}from"./chunk-MW3RWBZ7.js";f("en",{treeLoading:"Loading\u2026",treeEmpty:"Nothing here"});f("pt-BR",{treeLoading:"Carregando\u2026",treeEmpty:"Nada aqui"});var g=class extends m{baseCls="op-tree";items=[];open=new Set;selected=new Set;loading=new Set;query="";focusId;root;onRender(){let e=this.config;this.items=e.items??[];let t=i=>i.forEach(s=>(s.expanded&&this.open.add(s.id),s.children&&t(s.children)));t(this.items),this.root=o("ul","op-tree__root",{role:"tree","aria-label":e.ariaLabel??null,"aria-multiselectable":e.selection==="multi"?"true":null}),this.el.removeAttribute("aria-label"),this.el.append(this.root),this.listen(this.root,"click",i=>{let s=i.target.closest(".op-tree__item");if(!s)return;let r=s.dataset.id;if(this.focusId=r,i.target.closest(".op-tree__toggle"))return this.toggle(r);if(i.target.closest(".op-tree__check"))return this.toggleChecked(r);this.pick(r,i.ctrlKey||i.metaKey)}),this.listen(this.root,"dblclick",i=>{let s=i.target.closest(".op-tree__item"),r=s&&this.getNode(s.dataset.id);r&&!r.disabled&&this.emit("activate",r)}),this.listen(this.root,"keydown",i=>this.onKey(i)),this.paint()}getNode(e,t=this.items){for(let i of t){if(i.id===e)return i;let s=i.children&&this.getNode(e,i.children);if(s)return s}}getPath(e,t=this.items,i=[]){for(let s of t){if(s.id===e)return i;let r=s.children&&this.getPath(e,s.children,[...i,s]);if(r)return r}}isLeaf(e){return e.leaf??(!e.children&&!this.config.load)}matches(e,t){return e.text.toLowerCase().includes(t)||!!e.children?.some(i=>this.matches(i,t))}walk(e,t){for(let i of e)t(i),i.children&&this.walk(i.children,t)}paint(){let e=this.items.filter(s=>!this.query||this.matches(s,this.query));this.root.replaceChildren(...e.map(s=>this.node(s,1))),e.length||this.root.append(o("li","op-tree__empty",{role:"none"},this.config.emptyText??u("treeEmpty")));let t=this.rows(),i=t.find(s=>s.dataset.id===this.focusId)??t.find(s=>s.getAttribute("aria-selected")==="true")??t[0];t.forEach(s=>s.tabIndex=s===i?0:-1)}node(e,t){let i=this.isLeaf(e),s=!i&&(this.query?!0:this.open.has(e.id)),r=this.loading.has(e.id),h=this.selected.has(e.id),l=this.config.selection??"single",n=this.checkState(e),d=o("li","op-tree__node",{role:"none"}),a=o("div",`op-tree__item${h?" is-selected":""}${e.disabled?" is-disabled":""}${s?" is-expanded":""}${r?" is-loading":""}`,{role:"treeitem","data-id":e.id,"aria-level":t,tabindex:-1,"aria-expanded":i?null:String(s),"aria-selected":l==="none"?null:String(h),"aria-checked":this.config.checkboxes?String(n):null,"aria-disabled":e.disabled?"true":null,"aria-busy":r?"true":null});if(a.style.setProperty("--_level",String(t-1)),a.append(o("span","op-tree__toggle",{"aria-hidden":"true"},i?"":r?o("span","op-spinner op-tree__spinner"):c("chevron-right"))),this.config.checkboxes&&a.append(o("span",`op-tree__check${n===!0?" is-checked":n==="mixed"?" is-mixed":""}`,{"aria-hidden":"true"},n==="mixed"?c("minus"):n?c("check"):"")),e.icon&&a.append(o("span","op-tree__icon",{},c(e.icon))),a.append(o("span","op-tree__text",{},e.text)),d.append(a),s&&e.children?.length){let b=e.children.filter(p=>!this.query||this.matches(p,this.query));d.append(o("ul","op-tree__group",{role:"group"},...b.map(p=>this.node(p,t+1))))}return d}async expand(e){let t=this.getNode(e);if(!(!t||this.isLeaf(t)||this.open.has(e)||this.loading.has(e))){if(!t.children&&this.config.load){this.loading.add(e),this.rendered&&this.paint();try{t.children=await this.config.load(t),this.config.checkboxes&&this.checkState(t)===!0&&t.children.forEach(i=>this.setBranch(i,!0)),this.emit("load",t,t.children)}catch(i){this.loading.delete(e),this.rendered&&this.paint(),this.emit("error",i,t);return}this.loading.delete(e)}this.open.add(e),this.rendered&&this.paint(),this.emit("expand",t)}}collapse(e){let t=this.getNode(e);!t||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",t))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}expandAll(){this.walk(this.items,e=>e.children?.length&&this.open.add(e.id)),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.rendered&&this.paint()}pick(e,t){let i=this.getNode(e),s=this.config.selection??"single";!i||i.disabled||s==="none"||(s==="multi"&&t?this.selected.delete(e)||this.selected.add(e):(this.selected.clear(),this.selected.add(e)),this.rendered&&this.paint(),this.emit("select",this.getSelection()))}select(e,t={}){for(let i of this.getPath(e)??[])this.open.add(i.id);this.focusId=e,this.pick(e,!!t.add)}getSelection(){return[...this.selected].map(e=>this.getNode(e)).filter(e=>!!e)}deselectAll(){this.selected.clear(),this.rendered&&this.paint(),this.emit("select",[])}checkState(e){if(!e.children?.length)return!!e.checked;let t=e.children.map(i=>this.checkState(i));return t.every(i=>i===!0)?!0:t.some(i=>i!==!1)?"mixed":!1}setBranch(e,t){e.checked=t,e.children?.forEach(i=>this.setBranch(i,t))}setChecked(e,t){let i=this.getNode(e);!i||i.disabled||(this.setBranch(i,t),this.rendered&&this.paint(),this.emit("check",this.getChecked(),i))}toggleChecked(e){let t=this.getNode(e);t&&this.setChecked(e,this.checkState(t)!==!0)}getChecked(){let e=[];return this.walk(this.items,t=>this.checkState(t)===!0&&e.push(t)),e}setItems(e){this.items=e,this.config.items=e,this.selected.clear(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-tree__item"))}focusRow(e){e&&(this.rows().forEach(t=>t.tabIndex=t===e?0:-1),this.focusId=e.dataset.id,e.focus())}onKey(e){let t=e.target.closest(".op-tree__item");if(!t)return;let i=this.rows(),s=i.indexOf(t),r=this.getNode(t.dataset.id),h=t.getAttribute("aria-expanded")==="true",l=t.getAttribute("aria-expanded")==="false";switch(e.key){case"ArrowDown":this.focusRow(i[s+1]);break;case"ArrowUp":this.focusRow(i[s-1]);break;case"Home":this.focusRow(i[0]);break;case"End":this.focusRow(i[i.length-1]);break;case"ArrowRight":l?this.expand(r.id):h&&this.focusRow(i[s+1]);break;case"ArrowLeft":if(h)this.collapse(r.id);else{let d=this.getPath(r.id)?.pop();d&&this.focusRow(i.find(a=>a.dataset.id===d.id))}break;case" ":this.config.checkboxes?this.toggleChecked(r.id):this.pick(r.id,this.config.selection==="multi");break;case"Enter":this.pick(r.id,!1),r.disabled||this.emit("activate",r);break;default:return}e.preventDefault();let n=this.root.querySelector(`[data-id="${CSS.escape(this.focusId??r.id)}"]`);n&&document.activeElement!==n&&this.focusRow(n)}};k("tree",g);export{g as a};
2
- //# sourceMappingURL=chunk-DBMWS3O5.js.map
1
+ import{c}from"./chunk-DIOJGTUN.js";import{a as k}from"./chunk-TIPK3SCJ.js";import{f as m}from"./chunk-UDXO3KM3.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as f,f as u}from"./chunk-S4QD5NID.js";f("en",{treeLoading:"Loading\u2026",treeEmpty:"Nothing here"});f("pt-BR",{treeLoading:"Carregando\u2026",treeEmpty:"Nada aqui"});var g=class extends m{baseCls="op-tree";items=[];open=new Set;selected=new Set;loading=new Set;query="";focusId;root;onRender(){let e=this.config;this.items=e.items??[];let t=i=>i.forEach(s=>(s.expanded&&this.open.add(s.id),s.children&&t(s.children)));t(this.items),this.root=o("ul","op-tree__root",{role:"tree","aria-label":e.ariaLabel??null,"aria-multiselectable":e.selection==="multi"?"true":null}),this.el.removeAttribute("aria-label"),this.el.append(this.root),this.listen(this.root,"click",i=>{let s=i.target.closest(".op-tree__item");if(!s)return;let r=s.dataset.id;if(this.focusId=r,i.target.closest(".op-tree__toggle"))return this.toggle(r);if(i.target.closest(".op-tree__check"))return this.toggleChecked(r);this.pick(r,i.ctrlKey||i.metaKey)}),this.listen(this.root,"dblclick",i=>{let s=i.target.closest(".op-tree__item"),r=s&&this.getNode(s.dataset.id);r&&!r.disabled&&this.emit("activate",r)}),this.listen(this.root,"keydown",i=>this.onKey(i)),this.paint()}getNode(e,t=this.items){for(let i of t){if(i.id===e)return i;let s=i.children&&this.getNode(e,i.children);if(s)return s}}getPath(e,t=this.items,i=[]){for(let s of t){if(s.id===e)return i;let r=s.children&&this.getPath(e,s.children,[...i,s]);if(r)return r}}isLeaf(e){return e.leaf??(!e.children&&!this.config.load)}matches(e,t){return e.text.toLowerCase().includes(t)||!!e.children?.some(i=>this.matches(i,t))}walk(e,t){for(let i of e)t(i),i.children&&this.walk(i.children,t)}paint(){let e=this.items.filter(s=>!this.query||this.matches(s,this.query));this.root.replaceChildren(...e.map(s=>this.node(s,1))),e.length||this.root.append(o("li","op-tree__empty",{role:"none"},this.config.emptyText??u("treeEmpty")));let t=this.rows(),i=t.find(s=>s.dataset.id===this.focusId)??t.find(s=>s.getAttribute("aria-selected")==="true")??t[0];t.forEach(s=>s.tabIndex=s===i?0:-1)}node(e,t){let i=this.isLeaf(e),s=!i&&(this.query?!0:this.open.has(e.id)),r=this.loading.has(e.id),h=this.selected.has(e.id),l=this.config.selection??"single",n=this.checkState(e),d=o("li","op-tree__node",{role:"none"}),a=o("div",`op-tree__item${h?" is-selected":""}${e.disabled?" is-disabled":""}${s?" is-expanded":""}${r?" is-loading":""}`,{role:"treeitem","data-id":e.id,"aria-level":t,tabindex:-1,"aria-expanded":i?null:String(s),"aria-selected":l==="none"?null:String(h),"aria-checked":this.config.checkboxes?String(n):null,"aria-disabled":e.disabled?"true":null,"aria-busy":r?"true":null});if(a.style.setProperty("--_level",String(t-1)),a.append(o("span","op-tree__toggle",{"aria-hidden":"true"},i?"":r?o("span","op-spinner op-tree__spinner"):c("chevron-right"))),this.config.checkboxes&&a.append(o("span",`op-tree__check${n===!0?" is-checked":n==="mixed"?" is-mixed":""}`,{"aria-hidden":"true"},n==="mixed"?c("minus"):n?c("check"):"")),e.icon&&a.append(o("span","op-tree__icon",{},c(e.icon))),a.append(o("span","op-tree__text",{},e.text)),d.append(a),s&&e.children?.length){let b=e.children.filter(p=>!this.query||this.matches(p,this.query));d.append(o("ul","op-tree__group",{role:"group"},...b.map(p=>this.node(p,t+1))))}return d}async expand(e){let t=this.getNode(e);if(!(!t||this.isLeaf(t)||this.open.has(e)||this.loading.has(e))){if(!t.children&&this.config.load){this.loading.add(e),this.rendered&&this.paint();try{t.children=await this.config.load(t),this.config.checkboxes&&this.checkState(t)===!0&&t.children.forEach(i=>this.setBranch(i,!0)),this.emit("load",t,t.children)}catch(i){this.loading.delete(e),this.rendered&&this.paint(),this.emit("error",i,t);return}this.loading.delete(e)}this.open.add(e),this.rendered&&this.paint(),this.emit("expand",t)}}collapse(e){let t=this.getNode(e);!t||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",t))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}expandAll(){this.walk(this.items,e=>e.children?.length&&this.open.add(e.id)),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.rendered&&this.paint()}pick(e,t){let i=this.getNode(e),s=this.config.selection??"single";!i||i.disabled||s==="none"||(s==="multi"&&t?this.selected.delete(e)||this.selected.add(e):(this.selected.clear(),this.selected.add(e)),this.rendered&&this.paint(),this.emit("select",this.getSelection()))}select(e,t={}){for(let i of this.getPath(e)??[])this.open.add(i.id);this.focusId=e,this.pick(e,!!t.add)}getSelection(){return[...this.selected].map(e=>this.getNode(e)).filter(e=>!!e)}deselectAll(){this.selected.clear(),this.rendered&&this.paint(),this.emit("select",[])}checkState(e){if(!e.children?.length)return!!e.checked;let t=e.children.map(i=>this.checkState(i));return t.every(i=>i===!0)?!0:t.some(i=>i!==!1)?"mixed":!1}setBranch(e,t){e.checked=t,e.children?.forEach(i=>this.setBranch(i,t))}setChecked(e,t){let i=this.getNode(e);!i||i.disabled||(this.setBranch(i,t),this.rendered&&this.paint(),this.emit("check",this.getChecked(),i))}toggleChecked(e){let t=this.getNode(e);t&&this.setChecked(e,this.checkState(t)!==!0)}getChecked(){let e=[];return this.walk(this.items,t=>this.checkState(t)===!0&&e.push(t)),e}setItems(e){this.items=e,this.config.items=e,this.selected.clear(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-tree__item"))}focusRow(e){e&&(this.rows().forEach(t=>t.tabIndex=t===e?0:-1),this.focusId=e.dataset.id,e.focus())}onKey(e){let t=e.target.closest(".op-tree__item");if(!t)return;let i=this.rows(),s=i.indexOf(t),r=this.getNode(t.dataset.id),h=t.getAttribute("aria-expanded")==="true",l=t.getAttribute("aria-expanded")==="false";switch(e.key){case"ArrowDown":this.focusRow(i[s+1]);break;case"ArrowUp":this.focusRow(i[s-1]);break;case"Home":this.focusRow(i[0]);break;case"End":this.focusRow(i[i.length-1]);break;case"ArrowRight":l?this.expand(r.id):h&&this.focusRow(i[s+1]);break;case"ArrowLeft":if(h)this.collapse(r.id);else{let d=this.getPath(r.id)?.pop();d&&this.focusRow(i.find(a=>a.dataset.id===d.id))}break;case" ":this.config.checkboxes?this.toggleChecked(r.id):this.pick(r.id,this.config.selection==="multi");break;case"Enter":this.pick(r.id,!1),r.disabled||this.emit("activate",r);break;default:return}e.preventDefault();let n=this.root.querySelector(`[data-id="${CSS.escape(this.focusId??r.id)}"]`);n&&document.activeElement!==n&&this.focusRow(n)}};k("tree",g);export{g as a};
2
+ //# sourceMappingURL=chunk-MQ5BYGFY.js.map