optikos 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/build.js +2 -0
  5. package/dist/build.js.map +7 -0
  6. package/dist/chunk-2CVMT3IW.js +3 -0
  7. package/dist/chunk-2CVMT3IW.js.map +7 -0
  8. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  9. package/dist/{chunk-5BC72727.js → chunk-2I4Y7I7C.js} +2 -2
  10. package/dist/{chunk-Z2Z52GFT.js → chunk-2I7HDIOU.js} +2 -2
  11. package/dist/chunk-2QMI2RRB.js +2 -0
  12. package/dist/chunk-2QMI2RRB.js.map +7 -0
  13. package/dist/chunk-34KVSA2V.js +3 -0
  14. package/dist/chunk-34KVSA2V.js.map +7 -0
  15. package/dist/chunk-37PYJAA2.js +2 -0
  16. package/dist/{chunk-UXXJOU5J.js.map → chunk-37PYJAA2.js.map} +1 -1
  17. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  18. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  19. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  20. package/dist/chunk-3OA3P37P.js +2 -0
  21. package/dist/chunk-3OA3P37P.js.map +7 -0
  22. package/dist/chunk-3TCITFUU.js +2 -0
  23. package/dist/chunk-3TCITFUU.js.map +7 -0
  24. package/dist/chunk-3VDLX7ET.js +2 -0
  25. package/dist/chunk-3VDLX7ET.js.map +7 -0
  26. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  27. package/dist/chunk-5G5PHOZJ.js +2 -0
  28. package/dist/chunk-5G5PHOZJ.js.map +7 -0
  29. package/dist/{chunk-EDUMAMK4.js → chunk-5GCTM37D.js} +2 -2
  30. package/dist/chunk-5PYJ6FJK.js +2 -0
  31. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  32. package/dist/chunk-632LUU52.js +2 -0
  33. package/dist/chunk-632LUU52.js.map +7 -0
  34. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  35. package/dist/{chunk-Z2JBUHKA.js → chunk-6NP4AEV4.js} +2 -2
  36. package/dist/chunk-6PPRYSLN.js +2 -0
  37. package/dist/chunk-6PPRYSLN.js.map +7 -0
  38. package/dist/{chunk-NXSTUFS7.js → chunk-6TZJO2G2.js} +2 -2
  39. package/dist/chunk-7Y2GHQRB.js +2 -0
  40. package/dist/chunk-A36JFIA3.js +2 -0
  41. package/dist/chunk-A36JFIA3.js.map +7 -0
  42. package/dist/{chunk-G2KUK6AT.js → chunk-ADHKL2GM.js} +2 -2
  43. package/dist/{chunk-JI265XFO.js → chunk-AJN66F32.js} +2 -2
  44. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  45. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  46. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  47. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  48. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  49. package/dist/{chunk-HXDTGP2K.js → chunk-BRGT4O6Q.js} +2 -2
  50. package/dist/{chunk-OGRFQTXA.js → chunk-BTGJ3MP4.js} +2 -2
  51. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  52. package/dist/{chunk-M242VYZA.js → chunk-CXZKCBQE.js} +2 -2
  53. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  54. package/dist/chunk-DJUSVBD5.js +2 -0
  55. package/dist/chunk-DJUSVBD5.js.map +7 -0
  56. package/dist/chunk-DLRGB5NY.js +2 -0
  57. package/dist/chunk-DLRGB5NY.js.map +7 -0
  58. package/dist/chunk-DY3ZYMXD.js +2 -0
  59. package/dist/chunk-DY3ZYMXD.js.map +7 -0
  60. package/dist/chunk-EO777UIN.js +2 -0
  61. package/dist/chunk-EO777UIN.js.map +7 -0
  62. package/dist/chunk-ESCLDVFS.js +2 -0
  63. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  64. package/dist/{chunk-2ZUZ5HDL.js → chunk-ESRS5ZQV.js} +2 -2
  65. package/dist/{chunk-RNN55473.js → chunk-FNZI6MFG.js} +2 -2
  66. package/dist/{chunk-RNN55473.js.map → chunk-FNZI6MFG.js.map} +1 -1
  67. package/dist/{chunk-JK74QK3M.js → chunk-FSR6BDVO.js} +2 -2
  68. package/dist/{chunk-6VBK2I5B.js → chunk-G26R2F3W.js} +2 -2
  69. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  70. package/dist/chunk-GFJRGBQR.js +2 -0
  71. package/dist/chunk-GFJRGBQR.js.map +7 -0
  72. package/dist/chunk-GLAY4RJF.js +2 -0
  73. package/dist/chunk-GLAY4RJF.js.map +7 -0
  74. package/dist/chunk-GNKVLJ5H.js +2 -0
  75. package/dist/chunk-GNKVLJ5H.js.map +7 -0
  76. package/dist/chunk-GZIDE5K2.js +2 -0
  77. package/dist/chunk-GZIDE5K2.js.map +7 -0
  78. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  79. package/dist/chunk-HG7OOHGD.js +2 -0
  80. package/dist/chunk-HG7OOHGD.js.map +7 -0
  81. package/dist/chunk-HRW25TMU.js +2 -0
  82. package/dist/chunk-HX6TWXTX.js +2 -0
  83. package/dist/chunk-HX6TWXTX.js.map +7 -0
  84. package/dist/chunk-I5A74NMJ.js +2 -0
  85. package/dist/chunk-I5A74NMJ.js.map +7 -0
  86. package/dist/chunk-IODSL7KU.js +2 -0
  87. package/dist/chunk-IODSL7KU.js.map +7 -0
  88. package/dist/chunk-J2TCHWYD.js +2 -0
  89. package/dist/chunk-J2TCHWYD.js.map +7 -0
  90. package/dist/chunk-J5BZAKC6.js +2 -0
  91. package/dist/chunk-J5BZAKC6.js.map +7 -0
  92. package/dist/chunk-JBOKM5YA.js +2 -0
  93. package/dist/{chunk-KLLAY2IM.js.map → chunk-JBOKM5YA.js.map} +2 -2
  94. package/dist/chunk-L5SQQFO7.js +2 -0
  95. package/dist/chunk-L5SQQFO7.js.map +7 -0
  96. package/dist/chunk-L6DOWGBO.js +2 -0
  97. package/dist/chunk-L6DOWGBO.js.map +7 -0
  98. package/dist/{chunk-W3H7GTJY.js → chunk-LHWY6G6Q.js} +2 -2
  99. package/dist/chunk-LLHDEUIA.js +2 -0
  100. package/dist/chunk-LLHDEUIA.js.map +7 -0
  101. package/dist/chunk-LXWCTCZV.js +2 -0
  102. package/dist/chunk-LXWCTCZV.js.map +7 -0
  103. package/dist/chunk-M2ZRKHE4.js +2 -0
  104. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  105. package/dist/{chunk-Q26YZYTD.js → chunk-M7HLHGQV.js} +2 -2
  106. package/dist/{chunk-IHE2MQ3W.js → chunk-MGSCSS7X.js} +2 -2
  107. package/dist/chunk-MM2OC66E.js +4 -0
  108. package/dist/{chunk-XX2MVWFS.js.map → chunk-MM2OC66E.js.map} +1 -1
  109. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  110. package/dist/chunk-MQEALOU3.js +3 -0
  111. package/dist/chunk-MQEALOU3.js.map +7 -0
  112. package/dist/chunk-NAUSRVB6.js +2 -0
  113. package/dist/chunk-NAUSRVB6.js.map +7 -0
  114. package/dist/chunk-NEVDHDJ4.js +3 -0
  115. package/dist/chunk-NEVDHDJ4.js.map +7 -0
  116. package/dist/{chunk-5QUY72FX.js → chunk-NWHH3CYH.js} +2 -2
  117. package/dist/chunk-OADWLPSF.js +2 -0
  118. package/dist/chunk-OADWLPSF.js.map +7 -0
  119. package/dist/{chunk-3TAW4AKH.js → chunk-OB3VIRQR.js} +2 -2
  120. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  121. package/dist/chunk-Q6FY4L2F.js +2 -0
  122. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  123. package/dist/{chunk-TZOQWCVH.js → chunk-QOSTS5I3.js} +2 -2
  124. package/dist/chunk-QVBDBGS4.js +2 -0
  125. package/dist/chunk-QVBDBGS4.js.map +7 -0
  126. package/dist/{chunk-3S24ZRPK.js → chunk-RMATRKXV.js} +2 -2
  127. package/dist/{chunk-I4SP6JTU.js → chunk-S3ILIWSW.js} +2 -2
  128. package/dist/chunk-S4QD5NID.js +2 -0
  129. package/dist/chunk-S4QD5NID.js.map +7 -0
  130. package/dist/{chunk-XHOBNSBO.js → chunk-SEUIIPHS.js} +2 -2
  131. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  132. package/dist/chunk-T5OGUCY2.js +2 -0
  133. package/dist/chunk-T5OGUCY2.js.map +7 -0
  134. package/dist/chunk-TMBGEZSD.js +2 -0
  135. package/dist/chunk-TMBGEZSD.js.map +7 -0
  136. package/dist/chunk-TVO3Z2BM.js +2 -0
  137. package/dist/chunk-TVO3Z2BM.js.map +7 -0
  138. package/dist/{chunk-LQRFNQ2N.js → chunk-U25QSLAH.js} +2 -2
  139. package/dist/chunk-UCWICDYG.js +2 -0
  140. package/dist/chunk-UCWICDYG.js.map +7 -0
  141. package/dist/chunk-UDXO3KM3.js +2 -0
  142. package/dist/chunk-UDXO3KM3.js.map +7 -0
  143. package/dist/{chunk-FEHGU6EP.js → chunk-UL364TLO.js} +2 -2
  144. package/dist/chunk-UUAGMZD2.js +2 -0
  145. package/dist/chunk-UUAGMZD2.js.map +7 -0
  146. package/dist/chunk-V5G5JECN.js +2 -0
  147. package/dist/chunk-V5G5JECN.js.map +7 -0
  148. package/dist/chunk-XFDNXSU5.js +2 -0
  149. package/dist/chunk-XFDNXSU5.js.map +7 -0
  150. package/dist/{chunk-JBLRAM7Z.js → chunk-XNRZJP4E.js} +2 -2
  151. package/dist/chunk-YJTUFK4P.js +2 -0
  152. package/dist/chunk-YLFSCQL3.js +2 -0
  153. package/dist/chunk-YLFSCQL3.js.map +7 -0
  154. package/dist/chunk-Z6HZY2YG.js +2 -0
  155. package/dist/chunk-Z6HZY2YG.js.map +7 -0
  156. package/dist/chunk-ZEIE2OCQ.js +2 -0
  157. package/dist/chunk-ZEIE2OCQ.js.map +7 -0
  158. package/dist/{chunk-2YZB6XQR.js → chunk-ZLYZFHEN.js} +2 -2
  159. package/dist/components/avatar.js +2 -0
  160. package/dist/components/avatar.js.map +7 -0
  161. package/dist/components/badge.js +1 -1
  162. package/dist/components/breadcrumb.js +1 -1
  163. package/dist/components/button.js +1 -1
  164. package/dist/components/calendar.js +1 -1
  165. package/dist/components/carousel.js +2 -0
  166. package/dist/components/carousel.js.map +7 -0
  167. package/dist/components/cellediting.js +1 -1
  168. package/dist/components/chart.js +2 -0
  169. package/dist/components/chart.js.map +7 -0
  170. package/dist/components/chat.js +1 -1
  171. package/dist/components/checkbox.js +1 -1
  172. package/dist/components/checkboxgroup.js +1 -1
  173. package/dist/components/chip.js +1 -1
  174. package/dist/components/codeviewer.js +1 -1
  175. package/dist/components/columntotals.js +2 -0
  176. package/dist/components/columntotals.js.map +7 -0
  177. package/dist/components/combobox.js +1 -1
  178. package/dist/components/commandpalette.js +1 -1
  179. package/dist/components/container.js +1 -1
  180. package/dist/components/dataview.js +1 -1
  181. package/dist/components/datefield.js +1 -1
  182. package/dist/components/daterangefield.js +1 -1
  183. package/dist/components/datetimefield.js +2 -0
  184. package/dist/components/datetimefield.js.map +7 -0
  185. package/dist/components/dial.js +1 -1
  186. package/dist/components/dropdown.js +1 -1
  187. package/dist/components/exportbar.js +2 -0
  188. package/dist/components/exportbar.js.map +7 -0
  189. package/dist/components/fieldgroup.js +1 -1
  190. package/dist/components/fieldlist.js +1 -1
  191. package/dist/components/fieldset.js +1 -1
  192. package/dist/components/filterbuilder.js +1 -1
  193. package/dist/components/form.js +1 -1
  194. package/dist/components/formactions.js +1 -1
  195. package/dist/components/formerrors.js +1 -1
  196. package/dist/components/formsection.js +1 -1
  197. package/dist/components/grid.js +1 -1
  198. package/dist/components/gridexport.js +2 -0
  199. package/dist/components/gridexport.js.map +7 -0
  200. package/dist/components/gridstate.js +2 -0
  201. package/dist/components/gridstate.js.map +7 -0
  202. package/dist/components/grouping.js +2 -0
  203. package/dist/components/grouping.js.map +7 -0
  204. package/dist/components/icon.js +1 -1
  205. package/dist/components/image.js +2 -0
  206. package/dist/components/image.js.map +7 -0
  207. package/dist/components/imagecanvas.js +2 -0
  208. package/dist/components/imagecanvas.js.map +7 -0
  209. package/dist/components/imagefield.js +2 -0
  210. package/dist/components/imagefield.js.map +7 -0
  211. package/dist/components/inputgroup.js +1 -1
  212. package/dist/components/label.js +1 -1
  213. package/dist/components/listbox.js +1 -1
  214. package/dist/components/lookupfield.js +1 -1
  215. package/dist/components/maskfield.js +2 -0
  216. package/dist/components/maskfield.js.map +7 -0
  217. package/dist/components/menu.js +1 -1
  218. package/dist/components/messagebox.js +1 -1
  219. package/dist/components/navmenu.js +1 -1
  220. package/dist/components/numberfield.js +1 -1
  221. package/dist/components/pagination.js +1 -1
  222. package/dist/components/panel.js +1 -1
  223. package/dist/components/pickerfield.js +1 -1
  224. package/dist/components/radiogroup.js +1 -1
  225. package/dist/components/rowediting.js +2 -0
  226. package/dist/components/rowediting.js.map +7 -0
  227. package/dist/components/searchgrid.js +1 -1
  228. package/dist/components/secretfield.js +1 -1
  229. package/dist/components/select.js +1 -1
  230. package/dist/components/shortcuts.js +2 -0
  231. package/dist/components/shortcuts.js.map +7 -0
  232. package/dist/components/slider.js +1 -1
  233. package/dist/components/spacer.js +1 -1
  234. package/dist/components/spinner.js +1 -1
  235. package/dist/components/stat.js +2 -0
  236. package/dist/components/stat.js.map +7 -0
  237. package/dist/components/stepform.js +1 -1
  238. package/dist/components/stepper.js +1 -1
  239. package/dist/components/suggestfield.js +1 -1
  240. package/dist/components/table.js +1 -1
  241. package/dist/components/tabs.js +1 -1
  242. package/dist/components/textarea.js +1 -1
  243. package/dist/components/textfield.js +1 -1
  244. package/dist/components/timeentry.js +2 -0
  245. package/dist/components/timeentry.js.map +7 -0
  246. package/dist/components/timefield.js +2 -0
  247. package/dist/components/timefield.js.map +7 -0
  248. package/dist/components/timeline.js +2 -0
  249. package/dist/components/timeline.js.map +7 -0
  250. package/dist/components/toast.js +1 -1
  251. package/dist/components/toggle.js +1 -1
  252. package/dist/components/toolbar.js +1 -1
  253. package/dist/components/tree.js +1 -1
  254. package/dist/components/treegrid.js +2 -0
  255. package/dist/components/treegrid.js.map +7 -0
  256. package/dist/components/viewmanager.js +1 -1
  257. package/dist/components/viewport.js +1 -1
  258. package/dist/components/widget.js +1 -1
  259. package/dist/components/window.js +1 -1
  260. package/dist/core.js +1 -1
  261. package/dist/css/avatar.css +68 -0
  262. package/dist/css/base.css +9 -0
  263. package/dist/css/carousel.css +119 -0
  264. package/dist/css/chart.css +168 -0
  265. package/dist/css/columntotals.css +56 -0
  266. package/dist/css/core.css +36 -0
  267. package/dist/css/datetimefield.css +15 -0
  268. package/dist/css/exportbar.css +9 -0
  269. package/dist/css/grid.css +52 -0
  270. package/dist/css/gridexport.css +35 -0
  271. package/dist/css/grouping.css +56 -0
  272. package/dist/css/image.css +46 -0
  273. package/dist/css/imagecanvas.css +75 -0
  274. package/dist/css/imagefield.css +103 -0
  275. package/dist/css/rowediting.css +39 -0
  276. package/dist/css/shortcuts.css +34 -0
  277. package/dist/css/stat.css +64 -0
  278. package/dist/css/stepform.css +1 -0
  279. package/dist/css/timeentry.css +116 -0
  280. package/dist/css/timeline.css +185 -0
  281. package/dist/css/treegrid.css +35 -0
  282. package/dist/css/window.css +2 -2
  283. package/dist/data.js +1 -1
  284. package/dist/dev.js +2 -0
  285. package/dist/dev.js.map +7 -0
  286. package/dist/index.js +16 -5
  287. package/dist/index.js.map +4 -4
  288. package/dist/optikos.css +1480 -142
  289. package/dist/testing.js +2 -0
  290. package/dist/testing.js.map +7 -0
  291. package/dist/themes/dark.css +7 -0
  292. package/dist/types/bind/index.d.ts +1 -1
  293. package/dist/types/bind/viewmodel.d.ts +33 -0
  294. package/dist/types/build/build.d.ts +49 -0
  295. package/dist/types/build/index.d.ts +1 -0
  296. package/dist/types/components/avatar.d.ts +1 -0
  297. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  298. package/dist/types/components/base/image/image.d.ts +25 -0
  299. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  300. package/dist/types/components/carousel.d.ts +1 -0
  301. package/dist/types/components/chart.d.ts +1 -0
  302. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  303. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  304. package/dist/types/components/columntotals.d.ts +1 -0
  305. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  306. package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
  307. package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
  308. package/dist/types/components/data/grid/footer.d.ts +6 -0
  309. package/dist/types/components/data/grid/grid.d.ts +37 -0
  310. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  311. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  312. package/dist/types/components/data/grouping/controls.d.ts +27 -0
  313. package/dist/types/components/data/grouping/grouping.d.ts +43 -0
  314. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  315. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  316. package/dist/types/components/data/timeentry/timeentry.d.ts +37 -0
  317. package/dist/types/components/data/timeline/timeline.d.ts +63 -0
  318. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  319. package/dist/types/components/datetimefield.d.ts +1 -0
  320. package/dist/types/components/exportbar.d.ts +1 -0
  321. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  322. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  323. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  324. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  325. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  326. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  327. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  328. package/dist/types/components/form/form/form.d.ts +5 -0
  329. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  330. package/dist/types/components/gridexport.d.ts +1 -0
  331. package/dist/types/components/gridstate.d.ts +1 -0
  332. package/dist/types/components/grouping.d.ts +1 -0
  333. package/dist/types/components/image.d.ts +1 -0
  334. package/dist/types/components/imagecanvas.d.ts +1 -0
  335. package/dist/types/components/imagefield.d.ts +1 -0
  336. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  337. package/dist/types/components/maskfield.d.ts +1 -0
  338. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  339. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  340. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  341. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  342. package/dist/types/components/overlays/window/window.d.ts +14 -1
  343. package/dist/types/components/rowediting.d.ts +1 -0
  344. package/dist/types/components/shortcuts.d.ts +1 -0
  345. package/dist/types/components/stat.d.ts +1 -0
  346. package/dist/types/components/timeentry.d.ts +1 -0
  347. package/dist/types/components/timefield.d.ts +1 -0
  348. package/dist/types/components/timeline.d.ts +1 -0
  349. package/dist/types/components/treegrid.d.ts +1 -0
  350. package/dist/types/core/component.d.ts +7 -0
  351. package/dist/types/core/container.d.ts +10 -1
  352. package/dist/types/core/dev.d.ts +2 -0
  353. package/dist/types/core/field.d.ts +4 -0
  354. package/dist/types/core/i18n.d.ts +2 -0
  355. package/dist/types/core/index.d.ts +4 -1
  356. package/dist/types/core/path.d.ts +2 -0
  357. package/dist/types/core/permission.d.ts +11 -0
  358. package/dist/types/core/state.d.ts +9 -0
  359. package/dist/types/data/column.d.ts +11 -1
  360. package/dist/types/data/index.d.ts +1 -1
  361. package/dist/types/data/model.d.ts +2 -0
  362. package/dist/types/data/store.d.ts +21 -0
  363. package/dist/types/dev/index.d.ts +2 -0
  364. package/dist/types/dev/keys.d.ts +1 -0
  365. package/dist/types/index.d.ts +21 -0
  366. package/dist/types/testing/index.d.ts +25 -0
  367. package/dist/types/themes/color.d.ts +14 -0
  368. package/dist/types/themes/contrast.d.ts +15 -0
  369. package/dist/types/themes/define.d.ts +25 -3
  370. package/dist/types/themes/index.d.ts +3 -1
  371. package/dist/types/themes/seeds.d.ts +11 -0
  372. package/dist/types/ui/ui.d.ts +6 -0
  373. package/dist/ui.js +1 -1
  374. package/package.json +13 -1
  375. package/dist/chunk-2ZRNGG2N.js +0 -2
  376. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  377. package/dist/chunk-4EQEHJB3.js +0 -2
  378. package/dist/chunk-4EQEHJB3.js.map +0 -7
  379. package/dist/chunk-4LZZ244E.js +0 -2
  380. package/dist/chunk-4LZZ244E.js.map +0 -7
  381. package/dist/chunk-4SYIIX5A.js +0 -2
  382. package/dist/chunk-4SYIIX5A.js.map +0 -7
  383. package/dist/chunk-7KMIFXHZ.js +0 -2
  384. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  385. package/dist/chunk-A2NKDOYN.js +0 -2
  386. package/dist/chunk-A2NKDOYN.js.map +0 -7
  387. package/dist/chunk-CKXS375P.js +0 -2
  388. package/dist/chunk-CKXS375P.js.map +0 -7
  389. package/dist/chunk-EJGWCKE4.js +0 -2
  390. package/dist/chunk-EJGWCKE4.js.map +0 -7
  391. package/dist/chunk-ELYARUCN.js +0 -2
  392. package/dist/chunk-EV73ADN2.js +0 -2
  393. package/dist/chunk-EV73ADN2.js.map +0 -7
  394. package/dist/chunk-GD5JGKM7.js +0 -2
  395. package/dist/chunk-GD5JGKM7.js.map +0 -7
  396. package/dist/chunk-GZ7X34QP.js +0 -2
  397. package/dist/chunk-KCEUD232.js +0 -2
  398. package/dist/chunk-KCEUD232.js.map +0 -7
  399. package/dist/chunk-KLLAY2IM.js +0 -2
  400. package/dist/chunk-LBJSMXLV.js +0 -2
  401. package/dist/chunk-LBJSMXLV.js.map +0 -7
  402. package/dist/chunk-LW2WRUVL.js +0 -2
  403. package/dist/chunk-LW2WRUVL.js.map +0 -7
  404. package/dist/chunk-MW3RWBZ7.js +0 -2
  405. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  406. package/dist/chunk-OEAXCCVM.js +0 -2
  407. package/dist/chunk-OEAXCCVM.js.map +0 -7
  408. package/dist/chunk-UB5RYS7T.js +0 -2
  409. package/dist/chunk-UB5RYS7T.js.map +0 -7
  410. package/dist/chunk-UXXJOU5J.js +0 -2
  411. package/dist/chunk-VU3GIDZ3.js +0 -2
  412. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  413. package/dist/chunk-W2BAFOCN.js +0 -3
  414. package/dist/chunk-W2BAFOCN.js.map +0 -7
  415. package/dist/chunk-WFGTQZIQ.js +0 -2
  416. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  417. package/dist/chunk-XX2MVWFS.js +0 -4
  418. package/dist/chunk-XYZ6VZ5T.js +0 -2
  419. package/dist/chunk-YBAYEU25.js +0 -2
  420. package/dist/chunk-YF75HKL6.js +0 -2
  421. package/dist/chunk-YF75HKL6.js.map +0 -7
  422. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  423. /package/dist/{chunk-5BC72727.js.map → chunk-2I4Y7I7C.js.map} +0 -0
  424. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-2I7HDIOU.js.map} +0 -0
  425. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  426. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  427. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  428. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  429. /package/dist/{chunk-EDUMAMK4.js.map → chunk-5GCTM37D.js.map} +0 -0
  430. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  431. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-6NP4AEV4.js.map} +0 -0
  432. /package/dist/{chunk-NXSTUFS7.js.map → chunk-6TZJO2G2.js.map} +0 -0
  433. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  434. /package/dist/{chunk-G2KUK6AT.js.map → chunk-ADHKL2GM.js.map} +0 -0
  435. /package/dist/{chunk-JI265XFO.js.map → chunk-AJN66F32.js.map} +0 -0
  436. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  437. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  438. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  439. /package/dist/{chunk-HXDTGP2K.js.map → chunk-BRGT4O6Q.js.map} +0 -0
  440. /package/dist/{chunk-OGRFQTXA.js.map → chunk-BTGJ3MP4.js.map} +0 -0
  441. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  442. /package/dist/{chunk-M242VYZA.js.map → chunk-CXZKCBQE.js.map} +0 -0
  443. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  444. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-ESRS5ZQV.js.map} +0 -0
  445. /package/dist/{chunk-JK74QK3M.js.map → chunk-FSR6BDVO.js.map} +0 -0
  446. /package/dist/{chunk-6VBK2I5B.js.map → chunk-G26R2F3W.js.map} +0 -0
  447. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  448. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  449. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  450. /package/dist/{chunk-W3H7GTJY.js.map → chunk-LHWY6G6Q.js.map} +0 -0
  451. /package/dist/{chunk-Q26YZYTD.js.map → chunk-M7HLHGQV.js.map} +0 -0
  452. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-MGSCSS7X.js.map} +0 -0
  453. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  454. /package/dist/{chunk-5QUY72FX.js.map → chunk-NWHH3CYH.js.map} +0 -0
  455. /package/dist/{chunk-3TAW4AKH.js.map → chunk-OB3VIRQR.js.map} +0 -0
  456. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  457. /package/dist/{chunk-TZOQWCVH.js.map → chunk-QOSTS5I3.js.map} +0 -0
  458. /package/dist/{chunk-3S24ZRPK.js.map → chunk-RMATRKXV.js.map} +0 -0
  459. /package/dist/{chunk-I4SP6JTU.js.map → chunk-S3ILIWSW.js.map} +0 -0
  460. /package/dist/{chunk-XHOBNSBO.js.map → chunk-SEUIIPHS.js.map} +0 -0
  461. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  462. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-U25QSLAH.js.map} +0 -0
  463. /package/dist/{chunk-FEHGU6EP.js.map → chunk-UL364TLO.js.map} +0 -0
  464. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XNRZJP4E.js.map} +0 -0
  465. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  466. /package/dist/{chunk-2YZB6XQR.js.map → chunk-ZLYZFHEN.js.map} +0 -0
@@ -0,0 +1,2 @@
1
+ import{a as M}from"./chunk-M2ZRKHE4.js";import{a as C}from"./chunk-VV7CFMPZ.js";import{c as h}from"./chunk-TIPK3SCJ.js";import{b as y}from"./chunk-PZSHOSOS.js";import{e as k,f as p}from"./chunk-S4QD5NID.js";k("en",{rowSave:"Save",rowCancel:"Cancel",rowEditing:"Editing row"});k("pt-BR",{rowSave:"Salvar",rowCancel:"Cancelar",rowEditing:"Editando linha"});function K(v={}){let d,l,S=(e,n)=>!!e.editor&&(e.editable?.(n)??!0);function w(){let e=l;if(l=void 0,!!e){for(let n of e.fields)n.field.destroy(),n.cell.classList.remove("is-editing");return e.bar.remove(),e.row.classList.remove("is-row-editing"),e}}function E(){let e=l;if(!e)return!0;let n=e.fields.filter(i=>!i.field.validate());if(n.length)return n[0].field.focus(),!1;w();let o={},a={};for(let i of e.fields){let c=i.field.getValue();Object.is(c,i.old)||(o[i.col.field]=c,a[i.col.field]=i.old)}for(let i in o)e.record.set(i,o[i]);return d.refresh(),Object.keys(o).length&&d.emit("edit",e.record,o,a),!0}function b(){let e=w();e&&(d.refresh(),d.emit("cancel-edit",e.record))}function L(e,n){let o=d.getRowEntry(e)?.rec;if(!o||l?.index===e)return!1;let a=d.getColumns().filter(r=>S(r,o));if(!a.length||l&&!E()||d.emit("before-edit",o)===!1)return!1;let i=document.getElementById(`${d.id}-r${e}`);if(!i)return!1;let c=a.flatMap(r=>{let f=d.getCell(e,r.field);if(!f)return[];let m=o.get(r.field),u=h({...M(r,m),value:m,stableSize:!1,ariaLabel:r.header??r.field,cls:"op-grid__editor"});return f.classList.add("is-editing"),f.replaceChildren(u.el),u.notifyMount(),[{col:r,field:u,cell:f,old:m}]}),g=(r,f,m)=>{let u=y("button",`op-grid__rowbtn ${f}`,{type:"button"},r);return u.addEventListener("click",m),u},t=y("div","op-grid__rowbar",{role:"group","aria-label":p("rowEditing")},g(p("rowSave"),"is-primary",()=>E()),g(p("rowCancel"),"",b));i.classList.add("is-row-editing"),i.append(t),l={index:e,record:o,row:i,bar:t,fields:c};let s=c.find(r=>r.col.field===n)??c[0];return s?.field.focus(),s?.field.el.querySelector("input")?.select(),!0}return{init(e){d=e;let n=e.el,o=n.querySelector("[role=grid]"),a=n.querySelector(".op-grid__viewport"),i=t=>{let s=e.cellAt(t.target);s&&!(l&&l.row.contains(t.target))&&L(s.index,s.column.field)},c=t=>{let s=l;if(s&&s.row.contains(t.target)){let r=C(s.row);if(t.key==="Escape")b();else if(t.key==="Enter"&&!t.shiftKey&&!t.target.closest("textarea,button"))E()&&o.focus();else if(t.key==="Tab"&&r.length){let f=t.shiftKey?r[0]:r[r.length-1];if(t.target!==f)return;(t.shiftKey?r[r.length-1]:r[0]).focus()}else return;t.preventDefault(),t.stopPropagation()}else t.target===o&&(t.key==="F2"||t.key==="Enter")&&e.getActive()>=0&&L(e.getActive())&&(t.preventDefault(),t.stopPropagation())},g=()=>l&&l.row.dataset.i!==String(l.index)&&b();return n.addEventListener(v.trigger==="click"?"click":"dblclick",i),n.addEventListener("keydown",c,!0),a.addEventListener("scroll",g,{passive:!0}),()=>{w(),n.removeEventListener(v.trigger==="click"?"click":"dblclick",i),n.removeEventListener("keydown",c,!0),a.removeEventListener("scroll",g)}}}}export{K as a};
2
+ //# sourceMappingURL=chunk-GFJRGBQR.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/rowediting/rowediting.ts"],
4
+ "sourcesContent": ["// Whole-row editing for the Grid, as a plugin: `plugins: [rowEditing()]` and `editor` on the columns to edit.\nimport { create } from '../../../core/registry';\nimport { focusables } from '../../../core/focus';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Field } from '../../../core/field';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { Grid, GridPlugin } from '../grid/grid';\nimport { editorConfig } from '../cellediting/cellediting';\n\naddMessages('en', { rowSave: 'Save', rowCancel: 'Cancel', rowEditing: 'Editing row' });\naddMessages('pt-BR', { rowSave: 'Salvar', rowCancel: 'Cancelar', rowEditing: 'Editando linha' });\n\nexport interface RowEditingOptions {\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 {\n index: number;\n record: Model;\n row: HTMLElement;\n bar: HTMLElement;\n fields: Array<{ col: Column; field: Field<any>; cell: HTMLElement; old: unknown }>;\n}\n\n/**\n * Edits every `editor` column of a row at once, under a bar with Save and Cancel. Enter saves, Esc cancels, Tab walks the\n * editors and the buttons and wraps; Save validates every field and keeps the row open while one is invalid.\n * Events on the grid: `before-edit(record)` (cancelable), `edit(record, values, old)` after the new values were written\n * (`record.set`, so it is marked modified; a remote store's app saves from here), `cancel-edit(record)`.\n * Use it instead of `cellEditing()`, not beside it.\n */\nexport function rowEditing(options: RowEditingOptions = {}): 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\n function stop(): Editing | undefined {\n const e = editing;\n editing = undefined;\n if (!e) return;\n for (const f of e.fields) {\n f.field.destroy();\n f.cell.classList.remove('is-editing');\n }\n e.bar.remove();\n e.row.classList.remove('is-row-editing');\n return e;\n }\n\n function save(): boolean {\n const e = editing;\n if (!e) return true;\n const bad = e.fields.filter((f) => !f.field.validate());\n if (bad.length) return (bad[0].field.focus(), false);\n stop();\n const values: Record<string, unknown> = {};\n const old: Record<string, unknown> = {};\n for (const f of e.fields) {\n const v = f.field.getValue();\n if (Object.is(v, f.old)) continue;\n values[f.col.field] = v;\n old[f.col.field] = f.old;\n }\n for (const k in values) e.record.set(k, values[k]);\n grid.refresh();\n if (Object.keys(values).length) grid.emit('edit', e.record, values, old);\n return true;\n }\n\n function cancel() {\n const e = stop();\n if (!e) return;\n grid.refresh();\n grid.emit('cancel-edit', e.record);\n }\n\n function start(index: number, focusField?: string): boolean {\n const rec = grid.getRowEntry(index)?.rec;\n if (!rec || editing?.index === index) return false;\n const cols = grid.getColumns().filter((c) => editable(c, rec));\n if (!cols.length || (editing && !save()) || grid.emit('before-edit', rec) === false) return false;\n const row = document.getElementById(`${grid.id}-r${index}`);\n if (!row) return false;\n const fields = cols.flatMap((col) => {\n const cell = grid.getCell(index, col.field);\n if (!cell) return [];\n const old = rec.get(col.field);\n const field = create<Field<any>>({ ...editorConfig(col, old), value: old, stableSize: false, ariaLabel: col.header ?? col.field, cls: 'op-grid__editor' });\n cell.classList.add('is-editing');\n cell.replaceChildren(field.el);\n field.notifyMount();\n return [{ col, field, cell, old }];\n });\n const button = (text: string, cls: string, run: () => void) => {\n const b = h('button', `op-grid__rowbtn ${cls}`, { type: 'button' }, text);\n b.addEventListener('click', run);\n return b;\n };\n const bar = h('div', 'op-grid__rowbar', { role: 'group', 'aria-label': t('rowEditing') }, button(t('rowSave'), 'is-primary', () => save()), button(t('rowCancel'), '', cancel));\n row.classList.add('is-row-editing');\n row.append(bar);\n editing = { index, record: rec, row, bar, fields };\n const first = fields.find((f) => f.col.field === focusField) ?? fields[0];\n first?.field.focus();\n first?.field.el.querySelector('input')?.select();\n return true;\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 viewport = el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const onPointer = (ev: Event) => {\n const cell = g.cellAt(ev.target);\n if (cell && !(editing && editing.row.contains(ev.target as Node))) start(cell.index, cell.column.field);\n };\n // capture: these run before the grid's own key handling (Enter would otherwise activate the row)\n const onKey = (ev: KeyboardEvent) => {\n const e = editing;\n if (e && e.row.contains(ev.target as Node)) {\n const stops = focusables(e.row);\n if (ev.key === 'Escape') cancel();\n else if (ev.key === 'Enter' && !ev.shiftKey && !(ev.target as HTMLElement).closest('textarea,button')) save() && table.focus();\n else if (ev.key === 'Tab' && stops.length) {\n const edge = ev.shiftKey ? stops[0] : stops[stops.length - 1];\n if (ev.target !== edge) return;\n (ev.shiftKey ? stops[stops.length - 1] : stops[0]).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 && start(g.getActive())) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n };\n // the pooled row element is reused when it scrolls out: the editors would be gone with it\n const onScroll = () => editing && editing.row.dataset.i !== String(editing.index) && cancel();\n el.addEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.addEventListener('keydown', onKey, true);\n viewport.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n stop();\n el.removeEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.removeEventListener('keydown', onKey, true);\n viewport.removeEventListener('scroll', onScroll);\n };\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "rowEditing", "options", "grid", "editing", "editable", "c", "rec", "stop", "f", "save", "bad", "values", "old", "v", "k", "cancel", "start", "index", "focusField", "cols", "row", "fields", "col", "cell", "field", "create", "editorConfig", "button", "text", "cls", "run", "b", "h", "bar", "t", "first", "g", "el", "table", "viewport", "onPointer", "ev", "onKey", "e", "stops", "focusables", "edge", "onScroll"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as v}from"./chunk-DIOJGTUN.js";import{a as C}from"./chunk-TIPK3SCJ.js";import{f as L}from"./chunk-UDXO3KM3.js";import{b as s}from"./chunk-PZSHOSOS.js";import{d as b,e as T,f as u}from"./chunk-S4QD5NID.js";T("en",{timeline:"Timeline",tlNow:"Now",tlFromTo:"{from} to {to}"});T("pt-BR",{timeline:"Linha do tempo",tlNow:"Agora",tlFromTo:"{from} at\xE9 {to}"});var F=/^\d{1,2}:\d{2}$/,c=a=>String(a).padStart(2,"0"),w=864e5,$=(a,e)=>/^\d{4}-\d{2}/.test(a)&&!isNaN(+new Date(a))?new Intl.DateTimeFormat(b()._lang,e).format(new Date(/^\d{4}-\d{2}-\d{2}$/.test(a)?`${a}T00:00`:a)):a,k=class extends L{baseCls="op-timeline";items=[];scale;build(){return s("div",this.baseCls)}onRender(){this.el.classList.add(`op-timeline--${this.config.mode??"list"}`),this.config.mode==="range"&&this.config.direction==="vertical"&&this.el.classList.add("op-timeline--vertical");let e=this.config.store;e&&this.own(e.subscribe(()=>this.setItems(e.getFiltered().map(n=>n.data)))),this.setItems(e?e.getFiltered().map(n=>n.data):this.config.items??[]);for(let n of this.config.plugins??[]){let l=n.init(this);l&&this.own(l)}this.listen(this.el,"click",n=>this.pick(n.target)),this.listen(this.el,"keydown",n=>n.key==="Enter"&&this.pick(n.target))}pick(e){let n=Number(e.closest("[data-i]")?.dataset.i);this.items[n]&&this.emit("select",this.items[n])}getItems(){return this.items}getScale(){return this.scale}setItems(e){this.items=e,this.rendered&&this.paint()}paint(){this.el.setAttribute("role","list"),this.el.setAttribute("aria-label",this.config.ariaLabel??u("timeline")),this.el.replaceChildren(...this.config.mode==="range"?this.range():this.list()),this.emit("paint")}list(){return this.items.map((e,n)=>s("div",`op-timeline__item${e.tone&&e.tone!=="default"?` is-${e.tone}`:""}`,{role:"listitem","data-i":n,tabindex:0},s("div","op-timeline__when",{},e.time?$(e.time,/T/.test(e.time)?{dateStyle:"medium",timeStyle:"short"}:{dateStyle:"medium"}):""),s("div","op-timeline__marker",{"aria-hidden":"true"},e.icon?v(e.icon):null),s("div","op-timeline__body",{},s("div","op-timeline__title",{},e.title),e.text?s("div","op-timeline__text",{},e.text):null)))}range(){let e=this.config,n=F.test(e.from??this.items.find(t=>t.start)?.start??""),l=t=>n?(Number(t.slice(0,-3))*60+Number(t.slice(-2)))*6e4:+new Date(/^\d{4}-\d{2}-\d{2}$/.test(t)?`${t}T00:00`:t),p=this.items.filter(t=>t.start).map(t=>({x:t,a:l(t.start),b:l(t.end??t.start)+(!n&&t.end&&/^\d{4}-\d{2}-\d{2}$/.test(t.end)?w:0)}));if(!p.length&&!(e.from&&e.to))return[];let r=e.from?l(e.from):Math.min(...p.map(t=>t.a)),m=e.to?l(e.to)+(/^\d{4}-\d{2}-\d{2}$/.test(e.to)?w:0):Math.max(...p.map(t=>t.b),r+1),d=e.direction==="vertical",h=t=>`${(Math.min(Math.max((t-r)/(m-r),0),1)*100).toFixed(3)}%`,S=[...e.lanes??[],...p.map(t=>t.x.lane??"").filter((t,o,i)=>i.indexOf(t)===o&&!(e.lanes??[]).includes(t))];this.scale={lo:r,hi:m,clock:n,vertical:d,parse:l,format:t=>n?`${c(Math.floor(t/36e5))}:${c(Math.round(t/6e4)%60)}`:(o=>`${o.getFullYear()}-${c(o.getMonth()+1)}-${c(o.getDate())}T${c(o.getHours())}:${c(o.getMinutes())}`)(new Date(t))};let y=!n&&m-r>62*w,M=[],I=(t,o)=>{let i=s("span","op-timeline__tick",{},o);i.style[d?"insetBlockStart":"insetInlineStart"]=h(t),M.push(i)};if(n)for(let t=Math.ceil(r/36e5)*36e5,o=(m-r)/36e5>14?72e5:36e5;t<m;t+=o)I(t,this.scale.format(t));else for(let t=new Date(r);+t<m;y?t.setMonth(t.getMonth()+1,1):t.setDate(t.getDate()+1))t.setHours(0,0,0,0),!(+t<r)&&I(+t,new Intl.DateTimeFormat(b()._lang,y?{month:"short"}:{day:"numeric",month:"short"}).format(t));let f=[s("div","op-timeline__axis",{},s("span","op-timeline__lane-name"),s("div","op-timeline__track",{"aria-hidden":"true"},...M))];for(let t of S){let o=p.filter(i=>(i.x.lane??"")===t).map(({x:i,a:E,b:D})=>{let g=s("div",`op-timeline__bar${i.tone&&i.tone!=="default"?` is-${i.tone}`:""}`,{role:"listitem",tabindex:0,"data-i":this.items.indexOf(i),"aria-label":`${i.title}, ${u("tlFromTo",{from:$(i.start,{dateStyle:"medium",timeStyle:/T/.test(i.start)?"short":void 0}),to:$(i.end??i.start,{dateStyle:"medium",timeStyle:/T/.test(i.end??"")?"short":void 0})})}`},i.icon?v(i.icon):null,s("span","op-timeline__bar-text",{},i.title));return g.title=i.text??i.title,g.style[d?"insetBlockStart":"insetInlineStart"]=h(E),g.style[d?"insetBlockEnd":"insetInlineEnd"]=`calc(100% - ${h(Math.max(D,E+(m-r)/200))})`,g});f.push(s("div","op-timeline__lane",{role:"group","aria-label":t},s("span","op-timeline__lane-name",{},t),s("div","op-timeline__track",{},...o)))}this.el.style.gridTemplateColumns=d?`var(--op-timeline-axis-width) repeat(${S.length}, minmax(0, 1fr))`:"";let _=Date.now();if(e.now!==!1&&!n&&_>=r&&_<=m){let t=()=>{let o=s("div","op-timeline__now",{"aria-hidden":"true",title:u("tlNow")});return o.style[d?"insetBlockStart":"insetInlineStart"]=h(_),o};if(d)for(let o of f.slice(1).map(i=>i.querySelector(".op-timeline__track")))o.append(t());else f.push(s("div","op-timeline__nowrow",{"aria-hidden":"true"},s("span","op-timeline__lane-name"),s("div","op-timeline__track",{},t())))}return f}};C("timeline",k);export{k as a};
2
+ //# sourceMappingURL=chunk-GLAY4RJF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/timeline/timeline.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', { timeline: 'Timeline', tlNow: 'Now', tlFromTo: '{from} to {to}' });\naddMessages('pt-BR', { timeline: 'Linha do tempo', tlNow: 'Agora', tlFromTo: '{from} at\u00E9 {to}' });\n\nexport interface TimelineItem {\n id?: string | number;\n title: string;\n text?: string;\n icon?: string;\n tone?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n /** `list`: when it happened (an ISO date or time, or any text). */\n time?: string;\n /** `range`: ISO dates or date-times. */\n start?: string;\n end?: string;\n /** `range`: the row (a person, a room, a phase). */\n lane?: string;\n}\n\nexport interface TimelineConfig extends ComponentConfig {\n /** `list`: events one under the other, with a marker (default). `range`: a schedule: bars over a time axis, one row per `lane`. */\n mode?: 'list' | 'range';\n items?: TimelineItem[];\n /** Items from a Store (its records are `TimelineItem`s). */\n store?: Store<any>;\n /** `range`: the order of the rows. Default: order of appearance. */\n lanes?: string[];\n /** `range`: the window shown. Default: from the first start to the last end. */\n from?: string;\n to?: string;\n /** `range`: a marker at the current time. Default true. */\n now?: boolean;\n /** `range`: `horizontal` (time runs left to right, one row per lane, default) or `vertical` (time runs top to bottom, one column per lane). */\n direction?: 'horizontal' | 'vertical';\n /** Optional features (`timeEntry()`...). See `TimelinePlugin`. */\n plugins?: TimelinePlugin[];\n}\n\n/** Extends a Timeline without growing its base: `init` runs once it is rendered and may return a cleanup. The timeline fires `paint` after every repaint. */\nexport interface TimelinePlugin {\n init(timeline: Timeline): void | (() => void);\n}\n\n/** The time axis of a `range` timeline: its ends in ms, and how to read and write the item dates (`clock`: `'HH:mm'` of one day, else ISO). */\nexport interface TimelineScale {\n lo: number;\n hi: number;\n clock: boolean;\n vertical: boolean;\n parse(v: string): number;\n format(ms: number): string;\n}\n\nconst CLOCK = /^\\d{1,2}:\\d{2}$/;\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst DAY = 86400000;\nconst when = (v: string, o: Intl.DateTimeFormatOptions) => (/^\\d{4}-\\d{2}/.test(v) && !isNaN(+new Date(v)) ? new Intl.DateTimeFormat(getLocale()._lang, o).format(new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v)) : v);\n\n/** Events as a vertical list, or a schedule (phases, staff shifts) as bars on a time axis. Click or Enter on an item fires `select`. */\nexport class Timeline extends Component<TimelineConfig> {\n protected override baseCls = 'op-timeline';\n private items: TimelineItem[] = [];\n private scale?: TimelineScale;\n\n protected override build() {\n return h('div', this.baseCls);\n }\n\n protected override onRender() {\n this.el.classList.add(`op-timeline--${this.config.mode ?? 'list'}`);\n if (this.config.mode === 'range' && this.config.direction === 'vertical') this.el.classList.add('op-timeline--vertical');\n const store = this.config.store;\n if (store) this.own(store.subscribe(() => this.setItems(store.getFiltered().map((r) => r.data))));\n this.setItems(store ? store.getFiltered().map((r) => r.data) : (this.config.items ?? []));\n for (const p of this.config.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n }\n this.listen(this.el, 'click', (e: Event) => this.pick(e.target as HTMLElement));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => e.key === 'Enter' && this.pick(e.target as HTMLElement));\n }\n\n private pick(el: HTMLElement) {\n const i = Number(el.closest<HTMLElement>('[data-i]')?.dataset.i);\n if (this.items[i]) this.emit('select', this.items[i]);\n }\n\n getItems(): TimelineItem[] {\n return this.items;\n }\n\n /** The time axis of a `range` timeline (set by the last paint), for plugins. */\n getScale(): TimelineScale | undefined {\n return this.scale;\n }\n\n setItems(items: TimelineItem[]) {\n this.items = items;\n if (this.rendered) this.paint();\n }\n\n private paint() {\n this.el.setAttribute('role', 'list');\n this.el.setAttribute('aria-label', this.config.ariaLabel ?? t('timeline'));\n this.el.replaceChildren(...(this.config.mode === 'range' ? this.range() : this.list()));\n this.emit('paint');\n }\n\n private list(): HTMLElement[] {\n return this.items.map((it, i) =>\n h('div', `op-timeline__item${it.tone && it.tone !== 'default' ? ` is-${it.tone}` : ''}`, { role: 'listitem', 'data-i': i, tabindex: 0 },\n h('div', 'op-timeline__when', {}, it.time ? when(it.time, /T/.test(it.time) ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }) : ''),\n h('div', 'op-timeline__marker', { 'aria-hidden': 'true' }, it.icon ? iconEl(it.icon) : null),\n h('div', 'op-timeline__body', {}, h('div', 'op-timeline__title', {}, it.title), it.text ? h('div', 'op-timeline__text', {}, it.text) : null),\n ),\n );\n }\n\n private range(): HTMLElement[] {\n const c = this.config;\n const clock = CLOCK.test(c.from ?? this.items.find((x) => x.start)?.start ?? '');\n const ms = (v: string) => (clock ? (Number(v.slice(0, -3)) * 60 + Number(v.slice(-2))) * 60000 : +new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v));\n const spans = this.items.filter((x) => x.start).map((x) => ({ x, a: ms(x.start!), b: ms(x.end ?? x.start!) + (!clock && x.end && /^\\d{4}-\\d{2}-\\d{2}$/.test(x.end) ? DAY : 0) }));\n if (!spans.length && !(c.from && c.to)) return [];\n const lo = c.from ? ms(c.from) : Math.min(...spans.map((s) => s.a));\n const hi = c.to ? ms(c.to) + (/^\\d{4}-\\d{2}-\\d{2}$/.test(c.to) ? DAY : 0) : Math.max(...spans.map((s) => s.b), lo + 1);\n const vertical = c.direction === 'vertical';\n const pct = (v: number) => `${(Math.min(Math.max((v - lo) / (hi - lo), 0), 1) * 100).toFixed(3)}%`;\n const lanes = [...(c.lanes ?? []), ...spans.map((s) => s.x.lane ?? '').filter((l, i, a) => a.indexOf(l) === i && !(c.lanes ?? []).includes(l))];\n this.scale = { lo, hi, clock, vertical, parse: ms, format: (v) => (clock ? `${pad(Math.floor(v / 3600000))}:${pad(Math.round(v / 60000) % 60)}` : ((d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`)(new Date(v))) };\n const long = !clock && hi - lo > 62 * DAY;\n const tickEls: HTMLElement[] = [];\n const tickAt = (at: number, text: string) => {\n const tick = h('span', 'op-timeline__tick', {}, text);\n tick.style[vertical ? 'insetBlockStart' : 'insetInlineStart'] = pct(at);\n tickEls.push(tick);\n };\n if (clock) for (let at = Math.ceil(lo / 3600000) * 3600000, hop = (hi - lo) / 3600000 > 14 ? 7200000 : 3600000; at < hi; at += hop) tickAt(at, this.scale.format(at));\n else\n for (let d = new Date(lo); +d < hi; long ? d.setMonth(d.getMonth() + 1, 1) : d.setDate(d.getDate() + 1)) {\n d.setHours(0, 0, 0, 0);\n if (+d < lo) continue;\n tickAt(+d, new Intl.DateTimeFormat(getLocale()._lang, long ? { month: 'short' } : { day: 'numeric', month: 'short' }).format(d));\n }\n const out: HTMLElement[] = [h('div', 'op-timeline__axis', {}, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', { 'aria-hidden': 'true' }, ...tickEls))];\n for (const lane of lanes) {\n const bars = spans.filter((s) => (s.x.lane ?? '') === lane).map(({ x, a, b }) => {\n const bar = h('div', `op-timeline__bar${x.tone && x.tone !== 'default' ? ` is-${x.tone}` : ''}`, { role: 'listitem', tabindex: 0, 'data-i': this.items.indexOf(x), 'aria-label': `${x.title}, ${t('tlFromTo', { from: when(x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.start!) ? 'short' : undefined }), to: when(x.end ?? x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.end ?? '') ? 'short' : undefined }) })}` }, x.icon ? iconEl(x.icon) : null, h('span', 'op-timeline__bar-text', {}, x.title));\n bar.title = x.text ?? x.title;\n bar.style[vertical ? 'insetBlockStart' : 'insetInlineStart'] = pct(a);\n bar.style[vertical ? 'insetBlockEnd' : 'insetInlineEnd'] = `calc(100% - ${pct(Math.max(b, a + (hi - lo) / 200))})`;\n return bar;\n });\n out.push(h('div', 'op-timeline__lane', { role: 'group', 'aria-label': lane }, h('span', 'op-timeline__lane-name', {}, lane), h('div', 'op-timeline__track', {}, ...bars)));\n }\n this.el.style.gridTemplateColumns = vertical ? `var(--op-timeline-axis-width) repeat(${lanes.length}, minmax(0, 1fr))` : '';\n const now = Date.now();\n if (c.now !== false && !clock && now >= lo && now <= hi) {\n const mark = () => {\n const m = h('div', 'op-timeline__now', { 'aria-hidden': 'true', title: t('tlNow') });\n m.style[vertical ? 'insetBlockStart' : 'insetInlineStart'] = pct(now);\n return m;\n };\n if (vertical) for (const track of out.slice(1).map((l) => l.querySelector('.op-timeline__track')!)) track.append(mark());\n else out.push(h('div', 'op-timeline__nowrow', { 'aria-hidden': 'true' }, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', {}, mark())));\n }\n return out;\n }\n}\nregister('timeline', Timeline);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "CLOCK", "pad", "n", "DAY", "when", "v", "o", "getLocale", "Timeline", "Component", "h", "store", "r", "p", "off", "e", "el", "i", "items", "t", "it", "iconEl", "c", "clock", "x", "ms", "spans", "lo", "s", "hi", "vertical", "pct", "lanes", "l", "a", "d", "long", "tickEls", "tickAt", "at", "text", "tick", "hop", "out", "lane", "bars", "b", "bar", "now", "mark", "m", "track", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as v}from"./chunk-MQEALOU3.js";import{c as p}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{e as c,f}from"./chunk-UDXO3KM3.js";import{b as a}from"./chunk-PZSHOSOS.js";var m=class extends f{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;flyout;flyoutOf;hoverTimer;onRender(){let e=this.config;this.items=c(e.items)??[],this.active=e.active;let i=t=>t.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&i(s.items)));i(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",t=>{let s=t.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",t=>this.onKey(t)),this.listen(this.root,"pointerover",t=>{let s=t.target.closest(".op-navmenu__item.is-group");this.hoverTimer?.(),!(!this.config.collapsed||!s||s.dataset.id===this.flyoutOf)&&(this.hoverTimer=this.later(()=>this.openFlyout(s.dataset.id,!1),200))}),this.listen(this.root,"pointerleave",()=>this.hoverTimer?.()),this.own(()=>this.flyout?.destroy()),this.listen(this.root,"focusin",t=>{let s=t.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,i=this.items){for(let t of i){if(t.id===e)return t;let s=t.items&&this.getItem(e,t.items);if(s)return s}}parentsOf(e,i=this.items,t=[]){for(let s of i){if(s.id===e)return t;let n=s.items&&this.parentsOf(e,s.items,[...t,s]);if(n)return n}}openParents(e){for(let i of this.parentsOf(e)??[])this.open.add(i.id)}matches(e,i){return e.text.toLowerCase().includes(i)||!!e.items?.some(t=>this.matches(t,i))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(i=>this.visible(i))}isOpen(e){return this.config.collapsed?!1:this.query?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(t=>this.visible(t)).map(t=>this.node(t,1)));let i=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(t=>t.tabIndex=t===i?0:-1)}node(e,i){let t=!!e.items,s=t&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),l=t&&!!this.active&&!!this.parentsOf(this.active)?.some(d=>d.id===e.id),o=n&&t,h=a("div",`op-navmenu__item${t?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${l&&n?" has-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":i,"aria-expanded":t?String(o?this.flyoutOf===e.id:s):null,"aria-current":e.id===this.active?"page":null,"aria-haspopup":o?"menu":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return h.style.setProperty("--_level",String(i-1)),h.append(a("span","op-navmenu__icon",{},e.icon?p(e.icon):o?e.text.charAt(0).toUpperCase():""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&h.append(a("span","op-navmenu__badge",{},String(e.badge))),t&&h.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},p("chevron-down"))),r.append(h),t&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(d=>this.visible(d)).map(d=>this.node(d,i+1)))),r}activate(e){let i=this.getItem(e);if(!(!i||i.disabled)){if(i.items&&this.config.collapsed)return this.openFlyout(e,!0);if(i.items)return this.toggle(e);this.select(e)}}select(e){let i=this.getItem(e);!i||i.disabled||this.emit("before-select",i)===!1||(this.setActive(e),this.emit("select",i))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let i=this.getItem(e);if(!(!i?.items||this.open.has(e))){if(this.config.accordion)for(let t of this.siblings(e))this.open.delete(t.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",i)}}collapse(e){let i=this.getItem(e);!i?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",i))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let i=this.parentsOf(e)??[];return(i.length?i[i.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=i=>i.forEach(t=>t.items&&(this.open.add(t.id),e(t.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=c(e)??[],this.config.items=e,this.rendered&&this.paint()}updateItem(e,i){let t=this.getItem(e);t&&(Object.assign(t,i),this.rendered&&this.paint())}openFlyout(e,i){let t=this.getItem(e),s=this.root.querySelector(`[data-id="${CSS.escape(e)}"]`);if(!t?.items||!s)return;let n=(r,l)=>r.filter(o=>this.visible(o)).map(o=>({text:o.text,icon:o.icon,badge:o.badge,disabled:o.disabled,group:l?t.text:void 0,items:o.items?n(o.items,!1):void 0,handler:o.items?void 0:()=>this.select(o.id)}));this.flyout||(this.flyout=new v({cls:"op-navmenu__flyout"}),this.flyout.on("hide",()=>{let r=this.flyoutOf;this.flyoutOf=void 0,r&&this.root.querySelector(`[data-id="${CSS.escape(r)}"]`)?.setAttribute("aria-expanded","false")}),this.listen(this.flyout.el,"keydown",r=>r.key==="ArrowLeft"&&!r.target.closest('.op-menu__item[aria-expanded="true"]')&&this.flyout.hide())),this.flyout.hide(),this.flyoutOf=e,this.flyout.setItems(n(t.items,!0)),s.setAttribute("aria-expanded","true"),this.flyout.showBy(s,"right-start",i)}setCollapsed(e){this.config.collapsed=e,e||this.flyout?.hide(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(i=>i.tabIndex=i===e?0:-1),e.focus())}onKey(e){let i=e.target.closest(".op-navmenu__item");if(!i)return;let t=this.rows(),s=t.indexOf(i),n=this.getItem(i.dataset.id),r=i.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(t[s+1]);break;case"ArrowUp":this.focusRow(t[s-1]);break;case"Home":this.focusRow(t[0]);break;case"End":this.focusRow(t[t.length-1]);break;case"ArrowRight":n.items&&this.config.collapsed?this.openFlyout(n.id,!0):n.items&&!r?this.expand(n.id):n.items&&this.focusRow(t[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let o=this.parentsOf(n.id)?.pop();o&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(o.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}if(e.preventDefault(),this.flyout?.el.contains(document.activeElement))return;this.focusId=document.activeElement?.dataset?.id??n.id;let l=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);l&&document.activeElement!==l&&this.focusRow(l)}};u("navmenu",m);export{m as a};
2
+ //# sourceMappingURL=chunk-GNKVLJ5H.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/navigation/navmenu/navmenu.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Hidden (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n /** Rail mode: the floating menu of a group, and the group it belongs to. */\n private flyout?: Menu;\n private flyoutOf?: string;\n private hoverTimer?: () => void;\n\n protected override onRender() {\n const c = this.config;\n this.items = gate(c.items) ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n // rail: hovering a group's icon opens its menu (after a short pause, so passing over the rail does not)\n this.listen(this.root, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item.is-group');\n this.hoverTimer?.();\n if (!this.config.collapsed || !row || row.dataset.id === this.flyoutOf) return;\n this.hoverTimer = this.later(() => this.openFlyout(row.dataset.id!, false), 200);\n });\n this.listen(this.root, 'pointerleave', () => this.hoverTimer?.());\n this.own(() => this.flyout?.destroy());\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n if (this.config.collapsed) return false; // rail: a group's children live in its floating menu\n return this.query ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const holdsActive = group && !!this.active && !!this.parentsOf(this.active)?.some((p) => p.id === i.id);\n const flying = rail && group;\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${holdsActive && rail ? ' has-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(flying ? this.flyoutOf === i.id : open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-haspopup': flying ? 'menu' : null, 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n // in the rail a group shows its icon (or its initial) and opens a floating menu\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : flying ? i.text.charAt(0).toUpperCase() : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items && this.config.collapsed) return this.openFlyout(id, true);\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = gate(items) ?? [];\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n /** Rail mode: a group's children in a Menu beside its icon (title as the header, badges kept). */\n private openFlyout(id: string, focus: boolean) {\n const group = this.getItem(id);\n const row = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(id)}\"]`);\n if (!group?.items || !row) return;\n const entries = (list: NavItem[], top: boolean): MenuEntry[] =>\n list.filter((c) => this.visible(c)).map((c) => ({\n text: c.text, icon: c.icon, badge: c.badge, disabled: c.disabled, group: top ? group.text : undefined,\n items: c.items ? entries(c.items, false) : undefined,\n handler: c.items ? undefined : () => this.select(c.id),\n }));\n if (!this.flyout) {\n this.flyout = new Menu({ cls: 'op-navmenu__flyout' });\n this.flyout.on('hide', () => {\n const was = this.flyoutOf;\n this.flyoutOf = undefined;\n if (was) this.root.querySelector(`[data-id=\"${CSS.escape(was)}\"]`)?.setAttribute('aria-expanded', 'false');\n });\n // \u2190 closes it (the Menu only does that for submenus) and gives the focus back to the icon\n this.listen(this.flyout.el, 'keydown', (e: KeyboardEvent) => e.key === 'ArrowLeft' && !(e.target as HTMLElement).closest('.op-menu__item[aria-expanded=\"true\"]') && this.flyout!.hide());\n }\n this.flyout.hide();\n this.flyoutOf = id;\n this.flyout.setItems(entries(group.items, true));\n row.setAttribute('aria-expanded', 'true');\n this.flyout.showBy(row, 'right-start', focus);\n }\n\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!collapsed) this.flyout?.hide();\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && this.config.collapsed) this.openFlyout(item.id, true);\n else if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n if (this.flyout?.el.contains(document.activeElement)) return; // the focus went to the rail's floating menu: leave it there\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
5
+ "mappings": "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",
6
+ "names": ["NavMenu", "Component", "c", "gate", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "holdsActive", "flying", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "focus", "entries", "top", "Menu", "was", "collapsed", "text", "rows", "item", "parent", "again", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as G}from"./chunk-DIOJGTUN.js";import{b as M}from"./chunk-PZSHOSOS.js";import{e as S,f as C}from"./chunk-S4QD5NID.js";S("en",{treeExpand:"Expand",treeCollapse:"Collapse",treeLoading:"Loading"});S("pt-BR",{treeExpand:"Expandir",treeCollapse:"Recolher",treeLoading:"Carregando"});function I(c,t={},w=null){let E=t.children??"children",a=t.parentField??"parentId";return c.flatMap(({[E]:u,...p})=>[{...p,[a]:w},...I(u??[],t,p.id)])}function B(c={}){let t,w=c.parentField??"parentId",E=c.leafField??"leaf",a=new Set,u=new Set,p=new Set,m=new Map,b=!!c.expanded,A=e=>(m.get(e.id)?.length??0)>0||!!c.load&&e.get(E)!==!0&&!u.has(e.id);function g(){let e=t.getStore().getRange(),r=new Set(e.map(i=>i.id));m=new Map;let l=[];for(let i of e){let s=i.get(w);s==null||!r.has(s)?l.push(i):m.set(s,[...m.get(s)??[],i])}b&&(e.forEach(i=>a.add(i.id)),b=!1);let y=[],x=(i,s)=>{for(let n of i){let d=A(n),o=d&&a.has(n.id);y.push({rec:n,level:s+1,expanded:d?o:void 0,paint(h,f){let T=t.getColumns(),F=Math.max(0,T.findIndex(v=>v.field===(c.treeColumn??T[0]?.field))),k=h.filter(v=>!v.classList.contains("op-grid__selcell")&&!v.classList.contains("op-grid__actcell"))[F];if(!k)return;k.style.setProperty("--_depth",String(s));let P=d?M("span",`op-grid__expander${p.has(n.id)?" is-loading":""}`,{"data-id":String(n.id),role:"img","aria-label":C(p.has(n.id)?"treeLoading":o?"treeCollapse":"treeExpand")},G(p.has(n.id)?"clock":"chevron-down")):M("span","op-grid__expander is-leaf",{"aria-hidden":"true"});k.prepend(P),f.dataset.node=String(n.id)}}),d&&o&&x(m.get(n.id)??[],s+1)}};x(l,0),t.setRowLayout(y)}let _=e=>t.getStore().getById(e);async function R(e){let r=_(e);if(!(!r||!A(r)||a.has(e))){if(a.add(e),c.load&&!u.has(e)&&!m.get(e)?.length){p.add(e),g();try{let l=await c.load(r);u.add(e),p.delete(e),t.getStore().add(l.map(y=>({...y,[w]:e})))}catch(l){return p.delete(e),a.delete(e),g(),void t.emit("load-error",r,l)}}u.add(e),g(),t.emit("expand-node",r)}}function L(e){let r=_(e);!r||!a.delete(e)||(g(),t.emit("collapse-node",r))}return{init(e){t=e;let r=e.el,l=r.querySelector("[role=grid]");l.setAttribute("role","treegrid"),r.classList.add("op-grid--tree");let y=n=>{let d=n.closest("[data-node]")?.dataset.node;return t.getStore().getFiltered().find(o=>String(o.id)===d)?.id},x=n=>{let d=n.target.closest(".op-grid__expander:not(.is-leaf)"),o=d&&y(d);o!=null&&(n.stopPropagation(),a.has(o)?L(o):R(o))},i=n=>{if(n.target!==l||n.key!=="ArrowRight"&&n.key!=="ArrowLeft")return;let d=t.getActive(),o=t.getRowEntry(d);if(!o?.rec)return;let h=o.rec.id;if(n.key==="ArrowRight")if(o.expanded===!1)R(h);else if(o.expanded&&t.getRowEntry(d+1))t.focusRow(d+1);else return;else if(o.expanded)L(h);else{let f=d-1;for(;f>=0&&(t.getRowEntry(f)?.level??0)>=(o.level??1);)f--;if(f<0)return;t.focusRow(f)}n.preventDefault(),n.stopPropagation()};r.addEventListener("click",x,!0),r.addEventListener("keydown",i,!0);let s=e.getStore().subscribe(()=>queueMicrotask(()=>!e.destroyed&&g()));return g(),()=>{s(),r.removeEventListener("click",x,!0),r.removeEventListener("keydown",i,!0),r.classList.remove("op-grid--tree"),l.setAttribute("role","grid"),t.setRowLayout(void 0)}},expand:e=>{R(e)},collapse:L,expandAll(){b=!0,g()},collapseAll(){a.clear(),g()}}}export{I as a,B as b};
2
+ //# sourceMappingURL=chunk-GZIDE5K2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/treegrid/treegrid.ts"],
4
+ "sourcesContent": ["// A Grid whose first column is a tree, as a plugin: `plugins: [treeGrid()]` over flat records that point at their parent.\nimport type { Model } from '../../../data/model';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\nimport type { Grid, GridPlugin, RowEntry } from '../grid/grid';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { treeExpand: 'Expand', treeCollapse: 'Collapse', treeLoading: 'Loading' });\naddMessages('pt-BR', { treeExpand: 'Expandir', treeCollapse: 'Recolher', treeLoading: 'Carregando' });\n\nexport interface TreeGridOptions {\n /** Column that shows the indentation and the expander. Default: the first one. */\n treeColumn?: string;\n /** Field that holds the parent's id (`null` or missing: a root). Default `parentId`. */\n parentField?: string;\n /** Loads the children of a node the first time it opens: resolves with their rows (the plugin sets `parentField` and adds them to the store). Without it every node is already in the store. */\n load?: (node: Model) => Promise<Array<Record<string, any>>> | Array<Record<string, any>>;\n /** With `load`: the field that says a node has no children (default `leaf`), so it gets no expander. */\n leafField?: string;\n /** Start with every node open. */\n expanded?: boolean;\n}\n\nexport interface TreeGrid extends GridPlugin {\n expand(id: string | number): void;\n collapse(id: string | number): void;\n expandAll(): void;\n collapseAll(): void;\n}\n\n/** Nested data (`{ id, name, children: [...] }`) \u2192 the flat rows the plugin wants, each with its `parentId`. */\nexport function flattenTree<T extends Record<string, any>>(nodes: T[], o: { children?: string; parentField?: string } = {}, parent: unknown = null): Array<Record<string, any>> {\n const kids = o.children ?? 'children';\n const pf = o.parentField ?? 'parentId';\n return nodes.flatMap(({ [kids]: sub, ...rest }) => [{ ...rest, [pf]: parent }, ...flattenTree(sub ?? [], o, (rest as Record<string, any>).id)]);\n}\n\n/**\n * Indents each record under its parent with an expander; \u2190/\u2192 close/open and walk to the parent/first child (ARIA treegrid),\n * click on the chevron toggles. The rest of the columns are ordinary: format, renderer, sort (siblings), resize, lock.\n * A record whose parent is filtered out (or not on the page) shows as a root. Events on the grid: `expand-node(record)`,\n * `collapse-node(record)`, `load-error(record, error)`.\n */\nexport function treeGrid(options: TreeGridOptions = {}): TreeGrid {\n let grid!: Grid;\n const pf = options.parentField ?? 'parentId';\n const leaf = options.leafField ?? 'leaf';\n const open = new Set<string | number>();\n const loaded = new Set<string | number>();\n const loading = new Set<string | number>();\n let kids = new Map<unknown, Model[]>();\n let all = !!options.expanded;\n\n const expandable = (r: Model) => (kids.get(r.id)?.length ?? 0) > 0 || (!!options.load && r.get(leaf) !== true && !loaded.has(r.id));\n\n function build() {\n const recs = grid.getStore().getRange();\n const ids = new Set(recs.map((r) => r.id));\n kids = new Map();\n const roots: Model[] = [];\n for (const r of recs) {\n const p = r.get(pf);\n if (p == null || !ids.has(p)) roots.push(r);\n else kids.set(p, [...(kids.get(p) ?? []), r]);\n }\n if (all) {\n recs.forEach((r) => open.add(r.id));\n all = false;\n }\n const rows: RowEntry[] = [];\n const walk = (list: Model[], depth: number) => {\n for (const rec of list) {\n const can = expandable(rec);\n const isOpen = can && open.has(rec.id);\n rows.push({\n rec,\n level: depth + 1,\n expanded: can ? isOpen : undefined,\n paint(cells, row) {\n const cols = grid.getColumns();\n const n = Math.max(0, cols.findIndex((c) => c.field === (options.treeColumn ?? cols[0]?.field)));\n const cell = cells.filter((c) => !c.classList.contains('op-grid__selcell') && !c.classList.contains('op-grid__actcell'))[n];\n if (!cell) return;\n cell.style.setProperty('--_depth', String(depth));\n const lead = can\n ? h('span', `op-grid__expander${loading.has(rec.id) ? ' is-loading' : ''}`, { 'data-id': String(rec.id), role: 'img', 'aria-label': t(loading.has(rec.id) ? 'treeLoading' : isOpen ? 'treeCollapse' : 'treeExpand') }, iconEl(loading.has(rec.id) ? 'clock' : 'chevron-down'))\n : h('span', 'op-grid__expander is-leaf', { 'aria-hidden': 'true' });\n cell.prepend(lead);\n row.dataset.node = String(rec.id);\n },\n });\n if (can && isOpen) walk(kids.get(rec.id) ?? [], depth + 1);\n }\n };\n walk(roots, 0);\n grid.setRowLayout(rows);\n }\n\n const find = (id: string | number) => grid.getStore().getById(id);\n\n async function expand(id: string | number) {\n const rec = find(id);\n if (!rec || !expandable(rec) || open.has(id)) return;\n open.add(id);\n if (options.load && !loaded.has(id) && !(kids.get(id)?.length)) {\n loading.add(id);\n build();\n try {\n const rows = await options.load(rec);\n loaded.add(id);\n loading.delete(id);\n grid.getStore().add(rows.map((r) => ({ ...r, [pf]: id })));\n } catch (err) {\n loading.delete(id);\n open.delete(id);\n build();\n return void grid.emit('load-error', rec, err);\n }\n }\n loaded.add(id);\n build();\n grid.emit('expand-node', rec);\n }\n\n function collapse(id: string | number) {\n const rec = find(id);\n if (!rec || !open.delete(id)) return;\n build();\n grid.emit('collapse-node', rec);\n }\n\n return {\n init(g) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n table.setAttribute('role', 'treegrid');\n el.classList.add('op-grid--tree');\n const idOf = (node: Element) => {\n const v = node.closest<HTMLElement>('[data-node]')?.dataset.node;\n return grid.getStore().getFiltered().find((r) => String(r.id) === v)?.id;\n };\n const onClick = (e: Event) => {\n const x = (e.target as Element).closest<HTMLElement>('.op-grid__expander:not(.is-leaf)');\n const id = x && idOf(x);\n if (id != null) {\n e.stopPropagation();\n open.has(id) ? collapse(id) : void expand(id);\n }\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.target !== table || (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft')) return;\n const i = grid.getActive();\n const entry = grid.getRowEntry(i);\n if (!entry?.rec) return;\n const id = entry.rec.id;\n if (e.key === 'ArrowRight') {\n if (entry.expanded === false) void expand(id);\n else if (entry.expanded && grid.getRowEntry(i + 1)) grid.focusRow(i + 1);\n else return;\n } else if (entry.expanded) collapse(id);\n else {\n let j = i - 1;\n while (j >= 0 && (grid.getRowEntry(j)?.level ?? 0) >= (entry.level ?? 1)) j--;\n if (j < 0) return;\n grid.focusRow(j);\n }\n e.preventDefault();\n e.stopPropagation();\n };\n el.addEventListener('click', onClick, true);\n el.addEventListener('keydown', onKey, true);\n const off = g.getStore().subscribe(() => queueMicrotask(() => !g.destroyed && build()));\n build();\n return () => {\n off();\n el.removeEventListener('click', onClick, true);\n el.removeEventListener('keydown', onKey, true);\n el.classList.remove('op-grid--tree');\n table.setAttribute('role', 'grid');\n grid.setRowLayout(undefined);\n };\n },\n expand: (id) => void expand(id),\n collapse,\n expandAll() {\n all = true;\n build();\n },\n collapseAll() {\n open.clear();\n build();\n },\n };\n}\n"],
5
+ "mappings": "+HAOAA,EAAY,KAAM,CAAE,WAAY,SAAU,aAAc,WAAY,YAAa,SAAU,CAAC,EAC5FA,EAAY,QAAS,CAAE,WAAY,WAAY,aAAc,WAAY,YAAa,YAAa,CAAC,EAuB7F,SAASC,EAA2CC,EAAYC,EAAiD,CAAC,EAAGC,EAAkB,KAAkC,CAC9K,IAAMC,EAAOF,EAAE,UAAY,WACrBG,EAAKH,EAAE,aAAe,WAC5B,OAAOD,EAAM,QAAQ,CAAC,CAAE,CAACG,GAAOE,EAAK,GAAGC,CAAK,IAAM,CAAC,CAAE,GAAGA,EAAM,CAACF,CAAE,EAAGF,CAAO,EAAG,GAAGH,EAAYM,GAAO,CAAC,EAAGJ,EAAIK,EAA6B,EAAE,CAAC,CAAC,CAChJ,CAQO,SAASC,EAASC,EAA2B,CAAC,EAAa,CAChE,IAAIC,EACEL,EAAKI,EAAQ,aAAe,WAC5BE,EAAOF,EAAQ,WAAa,OAC5BG,EAAO,IAAI,IACXC,EAAS,IAAI,IACbC,EAAU,IAAI,IAChBV,EAAO,IAAI,IACXW,EAAM,CAAC,CAACN,EAAQ,SAEdO,EAAcC,IAAcb,EAAK,IAAIa,EAAE,EAAE,GAAG,QAAU,GAAK,GAAM,CAAC,CAACR,EAAQ,MAAQQ,EAAE,IAAIN,CAAI,IAAM,IAAQ,CAACE,EAAO,IAAII,EAAE,EAAE,EAEjI,SAASC,GAAQ,CACf,IAAMC,EAAOT,EAAK,SAAS,EAAE,SAAS,EAChCU,EAAM,IAAI,IAAID,EAAK,IAAKF,GAAMA,EAAE,EAAE,CAAC,EACzCb,EAAO,IAAI,IACX,IAAMiB,EAAiB,CAAC,EACxB,QAAWJ,KAAKE,EAAM,CACpB,IAAMG,EAAIL,EAAE,IAAIZ,CAAE,EACdiB,GAAK,MAAQ,CAACF,EAAI,IAAIE,CAAC,EAAGD,EAAM,KAAKJ,CAAC,EACrCb,EAAK,IAAIkB,EAAG,CAAC,GAAIlB,EAAK,IAAIkB,CAAC,GAAK,CAAC,EAAIL,CAAC,CAAC,CAC9C,CACIF,IACFI,EAAK,QAASF,GAAML,EAAK,IAAIK,EAAE,EAAE,CAAC,EAClCF,EAAM,IAER,IAAMQ,EAAmB,CAAC,EACpBC,EAAO,CAACC,EAAeC,IAAkB,CAC7C,QAAWC,KAAOF,EAAM,CACtB,IAAMG,EAAMZ,EAAWW,CAAG,EACpBE,EAASD,GAAOhB,EAAK,IAAIe,EAAI,EAAE,EACrCJ,EAAK,KAAK,CACR,IAAAI,EACA,MAAOD,EAAQ,EACf,SAAUE,EAAMC,EAAS,OACzB,MAAMC,EAAOC,EAAK,CAChB,IAAMC,EAAOtB,EAAK,WAAW,EACvBuB,EAAI,KAAK,IAAI,EAAGD,EAAK,UAAWE,GAAMA,EAAE,SAAWzB,EAAQ,YAAcuB,EAAK,CAAC,GAAG,MAAM,CAAC,EACzFG,EAAOL,EAAM,OAAQI,GAAM,CAACA,EAAE,UAAU,SAAS,kBAAkB,GAAK,CAACA,EAAE,UAAU,SAAS,kBAAkB,CAAC,EAAED,CAAC,EAC1H,GAAI,CAACE,EAAM,OACXA,EAAK,MAAM,YAAY,WAAY,OAAOT,CAAK,CAAC,EAChD,IAAMU,EAAOR,EACTS,EAAE,OAAQ,oBAAoBvB,EAAQ,IAAIa,EAAI,EAAE,EAAI,cAAgB,EAAE,GAAI,CAAE,UAAW,OAAOA,EAAI,EAAE,EAAG,KAAM,MAAO,aAAcW,EAAExB,EAAQ,IAAIa,EAAI,EAAE,EAAI,cAAgBE,EAAS,eAAiB,YAAY,CAAE,EAAGU,EAAOzB,EAAQ,IAAIa,EAAI,EAAE,EAAI,QAAU,cAAc,CAAC,EAC3QU,EAAE,OAAQ,4BAA6B,CAAE,cAAe,MAAO,CAAC,EACpEF,EAAK,QAAQC,CAAI,EACjBL,EAAI,QAAQ,KAAO,OAAOJ,EAAI,EAAE,CAClC,CACF,CAAC,EACGC,GAAOC,GAAQL,EAAKpB,EAAK,IAAIuB,EAAI,EAAE,GAAK,CAAC,EAAGD,EAAQ,CAAC,CAC3D,CACF,EACAF,EAAKH,EAAO,CAAC,EACbX,EAAK,aAAaa,CAAI,CACxB,CAEA,IAAMiB,EAAQC,GAAwB/B,EAAK,SAAS,EAAE,QAAQ+B,CAAE,EAEhE,eAAeC,EAAOD,EAAqB,CACzC,IAAMd,EAAMa,EAAKC,CAAE,EACnB,GAAI,GAACd,GAAO,CAACX,EAAWW,CAAG,GAAKf,EAAK,IAAI6B,CAAE,GAE3C,IADA7B,EAAK,IAAI6B,CAAE,EACPhC,EAAQ,MAAQ,CAACI,EAAO,IAAI4B,CAAE,GAAK,CAAErC,EAAK,IAAIqC,CAAE,GAAG,OAAS,CAC9D3B,EAAQ,IAAI2B,CAAE,EACdvB,EAAM,EACN,GAAI,CACF,IAAMK,EAAO,MAAMd,EAAQ,KAAKkB,CAAG,EACnCd,EAAO,IAAI4B,CAAE,EACb3B,EAAQ,OAAO2B,CAAE,EACjB/B,EAAK,SAAS,EAAE,IAAIa,EAAK,IAAKN,IAAO,CAAE,GAAGA,EAAG,CAACZ,CAAE,EAAGoC,CAAG,EAAE,CAAC,CAC3D,OAASE,EAAK,CACZ,OAAA7B,EAAQ,OAAO2B,CAAE,EACjB7B,EAAK,OAAO6B,CAAE,EACdvB,EAAM,EACC,KAAKR,EAAK,KAAK,aAAciB,EAAKgB,CAAG,CAC9C,CACF,CACA9B,EAAO,IAAI4B,CAAE,EACbvB,EAAM,EACNR,EAAK,KAAK,cAAeiB,CAAG,EAC9B,CAEA,SAASiB,EAASH,EAAqB,CACrC,IAAMd,EAAMa,EAAKC,CAAE,EACf,CAACd,GAAO,CAACf,EAAK,OAAO6B,CAAE,IAC3BvB,EAAM,EACNR,EAAK,KAAK,gBAAiBiB,CAAG,EAChC,CAEA,MAAO,CACL,KAAKkB,EAAG,CACNnC,EAAOmC,EACP,IAAMC,EAAKD,EAAE,GACPE,EAAQD,EAAG,cAA2B,aAAa,EACzDC,EAAM,aAAa,OAAQ,UAAU,EACrCD,EAAG,UAAU,IAAI,eAAe,EAChC,IAAME,EAAQC,GAAkB,CAC9B,IAAMC,EAAID,EAAK,QAAqB,aAAa,GAAG,QAAQ,KAC5D,OAAOvC,EAAK,SAAS,EAAE,YAAY,EAAE,KAAMO,GAAM,OAAOA,EAAE,EAAE,IAAMiC,CAAC,GAAG,EACxE,EACMC,EAAWC,GAAa,CAC5B,IAAMC,EAAKD,EAAE,OAAmB,QAAqB,kCAAkC,EACjFX,EAAKY,GAAKL,EAAKK,CAAC,EAClBZ,GAAM,OACRW,EAAE,gBAAgB,EAClBxC,EAAK,IAAI6B,CAAE,EAAIG,EAASH,CAAE,EAASC,EAAOD,CAAE,EAEhD,EACMa,EAASF,GAAqB,CAClC,GAAIA,EAAE,SAAWL,GAAUK,EAAE,MAAQ,cAAgBA,EAAE,MAAQ,YAAc,OAC7E,IAAMG,EAAI7C,EAAK,UAAU,EACnB8C,EAAQ9C,EAAK,YAAY6C,CAAC,EAChC,GAAI,CAACC,GAAO,IAAK,OACjB,IAAMf,EAAKe,EAAM,IAAI,GACrB,GAAIJ,EAAE,MAAQ,aACZ,GAAII,EAAM,WAAa,GAAYd,EAAOD,CAAE,UACnCe,EAAM,UAAY9C,EAAK,YAAY6C,EAAI,CAAC,EAAG7C,EAAK,SAAS6C,EAAI,CAAC,MAClE,gBACIC,EAAM,SAAUZ,EAASH,CAAE,MACjC,CACH,IAAIgB,EAAIF,EAAI,EACZ,KAAOE,GAAK,IAAM/C,EAAK,YAAY+C,CAAC,GAAG,OAAS,KAAOD,EAAM,OAAS,IAAIC,IAC1E,GAAIA,EAAI,EAAG,OACX/C,EAAK,SAAS+C,CAAC,CACjB,CACAL,EAAE,eAAe,EACjBA,EAAE,gBAAgB,CACpB,EACAN,EAAG,iBAAiB,QAASK,EAAS,EAAI,EAC1CL,EAAG,iBAAiB,UAAWQ,EAAO,EAAI,EAC1C,IAAMI,EAAMb,EAAE,SAAS,EAAE,UAAU,IAAM,eAAe,IAAM,CAACA,EAAE,WAAa3B,EAAM,CAAC,CAAC,EACtF,OAAAA,EAAM,EACC,IAAM,CACXwC,EAAI,EACJZ,EAAG,oBAAoB,QAASK,EAAS,EAAI,EAC7CL,EAAG,oBAAoB,UAAWQ,EAAO,EAAI,EAC7CR,EAAG,UAAU,OAAO,eAAe,EACnCC,EAAM,aAAa,OAAQ,MAAM,EACjCrC,EAAK,aAAa,MAAS,CAC7B,CACF,EACA,OAAS+B,GAAI,CAAQC,EAAOD,CAAE,GAC9B,SAAAG,EACA,WAAY,CACV7B,EAAM,GACNG,EAAM,CACR,EACA,aAAc,CACZN,EAAK,MAAM,EACXM,EAAM,CACR,CACF,CACF",
6
+ "names": ["addMessages", "flattenTree", "nodes", "o", "parent", "kids", "pf", "sub", "rest", "treeGrid", "options", "grid", "leaf", "open", "loaded", "loading", "all", "expandable", "r", "build", "recs", "ids", "roots", "p", "rows", "walk", "list", "depth", "rec", "can", "isOpen", "cells", "row", "cols", "n", "c", "cell", "lead", "h", "t", "iconEl", "find", "id", "expand", "err", "collapse", "g", "el", "table", "idOf", "node", "v", "onClick", "e", "x", "onKey", "i", "entry", "j", "off"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as g,b as o}from"./chunk-OWEQT2HN.js";import{a as c}from"./chunk-A2NKDOYN.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{f as m}from"./chunk-MW3RWBZ7.js";var p="var(--op-listbox-row-height, var(--op-row-height))",a=class extends c{baseCls="op-listbox";items;active=-1;v;emptyEl;constructor(t={}){super(t),this.items=t.items??[]}build(){let t=n("div","op-listbox",{role:"listbox",tabindex:-1});return this.config.maxHeight!=null&&(t.style.maxHeight=typeof this.config.maxHeight=="number"?`${this.config.maxHeight}px`:this.config.maxHeight),this.emptyEl=n("div","op-listbox__empty"),t.append(this.emptyEl),t}onRender(){this.v=g({scroller:this.el,count:this.items.length,rowHeight:o(this.el,p)||32,render:(t,e)=>this.renderRow(t,e),rowCls:"op-listbox__item"}),this.own(()=>this.v?.destroy()),this.setEmptyText(this.config.emptyText??m("noResults")),this.listen(this.el,"mousedown",t=>t.preventDefault()),this.listen(this.el,"click",t=>{let e=this.indexOf(t.target);e>=0&&this.activate(e)}),this.listen(this.el,"mousemove",t=>{let e=this.indexOf(t.target);e>=0&&e!==this.active&&!this.items[e].disabled&&this.setActive(e,!1)}),this.updateEmpty()}indexOf(t){let e=t.closest(".op-listbox__item");return e?Number(e.dataset.i):-1}renderRow(t,e){let i=this.items[e],s=this.config;t.id=`${this.id}-opt-${e}`,t.dataset.i=String(e),t.setAttribute("role","option"),t.setAttribute("aria-selected",String(this.isSelected(i))),i.disabled?t.setAttribute("aria-disabled","true"):t.removeAttribute("aria-disabled"),t.classList.toggle("is-active",e===this.active),t.classList.toggle("is-selected",this.isSelected(i)),t.classList.toggle("is-disabled",!!i.disabled);let l=i.hint?[n("span","op-listbox__hint",{},i.hint)]:[];if(s.renderer)return t.replaceChildren(s.renderer(i),...l);let h=s.highlight?.trim(),r=h?i.label.toLowerCase().indexOf(h.toLowerCase()):-1;if(r<0)return t.replaceChildren(i.label,...l);t.replaceChildren(i.label.slice(0,r),n("mark","op-listbox__mark",{},i.label.slice(r,r+h.length)),i.label.slice(r+h.length),...l)}isSelected(t){return this.config.selected!==void 0&&t.value===this.config.selected}updateEmpty(){this.emptyEl.hidden=this.items.length>0}getItems(){return this.items}setItems(t){this.items=t,this.config.items=t,this.active=-1,this.rendered&&(this.v.setCount(t.length),this.updateEmpty())}setSelected(t){this.config.selected=t,this.v?.refresh()}setHighlight(t){this.config.highlight=t,this.v?.refresh()}setEmptyText(t){this.config.emptyText=t,this.rendered&&(this.emptyEl.textContent=t)}refresh(){if(!this.rendered)return;let t=o(this.el,p);t?this.v.setRowHeight(t):this.v.refresh()}setActive(t,e=!0){let i=this.items[t];t<-1||t>=this.items.length||i&&i.disabled||(this.active=t,e&&t>=0&&this.v?.scrollTo(t),this.v?.refresh(),this.emit("active-change",i,t))}moveActive(t){let e=this.items.length;if(!e)return;let i=this.active;for(let s=0;s<e;s++)if(i=(i+t+e)%e,i<0&&(i+=e),!this.items[i].disabled)return this.setActive(i)}getActive(){return this.items[this.active]}getActiveIndex(){return this.active}getActiveId(){return this.active>=0?`${this.id}-opt-${this.active}`:""}activate(t=this.active){let e=this.items[t];e&&!e.disabled&&this.emit("select",e,t)}scrollTo(t){this.v?.scrollTo(t)}};d("listbox",a);export{a};
2
- //# sourceMappingURL=chunk-5Q76ACVI.js.map
1
+ import{a as g,b as o}from"./chunk-OWEQT2HN.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{f as c}from"./chunk-UDXO3KM3.js";import{b as n}from"./chunk-PZSHOSOS.js";import{f as m}from"./chunk-S4QD5NID.js";var p="var(--op-listbox-row-height, var(--op-row-height))",a=class extends c{baseCls="op-listbox";items;active=-1;v;emptyEl;constructor(t={}){super(t),this.items=t.items??[]}build(){let t=n("div","op-listbox",{role:"listbox",tabindex:-1});return this.config.maxHeight!=null&&(t.style.maxHeight=typeof this.config.maxHeight=="number"?`${this.config.maxHeight}px`:this.config.maxHeight),this.emptyEl=n("div","op-listbox__empty"),t.append(this.emptyEl),t}onRender(){this.v=g({scroller:this.el,count:this.items.length,rowHeight:o(this.el,p)||32,render:(t,e)=>this.renderRow(t,e),rowCls:"op-listbox__item"}),this.own(()=>this.v?.destroy()),this.setEmptyText(this.config.emptyText??m("noResults")),this.listen(this.el,"mousedown",t=>t.preventDefault()),this.listen(this.el,"click",t=>{let e=this.indexOf(t.target);e>=0&&this.activate(e)}),this.listen(this.el,"mousemove",t=>{let e=this.indexOf(t.target);e>=0&&e!==this.active&&!this.items[e].disabled&&this.setActive(e,!1)}),this.updateEmpty()}indexOf(t){let e=t.closest(".op-listbox__item");return e?Number(e.dataset.i):-1}renderRow(t,e){let i=this.items[e],s=this.config;t.id=`${this.id}-opt-${e}`,t.dataset.i=String(e),t.setAttribute("role","option"),t.setAttribute("aria-selected",String(this.isSelected(i))),i.disabled?t.setAttribute("aria-disabled","true"):t.removeAttribute("aria-disabled"),t.classList.toggle("is-active",e===this.active),t.classList.toggle("is-selected",this.isSelected(i)),t.classList.toggle("is-disabled",!!i.disabled);let l=i.hint?[n("span","op-listbox__hint",{},i.hint)]:[];if(s.renderer)return t.replaceChildren(s.renderer(i),...l);let h=s.highlight?.trim(),r=h?i.label.toLowerCase().indexOf(h.toLowerCase()):-1;if(r<0)return t.replaceChildren(i.label,...l);t.replaceChildren(i.label.slice(0,r),n("mark","op-listbox__mark",{},i.label.slice(r,r+h.length)),i.label.slice(r+h.length),...l)}isSelected(t){return this.config.selected!==void 0&&t.value===this.config.selected}updateEmpty(){this.emptyEl.hidden=this.items.length>0}getItems(){return this.items}setItems(t){this.items=t,this.config.items=t,this.active=-1,this.rendered&&(this.v.setCount(t.length),this.updateEmpty())}setSelected(t){this.config.selected=t,this.v?.refresh()}setHighlight(t){this.config.highlight=t,this.v?.refresh()}setEmptyText(t){this.config.emptyText=t,this.rendered&&(this.emptyEl.textContent=t)}refresh(){if(!this.rendered)return;let t=o(this.el,p);t?this.v.setRowHeight(t):this.v.refresh()}setActive(t,e=!0){let i=this.items[t];t<-1||t>=this.items.length||i&&i.disabled||(this.active=t,e&&t>=0&&this.v?.scrollTo(t),this.v?.refresh(),this.emit("active-change",i,t))}moveActive(t){let e=this.items.length;if(!e)return;let i=this.active;for(let s=0;s<e;s++)if(i=(i+t+e)%e,i<0&&(i+=e),!this.items[i].disabled)return this.setActive(i)}getActive(){return this.items[this.active]}getActiveIndex(){return this.active}getActiveId(){return this.active>=0?`${this.id}-opt-${this.active}`:""}activate(t=this.active){let e=this.items[t];e&&!e.disabled&&this.emit("select",e,t)}scrollTo(t){this.v?.scrollTo(t)}};d("listbox",a);export{a};
2
+ //# sourceMappingURL=chunk-H25XXQVH.js.map
@@ -0,0 +1,2 @@
1
+ import{a as o}from"./chunk-TIPK3SCJ.js";import{f as a}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";var h=s=>{let t=s.trim().split(/\s+/).filter(Boolean);return((t[0]?.[0]??"")+(t.length>1?t[t.length-1][0]:"")).toUpperCase()},n=s=>[...s].reduce((t,e)=>t*31+e.charCodeAt(0)>>>0,7)%8,r=class extends a{baseCls="op-avatar";img;text;dot;build(){return this.text=i("span","op-avatar__text",{"aria-hidden":"true"}),this.dot=i("span","op-avatar__status"),i("span",this.baseCls,{role:"img"},this.text,this.dot)}onRender(){let t=this.config;this.el.classList.add(`op-avatar--${t.size??"md"}`,`op-avatar--${t.shape??"circle"}`),this.setName(t.name??""),this.setSrc(t.src),this.setStatus(t.status)}setName(t){this.config.name=t,this.rendered&&(this.text.textContent=h(t),this.el.style.setProperty("--op-avatar-c",n(t)?`var(--op-chart-${n(t)+1})`:"var(--op-chart-1, var(--op-color-primary))"),this.el.setAttribute("aria-label",this.config.ariaLabel??t),this.img&&(this.img.alt=""))}setSrc(t){if(this.config.src=t,!this.rendered||(this.img?.remove(),this.img=void 0,this.el.classList.remove("has-image"),!t))return;let e=this.img=i("img","op-avatar__img",{src:t,alt:"",draggable:"false"});e.addEventListener("load",()=>this.el.classList.add("has-image")),e.addEventListener("error",()=>(e.remove(),this.el.classList.remove("has-image"))),this.el.prepend(e)}setStatus(t){this.config.status=t,this.rendered&&(this.dot.hidden=!t,this.dot.className=`op-avatar__status${t?` is-${t}`:""}`)}};o("avatar",r);export{r as a};
2
+ //# sourceMappingURL=chunk-HG7OOHGD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/base/avatar/avatar.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\n\nexport interface AvatarConfig extends ComponentConfig {\n /** A person's or team's name: the initials when there is no picture, and the accessible name. */\n name?: string;\n /** Picture URL. If it fails to load the initials show. */\n src?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n shape?: 'circle' | 'square';\n status?: 'online' | 'away' | 'busy' | 'offline';\n}\n\nconst initials = (name: string) => {\n const w = name.trim().split(/\\s+/).filter(Boolean);\n return ((w[0]?.[0] ?? '') + (w.length > 1 ? w[w.length - 1][0] : '')).toUpperCase();\n};\nconst hue = (name: string) => [...name].reduce((a, ch) => (a * 31 + ch.charCodeAt(0)) >>> 0, 7) % 8;\n\n/** A picture or the initials of a name, on a color picked from the name (so the same person always looks the same). */\nexport class Avatar extends Component<AvatarConfig> {\n protected override baseCls = 'op-avatar';\n private img?: HTMLImageElement;\n private text!: HTMLElement;\n private dot!: HTMLElement;\n\n protected override build() {\n this.text = h('span', 'op-avatar__text', { 'aria-hidden': 'true' });\n this.dot = h('span', 'op-avatar__status');\n return h('span', this.baseCls, { role: 'img' }, this.text, this.dot);\n }\n\n protected override onRender() {\n const c = this.config;\n this.el.classList.add(`op-avatar--${c.size ?? 'md'}`, `op-avatar--${c.shape ?? 'circle'}`);\n this.setName(c.name ?? '');\n this.setSrc(c.src);\n this.setStatus(c.status);\n }\n\n setName(name: string) {\n this.config.name = name;\n if (!this.rendered) return;\n this.text.textContent = initials(name);\n this.el.style.setProperty('--op-avatar-c', hue(name) ? `var(--op-chart-${hue(name) + 1})` : 'var(--op-chart-1, var(--op-color-primary))');\n this.el.setAttribute('aria-label', this.config.ariaLabel ?? name);\n if (this.img) this.img.alt = '';\n }\n\n setSrc(src: string | undefined) {\n this.config.src = src;\n if (!this.rendered) return;\n this.img?.remove();\n this.img = undefined;\n this.el.classList.remove('has-image');\n if (!src) return;\n const img = (this.img = h('img', 'op-avatar__img', { src, alt: '', draggable: 'false' }));\n img.addEventListener('load', () => this.el.classList.add('has-image'));\n img.addEventListener('error', () => (img.remove(), this.el.classList.remove('has-image')));\n this.el.prepend(img);\n }\n\n setStatus(status: AvatarConfig['status']) {\n this.config.status = status;\n if (!this.rendered) return;\n this.dot.hidden = !status;\n this.dot.className = `op-avatar__status${status ? ` is-${status}` : ''}`;\n }\n}\nregister('avatar', Avatar);\n"],
5
+ "mappings": "wHAcA,IAAMA,EAAYC,GAAiB,CACjC,IAAMC,EAAID,EAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EACjD,QAASC,EAAE,CAAC,IAAI,CAAC,GAAK,KAAOA,EAAE,OAAS,EAAIA,EAAEA,EAAE,OAAS,CAAC,EAAE,CAAC,EAAI,KAAK,YAAY,CACpF,EACMC,EAAOF,GAAiB,CAAC,GAAGA,CAAI,EAAE,OAAO,CAACG,EAAGC,IAAQD,EAAI,GAAKC,EAAG,WAAW,CAAC,IAAO,EAAG,CAAC,EAAI,EAGrFC,EAAN,cAAqBC,CAAwB,CAC/B,QAAU,YACrB,IACA,KACA,IAEW,OAAQ,CACzB,YAAK,KAAOC,EAAE,OAAQ,kBAAmB,CAAE,cAAe,MAAO,CAAC,EAClE,KAAK,IAAMA,EAAE,OAAQ,mBAAmB,EACjCA,EAAE,OAAQ,KAAK,QAAS,CAAE,KAAM,KAAM,EAAG,KAAK,KAAM,KAAK,GAAG,CACrE,CAEmB,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACf,KAAK,GAAG,UAAU,IAAI,cAAcA,EAAE,MAAQ,IAAI,GAAI,cAAcA,EAAE,OAAS,QAAQ,EAAE,EACzF,KAAK,QAAQA,EAAE,MAAQ,EAAE,EACzB,KAAK,OAAOA,EAAE,GAAG,EACjB,KAAK,UAAUA,EAAE,MAAM,CACzB,CAEA,QAAQR,EAAc,CACpB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,KAAK,YAAcD,EAASC,CAAI,EACrC,KAAK,GAAG,MAAM,YAAY,gBAAiBE,EAAIF,CAAI,EAAI,kBAAkBE,EAAIF,CAAI,EAAI,CAAC,IAAM,4CAA4C,EACxI,KAAK,GAAG,aAAa,aAAc,KAAK,OAAO,WAAaA,CAAI,EAC5D,KAAK,MAAK,KAAK,IAAI,IAAM,IAC/B,CAEA,OAAOS,EAAyB,CAM9B,GALA,KAAK,OAAO,IAAMA,EACd,CAAC,KAAK,WACV,KAAK,KAAK,OAAO,EACjB,KAAK,IAAM,OACX,KAAK,GAAG,UAAU,OAAO,WAAW,EAChC,CAACA,GAAK,OACV,IAAMC,EAAO,KAAK,IAAMH,EAAE,MAAO,iBAAkB,CAAE,IAAAE,EAAK,IAAK,GAAI,UAAW,OAAQ,CAAC,EACvFC,EAAI,iBAAiB,OAAQ,IAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC,EACrEA,EAAI,iBAAiB,QAAS,KAAOA,EAAI,OAAO,EAAG,KAAK,GAAG,UAAU,OAAO,WAAW,EAAE,EACzF,KAAK,GAAG,QAAQA,CAAG,CACrB,CAEA,UAAUC,EAAgC,CACxC,KAAK,OAAO,OAASA,EAChB,KAAK,WACV,KAAK,IAAI,OAAS,CAACA,EACnB,KAAK,IAAI,UAAY,oBAAoBA,EAAS,OAAOA,CAAM,GAAK,EAAE,GACxE,CACF,EACAC,EAAS,SAAUP,CAAM",
6
+ "names": ["initials", "name", "w", "hue", "a", "ch", "Avatar", "Component", "h", "c", "src", "img", "status", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as e}from"./chunk-DIOJGTUN.js";import{e as r}from"./chunk-S4QD5NID.js";e({refresh:'<path d="M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6"/>'});r("en",{reload:"Reload"});r("pt-BR",{reload:"Recarregar"});
2
+ //# sourceMappingURL=chunk-HRW25TMU.js.map
@@ -0,0 +1,2 @@
1
+ import{b as f,c as p}from"./chunk-YLFSCQL3.js";function c(s,t={}){return{init(i){let r=i.getStore(),o=!0,a,l=!1,u=()=>({...t.columns!==!1&&{columns:i.getColumnState()},...t.sort!==!1&&{sorters:r.getSorters()},...t.filters!==!1&&{filters:r.getFilters()},...t.page!==!1&&{page:r.page},pageSize:r.pageSize}),n=()=>{o||(clearTimeout(a),a=setTimeout(()=>{p(s,u())},t.delay??300))};f(s).then(async e=>{l||(e&&(e.columns&&t.columns!==!1&&i.setColumnState(e.columns),e.pageSize&&e.pageSize!==r.pageSize&&t.page!==!1&&r.setPageSize(e.pageSize),e.sorters?.[0]&&t.sort!==!1&&r.sort(e.sorters[0].field,e.sorters[0].dir),e.filters?.length&&t.filters!==!1&&await r.filter(e.filters),e.page&&t.page!==!1&&r.setPage(e.page)),o=!1)});let g=[i.on("columns-change",n),r.subscribe(e=>["sort","filter","page"].includes(e.type)&&n())];return()=>{l=!0,clearTimeout(a),g.forEach(e=>e())}}}}export{c as a};
2
+ //# sourceMappingURL=chunk-HX6TWXTX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/gridstate/gridstate.ts"],
4
+ "sourcesContent": ["// Remembers a grid per user, as a plugin: `plugins: [persistState('grid-lots')]`.\nimport { loadState, saveState } from '../../../core/state';\nimport type { Grid, GridPlugin, ColumnState } from '../grid/grid';\nimport type { FilterNode, Sorter } from '../../../data/proxy';\n\nexport interface GridState {\n columns?: ColumnState[];\n sorters?: Sorter[];\n filters?: FilterNode[];\n page?: number;\n pageSize?: number;\n}\n\nexport interface PersistOptions {\n /** What to keep. All on by default. */\n columns?: boolean;\n sort?: boolean;\n filters?: boolean;\n page?: boolean;\n /** ms to wait after a change before saving. Default 300. */\n delay?: number;\n}\n\n/**\n * Keeps widths, order and visibility of the columns, the sort, the filters, the page size and the page under `key`\n * (`setStateStorage` decides where: the browser by default) and puts them back when the grid is created.\n */\nexport function persistState(key: string, o: PersistOptions = {}): GridPlugin {\n return {\n init(grid: Grid) {\n const store = grid.getStore();\n let restoring = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let dead = false;\n const snapshot = (): GridState => ({\n ...(o.columns !== false && { columns: grid.getColumnState() }),\n ...(o.sort !== false && { sorters: store.getSorters() }),\n ...(o.filters !== false && { filters: store.getFilters() }),\n ...(o.page !== false && { page: store.page }),\n pageSize: store.pageSize,\n });\n const save = () => {\n if (restoring) return;\n clearTimeout(timer);\n timer = setTimeout(() => void saveState(key, snapshot()), o.delay ?? 300);\n };\n void loadState<GridState>(key).then(async (s) => {\n if (dead) return;\n if (s) {\n if (s.columns && o.columns !== false) grid.setColumnState(s.columns);\n if (s.pageSize && s.pageSize !== store.pageSize && o.page !== false) store.setPageSize(s.pageSize);\n if (s.sorters?.[0] && o.sort !== false) store.sort(s.sorters[0].field, s.sorters[0].dir);\n if (s.filters?.length && o.filters !== false) await store.filter(s.filters);\n if (s.page && o.page !== false) store.setPage(s.page);\n }\n restoring = false;\n });\n const offs = [grid.on('columns-change', save), store.subscribe((c) => ['sort', 'filter', 'page'].includes(c.type) && save())];\n return () => {\n dead = true;\n clearTimeout(timer);\n offs.forEach((off) => off());\n };\n },\n };\n}\n"],
5
+ "mappings": "+CA2BO,SAASA,EAAaC,EAAaC,EAAoB,CAAC,EAAe,CAC5E,MAAO,CACL,KAAKC,EAAY,CACf,IAAMC,EAAQD,EAAK,SAAS,EACxBE,EAAY,GACZC,EACAC,EAAO,GACLC,EAAW,KAAkB,CACjC,GAAIN,EAAE,UAAY,IAAS,CAAE,QAASC,EAAK,eAAe,CAAE,EAC5D,GAAID,EAAE,OAAS,IAAS,CAAE,QAASE,EAAM,WAAW,CAAE,EACtD,GAAIF,EAAE,UAAY,IAAS,CAAE,QAASE,EAAM,WAAW,CAAE,EACzD,GAAIF,EAAE,OAAS,IAAS,CAAE,KAAME,EAAM,IAAK,EAC3C,SAAUA,EAAM,QAClB,GACMK,EAAO,IAAM,CACbJ,IACJ,aAAaC,CAAK,EAClBA,EAAQ,WAAW,IAAG,CAAQI,EAAUT,EAAKO,EAAS,CAAC,GAAGN,EAAE,OAAS,GAAG,EAC1E,EACKS,EAAqBV,CAAG,EAAE,KAAK,MAAOW,GAAM,CAC3CL,IACAK,IACEA,EAAE,SAAWV,EAAE,UAAY,IAAOC,EAAK,eAAeS,EAAE,OAAO,EAC/DA,EAAE,UAAYA,EAAE,WAAaR,EAAM,UAAYF,EAAE,OAAS,IAAOE,EAAM,YAAYQ,EAAE,QAAQ,EAC7FA,EAAE,UAAU,CAAC,GAAKV,EAAE,OAAS,IAAOE,EAAM,KAAKQ,EAAE,QAAQ,CAAC,EAAE,MAAOA,EAAE,QAAQ,CAAC,EAAE,GAAG,EACnFA,EAAE,SAAS,QAAUV,EAAE,UAAY,IAAO,MAAME,EAAM,OAAOQ,EAAE,OAAO,EACtEA,EAAE,MAAQV,EAAE,OAAS,IAAOE,EAAM,QAAQQ,EAAE,IAAI,GAEtDP,EAAY,GACd,CAAC,EACD,IAAMQ,EAAO,CAACV,EAAK,GAAG,iBAAkBM,CAAI,EAAGL,EAAM,UAAWU,GAAM,CAAC,OAAQ,SAAU,MAAM,EAAE,SAASA,EAAE,IAAI,GAAKL,EAAK,CAAC,CAAC,EAC5H,MAAO,IAAM,CACXF,EAAO,GACP,aAAaD,CAAK,EAClBO,EAAK,QAASE,GAAQA,EAAI,CAAC,CAC7B,CACF,CACF,CACF",
6
+ "names": ["persistState", "key", "o", "grid", "store", "restoring", "timer", "dead", "snapshot", "save", "saveState", "loadState", "s", "offs", "c", "off"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as g}from"./chunk-DIOJGTUN.js";import{a as n}from"./chunk-TIPK3SCJ.js";import{f as a}from"./chunk-UDXO3KM3.js";import{b as t}from"./chunk-PZSHOSOS.js";var s=class extends a{baseCls="op-image";img;ph;build(){return this.ph=t("div","op-image__fallback",{"aria-hidden":"true"}),t("div",this.baseCls,{},this.ph)}onRender(){let e=this.config;e.ratio&&(this.el.style.aspectRatio=e.ratio),this.el.classList.add(`op-image--${e.fit??"cover"}`),this.el.classList.toggle("op-image--rounded",!!e.rounded),this.setSrc(e.src)}setSrc(e,r=!1){if(r||(this.config.src=e),!this.rendered)return;this.img?.remove(),this.img=void 0,this.el.classList.toggle("has-image",!1);let o=this.config.fallback??"image";if(this.ph.replaceChildren(/[/.]/.test(o)?"":g(o)),!e)return;let i=this.img=t("img","op-image__img",{src:e,alt:this.config.alt??"",draggable:"false",loading:this.config.eager?"eager":"lazy",decoding:"async"});i.addEventListener("load",()=>this.el.classList.add("has-image")),i.addEventListener("error",()=>{i.remove(),this.img=void 0,!r&&/[/.]/.test(this.config.fallback??"")&&this.setSrc(this.config.fallback,!0),this.emit("error")}),this.el.append(i)}setAlt(e){this.config.alt=e,this.img&&(this.img.alt=e)}setRatio(e){this.config.ratio=e,this.rendered&&(this.el.style.aspectRatio=e)}};n("image",s);export{s as a};
2
+ //# sourceMappingURL=chunk-I5A74NMJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/base/image/image.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../icon/icon';\n\nexport interface ImageConfig extends ComponentConfig {\n src?: string;\n /** What the picture shows, for screen readers. Empty (the default) marks it decorative. */\n alt?: string;\n /** Aspect ratio as CSS: `'16/9'`, `'1'`. The box keeps it while the picture loads, so the page does not jump. */\n ratio?: string;\n fit?: 'cover' | 'contain';\n /** Shown while the picture is missing or fails: an icon name, or a second URL if it contains a `/` or a `.`. Default `image`. */\n fallback?: string;\n /** `lazy` (default) waits until the picture is near the screen. */\n eager?: boolean;\n rounded?: boolean;\n}\n\n/** A picture in a box that keeps its aspect ratio and shows a fallback when the file is missing. */\nexport class Image extends Component<ImageConfig> {\n protected override baseCls = 'op-image';\n private img?: HTMLImageElement;\n private ph!: HTMLElement;\n\n protected override build() {\n this.ph = h('div', 'op-image__fallback', { 'aria-hidden': 'true' });\n return h('div', this.baseCls, {}, this.ph);\n }\n\n protected override onRender() {\n const c = this.config;\n if (c.ratio) this.el.style.aspectRatio = c.ratio;\n this.el.classList.add(`op-image--${c.fit ?? 'cover'}`);\n this.el.classList.toggle('op-image--rounded', !!c.rounded);\n this.setSrc(c.src);\n }\n\n setSrc(src: string | undefined, fallback = false) {\n if (!fallback) this.config.src = src;\n if (!this.rendered) return;\n this.img?.remove();\n this.img = undefined;\n this.el.classList.toggle('has-image', false);\n const fb = this.config.fallback ?? 'image';\n this.ph.replaceChildren(/[/.]/.test(fb) ? '' : iconEl(fb));\n if (!src) return;\n const img = (this.img = h('img', 'op-image__img', { src, alt: this.config.alt ?? '', draggable: 'false', loading: this.config.eager ? 'eager' : 'lazy', decoding: 'async' }));\n img.addEventListener('load', () => this.el.classList.add('has-image'));\n img.addEventListener('error', () => {\n img.remove();\n this.img = undefined;\n // a second URL is tried once; anything else leaves the icon\n if (!fallback && /[/.]/.test(this.config.fallback ?? '')) this.setSrc(this.config.fallback, true);\n this.emit('error');\n });\n this.el.append(img);\n }\n\n setAlt(alt: string) {\n this.config.alt = alt;\n if (this.img) this.img.alt = alt;\n }\n\n setRatio(ratio: string) {\n this.config.ratio = ratio;\n if (this.rendered) this.el.style.aspectRatio = ratio;\n }\n}\nregister('image', Image);\n"],
5
+ "mappings": "gKAoBO,IAAMA,EAAN,cAAoBC,CAAuB,CAC7B,QAAU,WACrB,IACA,GAEW,OAAQ,CACzB,YAAK,GAAKC,EAAE,MAAO,qBAAsB,CAAE,cAAe,MAAO,CAAC,EAC3DA,EAAE,MAAO,KAAK,QAAS,CAAC,EAAG,KAAK,EAAE,CAC3C,CAEmB,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACXA,EAAE,QAAO,KAAK,GAAG,MAAM,YAAcA,EAAE,OAC3C,KAAK,GAAG,UAAU,IAAI,aAAaA,EAAE,KAAO,OAAO,EAAE,EACrD,KAAK,GAAG,UAAU,OAAO,oBAAqB,CAAC,CAACA,EAAE,OAAO,EACzD,KAAK,OAAOA,EAAE,GAAG,CACnB,CAEA,OAAOC,EAAyBC,EAAW,GAAO,CAEhD,GADKA,IAAU,KAAK,OAAO,IAAMD,GAC7B,CAAC,KAAK,SAAU,OACpB,KAAK,KAAK,OAAO,EACjB,KAAK,IAAM,OACX,KAAK,GAAG,UAAU,OAAO,YAAa,EAAK,EAC3C,IAAME,EAAK,KAAK,OAAO,UAAY,QAEnC,GADA,KAAK,GAAG,gBAAgB,OAAO,KAAKA,CAAE,EAAI,GAAKC,EAAOD,CAAE,CAAC,EACrD,CAACF,EAAK,OACV,IAAMI,EAAO,KAAK,IAAMN,EAAE,MAAO,gBAAiB,CAAE,IAAAE,EAAK,IAAK,KAAK,OAAO,KAAO,GAAI,UAAW,QAAS,QAAS,KAAK,OAAO,MAAQ,QAAU,OAAQ,SAAU,OAAQ,CAAC,EAC3KI,EAAI,iBAAiB,OAAQ,IAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC,EACrEA,EAAI,iBAAiB,QAAS,IAAM,CAClCA,EAAI,OAAO,EACX,KAAK,IAAM,OAEP,CAACH,GAAY,OAAO,KAAK,KAAK,OAAO,UAAY,EAAE,GAAG,KAAK,OAAO,KAAK,OAAO,SAAU,EAAI,EAChG,KAAK,KAAK,OAAO,CACnB,CAAC,EACD,KAAK,GAAG,OAAOG,CAAG,CACpB,CAEA,OAAOC,EAAa,CAClB,KAAK,OAAO,IAAMA,EACd,KAAK,MAAK,KAAK,IAAI,IAAMA,EAC/B,CAEA,SAASC,EAAe,CACtB,KAAK,OAAO,MAAQA,EAChB,KAAK,WAAU,KAAK,GAAG,MAAM,YAAcA,EACjD,CACF,EACAC,EAAS,QAASX,CAAK",
6
+ "names": ["Image", "Component", "h", "c", "src", "fallback", "fb", "iconEl", "img", "alt", "ratio", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{b as s}from"./chunk-XFDNXSU5.js";function f(e,a){let r=a.data[e.field];return e.renderer?e.renderer(r,a,e):e.format?s(e.format,r):r==null?"":String(r)}var l=e=>typeof e=="number"?e:Number(e),u=e=>e instanceof Date?+e:typeof e=="string"&&/^\d{4}-\d{2}-\d{2}/.test(e)?Date.parse(e):NaN;function g(e,a){let r=a.map(n=>n.data[e.field]),i=r.filter(n=>n!=null&&n!==""&&!isNaN(l(n))).map(l),t=e.summary;if(typeof t=="function")return t(r,a);if(t==="count")return r.filter(n=>n!=null&&n!=="").length;if(!i.length){let n=t==="min"||t==="max"?r.filter(o=>!isNaN(u(o))):[];return n.length?n.reduce((o,m)=>(t==="min"?u(m)<u(o):u(m)>u(o))?m:o):null}return t==="sum"?i.reduce((n,o)=>n+o,0):t==="avg"?i.reduce((n,o)=>n+o,0)/i.length:t==="min"?Math.min(...i):Math.max(...i)}export{f as a,g as b};
2
+ //# sourceMappingURL=chunk-IODSL7KU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/data/column.ts"],
4
+ "sourcesContent": ["import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\n/** A grid/table column. `T` is the record shape: `field` then autocompletes its keys (any string still works). */\nexport interface Column<T extends Record<string, any> = any> {\n field: Extract<keyof T, string> | (string & {});\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Pinned to the start or the end while the body scrolls sideways (give it a `width`; default 140). The columns of one edge stay together. */\n locked?: 'start' | 'end';\n /** With `grouping()` or `columnTotals()`: what the total shows. Numbers: `sum`, `avg`, `min`, `max`, `count`; dates: `min` (earliest), `max` (latest), `count`; or your own function of the values. */\n summary?: 'sum' | 'avg' | 'min' | 'max' | 'count' | ((values: any[], recs: Model<T>[]) => unknown);\n /** Text for the total of this column (default: the column's `format`, else the plain value). */\n summaryRenderer?: (value: any, col: Column<T>) => string | Node;\n /** Left out while `setPermissionResolver` denies it. */\n permission?: string;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`, `duration`: minutes as `7h 30m`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model<T>, col: Column<T>) => string | Node;\n cls?: string;\n /** With the `cellEditing()` grid plugin: `true` (an editor for the value's type), a field type (`'select'`) or a field config. */\n editor?: boolean | string | Record<string, any>;\n /** With `cellEditing()`: whether this record's cell can be edited (default: every record, when `editor` is set). */\n editable?: (rec: Model<T>) => boolean;\n}\n\n/** Cell content for a record: `renderer` first, then `format`, then the plain value. */\nexport function cellContent<T extends Record<string, any>>(col: Column<T>, rec: Model<T>): string | Node {\n const v = rec.data[col.field];\n if (col.renderer) return col.renderer(v, rec, col);\n if (col.format) return format(col.format, v);\n return v == null ? '' : String(v);\n}\n\nconst num = (v: unknown) => (typeof v === 'number' ? v : Number(v));\nconst time = (v: unknown) => (v instanceof Date ? +v : typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(v) ? Date.parse(v) : NaN);\n\n/** The value of a column's `summary` over some records. */\nexport function summarize(col: Column, recs: Model[]): unknown {\n const values = recs.map((r) => r.data[col.field]);\n const nums = values.filter((v) => v != null && v !== '' && !isNaN(num(v))).map(num);\n const s = col.summary;\n if (typeof s === 'function') return s(values, recs);\n if (s === 'count') return values.filter((v) => v != null && v !== '').length;\n if (!nums.length) {\n // dates have no sum: min/max give the earliest and the latest, as the value the record holds\n const dates = s === 'min' || s === 'max' ? values.filter((v) => !isNaN(time(v))) : [];\n return dates.length ? dates.reduce((a, b) => ((s === 'min' ? time(b) < time(a) : time(b) > time(a)) ? b : a)) : null;\n }\n if (s === 'sum') return nums.reduce((a, b) => a + b, 0);\n if (s === 'avg') return nums.reduce((a, b) => a + b, 0) / nums.length;\n return s === 'min' ? Math.min(...nums) : Math.max(...nums);\n}\n"],
5
+ "mappings": "wCAyCO,SAASA,EAA2CC,EAAgBC,EAA8B,CACvG,IAAMC,EAAID,EAAI,KAAKD,EAAI,KAAK,EAC5B,OAAIA,EAAI,SAAiBA,EAAI,SAASE,EAAGD,EAAKD,CAAG,EAC7CA,EAAI,OAAeG,EAAOH,EAAI,OAAQE,CAAC,EACpCA,GAAK,KAAO,GAAK,OAAOA,CAAC,CAClC,CAEA,IAAME,EAAOF,GAAgB,OAAOA,GAAM,SAAWA,EAAI,OAAOA,CAAC,EAC3DG,EAAQH,GAAgBA,aAAa,KAAO,CAACA,EAAI,OAAOA,GAAM,UAAY,qBAAqB,KAAKA,CAAC,EAAI,KAAK,MAAMA,CAAC,EAAI,IAGxH,SAASI,EAAUN,EAAaO,EAAwB,CAC7D,IAAMC,EAASD,EAAK,IAAKE,GAAMA,EAAE,KAAKT,EAAI,KAAK,CAAC,EAC1CU,EAAOF,EAAO,OAAQN,GAAMA,GAAK,MAAQA,IAAM,IAAM,CAAC,MAAME,EAAIF,CAAC,CAAC,CAAC,EAAE,IAAIE,CAAG,EAC5EO,EAAIX,EAAI,QACd,GAAI,OAAOW,GAAM,WAAY,OAAOA,EAAEH,EAAQD,CAAI,EAClD,GAAII,IAAM,QAAS,OAAOH,EAAO,OAAQN,GAAMA,GAAK,MAAQA,IAAM,EAAE,EAAE,OACtE,GAAI,CAACQ,EAAK,OAAQ,CAEhB,IAAME,EAAQD,IAAM,OAASA,IAAM,MAAQH,EAAO,OAAQN,GAAM,CAAC,MAAMG,EAAKH,CAAC,CAAC,CAAC,EAAI,CAAC,EACpF,OAAOU,EAAM,OAASA,EAAM,OAAO,CAACC,EAAGC,KAAQH,IAAM,MAAQN,EAAKS,CAAC,EAAIT,EAAKQ,CAAC,EAAIR,EAAKS,CAAC,EAAIT,EAAKQ,CAAC,GAAKC,EAAID,CAAE,EAAI,IAClH,CACA,OAAIF,IAAM,MAAcD,EAAK,OAAO,CAACG,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAClDH,IAAM,MAAcD,EAAK,OAAO,CAACG,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAAIJ,EAAK,OACxDC,IAAM,MAAQ,KAAK,IAAI,GAAGD,CAAI,EAAI,KAAK,IAAI,GAAGA,CAAI,CAC3D",
6
+ "names": ["cellContent", "col", "rec", "v", "format", "num", "time", "summarize", "recs", "values", "r", "nums", "s", "dates", "a", "b"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as h}from"./chunk-2QMI2RRB.js";import{a as g}from"./chunk-Z6HZY2YG.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as d,f as l}from"./chunk-S4QD5NID.js";d("en",{shortcuts:"Keyboard shortcuts",shortcutsGlobal:"Everywhere",shortcutsEmpty:"No shortcuts registered"});d("pt-BR",{shortcuts:"Atalhos de teclado",shortcutsGlobal:"Em qualquer tela",shortcutsEmpty:"Nenhum atalho registrado"});var y=()=>/mac|iphone|ipad/i.test(navigator.platform||navigator.userAgent),f=t=>{let s=t.toLowerCase().split("+").map(e=>e.trim()),o=s.pop();return[...s.sort(),o].join("+")};function w(t,s){let o=s.toLowerCase().split("+"),e=o.pop(),r=v=>o.includes(v),c=y(),b=e.length===1&&!/[a-z0-9]/.test(e);return t.key.toLowerCase()===e&&t.ctrlKey===(r("ctrl")||r("mod")&&!c)&&t.metaKey===(r("meta")||r("mod")&&c)&&t.altKey===r("alt")&&(b||t.shiftKey===r("shift"))}function E(t){let s=y(),o=s?{mod:"\u2318",ctrl:"\u2303",alt:"\u2325",shift:"\u21E7",meta:"\u2318"}:{mod:"Ctrl",ctrl:"Ctrl",alt:"Alt",shift:"Shift",meta:"Meta"};return t.split("+").map(e=>o[e.toLowerCase()]??(e.length===1?e.toUpperCase():e[0].toUpperCase()+e.slice(1))).join(s?"":"+")}var n=[],a,m=!1,p,k=t=>t instanceof HTMLElement&&(t.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName));function K(t){if(t.defaultPrevented||t.isComposing)return;let s=t.ctrlKey||t.metaKey||t.altKey,o=[...n].sort((e,r)=>+((r.scope??"global")===a)-+((e.scope??"global")===a)).find(e=>((e.scope??"global")==="global"||e.scope===a)&&w(t,e.keys)&&(s||e.inInputs||!k(t.target))&&(e.when?.()??!0));o&&o.handler(t)!==!1&&t.preventDefault()}var u={register(t){let s=Array.isArray(t)?t:[t];!m&&typeof document<"u"&&(m=!0,document.addEventListener("keydown",K),u.register({keys:"shift+?",title:l("shortcuts"),handler:()=>u.help()}));for(let o of s){let e=n.findIndex(r=>(r.scope??"global")===(o.scope??"global")&&f(r.keys)===f(o.keys));e>=0&&(h()&&console.warn(`Optikos: shortcut ${o.keys} is already taken in scope "${o.scope??"global"}" by "${n[e].title}"; "${o.title}" replaces it`),n.splice(e,1)),n.push(o)}return()=>{for(let o of s){let e=n.indexOf(o);e>=0&&n.splice(e,1)}}},setScope(t){a=t},getScope:()=>a,list:()=>n.filter(t=>(t.scope??"global")==="global"||t.scope===a),help(){if(p)return void p.close();let t=new Map;for(let e of u.list()){let r=e.group??((e.scope??"global")==="global"?l("shortcutsGlobal"):e.scope);t.set(r,[...t.get(r)??[],e])}let s=i("div","op-shortcuts");for(let[e,r]of t)s.append(i("h3","op-shortcuts__group",{},e),...r.map(c=>i("div","op-shortcuts__row",{},i("span","",{},c.title),i("kbd","op-shortcuts__kbd",{},E(c.keys)))));t.size||s.append(l("shortcutsEmpty"));let o=p=new g({title:l("shortcuts"),closable:!0,width:420});o.on("destroy",()=>p=void 0),o.show(),o.getBody().replaceChildren(s)}};export{E as a,u as b};
2
+ //# sourceMappingURL=chunk-J2TCHWYD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/shortcuts/shortcuts.ts"],
4
+ "sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { isDev } from '../../../core/dev';\nimport { Window } from '../window/window';\n\naddMessages('en', { shortcuts: 'Keyboard shortcuts', shortcutsGlobal: 'Everywhere', shortcutsEmpty: 'No shortcuts registered' });\naddMessages('pt-BR', { shortcuts: 'Atalhos de teclado', shortcutsGlobal: 'Em qualquer tela', shortcutsEmpty: 'Nenhum atalho registrado' });\n\nexport interface Shortcut {\n /** `mod+s` (Ctrl, or \u2318 on a Mac), `shift+?`, `alt+n`, `g`. Several keys in a row are not supported. */\n keys: string;\n title: string;\n handler: (e: KeyboardEvent) => void | false;\n /** The screen it belongs to (`setScope`). Default `global`: active on every screen. */\n scope?: string;\n /** Heading in the help panel. Default: the scope. */\n group?: string;\n /** Checked on every press: the shortcut only runs while this returns true. */\n when?: () => boolean;\n /** A shortcut without Ctrl/\u2318/Alt is ignored while typing in a field, unless this is true. */\n inInputs?: boolean;\n}\n\nconst isMac = () => /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\nconst normalize = (keys: string) => {\n const p = keys.toLowerCase().split('+').map((x) => x.trim());\n const key = p.pop();\n return [...p.sort(), key].join('+');\n};\n\nfunction matches(e: KeyboardEvent, keys: string): boolean {\n const parts = keys.toLowerCase().split('+');\n const key = parts.pop()!;\n const has = (m: string) => parts.includes(m);\n const mac = isMac();\n // a symbol such as `?` already carries its Shift\n const symbol = key.length === 1 && !/[a-z0-9]/.test(key);\n return e.key.toLowerCase() === key && e.ctrlKey === (has('ctrl') || (has('mod') && !mac)) && e.metaKey === (has('meta') || (has('mod') && mac)) && e.altKey === has('alt') && (symbol || e.shiftKey === has('shift'));\n}\n\n/** How a combination reads on this keyboard: `\u2318S`, `Ctrl+S`. */\nexport function formatKeys(keys: string): string {\n const mac = isMac();\n const names: Record<string, string> = mac ? { mod: '\u2318', ctrl: '\u2303', alt: '\u2325', shift: '\u21E7', meta: '\u2318' } : { mod: 'Ctrl', ctrl: 'Ctrl', alt: 'Alt', shift: 'Shift', meta: 'Meta' };\n return keys.split('+').map((p) => names[p.toLowerCase()] ?? (p.length === 1 ? p.toUpperCase() : p[0].toUpperCase() + p.slice(1))).join(mac ? '' : '+');\n}\n\nconst entries: Shortcut[] = [];\nlet scope: string | undefined;\nlet listening = false;\nlet helpWin: Window | undefined;\n\nconst typing = (el: EventTarget | null) => el instanceof HTMLElement && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName));\n\nfunction onKey(e: KeyboardEvent) {\n if (e.defaultPrevented || e.isComposing) return;\n const modified = e.ctrlKey || e.metaKey || e.altKey;\n // the active screen's shortcuts come before the global ones with the same keys\n const hit = [...entries].sort((a, b) => Number((b.scope ?? 'global') === scope) - Number((a.scope ?? 'global') === scope)).find((s) => ((s.scope ?? 'global') === 'global' || s.scope === scope) && matches(e, s.keys) && (modified || s.inInputs || !typing(e.target)) && (s.when?.() ?? true));\n if (hit && hit.handler(e) !== false) e.preventDefault();\n}\n\nexport const shortcuts = {\n /** Adds shortcuts; returns the function that removes them. The same keys twice in one scope warn in dev, and the newest wins. */\n register(list: Shortcut | Shortcut[]): () => void {\n const add = Array.isArray(list) ? list : [list];\n if (!listening && typeof document !== 'undefined') {\n listening = true;\n document.addEventListener('keydown', onKey);\n shortcuts.register({ keys: 'shift+?', title: t('shortcuts'), handler: () => shortcuts.help() });\n }\n for (const s of add) {\n const same = entries.findIndex((x) => (x.scope ?? 'global') === (s.scope ?? 'global') && normalize(x.keys) === normalize(s.keys));\n if (same >= 0) {\n if (isDev()) console.warn(`Optikos: shortcut ${s.keys} is already taken in scope \"${s.scope ?? 'global'}\" by \"${entries[same].title}\"; \"${s.title}\" replaces it`);\n entries.splice(same, 1);\n }\n entries.push(s);\n }\n return () => {\n for (const s of add) {\n const i = entries.indexOf(s);\n if (i >= 0) entries.splice(i, 1);\n }\n };\n },\n\n /** The screen whose shortcuts are active besides the global ones (`undefined`: only global). */\n setScope(name: string | undefined): void {\n scope = name;\n },\n getScope: (): string | undefined => scope,\n\n /** What is active now: the global shortcuts and the current scope's. */\n list: (): Shortcut[] => entries.filter((s) => (s.scope ?? 'global') === 'global' || s.scope === scope),\n\n /** Opens (or closes) the help panel, grouped. `?` does it from anywhere but a text field. */\n help(): void {\n if (helpWin) return void helpWin.close();\n const groups = new Map<string, Shortcut[]>();\n for (const s of shortcuts.list()) {\n const g = s.group ?? ((s.scope ?? 'global') === 'global' ? t('shortcutsGlobal') : s.scope!);\n groups.set(g, [...(groups.get(g) ?? []), s]);\n }\n const body = h('div', 'op-shortcuts');\n for (const [g, list] of groups) body.append(h('h3', 'op-shortcuts__group', {}, g), ...list.map((s) => h('div', 'op-shortcuts__row', {}, h('span', '', {}, s.title), h('kbd', 'op-shortcuts__kbd', {}, formatKeys(s.keys)))));\n if (!groups.size) body.append(t('shortcutsEmpty'));\n const win = (helpWin = new Window({ title: t('shortcuts'), closable: true, width: 420 }));\n win.on('destroy', () => (helpWin = undefined));\n win.show();\n win.getBody().replaceChildren(body);\n },\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "isMac", "normalize", "keys", "p", "x", "key", "matches", "e", "parts", "has", "m", "mac", "symbol", "formatKeys", "names", "entries", "scope", "listening", "helpWin", "typing", "el", "onKey", "modified", "hit", "a", "b", "s", "shortcuts", "list", "add", "t", "same", "isDev", "i", "name", "groups", "g", "body", "h", "win", "Window"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as h}from"./chunk-LXWCTCZV.js";import{a as l}from"./chunk-ESRS5ZQV.js";import{a as c,c as d}from"./chunk-TIPK3SCJ.js";import{f as s}from"./chunk-UDXO3KM3.js";import{b as n}from"./chunk-PZSHOSOS.js";import{f as a}from"./chunk-S4QD5NID.js";var m=r=>r instanceof s?r.config:r,g=new Map;function A(r,t){g.set(r,t)}function y(r){let t=typeof r=="string"?g.get(r):r;if(!t)throw new Error(`Optikos: unknown lookup "${r}". Did you call registerLookup?`);return t}var v=r=>typeof r.store=="function"?r.store():r.store,k=r=>!r||r==="textfield"||r==="textarea",w=r=>r==null||r===""||Array.isArray(r)&&!r.length,f=class extends s{baseCls="op-searchgrid";def;store;fields=[];grid;form;build(){this.def=y(this.config.lookup),this.store=v(this.def);let t=this.def;this.form=n("div","op-searchgrid__filters",{role:"search"});let i=[new l({text:a("search"),icon:"search",variant:"primary",handler:()=>{this.search()}}),new l({text:a("clear"),handler:()=>this.clear()})];return this.fields=(t.filters??[]).map(e=>{let o=m(e),{op:x,field:C,...u}=o,p=e instanceof s?e:d({...u,renderTo:void 0});return p.on("enter",()=>{this.search()}),{cfg:o,cmp:p,own:!(e instanceof s)}}),this.form.append(...this.fields.map(e=>e.cmp.el),n("div","op-searchgrid__buttons",{},...i.map(e=>e.el))),this.grid=new h({store:this.store,columns:t.columns,selection:t.selection??"single",paging:t.paging!==!1,flex:1}),this.grid.on("select",e=>this.emit("select",e)),this.grid.on("row-activate",()=>this.confirm()),this.grid.on("row-dblclick",()=>this.confirm()),this.own(()=>[...i,this.grid,...this.fields.filter(e=>e.own).map(e=>e.cmp)].forEach(e=>e.destroy())),n("div",this.baseCls,{},this.form,this.grid.el)}onRender(){this.def.autoSearch!==!1&&this.search()}notifyMount(){super.notifyMount(),this.fields.forEach(t=>t.cmp.notifyMount()),this.grid.notifyMount()}confirm(){let t=this.grid.getSelection();t.length&&this.emit("confirm",t)}getFilters(){return this.fields.flatMap(({cfg:t,cmp:i})=>{let e=i.getValue?.();if(w(e))return[];let o=t.field??t.name;return typeof e=="object"&&!Array.isArray(e)&&"start"in e?e.start?[{field:o,op:"between",value:[e.start,e.end??e.start]}]:[]:[{field:o,op:t.op??(k(t.type)?"contains":"eq"),value:e}]})}async search(t){t!=null&&this.setQuery(t);let i=this.getFilters();this.emit("before-search",i)!==!1&&(await(i.length?this.store.filter(i):this.store.clearFilter()),this.emit("search",i))}clear(){this.fields.forEach(t=>t.cmp.clear?.()),this.search()}setQuery(t){let i=this.def.queryField??(this.def.filters?.[0]&&m(this.def.filters[0]).name);this.fields.find(e=>e.cfg.name===i)?.cmp?.setValue?.(t)}getSelection(){return this.grid.getSelection()}getGrid(){return this.grid}getStore(){return this.store}focus(){(this.fields[0]?.cmp??this.grid).focus()}};c("searchgrid",f);export{m as a,A as b,y as c,v as d,f as e};
2
+ //# sourceMappingURL=chunk-J5BZAKC6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/searchgrid/searchgrid.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { FilterOp, FilterSpec } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Grid } from '../grid/grid';\n\n/** A filter field of a lookup: a field config or a field instance (`ui.text(...)`); `op` and `field` say how its value is matched. */\nexport type LookupFilter = (AnyConfig & { name: string; op?: FilterOp; field?: string }) | Component;\n\n/** `name`, `op`, `field` and `type` of a filter, whether it was given as a config or an instance. */\nexport const filterInfo = (f: LookupFilter) => (f instanceof Component ? f.config : f) as { name: string; op?: FilterOp; field?: string; type?: string };\n\n/** Everything that describes \"search for a record\": shared by SearchGrid and LookupField. */\nexport interface LookupDef {\n /** A function gives every instance its own store (recommended when the definition is reused). */\n store: Store<any> | (() => Store<any>);\n columns: Column[];\n filters?: LookupFilter[];\n /** Name of the filter that receives the quick text (LookupField typing). Default: the first filter. */\n queryField?: string;\n valueField?: string;\n displayField?: string;\n selection?: 'single' | 'multi';\n paging?: boolean;\n /** Search when shown. Default true. */\n autoSearch?: boolean;\n title?: string;\n width?: number;\n height?: number;\n}\n\nconst defs = new Map<string, LookupDef>();\n/** Registers a lookup definition for declarative use by name (`lookup: 'people'`). */\nexport function registerLookup(name: string, def: LookupDef): void {\n defs.set(name, def);\n}\nexport function resolveLookup(lookup: LookupDef | string): LookupDef {\n const d = typeof lookup === 'string' ? defs.get(lookup) : lookup;\n if (!d) throw new Error(`Optikos: unknown lookup \"${lookup}\". Did you call registerLookup?`);\n return d;\n}\nexport const lookupStore = (def: LookupDef): Store<any> => (typeof def.store === 'function' ? def.store() : def.store);\n\nexport interface SearchGridConfig extends ComponentConfig {\n lookup: LookupDef | string;\n}\n\nconst textual = (type?: string) => !type || type === 'textfield' || type === 'textarea';\nconst blank = (v: unknown) => v == null || v === '' || (Array.isArray(v) && !v.length);\n\n/** Filters on top, results grid below. The Store does the searching; this component only turns the filter fields into specs. */\nexport class SearchGrid extends Component<SearchGridConfig> {\n protected override baseCls = 'op-searchgrid';\n private def!: LookupDef;\n private store!: Store<any>;\n private fields: Array<{ cfg: ReturnType<typeof filterInfo>; cmp: Component; own: boolean }> = [];\n private grid!: Grid;\n private form!: HTMLElement;\n\n protected override build() {\n this.def = resolveLookup(this.config.lookup);\n this.store = lookupStore(this.def);\n const d = this.def;\n this.form = h('div', 'op-searchgrid__filters', { role: 'search' });\n const btns = [\n new Button({ text: t('search'), icon: 'search', variant: 'primary', handler: () => void this.search() }),\n new Button({ text: t('clear'), handler: () => this.clear() }),\n ];\n this.fields = (d.filters ?? []).map((f) => {\n const cfg = filterInfo(f);\n const { op: _o, field: _f, ...fieldCfg } = cfg;\n const cmp = f instanceof Component ? f : create({ ...fieldCfg, renderTo: undefined } as AnyConfig);\n cmp.on('enter', () => void this.search());\n return { cfg, cmp, own: !(f instanceof Component) };\n });\n this.form.append(...this.fields.map((f) => f.cmp.el), h('div', 'op-searchgrid__buttons', {}, ...btns.map((b) => b.el)));\n this.grid = new Grid({ store: this.store, columns: d.columns, selection: d.selection ?? 'single', paging: d.paging !== false, flex: 1 });\n this.grid.on('select', (recs: Model[]) => this.emit('select', recs));\n this.grid.on('row-activate', () => this.confirm());\n this.grid.on('row-dblclick', () => this.confirm());\n this.own(() => [...btns, this.grid, ...this.fields.filter((f) => f.own).map((f) => f.cmp)].forEach((c) => c.destroy()));\n return h('div', this.baseCls, {}, this.form, this.grid.el);\n }\n\n protected override onRender() {\n if (this.def.autoSearch !== false) void this.search();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.fields.forEach((f) => f.cmp.notifyMount());\n this.grid.notifyMount();\n }\n\n private confirm() {\n const recs = this.grid.getSelection();\n if (recs.length) this.emit('confirm', recs);\n }\n\n /** The non-empty filter fields as filter specs. */\n getFilters(): FilterSpec[] {\n return this.fields.flatMap(({ cfg, cmp }) => {\n const v = (cmp as any).getValue?.();\n if (blank(v)) return [];\n const field = cfg.field ?? cfg.name;\n if (typeof v === 'object' && !Array.isArray(v) && 'start' in v) return v.start ? [{ field, op: 'between' as const, value: [v.start, v.end ?? v.start] }] : [];\n return [{ field, op: cfg.op ?? (textual(cfg.type) ? 'contains' : 'eq'), value: v }];\n });\n }\n\n /** Filters the store with the current fields (or loads it, when there are none). Resolves when the results are in. */\n async search(query?: string): Promise<void> {\n if (query != null) this.setQuery(query);\n const specs = this.getFilters();\n if (this.emit('before-search', specs) === false) return;\n await (specs.length ? this.store.filter(specs) : this.store.clearFilter());\n this.emit('search', specs);\n }\n\n /** Empties the filter fields and searches again. */\n clear(): void {\n this.fields.forEach((f) => (f.cmp as any).clear?.());\n void this.search();\n }\n\n /** Fills the quick-search field (`queryField`, default the first filter) without searching. */\n setQuery(text: string): void {\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name);\n (this.fields.find((f) => f.cfg.name === name)?.cmp as any)?.setValue?.(text);\n }\n\n getSelection(): Model[] {\n return this.grid.getSelection();\n }\n getGrid(): Grid {\n return this.grid;\n }\n getStore(): Store<any> {\n return this.store;\n }\n override focus(): void {\n (this.fields[0]?.cmp ?? this.grid).focus();\n }\n}\nregister('searchgrid', SearchGrid);\n"],
5
+ "mappings": "uPAeO,IAAMA,EAAcC,GAAqBA,aAAaC,EAAYD,EAAE,OAASA,EAqB9EE,EAAO,IAAI,IAEV,SAASC,EAAeC,EAAcC,EAAsB,CACjEH,EAAK,IAAIE,EAAMC,CAAG,CACpB,CACO,SAASC,EAAcC,EAAuC,CACnE,IAAMC,EAAI,OAAOD,GAAW,SAAWL,EAAK,IAAIK,CAAM,EAAIA,EAC1D,GAAI,CAACC,EAAG,MAAM,IAAI,MAAM,4BAA4BD,CAAM,iCAAiC,EAC3F,OAAOC,CACT,CACO,IAAMC,EAAeJ,GAAgC,OAAOA,EAAI,OAAU,WAAaA,EAAI,MAAM,EAAIA,EAAI,MAM1GK,EAAWC,GAAkB,CAACA,GAAQA,IAAS,aAAeA,IAAS,WACvEC,EAASC,GAAeA,GAAK,MAAQA,IAAM,IAAO,MAAM,QAAQA,CAAC,GAAK,CAACA,EAAE,OAGlEC,EAAN,cAAyBb,CAA4B,CACvC,QAAU,gBACrB,IACA,MACA,OAAsF,CAAC,EACvF,KACA,KAEW,OAAQ,CACzB,KAAK,IAAMK,EAAc,KAAK,OAAO,MAAM,EAC3C,KAAK,MAAQG,EAAY,KAAK,GAAG,EACjC,IAAMD,EAAI,KAAK,IACf,KAAK,KAAOO,EAAE,MAAO,yBAA0B,CAAE,KAAM,QAAS,CAAC,EACjE,IAAMC,EAAO,CACX,IAAIC,EAAO,CAAE,KAAMC,EAAE,QAAQ,EAAG,KAAM,SAAU,QAAS,UAAW,QAAS,IAAG,CAAQ,KAAK,OAAO,EAAE,CAAC,EACvG,IAAID,EAAO,CAAE,KAAMC,EAAE,OAAO,EAAG,QAAS,IAAM,KAAK,MAAM,CAAE,CAAC,CAC9D,EACA,YAAK,QAAUV,EAAE,SAAW,CAAC,GAAG,IAAKR,GAAM,CACzC,IAAMmB,EAAMpB,EAAWC,CAAC,EAClB,CAAE,GAAIoB,EAAI,MAAOC,EAAI,GAAGC,CAAS,EAAIH,EACrCI,EAAMvB,aAAaC,EAAYD,EAAIwB,EAAO,CAAE,GAAGF,EAAU,SAAU,MAAU,CAAc,EACjG,OAAAC,EAAI,GAAG,QAAS,IAAG,CAAQ,KAAK,OAAO,EAAC,EACjC,CAAE,IAAAJ,EAAK,IAAAI,EAAK,IAAK,EAAEvB,aAAaC,EAAW,CACpD,CAAC,EACD,KAAK,KAAK,OAAO,GAAG,KAAK,OAAO,IAAKD,GAAMA,EAAE,IAAI,EAAE,EAAGe,EAAE,MAAO,yBAA0B,CAAC,EAAG,GAAGC,EAAK,IAAKS,GAAMA,EAAE,EAAE,CAAC,CAAC,EACtH,KAAK,KAAO,IAAIC,EAAK,CAAE,MAAO,KAAK,MAAO,QAASlB,EAAE,QAAS,UAAWA,EAAE,WAAa,SAAU,OAAQA,EAAE,SAAW,GAAO,KAAM,CAAE,CAAC,EACvI,KAAK,KAAK,GAAG,SAAWmB,GAAkB,KAAK,KAAK,SAAUA,CAAI,CAAC,EACnE,KAAK,KAAK,GAAG,eAAgB,IAAM,KAAK,QAAQ,CAAC,EACjD,KAAK,KAAK,GAAG,eAAgB,IAAM,KAAK,QAAQ,CAAC,EACjD,KAAK,IAAI,IAAM,CAAC,GAAGX,EAAM,KAAK,KAAM,GAAG,KAAK,OAAO,OAAQhB,GAAMA,EAAE,GAAG,EAAE,IAAKA,GAAMA,EAAE,GAAG,CAAC,EAAE,QAAS4B,GAAMA,EAAE,QAAQ,CAAC,CAAC,EAC/Gb,EAAE,MAAO,KAAK,QAAS,CAAC,EAAG,KAAK,KAAM,KAAK,KAAK,EAAE,CAC3D,CAEmB,UAAW,CACxB,KAAK,IAAI,aAAe,IAAY,KAAK,OAAO,CACtD,CAES,aAAc,CACrB,MAAM,YAAY,EAClB,KAAK,OAAO,QAASf,GAAMA,EAAE,IAAI,YAAY,CAAC,EAC9C,KAAK,KAAK,YAAY,CACxB,CAEQ,SAAU,CAChB,IAAM2B,EAAO,KAAK,KAAK,aAAa,EAChCA,EAAK,QAAQ,KAAK,KAAK,UAAWA,CAAI,CAC5C,CAGA,YAA2B,CACzB,OAAO,KAAK,OAAO,QAAQ,CAAC,CAAE,IAAAR,EAAK,IAAAI,CAAI,IAAM,CAC3C,IAAMV,EAAKU,EAAY,WAAW,EAClC,GAAIX,EAAMC,CAAC,EAAG,MAAO,CAAC,EACtB,IAAMgB,EAAQV,EAAI,OAASA,EAAI,KAC/B,OAAI,OAAON,GAAM,UAAY,CAAC,MAAM,QAAQA,CAAC,GAAK,UAAWA,EAAUA,EAAE,MAAQ,CAAC,CAAE,MAAAgB,EAAO,GAAI,UAAoB,MAAO,CAAChB,EAAE,MAAOA,EAAE,KAAOA,EAAE,KAAK,CAAE,CAAC,EAAI,CAAC,EACrJ,CAAC,CAAE,MAAAgB,EAAO,GAAIV,EAAI,KAAOT,EAAQS,EAAI,IAAI,EAAI,WAAa,MAAO,MAAON,CAAE,CAAC,CACpF,CAAC,CACH,CAGA,MAAM,OAAOiB,EAA+B,CACtCA,GAAS,MAAM,KAAK,SAASA,CAAK,EACtC,IAAMC,EAAQ,KAAK,WAAW,EAC1B,KAAK,KAAK,gBAAiBA,CAAK,IAAM,KAC1C,MAAOA,EAAM,OAAS,KAAK,MAAM,OAAOA,CAAK,EAAI,KAAK,MAAM,YAAY,GACxE,KAAK,KAAK,SAAUA,CAAK,EAC3B,CAGA,OAAc,CACZ,KAAK,OAAO,QAAS/B,GAAOA,EAAE,IAAY,QAAQ,CAAC,EAC9C,KAAK,OAAO,CACnB,CAGA,SAASgC,EAAoB,CAC3B,IAAM5B,EAAO,KAAK,IAAI,aAAe,KAAK,IAAI,UAAU,CAAC,GAAKL,EAAW,KAAK,IAAI,QAAQ,CAAC,CAAC,EAAE,MAC7F,KAAK,OAAO,KAAMC,GAAMA,EAAE,IAAI,OAASI,CAAI,GAAG,KAAa,WAAW4B,CAAI,CAC7E,CAEA,cAAwB,CACtB,OAAO,KAAK,KAAK,aAAa,CAChC,CACA,SAAgB,CACd,OAAO,KAAK,IACd,CACA,UAAuB,CACrB,OAAO,KAAK,KACd,CACS,OAAc,EACpB,KAAK,OAAO,CAAC,GAAG,KAAO,KAAK,MAAM,MAAM,CAC3C,CACF,EACAC,EAAS,aAAcnB,CAAU",
6
+ "names": ["filterInfo", "f", "Component", "defs", "registerLookup", "name", "def", "resolveLookup", "lookup", "d", "lookupStore", "textual", "type", "blank", "v", "SearchGrid", "h", "btns", "Button", "t", "cfg", "_o", "_f", "fieldCfg", "cmp", "create", "b", "Grid", "recs", "c", "field", "query", "specs", "text", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as d}from"./chunk-Z6HZY2YG.js";import{a as m}from"./chunk-LHWY6G6Q.js";import{a as x}from"./chunk-AQ3RTHG5.js";import{d as p}from"./chunk-DIOJGTUN.js";import{c}from"./chunk-BQEFLPDA.js";import{f as r}from"./chunk-S4QD5NID.js";function s(t){return new Promise(e=>{let a=!1,l=o=>{a||(a=!0,e(o))},i=t.input?new m({value:t.input.value??"",placeholder:t.input.placeholder,validators:t.input.validators,ariaLabel:t.text}):void 0,u=new x({text:t.text,flex:1}),n=new d({title:t.title,cls:"op-messagebox",closeAction:"destroy",mask:t.mask??!1,autoFocus:!!t.input?.autoFocus,items:[new c({layout:{type:"hbox",gap:12,align:"flex-start"},items:[...t.icon?[new p({name:t.icon,cls:"op-messagebox__icon"})]:[],new c({layout:{type:"vbox"},flex:1,items:[u,...i?[i]:[]]})]})],buttons:t.buttons.map(o=>({text:o.text,variant:o.variant??"default",handler:()=>{t.beforeClose?.(o.id,n,i)!==!1&&(l(o.id),n.close())}}))});n.el.setAttribute("role",t.input?"dialog":"alertdialog"),n.el.setAttribute("aria-describedby",u.id),n.on("close",()=>l(t.cancelId??t.buttons[t.buttons.length-1].id));let g=t.buttons.find(o=>o.variant==="primary"||o.variant==="danger");i?.on("enter",()=>n.el.querySelectorAll(".op-panel__footer button")[t.buttons.indexOf(g??t.buttons[0])].click()),n.show(),i||n.el.querySelector(".op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger")?.focus()})}var b={show:s,async alert(t,e={}){await s({text:t,title:e.title,mask:e.mask,icon:e.icon??"info",buttons:[{id:"ok",text:e.okText??r("ok"),variant:"primary"}],cancelId:"ok"})},async confirm(t,e={}){return await s({text:t,title:e.title,mask:e.mask,icon:e.icon??(e.danger?"alert":"info"),buttons:[{id:"cancel",text:e.cancelText??r("cancel")},{id:"ok",text:e.okText??r("ok"),variant:e.danger?"danger":"primary"}],cancelId:"cancel"})==="ok"},async prompt(t,e={}){let a=null;return await s({text:t,title:e.title,mask:e.mask,input:{value:e.value,placeholder:e.placeholder,validators:e.validators,autoFocus:e.autoFocus},buttons:[{id:"cancel",text:e.cancelText??r("cancel")},{id:"ok",text:e.okText??r("ok"),variant:"primary"}],cancelId:"cancel",beforeClose:(i,u,n)=>{if(i==="ok"){if(!n.validate())return!1;a=n.getValue()}}})==="ok"?a:null}};d.ask=(t,e)=>b.confirm(t,{danger:!0,...e});export{b as a};
2
+ //# sourceMappingURL=chunk-JBOKM5YA.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/components/overlays/messagebox/messagebox.ts"],
4
- "sourcesContent": ["import { Window } from '../window/window';\nimport { Label } from '../../base/label/label';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Container } from '../../../core/container';\nimport { Icon } from '../../base/icon/icon';\nimport { t } from '../../../core/i18n';\nimport type { Validator } from '../../../core/validators';\n\nexport interface MessageBoxButton {\n id: string;\n text: string;\n variant?: 'default' | 'primary' | 'danger';\n}\n\nexport interface MessageBoxConfig {\n text: string;\n title?: string;\n icon?: string;\n buttons: MessageBoxButton[];\n /** Resolved when closed with Esc or the close button. */\n cancelId?: string;\n /** Adds a text input; `show` then resolves with the button id and the input is read by `prompt`. */\n input?: { value?: string; placeholder?: string; validators?: Validator<string>[]; autoFocus?: boolean };\n /** Called with the pressed button id before closing; return `false` to keep the dialog open. */\n beforeClose?: (id: string, win: Window, input?: TextField) => boolean | void;\n /** Dim the page behind. Default false: a message is still modal, but it does not darken the screen. */\n mask?: boolean;\n}\n\nfunction open(cfg: MessageBoxConfig): Promise<string> {\n return new Promise((resolve) => {\n let done = false;\n const finish = (id: string) => {\n if (done) return;\n done = true;\n resolve(id);\n };\n const field = cfg.input ? new TextField({ value: cfg.input.value ?? '', placeholder: cfg.input.placeholder, validators: cfg.input.validators, ariaLabel: cfg.text }) : undefined;\n const message = new Label({ text: cfg.text, flex: 1 });\n const win: Window = new Window({\n title: cfg.title,\n cls: 'op-messagebox',\n closeAction: 'destroy',\n mask: cfg.mask ?? false,\n autoFocus: !!cfg.input?.autoFocus,\n items: [\n new Container({\n layout: { type: 'hbox', gap: 12, align: 'flex-start' },\n items: [...(cfg.icon ? [new Icon({ name: cfg.icon, cls: 'op-messagebox__icon' })] : []), new Container({ layout: { type: 'vbox' }, flex: 1, items: [message, ...(field ? [field] : [])] })],\n }),\n ],\n buttons: cfg.buttons.map((b) => ({\n text: b.text,\n variant: b.variant ?? 'default',\n handler: () => {\n if (cfg.beforeClose?.(b.id, win, field) === false) return;\n finish(b.id);\n win.close();\n },\n })),\n });\n win.el.setAttribute('role', cfg.input ? 'dialog' : 'alertdialog');\n win.el.setAttribute('aria-describedby', message.id);\n win.on('close', () => finish(cfg.cancelId ?? cfg.buttons[cfg.buttons.length - 1].id));\n const primary = cfg.buttons.find((b) => b.variant === 'primary' || b.variant === 'danger');\n field?.on('enter', () => (win.el.querySelectorAll('.op-panel__footer button')[cfg.buttons.indexOf(primary ?? cfg.buttons[0])] as HTMLElement).click());\n win.show();\n // the primary action takes the initial focus unless there is an input\n if (!field) win.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger')?.focus();\n });\n}\n\nexport interface AlertOptions {\n title?: string;\n mask?: boolean;\n okText?: string;\n icon?: string;\n}\nexport interface ConfirmOptions {\n title?: string;\n mask?: boolean;\n okText?: string;\n cancelText?: string;\n danger?: boolean;\n icon?: string;\n}\nexport interface PromptOptions {\n title?: string;\n mask?: boolean;\n value?: string;\n placeholder?: string;\n okText?: string;\n cancelText?: string;\n validators?: Validator<string>[];\n /** Focus the text field on open (a phone keyboard pops up). Default false: the dialog gets the focus. */\n autoFocus?: boolean;\n}\n\nexport const MessageBox = {\n show: open,\n\n async alert(text: string, o: AlertOptions = {}): Promise<void> {\n await open({ text, title: o.title, mask: o.mask, icon: o.icon ?? 'info', buttons: [{ id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' }], cancelId: 'ok' });\n },\n\n async confirm(text: string, o: ConfirmOptions = {}): Promise<boolean> {\n const id = await open({\n text,\n title: o.title,\n mask: o.mask,\n icon: o.icon ?? (o.danger ? 'alert' : 'info'),\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: o.danger ? 'danger' : 'primary' },\n ],\n cancelId: 'cancel',\n });\n return id === 'ok';\n },\n\n /** Resolves with the text, or `null` when cancelled. The dialog stays open while the validators fail. */\n async prompt(text: string, o: PromptOptions = {}): Promise<string | null> {\n let value: string | null = null;\n const id = await open({\n text,\n title: o.title,\n mask: o.mask,\n input: { value: o.value, placeholder: o.placeholder, validators: o.validators, autoFocus: o.autoFocus },\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' },\n ],\n cancelId: 'cancel',\n beforeClose: (btn, _win, field) => {\n if (btn !== 'ok') return;\n if (!field!.validate()) return false;\n value = field!.getValue();\n },\n });\n return id === 'ok' ? value : null;\n },\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Window } from '../window/window';\nimport { Label } from '../../base/label/label';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Container } from '../../../core/container';\nimport { Icon } from '../../base/icon/icon';\nimport { t } from '../../../core/i18n';\nimport type { Validator } from '../../../core/validators';\n\nexport interface MessageBoxButton {\n id: string;\n text: string;\n variant?: 'default' | 'primary' | 'danger';\n}\n\nexport interface MessageBoxConfig {\n text: string;\n title?: string;\n icon?: string;\n buttons: MessageBoxButton[];\n /** Resolved when closed with Esc or the close button. */\n cancelId?: string;\n /** Adds a text input; `show` then resolves with the button id and the input is read by `prompt`. */\n input?: { value?: string; placeholder?: string; validators?: Validator<string>[]; autoFocus?: boolean };\n /** Called with the pressed button id before closing; return `false` to keep the dialog open. */\n beforeClose?: (id: string, win: Window, input?: TextField) => boolean | void;\n /** Dim the page behind. Default false: a message is still modal, but it does not darken the screen. */\n mask?: boolean;\n}\n\nfunction open(cfg: MessageBoxConfig): Promise<string> {\n return new Promise((resolve) => {\n let done = false;\n const finish = (id: string) => {\n if (done) return;\n done = true;\n resolve(id);\n };\n const field = cfg.input ? new TextField({ value: cfg.input.value ?? '', placeholder: cfg.input.placeholder, validators: cfg.input.validators, ariaLabel: cfg.text }) : undefined;\n const message = new Label({ text: cfg.text, flex: 1 });\n const win: Window = new Window({\n title: cfg.title,\n cls: 'op-messagebox',\n closeAction: 'destroy',\n mask: cfg.mask ?? false,\n autoFocus: !!cfg.input?.autoFocus,\n items: [\n new Container({\n layout: { type: 'hbox', gap: 12, align: 'flex-start' },\n items: [...(cfg.icon ? [new Icon({ name: cfg.icon, cls: 'op-messagebox__icon' })] : []), new Container({ layout: { type: 'vbox' }, flex: 1, items: [message, ...(field ? [field] : [])] })],\n }),\n ],\n buttons: cfg.buttons.map((b) => ({\n text: b.text,\n variant: b.variant ?? 'default',\n handler: () => {\n if (cfg.beforeClose?.(b.id, win, field) === false) return;\n finish(b.id);\n win.close();\n },\n })),\n });\n win.el.setAttribute('role', cfg.input ? 'dialog' : 'alertdialog');\n win.el.setAttribute('aria-describedby', message.id);\n win.on('close', () => finish(cfg.cancelId ?? cfg.buttons[cfg.buttons.length - 1].id));\n const primary = cfg.buttons.find((b) => b.variant === 'primary' || b.variant === 'danger');\n field?.on('enter', () => (win.el.querySelectorAll('.op-panel__footer button')[cfg.buttons.indexOf(primary ?? cfg.buttons[0])] as HTMLElement).click());\n win.show();\n // the primary action takes the initial focus unless there is an input\n if (!field) win.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger')?.focus();\n });\n}\n\nexport interface AlertOptions {\n title?: string;\n mask?: boolean;\n okText?: string;\n icon?: string;\n}\nexport interface ConfirmOptions {\n title?: string;\n mask?: boolean;\n okText?: string;\n cancelText?: string;\n danger?: boolean;\n icon?: string;\n}\nexport interface PromptOptions {\n title?: string;\n mask?: boolean;\n value?: string;\n placeholder?: string;\n okText?: string;\n cancelText?: string;\n validators?: Validator<string>[];\n /** Focus the text field on open (a phone keyboard pops up). Default false: the dialog gets the focus. */\n autoFocus?: boolean;\n}\n\nexport const MessageBox = {\n show: open,\n\n async alert(text: string, o: AlertOptions = {}): Promise<void> {\n await open({ text, title: o.title, mask: o.mask, icon: o.icon ?? 'info', buttons: [{ id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' }], cancelId: 'ok' });\n },\n\n async confirm(text: string, o: ConfirmOptions = {}): Promise<boolean> {\n const id = await open({\n text,\n title: o.title,\n mask: o.mask,\n icon: o.icon ?? (o.danger ? 'alert' : 'info'),\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: o.danger ? 'danger' : 'primary' },\n ],\n cancelId: 'cancel',\n });\n return id === 'ok';\n },\n\n /** Resolves with the text, or `null` when cancelled. The dialog stays open while the validators fail. */\n async prompt(text: string, o: PromptOptions = {}): Promise<string | null> {\n let value: string | null = null;\n const id = await open({\n text,\n title: o.title,\n mask: o.mask,\n input: { value: o.value, placeholder: o.placeholder, validators: o.validators, autoFocus: o.autoFocus },\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' },\n ],\n cancelId: 'cancel',\n beforeClose: (btn, _win, field) => {\n if (btn !== 'ok') return;\n if (!field!.validate()) return false;\n value = field!.getValue();\n },\n });\n return id === 'ok' ? value : null;\n },\n};\n\nWindow.ask = (text, o) => MessageBox.confirm(text, { danger: true, ...o });\n"],
5
+ "mappings": "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",
6
6
  "names": ["open", "cfg", "resolve", "done", "finish", "id", "field", "TextField", "message", "Label", "win", "Window", "Container", "Icon", "b", "primary", "MessageBox", "text", "o", "t", "value", "btn", "_win"]
7
7
  }
@@ -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