@lunora/studio 1.0.0-alpha.29 → 1.0.0-alpha.290

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 (354) hide show
  1. package/LICENSE.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.mts +1581 -0
  4. package/dist/index.d.ts +974 -806
  5. package/dist/index.mjs +1 -0
  6. package/dist/mount.d.mts +22 -0
  7. package/dist/mount.d.ts +11 -10
  8. package/dist/mount.mjs +1 -0
  9. package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -0
  10. package/dist/packem_chunks/ApiTab.mjs +1 -0
  11. package/dist/packem_chunks/AuditPanel.mjs +1 -0
  12. package/dist/packem_chunks/DeploymentHealthPanel.mjs +1 -0
  13. package/dist/packem_chunks/ExportImportPanel.mjs +3 -0
  14. package/dist/packem_chunks/FileBrowser.mjs +4 -0
  15. package/dist/packem_chunks/FunctionRunner.mjs +1 -0
  16. package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -0
  17. package/dist/packem_chunks/HealthPanel.mjs +1 -0
  18. package/dist/packem_chunks/InsightsPanel.mjs +1 -0
  19. package/dist/packem_chunks/LogsPanel.mjs +1 -0
  20. package/dist/packem_chunks/MailPanel.mjs +2 -0
  21. package/dist/packem_chunks/MetricsPanel.mjs +1 -0
  22. package/dist/packem_chunks/NotificationsPanel.mjs +1 -0
  23. package/dist/packem_chunks/PitrPanel.mjs +1 -0
  24. package/dist/packem_chunks/SchemaViewer.mjs +1 -0
  25. package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -0
  26. package/dist/packem_chunks/SettingsPanel.mjs +1 -0
  27. package/dist/packem_chunks/SqlEditorPanel.mjs +10 -0
  28. package/dist/packem_chunks/TableEditor.mjs +1 -0
  29. package/dist/packem_chunks/agents-panel.mjs +1 -0
  30. package/dist/packem_chunks/ai-usage-panel.mjs +1 -0
  31. package/dist/packem_chunks/analytics-panel.mjs +1 -0
  32. package/dist/packem_chunks/architecture-panel.mjs +1 -0
  33. package/dist/packem_chunks/auth-audit-panel.mjs +1 -0
  34. package/dist/packem_chunks/auth-config-panel.mjs +1 -0
  35. package/dist/packem_chunks/auth-sessions-panel.mjs +1 -0
  36. package/dist/packem_chunks/containers-panel.mjs +1 -0
  37. package/dist/packem_chunks/dashboards-panel.mjs +1 -0
  38. package/dist/packem_chunks/evals-panel.mjs +1 -0
  39. package/dist/packem_chunks/fanout-panel.mjs +1 -0
  40. package/dist/packem_chunks/flags-panel.mjs +1 -0
  41. package/dist/packem_chunks/issues-panel.mjs +1 -0
  42. package/dist/packem_chunks/kv-browser.mjs +1 -0
  43. package/dist/packem_chunks/log-drains-panel.mjs +4 -0
  44. package/dist/packem_chunks/migrations-route.mjs +1 -0
  45. package/dist/packem_chunks/organizations-panel.mjs +1 -0
  46. package/dist/packem_chunks/payments-panel.mjs +1 -0
  47. package/dist/packem_chunks/permissions-panel.mjs +1 -0
  48. package/dist/packem_chunks/privacy-requests-panel.mjs +1 -0
  49. package/dist/packem_chunks/queues-panel.mjs +1 -0
  50. package/dist/packem_chunks/reactors-panel.mjs +1 -0
  51. package/dist/packem_chunks/rls-panel.mjs +1 -0
  52. package/dist/packem_chunks/schedule-panel.mjs +1 -0
  53. package/dist/packem_chunks/sparkline.mjs +1 -0
  54. package/dist/packem_chunks/storage-rules-panel.mjs +1 -0
  55. package/dist/packem_chunks/subscriptions-panel.mjs +1 -0
  56. package/dist/packem_chunks/sync-client-panel.mjs +1 -0
  57. package/dist/packem_chunks/traces-panel.mjs +1 -0
  58. package/dist/packem_chunks/users-panel.mjs +1 -0
  59. package/dist/packem_chunks/vector-browser.mjs +1 -0
  60. package/dist/packem_chunks/workflows-panel.mjs +1 -0
  61. package/dist/packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs +1 -0
  62. package/dist/packem_shared/ApiDocsPanel-fhDlZGE4.mjs +2 -0
  63. package/dist/packem_shared/ApiReferencePanel-nAf8tNRr.mjs +1 -0
  64. package/dist/packem_shared/CommandPalette-D9ZY-qQd.mjs +1 -0
  65. package/dist/packem_shared/ConfirmButton-DU4p72Er.mjs +1 -0
  66. package/dist/packem_shared/ConnectionBadge-B8Hj5DaE.mjs +1 -0
  67. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs +1 -0
  68. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs +1 -0
  69. package/dist/packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs +1 -0
  70. package/dist/packem_shared/DataBrowser-C14aRmmR.mjs +4 -0
  71. package/dist/packem_shared/DataFilters-CYZFt2EK.mjs +1 -0
  72. package/dist/packem_shared/ErrorBoundary-BWNF98VF.mjs +1 -0
  73. package/dist/packem_shared/GlobalDataBrowser-DhObcZDY.mjs +1 -0
  74. package/dist/packem_shared/HomePanel-CUuYsApa.mjs +1 -0
  75. package/dist/packem_shared/MigrationsPanel-CkVIwAbK.mjs +1 -0
  76. package/dist/packem_shared/OpenRpcReferencePanel-BxEr49D9.mjs +1 -0
  77. package/dist/packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.mjs +1 -0
  78. package/dist/packem_shared/ScheduledJobs-BZNcYWBP.mjs +1 -0
  79. package/dist/packem_shared/ShardInput-C6mjgAh4.mjs +1 -0
  80. package/dist/packem_shared/Studio-CZjQXFHC.mjs +1 -0
  81. package/dist/packem_shared/StudioApp-C9ENwcOH.mjs +1 -0
  82. package/dist/packem_shared/StudioI18nProvider-fVsCSs5L.mjs +1 -0
  83. package/dist/packem_shared/advisor-view-DzI2RQhY.mjs +1 -0
  84. package/dist/packem_shared/aggregateMetrics-DKFJc-o5.mjs +1 -0
  85. package/dist/packem_shared/alert-PB5W11MM.mjs +1 -0
  86. package/dist/packem_shared/app.d-D7vL0y8y.d.mts +349 -0
  87. package/dist/packem_shared/app.d-D7vL0y8y.d.ts +349 -0
  88. package/dist/packem_shared/auth-pager-DiDnXsfe.mjs +1 -0
  89. package/dist/packem_shared/badge-r_5B4LHP.mjs +1 -0
  90. package/dist/packem_shared/bar-chart-BCsEIQoQ.mjs +6 -0
  91. package/dist/packem_shared/browser-storage-BH1MxLZs.mjs +1 -0
  92. package/dist/packem_shared/button-q0UYSmrn.mjs +1 -0
  93. package/dist/packem_shared/card-By2O8ULa.mjs +1 -0
  94. package/dist/packem_shared/cf-links-CBJ5SywP.mjs +1 -0
  95. package/dist/packem_shared/checkbox-CnS9cyCz.mjs +1 -0
  96. package/dist/packem_shared/control-button-BOZ5K-FC.mjs +1 -0
  97. package/dist/packem_shared/data-grid-DIiNmDR9.mjs +1 -0
  98. package/dist/packem_shared/data-view-params-DhYmAkcj.mjs +1 -0
  99. package/dist/packem_shared/diagram-export-panel-D5CVNJkp.mjs +2 -0
  100. package/dist/packem_shared/dropdown-menu-jLZenfWH.mjs +2 -0
  101. package/dist/packem_shared/empty-state-D7jEML_T.mjs +1 -0
  102. package/dist/packem_shared/error-alert-DueSEkt-.mjs +1 -0
  103. package/dist/packem_shared/grid-features-OVIMIQan.mjs +6 -0
  104. package/dist/packem_shared/grid-pagination-DgzyzfBh.mjs +1 -0
  105. package/dist/packem_shared/home-panel-BcE8S2Nn.mjs +3 -0
  106. package/dist/packem_shared/input-CXhxesPC.mjs +1 -0
  107. package/dist/packem_shared/internal-Df43vQI0.mjs +2 -0
  108. package/dist/packem_shared/label-DKFzyHq6.mjs +1 -0
  109. package/dist/packem_shared/live-status-BuJdUZFU.mjs +1 -0
  110. package/dist/packem_shared/log-fields-BolUoZ9g.mjs +1 -0
  111. package/dist/packem_shared/log-line-CICyJ_kc.mjs +1 -0
  112. package/dist/packem_shared/metrics-format-1sNGG47R.mjs +1 -0
  113. package/dist/packem_shared/modal-shell-CDztwLnv.mjs +1 -0
  114. package/dist/packem_shared/operation-console-provider-DoloEvon.mjs +1 -0
  115. package/dist/packem_shared/recording-client-CyFiAE2l.mjs +1 -0
  116. package/dist/packem_shared/reference-view-CIHyURU6.mjs +13 -0
  117. package/dist/packem_shared/schema-diagram-C5oilX7l.mjs +2 -0
  118. package/dist/packem_shared/scroll-area-CXCQH7VT.mjs +2 -0
  119. package/dist/packem_shared/select-DPyS18Vy.mjs +2 -0
  120. package/dist/packem_shared/shard-history-CaO3C4KQ.mjs +1 -0
  121. package/dist/packem_shared/shortcuts-B9gDaXmw.mjs +1 -0
  122. package/dist/packem_shared/skeleton-DX1gfixl.mjs +1 -0
  123. package/dist/packem_shared/sparkline-B_sPPO_8.mjs +1 -0
  124. package/dist/packem_shared/sql-result-table-DyK762_A.mjs +1 -0
  125. package/dist/packem_shared/stat-card-BAv73QtB.mjs +1 -0
  126. package/dist/packem_shared/storage-tier-C2mKwYRj.mjs +1 -0
  127. package/dist/packem_shared/studio-fK2DTLde.mjs +2 -0
  128. package/dist/packem_shared/table-D0SBiDu-.mjs +2 -0
  129. package/dist/packem_shared/table-list-sidebar-DkPO_Qtz.mjs +1 -0
  130. package/dist/packem_shared/textarea--40GKAyz.mjs +1 -0
  131. package/dist/packem_shared/trace-handoff-BV3EWqy_.mjs +1 -0
  132. package/dist/packem_shared/use-admin-query-tlBof8Yg.mjs +1 -0
  133. package/dist/packem_shared/use-admin-spec-Bir7V68L.mjs +1 -0
  134. package/dist/packem_shared/use-async-submit-CZqCMTJ_.mjs +1 -0
  135. package/dist/packem_shared/use-auth-config-Z_n4ABCI.mjs +1 -0
  136. package/dist/packem_shared/use-mirrored-ref-CVDf2z1M.mjs +1 -0
  137. package/dist/packem_shared/use-open-trace-DMVhpnyG.mjs +1 -0
  138. package/dist/packem_shared/use-shard-key-BsP3o5wT.mjs +1 -0
  139. package/dist/packem_shared/use-sql-assistant-CZydTzd5.mjs +1 -0
  140. package/dist/packem_shared/useDebounced-DVeQ5-oW.mjs +1 -0
  141. package/dist/packem_shared/utils-bhneXptQ.mjs +1 -0
  142. package/dist/packem_shared/virtual-rect-D_j7aLxX.mjs +1 -0
  143. package/dist/packem_shared/wire-codec-B2DgCbKt.mjs +1 -0
  144. package/dist/standalone/chunk-253UHWDX.js +1 -0
  145. package/dist/standalone/chunk-2I4NHEKA.js +1 -0
  146. package/dist/standalone/chunk-2IKDEUCX.js +1 -0
  147. package/dist/standalone/chunk-2VA5S3IA.js +1 -0
  148. package/dist/standalone/chunk-37WYCOQ2.js +1 -0
  149. package/dist/standalone/chunk-3YXASVTP.js +1 -0
  150. package/dist/standalone/chunk-4A6ICQ33.js +1 -0
  151. package/dist/standalone/chunk-4JV44PC5.js +3 -0
  152. package/dist/standalone/chunk-4U2J2ME3.js +1 -0
  153. package/dist/standalone/chunk-4UO2OTLK.js +4 -0
  154. package/dist/standalone/chunk-4WD4XGC3.js +1 -0
  155. package/dist/standalone/chunk-4ZEL6BYL.js +1 -0
  156. package/dist/standalone/chunk-54JZD74E.js +15 -0
  157. package/dist/standalone/chunk-55UGUCQ6.js +1 -0
  158. package/dist/standalone/chunk-5B2RTXBS.js +1 -0
  159. package/dist/standalone/chunk-5KFKN5DE.js +1 -0
  160. package/dist/standalone/chunk-5QR2SQIS.js +1 -0
  161. package/dist/standalone/chunk-5WVYD4BT.js +1 -0
  162. package/dist/standalone/chunk-63IQGHPL.js +1 -0
  163. package/dist/standalone/chunk-6FGQ5E2B.js +1 -0
  164. package/dist/standalone/chunk-6HLARDYO.js +1 -0
  165. package/dist/standalone/chunk-6JHWSJQU.js +1 -0
  166. package/dist/standalone/chunk-6MPWC5MD.js +1 -0
  167. package/dist/standalone/chunk-6QTAHSDD.js +1 -0
  168. package/dist/standalone/chunk-6RXWGRH7.js +1 -0
  169. package/dist/standalone/chunk-7G4Z6Q7X.js +1 -0
  170. package/dist/standalone/chunk-7RKB5KS7.js +1 -0
  171. package/dist/standalone/chunk-7Y3SY37W.js +1 -0
  172. package/dist/standalone/chunk-A6EGILT4.js +1 -0
  173. package/dist/standalone/chunk-AF5ERKUP.js +1 -0
  174. package/dist/standalone/chunk-AGWOZ6P2.js +1 -0
  175. package/dist/standalone/chunk-AUAECCXB.js +1 -0
  176. package/dist/standalone/chunk-AUGKHAMQ.js +1 -0
  177. package/dist/standalone/chunk-BL4ORKKN.js +1 -0
  178. package/dist/standalone/chunk-BOMPSVRC.js +1 -0
  179. package/dist/standalone/chunk-C7DRRPQQ.js +1 -0
  180. package/dist/standalone/chunk-CCDX5RYT.js +1 -0
  181. package/dist/standalone/chunk-CESYGLNZ.js +1 -0
  182. package/dist/standalone/chunk-CGQMJYCW.js +1 -0
  183. package/dist/standalone/chunk-CK6HFTG7.js +1 -0
  184. package/dist/standalone/chunk-CQWFDDTK.js +15 -0
  185. package/dist/standalone/chunk-CVXNHIQW.js +1 -0
  186. package/dist/standalone/chunk-DQHTOUUS.js +1 -0
  187. package/dist/standalone/chunk-DVMO32RX.js +1 -0
  188. package/dist/standalone/chunk-E4PXACVL.js +3 -0
  189. package/dist/standalone/chunk-E5XPDR5D.js +1 -0
  190. package/dist/standalone/chunk-EASJRBTN.js +1 -0
  191. package/dist/standalone/chunk-ECY2JC5F.js +1 -0
  192. package/dist/standalone/chunk-EN2PGJWN.js +1 -0
  193. package/dist/standalone/chunk-F6VN7MAF.js +1 -0
  194. package/dist/standalone/chunk-FA46V4KR.js +1 -0
  195. package/dist/standalone/chunk-FED7KM46.js +1 -0
  196. package/dist/standalone/chunk-FGWGG424.js +1 -0
  197. package/dist/standalone/chunk-FPI7AMQJ.js +1 -0
  198. package/dist/standalone/chunk-FUYEZFBP.js +1 -0
  199. package/dist/standalone/chunk-G6N5A4TA.js +1 -0
  200. package/dist/standalone/chunk-GHQ2VDI2.js +1 -0
  201. package/dist/standalone/chunk-GJ6J6JZA.js +1 -0
  202. package/dist/standalone/chunk-GTV5WDXF.js +1 -0
  203. package/dist/standalone/chunk-GXXIGCIF.js +1 -0
  204. package/dist/standalone/chunk-HCTJKP5J.js +1 -0
  205. package/dist/standalone/chunk-HDVUWQQM.js +1 -0
  206. package/dist/standalone/chunk-HGTKL66S.js +14 -0
  207. package/dist/standalone/chunk-HJHSQPHW.js +19 -0
  208. package/dist/standalone/chunk-HPY2HNZK.js +5 -0
  209. package/dist/standalone/chunk-I26MS5PJ.js +1 -0
  210. package/dist/standalone/chunk-IHPSJ2PU.js +1 -0
  211. package/dist/standalone/chunk-IWZ7GVQO.js +1 -0
  212. package/dist/standalone/chunk-JNKH43IG.js +1 -0
  213. package/dist/standalone/chunk-JQXA2OYK.js +1 -0
  214. package/dist/standalone/chunk-JYTVI62T.js +1 -0
  215. package/dist/standalone/chunk-JZGTSH2C.js +4 -0
  216. package/dist/standalone/chunk-KIVY3C4V.js +1 -0
  217. package/dist/standalone/chunk-KKVPUQD2.js +1 -0
  218. package/dist/standalone/chunk-KU6ZTYP4.js +9 -0
  219. package/dist/standalone/chunk-MJ3WFI7T.js +1 -0
  220. package/dist/standalone/chunk-MKRA2W3P.js +3 -0
  221. package/dist/standalone/chunk-MVWZMWPD.js +1 -0
  222. package/dist/standalone/chunk-NCPW7WHO.js +1 -0
  223. package/dist/standalone/chunk-NDTQTKDX.js +6 -0
  224. package/dist/standalone/chunk-NGVP66OH.js +1 -0
  225. package/dist/standalone/chunk-NQZALRU3.js +1 -0
  226. package/dist/standalone/chunk-NR2U7C6X.js +1 -0
  227. package/dist/standalone/chunk-NRP22GKC.js +1 -0
  228. package/dist/standalone/chunk-NXQW5E6W.js +1 -0
  229. package/dist/standalone/chunk-OE6FYYDJ.js +1 -0
  230. package/dist/standalone/chunk-OFURQPKP.js +1 -0
  231. package/dist/standalone/chunk-OKQS3RV4.js +1 -0
  232. package/dist/standalone/chunk-OPM7ESDV.js +1 -0
  233. package/dist/standalone/chunk-OQ6I6OXT.js +2 -0
  234. package/dist/standalone/chunk-OSGXNEFA.js +1 -0
  235. package/dist/standalone/chunk-OYCUPD3Q.js +1 -0
  236. package/dist/standalone/chunk-PHEWXIFF.js +1 -0
  237. package/dist/standalone/chunk-PIMTWCRD.js +1 -0
  238. package/dist/standalone/chunk-PQPCOO6E.js +1 -0
  239. package/dist/standalone/chunk-Q6ED4KUL.js +1 -0
  240. package/dist/standalone/chunk-Q6IT6ZD7.js +1 -0
  241. package/dist/standalone/chunk-QAQDMS6R.js +1 -0
  242. package/dist/standalone/chunk-QJLHH3ET.js +1 -0
  243. package/dist/standalone/chunk-R6U22RSY.js +1 -0
  244. package/dist/standalone/chunk-RGMVGZV4.js +1 -0
  245. package/dist/standalone/chunk-RWVIV3U7.js +1 -0
  246. package/dist/standalone/chunk-RY2R7KP5.js +1 -0
  247. package/dist/standalone/chunk-S4Z7K55A.js +1 -0
  248. package/dist/standalone/chunk-SA2OGF3F.js +1 -0
  249. package/dist/standalone/chunk-SAOBVEGV.js +1 -0
  250. package/dist/standalone/chunk-SFPHDV3R.js +1 -0
  251. package/dist/standalone/chunk-SJQERRSZ.js +1 -0
  252. package/dist/standalone/chunk-SUOPCQD7.js +1 -0
  253. package/dist/standalone/chunk-SV764LKQ.js +1 -0
  254. package/dist/standalone/chunk-TRPBILYS.js +1 -0
  255. package/dist/standalone/chunk-UC7MNI2F.js +1 -0
  256. package/dist/standalone/chunk-UYEZR3BI.js +1 -0
  257. package/dist/standalone/chunk-VCFEO3RI.js +1 -0
  258. package/dist/standalone/chunk-VESGIGMQ.js +1 -0
  259. package/dist/standalone/chunk-VK26SQ7G.js +1 -0
  260. package/dist/standalone/chunk-VOJEROA7.js +1 -0
  261. package/dist/standalone/chunk-WJRYEML4.js +1 -0
  262. package/dist/standalone/chunk-WSUUMPYP.js +1 -0
  263. package/dist/standalone/chunk-XGCIDUJF.js +1 -0
  264. package/dist/standalone/chunk-XHRKNCCI.js +1 -0
  265. package/dist/standalone/chunk-XSZHBDQO.js +1 -0
  266. package/dist/standalone/chunk-Y3AYVFTK.js +1 -0
  267. package/dist/standalone/chunk-YF7ZNDI4.js +1 -0
  268. package/dist/standalone/chunk-YK7KJ3B6.js +1 -0
  269. package/dist/standalone/chunk-YKGW4P6U.js +1 -0
  270. package/dist/standalone/chunk-YU53KJ7Y.js +59 -0
  271. package/dist/standalone/chunk-YVR4SEPU.js +1 -0
  272. package/dist/standalone/chunk-Z22BDS6N.js +1 -0
  273. package/dist/standalone/chunk-ZEFFMYSN.js +8 -0
  274. package/dist/standalone/chunk-ZG4KF3SJ.js +1 -0
  275. package/dist/standalone/chunk-ZKESOLYY.js +1 -0
  276. package/dist/standalone/chunk-ZKJS6EBE.js +1 -0
  277. package/dist/standalone/chunk-ZMBT2OFU.js +2 -0
  278. package/dist/standalone/studio.js +9 -378
  279. package/dist/styles.css +2 -2
  280. package/package.json +25 -21
  281. package/dist/index.js +0 -41
  282. package/dist/mount.js +0 -26
  283. package/dist/packem_shared/ADMIN_FUNCTIONS-CdaxLGkE.js +0 -48
  284. package/dist/packem_shared/ApiDocsPanel-BSSgtcVf.js +0 -842
  285. package/dist/packem_shared/ApiReferencePanel-D24xOjCw.js +0 -229
  286. package/dist/packem_shared/ApiTab-vo8uhE29.js +0 -251
  287. package/dist/packem_shared/AuditPanel-CBjYR6S5.js +0 -200
  288. package/dist/packem_shared/CommandPalette-L-CuSRUc.js +0 -373
  289. package/dist/packem_shared/ConfirmButton-C2eVi2Qv.js +0 -59
  290. package/dist/packem_shared/ConnectionBadge-B2DDM2Tn.js +0 -111
  291. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js +0 -50
  292. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js +0 -89
  293. package/dist/packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js +0 -27
  294. package/dist/packem_shared/DataBrowser-DBKOIVKS.js +0 -4492
  295. package/dist/packem_shared/DataFilters-FNquMaiu.js +0 -249
  296. package/dist/packem_shared/ErrorBoundary-BzAApI7J.js +0 -66
  297. package/dist/packem_shared/ExportImportPanel-DtDEy4OD.js +0 -197
  298. package/dist/packem_shared/FileBrowser-DqLRjqsM.js +0 -2932
  299. package/dist/packem_shared/FunctionRunner-BmRkCvT4.js +0 -343
  300. package/dist/packem_shared/FunctionStatsPanel-Bi3kyQvu.js +0 -375
  301. package/dist/packem_shared/GlobalDataBrowser-DOjhvhKa.js +0 -289
  302. package/dist/packem_shared/HealthPanel-C7IPO6Ts.js +0 -648
  303. package/dist/packem_shared/HomePanel-dJIkHY_i.js +0 -14
  304. package/dist/packem_shared/InsightsPanel-BD29GXXd.js +0 -461
  305. package/dist/packem_shared/LogsPanel-2JhE1qep.js +0 -827
  306. package/dist/packem_shared/MailPanel-DwNsuFJC.js +0 -440
  307. package/dist/packem_shared/MetricsPanel-CRa4ITlq.js +0 -19
  308. package/dist/packem_shared/MigrationsPanel-Z1DmSSzf.js +0 -239
  309. package/dist/packem_shared/OpenRpcReferencePanel-Dq0yyVWz.js +0 -191
  310. package/dist/packem_shared/PitrPanel-3mec0LTF.js +0 -252
  311. package/dist/packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js +0 -3
  312. package/dist/packem_shared/ScheduledJobs--Z9GTmKb.js +0 -262
  313. package/dist/packem_shared/SchemaViewer-nxDV7dZJ.js +0 -2512
  314. package/dist/packem_shared/SecurityAdvisorPanel-5tYrJdvn.js +0 -92
  315. package/dist/packem_shared/SettingsPanel-SijRekVc.js +0 -390
  316. package/dist/packem_shared/ShardInput-gx_DZXXn.js +0 -107
  317. package/dist/packem_shared/SqlEditorPanel-DI4obotI.js +0 -13
  318. package/dist/packem_shared/Studio-B_L5Q2-X.js +0 -33
  319. package/dist/packem_shared/StudioApp-wxioPfiP.js +0 -657
  320. package/dist/packem_shared/StudioI18nProvider-B-tDCZIi.js +0 -48
  321. package/dist/packem_shared/TableEditor-1T-5KYtr.js +0 -11
  322. package/dist/packem_shared/advisor-view-DzqyvUU3.js +0 -159
  323. package/dist/packem_shared/aggregateMetrics-D4nUHEKU.js +0 -108
  324. package/dist/packem_shared/app.d-B6MyY_al.d.ts +0 -300
  325. package/dist/packem_shared/badge-B2PKA1-5.js +0 -49
  326. package/dist/packem_shared/bar-chart-CzJAgqkp.js +0 -3245
  327. package/dist/packem_shared/button-BhsN2uZH.js +0 -49
  328. package/dist/packem_shared/card-DURq3ElK.js +0 -175
  329. package/dist/packem_shared/cf-links-2cktDedA.js +0 -8
  330. package/dist/packem_shared/checkbox-UNkzAxl-.js +0 -63
  331. package/dist/packem_shared/data-grid-CrapHxR-.js +0 -183
  332. package/dist/packem_shared/dropdown-menu-WY4B_eJO.js +0 -280
  333. package/dist/packem_shared/empty-state-DY_oe0k6.js +0 -98
  334. package/dist/packem_shared/grid-features-DnTbXXNb.js +0 -840
  335. package/dist/packem_shared/home-panel-VdQI_8oX.js +0 -1700
  336. package/dist/packem_shared/input-XH4r1Pt1.js +0 -53
  337. package/dist/packem_shared/internal-CvMZCVd6.js +0 -68
  338. package/dist/packem_shared/label-D8ykjn5J.js +0 -46
  339. package/dist/packem_shared/live-status-FZ0psC1z.js +0 -44
  340. package/dist/packem_shared/metrics-panel-3FSfzgEX.js +0 -1611
  341. package/dist/packem_shared/reference-view-DVyk5kXj.js +0 -2180
  342. package/dist/packem_shared/shard-history-DyebH1R5.js +0 -38
  343. package/dist/packem_shared/sparkline-10dG-_f0.js +0 -93
  344. package/dist/packem_shared/sql-editor-panel-DBuIpCXk.js +0 -2562
  345. package/dist/packem_shared/storage-tier-CL98eOvn.js +0 -85
  346. package/dist/packem_shared/studio-Dm6H5DHS.js +0 -13388
  347. package/dist/packem_shared/table-DsCa9Qp9.js +0 -246
  348. package/dist/packem_shared/table-editor-7iSgi3te.js +0 -407
  349. package/dist/packem_shared/table-list-sidebar-BbSgfLJ2.js +0 -832
  350. package/dist/packem_shared/textarea-D3gaCU_-.js +0 -46
  351. package/dist/packem_shared/use-admin-query-CFl5GUg_.js +0 -105
  352. package/dist/packem_shared/useDebounced-Dxncpg6z.js +0 -32
  353. package/dist/packem_shared/utils-B05Dmz_H.js +0 -8
  354. package/dist/packem_shared/virtual-rect-CVMUskSm.js +0 -10
@@ -1,4492 +0,0 @@
1
- import { c } from 'react/compiler-runtime';
2
- import { useLunora } from '@lunora/react';
3
- import { useState, useRef, useEffect, useMemo, useCallback } from 'react';
4
- import { ConfirmButton } from './ConfirmButton-C2eVi2Qv.js';
5
- import { ShardInput } from './ShardInput-gx_DZXXn.js';
6
- import { E as EmptyState } from './empty-state-DY_oe0k6.js';
7
- import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
8
- import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-CdaxLGkE.js';
9
- import { g as formatCell, f as fireAndForget, c as callOptions, a as adminRef, b as formatTimestamp } from './internal-CvMZCVd6.js';
10
- import { useReactTable, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
11
- import { useVirtualizer } from '@tanstack/react-virtual';
12
- import { C as Checkbox } from './checkbox-UNkzAxl-.js';
13
- import { c as cn } from './utils-B05Dmz_H.js';
14
- import { f as flooredRectObserver } from './virtual-rect-CVMUskSm.js';
15
- import { G as GridContainer, C as CellValue, T as TransposedTable } from './data-grid-CrapHxR-.js';
16
- import { jsxDEV, Fragment } from 'react/jsx-dev-runtime';
17
- import { u as useFacets, T as TableListSidebar, G as GridPagination, D as DataFacets } from './table-list-sidebar-BbSgfLJ2.js';
18
- import { toFilterClauses, DataFilters } from './DataFilters-FNquMaiu.js';
19
- import { M as ModalShell, G as GridActionsBar, C as CellDetailDialog } from './grid-features-DnTbXXNb.js';
20
- import { u as useAdminQuery } from './use-admin-query-CFl5GUg_.js';
21
- import useDebounced from './useDebounced-Dxncpg6z.js';
22
- import { r as recordShard, l as loadRecentShards } from './shard-history-DyebH1R5.js';
23
-
24
- const CAMEL_BOUNDARY_RE = /([a-z\d])([A-Z])/gu;
25
- const WORD_SEPARATOR_RE = /[\s_-]+/u;
26
- const SENSITIVE_COLUMN_NAMES = /* @__PURE__ */ new Set(["access_token", "api_key", "apikey", "card_number", "client_secret", "credit_card", "cvv", "passwd", "password", "private_key", "pwd", "refresh_token", "secret", "ssn", "token"]);
27
- const tokenize = (name) => {
28
- const segments = name.replaceAll(CAMEL_BOUNDARY_RE, "$1 $2").split(WORD_SEPARATOR_RE).map((part) => part.toLowerCase()).filter((part) => part.length > 0);
29
- const tokens = new Set(segments);
30
- for (let index = 0; index < segments.length - 1; index += 1) {
31
- const current = segments[index];
32
- const next = segments[index + 1];
33
- if (current === void 0 || next === void 0) {
34
- continue;
35
- }
36
- tokens.add(`${current}${next}`);
37
- tokens.add(`${current}_${next}`);
38
- }
39
- return [...tokens];
40
- };
41
- const CUSTOM_MASK_SENTINEL = "•••";
42
- const fnv1aHex = (input) => {
43
- let hash = 2166136261;
44
- for (let index = 0; index < input.length; index += 1) {
45
- hash ^= input.codePointAt(index) ?? 0;
46
- hash = Math.imul(hash, 16777619);
47
- }
48
- return (hash >>> 0).toString(16).padStart(8, "0");
49
- };
50
- const maskValue = (value, strategy) => {
51
- try {
52
- if (strategy === "redact") {
53
- return null;
54
- }
55
- if (strategy === "hash") {
56
- if (value === null || value === void 0) {
57
- return value;
58
- }
59
- return fnv1aHex(typeof value === "string" ? value : JSON.stringify(value));
60
- }
61
- return CUSTOM_MASK_SENTINEL;
62
- } catch {
63
- return CUSTOM_MASK_SENTINEL;
64
- }
65
- };
66
- const maskColumnsForTable = (columns, table) => {
67
- const map = /* @__PURE__ */ new Map();
68
- for (const entry of columns) {
69
- if (entry.table === table) {
70
- map.set(entry.column, entry.strategy);
71
- }
72
- }
73
- return map;
74
- };
75
- const isSensitiveColumnName = (name) => {
76
- for (const token of tokenize(name)) {
77
- if (SENSITIVE_COLUMN_NAMES.has(token)) {
78
- return true;
79
- }
80
- }
81
- return false;
82
- };
83
- const mergeSensitiveColumns = (explicit, columnNames) => {
84
- const heuristic = columnNames.filter((column) => !explicit.has(column) && isSensitiveColumnName(column));
85
- if (heuristic.length === 0) {
86
- return explicit;
87
- }
88
- const merged = new Map(explicit);
89
- for (const column of heuristic) {
90
- merged.set(column, "redact");
91
- }
92
- return merged;
93
- };
94
- const maskCell = (value, column, view) => {
95
- if (!view.enabled) {
96
- return value;
97
- }
98
- const strategy = view.columns.get(column);
99
- return strategy === void 0 ? value : maskValue(value, strategy);
100
- };
101
- const maskRows = (rows, view) => {
102
- if (!view.enabled || view.columns.size === 0) {
103
- return rows;
104
- }
105
- return rows.map((row) => {
106
- const masked = {
107
- ...row
108
- };
109
- for (const [column, strategy] of view.columns) {
110
- if (column in masked) {
111
- masked[column] = maskValue(masked[column], strategy);
112
- }
113
- }
114
- return masked;
115
- });
116
- };
117
-
118
- const useStagedEdits = () => {
119
- const $ = c(11);
120
- let t0;
121
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
122
- t0 = {};
123
- $[0] = t0;
124
- } else {
125
- t0 = $[0];
126
- }
127
- const [staged, setStaged] = useState(t0);
128
- let t1;
129
- if ($[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
130
- t1 = (rowId, column, value) => {
131
- setStaged((previous) => ({
132
- ...previous,
133
- [rowId]: {
134
- ...previous[rowId],
135
- [column]: value
136
- }
137
- }));
138
- };
139
- $[1] = t1;
140
- } else {
141
- t1 = $[1];
142
- }
143
- const stage = t1;
144
- let t2;
145
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
146
- t2 = () => {
147
- setStaged({});
148
- };
149
- $[2] = t2;
150
- } else {
151
- t2 = $[2];
152
- }
153
- const clear = t2;
154
- let t3;
155
- if ($[3] !== staged) {
156
- t3 = (rowId_0, column_0) => {
157
- const row = staged[rowId_0];
158
- return row !== void 0 && column_0 in row ? {
159
- value: row[column_0]
160
- } : void 0;
161
- };
162
- $[3] = staged;
163
- $[4] = t3;
164
- } else {
165
- t3 = $[4];
166
- }
167
- const stagedValue = t3;
168
- let t4;
169
- if ($[5] !== staged) {
170
- t4 = Object.values(staged).reduce(_temp$1, 0);
171
- $[5] = staged;
172
- $[6] = t4;
173
- } else {
174
- t4 = $[6];
175
- }
176
- const count = t4;
177
- let t5;
178
- if ($[7] !== count || $[8] !== staged || $[9] !== stagedValue) {
179
- t5 = {
180
- clear,
181
- count,
182
- stage,
183
- staged,
184
- stagedValue
185
- };
186
- $[7] = count;
187
- $[8] = staged;
188
- $[9] = stagedValue;
189
- $[10] = t5;
190
- } else {
191
- t5 = $[10];
192
- }
193
- return t5;
194
- };
195
- const coerceCellValue = (raw, original) => {
196
- if (typeof original === "number") {
197
- const parsed = Number(raw);
198
- return raw.trim() === "" || Number.isNaN(parsed) ? raw : parsed;
199
- }
200
- if (typeof original === "boolean") {
201
- if (raw === "true") {
202
- return true;
203
- }
204
- if (raw === "false") {
205
- return false;
206
- }
207
- }
208
- return raw;
209
- };
210
- const StagedDiffPanel = (t0) => {
211
- const $ = c(29);
212
- const {
213
- changes,
214
- committing,
215
- onCommit,
216
- onDiscard
217
- } = t0;
218
- const t = useT();
219
- let t1;
220
- if ($[0] !== changes.length || $[1] !== t) {
221
- t1 = t("{count} pending changes", {
222
- count: changes.length
223
- });
224
- $[0] = changes.length;
225
- $[1] = t;
226
- $[2] = t1;
227
- } else {
228
- t1 = $[2];
229
- }
230
- let t2;
231
- if ($[3] !== t1) {
232
- t2 = /* @__PURE__ */ jsxDEV("span", {
233
- className: "font-mono text-[11px] tracking-wide uppercase text-warning",
234
- "data-testid": "db-staged-count",
235
- children: t1
236
- }, void 0, false);
237
- $[3] = t1;
238
- $[4] = t2;
239
- } else {
240
- t2 = $[4];
241
- }
242
- let t3;
243
- if ($[5] !== committing || $[6] !== t) {
244
- t3 = committing ? t("Committing…") : t("Commit");
245
- $[5] = committing;
246
- $[6] = t;
247
- $[7] = t3;
248
- } else {
249
- t3 = $[7];
250
- }
251
- let t4;
252
- if ($[8] !== committing || $[9] !== onCommit || $[10] !== t3) {
253
- t4 = /* @__PURE__ */ jsxDEV("button", {
254
- className: "ms-auto rounded-md bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground outline-none transition-colors hover:bg-primary/90 focus-visible:bg-primary/90 disabled:pointer-events-none disabled:opacity-50",
255
- "data-testid": "db-staged-commit",
256
- disabled: committing,
257
- onClick: onCommit,
258
- type: "button",
259
- children: t3
260
- }, void 0, false);
261
- $[8] = committing;
262
- $[9] = onCommit;
263
- $[10] = t3;
264
- $[11] = t4;
265
- } else {
266
- t4 = $[11];
267
- }
268
- let t5;
269
- if ($[12] !== t) {
270
- t5 = t("Discard");
271
- $[12] = t;
272
- $[13] = t5;
273
- } else {
274
- t5 = $[13];
275
- }
276
- let t6;
277
- if ($[14] !== committing || $[15] !== onDiscard || $[16] !== t5) {
278
- t6 = /* @__PURE__ */ jsxDEV("button", {
279
- className: "rounded-md border border-border px-2.5 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent disabled:pointer-events-none disabled:opacity-50",
280
- "data-testid": "db-staged-discard",
281
- disabled: committing,
282
- onClick: onDiscard,
283
- type: "button",
284
- children: t5
285
- }, void 0, false);
286
- $[14] = committing;
287
- $[15] = onDiscard;
288
- $[16] = t5;
289
- $[17] = t6;
290
- } else {
291
- t6 = $[17];
292
- }
293
- let t7;
294
- if ($[18] !== t2 || $[19] !== t4 || $[20] !== t6) {
295
- t7 = /* @__PURE__ */ jsxDEV("div", {
296
- className: "flex flex-wrap items-center gap-2",
297
- children: [t2, t4, t6]
298
- }, void 0, true);
299
- $[18] = t2;
300
- $[19] = t4;
301
- $[20] = t6;
302
- $[21] = t7;
303
- } else {
304
- t7 = $[21];
305
- }
306
- let t8;
307
- if ($[22] !== changes) {
308
- t8 = changes.map(_temp2);
309
- $[22] = changes;
310
- $[23] = t8;
311
- } else {
312
- t8 = $[23];
313
- }
314
- let t9;
315
- if ($[24] !== t8) {
316
- t9 = /* @__PURE__ */ jsxDEV("ul", {
317
- className: "flex flex-col gap-1",
318
- "data-testid": "db-staged-list",
319
- children: t8
320
- }, void 0, false);
321
- $[24] = t8;
322
- $[25] = t9;
323
- } else {
324
- t9 = $[25];
325
- }
326
- let t10;
327
- if ($[26] !== t7 || $[27] !== t9) {
328
- t10 = /* @__PURE__ */ jsxDEV("div", {
329
- className: "flex flex-col gap-2 border border-warning/40 bg-warning/5 p-3",
330
- "data-testid": "db-staged",
331
- children: [t7, t9]
332
- }, void 0, true);
333
- $[26] = t7;
334
- $[27] = t9;
335
- $[28] = t10;
336
- } else {
337
- t10 = $[28];
338
- }
339
- return t10;
340
- };
341
- function _temp$1(sum, columns) {
342
- return sum + Object.keys(columns).length;
343
- }
344
- function _temp2(change) {
345
- return /* @__PURE__ */ jsxDEV("li", {
346
- className: "flex flex-wrap items-center gap-2 font-mono text-xs",
347
- children: [/* @__PURE__ */ jsxDEV("span", {
348
- className: "text-muted-foreground",
349
- children: [change.rowId, ".", change.column]
350
- }, void 0, true), /* @__PURE__ */ jsxDEV("span", {
351
- className: "text-destructive line-through",
352
- children: formatCell(change.oldValue)
353
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
354
- "aria-hidden": "true",
355
- className: "text-muted-foreground",
356
- children: "→"
357
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
358
- className: "text-foreground",
359
- children: formatCell(change.newValue)
360
- }, void 0, false)]
361
- }, `${change.rowId}:${change.column}`, true);
362
- }
363
-
364
- const SCROLL_HEIGHT = 400;
365
- const ROW_HEIGHT = 36;
366
- const SCROLL_STYLE = {
367
- flex: "1 1 0%",
368
- minHeight: 0,
369
- overflow: "auto",
370
- position: "relative"
371
- };
372
- const ROWS_STYLE = {
373
- width: "100%"
374
- };
375
- const ROW_BASE_STYLE = {
376
- alignItems: "center",
377
- display: "flex",
378
- left: 0,
379
- position: "absolute",
380
- top: 0,
381
- width: "100%"
382
- };
383
- const HEAD_ROW_STYLE = {
384
- display: "flex",
385
- width: "100%"
386
- };
387
- const ACTION_CELL_STYLE = {
388
- flex: "0 0 8.5rem",
389
- padding: "0.375rem 0.75rem"
390
- };
391
- const PINNED_DATA_LEFT = "2.5rem";
392
- const SELECT_CELL_STYLE = {
393
- alignItems: "center",
394
- display: "flex",
395
- flex: "0 0 2.5rem",
396
- justifyContent: "center",
397
- left: 0,
398
- padding: "0.375rem 0",
399
- position: "sticky",
400
- zIndex: 2
401
- };
402
- const sizedCellStyle = (width) => {
403
- return {
404
- flex: "0 0 auto",
405
- overflow: "hidden",
406
- padding: "0.375rem 0.75rem",
407
- position: "relative",
408
- textOverflow: "ellipsis",
409
- whiteSpace: "nowrap",
410
- width: `${width.toString()}px`
411
- };
412
- };
413
- const pinnedDataCellStyle = (width) => {
414
- return {
415
- ...sizedCellStyle(width),
416
- left: PINNED_DATA_LEFT,
417
- position: "sticky",
418
- zIndex: 2
419
- };
420
- };
421
- const ROW_BTN = "rounded-md px-2 py-0.5 text-xs font-medium text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:bg-accent disabled:pointer-events-none disabled:opacity-50";
422
- const rowId = (row) => {
423
- for (const key of ["id", "__id__", "_id"]) {
424
- const value = row[key];
425
- if (typeof value === "string" || typeof value === "number") {
426
- return String(value);
427
- }
428
- }
429
- return null;
430
- };
431
- const rowKey = (row, index) => rowId(row) ?? `row-${index.toString()}`;
432
- const PREVIEW_FIELD_LIMIT = 8;
433
- const RefPreviewCard = (t0) => {
434
- const $ = c(16);
435
- const {
436
- anchor,
437
- state
438
- } = t0;
439
- const t = useT();
440
- let t1;
441
- if ($[0] !== anchor.left || $[1] !== anchor.top) {
442
- t1 = {
443
- left: anchor.left,
444
- position: "fixed",
445
- top: anchor.top,
446
- zIndex: 50
447
- };
448
- $[0] = anchor.left;
449
- $[1] = anchor.top;
450
- $[2] = t1;
451
- } else {
452
- t1 = $[2];
453
- }
454
- const style = t1;
455
- let body;
456
- if (state === "loading") {
457
- let t22;
458
- if ($[3] !== t) {
459
- t22 = t("Loading…");
460
- $[3] = t;
461
- $[4] = t22;
462
- } else {
463
- t22 = $[4];
464
- }
465
- let t3;
466
- if ($[5] !== t22) {
467
- t3 = /* @__PURE__ */ jsxDEV("p", {
468
- className: "px-3 py-2 text-xs text-muted-foreground",
469
- children: t22
470
- }, void 0, false);
471
- $[5] = t22;
472
- $[6] = t3;
473
- } else {
474
- t3 = $[6];
475
- }
476
- body = t3;
477
- } else {
478
- if (state.row === null) {
479
- let t22;
480
- if ($[7] !== t) {
481
- t22 = t("No matching row.");
482
- $[7] = t;
483
- $[8] = t22;
484
- } else {
485
- t22 = $[8];
486
- }
487
- let t3;
488
- if ($[9] !== t22) {
489
- t3 = /* @__PURE__ */ jsxDEV("p", {
490
- className: "px-3 py-2 text-xs text-muted-foreground",
491
- children: t22
492
- }, void 0, false);
493
- $[9] = t22;
494
- $[10] = t3;
495
- } else {
496
- t3 = $[10];
497
- }
498
- body = t3;
499
- } else {
500
- let t22;
501
- if ($[11] !== state.row) {
502
- const entries = Object.entries(state.row).slice(0, PREVIEW_FIELD_LIMIT);
503
- t22 = /* @__PURE__ */ jsxDEV("dl", {
504
- className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 px-3 py-2",
505
- children: entries.map(_temp)
506
- }, void 0, false);
507
- $[11] = state.row;
508
- $[12] = t22;
509
- } else {
510
- t22 = $[12];
511
- }
512
- body = t22;
513
- }
514
- }
515
- let t2;
516
- if ($[13] !== body || $[14] !== style) {
517
- t2 = /* @__PURE__ */ jsxDEV("div", {
518
- className: "pointer-events-none w-72 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground",
519
- "data-testid": "db-ref-preview",
520
- role: "tooltip",
521
- style,
522
- children: body
523
- }, void 0, false);
524
- $[13] = body;
525
- $[14] = style;
526
- $[15] = t2;
527
- } else {
528
- t2 = $[15];
529
- }
530
- return t2;
531
- };
532
- const RefCell = (t0) => {
533
- const $ = c(22);
534
- const {
535
- column,
536
- id,
537
- onNavigate,
538
- onPreview,
539
- target
540
- } = t0;
541
- const [anchor, setAnchor] = useState(null);
542
- const [preview, setPreview] = useState("idle");
543
- let t1;
544
- if ($[0] !== id || $[1] !== onNavigate || $[2] !== target) {
545
- t1 = () => {
546
- onNavigate(target, id);
547
- };
548
- $[0] = id;
549
- $[1] = onNavigate;
550
- $[2] = target;
551
- $[3] = t1;
552
- } else {
553
- t1 = $[3];
554
- }
555
- const onClick = t1;
556
- let t2;
557
- if ($[4] !== id || $[5] !== onPreview || $[6] !== preview || $[7] !== target) {
558
- t2 = (event) => {
559
- const rect = event.currentTarget.getBoundingClientRect();
560
- setAnchor({
561
- left: rect.left,
562
- top: rect.bottom + 4
563
- });
564
- if (preview !== "idle") {
565
- return;
566
- }
567
- setPreview("loading");
568
- const load = async () => {
569
- try {
570
- setPreview({
571
- row: await onPreview(target, id)
572
- });
573
- } catch {
574
- setPreview({
575
- row: null
576
- });
577
- }
578
- };
579
- fireAndForget(load());
580
- };
581
- $[4] = id;
582
- $[5] = onPreview;
583
- $[6] = preview;
584
- $[7] = target;
585
- $[8] = t2;
586
- } else {
587
- t2 = $[8];
588
- }
589
- const onOpen = t2;
590
- let t3;
591
- if ($[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
592
- t3 = () => {
593
- setAnchor(null);
594
- };
595
- $[9] = t3;
596
- } else {
597
- t3 = $[9];
598
- }
599
- const onCloseHover = t3;
600
- const t4 = `db-ref-${column}`;
601
- const t5 = `Open ${target} ${id}`;
602
- let t6;
603
- if ($[10] !== id || $[11] !== onClick || $[12] !== onOpen || $[13] !== t4 || $[14] !== t5) {
604
- t6 = /* @__PURE__ */ jsxDEV("button", {
605
- "data-testid": t4,
606
- onBlur: onCloseHover,
607
- onClick,
608
- onFocus: onOpen,
609
- onMouseEnter: onOpen,
610
- onMouseLeave: onCloseHover,
611
- title: t5,
612
- type: "button",
613
- children: [id, " ↗"]
614
- }, void 0, true);
615
- $[10] = id;
616
- $[11] = onClick;
617
- $[12] = onOpen;
618
- $[13] = t4;
619
- $[14] = t5;
620
- $[15] = t6;
621
- } else {
622
- t6 = $[15];
623
- }
624
- let t7;
625
- if ($[16] !== anchor || $[17] !== preview) {
626
- t7 = anchor !== null && preview !== "idle" && /* @__PURE__ */ jsxDEV(RefPreviewCard, {
627
- anchor,
628
- state: preview
629
- }, void 0, false);
630
- $[16] = anchor;
631
- $[17] = preview;
632
- $[18] = t7;
633
- } else {
634
- t7 = $[18];
635
- }
636
- let t8;
637
- if ($[19] !== t6 || $[20] !== t7) {
638
- t8 = /* @__PURE__ */ jsxDEV(Fragment, {
639
- children: [t6, t7]
640
- }, void 0, true);
641
- $[19] = t6;
642
- $[20] = t7;
643
- $[21] = t8;
644
- } else {
645
- t8 = $[21];
646
- }
647
- return t8;
648
- };
649
- const sortIndicator = (sorted) => {
650
- if (sorted === "asc") {
651
- return " ▲";
652
- }
653
- if (sorted === "desc") {
654
- return " ▼";
655
- }
656
- return "";
657
- };
658
- const EXPAND_BTN = "absolute end-1 top-1/2 hidden -translate-y-1/2 items-center justify-center rounded text-muted-foreground outline-none group-hover/cell:flex hover:text-foreground focus-visible:flex";
659
- const CellExpandButton = (t0) => {
660
- const $ = c(8);
661
- const {
662
- column,
663
- onExpand,
664
- value
665
- } = t0;
666
- let t1;
667
- if ($[0] !== column || $[1] !== onExpand || $[2] !== value) {
668
- t1 = () => {
669
- onExpand(column, value);
670
- };
671
- $[0] = column;
672
- $[1] = onExpand;
673
- $[2] = value;
674
- $[3] = t1;
675
- } else {
676
- t1 = $[3];
677
- }
678
- const onClick = t1;
679
- const t2 = `db-expand-${column}`;
680
- let t3;
681
- if ($[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
682
- t3 = /* @__PURE__ */ jsxDEV("svg", {
683
- "aria-hidden": "true",
684
- className: "size-3",
685
- fill: "none",
686
- stroke: "currentColor",
687
- strokeLinecap: "round",
688
- strokeLinejoin: "round",
689
- strokeWidth: 1.8,
690
- viewBox: "0 0 24 24",
691
- children: /* @__PURE__ */ jsxDEV("path", {
692
- d: "M9 21H5a2 2 0 0 1-2-2v-4m18 0v4a2 2 0 0 1-2 2h-4M3 9V5a2 2 0 0 1 2-2h4m6 0h4a2 2 0 0 1 2 2v4"
693
- }, void 0, false)
694
- }, void 0, false);
695
- $[4] = t3;
696
- } else {
697
- t3 = $[4];
698
- }
699
- let t4;
700
- if ($[5] !== onClick || $[6] !== t2) {
701
- t4 = /* @__PURE__ */ jsxDEV("button", {
702
- "aria-label": "Expand cell",
703
- className: EXPAND_BTN,
704
- "data-testid": t2,
705
- onClick,
706
- type: "button",
707
- children: t3
708
- }, void 0, false);
709
- $[5] = onClick;
710
- $[6] = t2;
711
- $[7] = t4;
712
- } else {
713
- t4 = $[7];
714
- }
715
- return t4;
716
- };
717
- const CellEditor = (t0) => {
718
- const $ = c(14);
719
- const {
720
- column,
721
- initial,
722
- onCancel,
723
- onCommit,
724
- recordId
725
- } = t0;
726
- const ref = useRef(null);
727
- let t1;
728
- let t2;
729
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
730
- t1 = () => {
731
- ref.current?.select();
732
- };
733
- t2 = [];
734
- $[0] = t1;
735
- $[1] = t2;
736
- } else {
737
- t1 = $[0];
738
- t2 = $[1];
739
- }
740
- useEffect(t1, t2);
741
- let t3;
742
- if ($[2] !== onCancel || $[3] !== onCommit) {
743
- t3 = (event) => {
744
- if (event.key === "Enter") {
745
- event.preventDefault();
746
- onCommit(event.currentTarget.value);
747
- } else {
748
- if (event.key === "Escape") {
749
- event.preventDefault();
750
- onCancel();
751
- }
752
- }
753
- };
754
- $[2] = onCancel;
755
- $[3] = onCommit;
756
- $[4] = t3;
757
- } else {
758
- t3 = $[4];
759
- }
760
- const onKeyDown = t3;
761
- let t4;
762
- if ($[5] !== onCommit) {
763
- t4 = (event_0) => {
764
- onCommit(event_0.currentTarget.value);
765
- };
766
- $[5] = onCommit;
767
- $[6] = t4;
768
- } else {
769
- t4 = $[6];
770
- }
771
- const onBlur = t4;
772
- const t5 = `db-cell-input-${recordId}-${column}`;
773
- let t6;
774
- if ($[7] !== initial) {
775
- t6 = formatCell(initial);
776
- $[7] = initial;
777
- $[8] = t6;
778
- } else {
779
- t6 = $[8];
780
- }
781
- let t7;
782
- if ($[9] !== onBlur || $[10] !== onKeyDown || $[11] !== t5 || $[12] !== t6) {
783
- t7 = /* @__PURE__ */ jsxDEV("input", {
784
- className: "w-full rounded border border-ring bg-background px-1 py-0.5 font-mono text-xs outline-none",
785
- "data-testid": t5,
786
- defaultValue: t6,
787
- onBlur,
788
- onKeyDown,
789
- ref
790
- }, void 0, false);
791
- $[9] = onBlur;
792
- $[10] = onKeyDown;
793
- $[11] = t5;
794
- $[12] = t6;
795
- $[13] = t7;
796
- } else {
797
- t7 = $[13];
798
- }
799
- return t7;
800
- };
801
- const EditableCell = (t0) => {
802
- const $ = c(63);
803
- const {
804
- cell,
805
- edit,
806
- mask,
807
- refs
808
- } = t0;
809
- const column = cell.column.id;
810
- let id;
811
- let rawValue;
812
- let t1;
813
- let t2;
814
- if ($[0] !== cell || $[1] !== column || $[2] !== edit || $[3] !== mask || $[4] !== refs.columns || $[5] !== refs.onNavigate || $[6] !== refs.onPreview) {
815
- t2 = /* @__PURE__ */ Symbol.for("react.early_return_sentinel");
816
- bb0: {
817
- rawValue = cell.getValue();
818
- id = rowId(cell.row.original);
819
- const target = refs.columns?.[column];
820
- if (mask.enabled && mask.columns.has(column)) {
821
- const t32 = `db-masked-${column}`;
822
- const t42 = /* @__PURE__ */ jsxDEV(CellValue, {
823
- value: maskCell(rawValue, column, mask)
824
- }, void 0, false);
825
- let t52;
826
- if ($[11] !== t32 || $[12] !== t42) {
827
- t52 = /* @__PURE__ */ jsxDEV("span", {
828
- className: "text-muted-foreground italic",
829
- "data-testid": t32,
830
- title: "Masked (preview)",
831
- children: t42
832
- }, void 0, false);
833
- $[11] = t32;
834
- $[12] = t42;
835
- $[13] = t52;
836
- } else {
837
- t52 = $[13];
838
- }
839
- t2 = t52;
840
- break bb0;
841
- }
842
- if (target !== void 0 && (typeof rawValue === "string" || typeof rawValue === "number") && String(rawValue) !== "") {
843
- const t32 = String(rawValue);
844
- const t42 = `${target}:${String(rawValue)}`;
845
- let t52;
846
- if ($[14] !== column || $[15] !== refs.onNavigate || $[16] !== refs.onPreview || $[17] !== t32 || $[18] !== t42 || $[19] !== target) {
847
- t52 = /* @__PURE__ */ jsxDEV(RefCell, {
848
- column,
849
- id: t32,
850
- onNavigate: refs.onNavigate,
851
- onPreview: refs.onPreview,
852
- target
853
- }, t42, false);
854
- $[14] = column;
855
- $[15] = refs.onNavigate;
856
- $[16] = refs.onPreview;
857
- $[17] = t32;
858
- $[18] = t42;
859
- $[19] = target;
860
- $[20] = t52;
861
- } else {
862
- t52 = $[20];
863
- }
864
- t2 = t52;
865
- break bb0;
866
- }
867
- if (id === null) {
868
- let t32;
869
- if ($[21] !== rawValue) {
870
- t32 = /* @__PURE__ */ jsxDEV(CellValue, {
871
- value: rawValue
872
- }, void 0, false);
873
- $[21] = rawValue;
874
- $[22] = t32;
875
- } else {
876
- t32 = $[22];
877
- }
878
- let t42;
879
- if ($[23] !== column || $[24] !== edit.onExpandCell || $[25] !== rawValue) {
880
- t42 = /* @__PURE__ */ jsxDEV(CellExpandButton, {
881
- column,
882
- onExpand: edit.onExpandCell,
883
- value: rawValue
884
- }, void 0, false);
885
- $[23] = column;
886
- $[24] = edit.onExpandCell;
887
- $[25] = rawValue;
888
- $[26] = t42;
889
- } else {
890
- t42 = $[26];
891
- }
892
- let t52;
893
- if ($[27] !== t32 || $[28] !== t42) {
894
- t52 = /* @__PURE__ */ jsxDEV(Fragment, {
895
- children: [t32, t42]
896
- }, void 0, true);
897
- $[27] = t32;
898
- $[28] = t42;
899
- $[29] = t52;
900
- } else {
901
- t52 = $[29];
902
- }
903
- t2 = t52;
904
- break bb0;
905
- }
906
- t1 = edit.stagedValue(id, column);
907
- }
908
- $[0] = cell;
909
- $[1] = column;
910
- $[2] = edit;
911
- $[3] = mask;
912
- $[4] = refs.columns;
913
- $[5] = refs.onNavigate;
914
- $[6] = refs.onPreview;
915
- $[7] = id;
916
- $[8] = rawValue;
917
- $[9] = t1;
918
- $[10] = t2;
919
- } else {
920
- id = $[7];
921
- rawValue = $[8];
922
- t1 = $[9];
923
- t2 = $[10];
924
- }
925
- if (t2 !== /* @__PURE__ */ Symbol.for("react.early_return_sentinel")) {
926
- return t2;
927
- }
928
- const staged = t1;
929
- const display = staged === void 0 ? rawValue : staged.value;
930
- let t3;
931
- if ($[30] !== column || $[31] !== edit) {
932
- t3 = edit.editable && edit.editableColumn(column);
933
- $[30] = column;
934
- $[31] = edit;
935
- $[32] = t3;
936
- } else {
937
- t3 = $[32];
938
- }
939
- const canEdit = t3;
940
- const isEditing = edit.editingCell !== null && edit.editingCell.rowId === id && edit.editingCell.column === column;
941
- if (isEditing) {
942
- let t42;
943
- if ($[33] !== column || $[34] !== edit || $[35] !== id || $[36] !== rawValue) {
944
- t42 = (raw) => {
945
- edit.stage(id, column, coerceCellValue(raw, rawValue));
946
- edit.cancelEdit();
947
- };
948
- $[33] = column;
949
- $[34] = edit;
950
- $[35] = id;
951
- $[36] = rawValue;
952
- $[37] = t42;
953
- } else {
954
- t42 = $[37];
955
- }
956
- let t52;
957
- if ($[38] !== column || $[39] !== display || $[40] !== edit.cancelEdit || $[41] !== id || $[42] !== t42) {
958
- t52 = /* @__PURE__ */ jsxDEV(CellEditor, {
959
- column,
960
- initial: display,
961
- onCancel: edit.cancelEdit,
962
- onCommit: t42,
963
- recordId: id
964
- }, void 0, false);
965
- $[38] = column;
966
- $[39] = display;
967
- $[40] = edit.cancelEdit;
968
- $[41] = id;
969
- $[42] = t42;
970
- $[43] = t52;
971
- } else {
972
- t52 = $[43];
973
- }
974
- return t52;
975
- }
976
- let cellClass;
977
- if (staged !== void 0) {
978
- cellClass = "rounded bg-warning/15 px-1";
979
- } else {
980
- if (canEdit) {
981
- cellClass = "cursor-text";
982
- }
983
- }
984
- let t4;
985
- if ($[44] !== canEdit || $[45] !== column || $[46] !== edit || $[47] !== id) {
986
- t4 = canEdit ? () => {
987
- edit.startEdit(id, column);
988
- } : void 0;
989
- $[44] = canEdit;
990
- $[45] = column;
991
- $[46] = edit;
992
- $[47] = id;
993
- $[48] = t4;
994
- } else {
995
- t4 = $[48];
996
- }
997
- const onDoubleClick = t4;
998
- const t5 = `db-cell-${id}-${column}`;
999
- let t6;
1000
- if ($[49] !== display) {
1001
- t6 = /* @__PURE__ */ jsxDEV(CellValue, {
1002
- value: display
1003
- }, void 0, false);
1004
- $[49] = display;
1005
- $[50] = t6;
1006
- } else {
1007
- t6 = $[50];
1008
- }
1009
- let t7;
1010
- if ($[51] !== cellClass || $[52] !== onDoubleClick || $[53] !== t5 || $[54] !== t6) {
1011
- t7 = /* @__PURE__ */ jsxDEV("span", {
1012
- className: cellClass,
1013
- "data-testid": t5,
1014
- onDoubleClick,
1015
- children: t6
1016
- }, void 0, false);
1017
- $[51] = cellClass;
1018
- $[52] = onDoubleClick;
1019
- $[53] = t5;
1020
- $[54] = t6;
1021
- $[55] = t7;
1022
- } else {
1023
- t7 = $[55];
1024
- }
1025
- let t8;
1026
- if ($[56] !== column || $[57] !== display || $[58] !== edit.onExpandCell) {
1027
- t8 = /* @__PURE__ */ jsxDEV(CellExpandButton, {
1028
- column,
1029
- onExpand: edit.onExpandCell,
1030
- value: display
1031
- }, void 0, false);
1032
- $[56] = column;
1033
- $[57] = display;
1034
- $[58] = edit.onExpandCell;
1035
- $[59] = t8;
1036
- } else {
1037
- t8 = $[59];
1038
- }
1039
- let t9;
1040
- if ($[60] !== t7 || $[61] !== t8) {
1041
- t9 = /* @__PURE__ */ jsxDEV(Fragment, {
1042
- children: [t7, t8]
1043
- }, void 0, true);
1044
- $[60] = t7;
1045
- $[61] = t8;
1046
- $[62] = t9;
1047
- } else {
1048
- t9 = $[62];
1049
- }
1050
- return t9;
1051
- };
1052
- const GridHeaderCell = ({
1053
- draggedRef,
1054
- header,
1055
- masked = false,
1056
- pinned = false,
1057
- table
1058
- }) => {
1059
- const onDragStart = () => {
1060
- draggedRef.current = header.column.id;
1061
- };
1062
- const onDragOver = (event) => {
1063
- event.preventDefault();
1064
- };
1065
- const onDrop = () => {
1066
- const from = draggedRef.current;
1067
- const to = header.column.id;
1068
- draggedRef.current = null;
1069
- if (from === null || from === to) {
1070
- return;
1071
- }
1072
- const current = table.getState().columnOrder;
1073
- const base = current.length > 0 ? current : table.getAllLeafColumns().map((column) => column.id);
1074
- const order = base.filter((id) => id !== from);
1075
- const insertAt = order.indexOf(to);
1076
- order.splice(insertAt === -1 ? order.length : insertAt, 0, from);
1077
- table.setColumnOrder(order);
1078
- };
1079
- return /* @__PURE__ */ jsxDEV("th", {
1080
- className: cn("text-start text-xs font-medium text-muted-foreground", pinned && "border-e border-border bg-muted"),
1081
- draggable: true,
1082
- onDragOver,
1083
- onDragStart,
1084
- onDrop,
1085
- style: pinned ? pinnedDataCellStyle(header.getSize()) : sizedCellStyle(header.getSize()),
1086
- children: [/* @__PURE__ */ jsxDEV("button", {
1087
- className: "inline-flex max-w-full cursor-grab items-center gap-1 truncate outline-none hover:text-foreground",
1088
- "data-testid": `db-sort-${header.column.id}`,
1089
- onClick: header.column.getToggleSortingHandler(),
1090
- type: "button",
1091
- children: [flexRender(header.column.columnDef.header, header.getContext()), sortIndicator(header.column.getIsSorted())]
1092
- }, void 0, true), masked && /* @__PURE__ */ jsxDEV("span", {
1093
- className: "ms-1 inline-flex items-center rounded-sm bg-warning/15 px-1 text-[0.625rem] font-medium uppercase text-warning",
1094
- "data-testid": `db-mask-chip-${header.column.id}`,
1095
- title: "This column is masked by a mask() policy",
1096
- children: "masked"
1097
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
1098
- "aria-hidden": "true",
1099
- className: "absolute inset-y-0 end-0 w-1 cursor-col-resize touch-none select-none hover:bg-ring/60 data-[resizing=true]:bg-ring",
1100
- "data-resizing": header.column.getIsResizing(),
1101
- "data-testid": `db-resize-${header.column.id}`,
1102
- onMouseDown: header.getResizeHandler(),
1103
- onTouchStart: header.getResizeHandler()
1104
- }, void 0, false)]
1105
- }, void 0, true);
1106
- };
1107
- const SelectAllHeaderCell = (t0) => {
1108
- const $ = c(13);
1109
- const {
1110
- table
1111
- } = t0;
1112
- const t = useT();
1113
- let t1;
1114
- if ($[0] !== table) {
1115
- t1 = (checked) => {
1116
- table.toggleAllRowsSelected(checked);
1117
- };
1118
- $[0] = table;
1119
- $[1] = t1;
1120
- } else {
1121
- t1 = $[1];
1122
- }
1123
- const onCheckedChange = t1;
1124
- let t2;
1125
- if ($[2] !== t) {
1126
- t2 = t("Select all rows");
1127
- $[2] = t;
1128
- $[3] = t2;
1129
- } else {
1130
- t2 = $[3];
1131
- }
1132
- let t3;
1133
- if ($[4] !== table) {
1134
- t3 = table.getIsAllRowsSelected();
1135
- $[4] = table;
1136
- $[5] = t3;
1137
- } else {
1138
- t3 = $[5];
1139
- }
1140
- let t4;
1141
- if ($[6] !== table) {
1142
- t4 = table.getIsSomeRowsSelected() && !table.getIsAllRowsSelected();
1143
- $[6] = table;
1144
- $[7] = t4;
1145
- } else {
1146
- t4 = $[7];
1147
- }
1148
- let t5;
1149
- if ($[8] !== onCheckedChange || $[9] !== t2 || $[10] !== t3 || $[11] !== t4) {
1150
- t5 = /* @__PURE__ */ jsxDEV("th", {
1151
- className: "bg-muted",
1152
- style: SELECT_CELL_STYLE,
1153
- children: /* @__PURE__ */ jsxDEV(Checkbox, {
1154
- "aria-label": t2,
1155
- checked: t3,
1156
- "data-testid": "db-select-all",
1157
- indeterminate: t4,
1158
- onCheckedChange
1159
- }, void 0, false)
1160
- }, void 0, false);
1161
- $[8] = onCheckedChange;
1162
- $[9] = t2;
1163
- $[10] = t3;
1164
- $[11] = t4;
1165
- $[12] = t5;
1166
- } else {
1167
- t5 = $[12];
1168
- }
1169
- return t5;
1170
- };
1171
- const RowSelectCell = (t0) => {
1172
- const $ = c(17);
1173
- const {
1174
- row
1175
- } = t0;
1176
- const t = useT();
1177
- let t1;
1178
- if ($[0] !== row.original) {
1179
- t1 = rowId(row.original);
1180
- $[0] = row.original;
1181
- $[1] = t1;
1182
- } else {
1183
- t1 = $[1];
1184
- }
1185
- const id = t1;
1186
- let t2;
1187
- if ($[2] !== row) {
1188
- t2 = (checked) => {
1189
- row.toggleSelected(checked);
1190
- };
1191
- $[2] = row;
1192
- $[3] = t2;
1193
- } else {
1194
- t2 = $[3];
1195
- }
1196
- const onCheckedChange = t2;
1197
- let t3;
1198
- if ($[4] !== t) {
1199
- t3 = t("Select row");
1200
- $[4] = t;
1201
- $[5] = t3;
1202
- } else {
1203
- t3 = $[5];
1204
- }
1205
- let t4;
1206
- if ($[6] !== row) {
1207
- t4 = row.getIsSelected();
1208
- $[6] = row;
1209
- $[7] = t4;
1210
- } else {
1211
- t4 = $[7];
1212
- }
1213
- let t5;
1214
- if ($[8] !== row.index || $[9] !== row.original) {
1215
- t5 = rowKey(row.original, row.index);
1216
- $[8] = row.index;
1217
- $[9] = row.original;
1218
- $[10] = t5;
1219
- } else {
1220
- t5 = $[10];
1221
- }
1222
- const t6 = `db-select-${t5}`;
1223
- const t7 = id === null;
1224
- let t8;
1225
- if ($[11] !== onCheckedChange || $[12] !== t3 || $[13] !== t4 || $[14] !== t6 || $[15] !== t7) {
1226
- t8 = /* @__PURE__ */ jsxDEV("td", {
1227
- className: "bg-background",
1228
- style: SELECT_CELL_STYLE,
1229
- children: /* @__PURE__ */ jsxDEV(Checkbox, {
1230
- "aria-label": t3,
1231
- checked: t4,
1232
- "data-testid": t6,
1233
- disabled: t7,
1234
- onCheckedChange
1235
- }, void 0, false)
1236
- }, void 0, false);
1237
- $[11] = onCheckedChange;
1238
- $[12] = t3;
1239
- $[13] = t4;
1240
- $[14] = t6;
1241
- $[15] = t7;
1242
- $[16] = t8;
1243
- } else {
1244
- t8 = $[16];
1245
- }
1246
- return t8;
1247
- };
1248
- const DataBrowserTableView = (t0) => {
1249
- const $ = c(46);
1250
- const {
1251
- edit,
1252
- editable,
1253
- mask,
1254
- onDelete,
1255
- onEdit,
1256
- onInspect,
1257
- refs,
1258
- scrollRef,
1259
- scrollToIndex,
1260
- table,
1261
- tableRows,
1262
- tbodyStyle,
1263
- virtualRows
1264
- } = t0;
1265
- const draggedColumn = useRef(null);
1266
- const [active, setActive] = useState(null);
1267
- let t1;
1268
- if ($[0] !== table) {
1269
- t1 = table.getVisibleLeafColumns();
1270
- $[0] = table;
1271
- $[1] = t1;
1272
- } else {
1273
- t1 = $[1];
1274
- }
1275
- const columnCount = t1.length;
1276
- let t2;
1277
- if ($[2] !== active || $[3] !== columnCount || $[4] !== edit || $[5] !== table || $[6] !== tableRows) {
1278
- t2 = (event) => {
1279
- if (!["ArrowDown", "ArrowLeft", "ArrowRight", "ArrowUp", "Enter"].includes(event.key)) {
1280
- return;
1281
- }
1282
- event.preventDefault();
1283
- const current = active ?? {
1284
- col: 0,
1285
- row: 0
1286
- };
1287
- if (event.key === "Enter") {
1288
- const row = tableRows[current.row];
1289
- const column = table.getVisibleLeafColumns()[current.col];
1290
- if (row !== void 0 && column !== void 0) {
1291
- const id = rowId(row.original);
1292
- if (id !== null && edit.editableColumn(column.id)) {
1293
- edit.startEdit(id, column.id);
1294
- }
1295
- }
1296
- setActive(current);
1297
- return;
1298
- }
1299
- let {
1300
- col,
1301
- row: row_0
1302
- } = current;
1303
- bb24: switch (event.key) {
1304
- case "ArrowDown": {
1305
- row_0 = Math.min(row_0 + 1, tableRows.length - 1);
1306
- break bb24;
1307
- }
1308
- case "ArrowRight": {
1309
- col = Math.min(col + 1, columnCount - 1);
1310
- break bb24;
1311
- }
1312
- case "ArrowUp": {
1313
- row_0 = Math.max(row_0 - 1, 0);
1314
- break bb24;
1315
- }
1316
- default: {
1317
- col = Math.max(col - 1, 0);
1318
- }
1319
- }
1320
- setActive({
1321
- col,
1322
- row: row_0
1323
- });
1324
- };
1325
- $[2] = active;
1326
- $[3] = columnCount;
1327
- $[4] = edit;
1328
- $[5] = table;
1329
- $[6] = tableRows;
1330
- $[7] = t2;
1331
- } else {
1332
- t2 = $[7];
1333
- }
1334
- const onGridKeyDown = t2;
1335
- let t3;
1336
- let t4;
1337
- if ($[8] !== active || $[9] !== scrollToIndex) {
1338
- t3 = () => {
1339
- if (active !== null) {
1340
- scrollToIndex(active.row);
1341
- }
1342
- };
1343
- t4 = [active, scrollToIndex];
1344
- $[8] = active;
1345
- $[9] = scrollToIndex;
1346
- $[10] = t3;
1347
- $[11] = t4;
1348
- } else {
1349
- t3 = $[10];
1350
- t4 = $[11];
1351
- }
1352
- useEffect(t3, t4);
1353
- let t5;
1354
- if ($[12] !== active || $[13] !== edit || $[14] !== editable || $[15] !== mask || $[16] !== onDelete || $[17] !== onEdit || $[18] !== onInspect || $[19] !== refs || $[20] !== tableRows) {
1355
- t5 = (virtualRow) => {
1356
- const tableRow = tableRows[virtualRow.index];
1357
- const {
1358
- original
1359
- } = tableRow;
1360
- const id_0 = rowId(original);
1361
- const key = rowKey(original, virtualRow.index);
1362
- const rowStyle = {
1363
- ...ROW_BASE_STYLE,
1364
- height: `${virtualRow.size.toString()}px`,
1365
- transform: `translateY(${virtualRow.start.toString()}px)`
1366
- };
1367
- return /* @__PURE__ */ jsxDEV("tr", {
1368
- className: "border-b border-border text-xs transition-colors hover:bg-muted/50",
1369
- "data-testid": "db-row",
1370
- style: rowStyle,
1371
- children: [/* @__PURE__ */ jsxDEV(RowSelectCell, {
1372
- row: tableRow
1373
- }, void 0, false), tableRow.getVisibleCells().map((cell, colIndex) => {
1374
- const pinned = colIndex === 0;
1375
- const ring = active !== null && active.row === virtualRow.index && active.col === colIndex ? " ring-1 ring-ring ring-inset" : "";
1376
- return /* @__PURE__ */ jsxDEV("td", {
1377
- className: cn("group/cell truncate font-mono text-muted-foreground", pinned && "border-e border-border bg-background", ring),
1378
- style: pinned ? pinnedDataCellStyle(cell.column.getSize()) : sizedCellStyle(cell.column.getSize()),
1379
- children: /* @__PURE__ */ jsxDEV(EditableCell, {
1380
- cell,
1381
- edit,
1382
- mask,
1383
- refs
1384
- }, void 0, false)
1385
- }, cell.id, false);
1386
- }), /* @__PURE__ */ jsxDEV("td", {
1387
- className: "flex items-center gap-1",
1388
- style: ACTION_CELL_STYLE,
1389
- children: [/* @__PURE__ */ jsxDEV("button", {
1390
- className: ROW_BTN,
1391
- "data-testid": `db-inspect-${key}`,
1392
- onClick: () => {
1393
- onInspect(original);
1394
- },
1395
- type: "button",
1396
- children: "Details"
1397
- }, void 0, false), editable && /* @__PURE__ */ jsxDEV(Fragment, {
1398
- children: [/* @__PURE__ */ jsxDEV("button", {
1399
- className: ROW_BTN,
1400
- "data-testid": `db-edit-${key}`,
1401
- disabled: id_0 === null,
1402
- onClick: () => {
1403
- onEdit(id_0, original);
1404
- },
1405
- type: "button",
1406
- children: "Edit"
1407
- }, void 0, false), /* @__PURE__ */ jsxDEV(ConfirmButton, {
1408
- confirmLabel: "Delete?",
1409
- disabled: id_0 === null,
1410
- onConfirm: () => {
1411
- onDelete(id_0);
1412
- },
1413
- testId: `db-delete-${key}`,
1414
- children: "Delete"
1415
- }, void 0, false)]
1416
- }, void 0, true)]
1417
- }, void 0, true)]
1418
- }, tableRow.id, true);
1419
- };
1420
- $[12] = active;
1421
- $[13] = edit;
1422
- $[14] = editable;
1423
- $[15] = mask;
1424
- $[16] = onDelete;
1425
- $[17] = onEdit;
1426
- $[18] = onInspect;
1427
- $[19] = refs;
1428
- $[20] = tableRows;
1429
- $[21] = t5;
1430
- } else {
1431
- t5 = $[21];
1432
- }
1433
- const renderRow = t5;
1434
- let t6;
1435
- if ($[22] !== table) {
1436
- t6 = /* @__PURE__ */ jsxDEV(SelectAllHeaderCell, {
1437
- table
1438
- }, void 0, false);
1439
- $[22] = table;
1440
- $[23] = t6;
1441
- } else {
1442
- t6 = $[23];
1443
- }
1444
- let t7;
1445
- if ($[24] !== mask || $[25] !== table) {
1446
- t7 = table.getFlatHeaders().map((header, index) => /* @__PURE__ */ jsxDEV(GridHeaderCell, {
1447
- draggedRef: draggedColumn,
1448
- header,
1449
- masked: mask.columns.has(header.column.id),
1450
- pinned: index === 0,
1451
- table
1452
- }, header.id, false));
1453
- $[24] = mask;
1454
- $[25] = table;
1455
- $[26] = t7;
1456
- } else {
1457
- t7 = $[26];
1458
- }
1459
- let t8;
1460
- if ($[27] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1461
- t8 = /* @__PURE__ */ jsxDEV("th", {
1462
- "aria-label": "Row actions",
1463
- style: ACTION_CELL_STYLE
1464
- }, void 0, false);
1465
- $[27] = t8;
1466
- } else {
1467
- t8 = $[27];
1468
- }
1469
- let t9;
1470
- if ($[28] !== t6 || $[29] !== t7) {
1471
- t9 = /* @__PURE__ */ jsxDEV("thead", {
1472
- className: "bg-muted/50",
1473
- children: /* @__PURE__ */ jsxDEV("tr", {
1474
- className: "border-b border-border",
1475
- style: HEAD_ROW_STYLE,
1476
- children: [t6, t7, t8]
1477
- }, void 0, true)
1478
- }, void 0, false);
1479
- $[28] = t6;
1480
- $[29] = t7;
1481
- $[30] = t9;
1482
- } else {
1483
- t9 = $[30];
1484
- }
1485
- let t10;
1486
- if ($[31] !== renderRow || $[32] !== virtualRows) {
1487
- let t112;
1488
- if ($[34] !== renderRow) {
1489
- t112 = (virtualRow_0) => renderRow(virtualRow_0);
1490
- $[34] = renderRow;
1491
- $[35] = t112;
1492
- } else {
1493
- t112 = $[35];
1494
- }
1495
- t10 = virtualRows.map(t112);
1496
- $[31] = renderRow;
1497
- $[32] = virtualRows;
1498
- $[33] = t10;
1499
- } else {
1500
- t10 = $[33];
1501
- }
1502
- let t11;
1503
- if ($[36] !== t10 || $[37] !== tbodyStyle) {
1504
- t11 = /* @__PURE__ */ jsxDEV("tbody", {
1505
- style: tbodyStyle,
1506
- children: t10
1507
- }, void 0, false);
1508
- $[36] = t10;
1509
- $[37] = tbodyStyle;
1510
- $[38] = t11;
1511
- } else {
1512
- t11 = $[38];
1513
- }
1514
- let t12;
1515
- if ($[39] !== t11 || $[40] !== t9) {
1516
- t12 = /* @__PURE__ */ jsxDEV("table", {
1517
- className: "w-full text-xs",
1518
- "data-testid": "db-rows",
1519
- style: ROWS_STYLE,
1520
- children: [t9, t11]
1521
- }, void 0, true);
1522
- $[39] = t11;
1523
- $[40] = t9;
1524
- $[41] = t12;
1525
- } else {
1526
- t12 = $[41];
1527
- }
1528
- let t13;
1529
- if ($[42] !== onGridKeyDown || $[43] !== scrollRef || $[44] !== t12) {
1530
- t13 = /* @__PURE__ */ jsxDEV(GridContainer, {
1531
- layout: "fill",
1532
- children: /* @__PURE__ */ jsxDEV("div", {
1533
- "data-testid": "db-scroll",
1534
- onKeyDown: onGridKeyDown,
1535
- ref: scrollRef,
1536
- role: "grid",
1537
- style: SCROLL_STYLE,
1538
- tabIndex: 0,
1539
- children: t12
1540
- }, void 0, false)
1541
- }, void 0, false);
1542
- $[42] = onGridKeyDown;
1543
- $[43] = scrollRef;
1544
- $[44] = t12;
1545
- $[45] = t13;
1546
- } else {
1547
- t13 = $[45];
1548
- }
1549
- return t13;
1550
- };
1551
- const useDataBrowserTable = (page, sorting, onSortingChange) => {
1552
- const columns = page?.columns;
1553
- const rows = page?.rows;
1554
- const references = page?.refs;
1555
- const columnDefs = useMemo(() => {
1556
- if (columns === void 0) {
1557
- return [];
1558
- }
1559
- return columns.map((column) => {
1560
- return {
1561
- accessorFn: (row) => row[column],
1562
- header: references?.[column] === void 0 ? column : `${column} →`,
1563
- id: column
1564
- };
1565
- });
1566
- }, [columns, references]);
1567
- const data = useMemo(() => rows ?? [], [rows]);
1568
- const [rowSelection, setRowSelection] = useState({});
1569
- const [columnVisibility, setColumnVisibility] = useState({});
1570
- const table = useReactTable({
1571
- columnResizeMode: "onChange",
1572
- columns: columnDefs,
1573
- data,
1574
- defaultColumn: {
1575
- minSize: 80,
1576
- size: 200
1577
- },
1578
- enableColumnResizing: true,
1579
- enableRowSelection: (row_0) => rowId(row_0.original) !== null,
1580
- getCoreRowModel: getCoreRowModel(),
1581
- getRowId: (row_1, index) => rowId(row_1) ?? `row-${index.toString()}`,
1582
- getSortedRowModel: getSortedRowModel(),
1583
- // Sorting is server-side: the page arrives already ordered, so the table
1584
- // must not re-sort it. The header still toggles `sorting`, which the data
1585
- // browser forwards to `readTablePage` as `orderBy`.
1586
- manualSorting: true,
1587
- onColumnVisibilityChange: setColumnVisibility,
1588
- onRowSelectionChange: setRowSelection,
1589
- onSortingChange,
1590
- state: {
1591
- columnVisibility,
1592
- rowSelection,
1593
- sorting
1594
- }
1595
- });
1596
- const tableRows = table.getRowModel().rows;
1597
- const scrollRef = useRef(null);
1598
- const virtualizer = useVirtualizer({
1599
- count: tableRows.length,
1600
- estimateSize: () => ROW_HEIGHT,
1601
- getScrollElement: () => scrollRef.current,
1602
- initialRect: {
1603
- height: SCROLL_HEIGHT,
1604
- width: 0
1605
- },
1606
- observeElementRect: (instance, callback) => flooredRectObserver(instance, callback, SCROLL_HEIGHT),
1607
- overscan: 8
1608
- });
1609
- const scrollToIndex = useCallback((index_0) => {
1610
- virtualizer.scrollToIndex(index_0);
1611
- }, [virtualizer]);
1612
- const virtualRows = virtualizer.getVirtualItems();
1613
- const totalSize = virtualizer.getTotalSize();
1614
- const tbodyStyle = {
1615
- display: "block",
1616
- height: `${totalSize.toString()}px`,
1617
- position: "relative"
1618
- };
1619
- return {
1620
- scrollRef,
1621
- scrollToIndex,
1622
- table,
1623
- tableRows,
1624
- tbodyStyle,
1625
- virtualRows
1626
- };
1627
- };
1628
- function _temp(t0) {
1629
- const [key, value] = t0;
1630
- return /* @__PURE__ */ jsxDEV("div", {
1631
- className: "contents",
1632
- children: [/* @__PURE__ */ jsxDEV("dt", {
1633
- className: "truncate font-mono text-[11px] text-muted-foreground",
1634
- children: key
1635
- }, void 0, false), /* @__PURE__ */ jsxDEV("dd", {
1636
- className: "truncate font-mono text-[11px] text-foreground",
1637
- title: formatCell(value),
1638
- children: formatCell(value)
1639
- }, void 0, false)]
1640
- }, key, true);
1641
- }
1642
-
1643
- const CONTROL_BTN$2 = "inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent disabled:pointer-events-none disabled:opacity-50";
1644
- const SaveQueryInput = (t0) => {
1645
- const $ = c(22);
1646
- const {
1647
- onCommit
1648
- } = t0;
1649
- const t = useT();
1650
- const [draft, setDraft] = useState("");
1651
- const ref = useRef(null);
1652
- let t1;
1653
- let t2;
1654
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1655
- t1 = () => {
1656
- ref.current?.focus();
1657
- };
1658
- t2 = [];
1659
- $[0] = t1;
1660
- $[1] = t2;
1661
- } else {
1662
- t1 = $[0];
1663
- t2 = $[1];
1664
- }
1665
- useEffect(t1, t2);
1666
- let t3;
1667
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1668
- t3 = (event) => {
1669
- setDraft(event.target.value);
1670
- };
1671
- $[2] = t3;
1672
- } else {
1673
- t3 = $[2];
1674
- }
1675
- const onChange = t3;
1676
- let t4;
1677
- if ($[3] !== draft || $[4] !== onCommit) {
1678
- t4 = () => {
1679
- const name = draft.trim();
1680
- if (name !== "") {
1681
- onCommit(name);
1682
- }
1683
- };
1684
- $[3] = draft;
1685
- $[4] = onCommit;
1686
- $[5] = t4;
1687
- } else {
1688
- t4 = $[5];
1689
- }
1690
- const commit = t4;
1691
- let t5;
1692
- if ($[6] !== t) {
1693
- t5 = t("Query name");
1694
- $[6] = t;
1695
- $[7] = t5;
1696
- } else {
1697
- t5 = $[7];
1698
- }
1699
- let t6;
1700
- if ($[8] !== t) {
1701
- t6 = t("Query name");
1702
- $[8] = t;
1703
- $[9] = t6;
1704
- } else {
1705
- t6 = $[9];
1706
- }
1707
- let t7;
1708
- if ($[10] !== draft || $[11] !== t5 || $[12] !== t6) {
1709
- t7 = /* @__PURE__ */ jsxDEV("input", {
1710
- "aria-label": t5,
1711
- className: "h-7 rounded-md border border-border bg-background px-2 text-xs outline-none focus-visible:border-ring",
1712
- "data-testid": "db-save-query-name",
1713
- onChange,
1714
- placeholder: t6,
1715
- ref,
1716
- value: draft
1717
- }, void 0, false);
1718
- $[10] = draft;
1719
- $[11] = t5;
1720
- $[12] = t6;
1721
- $[13] = t7;
1722
- } else {
1723
- t7 = $[13];
1724
- }
1725
- let t8;
1726
- if ($[14] !== t) {
1727
- t8 = t("Save");
1728
- $[14] = t;
1729
- $[15] = t8;
1730
- } else {
1731
- t8 = $[15];
1732
- }
1733
- let t9;
1734
- if ($[16] !== commit || $[17] !== t8) {
1735
- t9 = /* @__PURE__ */ jsxDEV("button", {
1736
- className: CONTROL_BTN$2,
1737
- "data-testid": "db-save-query-confirm",
1738
- onClick: commit,
1739
- type: "button",
1740
- children: t8
1741
- }, void 0, false);
1742
- $[16] = commit;
1743
- $[17] = t8;
1744
- $[18] = t9;
1745
- } else {
1746
- t9 = $[18];
1747
- }
1748
- let t10;
1749
- if ($[19] !== t7 || $[20] !== t9) {
1750
- t10 = /* @__PURE__ */ jsxDEV("span", {
1751
- className: "inline-flex items-center gap-1",
1752
- children: [t7, t9]
1753
- }, void 0, true);
1754
- $[19] = t7;
1755
- $[20] = t9;
1756
- $[21] = t10;
1757
- } else {
1758
- t10 = $[21];
1759
- }
1760
- return t10;
1761
- };
1762
- const DataQueryBar = (t0) => {
1763
- const $ = c(27);
1764
- const {
1765
- onApply,
1766
- onCopyLink,
1767
- onDelete,
1768
- onSave,
1769
- saved
1770
- } = t0;
1771
- const t = useT();
1772
- const [naming, setNaming] = useState(false);
1773
- let t1;
1774
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1775
- t1 = () => {
1776
- setNaming(true);
1777
- };
1778
- $[0] = t1;
1779
- } else {
1780
- t1 = $[0];
1781
- }
1782
- const openNaming = t1;
1783
- let t2;
1784
- if ($[1] !== onSave) {
1785
- t2 = (name) => {
1786
- onSave(name);
1787
- setNaming(false);
1788
- };
1789
- $[1] = onSave;
1790
- $[2] = t2;
1791
- } else {
1792
- t2 = $[2];
1793
- }
1794
- const confirmSave = t2;
1795
- let t3;
1796
- if ($[3] !== onApply || $[4] !== saved) {
1797
- t3 = (event) => {
1798
- const query = saved[Number(event.currentTarget.dataset.index)];
1799
- if (query !== void 0) {
1800
- onApply(query);
1801
- }
1802
- };
1803
- $[3] = onApply;
1804
- $[4] = saved;
1805
- $[5] = t3;
1806
- } else {
1807
- t3 = $[5];
1808
- }
1809
- const applyByIndex = t3;
1810
- let t4;
1811
- if ($[6] !== onDelete || $[7] !== saved) {
1812
- t4 = (event_0) => {
1813
- const query_0 = saved[Number(event_0.currentTarget.dataset.index)];
1814
- if (query_0 !== void 0) {
1815
- onDelete(query_0.name);
1816
- }
1817
- };
1818
- $[6] = onDelete;
1819
- $[7] = saved;
1820
- $[8] = t4;
1821
- } else {
1822
- t4 = $[8];
1823
- }
1824
- const deleteByIndex = t4;
1825
- let t5;
1826
- if ($[9] !== t) {
1827
- t5 = t("Copy link");
1828
- $[9] = t;
1829
- $[10] = t5;
1830
- } else {
1831
- t5 = $[10];
1832
- }
1833
- let t6;
1834
- if ($[11] !== onCopyLink || $[12] !== t5) {
1835
- t6 = /* @__PURE__ */ jsxDEV("button", {
1836
- className: CONTROL_BTN$2,
1837
- "data-testid": "db-copy-link",
1838
- onClick: onCopyLink,
1839
- type: "button",
1840
- children: t5
1841
- }, void 0, false);
1842
- $[11] = onCopyLink;
1843
- $[12] = t5;
1844
- $[13] = t6;
1845
- } else {
1846
- t6 = $[13];
1847
- }
1848
- let t7;
1849
- if ($[14] !== confirmSave || $[15] !== naming || $[16] !== t) {
1850
- t7 = naming ? /* @__PURE__ */ jsxDEV(SaveQueryInput, {
1851
- onCommit: confirmSave
1852
- }, void 0, false) : /* @__PURE__ */ jsxDEV("button", {
1853
- className: CONTROL_BTN$2,
1854
- "data-testid": "db-save-query",
1855
- onClick: openNaming,
1856
- type: "button",
1857
- children: t("Save query")
1858
- }, void 0, false);
1859
- $[14] = confirmSave;
1860
- $[15] = naming;
1861
- $[16] = t;
1862
- $[17] = t7;
1863
- } else {
1864
- t7 = $[17];
1865
- }
1866
- let t8;
1867
- if ($[18] !== applyByIndex || $[19] !== deleteByIndex || $[20] !== saved || $[21] !== t) {
1868
- t8 = saved.length > 0 && /* @__PURE__ */ jsxDEV("div", {
1869
- className: "flex flex-wrap items-center gap-1",
1870
- "data-testid": "db-saved-queries",
1871
- children: [/* @__PURE__ */ jsxDEV("span", {
1872
- className: "font-mono text-[11px] tracking-wide uppercase text-muted-foreground",
1873
- children: t("Saved")
1874
- }, void 0, false), saved.map((query_1, index) => /* @__PURE__ */ jsxDEV("span", {
1875
- className: "inline-flex items-center overflow-hidden rounded-md border border-border",
1876
- children: [/* @__PURE__ */ jsxDEV("button", {
1877
- className: "px-2 py-0.5 text-xs text-foreground transition-colors hover:bg-accent",
1878
- "data-index": index,
1879
- "data-testid": `db-saved-query-${query_1.name}`,
1880
- onClick: applyByIndex,
1881
- type: "button",
1882
- children: query_1.name
1883
- }, void 0, false), /* @__PURE__ */ jsxDEV("button", {
1884
- "aria-label": t("Delete saved query {name}", {
1885
- name: query_1.name
1886
- }),
1887
- className: "border-l border-border px-1 py-0.5 text-xs text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",
1888
- "data-index": index,
1889
- "data-testid": `db-saved-query-delete-${query_1.name}`,
1890
- onClick: deleteByIndex,
1891
- type: "button",
1892
- children: "✕"
1893
- }, void 0, false)]
1894
- }, query_1.name, true))]
1895
- }, void 0, true);
1896
- $[18] = applyByIndex;
1897
- $[19] = deleteByIndex;
1898
- $[20] = saved;
1899
- $[21] = t;
1900
- $[22] = t8;
1901
- } else {
1902
- t8 = $[22];
1903
- }
1904
- let t9;
1905
- if ($[23] !== t6 || $[24] !== t7 || $[25] !== t8) {
1906
- t9 = /* @__PURE__ */ jsxDEV("div", {
1907
- className: "flex flex-wrap items-center gap-1.5",
1908
- "data-testid": "db-query-bar",
1909
- children: [t6, t7, t8]
1910
- }, void 0, true);
1911
- $[23] = t6;
1912
- $[24] = t7;
1913
- $[25] = t8;
1914
- $[26] = t9;
1915
- } else {
1916
- t9 = $[26];
1917
- }
1918
- return t9;
1919
- };
1920
-
1921
- const SEED_ENDPOINT = "/__lunora/seed";
1922
- const MAX_GENERATE_ROWS = 200;
1923
- const MAX_FK_SAMPLE = 50;
1924
- const collectSkippedFkColumns = (columns, fkPools) => {
1925
- const skipped = [];
1926
- for (const column of columns) {
1927
- if (column.pk !== true && column.ref !== void 0 && column.type === "id" && (fkPools[column.ref] ?? []).length === 0) {
1928
- skipped.push(column.name);
1929
- }
1930
- }
1931
- return skipped;
1932
- };
1933
- const requestSeedRows = async (request) => {
1934
- const response = await fetch(SEED_ENDPOINT, {
1935
- body: JSON.stringify(request),
1936
- headers: {
1937
- "Content-Type": "application/json"
1938
- },
1939
- method: "POST"
1940
- });
1941
- const body = await response.json();
1942
- if (response.ok && body.rows !== void 0) {
1943
- return {
1944
- kind: "ok",
1945
- rows: body.rows
1946
- };
1947
- }
1948
- return {
1949
- kind: "error",
1950
- message: body.error ?? `seed request failed (${String(response.status)})`
1951
- };
1952
- };
1953
-
1954
- const BTN = "rounded-md border border-border px-3 py-1.5 text-xs font-medium text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent disabled:pointer-events-none disabled:opacity-50";
1955
- const BTN_DESTRUCTIVE = "rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground outline-none transition-colors hover:bg-primary/90 focus-visible:bg-primary/90 disabled:pointer-events-none disabled:opacity-50";
1956
- const GenerateRowsDialog = ({
1957
- columns,
1958
- fkPools,
1959
- onClose,
1960
- onInsertRows,
1961
- table
1962
- }) => {
1963
- const t = useT();
1964
- const [count, setCount] = useState(10);
1965
- const [inserting, setInserting] = useState(false);
1966
- const [error, setError] = useState(void 0);
1967
- const [inserted, setInserted] = useState(void 0);
1968
- const onCountChange = (event) => {
1969
- const next = Number(event.target.value);
1970
- if (!Number.isNaN(next) && next >= 1) {
1971
- setCount(Math.min(next, MAX_GENERATE_ROWS));
1972
- }
1973
- };
1974
- const handleGenerate = async () => {
1975
- setError(void 0);
1976
- setInserted(void 0);
1977
- setInserting(true);
1978
- try {
1979
- const generated = await requestSeedRows({
1980
- count,
1981
- existingIds: fkPools,
1982
- seed: Date.now(),
1983
- table
1984
- });
1985
- if (generated.kind === "error") {
1986
- setError(generated.message);
1987
- return;
1988
- }
1989
- const {
1990
- rows
1991
- } = generated;
1992
- if (rows.length === 0) {
1993
- setError(t("No rows generated — all columns were skipped."));
1994
- return;
1995
- }
1996
- const result = await onInsertRows(rows);
1997
- if (result !== void 0) {
1998
- setError(result);
1999
- return;
2000
- }
2001
- setInserted(rows.length);
2002
- const skippedFkColumns = collectSkippedFkColumns(columns, fkPools);
2003
- if (skippedFkColumns.length > 0) {
2004
- setError(t("Inserted {count} rows. Skipped FK columns: {cols}", {
2005
- cols: skippedFkColumns.join(", "),
2006
- count: rows.length.toString()
2007
- }));
2008
- }
2009
- } finally {
2010
- setInserting(false);
2011
- }
2012
- };
2013
- const onGenerate = () => {
2014
- fireAndForget(handleGenerate());
2015
- };
2016
- const editableColumns = columns.filter((column) => column.pk !== true);
2017
- return /* @__PURE__ */ jsxDEV(ModalShell, {
2018
- label: t("Generate dummy rows"),
2019
- onClose,
2020
- panelTestId: "gen-rows-panel",
2021
- testId: "gen-rows-overlay",
2022
- variant: "dialog",
2023
- children: [/* @__PURE__ */ jsxDEV("div", {
2024
- className: "flex items-start justify-between",
2025
- children: [/* @__PURE__ */ jsxDEV("div", {
2026
- className: "flex flex-col gap-0.5",
2027
- children: [/* @__PURE__ */ jsxDEV("h3", {
2028
- className: "text-base text-foreground",
2029
- "data-testid": "gen-rows-title",
2030
- children: t("Generate dummy rows")
2031
- }, void 0, false), /* @__PURE__ */ jsxDEV("p", {
2032
- className: "text-xs text-muted-foreground",
2033
- "data-testid": "gen-rows-desc",
2034
- children: t("Seed {table} with Faker-generated rows. Existing rows are not affected.", {
2035
- table
2036
- })
2037
- }, void 0, false)]
2038
- }, void 0, true), /* @__PURE__ */ jsxDEV("button", {
2039
- className: "text-xs text-muted-foreground hover:text-foreground",
2040
- "data-testid": "gen-rows-close",
2041
- onClick: onClose,
2042
- type: "button",
2043
- children: t("Close")
2044
- }, void 0, false)]
2045
- }, void 0, true), /* @__PURE__ */ jsxDEV("div", {
2046
- className: "flex items-center gap-2",
2047
- children: [/* @__PURE__ */ jsxDEV("label", {
2048
- className: "text-xs font-medium text-foreground",
2049
- htmlFor: "gen-rows-count",
2050
- children: t("Row count")
2051
- }, void 0, false), /* @__PURE__ */ jsxDEV("input", {
2052
- className: "w-20 rounded-md border border-border bg-background px-2 py-1 text-xs outline-none focus-visible:border-ring",
2053
- "data-testid": "gen-rows-count",
2054
- id: "gen-rows-count",
2055
- max: MAX_GENERATE_ROWS,
2056
- min: 1,
2057
- onChange: onCountChange,
2058
- type: "number",
2059
- value: count
2060
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
2061
- className: "text-xs text-muted-foreground",
2062
- children: t("(max {max})", {
2063
- max: MAX_GENERATE_ROWS.toString()
2064
- })
2065
- }, void 0, false)]
2066
- }, void 0, true), editableColumns.length > 0 && /* @__PURE__ */ jsxDEV("div", {
2067
- className: "flex flex-col gap-1",
2068
- children: [/* @__PURE__ */ jsxDEV("p", {
2069
- className: "font-mono text-[11px] tracking-wide uppercase text-muted-foreground",
2070
- children: t("Columns to seed")
2071
- }, void 0, false), /* @__PURE__ */ jsxDEV("ul", {
2072
- className: "flex flex-col gap-0.5",
2073
- "data-testid": "gen-rows-columns",
2074
- children: editableColumns.map((column_0) => {
2075
- const hasFk = column_0.ref !== void 0 && column_0.type === "id";
2076
- const fkEmpty = hasFk && (fkPools[column_0.ref ?? ""] ?? []).length === 0;
2077
- const fkBadgeClass = fkEmpty ? "rounded bg-destructive/10 px-1 text-destructive" : "rounded bg-muted px-1 text-muted-foreground";
2078
- const fkBadgeTestId = fkEmpty ? `gen-rows-fk-empty-${column_0.name}` : `gen-rows-fk-ok-${column_0.name}`;
2079
- const fkBadgeText = fkEmpty ? t("FK: no rows in {ref} — will skip", {
2080
- ref: column_0.ref ?? ""
2081
- }) : t("→ {ref}", {
2082
- ref: column_0.ref ?? ""
2083
- });
2084
- return /* @__PURE__ */ jsxDEV("li", {
2085
- className: "flex items-center gap-1.5 font-mono text-xs",
2086
- children: [/* @__PURE__ */ jsxDEV("span", {
2087
- className: "text-foreground",
2088
- children: column_0.name
2089
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
2090
- className: "text-muted-foreground",
2091
- children: ["(", column_0.type, ")"]
2092
- }, void 0, true), column_0.optional && /* @__PURE__ */ jsxDEV("span", {
2093
- className: "rounded bg-muted px-1 font-mono text-[10px] tracking-wide uppercase",
2094
- children: "optional"
2095
- }, void 0, false), hasFk && /* @__PURE__ */ jsxDEV("span", {
2096
- className: fkBadgeClass,
2097
- "data-testid": fkBadgeTestId,
2098
- children: fkBadgeText
2099
- }, void 0, false)]
2100
- }, column_0.name, true);
2101
- })
2102
- }, void 0, false)]
2103
- }, void 0, true), error !== void 0 && /* @__PURE__ */ jsxDEV("p", {
2104
- className: "text-xs text-destructive",
2105
- "data-testid": "gen-rows-error",
2106
- role: "alert",
2107
- children: error
2108
- }, void 0, false), inserted !== void 0 && error === void 0 && /* @__PURE__ */ jsxDEV("p", {
2109
- className: "text-xs text-success",
2110
- "data-testid": "gen-rows-success",
2111
- children: t("Inserted {count} rows successfully.", {
2112
- count: inserted.toString()
2113
- })
2114
- }, void 0, false), /* @__PURE__ */ jsxDEV("div", {
2115
- className: "flex justify-end gap-2",
2116
- children: [/* @__PURE__ */ jsxDEV("button", {
2117
- className: BTN,
2118
- "data-testid": "gen-rows-cancel",
2119
- onClick: onClose,
2120
- type: "button",
2121
- children: t("Cancel")
2122
- }, void 0, false), /* @__PURE__ */ jsxDEV("button", {
2123
- className: BTN_DESTRUCTIVE,
2124
- "data-testid": "gen-rows-generate",
2125
- disabled: inserting,
2126
- onClick: onGenerate,
2127
- type: "button",
2128
- children: inserting ? t("Inserting…") : t("Generate & insert")
2129
- }, void 0, false)]
2130
- }, void 0, true)]
2131
- }, void 0, true);
2132
- };
2133
-
2134
- const toOrderBy = (sorting) => {
2135
- const first = sorting[0];
2136
- return first === void 0 ? void 0 : {
2137
- column: first.id,
2138
- direction: first.desc ? "desc" : "asc"
2139
- };
2140
- };
2141
- const facetValueText = (value) => {
2142
- if (value === null || value === void 0) {
2143
- return "";
2144
- }
2145
- if (typeof value === "object") {
2146
- return JSON.stringify(value);
2147
- }
2148
- return String(value);
2149
- };
2150
- const toEditableFilters = (clauses) => clauses.map((clause) => {
2151
- return {
2152
- column: clause.column,
2153
- operator: clause.operator,
2154
- value: clause.value === void 0 ? "" : facetValueText(clause.value)
2155
- };
2156
- });
2157
- const fromOrderBy = (orderBy) => orderBy === void 0 ? [] : [{
2158
- desc: orderBy.direction === "desc",
2159
- id: orderBy.column
2160
- }];
2161
- const MAX_BULK_DELETE_BATCHES = 200;
2162
- const PREVIEW_CANDIDATES = 20;
2163
- const READ_TABLE_PAGE$1 = adminRef(ADMIN_FUNCTIONS.readTablePage);
2164
- const FACET_COLUMN = adminRef(ADMIN_FUNCTIONS.facetColumn);
2165
- const WRITE_ROW$1 = adminRef(ADMIN_FUNCTIONS.writeRow);
2166
- const DELETE_ROWS = adminRef(ADMIN_FUNCTIONS.deleteRows);
2167
- const CLEAR_TABLE = adminRef(ADMIN_FUNCTIONS.clearTable);
2168
- const NO_ARGS = {};
2169
- const META_COLUMNS = /* @__PURE__ */ new Set(["__doc__", "__id__", "_creationTime", "_id", "id"]);
2170
- const rowDocument = (row) => {
2171
- const raw = row["__doc__"];
2172
- if (typeof raw === "string") {
2173
- try {
2174
- const parsed = JSON.parse(raw);
2175
- if (parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)) {
2176
- return parsed;
2177
- }
2178
- } catch {
2179
- }
2180
- }
2181
- const fields = {};
2182
- for (const [key, value] of Object.entries(row)) {
2183
- if (!META_COLUMNS.has(key)) {
2184
- fields[key] = value;
2185
- }
2186
- }
2187
- return fields;
2188
- };
2189
- const useDataBrowser = ({
2190
- initialFilters,
2191
- initialOrderBy,
2192
- initialSearch,
2193
- initialShardKey,
2194
- onSelectTable,
2195
- onViewChange,
2196
- pageSize: initialPageSize,
2197
- tableParam
2198
- }) => {
2199
- const client = useLunora();
2200
- const [pageSize, setPageSize] = useState(initialPageSize);
2201
- const [shardKey, setShardKey] = useState(initialShardKey ?? "");
2202
- const selectedTable = tableParam === void 0 || tableParam === "" ? null : tableParam;
2203
- const [offset, setOffset] = useState(0);
2204
- const [viewMode, setViewMode] = useState("table");
2205
- const [sorting, setSorting] = useState(() => fromOrderBy(initialOrderBy));
2206
- const [filter, setFilter] = useState(initialSearch ?? "");
2207
- const search = useDebounced(filter.trim(), 300);
2208
- const debouncedShard = useDebounced(shardKey.trim(), 400);
2209
- const [filters, setFilters] = useState(() => toEditableFilters(initialFilters ?? []));
2210
- const filtersRef = useRef(filters);
2211
- filtersRef.current = filters;
2212
- const {
2213
- clearFacets,
2214
- facets,
2215
- refetchFacets,
2216
- toggleFacet: toggleFacetColumn
2217
- } = useFacets();
2218
- const [editing, setEditing] = useState(null);
2219
- const [writeError, setWriteError] = useState(null);
2220
- const stagedEdits = useStagedEdits();
2221
- const [editingCell, setEditingCell] = useState(null);
2222
- const [committing, setCommitting] = useState(false);
2223
- const tablesQuery = useAdminQuery(ADMIN_FUNCTIONS.listTables, NO_ARGS, {
2224
- live: true,
2225
- shardKey: debouncedShard
2226
- });
2227
- const tables = tablesQuery.data ?? null;
2228
- const tablesError = tablesQuery.error;
2229
- const pageArgs = useMemo(() => {
2230
- return {
2231
- filters: toFilterClauses(filters),
2232
- limit: pageSize,
2233
- offset,
2234
- orderBy: toOrderBy(sorting),
2235
- search,
2236
- // The page read skips the COUNT — the total rides a separate
2237
- // predicate-keyed query (`countArgs`) that page navigation never
2238
- // re-keys, so paging no longer re-runs the full-table COUNT.
2239
- skipCount: true,
2240
- table: selectedTable ?? ""
2241
- };
2242
- }, [filters, pageSize, offset, sorting, search, selectedTable]);
2243
- const countArgs = useMemo(() => {
2244
- return {
2245
- filters: toFilterClauses(filters),
2246
- limit: 1,
2247
- search,
2248
- table: selectedTable ?? ""
2249
- };
2250
- }, [filters, search, selectedTable]);
2251
- const pageQuery = useAdminQuery(ADMIN_FUNCTIONS.readTablePage, pageArgs, {
2252
- enabled: selectedTable !== null,
2253
- keepPreviousData: false,
2254
- live: true,
2255
- shardKey: debouncedShard
2256
- });
2257
- const page = pageQuery.data ?? null;
2258
- const pageError = pageQuery.error;
2259
- const {
2260
- liveError
2261
- } = pageQuery;
2262
- const countQuery = useAdminQuery(ADMIN_FUNCTIONS.readTablePage, countArgs, {
2263
- enabled: selectedTable !== null,
2264
- live: true,
2265
- shardKey: debouncedShard
2266
- });
2267
- useEffect(() => {
2268
- if (tablesQuery.data !== void 0) {
2269
- recordShard(debouncedShard);
2270
- }
2271
- }, [tablesQuery.data, debouncedShard]);
2272
- const selectTable = useCallback((table2) => {
2273
- onSelectTable?.(table2);
2274
- }, [onSelectTable]);
2275
- const navigateToRef = (targetTable, id) => {
2276
- onSelectTable?.(targetTable, {
2277
- search: id
2278
- });
2279
- };
2280
- const previewRef = async (targetTable, id) => {
2281
- try {
2282
- const result = await client.query(READ_TABLE_PAGE$1, {
2283
- filters: [],
2284
- limit: PREVIEW_CANDIDATES,
2285
- offset: 0,
2286
- search: id,
2287
- table: targetTable
2288
- }, callOptions(debouncedShard));
2289
- return result.rows.find((row) => rowId(row) === id) ?? null;
2290
- } catch {
2291
- return null;
2292
- }
2293
- };
2294
- const facetFetcher = useCallback((shard, table2, activeFilters, searchQuery) => (column) => client.query(FACET_COLUMN, {
2295
- column,
2296
- filters: toFilterClauses(activeFilters),
2297
- search: searchQuery,
2298
- table: table2
2299
- }, callOptions(shard)), [client]);
2300
- const toggleFacet = (column) => {
2301
- toggleFacetColumn(column, selectedTable === null ? null : facetFetcher(debouncedShard, selectedTable, filtersRef.current, search));
2302
- };
2303
- const facetFilter = (column, value) => {
2304
- const text = facetValueText(value);
2305
- setFilters((current) => [...current.filter((clause) => clause.column !== column), {
2306
- column,
2307
- operator: "eq",
2308
- value: text
2309
- }]);
2310
- setOffset(0);
2311
- };
2312
- const facetFetcherRef = useRef(facetFetcher);
2313
- const refetchFacetsRef = useRef(refetchFacets);
2314
- const onViewChangeRef = useRef(onViewChange);
2315
- facetFetcherRef.current = facetFetcher;
2316
- refetchFacetsRef.current = refetchFacets;
2317
- onViewChangeRef.current = onViewChange;
2318
- useEffect(() => {
2319
- if (selectedTable === null) {
2320
- return;
2321
- }
2322
- refetchFacetsRef.current(facetFetcherRef.current(debouncedShard, selectedTable, filters, search));
2323
- }, [debouncedShard, selectedTable, filters, search]);
2324
- const seededTableRef = useRef(tableParam);
2325
- useEffect(() => {
2326
- if (selectedTable === null || onViewChangeRef.current === void 0 || seededTableRef.current !== tableParam) {
2327
- return;
2328
- }
2329
- onViewChangeRef.current({
2330
- filters: toFilterClauses(filters),
2331
- orderBy: toOrderBy(sorting),
2332
- search,
2333
- shard: debouncedShard
2334
- });
2335
- }, [selectedTable, tableParam, filters, sorting, search, debouncedShard]);
2336
- const initialFiltersRef = useRef(initialFilters);
2337
- const initialOrderByRef = useRef(initialOrderBy);
2338
- const initialSearchRef = useRef(initialSearch);
2339
- const initialShardKeyRef = useRef(initialShardKey);
2340
- initialFiltersRef.current = initialFilters;
2341
- initialOrderByRef.current = initialOrderBy;
2342
- initialSearchRef.current = initialSearch;
2343
- initialShardKeyRef.current = initialShardKey;
2344
- useEffect(() => {
2345
- if (seededTableRef.current === tableParam) {
2346
- return;
2347
- }
2348
- seededTableRef.current = tableParam;
2349
- queueMicrotask(() => {
2350
- const nextFilters = toEditableFilters(initialFiltersRef.current ?? []);
2351
- setSorting(fromOrderBy(initialOrderByRef.current));
2352
- setFilter(initialSearchRef.current ?? "");
2353
- setFilters(nextFilters);
2354
- filtersRef.current = nextFilters;
2355
- setShardKey(initialShardKeyRef.current ?? "");
2356
- clearFacets();
2357
- stagedEdits.clear();
2358
- setEditingCell(null);
2359
- setOffset(0);
2360
- });
2361
- }, [tableParam]);
2362
- const goToPage = (nextOffset) => {
2363
- if (selectedTable === null) {
2364
- return;
2365
- }
2366
- setOffset(Math.max(0, nextOffset));
2367
- };
2368
- const editableColumn = (column) => !META_COLUMNS.has(column);
2369
- const startCellEdit = (targetRow, column) => {
2370
- setEditingCell({
2371
- column,
2372
- rowId: targetRow
2373
- });
2374
- };
2375
- const cancelCellEdit = () => {
2376
- setEditingCell(null);
2377
- };
2378
- const commitStaged = async () => {
2379
- if (selectedTable === null) {
2380
- return;
2381
- }
2382
- setWriteError(null);
2383
- setCommitting(true);
2384
- try {
2385
- for (const [id, columns] of Object.entries(stagedEdits.staged)) {
2386
- await client.query(WRITE_ROW$1, {
2387
- doc: columns,
2388
- id,
2389
- op: "patch",
2390
- table: selectedTable
2391
- }, callOptions(debouncedShard));
2392
- }
2393
- stagedEdits.clear();
2394
- setEditingCell(null);
2395
- pageQuery.refetch();
2396
- } catch (error) {
2397
- setWriteError(error.message);
2398
- } finally {
2399
- setCommitting(false);
2400
- }
2401
- };
2402
- const discardStaged = () => {
2403
- stagedEdits.clear();
2404
- setEditingCell(null);
2405
- };
2406
- const stagedChanges = useMemo(() => {
2407
- const rowsById = /* @__PURE__ */ new Map();
2408
- for (const row of page?.rows ?? []) {
2409
- const id = rowId(row);
2410
- if (id !== null) {
2411
- rowsById.set(id, row);
2412
- }
2413
- }
2414
- const changes = [];
2415
- for (const [id, columns] of Object.entries(stagedEdits.staged)) {
2416
- for (const [column, newValue] of Object.entries(columns)) {
2417
- changes.push({
2418
- column,
2419
- newValue,
2420
- oldValue: rowsById.get(id)?.[column],
2421
- rowId: id
2422
- });
2423
- }
2424
- }
2425
- return changes;
2426
- }, [page, stagedEdits.staged]);
2427
- const writeRow = async (op, id, documentText) => {
2428
- if (selectedTable === null) {
2429
- return;
2430
- }
2431
- setWriteError(null);
2432
- let parsedDocument;
2433
- if (op !== "delete") {
2434
- try {
2435
- parsedDocument = documentText === void 0 || documentText.trim() === "" ? {} : JSON.parse(documentText);
2436
- } catch (error) {
2437
- setWriteError(`Invalid JSON: ${error.message}`);
2438
- return;
2439
- }
2440
- }
2441
- try {
2442
- await client.query(WRITE_ROW$1, {
2443
- doc: parsedDocument,
2444
- id: id ?? void 0,
2445
- op,
2446
- table: selectedTable
2447
- }, callOptions(debouncedShard));
2448
- setEditing(null);
2449
- pageQuery.refetch();
2450
- } catch (error) {
2451
- setWriteError(error.message);
2452
- }
2453
- };
2454
- const drainBulk = async (ref, args) => {
2455
- if (selectedTable === null) {
2456
- return;
2457
- }
2458
- setWriteError(null);
2459
- try {
2460
- for (let batch = 0; batch < MAX_BULK_DELETE_BATCHES; batch += 1) {
2461
- const result = await client.query(ref, args, callOptions(debouncedShard));
2462
- if (!result.hasMore) {
2463
- break;
2464
- }
2465
- }
2466
- setOffset(0);
2467
- pageQuery.refetch();
2468
- } catch (error) {
2469
- setWriteError(error.message);
2470
- }
2471
- };
2472
- const changeSorting = (updater) => {
2473
- setSorting(updater);
2474
- setOffset(0);
2475
- };
2476
- const table = useDataBrowserTable(page, sorting, changeSorting);
2477
- const currentView = {
2478
- filters: toFilterClauses(filters),
2479
- orderBy: toOrderBy(sorting),
2480
- search,
2481
- shard: shardKey,
2482
- table: selectedTable ?? void 0
2483
- };
2484
- const total = countQuery.data?.total ?? (page === null ? 0 : offset + page.rows.length);
2485
- const hasPrevious = offset > 0;
2486
- const hasNext = page !== null && offset + page.rows.length < total;
2487
- const rangeStart = page === null || page.rows.length === 0 ? 0 : offset + 1;
2488
- const rangeEnd = page === null ? 0 : offset + page.rows.length;
2489
- const loadTables = () => {
2490
- tablesQuery.refetch();
2491
- };
2492
- const showTable = () => {
2493
- setViewMode("table");
2494
- };
2495
- const showJson = () => {
2496
- setViewMode("json");
2497
- };
2498
- const bulkDelete = () => {
2499
- fireAndForget(drainBulk(DELETE_ROWS, {
2500
- filters: toFilterClauses(filtersRef.current),
2501
- search,
2502
- table: selectedTable
2503
- }));
2504
- };
2505
- const emptyTable = () => {
2506
- fireAndForget(drainBulk(CLEAR_TABLE, {
2507
- table: selectedTable
2508
- }));
2509
- };
2510
- const onFilterChange = (event) => {
2511
- setFilter(event.target.value);
2512
- setOffset(0);
2513
- };
2514
- const changeFilters = (next) => {
2515
- setFilters(next);
2516
- setOffset(0);
2517
- };
2518
- const addRow = () => {
2519
- setWriteError(null);
2520
- const seed = {};
2521
- for (const column of page?.columns ?? []) {
2522
- if (!META_COLUMNS.has(column)) {
2523
- seed[column] = "";
2524
- }
2525
- }
2526
- setEditing({
2527
- docText: JSON.stringify(seed, null, 2),
2528
- id: ""
2529
- });
2530
- };
2531
- const setEditorDocumentText = (text) => {
2532
- setEditing((current) => current === null ? current : {
2533
- docText: text,
2534
- id: current.id
2535
- });
2536
- };
2537
- const saveEdit = () => {
2538
- if (editing === null) {
2539
- return;
2540
- }
2541
- fireAndForget(writeRow(editing.id === "" ? "insert" : "patch", editing.id === "" ? null : editing.id, editing.docText));
2542
- };
2543
- const cancelEdit = () => {
2544
- setEditing(null);
2545
- setWriteError(null);
2546
- };
2547
- const goPrevious = () => {
2548
- goToPage(offset - pageSize);
2549
- };
2550
- const goNext = () => {
2551
- goToPage(offset + pageSize);
2552
- };
2553
- const jumpToPage = (targetPage) => {
2554
- goToPage(Math.max(0, (targetPage - 1) * pageSize));
2555
- };
2556
- const changePageSize = (size) => {
2557
- setPageSize(size);
2558
- setOffset(0);
2559
- };
2560
- const onRowEdit = (id, original) => {
2561
- setWriteError(null);
2562
- setEditing({
2563
- docText: JSON.stringify(rowDocument(original), null, 2),
2564
- id
2565
- });
2566
- };
2567
- const onRowDelete = (id) => {
2568
- fireAndForget(writeRow("delete", id));
2569
- };
2570
- const deleteSelected = async (ids) => {
2571
- if (selectedTable === null || ids.length === 0) {
2572
- return;
2573
- }
2574
- setWriteError(null);
2575
- try {
2576
- for (const id of ids) {
2577
- await client.query(WRITE_ROW$1, {
2578
- id,
2579
- op: "delete",
2580
- table: selectedTable
2581
- }, callOptions(debouncedShard));
2582
- }
2583
- pageQuery.refetch();
2584
- } catch (error) {
2585
- setWriteError(error.message);
2586
- }
2587
- };
2588
- const onBulkDeleteSelected = (ids) => {
2589
- fireAndForget(deleteSelected(ids));
2590
- };
2591
- const onCommitStaged = () => {
2592
- fireAndForget(commitStaged());
2593
- };
2594
- return {
2595
- addRow,
2596
- bulkDelete,
2597
- cancelCellEdit,
2598
- cancelEdit,
2599
- changePageSize,
2600
- clearTable: emptyTable,
2601
- columns: page?.columns ?? [],
2602
- committing,
2603
- currentView,
2604
- discardStaged,
2605
- editableColumn,
2606
- editing,
2607
- editingCell,
2608
- facetFilter,
2609
- facets,
2610
- filter,
2611
- filters,
2612
- goNext,
2613
- goPrevious,
2614
- hasNext,
2615
- hasPrevious,
2616
- jumpToPage,
2617
- liveError,
2618
- loadTables,
2619
- navigateToRef,
2620
- onBulkDeleteSelected,
2621
- onCommitStaged,
2622
- onFilterChange,
2623
- onFiltersChange: changeFilters,
2624
- onRowDelete,
2625
- onRowEdit,
2626
- page,
2627
- previewRef,
2628
- pageError,
2629
- pageSize,
2630
- rangeEnd,
2631
- rangeStart,
2632
- saveEdit,
2633
- selectedTable,
2634
- selectTable,
2635
- setEditorDocumentText,
2636
- setShardKey,
2637
- shardKey,
2638
- showJson,
2639
- showTable,
2640
- stage: stagedEdits.stage,
2641
- stagedChanges,
2642
- stagedValue: stagedEdits.stagedValue,
2643
- startCellEdit,
2644
- table,
2645
- tables,
2646
- tablesError,
2647
- toggleFacet,
2648
- total,
2649
- viewMode,
2650
- writeError
2651
- };
2652
- };
2653
-
2654
- const DESCRIBE_TABLE = adminRef(ADMIN_FUNCTIONS.describeTable);
2655
- const READ_TABLE_PAGE = adminRef(ADMIN_FUNCTIONS.readTablePage);
2656
- const WRITE_ROW = adminRef(ADMIN_FUNCTIONS.writeRow);
2657
- const extractId = (row) => {
2658
- const raw = row["_id"] ?? row["id"] ?? row["__id__"] ?? "";
2659
- if (typeof raw === "string") {
2660
- return raw;
2661
- }
2662
- if (typeof raw === "number") {
2663
- return String(raw);
2664
- }
2665
- return "";
2666
- };
2667
- const useGenerateRows = (onRefresh) => {
2668
- const client = useLunora();
2669
- const [open, setOpen] = useState(false);
2670
- const [table, setTable] = useState(void 0);
2671
- const [shardKey, setShardKey] = useState(void 0);
2672
- const [columnMeta, setColumnMeta] = useState(void 0);
2673
- const [fkPools, setFkPools] = useState({});
2674
- const [loading, setLoading] = useState(false);
2675
- const [error, setError] = useState(void 0);
2676
- const openDialogAsync = async (targetTable, targetShard) => {
2677
- setOpen(true);
2678
- setTable(targetTable);
2679
- setShardKey(targetShard);
2680
- setColumnMeta(void 0);
2681
- setFkPools({});
2682
- setError(void 0);
2683
- setLoading(true);
2684
- try {
2685
- const result = await client.query(DESCRIBE_TABLE, {
2686
- table: targetTable
2687
- }, callOptions(targetShard));
2688
- const {
2689
- columns
2690
- } = result;
2691
- setColumnMeta(columns);
2692
- const pools = {};
2693
- const fkColumns = columns.filter((column) => column.ref !== void 0 && column.type === "id" && column.pk !== true);
2694
- for (const fkColumn of fkColumns) {
2695
- if (fkColumn.ref === void 0) {
2696
- continue;
2697
- }
2698
- const {
2699
- ref
2700
- } = fkColumn;
2701
- if (pools[ref] !== void 0) {
2702
- continue;
2703
- }
2704
- try {
2705
- const page = await client.query(READ_TABLE_PAGE, {
2706
- filters: [],
2707
- limit: MAX_FK_SAMPLE,
2708
- offset: 0,
2709
- search: "",
2710
- table: ref
2711
- }, callOptions(targetShard));
2712
- pools[ref] = page.rows.map((row) => extractId(row)).filter(Boolean);
2713
- } catch {
2714
- pools[ref] = [];
2715
- }
2716
- }
2717
- setFkPools(pools);
2718
- } catch (error_) {
2719
- setError(error_.message);
2720
- } finally {
2721
- setLoading(false);
2722
- }
2723
- };
2724
- const openDialog = (targetTable_0, targetShard_0) => {
2725
- fireAndForget(openDialogAsync(targetTable_0, targetShard_0));
2726
- };
2727
- const closeDialog = () => {
2728
- setOpen(false);
2729
- setTable(void 0);
2730
- setShardKey(void 0);
2731
- setColumnMeta(void 0);
2732
- setFkPools({});
2733
- setError(void 0);
2734
- };
2735
- const insertBatch = async (rows, onDone) => {
2736
- if (table === void 0 || shardKey === void 0) {
2737
- return "No table selected.";
2738
- }
2739
- try {
2740
- for (const rowDocument of rows) {
2741
- await client.query(WRITE_ROW, {
2742
- doc: rowDocument,
2743
- op: "insert",
2744
- table
2745
- }, callOptions(shardKey));
2746
- }
2747
- onDone();
2748
- onRefresh();
2749
- return void 0;
2750
- } catch (error__0) {
2751
- return error__0.message;
2752
- }
2753
- };
2754
- return {
2755
- closeDialog,
2756
- columnMeta,
2757
- error,
2758
- fkPools,
2759
- insertBatch,
2760
- loading,
2761
- open,
2762
- openDialog,
2763
- shardKey,
2764
- table
2765
- };
2766
- };
2767
-
2768
- const NO_COLUMNS = [];
2769
- const useMaskPolicies = () => {
2770
- const $ = c(1);
2771
- let t0;
2772
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2773
- t0 = {};
2774
- $[0] = t0;
2775
- } else {
2776
- t0 = $[0];
2777
- }
2778
- const {
2779
- data
2780
- } = useAdminQuery(ADMIN_FUNCTIONS.maskPolicies, t0);
2781
- return Array.isArray(data?.columns) ? data.columns : NO_COLUMNS;
2782
- };
2783
-
2784
- const TIMESTAMP_RE$1 = /(?:_creationtime|(?:^|[a-z])(?:time|at))$/iu;
2785
- const looksLikeTimestamp = (column, value) => typeof value === "number" && TIMESTAMP_RE$1.test(column);
2786
- const FieldValue = (t0) => {
2787
- const $ = c(26);
2788
- const {
2789
- column,
2790
- onNavigate,
2791
- target,
2792
- value
2793
- } = t0;
2794
- let t1;
2795
- if ($[0] !== onNavigate || $[1] !== target || $[2] !== value) {
2796
- t1 = () => {
2797
- if (target !== void 0) {
2798
- onNavigate(target, String(value));
2799
- }
2800
- };
2801
- $[0] = onNavigate;
2802
- $[1] = target;
2803
- $[2] = value;
2804
- $[3] = t1;
2805
- } else {
2806
- t1 = $[3];
2807
- }
2808
- const onClick = t1;
2809
- if (value === null || value === void 0) {
2810
- let t22;
2811
- if ($[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2812
- t22 = /* @__PURE__ */ jsxDEV("span", {
2813
- className: "italic text-muted-foreground",
2814
- children: "null"
2815
- }, void 0, false);
2816
- $[4] = t22;
2817
- } else {
2818
- t22 = $[4];
2819
- }
2820
- return t22;
2821
- }
2822
- if (target !== void 0 && (typeof value === "string" || typeof value === "number") && String(value) !== "") {
2823
- const t22 = `rd-ref-${column}`;
2824
- const t32 = `Open ${target} ${String(value)}`;
2825
- const t4 = String(value);
2826
- let t5;
2827
- if ($[5] !== onClick || $[6] !== t22 || $[7] !== t32 || $[8] !== t4) {
2828
- t5 = /* @__PURE__ */ jsxDEV("button", {
2829
- "data-testid": t22,
2830
- onClick,
2831
- title: t32,
2832
- type: "button",
2833
- children: [t4, " ↗"]
2834
- }, void 0, true);
2835
- $[5] = onClick;
2836
- $[6] = t22;
2837
- $[7] = t32;
2838
- $[8] = t4;
2839
- $[9] = t5;
2840
- } else {
2841
- t5 = $[9];
2842
- }
2843
- return t5;
2844
- }
2845
- if (looksLikeTimestamp(column, value)) {
2846
- const t22 = `rd-ts-${column}`;
2847
- let t32;
2848
- if ($[10] !== value) {
2849
- t32 = value.toString();
2850
- $[10] = value;
2851
- $[11] = t32;
2852
- } else {
2853
- t32 = $[11];
2854
- }
2855
- let t4;
2856
- if ($[12] !== value) {
2857
- t4 = formatTimestamp(value);
2858
- $[12] = value;
2859
- $[13] = t4;
2860
- } else {
2861
- t4 = $[13];
2862
- }
2863
- let t5;
2864
- if ($[14] !== t22 || $[15] !== t32 || $[16] !== t4) {
2865
- t5 = /* @__PURE__ */ jsxDEV("span", {
2866
- "data-testid": t22,
2867
- title: t32,
2868
- children: t4
2869
- }, void 0, false);
2870
- $[14] = t22;
2871
- $[15] = t32;
2872
- $[16] = t4;
2873
- $[17] = t5;
2874
- } else {
2875
- t5 = $[17];
2876
- }
2877
- return t5;
2878
- }
2879
- if (typeof value === "object") {
2880
- let t22;
2881
- if ($[18] !== value) {
2882
- t22 = JSON.stringify(value, null, 2);
2883
- $[18] = value;
2884
- $[19] = t22;
2885
- } else {
2886
- t22 = $[19];
2887
- }
2888
- let t32;
2889
- if ($[20] !== t22) {
2890
- t32 = /* @__PURE__ */ jsxDEV("pre", {
2891
- className: "m-0 overflow-auto rounded-md bg-muted/50 p-2 text-xs",
2892
- children: t22
2893
- }, void 0, false);
2894
- $[20] = t22;
2895
- $[21] = t32;
2896
- } else {
2897
- t32 = $[21];
2898
- }
2899
- return t32;
2900
- }
2901
- let t2;
2902
- if ($[22] !== value) {
2903
- t2 = formatCell(value);
2904
- $[22] = value;
2905
- $[23] = t2;
2906
- } else {
2907
- t2 = $[23];
2908
- }
2909
- let t3;
2910
- if ($[24] !== t2) {
2911
- t3 = /* @__PURE__ */ jsxDEV("span", {
2912
- children: t2
2913
- }, void 0, false);
2914
- $[24] = t2;
2915
- $[25] = t3;
2916
- } else {
2917
- t3 = $[25];
2918
- }
2919
- return t3;
2920
- };
2921
- const RowDetailDrawer = (t0) => {
2922
- const $ = c(21);
2923
- const {
2924
- columns,
2925
- onClose,
2926
- onNavigate,
2927
- refs,
2928
- row
2929
- } = t0;
2930
- let t1;
2931
- if ($[0] !== onClose || $[1] !== onNavigate) {
2932
- t1 = (target, id) => {
2933
- onNavigate(target, id);
2934
- onClose();
2935
- };
2936
- $[0] = onClose;
2937
- $[1] = onNavigate;
2938
- $[2] = t1;
2939
- } else {
2940
- t1 = $[2];
2941
- }
2942
- const navigateAndClose = t1;
2943
- let t2;
2944
- if ($[3] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2945
- t2 = /* @__PURE__ */ jsxDEV("h3", {
2946
- className: "m-0 text-base text-foreground",
2947
- children: "Row detail"
2948
- }, void 0, false);
2949
- $[3] = t2;
2950
- } else {
2951
- t2 = $[3];
2952
- }
2953
- let t3;
2954
- if ($[4] !== onClose) {
2955
- t3 = /* @__PURE__ */ jsxDEV("div", {
2956
- className: "mb-3 flex items-center justify-between",
2957
- children: [t2, /* @__PURE__ */ jsxDEV("button", {
2958
- "data-testid": "rd-close",
2959
- onClick: onClose,
2960
- type: "button",
2961
- children: "Close"
2962
- }, void 0, false)]
2963
- }, void 0, true);
2964
- $[4] = onClose;
2965
- $[5] = t3;
2966
- } else {
2967
- t3 = $[5];
2968
- }
2969
- let t4;
2970
- if ($[6] !== columns || $[7] !== navigateAndClose || $[8] !== refs || $[9] !== row) {
2971
- let t52;
2972
- if ($[11] !== navigateAndClose || $[12] !== refs || $[13] !== row) {
2973
- t52 = (column) => /* @__PURE__ */ jsxDEV("div", {
2974
- className: "border-t border-border py-2 first:border-t-0",
2975
- "data-testid": `rd-field-${column}`,
2976
- children: [/* @__PURE__ */ jsxDEV("dt", {
2977
- className: "mb-0.5 text-xs font-semibold text-muted-foreground",
2978
- children: column
2979
- }, void 0, false), /* @__PURE__ */ jsxDEV("dd", {
2980
- className: "m-0",
2981
- children: /* @__PURE__ */ jsxDEV(FieldValue, {
2982
- column,
2983
- onNavigate: navigateAndClose,
2984
- target: refs?.[column],
2985
- value: row[column]
2986
- }, void 0, false)
2987
- }, void 0, false)]
2988
- }, column, true);
2989
- $[11] = navigateAndClose;
2990
- $[12] = refs;
2991
- $[13] = row;
2992
- $[14] = t52;
2993
- } else {
2994
- t52 = $[14];
2995
- }
2996
- t4 = columns.map(t52);
2997
- $[6] = columns;
2998
- $[7] = navigateAndClose;
2999
- $[8] = refs;
3000
- $[9] = row;
3001
- $[10] = t4;
3002
- } else {
3003
- t4 = $[10];
3004
- }
3005
- let t5;
3006
- if ($[15] !== t4) {
3007
- t5 = /* @__PURE__ */ jsxDEV("dl", {
3008
- "data-testid": "rd-fields",
3009
- children: t4
3010
- }, void 0, false);
3011
- $[15] = t4;
3012
- $[16] = t5;
3013
- } else {
3014
- t5 = $[16];
3015
- }
3016
- let t6;
3017
- if ($[17] !== onClose || $[18] !== t3 || $[19] !== t5) {
3018
- t6 = /* @__PURE__ */ jsxDEV(ModalShell, {
3019
- label: "Row detail",
3020
- onClose,
3021
- panelTestId: "rd-panel",
3022
- testId: "rd-overlay",
3023
- variant: "drawer",
3024
- children: [t3, t5]
3025
- }, void 0, true);
3026
- $[17] = onClose;
3027
- $[18] = t3;
3028
- $[19] = t5;
3029
- $[20] = t6;
3030
- } else {
3031
- t6 = $[20];
3032
- }
3033
- return t6;
3034
- };
3035
-
3036
- const CONTROL_BTN$1 = "inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground disabled:pointer-events-none disabled:opacity-50";
3037
- const FIELD_INPUT = "w-full rounded-md border border-border bg-background px-2 py-1 font-mono text-xs outline-none focus-visible:border-ring";
3038
- const TIMESTAMP_RE = /(?:_creationtime|(?:^|[a-z])(?:time|at))$/iu;
3039
- const inferKind = (column, value) => {
3040
- if (typeof value === "boolean") {
3041
- return "boolean";
3042
- }
3043
- if (typeof value === "number") {
3044
- return TIMESTAMP_RE.test(column) ? "date" : "number";
3045
- }
3046
- if (value !== null && typeof value === "object") {
3047
- return "json";
3048
- }
3049
- return "text";
3050
- };
3051
- const parseDocument = (documentText) => {
3052
- try {
3053
- const value = JSON.parse(documentText);
3054
- return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
3055
- } catch {
3056
- return null;
3057
- }
3058
- };
3059
- const toLocalDateTime = (ms) => {
3060
- const date = new Date(ms);
3061
- const pad = (n) => String(n).padStart(2, "0");
3062
- return `${date.getFullYear().toString()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;
3063
- };
3064
- const BooleanField = (t0) => {
3065
- const $ = c(8);
3066
- const {
3067
- column,
3068
- onChange,
3069
- value
3070
- } = t0;
3071
- let t1;
3072
- if ($[0] !== column || $[1] !== onChange) {
3073
- t1 = (checked) => {
3074
- onChange(column, checked);
3075
- };
3076
- $[0] = column;
3077
- $[1] = onChange;
3078
- $[2] = t1;
3079
- } else {
3080
- t1 = $[2];
3081
- }
3082
- const onCheckedChange = t1;
3083
- const t2 = value === true;
3084
- const t3 = `db-field-${column}`;
3085
- let t4;
3086
- if ($[3] !== column || $[4] !== onCheckedChange || $[5] !== t2 || $[6] !== t3) {
3087
- t4 = /* @__PURE__ */ jsxDEV(Checkbox, {
3088
- "aria-label": column,
3089
- checked: t2,
3090
- "data-testid": t3,
3091
- onCheckedChange
3092
- }, void 0, false);
3093
- $[3] = column;
3094
- $[4] = onCheckedChange;
3095
- $[5] = t2;
3096
- $[6] = t3;
3097
- $[7] = t4;
3098
- } else {
3099
- t4 = $[7];
3100
- }
3101
- return t4;
3102
- };
3103
- const NumberField = (t0) => {
3104
- const $ = c(7);
3105
- const {
3106
- column,
3107
- onChange,
3108
- value
3109
- } = t0;
3110
- let t1;
3111
- if ($[0] !== column || $[1] !== onChange) {
3112
- t1 = (event) => {
3113
- const next = Number(event.target.value);
3114
- if (event.target.value !== "" && !Number.isNaN(next)) {
3115
- onChange(column, next);
3116
- }
3117
- };
3118
- $[0] = column;
3119
- $[1] = onChange;
3120
- $[2] = t1;
3121
- } else {
3122
- t1 = $[2];
3123
- }
3124
- const onInput = t1;
3125
- const t2 = `db-field-${column}`;
3126
- const t3 = typeof value === "number" ? value : "";
3127
- let t4;
3128
- if ($[3] !== onInput || $[4] !== t2 || $[5] !== t3) {
3129
- t4 = /* @__PURE__ */ jsxDEV("input", {
3130
- className: FIELD_INPUT,
3131
- "data-testid": t2,
3132
- onChange: onInput,
3133
- type: "number",
3134
- value: t3
3135
- }, void 0, false);
3136
- $[3] = onInput;
3137
- $[4] = t2;
3138
- $[5] = t3;
3139
- $[6] = t4;
3140
- } else {
3141
- t4 = $[6];
3142
- }
3143
- return t4;
3144
- };
3145
- const DateField = (t0) => {
3146
- const $ = c(9);
3147
- const {
3148
- column,
3149
- onChange,
3150
- value
3151
- } = t0;
3152
- let t1;
3153
- if ($[0] !== column || $[1] !== onChange) {
3154
- t1 = (event) => {
3155
- const ms = new Date(event.target.value).getTime();
3156
- if (!Number.isNaN(ms)) {
3157
- onChange(column, ms);
3158
- }
3159
- };
3160
- $[0] = column;
3161
- $[1] = onChange;
3162
- $[2] = t1;
3163
- } else {
3164
- t1 = $[2];
3165
- }
3166
- const onInput = t1;
3167
- const t2 = `db-field-${column}`;
3168
- let t3;
3169
- if ($[3] !== value) {
3170
- t3 = typeof value === "number" ? toLocalDateTime(value) : "";
3171
- $[3] = value;
3172
- $[4] = t3;
3173
- } else {
3174
- t3 = $[4];
3175
- }
3176
- let t4;
3177
- if ($[5] !== onInput || $[6] !== t2 || $[7] !== t3) {
3178
- t4 = /* @__PURE__ */ jsxDEV("input", {
3179
- className: FIELD_INPUT,
3180
- "data-testid": t2,
3181
- onChange: onInput,
3182
- type: "datetime-local",
3183
- value: t3
3184
- }, void 0, false);
3185
- $[5] = onInput;
3186
- $[6] = t2;
3187
- $[7] = t3;
3188
- $[8] = t4;
3189
- } else {
3190
- t4 = $[8];
3191
- }
3192
- return t4;
3193
- };
3194
- const TextField = (t0) => {
3195
- const $ = c(7);
3196
- const {
3197
- column,
3198
- onChange,
3199
- value
3200
- } = t0;
3201
- let t1;
3202
- if ($[0] !== column || $[1] !== onChange) {
3203
- t1 = (event) => {
3204
- onChange(column, event.target.value);
3205
- };
3206
- $[0] = column;
3207
- $[1] = onChange;
3208
- $[2] = t1;
3209
- } else {
3210
- t1 = $[2];
3211
- }
3212
- const onInput = t1;
3213
- const t2 = `db-field-${column}`;
3214
- const t3 = typeof value === "string" ? value : "";
3215
- let t4;
3216
- if ($[3] !== onInput || $[4] !== t2 || $[5] !== t3) {
3217
- t4 = /* @__PURE__ */ jsxDEV("input", {
3218
- className: FIELD_INPUT,
3219
- "data-testid": t2,
3220
- onChange: onInput,
3221
- type: "text",
3222
- value: t3
3223
- }, void 0, false);
3224
- $[3] = onInput;
3225
- $[4] = t2;
3226
- $[5] = t3;
3227
- $[6] = t4;
3228
- } else {
3229
- t4 = $[6];
3230
- }
3231
- return t4;
3232
- };
3233
- const JsonField = (t0) => {
3234
- const $ = c(19);
3235
- const {
3236
- column,
3237
- onChange,
3238
- value
3239
- } = t0;
3240
- const t = useT();
3241
- let t1;
3242
- if ($[0] !== value) {
3243
- t1 = () => JSON.stringify(value, null, 2);
3244
- $[0] = value;
3245
- $[1] = t1;
3246
- } else {
3247
- t1 = $[1];
3248
- }
3249
- const [text, setText] = useState(t1);
3250
- const [error, setError] = useState(false);
3251
- let t2;
3252
- if ($[2] !== column || $[3] !== onChange) {
3253
- t2 = (event) => {
3254
- const next = event.target.value;
3255
- setText(next);
3256
- try {
3257
- onChange(column, JSON.parse(next));
3258
- setError(false);
3259
- } catch {
3260
- setError(true);
3261
- }
3262
- };
3263
- $[2] = column;
3264
- $[3] = onChange;
3265
- $[4] = t2;
3266
- } else {
3267
- t2 = $[4];
3268
- }
3269
- const onInput = t2;
3270
- const t3 = error && "border-destructive";
3271
- let t4;
3272
- if ($[5] !== t3) {
3273
- t4 = cn(FIELD_INPUT, "min-h-16", t3);
3274
- $[5] = t3;
3275
- $[6] = t4;
3276
- } else {
3277
- t4 = $[6];
3278
- }
3279
- const t5 = `db-field-${column}`;
3280
- let t6;
3281
- if ($[7] !== onInput || $[8] !== t4 || $[9] !== t5 || $[10] !== text) {
3282
- t6 = /* @__PURE__ */ jsxDEV("textarea", {
3283
- className: t4,
3284
- "data-testid": t5,
3285
- onChange: onInput,
3286
- value: text
3287
- }, void 0, false);
3288
- $[7] = onInput;
3289
- $[8] = t4;
3290
- $[9] = t5;
3291
- $[10] = text;
3292
- $[11] = t6;
3293
- } else {
3294
- t6 = $[11];
3295
- }
3296
- let t7;
3297
- if ($[12] !== column || $[13] !== error || $[14] !== t) {
3298
- t7 = error && /* @__PURE__ */ jsxDEV("span", {
3299
- className: "text-xs text-destructive",
3300
- "data-testid": `db-field-error-${column}`,
3301
- children: t("Invalid JSON")
3302
- }, void 0, false);
3303
- $[12] = column;
3304
- $[13] = error;
3305
- $[14] = t;
3306
- $[15] = t7;
3307
- } else {
3308
- t7 = $[15];
3309
- }
3310
- let t8;
3311
- if ($[16] !== t6 || $[17] !== t7) {
3312
- t8 = /* @__PURE__ */ jsxDEV("div", {
3313
- className: "flex flex-col gap-1",
3314
- children: [t6, t7]
3315
- }, void 0, true);
3316
- $[16] = t6;
3317
- $[17] = t7;
3318
- $[18] = t8;
3319
- } else {
3320
- t8 = $[18];
3321
- }
3322
- return t8;
3323
- };
3324
- const FieldRow = (t0) => {
3325
- const $ = c(43);
3326
- const {
3327
- column,
3328
- onChange,
3329
- target,
3330
- value
3331
- } = t0;
3332
- let t1;
3333
- if ($[0] !== column || $[1] !== value) {
3334
- t1 = inferKind(column, value);
3335
- $[0] = column;
3336
- $[1] = value;
3337
- $[2] = t1;
3338
- } else {
3339
- t1 = $[2];
3340
- }
3341
- const kind = t1;
3342
- const t2 = `db-field-${column}`;
3343
- let t3;
3344
- if ($[3] !== column) {
3345
- t3 = /* @__PURE__ */ jsxDEV("span", {
3346
- className: "font-mono",
3347
- children: column
3348
- }, void 0, false);
3349
- $[3] = column;
3350
- $[4] = t3;
3351
- } else {
3352
- t3 = $[4];
3353
- }
3354
- let t4;
3355
- if ($[5] !== target) {
3356
- t4 = target !== void 0 && /* @__PURE__ */ jsxDEV("span", {
3357
- className: "rounded bg-muted px-1 font-mono text-[10px] tracking-wide uppercase",
3358
- children: ["→ ", target]
3359
- }, void 0, true);
3360
- $[5] = target;
3361
- $[6] = t4;
3362
- } else {
3363
- t4 = $[6];
3364
- }
3365
- let t5;
3366
- if ($[7] !== t3 || $[8] !== t4) {
3367
- t5 = /* @__PURE__ */ jsxDEV("span", {
3368
- className: "flex items-center gap-1.5 font-medium text-muted-foreground",
3369
- children: [t3, t4]
3370
- }, void 0, true);
3371
- $[7] = t3;
3372
- $[8] = t4;
3373
- $[9] = t5;
3374
- } else {
3375
- t5 = $[9];
3376
- }
3377
- let t6;
3378
- if ($[10] !== column || $[11] !== kind || $[12] !== onChange || $[13] !== value) {
3379
- t6 = kind === "boolean" && /* @__PURE__ */ jsxDEV(BooleanField, {
3380
- column,
3381
- onChange,
3382
- value
3383
- }, void 0, false);
3384
- $[10] = column;
3385
- $[11] = kind;
3386
- $[12] = onChange;
3387
- $[13] = value;
3388
- $[14] = t6;
3389
- } else {
3390
- t6 = $[14];
3391
- }
3392
- let t7;
3393
- if ($[15] !== column || $[16] !== kind || $[17] !== onChange || $[18] !== value) {
3394
- t7 = kind === "number" && /* @__PURE__ */ jsxDEV(NumberField, {
3395
- column,
3396
- onChange,
3397
- value
3398
- }, void 0, false);
3399
- $[15] = column;
3400
- $[16] = kind;
3401
- $[17] = onChange;
3402
- $[18] = value;
3403
- $[19] = t7;
3404
- } else {
3405
- t7 = $[19];
3406
- }
3407
- let t8;
3408
- if ($[20] !== column || $[21] !== kind || $[22] !== onChange || $[23] !== value) {
3409
- t8 = kind === "date" && /* @__PURE__ */ jsxDEV(DateField, {
3410
- column,
3411
- onChange,
3412
- value
3413
- }, void 0, false);
3414
- $[20] = column;
3415
- $[21] = kind;
3416
- $[22] = onChange;
3417
- $[23] = value;
3418
- $[24] = t8;
3419
- } else {
3420
- t8 = $[24];
3421
- }
3422
- let t9;
3423
- if ($[25] !== column || $[26] !== kind || $[27] !== onChange || $[28] !== value) {
3424
- t9 = kind === "json" && /* @__PURE__ */ jsxDEV(JsonField, {
3425
- column,
3426
- onChange,
3427
- value
3428
- }, void 0, false);
3429
- $[25] = column;
3430
- $[26] = kind;
3431
- $[27] = onChange;
3432
- $[28] = value;
3433
- $[29] = t9;
3434
- } else {
3435
- t9 = $[29];
3436
- }
3437
- let t10;
3438
- if ($[30] !== column || $[31] !== kind || $[32] !== onChange || $[33] !== value) {
3439
- t10 = kind === "text" && /* @__PURE__ */ jsxDEV(TextField, {
3440
- column,
3441
- onChange,
3442
- value
3443
- }, void 0, false);
3444
- $[30] = column;
3445
- $[31] = kind;
3446
- $[32] = onChange;
3447
- $[33] = value;
3448
- $[34] = t10;
3449
- } else {
3450
- t10 = $[34];
3451
- }
3452
- let t11;
3453
- if ($[35] !== t10 || $[36] !== t2 || $[37] !== t5 || $[38] !== t6 || $[39] !== t7 || $[40] !== t8 || $[41] !== t9) {
3454
- t11 = /* @__PURE__ */ jsxDEV("label", {
3455
- className: "flex flex-col gap-1 text-xs",
3456
- htmlFor: t2,
3457
- children: [t5, t6, t7, t8, t9, t10]
3458
- }, void 0, true);
3459
- $[35] = t10;
3460
- $[36] = t2;
3461
- $[37] = t5;
3462
- $[38] = t6;
3463
- $[39] = t7;
3464
- $[40] = t8;
3465
- $[41] = t9;
3466
- $[42] = t11;
3467
- } else {
3468
- t11 = $[42];
3469
- }
3470
- return t11;
3471
- };
3472
- const RowFormEditor = (t0) => {
3473
- const $ = c(48);
3474
- const {
3475
- documentText,
3476
- onCancel,
3477
- onDocumentTextChange,
3478
- onSave,
3479
- refs
3480
- } = t0;
3481
- const t = useT();
3482
- let t1;
3483
- if ($[0] !== documentText) {
3484
- t1 = parseDocument(documentText);
3485
- $[0] = documentText;
3486
- $[1] = t1;
3487
- } else {
3488
- t1 = $[1];
3489
- }
3490
- const fields = t1;
3491
- const [rawMode, setRawMode] = useState(false);
3492
- const showForm = !rawMode && fields !== null;
3493
- let t2;
3494
- if ($[2] !== fields || $[3] !== onDocumentTextChange) {
3495
- t2 = (column, value) => {
3496
- onDocumentTextChange(JSON.stringify({
3497
- ...fields,
3498
- [column]: value
3499
- }, null, 2));
3500
- };
3501
- $[2] = fields;
3502
- $[3] = onDocumentTextChange;
3503
- $[4] = t2;
3504
- } else {
3505
- t2 = $[4];
3506
- }
3507
- const onField = t2;
3508
- let t3;
3509
- if ($[5] !== onDocumentTextChange) {
3510
- t3 = (event) => {
3511
- onDocumentTextChange(event.target.value);
3512
- };
3513
- $[5] = onDocumentTextChange;
3514
- $[6] = t3;
3515
- } else {
3516
- t3 = $[6];
3517
- }
3518
- const onTextarea = t3;
3519
- let t4;
3520
- if ($[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
3521
- t4 = () => {
3522
- setRawMode(false);
3523
- };
3524
- $[7] = t4;
3525
- } else {
3526
- t4 = $[7];
3527
- }
3528
- const showFormMode = t4;
3529
- let t5;
3530
- if ($[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
3531
- t5 = () => {
3532
- setRawMode(true);
3533
- };
3534
- $[8] = t5;
3535
- } else {
3536
- t5 = $[8];
3537
- }
3538
- const showJsonMode = t5;
3539
- const t6 = fields === null;
3540
- let t7;
3541
- if ($[9] !== t) {
3542
- t7 = t("Form");
3543
- $[9] = t;
3544
- $[10] = t7;
3545
- } else {
3546
- t7 = $[10];
3547
- }
3548
- let t8;
3549
- if ($[11] !== showForm || $[12] !== t6 || $[13] !== t7) {
3550
- t8 = /* @__PURE__ */ jsxDEV("button", {
3551
- "aria-pressed": showForm,
3552
- className: CONTROL_BTN$1,
3553
- "data-testid": "db-editor-form",
3554
- disabled: t6,
3555
- onClick: showFormMode,
3556
- type: "button",
3557
- children: t7
3558
- }, void 0, false);
3559
- $[11] = showForm;
3560
- $[12] = t6;
3561
- $[13] = t7;
3562
- $[14] = t8;
3563
- } else {
3564
- t8 = $[14];
3565
- }
3566
- const t9 = !showForm;
3567
- let t10;
3568
- if ($[15] !== t) {
3569
- t10 = t("JSON");
3570
- $[15] = t;
3571
- $[16] = t10;
3572
- } else {
3573
- t10 = $[16];
3574
- }
3575
- let t11;
3576
- if ($[17] !== t10 || $[18] !== t9) {
3577
- t11 = /* @__PURE__ */ jsxDEV("button", {
3578
- "aria-pressed": t9,
3579
- className: CONTROL_BTN$1,
3580
- "data-testid": "db-editor-json",
3581
- onClick: showJsonMode,
3582
- type: "button",
3583
- children: t10
3584
- }, void 0, false);
3585
- $[17] = t10;
3586
- $[18] = t9;
3587
- $[19] = t11;
3588
- } else {
3589
- t11 = $[19];
3590
- }
3591
- let t12;
3592
- if ($[20] !== t11 || $[21] !== t8) {
3593
- t12 = /* @__PURE__ */ jsxDEV("div", {
3594
- className: "flex items-center gap-1.5",
3595
- children: [t8, t11]
3596
- }, void 0, true);
3597
- $[20] = t11;
3598
- $[21] = t8;
3599
- $[22] = t12;
3600
- } else {
3601
- t12 = $[22];
3602
- }
3603
- let t13;
3604
- if ($[23] !== documentText || $[24] !== fields || $[25] !== onField || $[26] !== onTextarea || $[27] !== refs || $[28] !== showForm || $[29] !== t) {
3605
- t13 = showForm ? /* @__PURE__ */ jsxDEV("div", {
3606
- className: "flex flex-col gap-3",
3607
- "data-testid": "db-editor-fields",
3608
- children: Object.entries(fields).map((t142) => {
3609
- const [column_0, value_0] = t142;
3610
- return /* @__PURE__ */ jsxDEV(FieldRow, {
3611
- column: column_0,
3612
- onChange: onField,
3613
- target: refs?.[column_0],
3614
- value: value_0
3615
- }, column_0, false);
3616
- })
3617
- }, void 0, false) : /* @__PURE__ */ jsxDEV("textarea", {
3618
- "aria-label": t("Row document JSON"),
3619
- className: "min-h-28 w-full rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus-visible:border-ring",
3620
- "data-testid": "db-editor-doc",
3621
- onChange: onTextarea,
3622
- value: documentText
3623
- }, void 0, false);
3624
- $[23] = documentText;
3625
- $[24] = fields;
3626
- $[25] = onField;
3627
- $[26] = onTextarea;
3628
- $[27] = refs;
3629
- $[28] = showForm;
3630
- $[29] = t;
3631
- $[30] = t13;
3632
- } else {
3633
- t13 = $[30];
3634
- }
3635
- let t14;
3636
- if ($[31] !== t) {
3637
- t14 = t("Save");
3638
- $[31] = t;
3639
- $[32] = t14;
3640
- } else {
3641
- t14 = $[32];
3642
- }
3643
- let t15;
3644
- if ($[33] !== onSave || $[34] !== t14) {
3645
- t15 = /* @__PURE__ */ jsxDEV("button", {
3646
- className: CONTROL_BTN$1,
3647
- "data-testid": "db-editor-save",
3648
- onClick: onSave,
3649
- type: "button",
3650
- children: t14
3651
- }, void 0, false);
3652
- $[33] = onSave;
3653
- $[34] = t14;
3654
- $[35] = t15;
3655
- } else {
3656
- t15 = $[35];
3657
- }
3658
- let t16;
3659
- if ($[36] !== t) {
3660
- t16 = t("Cancel");
3661
- $[36] = t;
3662
- $[37] = t16;
3663
- } else {
3664
- t16 = $[37];
3665
- }
3666
- let t17;
3667
- if ($[38] !== onCancel || $[39] !== t16) {
3668
- t17 = /* @__PURE__ */ jsxDEV("button", {
3669
- className: CONTROL_BTN$1,
3670
- "data-testid": "db-editor-cancel",
3671
- onClick: onCancel,
3672
- type: "button",
3673
- children: t16
3674
- }, void 0, false);
3675
- $[38] = onCancel;
3676
- $[39] = t16;
3677
- $[40] = t17;
3678
- } else {
3679
- t17 = $[40];
3680
- }
3681
- let t18;
3682
- if ($[41] !== t15 || $[42] !== t17) {
3683
- t18 = /* @__PURE__ */ jsxDEV("div", {
3684
- className: "flex items-center gap-1.5",
3685
- children: [t15, t17]
3686
- }, void 0, true);
3687
- $[41] = t15;
3688
- $[42] = t17;
3689
- $[43] = t18;
3690
- } else {
3691
- t18 = $[43];
3692
- }
3693
- let t19;
3694
- if ($[44] !== t12 || $[45] !== t13 || $[46] !== t18) {
3695
- t19 = /* @__PURE__ */ jsxDEV("div", {
3696
- className: "flex flex-col gap-2 border border-border bg-card p-3",
3697
- "data-testid": "db-editor",
3698
- children: [t12, t13, t18]
3699
- }, void 0, true);
3700
- $[44] = t12;
3701
- $[45] = t13;
3702
- $[46] = t18;
3703
- $[47] = t19;
3704
- } else {
3705
- t19 = $[47];
3706
- }
3707
- return t19;
3708
- };
3709
-
3710
- const MAX_SUMMARY_TABLES = 50;
3711
- const ShardButton = (t0) => {
3712
- const $ = c(8);
3713
- const {
3714
- active,
3715
- onPick,
3716
- shard
3717
- } = t0;
3718
- let t1;
3719
- if ($[0] !== onPick || $[1] !== shard) {
3720
- t1 = () => {
3721
- onPick(shard);
3722
- };
3723
- $[0] = onPick;
3724
- $[1] = shard;
3725
- $[2] = t1;
3726
- } else {
3727
- t1 = $[2];
3728
- }
3729
- const handleClick = t1;
3730
- const t2 = `w-full rounded px-2 py-0.5 text-left text-xs transition-colors hover:bg-accent ${active ? "bg-accent font-medium" : ""}`;
3731
- const t3 = `shard-explorer-item-${shard}`;
3732
- let t4;
3733
- if ($[3] !== handleClick || $[4] !== shard || $[5] !== t2 || $[6] !== t3) {
3734
- t4 = /* @__PURE__ */ jsxDEV("button", {
3735
- className: t2,
3736
- "data-testid": t3,
3737
- onClick: handleClick,
3738
- type: "button",
3739
- children: shard
3740
- }, void 0, false);
3741
- $[3] = handleClick;
3742
- $[4] = shard;
3743
- $[5] = t2;
3744
- $[6] = t3;
3745
- $[7] = t4;
3746
- } else {
3747
- t4 = $[7];
3748
- }
3749
- return t4;
3750
- };
3751
- const ShardExplorer = ({
3752
- onFetchTables,
3753
- onSelect
3754
- }) => {
3755
- const t = useT();
3756
- const [recents] = useState(() => loadRecentShards());
3757
- const [open, setOpen] = useState(false);
3758
- const [activeShard, setActiveShard] = useState(void 0);
3759
- const [tables, setTables] = useState(void 0);
3760
- const [loading, setLoading] = useState(false);
3761
- const [error, setError] = useState(void 0);
3762
- const requestIdRef = useRef(0);
3763
- const toggleOpen = () => {
3764
- setOpen((current) => !current);
3765
- };
3766
- const pickShardAsync = async (shardKey) => {
3767
- onSelect(shardKey);
3768
- setActiveShard(shardKey);
3769
- setTables(void 0);
3770
- setError(void 0);
3771
- setLoading(true);
3772
- requestIdRef.current += 1;
3773
- const myRequestId = requestIdRef.current;
3774
- try {
3775
- const result = await onFetchTables(shardKey);
3776
- if (requestIdRef.current === myRequestId) {
3777
- setTables(result?.slice(0, MAX_SUMMARY_TABLES));
3778
- }
3779
- } catch (error_) {
3780
- if (requestIdRef.current === myRequestId) {
3781
- setError(error_.message);
3782
- }
3783
- } finally {
3784
- if (requestIdRef.current === myRequestId) {
3785
- setLoading(false);
3786
- }
3787
- }
3788
- };
3789
- const pickShard = (shardKey_0) => {
3790
- fireAndForget(pickShardAsync(shardKey_0));
3791
- };
3792
- if (recents.length === 0) {
3793
- return null;
3794
- }
3795
- return /* @__PURE__ */ jsxDEV("div", {
3796
- "data-testid": "shard-explorer",
3797
- children: [/* @__PURE__ */ jsxDEV("button", {
3798
- "aria-controls": "shard-explorer-panel",
3799
- "aria-expanded": open,
3800
- className: "inline-flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent",
3801
- "data-testid": "shard-explorer-toggle",
3802
- onClick: toggleOpen,
3803
- type: "button",
3804
- children: [t("Shards seen"), /* @__PURE__ */ jsxDEV("span", {
3805
- "aria-hidden": "true",
3806
- className: `ml-0.5 transition-transform ${open ? "rotate-180" : ""}`,
3807
- children: "▾"
3808
- }, void 0, false)]
3809
- }, void 0, true), open && /* @__PURE__ */ jsxDEV("div", {
3810
- className: "mt-1 flex flex-col gap-1 rounded-md border border-border bg-popover p-2",
3811
- "data-testid": "shard-explorer-panel",
3812
- id: "shard-explorer-panel",
3813
- children: [/* @__PURE__ */ jsxDEV("p", {
3814
- className: "text-xs text-muted-foreground",
3815
- "data-testid": "shard-explorer-hint",
3816
- children: t("Recently visited shards — click to switch")
3817
- }, void 0, false), /* @__PURE__ */ jsxDEV("ul", {
3818
- className: "flex flex-col gap-0.5",
3819
- "data-testid": "shard-explorer-list",
3820
- children: recents.map((shard) => /* @__PURE__ */ jsxDEV("li", {
3821
- children: /* @__PURE__ */ jsxDEV(ShardButton, {
3822
- active: activeShard === shard,
3823
- onPick: pickShard,
3824
- shard
3825
- }, void 0, false)
3826
- }, shard, false))
3827
- }, void 0, false), activeShard !== void 0 && /* @__PURE__ */ jsxDEV("div", {
3828
- className: "mt-1 border-t border-border pt-1",
3829
- "data-testid": "shard-explorer-summary",
3830
- children: [/* @__PURE__ */ jsxDEV("p", {
3831
- className: "mb-1 text-xs font-medium text-foreground",
3832
- "data-testid": "shard-explorer-summary-title",
3833
- children: t("{shard} tables", {
3834
- shard: activeShard
3835
- })
3836
- }, void 0, false), loading && /* @__PURE__ */ jsxDEV("p", {
3837
- className: "text-xs text-muted-foreground",
3838
- "data-testid": "shard-explorer-loading",
3839
- children: t("Loading…")
3840
- }, void 0, false), error !== void 0 && /* @__PURE__ */ jsxDEV("p", {
3841
- className: "text-xs text-destructive",
3842
- "data-testid": "shard-explorer-error",
3843
- role: "alert",
3844
- children: error
3845
- }, void 0, false), !loading && error === void 0 && tables?.length === 0 && /* @__PURE__ */ jsxDEV("p", {
3846
- className: "text-xs text-muted-foreground",
3847
- "data-testid": "shard-explorer-empty",
3848
- children: t("No tables in this shard.")
3849
- }, void 0, false), !loading && error === void 0 && tables !== void 0 && tables.length > 0 && /* @__PURE__ */ jsxDEV("ul", {
3850
- className: "flex flex-col gap-0.5",
3851
- "data-testid": "shard-explorer-tables",
3852
- children: tables.map((tableInfo) => /* @__PURE__ */ jsxDEV("li", {
3853
- className: "flex items-center justify-between text-xs",
3854
- children: [/* @__PURE__ */ jsxDEV("span", {
3855
- "data-testid": `shard-explorer-table-${tableInfo.name}`,
3856
- children: tableInfo.name
3857
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
3858
- className: "text-muted-foreground",
3859
- "data-testid": `shard-explorer-rowcount-${tableInfo.name}`,
3860
- children: tableInfo.rowCount
3861
- }, void 0, false)]
3862
- }, tableInfo.name, true))
3863
- }, void 0, false)]
3864
- }, void 0, true)]
3865
- }, void 0, true)]
3866
- }, void 0, true);
3867
- };
3868
-
3869
- const DEFAULT_PAGE_SIZE = 50;
3870
- const NO_TABLES = [];
3871
- const CONTROL_BTN = "inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent disabled:pointer-events-none disabled:opacity-50 aria-pressed:bg-accent aria-pressed:text-accent-foreground";
3872
- const LIST_TABLES = adminRef(ADMIN_FUNCTIONS.listTables);
3873
- const DataBrowserSidebarHeader = (t0) => {
3874
- const $ = c(10);
3875
- const {
3876
- onFetchShardTables,
3877
- onShardChange,
3878
- schemaSwitch,
3879
- shardKey
3880
- } = t0;
3881
- let t1;
3882
- if ($[0] !== onShardChange || $[1] !== shardKey) {
3883
- t1 = /* @__PURE__ */ jsxDEV(ShardInput, {
3884
- onChange: onShardChange,
3885
- testId: "db-shard-input",
3886
- value: shardKey
3887
- }, void 0, false);
3888
- $[0] = onShardChange;
3889
- $[1] = shardKey;
3890
- $[2] = t1;
3891
- } else {
3892
- t1 = $[2];
3893
- }
3894
- let t2;
3895
- if ($[3] !== onFetchShardTables || $[4] !== onShardChange) {
3896
- t2 = /* @__PURE__ */ jsxDEV(ShardExplorer, {
3897
- onFetchTables: onFetchShardTables,
3898
- onSelect: onShardChange
3899
- }, void 0, false);
3900
- $[3] = onFetchShardTables;
3901
- $[4] = onShardChange;
3902
- $[5] = t2;
3903
- } else {
3904
- t2 = $[5];
3905
- }
3906
- let t3;
3907
- if ($[6] !== schemaSwitch || $[7] !== t1 || $[8] !== t2) {
3908
- t3 = /* @__PURE__ */ jsxDEV("div", {
3909
- className: "flex shrink-0 flex-col items-stretch gap-2 border-b border-border p-3",
3910
- children: [schemaSwitch, t1, t2]
3911
- }, void 0, true);
3912
- $[6] = schemaSwitch;
3913
- $[7] = t1;
3914
- $[8] = t2;
3915
- $[9] = t3;
3916
- } else {
3917
- t3 = $[9];
3918
- }
3919
- return t3;
3920
- };
3921
- const DataBrowserViewControls = (t0) => {
3922
- const $ = c(60);
3923
- const {
3924
- columns,
3925
- editable,
3926
- filter,
3927
- filters,
3928
- hasMaskedColumns,
3929
- liveError,
3930
- maskOn,
3931
- onAddRow,
3932
- onBulkDelete,
3933
- onClearTable,
3934
- onFilterChange,
3935
- onFiltersChange,
3936
- onGenerateRows,
3937
- onShowJson,
3938
- onShowTable,
3939
- onToggleMask,
3940
- total,
3941
- viewMode
3942
- } = t0;
3943
- const t = useT();
3944
- const t1 = viewMode === "table";
3945
- let t2;
3946
- if ($[0] !== onShowTable || $[1] !== t1) {
3947
- t2 = /* @__PURE__ */ jsxDEV("button", {
3948
- "aria-pressed": t1,
3949
- className: CONTROL_BTN,
3950
- "data-testid": "db-view-table",
3951
- onClick: onShowTable,
3952
- type: "button",
3953
- children: "Table"
3954
- }, void 0, false);
3955
- $[0] = onShowTable;
3956
- $[1] = t1;
3957
- $[2] = t2;
3958
- } else {
3959
- t2 = $[2];
3960
- }
3961
- const t3 = viewMode === "json";
3962
- let t4;
3963
- if ($[3] !== onShowJson || $[4] !== t3) {
3964
- t4 = /* @__PURE__ */ jsxDEV("button", {
3965
- "aria-pressed": t3,
3966
- className: CONTROL_BTN,
3967
- "data-testid": "db-view-json",
3968
- onClick: onShowJson,
3969
- type: "button",
3970
- children: "JSON"
3971
- }, void 0, false);
3972
- $[3] = onShowJson;
3973
- $[4] = t3;
3974
- $[5] = t4;
3975
- } else {
3976
- t4 = $[5];
3977
- }
3978
- let t5;
3979
- if ($[6] !== liveError || $[7] !== t) {
3980
- t5 = liveError === void 0 ? t("Live — changes stream in automatically") : t("Live unavailable: {liveError}", {
3981
- liveError
3982
- });
3983
- $[6] = liveError;
3984
- $[7] = t;
3985
- $[8] = t5;
3986
- } else {
3987
- t5 = $[8];
3988
- }
3989
- const t6 = `size-1.5 rounded-full ${liveError === void 0 ? "bg-success" : "bg-muted-foreground/50"}`;
3990
- let t7;
3991
- if ($[9] !== t6) {
3992
- t7 = /* @__PURE__ */ jsxDEV("span", {
3993
- "aria-hidden": "true",
3994
- className: t6
3995
- }, void 0, false);
3996
- $[9] = t6;
3997
- $[10] = t7;
3998
- } else {
3999
- t7 = $[10];
4000
- }
4001
- let t8;
4002
- if ($[11] !== liveError || $[12] !== t) {
4003
- t8 = liveError === void 0 ? t("Live") : t("Live unavailable");
4004
- $[11] = liveError;
4005
- $[12] = t;
4006
- $[13] = t8;
4007
- } else {
4008
- t8 = $[13];
4009
- }
4010
- let t9;
4011
- if ($[14] !== t5 || $[15] !== t7 || $[16] !== t8) {
4012
- t9 = /* @__PURE__ */ jsxDEV("span", {
4013
- className: "inline-flex items-center gap-1.5 px-1 text-xs font-medium text-muted-foreground",
4014
- "data-testid": "db-live-indicator",
4015
- role: "status",
4016
- title: t5,
4017
- children: [t7, t8]
4018
- }, void 0, true);
4019
- $[14] = t5;
4020
- $[15] = t7;
4021
- $[16] = t8;
4022
- $[17] = t9;
4023
- } else {
4024
- t9 = $[17];
4025
- }
4026
- let t10;
4027
- if ($[18] !== hasMaskedColumns || $[19] !== maskOn || $[20] !== onToggleMask || $[21] !== t) {
4028
- t10 = hasMaskedColumns && /* @__PURE__ */ jsxDEV("button", {
4029
- "aria-pressed": maskOn,
4030
- className: CONTROL_BTN,
4031
- "data-testid": "db-mask-toggle",
4032
- onClick: onToggleMask,
4033
- type: "button",
4034
- children: t("Mask sensitive columns")
4035
- }, void 0, false);
4036
- $[18] = hasMaskedColumns;
4037
- $[19] = maskOn;
4038
- $[20] = onToggleMask;
4039
- $[21] = t;
4040
- $[22] = t10;
4041
- } else {
4042
- t10 = $[22];
4043
- }
4044
- let t11;
4045
- if ($[23] !== editable || $[24] !== onAddRow) {
4046
- t11 = editable && /* @__PURE__ */ jsxDEV("button", {
4047
- className: CONTROL_BTN,
4048
- "data-testid": "db-add-row",
4049
- onClick: onAddRow,
4050
- type: "button",
4051
- children: "Add row"
4052
- }, void 0, false);
4053
- $[23] = editable;
4054
- $[24] = onAddRow;
4055
- $[25] = t11;
4056
- } else {
4057
- t11 = $[25];
4058
- }
4059
- let t12;
4060
- if ($[26] !== editable || $[27] !== onGenerateRows || $[28] !== t) {
4061
- t12 = editable && /* @__PURE__ */ jsxDEV("button", {
4062
- className: CONTROL_BTN,
4063
- "data-testid": "db-generate-rows",
4064
- onClick: onGenerateRows,
4065
- type: "button",
4066
- children: t("Generate rows")
4067
- }, void 0, false);
4068
- $[26] = editable;
4069
- $[27] = onGenerateRows;
4070
- $[28] = t;
4071
- $[29] = t12;
4072
- } else {
4073
- t12 = $[29];
4074
- }
4075
- let t13;
4076
- if ($[30] !== editable || $[31] !== filter || $[32] !== filters || $[33] !== onBulkDelete || $[34] !== total) {
4077
- t13 = editable && total > 0 && (filter !== "" || filters.length > 0) && /* @__PURE__ */ jsxDEV(ConfirmButton, {
4078
- confirmLabel: `Delete ${total.toString()} matching?`,
4079
- onConfirm: onBulkDelete,
4080
- testId: "db-bulk-delete",
4081
- children: `Delete ${total.toString()} matching`
4082
- }, void 0, false);
4083
- $[30] = editable;
4084
- $[31] = filter;
4085
- $[32] = filters;
4086
- $[33] = onBulkDelete;
4087
- $[34] = total;
4088
- $[35] = t13;
4089
- } else {
4090
- t13 = $[35];
4091
- }
4092
- let t14;
4093
- if ($[36] !== editable || $[37] !== filter || $[38] !== filters || $[39] !== onClearTable || $[40] !== total) {
4094
- t14 = editable && total > 0 && filter === "" && filters.length === 0 && /* @__PURE__ */ jsxDEV(ConfirmButton, {
4095
- confirmLabel: `Clear all ${total.toString()} rows?`,
4096
- onConfirm: onClearTable,
4097
- testId: "db-clear-table",
4098
- children: `Clear table (${total.toString()})`
4099
- }, void 0, false);
4100
- $[36] = editable;
4101
- $[37] = filter;
4102
- $[38] = filters;
4103
- $[39] = onClearTable;
4104
- $[40] = total;
4105
- $[41] = t14;
4106
- } else {
4107
- t14 = $[41];
4108
- }
4109
- let t15;
4110
- if ($[42] !== t10 || $[43] !== t11 || $[44] !== t12 || $[45] !== t13 || $[46] !== t14 || $[47] !== t2 || $[48] !== t4 || $[49] !== t9) {
4111
- t15 = /* @__PURE__ */ jsxDEV("div", {
4112
- className: "flex flex-wrap items-center gap-1.5",
4113
- children: [t2, t4, t9, t10, t11, t12, t13, t14]
4114
- }, void 0, true);
4115
- $[42] = t10;
4116
- $[43] = t11;
4117
- $[44] = t12;
4118
- $[45] = t13;
4119
- $[46] = t14;
4120
- $[47] = t2;
4121
- $[48] = t4;
4122
- $[49] = t9;
4123
- $[50] = t15;
4124
- } else {
4125
- t15 = $[50];
4126
- }
4127
- let t16;
4128
- if ($[51] !== columns || $[52] !== filter || $[53] !== filters || $[54] !== onFilterChange || $[55] !== onFiltersChange) {
4129
- t16 = /* @__PURE__ */ jsxDEV(DataFilters, {
4130
- columns,
4131
- filters,
4132
- onFiltersChange,
4133
- onSearchChange: onFilterChange,
4134
- search: filter
4135
- }, void 0, false);
4136
- $[51] = columns;
4137
- $[52] = filter;
4138
- $[53] = filters;
4139
- $[54] = onFilterChange;
4140
- $[55] = onFiltersChange;
4141
- $[56] = t16;
4142
- } else {
4143
- t16 = $[56];
4144
- }
4145
- let t17;
4146
- if ($[57] !== t15 || $[58] !== t16) {
4147
- t17 = /* @__PURE__ */ jsxDEV("div", {
4148
- className: "flex flex-col gap-2",
4149
- "data-testid": "db-view-toggle",
4150
- children: [t15, t16]
4151
- }, void 0, true);
4152
- $[57] = t15;
4153
- $[58] = t16;
4154
- $[59] = t17;
4155
- } else {
4156
- t17 = $[59];
4157
- }
4158
- return t17;
4159
- };
4160
- const DataBrowser = ({
4161
- editable = false,
4162
- globalTableNames,
4163
- initialFilters,
4164
- initialOrderBy,
4165
- initialSearch,
4166
- initialShardKey,
4167
- onNavigateToGlobal,
4168
- onSelectTable,
4169
- onViewChange,
4170
- pageSize: initialPageSize = DEFAULT_PAGE_SIZE,
4171
- queryBar,
4172
- schemaSwitch,
4173
- tableParam
4174
- }) => {
4175
- const {
4176
- addRow,
4177
- bulkDelete,
4178
- cancelCellEdit,
4179
- cancelEdit,
4180
- changePageSize,
4181
- clearTable,
4182
- columns,
4183
- committing,
4184
- currentView,
4185
- discardStaged,
4186
- editableColumn,
4187
- editing,
4188
- editingCell,
4189
- facetFilter,
4190
- facets,
4191
- filter,
4192
- filters,
4193
- goNext,
4194
- goPrevious,
4195
- hasNext,
4196
- hasPrevious,
4197
- jumpToPage,
4198
- liveError,
4199
- loadTables,
4200
- navigateToRef,
4201
- onBulkDeleteSelected,
4202
- onCommitStaged,
4203
- onFilterChange,
4204
- onFiltersChange,
4205
- onRowDelete,
4206
- onRowEdit,
4207
- page,
4208
- pageError,
4209
- previewRef,
4210
- pageSize,
4211
- rangeEnd,
4212
- rangeStart,
4213
- saveEdit,
4214
- selectedTable,
4215
- selectTable,
4216
- setEditorDocumentText,
4217
- setShardKey,
4218
- shardKey,
4219
- showJson,
4220
- showTable,
4221
- stage,
4222
- stagedChanges,
4223
- stagedValue,
4224
- startCellEdit,
4225
- table,
4226
- tables,
4227
- tablesError,
4228
- toggleFacet,
4229
- total,
4230
- viewMode,
4231
- writeError
4232
- } = useDataBrowser({
4233
- initialFilters,
4234
- initialOrderBy,
4235
- initialSearch,
4236
- initialShardKey,
4237
- onSelectTable,
4238
- onViewChange,
4239
- pageSize: initialPageSize,
4240
- tableParam
4241
- });
4242
- const client = useLunora();
4243
- const onFetchShardTables = async (targetShard) => {
4244
- const result = await client.query(LIST_TABLES, {}, callOptions(targetShard));
4245
- return result;
4246
- };
4247
- const onRefreshAfterGenerate = () => {
4248
- if (selectedTable !== null) {
4249
- selectTable(selectedTable);
4250
- }
4251
- };
4252
- const {
4253
- closeDialog: closeGenerateDialog,
4254
- columnMeta,
4255
- fkPools,
4256
- insertBatch,
4257
- open: generateOpen,
4258
- openDialog: openGenerateDialog
4259
- } = useGenerateRows(onRefreshAfterGenerate);
4260
- const onOpenGenerateRows = () => {
4261
- if (selectedTable !== null) {
4262
- openGenerateDialog(selectedTable, shardKey);
4263
- }
4264
- };
4265
- const onInsertGeneratedRows = (rows) => insertBatch(rows, closeGenerateDialog);
4266
- const [inspecting, setInspecting] = useState(null);
4267
- const closeInspect = () => {
4268
- setInspecting(null);
4269
- };
4270
- const [transposed, setTransposed] = useState(false);
4271
- const onToggleTranspose = () => {
4272
- setTransposed((current) => !current);
4273
- };
4274
- const maskPolicies = useMaskPolicies();
4275
- const [maskOn, setMaskOn] = useState(true);
4276
- const onToggleMask = () => {
4277
- setMaskOn((current_0) => !current_0);
4278
- };
4279
- const explicitMaskColumns = maskColumnsForTable(maskPolicies, selectedTable ?? "");
4280
- const maskColumns = mergeSensitiveColumns(explicitMaskColumns, columns);
4281
- const maskView = {
4282
- columns: maskColumns,
4283
- enabled: maskOn
4284
- };
4285
- const [expandedCell, setExpandedCell] = useState(null);
4286
- const onExpandCell = (column, value) => {
4287
- setExpandedCell({
4288
- column,
4289
- value
4290
- });
4291
- };
4292
- const closeExpandedCell = () => {
4293
- setExpandedCell(null);
4294
- };
4295
- const handleNavigateRef = (target, id) => {
4296
- if (onNavigateToGlobal !== void 0 && globalTableNames?.has(target) === true) {
4297
- onNavigateToGlobal(target, id);
4298
- return;
4299
- }
4300
- navigateToRef(target, id);
4301
- };
4302
- const onSaveQuery = queryBar?.onSaveQuery;
4303
- const saveCurrentQuery = (name) => {
4304
- onSaveQuery?.(name, currentView);
4305
- };
4306
- const edit = {
4307
- cancelEdit: cancelCellEdit,
4308
- editable,
4309
- editableColumn,
4310
- editingCell,
4311
- onExpandCell,
4312
- stage,
4313
- stagedValue,
4314
- startEdit: startCellEdit
4315
- };
4316
- const references = {
4317
- columns: page?.refs,
4318
- onNavigate: handleNavigateRef,
4319
- onPreview: previewRef
4320
- };
4321
- return /* @__PURE__ */ jsxDEV("div", {
4322
- className: "flex h-full min-w-0",
4323
- "data-testid": "lunora-data-browser",
4324
- children: [/* @__PURE__ */ jsxDEV(TableListSidebar, {
4325
- header: /* @__PURE__ */ jsxDEV(DataBrowserSidebarHeader, {
4326
- onFetchShardTables,
4327
- onShardChange: setShardKey,
4328
- schemaSwitch,
4329
- shardKey
4330
- }, void 0, false),
4331
- onReload: loadTables,
4332
- onSelect: selectTable,
4333
- prefix: "db",
4334
- selected: selectedTable,
4335
- tables: tables ?? NO_TABLES
4336
- }, void 0, false), /* @__PURE__ */ jsxDEV("div", {
4337
- className: "flex min-w-0 flex-1 flex-col overflow-hidden",
4338
- children: [tablesError !== null && /* @__PURE__ */ jsxDEV("p", {
4339
- className: "shrink-0 border-b border-border px-4 py-2 text-sm text-destructive",
4340
- "data-testid": "db-tables-error",
4341
- role: "alert",
4342
- children: tablesError
4343
- }, void 0, false), page === null && pageError === null && /* @__PURE__ */ jsxDEV("div", {
4344
- className: "flex flex-1 items-center justify-center p-6",
4345
- children: /* @__PURE__ */ jsxDEV("p", {
4346
- className: "text-sm text-muted-foreground",
4347
- children: "Select a table to browse its rows."
4348
- }, void 0, false)
4349
- }, void 0, false), pageError !== null && /* @__PURE__ */ jsxDEV("p", {
4350
- className: "shrink-0 border-b border-border px-4 py-2 text-sm text-destructive",
4351
- "data-testid": "db-page-error",
4352
- role: "alert",
4353
- children: pageError
4354
- }, void 0, false), page !== null && /* @__PURE__ */ jsxDEV("div", {
4355
- className: "flex min-h-0 flex-1 flex-col",
4356
- "data-testid": "db-page",
4357
- children: [/* @__PURE__ */ jsxDEV("div", {
4358
- className: "flex shrink-0 flex-col gap-2 border-b border-border px-4 py-3",
4359
- children: [/* @__PURE__ */ jsxDEV(DataBrowserViewControls, {
4360
- columns,
4361
- editable,
4362
- filter,
4363
- filters,
4364
- hasMaskedColumns: maskColumns.size > 0,
4365
- liveError,
4366
- maskOn,
4367
- onAddRow: addRow,
4368
- onBulkDelete: bulkDelete,
4369
- onClearTable: clearTable,
4370
- onFilterChange,
4371
- onFiltersChange,
4372
- onGenerateRows: onOpenGenerateRows,
4373
- onShowJson: showJson,
4374
- onShowTable: showTable,
4375
- onToggleMask,
4376
- total,
4377
- viewMode
4378
- }, void 0, false), queryBar !== void 0 && /* @__PURE__ */ jsxDEV(DataQueryBar, {
4379
- onApply: queryBar.onApplyQuery,
4380
- onCopyLink: queryBar.onCopyLink,
4381
- onDelete: queryBar.onDeleteQuery,
4382
- onSave: saveCurrentQuery,
4383
- saved: queryBar.saved
4384
- }, void 0, false), viewMode === "table" && page.rows.length > 0 && /* @__PURE__ */ jsxDEV(GridActionsBar, {
4385
- columns: page.columns,
4386
- editable,
4387
- name: selectedTable ?? "export",
4388
- onBulkDelete: onBulkDeleteSelected,
4389
- onToggleTranspose,
4390
- rows: page.rows,
4391
- table: table.table,
4392
- transposed
4393
- }, void 0, false), editable && editing !== null && /* @__PURE__ */ jsxDEV(RowFormEditor, {
4394
- documentText: editing.docText,
4395
- onCancel: cancelEdit,
4396
- onDocumentTextChange: setEditorDocumentText,
4397
- onSave: saveEdit,
4398
- refs: page.refs
4399
- }, void 0, false), editable && stagedChanges.length > 0 && /* @__PURE__ */ jsxDEV(StagedDiffPanel, {
4400
- changes: stagedChanges,
4401
- committing,
4402
- onCommit: onCommitStaged,
4403
- onDiscard: discardStaged
4404
- }, void 0, false), writeError !== null && /* @__PURE__ */ jsxDEV("p", {
4405
- className: "text-sm text-destructive",
4406
- "data-testid": "db-write-error",
4407
- role: "alert",
4408
- children: writeError
4409
- }, void 0, false)]
4410
- }, void 0, true), viewMode === "table" && page.rows.length === 0 && /* @__PURE__ */ jsxDEV("div", {
4411
- className: "flex flex-1 items-center justify-center p-6",
4412
- children: /* @__PURE__ */ jsxDEV(EmptyState, {
4413
- description: "Rows you insert into this table will show up here.",
4414
- icon: /* @__PURE__ */ jsxDEV("svg", {
4415
- "aria-hidden": "true",
4416
- fill: "none",
4417
- stroke: "currentColor",
4418
- strokeLinecap: "round",
4419
- strokeLinejoin: "round",
4420
- strokeWidth: 1.6,
4421
- viewBox: "0 0 24 24",
4422
- children: /* @__PURE__ */ jsxDEV("path", {
4423
- d: "M4 5h16v14H4V5Zm0 5h16M10 10v9M4 14.5h16"
4424
- }, void 0, false)
4425
- }, void 0, false),
4426
- testId: "db-empty-rows",
4427
- title: "This table is empty."
4428
- }, void 0, false)
4429
- }, void 0, false), viewMode === "table" && page.rows.length > 0 && transposed && /* @__PURE__ */ jsxDEV(TransposedTable, {
4430
- columns: page.columns,
4431
- rows: maskRows(page.rows, maskView)
4432
- }, void 0, false), viewMode === "table" && page.rows.length > 0 && !transposed && /* @__PURE__ */ jsxDEV(DataBrowserTableView, {
4433
- edit,
4434
- editable,
4435
- mask: maskView,
4436
- onDelete: onRowDelete,
4437
- onEdit: onRowEdit,
4438
- onInspect: setInspecting,
4439
- refs: references,
4440
- scrollRef: table.scrollRef,
4441
- scrollToIndex: table.scrollToIndex,
4442
- table: table.table,
4443
- tableRows: table.tableRows,
4444
- tbodyStyle: table.tbodyStyle,
4445
- virtualRows: table.virtualRows
4446
- }, void 0, false), viewMode === "json" && /* @__PURE__ */ jsxDEV("pre", {
4447
- className: "min-h-0 flex-1 overflow-auto border-t border-border bg-muted/30 p-3 text-xs",
4448
- "data-testid": "db-json",
4449
- children: JSON.stringify(maskRows(page.rows, maskView), null, 2)
4450
- }, void 0, false), /* @__PURE__ */ jsxDEV("div", {
4451
- className: "flex shrink-0 items-center border-t border-border px-4 py-2",
4452
- children: /* @__PURE__ */ jsxDEV(GridPagination, {
4453
- hasNext,
4454
- hasPrevious,
4455
- onJumpToPage: jumpToPage,
4456
- onNext: goNext,
4457
- onPageSizeChange: changePageSize,
4458
- onPrevious: goPrevious,
4459
- pageSize,
4460
- prefix: "db",
4461
- rangeEnd,
4462
- rangeStart,
4463
- total
4464
- }, void 0, false)
4465
- }, void 0, false)]
4466
- }, void 0, true)]
4467
- }, void 0, true), page !== null && /* @__PURE__ */ jsxDEV(DataFacets, {
4468
- columns,
4469
- facets,
4470
- onFacetFilter: facetFilter,
4471
- onToggleFacet: toggleFacet
4472
- }, void 0, false), inspecting !== null && page !== null && /* @__PURE__ */ jsxDEV(RowDetailDrawer, {
4473
- columns: page.columns,
4474
- onClose: closeInspect,
4475
- onNavigate: handleNavigateRef,
4476
- refs: page.refs,
4477
- row: inspecting
4478
- }, void 0, false), expandedCell !== null && /* @__PURE__ */ jsxDEV(CellDetailDialog, {
4479
- column: expandedCell.column,
4480
- onClose: closeExpandedCell,
4481
- value: expandedCell.value
4482
- }, void 0, false), generateOpen && selectedTable !== null && columnMeta !== void 0 && /* @__PURE__ */ jsxDEV(GenerateRowsDialog, {
4483
- columns: columnMeta,
4484
- fkPools,
4485
- onClose: closeGenerateDialog,
4486
- onInsertRows: onInsertGeneratedRows,
4487
- table: selectedTable
4488
- }, void 0, false)]
4489
- }, void 0, true);
4490
- };
4491
-
4492
- export { DataBrowser };