@lunora/studio 1.0.0-alpha.59 → 1.0.0-alpha.60

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