@modern-admin/web 0.2.0 → 0.3.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 (345) hide show
  1. package/LICENSE +21 -0
  2. package/dist/lib/app.d.ts +1 -0
  3. package/dist/lib/app.d.ts.map +1 -0
  4. package/dist/lib/index.d.ts +1 -0
  5. package/dist/lib/index.d.ts.map +1 -0
  6. package/dist/lib/index.js.map +1 -1
  7. package/dist/lib/mount.d.ts +1 -0
  8. package/dist/lib/mount.d.ts.map +1 -0
  9. package/dist/lib/runtime-config.d.ts +1 -0
  10. package/dist/lib/runtime-config.d.ts.map +1 -0
  11. package/dist/standalone/assets/ai-assistant-widget-laqH_9UQ.js +2 -0
  12. package/dist/standalone/assets/ai-assistant-widget-laqH_9UQ.js.br +0 -0
  13. package/dist/standalone/assets/ai-assistant-widget-laqH_9UQ.js.gz +0 -0
  14. package/dist/standalone/assets/ai-assistant-widget-laqH_9UQ.js.map +1 -0
  15. package/dist/standalone/assets/audit-log-page-3t8elFPn.js +2 -0
  16. package/dist/standalone/assets/audit-log-page-3t8elFPn.js.br +0 -0
  17. package/dist/standalone/assets/audit-log-page-3t8elFPn.js.gz +0 -0
  18. package/dist/standalone/assets/{audit-log-page-BtQee6RK.js.map → audit-log-page-3t8elFPn.js.map} +1 -1
  19. package/dist/standalone/assets/badge-6nyM5Jft.js +2 -0
  20. package/dist/standalone/assets/{badge-54ntzaYc.js.map → badge-6nyM5Jft.js.map} +1 -1
  21. package/dist/standalone/assets/{bot-Ct10WUaE.js → bot-DFDgGfNj.js} +2 -2
  22. package/dist/standalone/assets/{bot-Ct10WUaE.js.map → bot-DFDgGfNj.js.map} +1 -1
  23. package/dist/standalone/assets/calendar-C1Ecnytz.js +2 -0
  24. package/dist/standalone/assets/calendar-C1Ecnytz.js.br +0 -0
  25. package/dist/standalone/assets/calendar-C1Ecnytz.js.gz +0 -0
  26. package/dist/standalone/assets/calendar-C1Ecnytz.js.map +1 -0
  27. package/dist/standalone/assets/card-4cS4uWCP.js +2 -0
  28. package/dist/standalone/assets/card-4cS4uWCP.js.br +0 -0
  29. package/dist/standalone/assets/card-4cS4uWCP.js.gz +0 -0
  30. package/dist/standalone/assets/{card-BxVP8OBf.js.map → card-4cS4uWCP.js.map} +1 -1
  31. package/dist/standalone/assets/chart-widget-1GPloJY4.js +60 -0
  32. package/dist/standalone/assets/chart-widget-1GPloJY4.js.br +0 -0
  33. package/dist/standalone/assets/chart-widget-1GPloJY4.js.gz +0 -0
  34. package/dist/standalone/assets/chart-widget-1GPloJY4.js.map +1 -0
  35. package/dist/standalone/assets/chevrons-up-down-BHCs46XQ.js +2 -0
  36. package/dist/standalone/assets/chevrons-up-down-BHCs46XQ.js.map +1 -0
  37. package/dist/standalone/assets/{clock-iyXvoRDc.js → clock-OCmX6DtA.js} +2 -2
  38. package/dist/standalone/assets/{clock-iyXvoRDc.js.map → clock-OCmX6DtA.js.map} +1 -1
  39. package/dist/standalone/assets/command-C1FjGx6t.js +2 -0
  40. package/dist/standalone/assets/command-C1FjGx6t.js.br +0 -0
  41. package/dist/standalone/assets/command-C1FjGx6t.js.gz +0 -0
  42. package/dist/standalone/assets/{command-BPNCtx-E.js.map → command-C1FjGx6t.js.map} +1 -1
  43. package/dist/standalone/assets/copy-BexCWf4U.js +2 -0
  44. package/dist/standalone/assets/copy-BexCWf4U.js.map +1 -0
  45. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js +2 -0
  46. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.br +0 -0
  47. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.gz +0 -0
  48. package/dist/standalone/assets/{createLucideIcon-DSvTabTT.js.map → createLucideIcon-CUopU_LC.js.map} +1 -1
  49. package/dist/standalone/assets/date-picker-DVnnp1Ez.js +2 -0
  50. package/dist/standalone/assets/date-picker-DVnnp1Ez.js.br +0 -0
  51. package/dist/standalone/assets/date-picker-DVnnp1Ez.js.gz +0 -0
  52. package/dist/standalone/assets/date-picker-DVnnp1Ez.js.map +1 -0
  53. package/dist/standalone/assets/dist-CvKz-wgE.js +2 -0
  54. package/dist/standalone/assets/dist-CvKz-wgE.js.br +0 -0
  55. package/dist/standalone/assets/dist-CvKz-wgE.js.gz +0 -0
  56. package/dist/standalone/assets/dist-CvKz-wgE.js.map +1 -0
  57. package/dist/standalone/assets/dist-Dpg8xy_r.js +2 -0
  58. package/dist/standalone/assets/dist-Dpg8xy_r.js.br +0 -0
  59. package/dist/standalone/assets/dist-Dpg8xy_r.js.gz +0 -0
  60. package/dist/standalone/assets/dist-Dpg8xy_r.js.map +1 -0
  61. package/dist/standalone/assets/dist-DuSTm0pk.js +2 -0
  62. package/dist/standalone/assets/dist-DuSTm0pk.js.br +0 -0
  63. package/dist/standalone/assets/dist-DuSTm0pk.js.gz +0 -0
  64. package/dist/standalone/assets/dist-DuSTm0pk.js.map +1 -0
  65. package/dist/standalone/assets/edit-page-DFmI1Ckp.js +2 -0
  66. package/dist/standalone/assets/edit-page-DFmI1Ckp.js.br +0 -0
  67. package/dist/standalone/assets/edit-page-DFmI1Ckp.js.gz +0 -0
  68. package/dist/standalone/assets/edit-page-DFmI1Ckp.js.map +1 -0
  69. package/dist/standalone/assets/empty-D9nNJb_Y.js +2 -0
  70. package/dist/standalone/assets/empty-D9nNJb_Y.js.br +0 -0
  71. package/dist/standalone/assets/empty-D9nNJb_Y.js.gz +0 -0
  72. package/dist/standalone/assets/empty-D9nNJb_Y.js.map +1 -0
  73. package/dist/standalone/assets/{file-text-Cq--5mhO.js → file-text-CcLZq8HA.js} +2 -2
  74. package/dist/standalone/assets/{file-text-Cq--5mhO.js.map → file-text-CcLZq8HA.js.map} +1 -1
  75. package/dist/standalone/assets/{folder-symlink-DjXnrBKd.js → folder-plus-DebVc0CA.js} +2 -2
  76. package/dist/standalone/assets/folder-plus-DebVc0CA.js.br +0 -0
  77. package/dist/standalone/assets/folder-plus-DebVc0CA.js.gz +0 -0
  78. package/dist/standalone/assets/folder-plus-DebVc0CA.js.map +1 -0
  79. package/dist/standalone/assets/folder-symlink-iMRmgjVt.js +2 -0
  80. package/dist/standalone/assets/folder-symlink-iMRmgjVt.js.map +1 -0
  81. package/dist/standalone/assets/global-search-dialog--zUHqLIo.js +2 -0
  82. package/dist/standalone/assets/global-search-dialog--zUHqLIo.js.br +0 -0
  83. package/dist/standalone/assets/global-search-dialog--zUHqLIo.js.gz +0 -0
  84. package/dist/standalone/assets/global-search-dialog--zUHqLIo.js.map +1 -0
  85. package/dist/standalone/assets/heavy-fields-Ctx9uZME.js +181 -0
  86. package/dist/standalone/assets/heavy-fields-Ctx9uZME.js.br +0 -0
  87. package/dist/standalone/assets/heavy-fields-Ctx9uZME.js.gz +0 -0
  88. package/dist/standalone/assets/heavy-fields-Ctx9uZME.js.map +1 -0
  89. package/dist/standalone/assets/home-page-B1hrpu2S.js +3 -0
  90. package/dist/standalone/assets/home-page-B1hrpu2S.js.br +0 -0
  91. package/dist/standalone/assets/home-page-B1hrpu2S.js.gz +0 -0
  92. package/dist/standalone/assets/home-page-B1hrpu2S.js.map +1 -0
  93. package/dist/standalone/assets/icon-registry-BBZirLGp.js +2 -0
  94. package/dist/standalone/assets/icon-registry-BBZirLGp.js.br +0 -0
  95. package/dist/standalone/assets/icon-registry-BBZirLGp.js.gz +0 -0
  96. package/dist/standalone/assets/icon-registry-BBZirLGp.js.map +1 -0
  97. package/dist/standalone/assets/index-CU0xv21_.css +2 -0
  98. package/dist/standalone/assets/index-CU0xv21_.css.br +0 -0
  99. package/dist/standalone/assets/index-CU0xv21_.css.gz +0 -0
  100. package/dist/standalone/assets/index-Ldci8MK5.js +15 -0
  101. package/dist/standalone/assets/index-Ldci8MK5.js.br +0 -0
  102. package/dist/standalone/assets/index-Ldci8MK5.js.gz +0 -0
  103. package/dist/standalone/assets/index-Ldci8MK5.js.map +1 -0
  104. package/dist/standalone/assets/info-CGVdWTj1.js +2 -0
  105. package/dist/standalone/assets/info-CGVdWTj1.js.map +1 -0
  106. package/dist/standalone/assets/json-editor-DwQqN8OM.js +2 -0
  107. package/dist/standalone/assets/json-editor-DwQqN8OM.js.br +0 -0
  108. package/dist/standalone/assets/json-editor-DwQqN8OM.js.gz +0 -0
  109. package/dist/standalone/assets/{json-editor---0NDBfO.js.map → json-editor-DwQqN8OM.js.map} +1 -1
  110. package/dist/standalone/assets/{key-BKtcci8w.js → key-lbuX0yk_.js} +2 -2
  111. package/dist/standalone/assets/{key-BKtcci8w.js.map → key-lbuX0yk_.js.map} +1 -1
  112. package/dist/standalone/assets/{key-round-xzeQg3wM.js → key-round-CQLp1Ua9.js} +2 -2
  113. package/dist/standalone/assets/{key-round-xzeQg3wM.js.map → key-round-CQLp1Ua9.js.map} +1 -1
  114. package/dist/standalone/assets/{minimize-2-Cvf27CGa.js → minimize-2-Bx2cH_WS.js} +2 -2
  115. package/dist/standalone/assets/{minimize-2-Cvf27CGa.js.map → minimize-2-Bx2cH_WS.js.map} +1 -1
  116. package/dist/standalone/assets/{pencil-C8qbfxd_.js → pencil-BO-k3yTG.js} +2 -2
  117. package/dist/standalone/assets/{pencil-C8qbfxd_.js.map → pencil-BO-k3yTG.js.map} +1 -1
  118. package/dist/standalone/assets/plus-Dk-FzitW.js +2 -0
  119. package/dist/standalone/assets/{plus-B8nFUPu-.js.map → plus-Dk-FzitW.js.map} +1 -1
  120. package/dist/standalone/assets/property-renderer-BogzDKIK.js +7 -0
  121. package/dist/standalone/assets/property-renderer-BogzDKIK.js.br +0 -0
  122. package/dist/standalone/assets/property-renderer-BogzDKIK.js.gz +0 -0
  123. package/dist/standalone/assets/property-renderer-BogzDKIK.js.map +1 -0
  124. package/dist/standalone/assets/reference-053-L2WD.js +2 -0
  125. package/dist/standalone/assets/reference-053-L2WD.js.br +0 -0
  126. package/dist/standalone/assets/reference-053-L2WD.js.gz +0 -0
  127. package/dist/standalone/assets/reference-053-L2WD.js.map +1 -0
  128. package/dist/standalone/assets/refresh-cw-Dz19XR6g.js +2 -0
  129. package/dist/standalone/assets/refresh-cw-Dz19XR6g.js.map +1 -0
  130. package/dist/standalone/assets/revisions-button-B4wc6uYi.js +2 -0
  131. package/dist/standalone/assets/revisions-button-B4wc6uYi.js.br +0 -0
  132. package/dist/standalone/assets/revisions-button-B4wc6uYi.js.gz +0 -0
  133. package/dist/standalone/assets/revisions-button-B4wc6uYi.js.map +1 -0
  134. package/dist/standalone/assets/richtext-render-DnVcQ34I.js +67 -0
  135. package/dist/standalone/assets/richtext-render-DnVcQ34I.js.br +0 -0
  136. package/dist/standalone/assets/richtext-render-DnVcQ34I.js.gz +0 -0
  137. package/dist/standalone/assets/richtext-render-DnVcQ34I.js.map +1 -0
  138. package/dist/standalone/assets/{rotate-ccw-C16vh2yh.js → rotate-ccw-BLr0QLAg.js} +2 -2
  139. package/dist/standalone/assets/{rotate-ccw-C16vh2yh.js.map → rotate-ccw-BLr0QLAg.js.map} +1 -1
  140. package/dist/standalone/assets/router-CT00z_xv.js +186 -0
  141. package/dist/standalone/assets/router-CT00z_xv.js.br +0 -0
  142. package/dist/standalone/assets/router-CT00z_xv.js.gz +0 -0
  143. package/dist/standalone/assets/router-CT00z_xv.js.map +1 -0
  144. package/dist/standalone/assets/{save-CNS0Z8lH.js → save-Cd3oR3Sj.js} +2 -2
  145. package/dist/standalone/assets/{save-CNS0Z8lH.js.map → save-Cd3oR3Sj.js.map} +1 -1
  146. package/dist/standalone/assets/schemas-twnCb1uT.js +65 -0
  147. package/dist/standalone/assets/schemas-twnCb1uT.js.br +0 -0
  148. package/dist/standalone/assets/schemas-twnCb1uT.js.gz +0 -0
  149. package/dist/standalone/assets/schemas-twnCb1uT.js.map +1 -0
  150. package/dist/standalone/assets/select-B6fxO2bI.js +2 -0
  151. package/dist/standalone/assets/select-B6fxO2bI.js.br +0 -0
  152. package/dist/standalone/assets/select-B6fxO2bI.js.gz +0 -0
  153. package/dist/standalone/assets/select-B6fxO2bI.js.map +1 -0
  154. package/dist/standalone/assets/{send-D2cpsjJz.js → send-D4KHQGYj.js} +2 -2
  155. package/dist/standalone/assets/{send-D2cpsjJz.js.map → send-D4KHQGYj.js.map} +1 -1
  156. package/dist/standalone/assets/settings-page-BRhIGsdX.js +2 -0
  157. package/dist/standalone/assets/settings-page-BRhIGsdX.js.br +0 -0
  158. package/dist/standalone/assets/settings-page-BRhIGsdX.js.gz +0 -0
  159. package/dist/standalone/assets/{settings-page-DvTdKBLt.js.map → settings-page-BRhIGsdX.js.map} +1 -1
  160. package/dist/standalone/assets/show-page-BJt9Kmdd.js +2 -0
  161. package/dist/standalone/assets/show-page-BJt9Kmdd.js.br +0 -0
  162. package/dist/standalone/assets/show-page-BJt9Kmdd.js.gz +0 -0
  163. package/dist/standalone/assets/{show-page-GmBctL2E.js.map → show-page-BJt9Kmdd.js.map} +1 -1
  164. package/dist/standalone/assets/{sparkles-D68Upt7w.js → sparkles-CqF0zjrF.js} +2 -2
  165. package/dist/standalone/assets/{sparkles-D68Upt7w.js.map → sparkles-CqF0zjrF.js.map} +1 -1
  166. package/dist/standalone/assets/square-pen-DGT7ekeJ.js +2 -0
  167. package/dist/standalone/assets/square-pen-DGT7ekeJ.js.map +1 -0
  168. package/dist/standalone/assets/tabs-BgR4QuFh.js +2 -0
  169. package/dist/standalone/assets/tabs-BgR4QuFh.js.br +0 -0
  170. package/dist/standalone/assets/tabs-BgR4QuFh.js.gz +0 -0
  171. package/dist/standalone/assets/tabs-BgR4QuFh.js.map +1 -0
  172. package/dist/standalone/assets/textarea-CX_0QVSz.js +2 -0
  173. package/dist/standalone/assets/{textarea-psdsvUNK.js.map → textarea-CX_0QVSz.js.map} +1 -1
  174. package/dist/standalone/assets/{trash-2-BXceFzA_.js → trash-2-DhyKQCKv.js} +2 -2
  175. package/dist/standalone/assets/{trash-2-BXceFzA_.js.map → trash-2-DhyKQCKv.js.map} +1 -1
  176. package/dist/standalone/assets/triangle-alert-CyaaNWN8.js +2 -0
  177. package/dist/standalone/assets/triangle-alert-CyaaNWN8.js.map +1 -0
  178. package/dist/standalone/assets/{undo-2-Bub1b-WC.js → undo-2-DlSB-5DM.js} +2 -2
  179. package/dist/standalone/assets/undo-2-DlSB-5DM.js.br +0 -0
  180. package/dist/standalone/assets/undo-2-DlSB-5DM.js.gz +0 -0
  181. package/dist/standalone/assets/{undo-2-Bub1b-WC.js.map → undo-2-DlSB-5DM.js.map} +1 -1
  182. package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js +2 -0
  183. package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js.br +0 -0
  184. package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js.gz +0 -0
  185. package/dist/standalone/assets/use-dashboard-charts-CkpsFXxZ.js.map +1 -0
  186. package/dist/standalone/assets/useQueries-BblIcy3I.js +2 -0
  187. package/dist/standalone/assets/useQueries-BblIcy3I.js.br +0 -0
  188. package/dist/standalone/assets/useQueries-BblIcy3I.js.gz +0 -0
  189. package/dist/standalone/assets/useQueries-BblIcy3I.js.map +1 -0
  190. package/dist/standalone/assets/user-directory-bre0Sulk.js +5 -0
  191. package/dist/standalone/assets/user-directory-bre0Sulk.js.br +0 -0
  192. package/dist/standalone/assets/user-directory-bre0Sulk.js.gz +0 -0
  193. package/dist/standalone/assets/user-directory-bre0Sulk.js.map +1 -0
  194. package/dist/standalone/assets/uuid-DLSnbsz2.js +2 -0
  195. package/dist/standalone/assets/uuid-DLSnbsz2.js.map +1 -0
  196. package/dist/standalone/assets/{wand-sparkles-ChJCPtl2.js → wand-sparkles-BDM69Lk9.js} +2 -2
  197. package/dist/standalone/assets/{wand-sparkles-ChJCPtl2.js.map → wand-sparkles-BDM69Lk9.js.map} +1 -1
  198. package/dist/standalone/assets/with-selector-NDLhu4dT.js +2 -0
  199. package/dist/standalone/assets/with-selector-NDLhu4dT.js.br +0 -0
  200. package/dist/standalone/assets/with-selector-NDLhu4dT.js.gz +0 -0
  201. package/dist/standalone/assets/with-selector-NDLhu4dT.js.map +1 -0
  202. package/dist/standalone/assets/wizard-create-page-3rZPPXLK.js +2 -0
  203. package/dist/standalone/assets/wizard-create-page-3rZPPXLK.js.br +0 -0
  204. package/dist/standalone/assets/wizard-create-page-3rZPPXLK.js.gz +0 -0
  205. package/dist/standalone/assets/{wizard-create-page-CDXQplgD.js.map → wizard-create-page-3rZPPXLK.js.map} +1 -1
  206. package/dist/standalone/assets/x-C3kLunD6.js +2 -0
  207. package/dist/standalone/assets/x-C3kLunD6.js.map +1 -0
  208. package/dist/standalone/assets/{zap-CFqoI4XA.js → zap-DIzIW2MP.js} +2 -2
  209. package/dist/standalone/assets/zap-DIzIW2MP.js.br +0 -0
  210. package/dist/standalone/assets/zap-DIzIW2MP.js.gz +0 -0
  211. package/dist/standalone/assets/{zap-CFqoI4XA.js.map → zap-DIzIW2MP.js.map} +1 -1
  212. package/dist/standalone/assets/zod-BVYoAymF.js +2 -0
  213. package/dist/standalone/assets/zod-BVYoAymF.js.br +0 -0
  214. package/dist/standalone/assets/zod-BVYoAymF.js.gz +0 -0
  215. package/dist/standalone/assets/zod-BVYoAymF.js.map +1 -0
  216. package/dist/standalone/index.html +12 -7
  217. package/dist/standalone/index.html.br +0 -0
  218. package/dist/standalone/index.html.gz +0 -0
  219. package/package.json +7 -6
  220. package/tsconfig.json +1 -1
  221. package/dist/standalone/assets/ai-assistant-widget-DbUtIE-Q.js +0 -2
  222. package/dist/standalone/assets/ai-assistant-widget-DbUtIE-Q.js.br +0 -0
  223. package/dist/standalone/assets/ai-assistant-widget-DbUtIE-Q.js.gz +0 -0
  224. package/dist/standalone/assets/ai-assistant-widget-DbUtIE-Q.js.map +0 -1
  225. package/dist/standalone/assets/audit-log-page-BtQee6RK.js +0 -2
  226. package/dist/standalone/assets/audit-log-page-BtQee6RK.js.br +0 -0
  227. package/dist/standalone/assets/audit-log-page-BtQee6RK.js.gz +0 -0
  228. package/dist/standalone/assets/badge-54ntzaYc.js +0 -2
  229. package/dist/standalone/assets/badge-54ntzaYc.js.br +0 -0
  230. package/dist/standalone/assets/badge-54ntzaYc.js.gz +0 -0
  231. package/dist/standalone/assets/card-BxVP8OBf.js +0 -2
  232. package/dist/standalone/assets/card-BxVP8OBf.js.br +0 -0
  233. package/dist/standalone/assets/card-BxVP8OBf.js.gz +0 -0
  234. package/dist/standalone/assets/command-BPNCtx-E.js +0 -2
  235. package/dist/standalone/assets/command-BPNCtx-E.js.br +0 -0
  236. package/dist/standalone/assets/command-BPNCtx-E.js.gz +0 -0
  237. package/dist/standalone/assets/createLucideIcon-DSvTabTT.js +0 -2
  238. package/dist/standalone/assets/createLucideIcon-DSvTabTT.js.br +0 -0
  239. package/dist/standalone/assets/createLucideIcon-DSvTabTT.js.gz +0 -0
  240. package/dist/standalone/assets/edit-page-DkwyTF2U.js +0 -2
  241. package/dist/standalone/assets/edit-page-DkwyTF2U.js.br +0 -0
  242. package/dist/standalone/assets/edit-page-DkwyTF2U.js.gz +0 -0
  243. package/dist/standalone/assets/edit-page-DkwyTF2U.js.map +0 -1
  244. package/dist/standalone/assets/empty-l7xFD9xQ.js +0 -2
  245. package/dist/standalone/assets/empty-l7xFD9xQ.js.br +0 -0
  246. package/dist/standalone/assets/empty-l7xFD9xQ.js.gz +0 -0
  247. package/dist/standalone/assets/empty-l7xFD9xQ.js.map +0 -1
  248. package/dist/standalone/assets/folder-symlink-DjXnrBKd.js.br +0 -0
  249. package/dist/standalone/assets/folder-symlink-DjXnrBKd.js.gz +0 -0
  250. package/dist/standalone/assets/folder-symlink-DjXnrBKd.js.map +0 -1
  251. package/dist/standalone/assets/global-search-dialog-SZRMDtql.js +0 -2
  252. package/dist/standalone/assets/global-search-dialog-SZRMDtql.js.br +0 -0
  253. package/dist/standalone/assets/global-search-dialog-SZRMDtql.js.gz +0 -0
  254. package/dist/standalone/assets/global-search-dialog-SZRMDtql.js.map +0 -1
  255. package/dist/standalone/assets/heavy-fields-Duxqf7N5.js +0 -171
  256. package/dist/standalone/assets/heavy-fields-Duxqf7N5.js.br +0 -0
  257. package/dist/standalone/assets/heavy-fields-Duxqf7N5.js.gz +0 -0
  258. package/dist/standalone/assets/heavy-fields-Duxqf7N5.js.map +0 -1
  259. package/dist/standalone/assets/home-page-fboDuiaH.js +0 -37
  260. package/dist/standalone/assets/home-page-fboDuiaH.js.br +0 -0
  261. package/dist/standalone/assets/home-page-fboDuiaH.js.gz +0 -0
  262. package/dist/standalone/assets/home-page-fboDuiaH.js.map +0 -1
  263. package/dist/standalone/assets/icon-registry-B8k2fFeL.js +0 -2
  264. package/dist/standalone/assets/icon-registry-B8k2fFeL.js.br +0 -0
  265. package/dist/standalone/assets/icon-registry-B8k2fFeL.js.gz +0 -0
  266. package/dist/standalone/assets/icon-registry-B8k2fFeL.js.map +0 -1
  267. package/dist/standalone/assets/index-DWXKwSWo.css +0 -2
  268. package/dist/standalone/assets/index-DWXKwSWo.css.br +0 -0
  269. package/dist/standalone/assets/index-DWXKwSWo.css.gz +0 -0
  270. package/dist/standalone/assets/index-eVDAlr3Y.js +0 -209
  271. package/dist/standalone/assets/index-eVDAlr3Y.js.br +0 -0
  272. package/dist/standalone/assets/index-eVDAlr3Y.js.gz +0 -0
  273. package/dist/standalone/assets/index-eVDAlr3Y.js.map +0 -1
  274. package/dist/standalone/assets/info-wDXYBagh.js +0 -2
  275. package/dist/standalone/assets/info-wDXYBagh.js.map +0 -1
  276. package/dist/standalone/assets/json-editor---0NDBfO.js +0 -2
  277. package/dist/standalone/assets/json-editor---0NDBfO.js.br +0 -0
  278. package/dist/standalone/assets/json-editor---0NDBfO.js.gz +0 -0
  279. package/dist/standalone/assets/plus-B8nFUPu-.js +0 -2
  280. package/dist/standalone/assets/property-renderer-5cEDq-L-.js +0 -7
  281. package/dist/standalone/assets/property-renderer-5cEDq-L-.js.br +0 -0
  282. package/dist/standalone/assets/property-renderer-5cEDq-L-.js.gz +0 -0
  283. package/dist/standalone/assets/property-renderer-5cEDq-L-.js.map +0 -1
  284. package/dist/standalone/assets/reference-GI-LV5wm.js +0 -2
  285. package/dist/standalone/assets/reference-GI-LV5wm.js.br +0 -0
  286. package/dist/standalone/assets/reference-GI-LV5wm.js.gz +0 -0
  287. package/dist/standalone/assets/reference-GI-LV5wm.js.map +0 -1
  288. package/dist/standalone/assets/refresh-cw-DqhEKkOK.js +0 -2
  289. package/dist/standalone/assets/refresh-cw-DqhEKkOK.js.map +0 -1
  290. package/dist/standalone/assets/revisions-button-BjlTw0FI.js +0 -2
  291. package/dist/standalone/assets/revisions-button-BjlTw0FI.js.br +0 -0
  292. package/dist/standalone/assets/revisions-button-BjlTw0FI.js.gz +0 -0
  293. package/dist/standalone/assets/revisions-button-BjlTw0FI.js.map +0 -1
  294. package/dist/standalone/assets/richtext-render-Bqp34pmS.js +0 -66
  295. package/dist/standalone/assets/richtext-render-Bqp34pmS.js.br +0 -0
  296. package/dist/standalone/assets/richtext-render-Bqp34pmS.js.gz +0 -0
  297. package/dist/standalone/assets/richtext-render-Bqp34pmS.js.map +0 -1
  298. package/dist/standalone/assets/rolldown-runtime-S-ySWqyJ.js +0 -1
  299. package/dist/standalone/assets/select-ZdIYBmRV.js +0 -2
  300. package/dist/standalone/assets/select-ZdIYBmRV.js.br +0 -0
  301. package/dist/standalone/assets/select-ZdIYBmRV.js.gz +0 -0
  302. package/dist/standalone/assets/select-ZdIYBmRV.js.map +0 -1
  303. package/dist/standalone/assets/settings-page-DvTdKBLt.js +0 -2
  304. package/dist/standalone/assets/settings-page-DvTdKBLt.js.br +0 -0
  305. package/dist/standalone/assets/settings-page-DvTdKBLt.js.gz +0 -0
  306. package/dist/standalone/assets/show-page-GmBctL2E.js +0 -2
  307. package/dist/standalone/assets/show-page-GmBctL2E.js.br +0 -0
  308. package/dist/standalone/assets/show-page-GmBctL2E.js.gz +0 -0
  309. package/dist/standalone/assets/src-dpVDMS9j.js +0 -65
  310. package/dist/standalone/assets/src-dpVDMS9j.js.br +0 -0
  311. package/dist/standalone/assets/src-dpVDMS9j.js.gz +0 -0
  312. package/dist/standalone/assets/src-dpVDMS9j.js.map +0 -1
  313. package/dist/standalone/assets/tabs-BGAJ-7kY.js +0 -2
  314. package/dist/standalone/assets/tabs-BGAJ-7kY.js.br +0 -0
  315. package/dist/standalone/assets/tabs-BGAJ-7kY.js.gz +0 -0
  316. package/dist/standalone/assets/tabs-BGAJ-7kY.js.map +0 -1
  317. package/dist/standalone/assets/textarea-psdsvUNK.js +0 -2
  318. package/dist/standalone/assets/triangle-alert-B6KVFtA2.js +0 -2
  319. package/dist/standalone/assets/triangle-alert-B6KVFtA2.js.map +0 -1
  320. package/dist/standalone/assets/undo-2-Bub1b-WC.js.br +0 -0
  321. package/dist/standalone/assets/undo-2-Bub1b-WC.js.gz +0 -0
  322. package/dist/standalone/assets/use-dashboard-charts-DbH5_SmD.js +0 -2
  323. package/dist/standalone/assets/use-dashboard-charts-DbH5_SmD.js.br +0 -0
  324. package/dist/standalone/assets/use-dashboard-charts-DbH5_SmD.js.gz +0 -0
  325. package/dist/standalone/assets/use-dashboard-charts-DbH5_SmD.js.map +0 -1
  326. package/dist/standalone/assets/useQueries-BKs9IisP.js +0 -2
  327. package/dist/standalone/assets/useQueries-BKs9IisP.js.br +0 -0
  328. package/dist/standalone/assets/useQueries-BKs9IisP.js.gz +0 -0
  329. package/dist/standalone/assets/useQueries-BKs9IisP.js.map +0 -1
  330. package/dist/standalone/assets/user-directory-CxHPHi_I.js +0 -5
  331. package/dist/standalone/assets/user-directory-CxHPHi_I.js.br +0 -0
  332. package/dist/standalone/assets/user-directory-CxHPHi_I.js.gz +0 -0
  333. package/dist/standalone/assets/user-directory-CxHPHi_I.js.map +0 -1
  334. package/dist/standalone/assets/wizard-create-page-CDXQplgD.js +0 -2
  335. package/dist/standalone/assets/wizard-create-page-CDXQplgD.js.br +0 -0
  336. package/dist/standalone/assets/wizard-create-page-CDXQplgD.js.gz +0 -0
  337. package/dist/standalone/assets/zap-CFqoI4XA.js.br +0 -0
  338. package/dist/standalone/assets/zap-CFqoI4XA.js.gz +0 -0
  339. package/dist/standalone/assets/zod-DvwjKWWc.js +0 -2
  340. package/dist/standalone/assets/zod-DvwjKWWc.js.br +0 -0
  341. package/dist/standalone/assets/zod-DvwjKWWc.js.gz +0 -0
  342. package/dist/standalone/assets/zod-DvwjKWWc.js.map +0 -1
  343. /package/dist/standalone/assets/{useQueries-Chw94eNX.css → calendar-Chw94eNX.css} +0 -0
  344. /package/dist/standalone/assets/{useQueries-Chw94eNX.css.br → calendar-Chw94eNX.css.br} +0 -0
  345. /package/dist/standalone/assets/{useQueries-Chw94eNX.css.gz → calendar-Chw94eNX.css.gz} +0 -0
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./chart-widget-1GPloJY4.js","./createLucideIcon-CUopU_LC.js","./with-selector-NDLhu4dT.js","./refresh-cw-Dz19XR6g.js","./trash-2-DhyKQCKv.js","./minimize-2-Bx2cH_WS.js","./copy-BexCWf4U.js","./pencil-BO-k3yTG.js","./folder-symlink-iMRmgjVt.js","./triangle-alert-CyaaNWN8.js","./dist-Dpg8xy_r.js","./select-B6fxO2bI.js","./dist-CvKz-wgE.js","./router-CT00z_xv.js","./index-Ldci8MK5.js","./x-C3kLunD6.js","./dist-DuSTm0pk.js","./index-CU0xv21_.css","./date-picker-DVnnp1Ez.js","./calendar-C1Ecnytz.js","./calendar-Chw94eNX.css","./useQueries-BblIcy3I.js","./card-4cS4uWCP.js","./use-dashboard-charts-CkpsFXxZ.js","./schemas-twnCb1uT.js","./uuid-DLSnbsz2.js","./reference-053-L2WD.js","./chevrons-up-down-BHCs46XQ.js","./badge-6nyM5Jft.js","./command-C1FjGx6t.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,n as t}from"./createLucideIcon-CUopU_LC.js";import{S as n}from"./with-selector-NDLhu4dT.js";import{a as r,i,n as a,r as o,t as s}from"./folder-plus-DebVc0CA.js";import{t as c}from"./trash-2-DhyKQCKv.js";import{t as l}from"./pencil-BO-k3yTG.js";import{t as u}from"./plus-Dk-FzitW.js";import{s as d}from"./dist-Dpg8xy_r.js";import{a as f,i as p,n as m,r as h,t as g}from"./select-B6fxO2bI.js";import{a as _,c as v,i as y,o as b,r as x,s as S,t as C}from"./empty-D9nNJb_Y.js";import{$ as w,K as ee,j as T,n as E,nt as D}from"./router-CT00z_xv.js";import{a as O,i as k,n as A,t as j}from"./card-4cS4uWCP.js";import{i as M,r as te,t as ne}from"./tabs-BgR4QuFh.js";import{t as re}from"./uuid-DLSnbsz2.js";import{a as N,i as ie,t as ae}from"./use-dashboard-charts-CkpsFXxZ.js";import{t as P}from"./reference-053-L2WD.js";import{H as F,I,J as L,K as R,L as z,N as B,P as V,R as H,pt as oe,r as U,t as W}from"./index-Ldci8MK5.js";var G=e(t(),1),K=n(),q=[{value:`kpi`,icon:(0,K.jsx)(r,{className:`size-4`}),labelKey:`dashboard:visKpi`},{value:`line`,icon:(0,K.jsx)(o,{className:`size-4`}),labelKey:`dashboard:visLine`},{value:`area`,icon:(0,K.jsx)(i,{className:`size-4`}),labelKey:`dashboard:visArea`},{value:`bar`,icon:(0,K.jsx)(a,{className:`size-4`}),labelKey:`dashboard:visBar`}],J=`__none__`,se=[`count`,`sum`,`avg`,`min`,`max`],Y=[`7d`,`30d`,`90d`,`1y`,`all`];function ce(e){if(e.type===`date`||e.type===`datetime`)return!0;let t=e.path.toLowerCase();return t.endsWith(`at`)||t.endsWith(`_at`)||t.endsWith(`date`)}function le(e){if(ce(e))return!1;if(e.type===`reference`&&!e.isArray){let t=e.path;return t.endsWith(`Id`)||t.endsWith(`_id`)}return!(e.type===`json`||e.type===`mixed`||e.type===`richtext`||e.type===`markdown`||e.type===`textarea`||e.type===`previewMedia`||e.type===`file`)}function X({initial:e,onSave:t,onClose:n}){let{t:r}=w(),i=ee(),[a,o]=G.useState(e?.title??``),[s,c]=G.useState(e?.visualisation??`area`),[l,u]=G.useState(e?.resource??i[0]?.id??``),[_,y]=G.useState(e?.dateField??``),[b,x]=G.useState(e?.metric??`count`),[C,T]=G.useState(e?.field??``),[E,D]=G.useState(e?.groupBy??``),[O,k]=G.useState(e?.groupByLabelResource??``),[A,j]=G.useState(e?.topN??10),[M,te]=G.useState(e&&e.timeRange.preset!==`custom`?e.timeRange.preset:`30d`),[ne,ie]=G.useState(e?.filters??{}),[ae,P]=G.useState(e?.quickFilters??[]),[F,oe]=G.useState(e?.order??0),[U,W]=G.useState({}),X=i.find(e=>e.id===l),Z=X?.properties??[],Q=Z.filter(ce),me=Z.filter(e=>e.type===`number`||e.type===`float`||e.type===`currency`);G.useEffect(()=>{e?.resource!==l&&(y(Q[0]?.path??``),T(``),D(``),k(``),ie({}),P([]))},[l]),G.useEffect(()=>{O||!E||Z.length===0||k(pe(E,Z))},[E,Z]);let $=s===`kpi`,he=()=>({preset:M}),ge=(e,t)=>{ie(n=>{let r={...n};return t===``?delete r[e]:r[e]=t,r})},_e=e=>{P(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])};return(0,K.jsx)(B,{open:!0,onOpenChange:e=>{e||n()},children:(0,K.jsxs)(V,{className:`w-full max-w-2xl max-h-[90vh] overflow-y-auto`,children:[(0,K.jsx)(z,{children:(0,K.jsx)(H,{children:r(e?`chart:editChart`:`chart:newChart`)})}),(0,K.jsxs)(`div`,{className:`space-y-4 py-1`,children:[(0,K.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-[1fr_8rem]`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-title`,children:r(`chart:title`)}),(0,K.jsx)(L,{id:`chart-title`,placeholder:r(`chart:titlePlaceholder`),value:a,onChange:e=>o(e.target.value)})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-order`,children:r(`chart:order`)}),(0,K.jsx)(S,{content:r(`chart:orderHint`)})]}),(0,K.jsx)(L,{id:`chart-order`,type:`number`,step:1,value:F,onChange:e=>oe(Number.isFinite(Number(e.target.value))?Math.trunc(Number(e.target.value)):0)})]})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{children:r(`dashboard:vis`)}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:q.map(({value:e,icon:t,labelKey:n})=>(0,K.jsxs)(d,{type:`button`,variant:s===e?`default`:`outline`,size:`sm`,className:`flex-1 min-w-[5rem] gap-1.5 capitalize`,onClick:()=>c(e),children:[t,(0,K.jsx)(`span`,{className:`hidden sm:inline`,children:r(n)})]},e))})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-resource`,children:r(`chart:resource`)}),(0,K.jsxs)(g,{value:l,onValueChange:e=>u(e),children:[(0,K.jsx)(p,{id:`chart-resource`,children:(0,K.jsx)(f,{})}),(0,K.jsx)(m,{children:i.map(e=>(0,K.jsxs)(h,{value:e.id,children:[e.name,e.name!==e.id&&(0,K.jsxs)(`span`,{className:`ml-1.5 text-xs text-muted-foreground`,children:[`(`,e.id,`)`]})]},e.id))})]}),U.resource&&(0,K.jsx)(`p`,{className:`text-xs text-destructive`,children:U.resource})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-datefield`,children:r(`dashboard:builder.dateField`)}),(0,K.jsxs)(g,{value:_||J,onValueChange:e=>y(e===J?``:e),children:[(0,K.jsx)(p,{id:`chart-datefield`,children:(0,K.jsx)(f,{placeholder:r(`chart:selectField`)})}),(0,K.jsxs)(m,{children:[(0,K.jsx)(h,{value:J,children:r(`chart:selectField`)}),(Q.length>0?Q:Z).map(e=>(0,K.jsx)(h,{value:e.path,children:e.label},e.path))]})]}),(0,K.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:r(`dashboard:builder.dateFieldHint`)}),U.dateField&&(0,K.jsx)(`p`,{className:`text-xs text-destructive`,children:U.dateField})]}),(0,K.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-metric`,children:r(`chart:metric`)}),(0,K.jsxs)(g,{value:b,onValueChange:e=>x(e),children:[(0,K.jsx)(p,{id:`chart-metric`,children:(0,K.jsx)(f,{})}),(0,K.jsx)(m,{children:se.map(e=>(0,K.jsx)(h,{value:e,children:r(`dashboard:metric${ue(e)}`)},e))})]})]}),b!==`count`&&(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-field`,children:r(`chart:aggregateField`)}),(0,K.jsxs)(g,{value:C||J,onValueChange:e=>T(e===J?``:e),children:[(0,K.jsx)(p,{id:`chart-field`,children:(0,K.jsx)(f,{placeholder:r(`chart:selectField`)})}),(0,K.jsxs)(m,{children:[(0,K.jsx)(h,{value:J,children:r(`chart:selectField`)}),me.map(e=>(0,K.jsx)(h,{value:e.path,children:e.label},e.path))]})]}),U.field&&(0,K.jsx)(`p`,{className:`text-xs text-destructive`,children:U.field})]})]}),!$&&(0,K.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-groupby`,children:r(`dashboard:builder.secondaryGroupBy`)}),(0,K.jsxs)(g,{value:E||J,onValueChange:e=>{let t=e===J?``:e;D(t),k(pe(t,Z))},children:[(0,K.jsx)(p,{id:`chart-groupby`,children:(0,K.jsx)(f,{})}),(0,K.jsxs)(m,{children:[(0,K.jsx)(h,{value:J,children:r(`dashboard:builder.noBreakdown`)}),Z.filter(e=>le(e)&&e.path!==_).map(e=>(0,K.jsx)(h,{value:e.path,children:e.label},e.path))]})]})]}),E&&(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`chart-topn`,children:r(`dashboard:builder.topN`)}),(0,K.jsx)(L,{id:`chart-topn`,type:`number`,min:1,max:50,value:A,onChange:e=>j(Math.max(1,Math.min(50,Number(e.target.value)||10)))})]})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{children:r(`dashboard:builder.range`)}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Y.map(e=>(0,K.jsx)(d,{type:`button`,variant:M===e?`default`:`outline`,size:`sm`,className:`flex-1 min-w-[4rem]`,onClick:()=>te(e),children:r(`dashboard:range.${e}`)},e))})]}),Z.length>0&&(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{children:r(`dashboard:builder.filters`)}),(0,K.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:r(`dashboard:builder.filtersHint`)}),(0,K.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-3`,children:Z.filter(de).map(e=>{let t=ae.includes(e.path);return(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,K.jsx)(R,{htmlFor:`flt-${e.path}`,className:`text-xs text-muted-foreground`,children:e.label}),(0,K.jsx)(v,{checked:t,onCheckedChange:()=>_e(e.path),"aria-label":r(`dashboard:builder.quickFilterToggle`).replace(`{field}`,e.label),title:r(`dashboard:builder.quickFilterHint`)})]}),(0,K.jsx)(fe,{property:e,value:ne[e.path]??``,onChange:t=>ge(e.path,t)})]},e.path)})})]})]}),(0,K.jsxs)(I,{children:[(0,K.jsx)(d,{variant:`outline`,onClick:n,children:r(`common:cancel`)}),(0,K.jsx)(d,{onClick:()=>{let n=new Date().toISOString(),r=$?`all`:e&&e.step!==`all`?e.step:`day`,i={id:e?.id??re(),title:a.trim()||X?.name||l,resource:l,visualisation:s,dateField:_,step:r,metric:b,width:e?.width??`half`,topN:A,filters:ne,quickFilters:ae.filter(e=>Z.some(t=>t.path===e)),timeRange:he(),order:F,...e?.groupId?{groupId:e.groupId}:{},createdAt:e?.createdAt??n,updatedAt:n,...b!==`count`&&C?{field:C}:{},...!$&&E?{groupBy:E}:{},...!$&&E&&O?{groupByLabelResource:O}:{}},o=N.safeParse(i);if(!o.success){let e={};for(let t of o.error.issues){let n=t.path[0];typeof n==`string`&&!e[n]&&(e[n]=t.message)}W(e);return}W({}),t(i)},disabled:!l||!_,children:r(`chart:saveChart`)})]})]})})}var ue=e=>e.charAt(0).toUpperCase()+e.slice(1);function de(e){if(e.isId||e.isArray||e.type===`json`||e.type===`mixed`||e.type===`richtext`||e.type===`markdown`||e.type===`textarea`||e.type===`previewMedia`||e.type===`file`)return!1;if(e.type===`reference`&&!e.isArray){let t=e.path;if(!(t.endsWith(`Id`)||t.endsWith(`_id`)))return!1}return!0}function fe({property:e,value:t,onChange:n}){if(e.reference)return(0,K.jsx)(P,{referenceResourceId:e.reference,value:t||null,onChange:e=>n(e==null?``:String(e))});if(e.availableValues&&e.availableValues.length>0)return(0,K.jsxs)(g,{value:t||J,onValueChange:e=>n(e===J?``:e),children:[(0,K.jsx)(p,{id:`flt-${e.path}`,children:(0,K.jsx)(f,{})}),(0,K.jsxs)(m,{children:[(0,K.jsx)(h,{value:J,children:`—`}),e.availableValues.map(e=>(0,K.jsx)(h,{value:e.value,children:e.label},e.value))]})]});if(e.type===`boolean`)return(0,K.jsxs)(g,{value:t||J,onValueChange:e=>n(e===J?``:e),children:[(0,K.jsx)(p,{id:`flt-${e.path}`,children:(0,K.jsx)(f,{})}),(0,K.jsxs)(m,{children:[(0,K.jsx)(h,{value:J,children:`—`}),(0,K.jsx)(h,{value:`true`,children:`true`}),(0,K.jsx)(h,{value:`false`,children:`false`})]})]});let r=e.type===`number`||e.type===`float`||e.type===`currency`;return(0,K.jsx)(L,{id:`flt-${e.path}`,type:r?`number`:`text`,value:t,onChange:e=>n(e.target.value)})}function pe(e,t){if(!e)return``;let n=t.find(t=>t.path===e);if(!n)return``;if(n.reference)return n.reference;let r=n.path.endsWith(`_id`)?n.path.slice(0,-3):n.path.endsWith(`Id`)?n.path.slice(0,-2):``;if(r){let e=t.find(e=>e.path===r&&e.reference);if(e?.reference)return e.reference}return``}function Z({initial:e,onSave:t,onClose:n}){let{t:r}=w(),[i,a]=G.useState(e?.name??``),[o,s]=G.useState(e?.order??0),[c,l]=G.useState(``);return(0,K.jsx)(B,{open:!0,onOpenChange:e=>{e||n()},children:(0,K.jsxs)(V,{className:`w-full max-w-md`,children:[(0,K.jsx)(z,{children:(0,K.jsx)(H,{children:r(e?`chart:editGroup`:`chart:newGroup`)})}),(0,K.jsxs)(`div`,{className:`space-y-4 py-1`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`group-name`,children:r(`chart:groupName`)}),(0,K.jsx)(L,{id:`group-name`,placeholder:r(`chart:groupNamePlaceholder`),value:i,onChange:e=>a(e.target.value),autoFocus:!0}),c&&(0,K.jsx)(`p`,{className:`text-xs text-destructive`,children:c})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(R,{htmlFor:`group-order`,children:r(`chart:groupOrder`)}),(0,K.jsx)(S,{content:r(`chart:orderHint`)})]}),(0,K.jsx)(L,{id:`group-order`,type:`number`,step:1,value:o,onChange:e=>s(Number.isFinite(Number(e.target.value))?Math.trunc(Number(e.target.value)):0)})]})]}),(0,K.jsxs)(I,{children:[(0,K.jsx)(d,{variant:`outline`,onClick:n,children:r(`common:cancel`)}),(0,K.jsx)(d,{onClick:()=>{let e=i.trim();if(!e){l(r(`chart:groupNameRequired`));return}l(``),t({name:e,order:Number.isFinite(o)?Math.trunc(o):0})},children:r(`chart:saveGroup`)})]})]})})}function Q({groups:e,initialGroupId:t,initialOrder:n,onSave:r,onClose:i,onCreateGroup:a}){let{t:o}=w(),c=G.useMemo(()=>[...e].sort((e,t)=>e.order-t.order),[e]),l=t??c[0]?.id??``,[u,_]=G.useState(l),[v,y]=G.useState(n??0);return(0,K.jsx)(B,{open:!0,onOpenChange:e=>{e||i()},children:(0,K.jsxs)(V,{className:`w-full max-w-md`,children:[(0,K.jsx)(z,{children:(0,K.jsx)(H,{children:o(`chart:moveChart`)})}),c.length===0?(0,K.jsxs)(`div`,{className:`space-y-3 py-2`,children:[(0,K.jsx)(`p`,{className:`text-sm font-medium`,children:o(`chart:moveNoGroups`)}),(0,K.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o(`chart:moveNoGroupsHint`)}),(0,K.jsxs)(d,{variant:`outline`,className:`w-full`,onClick:()=>{i(),a()},children:[(0,K.jsx)(s,{className:`size-4 mr-2`}),o(`chart:addGroup`)]})]}):(0,K.jsxs)(`div`,{className:`space-y-4 py-1`,children:[(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsx)(R,{htmlFor:`move-group`,children:o(`chart:moveGroup`)}),(0,K.jsxs)(g,{value:u,onValueChange:_,children:[(0,K.jsx)(p,{id:`move-group`,className:`w-full`,children:(0,K.jsx)(f,{})}),(0,K.jsx)(m,{children:c.map(e=>(0,K.jsx)(h,{value:e.id,children:e.name},e.id))})]})]}),(0,K.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,K.jsx)(R,{htmlFor:`move-order`,children:o(`chart:order`)}),(0,K.jsx)(S,{content:o(`chart:orderHint`)})]}),(0,K.jsx)(L,{id:`move-order`,type:`number`,step:1,value:v,onChange:e=>y(Number.isFinite(Number(e.target.value))?Math.trunc(Number(e.target.value)):0)})]})]}),(0,K.jsxs)(I,{children:[(0,K.jsx)(d,{variant:`outline`,onClick:i,children:o(`common:cancel`)}),c.length>0&&(0,K.jsx)(d,{onClick:()=>{u&&r({groupId:u,order:Number.isFinite(v)?Math.trunc(v):0})},disabled:!u,children:o(`chart:moveToGroup`)})]})]})})}var me=G.lazy(()=>W(()=>import(`./chart-widget-1GPloJY4.js`).then(e=>({default:e.ChartWidget})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]),import.meta.url));function $(e){return(0,K.jsx)(G.Suspense,{fallback:(0,K.jsx)(F,{className:`h-[320px] w-full rounded-md`}),children:(0,K.jsx)(me,{...e})})}function he(){let{t:e}=w(),t=ee(),{user:n}=T(),r=D(),i=U(),o=G.useMemo(()=>new ae(r),[r]),{charts:f,groups:p,addChart:m,updateChart:h,removeChart:g,addGroup:v,updateGroup:S,removeGroup:re}=ie({userId:n?.id??null,store:o}),N=G.useMemo(()=>t.filter(e=>e.navigation!==null),[t]),[P,F]=G.useState(!1),[I,L]=G.useState(null),[R,z]=G.useState(null),[B,V]=G.useState(null),[H,W]=G.useState(null);G.useEffect(()=>{if(p.length===0){V(null);return}(!B||!p.some(e=>e.id===B))&&V(p[0].id)},[p,B]);let q=I?f.find(e=>e.id===I):void 0,J=p[0]?.id??null,se=G.useMemo(()=>p.length===0?[...f].sort(ge):B?f.filter(e=>e.groupId?e.groupId===B:B===J).sort(ge):[],[f,p.length,B,J]),Y=B?p.find(e=>e.id===B)??null:null,ce=async t=>{await i.confirm({title:e(`chart:deleteChartConfirm`),description:e(`chart:deleteChartConfirmHint`),confirmLabel:e(`common:delete`),destructive:!0})&&g(t.id)},le=async t=>{let n=f.filter(e=>e.groupId?e.groupId===t.id:t.id===J).length;await i.confirm({title:e(`chart:deleteGroupConfirm`),description:e(`chart:deleteGroupConfirmHint`).replace(`{count}`,String(n)),confirmLabel:e(`common:delete`),destructive:!0})&&re(t.id)};return(0,K.jsxs)(`div`,{className:`space-y-3 sm:space-y-6`,children:[(0,K.jsxs)(j,{children:[(0,K.jsxs)(k,{className:`flex flex-row items-center justify-between p-3 pb-2 space-y-0 gap-2 sm:p-6 sm:pb-2`,children:[(0,K.jsx)(O,{children:e(`chart:dashboard`)}),(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsxs)(d,{size:`sm`,variant:`outline`,onClick:()=>z(`new`),children:[(0,K.jsx)(s,{className:`size-4`}),(0,K.jsx)(`span`,{className:`hidden sm:inline ml-1.5`,children:e(`chart:addGroup`)})]}),(0,K.jsxs)(d,{size:`sm`,onClick:()=>F(!0),disabled:N.length===0,children:[(0,K.jsx)(u,{className:`size-4`}),(0,K.jsx)(`span`,{className:`hidden sm:inline ml-1.5`,children:e(`chart:addChart`)})]})]})]}),(0,K.jsxs)(A,{className:`p-3 pt-0 sm:p-6 sm:pt-0`,children:[p.length>0&&B&&(0,K.jsx)(ne,{value:B,onValueChange:e=>V(e),className:`mb-4`,children:(0,K.jsxs)(`div`,{className:`flex items-end justify-between gap-2`,children:[(0,K.jsx)(te,{className:`flex-1`,children:p.map(e=>(0,K.jsx)(M,{value:e.id,children:e.name},e.id))}),Y&&(0,K.jsxs)(`div`,{className:`mb-1 flex shrink-0 items-center gap-1`,children:[(0,K.jsxs)(d,{size:`sm`,variant:`ghost`,onClick:()=>z(Y),"aria-label":e(`chart:editGroup`),children:[(0,K.jsx)(l,{className:`size-3.5`}),(0,K.jsx)(`span`,{className:`hidden sm:inline ml-1.5`,children:e(`chart:editGroup`)})]}),(0,K.jsxs)(d,{size:`sm`,variant:`ghost`,onClick:()=>void le(Y),"aria-label":e(`chart:deleteGroup`),children:[(0,K.jsx)(c,{className:`size-3.5`}),(0,K.jsx)(`span`,{className:`hidden sm:inline ml-1.5`,children:e(`chart:deleteGroup`)})]})]})]})}),se.length===0?(0,K.jsx)(C,{className:`border-0 py-4`,children:(0,K.jsxs)(y,{children:[(0,K.jsx)(_,{children:(0,K.jsx)(a,{})}),(0,K.jsx)(b,{children:e(`chart:noCharts`)}),(0,K.jsx)(x,{children:e(`chart:noChartsHint`)})]})}):(0,K.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:gap-4 md:grid-cols-2`,children:se.map(e=>(0,K.jsx)(`div`,{className:e.width===`full`?`md:col-span-2`:void 0,children:(0,K.jsx)($,{config:e,onEdit:()=>L(e.id),onDelete:()=>void ce(e),onMove:()=>W(e),onUpdate:t=>h(e.id,t)})},e.id))})]})]}),(0,K.jsxs)(j,{children:[(0,K.jsx)(k,{children:(0,K.jsx)(O,{children:e(`common:resources`)})}),(0,K.jsx)(A,{children:N.length===0?(0,K.jsx)(C,{className:`border-0`,children:(0,K.jsxs)(y,{children:[(0,K.jsx)(_,{children:(0,K.jsx)(oe,{})}),(0,K.jsx)(b,{children:e(`common:noRecords`)}),(0,K.jsx)(x,{children:e(`common:noRecordsHint`,{resource:`resource`})})]})}):(0,K.jsx)(`ul`,{className:`grid gap-2 sm:grid-cols-2 md:grid-cols-3`,children:N.map(e=>(0,K.jsx)(`li`,{children:(0,K.jsxs)(E,{to:{name:`list`,resourceId:e.id},className:`block rounded-md border border-border bg-card p-4 hover:border-primary/40 hover:shadow-sm transition-shadow`,children:[(0,K.jsx)(`div`,{className:`font-semibold`,children:e.name}),e.name!==e.id&&(0,K.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.id})]})},e.id))})})]}),P&&(0,K.jsx)(X,{onSave:e=>{m(B?{...e,groupId:B}:e),F(!1)},onClose:()=>F(!1)}),q&&(0,K.jsx)(X,{initial:q,onSave:e=>{h(q.id,e),L(null)},onClose:()=>L(null)}),H&&(0,K.jsx)(Q,{groups:p,initialGroupId:H.groupId,initialOrder:H.order,onSave:({groupId:e,order:t})=>{h(H.id,{...H,groupId:e,order:t}),W(null)},onClose:()=>W(null),onCreateGroup:()=>{W(null),z(`new`)}}),R&&(0,K.jsx)(Z,{initial:R===`new`?void 0:R,onSave:e=>{if(R===`new`){let t=v(e);V(t)}else S(R.id,e);z(null)},onClose:()=>z(null)})]})}function ge(e,t){return e.order===t.order?e.createdAt.localeCompare(t.createdAt):e.order-t.order}export{he as HomePage};
3
+ //# sourceMappingURL=home-page-B1hrpu2S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../react/src/components/chart-builder-dialog.tsx","../../../../react/src/components/group-settings-dialog.tsx","../../../../react/src/components/move-chart-dialog.tsx","../../../../react/src/pages/home-page.tsx"],"sourcesContent":["// Phase 10: time-series-first chart builder.\n//\n// X-axis is ALWAYS a date — the user picks `dateField` (required). `groupBy`\n// becomes an optional *secondary* breakdown that produces multiple series\n// (Metabase-style: pick \"status\" → one line per status value). Pie removed.\n// `width` lets the chart take half or full row on the dashboard grid.\n\nimport * as React from 'react'\nimport {\n BarChart2,\n LineChart,\n AreaChart,\n Activity,\n} from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n InfoTooltip,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n} from '@modern-admin/ui'\nimport {\n chartDefZ,\n uuidv7,\n type AggregationOpName,\n type ChartDef,\n type ChartDefInput,\n type ChartVisualisation,\n type TimeRange,\n type TimeRangePreset,\n} from '@modern-admin/core'\nimport { useI18n } from '../i18n.js'\nimport { useResources } from '../hooks.js'\nimport { ReferenceCombobox } from '../reference.js'\nimport type { PropertyJSON } from '../types.js'\n\nexport interface ChartBuilderDialogProps {\n /** Pre-populate for editing an existing chart. */\n initial?: ChartDef\n onSave(input: ChartDefInput): void\n onClose(): void\n}\n\nconst VIS_OPTIONS: { value: ChartVisualisation; icon: React.ReactElement; labelKey: string }[] = [\n { value: 'kpi', icon: <Activity className=\"size-4\" />, labelKey: 'dashboard:visKpi' },\n { value: 'line', icon: <LineChart className=\"size-4\" />, labelKey: 'dashboard:visLine' },\n { value: 'area', icon: <AreaChart className=\"size-4\" />, labelKey: 'dashboard:visArea' },\n { value: 'bar', icon: <BarChart2 className=\"size-4\" />, labelKey: 'dashboard:visBar' },\n]\n\nconst NONE = '__none__'\nconst METRICS: AggregationOpName[] = ['count', 'sum', 'avg', 'min', 'max']\n// `custom` is intentionally excluded from the builder — the builder sets a\n// default interval; ad-hoc custom ranges are picked on the widget toolbar.\nconst PRESETS: Exclude<TimeRangePreset, 'custom'>[] = ['7d', '30d', '90d', '1y', 'all']\n\n/** Date-ish heuristic for the dateField selector when adapter metadata is sparse. */\nfunction isDateProperty(p: { type?: string; path: string }): boolean {\n if (p.type === 'date' || p.type === 'datetime') return true\n const lower = p.path.toLowerCase()\n return lower.endsWith('at') || lower.endsWith('_at') || lower.endsWith('date')\n}\n\n/**\n * Properties that make sense as a `groupBy` axis: anything that resolves to\n * a discrete column value the adapter can group on. Virtual relation columns\n * (`type: 'reference'` with `isArray: false` and no FK suffix) carry full\n * record objects in their values and would serialise to `[object Object]` —\n * exclude them so the user picks the underlying FK column instead.\n */\nfunction isGroupable(p: { path: string; type?: string; isArray?: boolean }): boolean {\n if (isDateProperty(p)) return false\n if (p.type === 'reference' && !p.isArray) {\n // Allow scalar FK columns (named `*Id`/`*_id` with type 'reference' set\n // via adapter override) — they group cleanly to id strings. Reject virtual\n // relation fields whose values are objects.\n const path = p.path\n return path.endsWith('Id') || path.endsWith('_id')\n }\n if (p.type === 'json' || p.type === 'mixed') return false\n if (p.type === 'richtext' || p.type === 'markdown' || p.type === 'textarea') return false\n if (p.type === 'previewMedia' || p.type === 'file') return false\n return true\n}\n\nexport function ChartBuilderDialog({\n initial,\n onSave,\n onClose,\n}: ChartBuilderDialogProps): React.ReactElement {\n const { t } = useI18n()\n const resources = useResources()\n\n const [title, setTitle] = React.useState(initial?.title ?? '')\n const [visualisation, setVisualisation] = React.useState<ChartVisualisation>(\n initial?.visualisation ?? 'area',\n )\n const [resourceId, setResourceId] = React.useState(\n initial?.resource ?? resources[0]?.id ?? '',\n )\n const [dateField, setDateField] = React.useState(initial?.dateField ?? '')\n const [metric, setMetric] = React.useState<AggregationOpName>(initial?.metric ?? 'count')\n const [field, setField] = React.useState(initial?.field ?? '')\n const [groupBy, setGroupBy] = React.useState(initial?.groupBy ?? '')\n const [groupByLabelResource, setGroupByLabelResource] = React.useState(\n initial?.groupByLabelResource ?? '',\n )\n const [topN, setTopN] = React.useState(initial?.topN ?? 10)\n // The builder only sets a default time-range preset; custom ranges are\n // picked on the widget toolbar. If the saved chart is on 'custom', fall\n // back to the most useful preset for the builder UI.\n const [preset, setPreset] = React.useState<Exclude<TimeRangePreset, 'custom'>>(\n initial && initial.timeRange.preset !== 'custom' ? initial.timeRange.preset : '30d',\n )\n const [filters, setFilters] = React.useState<Record<string, string>>(\n initial?.filters ?? {},\n )\n const [quickFilters, setQuickFilters] = React.useState<string[]>(\n initial?.quickFilters ?? [],\n )\n const [order, setOrder] = React.useState<number>(initial?.order ?? 0)\n const [errors, setErrors] = React.useState<Record<string, string>>({})\n\n const resource = resources.find((r) => r.id === resourceId)\n const properties = resource?.properties ?? []\n const dateProps = properties.filter(isDateProperty)\n const numericProps = properties.filter(\n (p) => p.type === 'number' || p.type === 'float' || p.type === 'currency',\n )\n\n // Auto-select dateField when resource changes (skip the very first\n // render of edit-mode so we keep the saved value).\n React.useEffect(() => {\n if (initial?.resource === resourceId) return\n setDateField(dateProps[0]?.path ?? '')\n setField('')\n setGroupBy('')\n setGroupByLabelResource('')\n setFilters({})\n setQuickFilters([])\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourceId])\n\n // When opening an existing chart that predates the groupByLabelResource\n // feature (groupByLabelResource is empty but groupBy is set): auto-derive\n // the label resource so the user gets resolved labels without re-saving.\n React.useEffect(() => {\n if (groupByLabelResource || !groupBy || properties.length === 0) return\n setGroupByLabelResource(resolveGroupByLabelResource(groupBy, properties))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [groupBy, properties])\n\n const isKpi = visualisation === 'kpi'\n\n const buildTimeRange = (): TimeRange => ({ preset })\n\n const handleFilterChange = (path: string, value: string): void => {\n setFilters((prev) => {\n const next = { ...prev }\n if (value === '') delete next[path]\n else next[path] = value\n return next\n })\n }\n\n const toggleQuickFilter = (path: string): void => {\n setQuickFilters((prev) =>\n prev.includes(path) ? prev.filter((p) => p !== path) : [...prev, path],\n )\n }\n\n const handleSave = (): void => {\n const now = new Date().toISOString()\n // step is not user-editable in the builder; keep the previous value (or\n // pick a sane default) so chartDefZ stays valid. The widget toolbar\n // remains the place to tweak step on the fly.\n const savedStep = isKpi\n ? 'all'\n : initial && initial.step !== 'all'\n ? initial.step\n : 'day'\n const candidate: ChartDefInput = {\n id: initial?.id ?? uuidv7(),\n title: title.trim() || resource?.name || resourceId,\n resource: resourceId,\n visualisation,\n dateField,\n step: savedStep,\n metric,\n width: initial?.width ?? 'half',\n topN,\n filters,\n quickFilters: quickFilters.filter((p) => properties.some((q) => q.path === p)),\n timeRange: buildTimeRange(),\n order,\n // Preserve groupId on edit — the builder does not (yet) change group\n // membership directly; groups are managed from the dashboard tab strip.\n ...(initial?.groupId ? { groupId: initial.groupId } : {}),\n createdAt: initial?.createdAt ?? now,\n updatedAt: now,\n ...(metric !== 'count' && field ? { field } : {}),\n ...(!isKpi && groupBy ? { groupBy } : {}),\n ...(!isKpi && groupBy && groupByLabelResource ? { groupByLabelResource } : {}),\n }\n const result = chartDefZ.safeParse(candidate)\n if (!result.success) {\n const fieldErrs: Record<string, string> = {}\n for (const issue of result.error.issues) {\n const key = issue.path[0]\n if (typeof key === 'string' && !fieldErrs[key]) fieldErrs[key] = issue.message\n }\n setErrors(fieldErrs)\n return\n }\n setErrors({})\n onSave(candidate)\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {initial ? t('chart:editChart') : t('chart:newChart')}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 py-1\">\n {/* Title + order */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-[1fr_8rem]\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-title\">{t('chart:title')}</Label>\n <Input\n id=\"chart-title\"\n placeholder={t('chart:titlePlaceholder')}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Label htmlFor=\"chart-order\">{t('chart:order')}</Label>\n <InfoTooltip content={t('chart:orderHint')} />\n </div>\n <Input\n id=\"chart-order\"\n type=\"number\"\n step={1}\n value={order}\n onChange={(e) => setOrder(Number.isFinite(Number(e.target.value)) ? Math.trunc(Number(e.target.value)) : 0)}\n />\n </div>\n </div>\n\n {/* Visualisation (incl. KPI) */}\n <div className=\"space-y-1.5\">\n <Label>{t('dashboard:vis')}</Label>\n <div className=\"flex flex-wrap gap-2\">\n {VIS_OPTIONS.map(({ value, icon, labelKey }) => (\n <Button\n key={value}\n type=\"button\"\n variant={visualisation === value ? 'default' : 'outline'}\n size=\"sm\"\n className=\"flex-1 min-w-[5rem] gap-1.5 capitalize\"\n onClick={() => setVisualisation(value)}\n >\n {icon}\n <span className=\"hidden sm:inline\">{t(labelKey)}</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Resource */}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-resource\">{t('chart:resource')}</Label>\n <Select value={resourceId} onValueChange={(v) => setResourceId(v)}>\n <SelectTrigger id=\"chart-resource\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resources.map((r) => (\n <SelectItem key={r.id} value={r.id}>\n {r.name}\n {r.name !== r.id && (\n <span className=\"ml-1.5 text-xs text-muted-foreground\">({r.id})</span>\n )}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {errors.resource && (\n <p className=\"text-xs text-destructive\">{errors.resource}</p>\n )}\n </div>\n\n {/* Date field — required, drives the X-axis bucketing */}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-datefield\">{t('dashboard:builder.dateField')}</Label>\n <Select\n value={dateField || NONE}\n onValueChange={(v) => setDateField(v === NONE ? '' : v)}\n >\n <SelectTrigger id=\"chart-datefield\">\n <SelectValue placeholder={t('chart:selectField')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>{t('chart:selectField')}</SelectItem>\n {(dateProps.length > 0 ? dateProps : properties).map((p) => (\n <SelectItem key={p.path} value={p.path}>{p.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n {t('dashboard:builder.dateFieldHint')}\n </p>\n {errors.dateField && (\n <p className=\"text-xs text-destructive\">{errors.dateField}</p>\n )}\n </div>\n\n {/* Metric + field */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-metric\">{t('chart:metric')}</Label>\n <Select value={metric} onValueChange={(v) => setMetric(v as AggregationOpName)}>\n <SelectTrigger id=\"chart-metric\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {METRICS.map((m) => (\n <SelectItem key={m} value={m}>{t(`dashboard:metric${cap(m)}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {metric !== 'count' && (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-field\">{t('chart:aggregateField')}</Label>\n <Select\n value={field || NONE}\n onValueChange={(v) => setField(v === NONE ? '' : v)}\n >\n <SelectTrigger id=\"chart-field\">\n <SelectValue placeholder={t('chart:selectField')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>{t('chart:selectField')}</SelectItem>\n {numericProps.map((p) => (\n <SelectItem key={p.path} value={p.path}>{p.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n {errors.field && (\n <p className=\"text-xs text-destructive\">{errors.field}</p>\n )}\n </div>\n )}\n </div>\n\n {/* Secondary groupBy + topN — non-KPI only */}\n {!isKpi && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-groupby\">\n {t('dashboard:builder.secondaryGroupBy')}\n </Label>\n <Select\n value={groupBy || NONE}\n onValueChange={(v) => {\n const path = v === NONE ? '' : v\n setGroupBy(path)\n setGroupByLabelResource(resolveGroupByLabelResource(path, properties))\n }}\n >\n <SelectTrigger id=\"chart-groupby\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>{t('dashboard:builder.noBreakdown')}</SelectItem>\n {properties\n .filter((p) => isGroupable(p) && p.path !== dateField)\n .map((p) => (\n <SelectItem key={p.path} value={p.path}>{p.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {groupBy && (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"chart-topn\">{t('dashboard:builder.topN')}</Label>\n <Input\n id=\"chart-topn\"\n type=\"number\"\n min={1}\n max={50}\n value={topN}\n onChange={(e) =>\n setTopN(Math.max(1, Math.min(50, Number(e.target.value) || 10)))\n }\n />\n </div>\n )}\n </div>\n )}\n\n {/* Default time-range preset. Custom ranges are picked on the\n widget toolbar — not in the builder. */}\n <div className=\"space-y-1.5\">\n <Label>{t('dashboard:builder.range')}</Label>\n <div className=\"flex flex-wrap gap-2\">\n {PRESETS.map((p) => (\n <Button\n key={p}\n type=\"button\"\n variant={preset === p ? 'default' : 'outline'}\n size=\"sm\"\n className=\"flex-1 min-w-[4rem]\"\n onClick={() => setPreset(p)}\n >\n {t(`dashboard:range.${p}`)}\n </Button>\n ))}\n </div>\n </div>\n\n {/* Filters — one row per property, with a checkbox to mark the\n filter as a \"quick filter\" (exposed above the chart for inline\n tweaking on the dashboard). Reference fields use a combobox. */}\n {properties.length > 0 && (\n <div className=\"space-y-1.5\">\n <Label>{t('dashboard:builder.filters')}</Label>\n <p className=\"text-xs text-muted-foreground\">\n {t('dashboard:builder.filtersHint')}\n </p>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-3\">\n {properties.filter(isFilterable).map((p) => {\n const exposed = quickFilters.includes(p.path)\n return (\n <div key={p.path} className=\"space-y-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label\n htmlFor={`flt-${p.path}`}\n className=\"text-xs text-muted-foreground\"\n >\n {p.label}\n </Label>\n <Switch\n checked={exposed}\n onCheckedChange={() => toggleQuickFilter(p.path)}\n aria-label={t('dashboard:builder.quickFilterToggle').replace(\n '{field}',\n p.label,\n )}\n title={t('dashboard:builder.quickFilterHint')}\n />\n </div>\n <FilterInput\n property={p}\n value={filters[p.path] ?? ''}\n onChange={(v) => handleFilterChange(p.path, v)}\n />\n </div>\n )\n })}\n </div>\n </div>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common:cancel')}</Button>\n <Button onClick={handleSave} disabled={!resourceId || !dateField}>\n {t('chart:saveChart')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1)\n\n/**\n * Property is exposable as a filter. Excludes ids, array fields, free-form\n * blobs (json/mixed/richtext), media fields, and virtual relation columns\n * (we keep the underlying FK column so we don't list `authorId` and `author`\n * twice).\n */\nfunction isFilterable(p: PropertyJSON): boolean {\n if (p.isId) return false\n if (p.isArray) return false\n if (p.type === 'json' || p.type === 'mixed') return false\n if (p.type === 'richtext' || p.type === 'markdown' || p.type === 'textarea') return false\n if (p.type === 'previewMedia' || p.type === 'file') return false\n // Drop virtual relation columns (full objects) — keep FK siblings instead.\n if (p.type === 'reference' && !p.isArray) {\n const path = p.path\n if (!(path.endsWith('Id') || path.endsWith('_id'))) return false\n }\n return true\n}\n\n/**\n * Renders an inline input for one filter row in the builder. Reference\n * properties get the same combobox the resource forms use; enums/booleans\n * get a Select; numerics get a number input; everything else falls back to\n * a plain text input.\n */\nfunction FilterInput({\n property,\n value,\n onChange,\n}: {\n property: PropertyJSON\n value: string\n onChange(next: string): void\n}): React.ReactElement {\n if (property.reference) {\n return (\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value || null}\n onChange={(next) => onChange(next == null ? '' : String(next))}\n />\n )\n }\n if (property.availableValues && property.availableValues.length > 0) {\n return (\n <Select\n value={value || NONE}\n onValueChange={(v) => onChange(v === NONE ? '' : v)}\n >\n <SelectTrigger id={`flt-${property.path}`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>—</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n if (property.type === 'boolean') {\n return (\n <Select\n value={value || NONE}\n onValueChange={(v) => onChange(v === NONE ? '' : v)}\n >\n <SelectTrigger id={`flt-${property.path}`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NONE}>—</SelectItem>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n )\n }\n const isNumeric =\n property.type === 'number' || property.type === 'float' || property.type === 'currency'\n return (\n <Input\n id={`flt-${property.path}`}\n type={isNumeric ? 'number' : 'text'}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n}\n\n/**\n * Resolve which resource to use for groupBy label resolution.\n *\n * 1. If the property itself is `type: 'reference'` (virtual relation field),\n * use its `reference` resource id directly — same mechanism as the record\n * title display in resource forms.\n * 2. If it is a raw FK column (e.g. `authorId`), look for a sibling property\n * whose path is the FK name without the trailing `Id`/`_id` suffix AND\n * has `reference` set. Covers the Prisma/Drizzle naming convention.\n */\nfunction resolveGroupByLabelResource(\n path: string,\n properties: ReadonlyArray<{ path: string; type: string; reference: string | null }>,\n): string {\n if (!path) return ''\n const prop = properties.find((p) => p.path === path)\n if (!prop) return ''\n // Direct reference property (virtual relation).\n if (prop.reference) return prop.reference\n // FK column heuristic: strip Id / _id suffix and look for sibling.\n const base = prop.path.endsWith('_id')\n ? prop.path.slice(0, -3)\n : prop.path.endsWith('Id')\n ? prop.path.slice(0, -2)\n : ''\n if (base) {\n const sibling = properties.find((p) => p.path === base && p.reference)\n if (sibling?.reference) return sibling.reference\n }\n return ''\n}\n","// Create / edit dialog for a dashboard chart group. Lives in the react\n// package because it is i18n-aware; the actual primitives come from\n// @modern-admin/ui.\n\nimport * as React from 'react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n InfoTooltip,\n Input,\n Label,\n} from '@modern-admin/ui'\nimport type { ChartGroup } from '@modern-admin/core'\nimport { useI18n } from '../i18n.js'\n\nexport interface GroupSettingsDialogProps {\n /** When set, the dialog is in edit mode and pre-populates from this group. */\n initial?: ChartGroup\n onSave(input: { name: string; order: number }): void\n onClose(): void\n}\n\nexport function GroupSettingsDialog({\n initial,\n onSave,\n onClose,\n}: GroupSettingsDialogProps): React.ReactElement {\n const { t } = useI18n()\n const [name, setName] = React.useState(initial?.name ?? '')\n const [order, setOrder] = React.useState<number>(initial?.order ?? 0)\n const [error, setError] = React.useState<string>('')\n\n const handleSave = (): void => {\n const trimmed = name.trim()\n if (!trimmed) {\n setError(t('chart:groupNameRequired'))\n return\n }\n setError('')\n onSave({ name: trimmed, order: Number.isFinite(order) ? Math.trunc(order) : 0 })\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"w-full max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {initial ? t('chart:editGroup') : t('chart:newGroup')}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 py-1\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"group-name\">{t('chart:groupName')}</Label>\n <Input\n id=\"group-name\"\n placeholder={t('chart:groupNamePlaceholder')}\n value={name}\n onChange={(e) => setName(e.target.value)}\n autoFocus\n />\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Label htmlFor=\"group-order\">{t('chart:groupOrder')}</Label>\n <InfoTooltip content={t('chart:orderHint')} />\n </div>\n <Input\n id=\"group-order\"\n type=\"number\"\n step={1}\n value={order}\n onChange={(e) =>\n setOrder(Number.isFinite(Number(e.target.value)) ? Math.trunc(Number(e.target.value)) : 0)\n }\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common:cancel')}</Button>\n <Button onClick={handleSave}>{t('chart:saveGroup')}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","// Dialog for moving a chart to a different group and adjusting its order.\n// Opened from the chart widget's \"…\" dropdown menu.\n\nimport * as React from 'react'\nimport { FolderPlus } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n InfoTooltip,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@modern-admin/ui'\nimport type { ChartGroup } from '@modern-admin/core'\nimport { useI18n } from '../i18n.js'\n\nexport interface MoveChartDialogProps {\n groups: ChartGroup[]\n /** Current group id of the chart being moved. */\n initialGroupId?: string\n /** Current order value of the chart being moved. */\n initialOrder?: number\n onSave(input: { groupId: string; order: number }): void\n onClose(): void\n /** Called when the user wants to create a group first (no groups exist). */\n onCreateGroup(): void\n}\n\nexport function MoveChartDialog({\n groups,\n initialGroupId,\n initialOrder,\n onSave,\n onClose,\n onCreateGroup,\n}: MoveChartDialogProps): React.ReactElement {\n const { t } = useI18n()\n\n const sorted = React.useMemo(\n () => [...groups].sort((a, b) => a.order - b.order),\n [groups],\n )\n\n // Seed from the chart's current group, or the first group if unset.\n const defaultGroupId = initialGroupId ?? sorted[0]?.id ?? ''\n const [groupId, setGroupId] = React.useState(defaultGroupId)\n const [order, setOrder] = React.useState<number>(initialOrder ?? 0)\n\n const handleSave = (): void => {\n if (!groupId) return\n onSave({ groupId, order: Number.isFinite(order) ? Math.trunc(order) : 0 })\n }\n\n return (\n <Dialog open onOpenChange={(open) => { if (!open) onClose() }}>\n <DialogContent className=\"w-full max-w-md\">\n <DialogHeader>\n <DialogTitle>{t('chart:moveChart')}</DialogTitle>\n </DialogHeader>\n\n {sorted.length === 0 ? (\n // No groups yet — prompt to create one.\n <div className=\"space-y-3 py-2\">\n <p className=\"text-sm font-medium\">{t('chart:moveNoGroups')}</p>\n <p className=\"text-sm text-muted-foreground\">{t('chart:moveNoGroupsHint')}</p>\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => { onClose(); onCreateGroup() }}\n >\n <FolderPlus className=\"size-4 mr-2\" />\n {t('chart:addGroup')}\n </Button>\n </div>\n ) : (\n <div className=\"space-y-4 py-1\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"move-group\">{t('chart:moveGroup')}</Label>\n <Select value={groupId} onValueChange={setGroupId}>\n <SelectTrigger id=\"move-group\" className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {sorted.map((g) => (\n <SelectItem key={g.id} value={g.id}>\n {g.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Label htmlFor=\"move-order\">{t('chart:order')}</Label>\n <InfoTooltip content={t('chart:orderHint')} />\n </div>\n <Input\n id=\"move-order\"\n type=\"number\"\n step={1}\n value={order}\n onChange={(e) =>\n setOrder(Number.isFinite(Number(e.target.value)) ? Math.trunc(Number(e.target.value)) : 0)\n }\n />\n </div>\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common:cancel')}</Button>\n {sorted.length > 0 && (\n <Button onClick={handleSave} disabled={!groupId}>\n {t('chart:moveToGroup')}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import * as React from 'react'\nimport { Plus, Database, BarChart2, FolderPlus, Pencil, Trash2 } from 'lucide-react'\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Empty,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n Skeleton,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@modern-admin/ui'\nimport { useResources, useCurrentUser } from '../hooks.js'\nimport { useI18n } from '../i18n.js'\nimport { Link } from '../router.js'\nimport { useDashboardCharts, ServerDashboardStore } from '../use-dashboard-charts.js'\nimport { useAdminClient } from '../provider.js'\nimport { useDialogs } from '../dialogs.js'\nimport type { ChartWidgetProps } from '../components/chart-widget.js'\nimport { ChartBuilderDialog } from '../components/chart-builder-dialog.js'\nimport { GroupSettingsDialog } from '../components/group-settings-dialog.js'\nimport { MoveChartDialog } from '../components/move-chart-dialog.js'\nimport type { ChartDef, ChartGroup } from '@modern-admin/core'\n\n// ChartWidget statically pulls in Recharts (via ui's TimeSeriesChart/KpiCard).\n// Split it into its own async chunk so the dashboard's charting library never\n// loads until a chart is actually rendered — dashboards with no charts (and\n// the initial home-page paint) skip the Recharts payload entirely.\nconst ChartWidgetImpl = React.lazy(() =>\n import('../components/chart-widget.js').then((m) => ({ default: m.ChartWidget })),\n)\n\nfunction LazyChartWidget(props: ChartWidgetProps): React.ReactElement {\n return (\n <React.Suspense fallback={<Skeleton className=\"h-[320px] w-full rounded-md\" />}>\n <ChartWidgetImpl {...props} />\n </React.Suspense>\n )\n}\n\nexport function HomePage(): React.ReactElement {\n const { t } = useI18n()\n const resources = useResources()\n const { user } = useCurrentUser()\n const adminClient = useAdminClient()\n const dialogs = useDialogs()\n // Use server-backed store so charts persist across devices/browsers.\n // Falls back gracefully when configStore is not configured server-side.\n const serverStore = React.useMemo(() => new ServerDashboardStore(adminClient), [adminClient])\n const {\n charts,\n groups,\n addChart,\n updateChart,\n removeChart,\n addGroup,\n updateGroup,\n removeGroup,\n } = useDashboardCharts({\n userId: user?.id ?? null,\n store: serverStore,\n })\n\n // Only show resources explicitly visible in navigation (same rule as sidebar).\n const navResources = React.useMemo(\n () => resources.filter((r) => r.navigation !== null),\n [resources],\n )\n\n const [building, setBuilding] = React.useState(false)\n const [editingId, setEditingId] = React.useState<string | null>(null)\n // null = no dialog; 'new' = create; ChartGroup = edit-existing.\n const [groupDialog, setGroupDialog] = React.useState<ChartGroup | 'new' | null>(null)\n const [activeGroupId, setActiveGroupId] = React.useState<string | null>(null)\n // Chart being moved — null when dialog is closed.\n const [movingChart, setMovingChart] = React.useState<ChartDef | null>(null)\n\n // Keep `activeGroupId` valid when groups change (group removed, list reloaded\n // from store, etc.). When at least one group exists we always render charts\n // bucketed by group, so we need a definite active id.\n React.useEffect(() => {\n if (groups.length === 0) {\n setActiveGroupId(null)\n return\n }\n if (!activeGroupId || !groups.some((g) => g.id === activeGroupId)) {\n setActiveGroupId(groups[0]!.id)\n }\n }, [groups, activeGroupId])\n\n const editingChart = editingId ? charts.find((c) => c.id === editingId) : undefined\n\n // Build the chart bucket for the active group: charts whose `groupId`\n // matches OR (fallback) ungrouped charts when the active group is the\n // first one. Sorted by `order` then `createdAt`.\n const firstGroupId = groups[0]?.id ?? null\n const visibleCharts = React.useMemo(() => {\n if (groups.length === 0) return [...charts].sort(byChartOrder)\n if (!activeGroupId) return []\n const filtered = charts.filter((c) => {\n if (c.groupId) return c.groupId === activeGroupId\n // Ungrouped charts default into the first group so they remain visible.\n return activeGroupId === firstGroupId\n })\n return filtered.sort(byChartOrder)\n }, [charts, groups.length, activeGroupId, firstGroupId])\n\n const activeGroup = activeGroupId ? groups.find((g) => g.id === activeGroupId) ?? null : null\n\n const handleDeleteChart = async (chart: ChartDef): Promise<void> => {\n const ok = await dialogs.confirm({\n title: t('chart:deleteChartConfirm'),\n description: t('chart:deleteChartConfirmHint'),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (ok) removeChart(chart.id)\n }\n\n const handleDeleteGroup = async (group: ChartGroup): Promise<void> => {\n const count = charts.filter((c) => {\n if (c.groupId) return c.groupId === group.id\n // Ungrouped charts also belong to the first group at display time.\n return group.id === firstGroupId\n }).length\n const ok = await dialogs.confirm({\n title: t('chart:deleteGroupConfirm'),\n description: t('chart:deleteGroupConfirmHint').replace('{count}', String(count)),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (ok) removeGroup(group.id)\n }\n\n return (\n <div className=\"space-y-3 sm:space-y-6\">\n {/* ── Dashboard charts ──────────────────────────────────────── */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between p-3 pb-2 space-y-0 gap-2 sm:p-6 sm:pb-2\">\n <CardTitle>{t('chart:dashboard')}</CardTitle>\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setGroupDialog('new')}\n >\n <FolderPlus className=\"size-4\" />\n <span className=\"hidden sm:inline ml-1.5\">{t('chart:addGroup')}</span>\n </Button>\n <Button size=\"sm\" onClick={() => setBuilding(true)} disabled={navResources.length === 0}>\n <Plus className=\"size-4\" />\n <span className=\"hidden sm:inline ml-1.5\">{t('chart:addChart')}</span>\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"p-3 pt-0 sm:p-6 sm:pt-0\">\n {groups.length > 0 && activeGroupId && (\n <Tabs\n value={activeGroupId}\n onValueChange={(v) => setActiveGroupId(v)}\n className=\"mb-4\"\n >\n <div className=\"flex items-end justify-between gap-2\">\n <TabsList className=\"flex-1\">\n {groups.map((g) => (\n <TabsTrigger key={g.id} value={g.id}>\n {g.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {activeGroup && (\n <div className=\"mb-1 flex shrink-0 items-center gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setGroupDialog(activeGroup)}\n aria-label={t('chart:editGroup')}\n >\n <Pencil className=\"size-3.5\" />\n <span className=\"hidden sm:inline ml-1.5\">{t('chart:editGroup')}</span>\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void handleDeleteGroup(activeGroup)}\n aria-label={t('chart:deleteGroup')}\n >\n <Trash2 className=\"size-3.5\" />\n <span className=\"hidden sm:inline ml-1.5\">{t('chart:deleteGroup')}</span>\n </Button>\n </div>\n )}\n </div>\n </Tabs>\n )}\n\n {visibleCharts.length === 0 ? (\n <Empty className=\"border-0 py-4\">\n <EmptyHeader>\n <EmptyMedia>\n <BarChart2 />\n </EmptyMedia>\n <EmptyTitle>{t('chart:noCharts')}</EmptyTitle>\n <EmptyDescription>{t('chart:noChartsHint')}</EmptyDescription>\n </EmptyHeader>\n </Empty>\n ) : (\n <div className=\"grid gap-3 grid-cols-1 sm:gap-4 md:grid-cols-2\">\n {visibleCharts.map((c) => (\n <div\n key={c.id}\n className={c.width === 'full' ? 'md:col-span-2' : undefined}\n >\n <LazyChartWidget\n config={c}\n onEdit={() => setEditingId(c.id)}\n onDelete={() => void handleDeleteChart(c)}\n onMove={() => setMovingChart(c)}\n onUpdate={(input) => updateChart(c.id, input)}\n />\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* ── Resources list ────────────────────────────────────────── */}\n <Card>\n <CardHeader>\n <CardTitle>{t('common:resources')}</CardTitle>\n </CardHeader>\n <CardContent>\n {navResources.length === 0 ? (\n <Empty className=\"border-0\">\n <EmptyHeader>\n <EmptyMedia>\n <Database />\n </EmptyMedia>\n <EmptyTitle>{t('common:noRecords')}</EmptyTitle>\n <EmptyDescription>\n {t('common:noRecordsHint', { resource: 'resource' })}\n </EmptyDescription>\n </EmptyHeader>\n </Empty>\n ) : (\n <ul className=\"grid gap-2 sm:grid-cols-2 md:grid-cols-3\">\n {navResources.map((r) => (\n <li key={r.id}>\n <Link\n to={{ name: 'list', resourceId: r.id }}\n className=\"block rounded-md border border-border bg-card p-4 hover:border-primary/40 hover:shadow-sm transition-shadow\"\n >\n <div className=\"font-semibold\">{r.name}</div>\n {r.name !== r.id && (\n <div className=\"text-xs text-muted-foreground\">{r.id}</div>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n\n {/* ── Chart builder dialog ──────────────────────────────────── */}\n {building && (\n <ChartBuilderDialog\n onSave={(input) => {\n // New charts inherit the active group so the user sees them in\n // the tab they were on. The hook also auto-falls back to the\n // first group if `groupId` is undefined.\n addChart(activeGroupId ? { ...input, groupId: activeGroupId } : input)\n setBuilding(false)\n }}\n onClose={() => setBuilding(false)}\n />\n )}\n {editingChart && (\n <ChartBuilderDialog\n initial={editingChart}\n onSave={(input) => { updateChart(editingChart.id, input); setEditingId(null) }}\n onClose={() => setEditingId(null)}\n />\n )}\n\n {/* ── Move chart dialog ─────────────────────────────────────── */}\n {movingChart && (\n <MoveChartDialog\n groups={groups}\n initialGroupId={movingChart.groupId}\n initialOrder={movingChart.order}\n onSave={({ groupId, order }) => {\n updateChart(movingChart.id, { ...movingChart, groupId, order })\n setMovingChart(null)\n }}\n onClose={() => setMovingChart(null)}\n onCreateGroup={() => {\n setMovingChart(null)\n setGroupDialog('new')\n }}\n />\n )}\n\n {/* ── Group settings dialog ─────────────────────────────────── */}\n {groupDialog && (\n <GroupSettingsDialog\n initial={groupDialog === 'new' ? undefined : groupDialog}\n onSave={(input) => {\n if (groupDialog === 'new') {\n const newId = addGroup(input)\n setActiveGroupId(newId)\n } else {\n updateGroup(groupDialog.id, input)\n }\n setGroupDialog(null)\n }}\n onClose={() => setGroupDialog(null)}\n />\n )}\n </div>\n )\n}\n\n/** Sort charts within a group: by `order` asc, ties broken by `createdAt`. */\nfunction byChartOrder(a: ChartDef, b: ChartDef): number {\n if (a.order !== b.order) return a.order - b.order\n return a.createdAt.localeCompare(b.createdAt)\n}\n"],"file":"home-page-B1hrpu2S.js"}