@lunora/studio 1.0.0-alpha.4 → 1.0.0-alpha.41

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 (187) hide show
  1. package/LICENSE.md +6 -0
  2. package/__assets__/package-og.svg +1 -1
  3. package/dist/index.d.ts +33 -18
  4. package/dist/index.js +29 -29
  5. package/dist/mount.d.ts +1 -1
  6. package/dist/mount.js +3 -2
  7. package/dist/{packem_shared/ApiTab-W3no0KOj.js → packem_chunks/ApiTab.js} +5 -5
  8. package/dist/{packem_shared/AuditPanel-Bq4o_IqT.js → packem_chunks/AuditPanel.js} +29 -41
  9. package/dist/{packem_shared/ExportImportPanel-dxY56TDF.js → packem_chunks/ExportImportPanel.js} +16 -11
  10. package/dist/{packem_shared/FileBrowser-Dhy4zES8.js → packem_chunks/FileBrowser.js} +15 -15
  11. package/dist/{packem_shared/FunctionRunner--fQJRPAD.js → packem_chunks/FunctionRunner.js} +10 -10
  12. package/dist/{packem_shared/FunctionStatsPanel-BjRUA_G3.js → packem_chunks/FunctionStatsPanel.js} +153 -208
  13. package/dist/{packem_shared/HealthPanel-PxclMWmA.js → packem_chunks/HealthPanel.js} +37 -29
  14. package/dist/{packem_shared/InsightsPanel-CWS_C-xW.js → packem_chunks/InsightsPanel.js} +108 -69
  15. package/dist/{packem_shared/LogsPanel-CTW8CFcM.js → packem_chunks/LogsPanel.js} +46 -58
  16. package/dist/{packem_shared/MailPanel-BwkvfIHF.js → packem_chunks/MailPanel.js} +45 -139
  17. package/dist/{packem_shared/MetricsPanel-BLuOhZQ4.js → packem_chunks/MetricsPanel.js} +41 -322
  18. package/dist/{packem_shared/MigrationsPanel-DT3lnwHF.js → packem_chunks/MigrationsPanel.js} +44 -51
  19. package/dist/{packem_shared/PitrPanel-CdErL7EJ.js → packem_chunks/PitrPanel.js} +9 -9
  20. package/dist/{packem_shared/SchemaViewer-LJDcmNIO.js → packem_chunks/SchemaViewer.js} +17 -16
  21. package/dist/{packem_shared/SecurityAdvisorPanel-C_ETsPih.js → packem_chunks/SecurityAdvisorPanel.js} +47 -31
  22. package/dist/packem_chunks/SettingsPanel.js +391 -0
  23. package/dist/{packem_shared/sql-editor-panel-BFRpzj6r.js → packem_chunks/SqlEditorPanel.js} +158 -387
  24. package/dist/{packem_shared/TableEditor-ChfUOZec.js → packem_chunks/TableEditor.js} +10 -68
  25. package/dist/packem_chunks/analytics-panel.js +261 -0
  26. package/dist/packem_chunks/auth-config-panel.js +365 -0
  27. package/dist/packem_chunks/auth-sessions-panel.js +175 -0
  28. package/dist/packem_chunks/containers-panel.js +247 -0
  29. package/dist/packem_chunks/dashboards-panel.js +780 -0
  30. package/dist/packem_chunks/fanout-panel.js +482 -0
  31. package/dist/packem_chunks/flags-panel.js +176 -0
  32. package/dist/packem_chunks/kv-browser.js +1896 -0
  33. package/dist/packem_chunks/log-drains-panel.js +273 -0
  34. package/dist/packem_chunks/organizations-panel.js +3178 -0
  35. package/dist/packem_chunks/payments-panel.js +186 -0
  36. package/dist/packem_chunks/permissions-panel.js +805 -0
  37. package/dist/packem_chunks/queues-panel.js +1075 -0
  38. package/dist/packem_chunks/rls-panel.js +315 -0
  39. package/dist/packem_chunks/schedule-panel.js +831 -0
  40. package/dist/packem_chunks/sparkline.js +79 -0
  41. package/dist/packem_chunks/storage-rules-panel.js +140 -0
  42. package/dist/packem_chunks/subscriptions-panel.js +238 -0
  43. package/dist/packem_chunks/users-panel.js +1731 -0
  44. package/dist/packem_chunks/vector-browser.js +281 -0
  45. package/dist/packem_chunks/workflows-panel.js +562 -0
  46. package/dist/packem_shared/{ADMIN_FUNCTIONS-DmBqMZ-z.js → ADMIN_FUNCTIONS-BHHJi3Gb.js} +7 -0
  47. package/dist/packem_shared/{ApiDocsPanel-C5-yJ1p7.js → ApiDocsPanel-CBma-lnp.js} +2 -2
  48. package/dist/packem_shared/{ApiReferencePanel-1vubqG5s.js → ApiReferencePanel-CQM3pPN7.js} +2 -1
  49. package/dist/packem_shared/{CommandPalette-BtgkBzZI.js → CommandPalette-X2tkbyHk.js} +1 -1
  50. package/dist/packem_shared/{DataBrowser-CtBe1So9.js → DataBrowser-D2ywrdId.js} +198 -247
  51. package/dist/packem_shared/{GlobalDataBrowser-BTEmGrph.js → GlobalDataBrowser-BkTPLzAY.js} +37 -66
  52. package/dist/packem_shared/HomePanel-D1Q9LZgK.js +14 -0
  53. package/dist/packem_shared/{OpenRpcReferencePanel-vbcYbv3V.js → OpenRpcReferencePanel-Dno-hfDb.js} +2 -1
  54. package/dist/packem_shared/{ScheduledJobs-CabfKbyM.js → ScheduledJobs-Ctw4jYtU.js} +163 -60
  55. package/dist/packem_shared/Studio-lJhzDAze.js +16 -0
  56. package/dist/packem_shared/{StudioApp-CHOZA-z-.js → StudioApp-DiMkupvZ.js} +276 -11
  57. package/dist/packem_shared/{advisor-view-CGcfMiPq.js → advisor-view-BX8OhG0w.js} +6 -6
  58. package/dist/packem_shared/alert-CdAET2K_.js +68 -0
  59. package/dist/packem_shared/{app.d-CCmwDEVs.d.ts → app.d-CNLRTrWw.d.ts} +1 -1
  60. package/dist/packem_shared/{bar-chart-CzJAgqkp.js → bar-chart-DSwcWIRy.js} +5 -4
  61. package/dist/packem_shared/browser-storage-BTrX4y3B.js +215 -0
  62. package/dist/packem_shared/{cf-links-2cktDedA.js → cf-links-BZfRdxSE.js} +1 -1
  63. package/dist/packem_shared/{data-grid-B5CaV3wS.js → data-grid-CdXztApG.js} +1 -1
  64. package/dist/packem_shared/data-view-params-Cd6yRVbv.js +96 -0
  65. package/dist/packem_shared/error-alert-CXjqyGw9.js +114 -0
  66. package/dist/packem_shared/{grid-features-CzUfqgsM.js → grid-features-BF-KBDFz.js} +131 -163
  67. package/dist/packem_shared/home-panel-TFcRf9Ui.js +1889 -0
  68. package/dist/packem_shared/{internal-rXJEAhXS.js → internal-CYcbqMjX.js} +44 -3
  69. package/dist/packem_shared/modal-shell-hyaJvIJ6.js +100 -0
  70. package/dist/packem_shared/{reference-view-B4E49Lip.js → reference-view-DUiJcILV.js} +6 -45
  71. package/dist/packem_shared/scroll-area-DLhcy-ml.js +93 -0
  72. package/dist/packem_shared/select-UkNYCT3s.js +273 -0
  73. package/dist/packem_shared/skeleton-CGhL0p20.js +45 -0
  74. package/dist/packem_shared/{sparkline-10dG-_f0.js → sparkline-BnA1kC9X.js} +1 -1
  75. package/dist/packem_shared/studio-Dh9UlaF_.js +4015 -0
  76. package/dist/packem_shared/{table-_RzNvy3R.js → table-DsCa9Qp9.js} +1 -1
  77. package/dist/packem_shared/{table-list-sidebar-Bg7uzbvC.js → table-list-sidebar-UVIXQJdU.js} +1 -1
  78. package/dist/packem_shared/use-admin-query-CfHYWx5n.js +106 -0
  79. package/dist/packem_shared/use-async-submit-DJQiPc-_.js +91 -0
  80. package/dist/standalone/chunk-25AYY4H7.js +2 -0
  81. package/dist/standalone/chunk-2ANAF4ZM.js +1 -0
  82. package/dist/standalone/chunk-2K47A3P6.js +1 -0
  83. package/dist/standalone/chunk-2NGUNNGW.js +1 -0
  84. package/dist/standalone/chunk-3CJW6NWG.js +4 -0
  85. package/dist/standalone/chunk-3OA7PECS.js +6 -0
  86. package/dist/standalone/chunk-3OIHOXVV.js +1 -0
  87. package/dist/standalone/chunk-447TAUFD.js +1 -0
  88. package/dist/standalone/chunk-4QHKBC77.js +1 -0
  89. package/dist/standalone/chunk-5C4TSNE6.js +1 -0
  90. package/dist/standalone/chunk-5OIBXYZM.js +1 -0
  91. package/dist/standalone/chunk-6HSHEMZV.js +76 -0
  92. package/dist/standalone/chunk-6JIZ34MB.js +3 -0
  93. package/dist/standalone/chunk-6VO23MMW.js +4 -0
  94. package/dist/standalone/chunk-7MVSQS7B.js +1 -0
  95. package/dist/standalone/chunk-7TJJXVSE.js +1 -0
  96. package/dist/standalone/chunk-7YXOPTWI.js +1 -0
  97. package/dist/standalone/chunk-AHILM3ZP.js +1 -0
  98. package/dist/standalone/chunk-BGXOXASQ.js +1 -0
  99. package/dist/standalone/chunk-BJGBHGK3.js +1 -0
  100. package/dist/standalone/chunk-BOXSWNXZ.js +1 -0
  101. package/dist/standalone/chunk-BX5MKYOC.js +1 -0
  102. package/dist/standalone/chunk-CKSHCYGC.js +2 -0
  103. package/dist/standalone/chunk-DWDILV2E.js +1 -0
  104. package/dist/standalone/chunk-E75ANNWX.js +19 -0
  105. package/dist/standalone/chunk-EQZQOTJY.js +1 -0
  106. package/dist/standalone/chunk-GTLEWM5Y.js +1 -0
  107. package/dist/standalone/chunk-GTM65MVX.js +1 -0
  108. package/dist/standalone/chunk-GUI5GFFI.js +1 -0
  109. package/dist/standalone/chunk-HN6KJXYQ.js +1 -0
  110. package/dist/standalone/chunk-HV7G6DFP.js +5 -0
  111. package/dist/standalone/chunk-HYDJNCGW.js +1 -0
  112. package/dist/standalone/chunk-HZK5RQHG.js +1 -0
  113. package/dist/standalone/chunk-IN2SYVJB.js +1 -0
  114. package/dist/standalone/chunk-IOANPSJN.js +1 -0
  115. package/dist/standalone/chunk-ISDZPW3V.js +1 -0
  116. package/dist/standalone/chunk-IXDH4GL5.js +1 -0
  117. package/dist/standalone/chunk-J6J54MBP.js +1 -0
  118. package/dist/standalone/chunk-J73VHFCL.js +1 -0
  119. package/dist/standalone/chunk-JHKMUTIF.js +13 -0
  120. package/dist/standalone/chunk-JPRH6DPK.js +1 -0
  121. package/dist/standalone/chunk-JSEXCW5Q.js +1 -0
  122. package/dist/standalone/chunk-KA5YB3VP.js +1 -0
  123. package/dist/standalone/chunk-KBB75WNT.js +1 -0
  124. package/dist/standalone/chunk-KEGAWN6Y.js +1 -0
  125. package/dist/standalone/chunk-KJJ3WM6H.js +4 -0
  126. package/dist/standalone/chunk-KQV4NGH3.js +1 -0
  127. package/dist/standalone/chunk-KSKXW5PX.js +1 -0
  128. package/dist/standalone/chunk-KUH4P5F5.js +1 -0
  129. package/dist/standalone/chunk-KYJPPVGB.js +1 -0
  130. package/dist/standalone/chunk-KZ6INM5M.js +1 -0
  131. package/dist/standalone/chunk-L2TJVSDQ.js +1 -0
  132. package/dist/standalone/chunk-L7SK4ZZD.js +1 -0
  133. package/dist/standalone/chunk-LAK5VSPI.js +1 -0
  134. package/dist/standalone/chunk-LBN7LPVK.js +1 -0
  135. package/dist/standalone/chunk-LNZIB2MD.js +1 -0
  136. package/dist/standalone/chunk-MJWVMKQ4.js +6 -0
  137. package/dist/standalone/chunk-MLZYX5CQ.js +1 -0
  138. package/dist/standalone/chunk-N2X2OO4V.js +1 -0
  139. package/dist/standalone/chunk-NGKITPQP.js +13 -0
  140. package/dist/standalone/chunk-O3NAGRTR.js +1 -0
  141. package/dist/standalone/chunk-OZACQNKG.js +1 -0
  142. package/dist/standalone/chunk-PNDNXS5Z.js +1 -0
  143. package/dist/standalone/chunk-Q7DMUTUE.js +1 -0
  144. package/dist/standalone/chunk-QAFAJBAW.js +1 -0
  145. package/dist/standalone/chunk-QBAT52GB.js +1 -0
  146. package/dist/standalone/chunk-RHZ4M2NZ.js +1 -0
  147. package/dist/standalone/chunk-RRCPZMC2.js +22 -0
  148. package/dist/standalone/chunk-SEU5V7I6.js +1 -0
  149. package/dist/standalone/chunk-TAD43CG5.js +1 -0
  150. package/dist/standalone/chunk-TBMYIZIO.js +1 -0
  151. package/dist/standalone/chunk-TDZ44E5I.js +4 -0
  152. package/dist/standalone/chunk-THNBTMUF.js +1 -0
  153. package/dist/standalone/chunk-TIQISBGK.js +1 -0
  154. package/dist/standalone/chunk-TMYVNQ66.js +1 -0
  155. package/dist/standalone/chunk-TQ36RWOP.js +1 -0
  156. package/dist/standalone/chunk-UGUEC6BC.js +1 -0
  157. package/dist/standalone/chunk-UJB2LEI4.js +4 -0
  158. package/dist/standalone/chunk-UK64ZSUW.js +1 -0
  159. package/dist/standalone/chunk-UKDJ4H7I.js +1 -0
  160. package/dist/standalone/chunk-VLXV72QE.js +1 -0
  161. package/dist/standalone/chunk-VON7JUPG.js +1 -0
  162. package/dist/standalone/chunk-W3JK4YWR.js +1 -0
  163. package/dist/standalone/chunk-W3SHEIAL.js +3 -0
  164. package/dist/standalone/chunk-WI7GWFEG.js +1 -0
  165. package/dist/standalone/chunk-WIHXMNUY.js +1 -0
  166. package/dist/standalone/chunk-WLDVXVI2.js +1 -0
  167. package/dist/standalone/chunk-XLXNLJ4N.js +1 -0
  168. package/dist/standalone/chunk-XNJNSCLM.js +1 -0
  169. package/dist/standalone/chunk-YAECF5LW.js +1 -0
  170. package/dist/standalone/chunk-YBGC4PPD.js +1 -0
  171. package/dist/standalone/chunk-YJAPWSDC.js +4 -0
  172. package/dist/standalone/chunk-ZEJB6DXU.js +8 -0
  173. package/dist/standalone/chunk-ZFNBPAIZ.js +1 -0
  174. package/dist/standalone/chunk-ZHVTQ37P.js +1 -0
  175. package/dist/standalone/chunk-ZIGWVHCS.js +1 -0
  176. package/dist/standalone/chunk-ZPP2KOR4.js +1 -0
  177. package/dist/standalone/chunk-ZPUO7FNI.js +1 -0
  178. package/dist/standalone/studio.js +104 -246
  179. package/dist/styles.css +2 -2
  180. package/package.json +15 -13
  181. package/dist/packem_shared/HomePanel-Cw16stjq.js +0 -1273
  182. package/dist/packem_shared/SettingsPanel-C0uLRf5P.js +0 -176
  183. package/dist/packem_shared/SqlEditorPanel-CguV7otm.js +0 -13
  184. package/dist/packem_shared/Studio-DFWAlcuf.js +0 -33
  185. package/dist/packem_shared/studio-Bj8psK1c.js +0 -10303
  186. package/dist/packem_shared/use-live-admin-Dq6g3daN.js +0 -73
  187. package/dist/packem_shared/use-live-shard-seed-Cuk3dnH0.js +0 -76
@@ -0,0 +1,780 @@
1
+ import { c } from 'react/compiler-runtime';
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ import { u as usePersistedList, S as SqlResultChart, n as newId } from '../packem_shared/browser-storage-BTrX4y3B.js';
4
+ import { A as Alert } from '../packem_shared/alert-CdAET2K_.js';
5
+ import { B as Button } from '../packem_shared/button-BhsN2uZH.js';
6
+ import { c as CardTitle, b as CardHeader, a as CardContent, C as Card } from '../packem_shared/card-DURq3ElK.js';
7
+ import { E as EmptyState } from '../packem_shared/empty-state-DY_oe0k6.js';
8
+ import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
9
+ import { useLunora } from '@lunora/react';
10
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-BHHJi3Gb.js';
11
+ import { c as callOptions, e as errorMessage, f as fireAndForget, a as adminRef } from '../packem_shared/internal-CYcbqMjX.js';
12
+ import { jsxDEV } from 'react/jsx-dev-runtime';
13
+
14
+ const RUN_SQL = adminRef(ADMIN_FUNCTIONS.runSql);
15
+ const useRunSql = (sql, shardKey) => {
16
+ const client = useLunora();
17
+ const [result, setResult] = useState(void 0);
18
+ const [error, setError] = useState(void 0);
19
+ const [loading, setLoading] = useState(true);
20
+ const run = useCallback(async (token) => {
21
+ setLoading(true);
22
+ try {
23
+ const next = await client.query(RUN_SQL, {
24
+ sql
25
+ }, callOptions(shardKey));
26
+ if (!token.cancelled) {
27
+ setResult(next);
28
+ setError(void 0);
29
+ }
30
+ } catch (error_) {
31
+ if (!token.cancelled) {
32
+ setResult(void 0);
33
+ setError(errorMessage(error_));
34
+ }
35
+ } finally {
36
+ if (!token.cancelled) {
37
+ setLoading(false);
38
+ }
39
+ }
40
+ }, [client, sql, shardKey]);
41
+ useEffect(() => {
42
+ const token_0 = {
43
+ cancelled: false
44
+ };
45
+ fireAndForget(run(token_0));
46
+ return () => {
47
+ token_0.cancelled = true;
48
+ };
49
+ }, [run]);
50
+ return {
51
+ error,
52
+ loading,
53
+ result
54
+ };
55
+ };
56
+
57
+ const STORAGE_KEY = "lunora-studio-dashboards";
58
+ const EMPTY_DRAFT = {
59
+ shardKey: "",
60
+ sql: "",
61
+ title: ""
62
+ };
63
+ const WidgetCard = (t0) => {
64
+ const $ = c(54);
65
+ const {
66
+ onEdit,
67
+ onRemove,
68
+ widget
69
+ } = t0;
70
+ const t = useT();
71
+ const {
72
+ error,
73
+ loading,
74
+ result
75
+ } = useRunSql(widget.sql, widget.shardKey ?? "");
76
+ let t1;
77
+ if ($[0] !== onEdit || $[1] !== widget.id) {
78
+ t1 = () => {
79
+ onEdit(widget.id);
80
+ };
81
+ $[0] = onEdit;
82
+ $[1] = widget.id;
83
+ $[2] = t1;
84
+ } else {
85
+ t1 = $[2];
86
+ }
87
+ const onEditClick = t1;
88
+ let t2;
89
+ if ($[3] !== onRemove || $[4] !== widget.id) {
90
+ t2 = () => {
91
+ onRemove(widget.id);
92
+ };
93
+ $[3] = onRemove;
94
+ $[4] = widget.id;
95
+ $[5] = t2;
96
+ } else {
97
+ t2 = $[5];
98
+ }
99
+ const onRemoveClick = t2;
100
+ const t3 = `dashboards-widget-${widget.id}`;
101
+ let t4;
102
+ if ($[6] !== widget.title) {
103
+ t4 = /* @__PURE__ */ jsxDEV(CardTitle, {
104
+ className: "min-w-0 truncate",
105
+ title: widget.title,
106
+ children: widget.title
107
+ }, void 0, false);
108
+ $[6] = widget.title;
109
+ $[7] = t4;
110
+ } else {
111
+ t4 = $[7];
112
+ }
113
+ let t5;
114
+ if ($[8] !== t) {
115
+ t5 = t("Edit widget");
116
+ $[8] = t;
117
+ $[9] = t5;
118
+ } else {
119
+ t5 = $[9];
120
+ }
121
+ const t6 = `dashboards-widget-edit-${widget.id}`;
122
+ let t7;
123
+ if ($[10] !== t) {
124
+ t7 = t("Edit widget");
125
+ $[10] = t;
126
+ $[11] = t7;
127
+ } else {
128
+ t7 = $[11];
129
+ }
130
+ let t8;
131
+ if ($[12] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
132
+ t8 = /* @__PURE__ */ jsxDEV("svg", {
133
+ "aria-hidden": "true",
134
+ fill: "none",
135
+ stroke: "currentColor",
136
+ strokeLinecap: "round",
137
+ strokeLinejoin: "round",
138
+ strokeWidth: 1.6,
139
+ viewBox: "0 0 24 24",
140
+ children: /* @__PURE__ */ jsxDEV("path", {
141
+ d: "M4 20h4L18 10l-4-4L4 16v4ZM14 6l4 4"
142
+ }, void 0, false)
143
+ }, void 0, false);
144
+ $[12] = t8;
145
+ } else {
146
+ t8 = $[12];
147
+ }
148
+ let t9;
149
+ if ($[13] !== onEditClick || $[14] !== t5 || $[15] !== t6 || $[16] !== t7) {
150
+ t9 = /* @__PURE__ */ jsxDEV(Button, {
151
+ "aria-label": t5,
152
+ "data-testid": t6,
153
+ onClick: onEditClick,
154
+ size: "icon-xs",
155
+ title: t7,
156
+ type: "button",
157
+ variant: "ghost",
158
+ children: t8
159
+ }, void 0, false);
160
+ $[13] = onEditClick;
161
+ $[14] = t5;
162
+ $[15] = t6;
163
+ $[16] = t7;
164
+ $[17] = t9;
165
+ } else {
166
+ t9 = $[17];
167
+ }
168
+ let t10;
169
+ if ($[18] !== t) {
170
+ t10 = t("Remove widget");
171
+ $[18] = t;
172
+ $[19] = t10;
173
+ } else {
174
+ t10 = $[19];
175
+ }
176
+ const t11 = `dashboards-widget-remove-${widget.id}`;
177
+ let t12;
178
+ if ($[20] !== t) {
179
+ t12 = t("Remove widget");
180
+ $[20] = t;
181
+ $[21] = t12;
182
+ } else {
183
+ t12 = $[21];
184
+ }
185
+ let t13;
186
+ if ($[22] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
187
+ t13 = /* @__PURE__ */ jsxDEV("svg", {
188
+ "aria-hidden": "true",
189
+ fill: "none",
190
+ stroke: "currentColor",
191
+ strokeLinecap: "round",
192
+ strokeLinejoin: "round",
193
+ strokeWidth: 1.6,
194
+ viewBox: "0 0 24 24",
195
+ children: /* @__PURE__ */ jsxDEV("path", {
196
+ d: "M5 7h14M9 7V5h6v2m-1 0v12H10V7M7 7v13h10V7"
197
+ }, void 0, false)
198
+ }, void 0, false);
199
+ $[22] = t13;
200
+ } else {
201
+ t13 = $[22];
202
+ }
203
+ let t14;
204
+ if ($[23] !== onRemoveClick || $[24] !== t10 || $[25] !== t11 || $[26] !== t12) {
205
+ t14 = /* @__PURE__ */ jsxDEV(Button, {
206
+ "aria-label": t10,
207
+ "data-testid": t11,
208
+ onClick: onRemoveClick,
209
+ size: "icon-xs",
210
+ title: t12,
211
+ type: "button",
212
+ variant: "ghost",
213
+ children: t13
214
+ }, void 0, false);
215
+ $[23] = onRemoveClick;
216
+ $[24] = t10;
217
+ $[25] = t11;
218
+ $[26] = t12;
219
+ $[27] = t14;
220
+ } else {
221
+ t14 = $[27];
222
+ }
223
+ let t15;
224
+ if ($[28] !== t14 || $[29] !== t9) {
225
+ t15 = /* @__PURE__ */ jsxDEV("div", {
226
+ className: "flex shrink-0 items-center gap-1",
227
+ children: [t9, t14]
228
+ }, void 0, true);
229
+ $[28] = t14;
230
+ $[29] = t9;
231
+ $[30] = t15;
232
+ } else {
233
+ t15 = $[30];
234
+ }
235
+ let t16;
236
+ if ($[31] !== t15 || $[32] !== t4) {
237
+ t16 = /* @__PURE__ */ jsxDEV(CardHeader, {
238
+ className: "flex flex-row items-start justify-between gap-2 border-b pb-3",
239
+ children: [t4, t15]
240
+ }, void 0, true);
241
+ $[31] = t15;
242
+ $[32] = t4;
243
+ $[33] = t16;
244
+ } else {
245
+ t16 = $[33];
246
+ }
247
+ let t17;
248
+ if ($[34] !== error || $[35] !== widget.id) {
249
+ t17 = error !== void 0 && /* @__PURE__ */ jsxDEV(Alert, {
250
+ className: "font-mono text-xs",
251
+ testId: `dashboards-widget-error-${widget.id}`,
252
+ variant: "destructive",
253
+ children: error
254
+ }, void 0, false);
255
+ $[34] = error;
256
+ $[35] = widget.id;
257
+ $[36] = t17;
258
+ } else {
259
+ t17 = $[36];
260
+ }
261
+ let t18;
262
+ if ($[37] !== error || $[38] !== loading || $[39] !== result || $[40] !== t || $[41] !== widget.id) {
263
+ t18 = error === void 0 && loading && result === void 0 && /* @__PURE__ */ jsxDEV("p", {
264
+ className: "p-4 text-sm text-muted-foreground",
265
+ "data-testid": `dashboards-widget-loading-${widget.id}`,
266
+ children: t("Running…")
267
+ }, void 0, false);
268
+ $[37] = error;
269
+ $[38] = loading;
270
+ $[39] = result;
271
+ $[40] = t;
272
+ $[41] = widget.id;
273
+ $[42] = t18;
274
+ } else {
275
+ t18 = $[42];
276
+ }
277
+ let t19;
278
+ if ($[43] !== error || $[44] !== result) {
279
+ t19 = error === void 0 && result !== void 0 && /* @__PURE__ */ jsxDEV(SqlResultChart, {
280
+ result
281
+ }, void 0, false);
282
+ $[43] = error;
283
+ $[44] = result;
284
+ $[45] = t19;
285
+ } else {
286
+ t19 = $[45];
287
+ }
288
+ let t20;
289
+ if ($[46] !== t17 || $[47] !== t18 || $[48] !== t19) {
290
+ t20 = /* @__PURE__ */ jsxDEV(CardContent, {
291
+ className: "min-h-32 py-2",
292
+ children: [t17, t18, t19]
293
+ }, void 0, true);
294
+ $[46] = t17;
295
+ $[47] = t18;
296
+ $[48] = t19;
297
+ $[49] = t20;
298
+ } else {
299
+ t20 = $[49];
300
+ }
301
+ let t21;
302
+ if ($[50] !== t16 || $[51] !== t20 || $[52] !== t3) {
303
+ t21 = /* @__PURE__ */ jsxDEV(Card, {
304
+ "data-testid": t3,
305
+ children: [t16, t20]
306
+ }, void 0, true);
307
+ $[50] = t16;
308
+ $[51] = t20;
309
+ $[52] = t3;
310
+ $[53] = t21;
311
+ } else {
312
+ t21 = $[53];
313
+ }
314
+ return t21;
315
+ };
316
+ const WidgetForm = (t0) => {
317
+ const $ = c(58);
318
+ const {
319
+ draft,
320
+ editing,
321
+ onCancel,
322
+ onChange,
323
+ onSubmit
324
+ } = t0;
325
+ const t = useT();
326
+ let t1;
327
+ if ($[0] !== draft || $[1] !== onChange) {
328
+ t1 = (event) => {
329
+ onChange({
330
+ ...draft,
331
+ title: event.target.value
332
+ });
333
+ };
334
+ $[0] = draft;
335
+ $[1] = onChange;
336
+ $[2] = t1;
337
+ } else {
338
+ t1 = $[2];
339
+ }
340
+ const onTitleChange = t1;
341
+ let t2;
342
+ if ($[3] !== draft || $[4] !== onChange) {
343
+ t2 = (event_0) => {
344
+ onChange({
345
+ ...draft,
346
+ sql: event_0.target.value
347
+ });
348
+ };
349
+ $[3] = draft;
350
+ $[4] = onChange;
351
+ $[5] = t2;
352
+ } else {
353
+ t2 = $[5];
354
+ }
355
+ const onSqlChange = t2;
356
+ let t3;
357
+ if ($[6] !== draft || $[7] !== onChange) {
358
+ t3 = (event_1) => {
359
+ onChange({
360
+ ...draft,
361
+ shardKey: event_1.target.value
362
+ });
363
+ };
364
+ $[6] = draft;
365
+ $[7] = onChange;
366
+ $[8] = t3;
367
+ } else {
368
+ t3 = $[8];
369
+ }
370
+ const onShardChange = t3;
371
+ let t4;
372
+ if ($[9] !== onSubmit) {
373
+ t4 = () => {
374
+ onSubmit();
375
+ };
376
+ $[9] = onSubmit;
377
+ $[10] = t4;
378
+ } else {
379
+ t4 = $[10];
380
+ }
381
+ const onSubmitClick = t4;
382
+ let t5;
383
+ if ($[11] !== draft.sql || $[12] !== draft.title) {
384
+ t5 = draft.title.trim() !== "" && draft.sql.trim() !== "";
385
+ $[11] = draft.sql;
386
+ $[12] = draft.title;
387
+ $[13] = t5;
388
+ } else {
389
+ t5 = $[13];
390
+ }
391
+ const canSave = t5;
392
+ let t6;
393
+ if ($[14] !== t) {
394
+ t6 = t("Widget title");
395
+ $[14] = t;
396
+ $[15] = t6;
397
+ } else {
398
+ t6 = $[15];
399
+ }
400
+ let t7;
401
+ if ($[16] !== t) {
402
+ t7 = t("Widget title");
403
+ $[16] = t;
404
+ $[17] = t7;
405
+ } else {
406
+ t7 = $[17];
407
+ }
408
+ let t8;
409
+ if ($[18] !== draft.title || $[19] !== onTitleChange || $[20] !== t6 || $[21] !== t7) {
410
+ t8 = /* @__PURE__ */ jsxDEV("input", {
411
+ "aria-label": t6,
412
+ className: "h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus-visible:border-ring",
413
+ "data-testid": "dashboards-form-title",
414
+ onChange: onTitleChange,
415
+ placeholder: t7,
416
+ type: "text",
417
+ value: draft.title
418
+ }, void 0, false);
419
+ $[18] = draft.title;
420
+ $[19] = onTitleChange;
421
+ $[20] = t6;
422
+ $[21] = t7;
423
+ $[22] = t8;
424
+ } else {
425
+ t8 = $[22];
426
+ }
427
+ let t9;
428
+ if ($[23] !== t) {
429
+ t9 = t("SQL query");
430
+ $[23] = t;
431
+ $[24] = t9;
432
+ } else {
433
+ t9 = $[24];
434
+ }
435
+ let t10;
436
+ if ($[25] !== draft.sql || $[26] !== onSqlChange || $[27] !== t9) {
437
+ t10 = /* @__PURE__ */ jsxDEV("textarea", {
438
+ "aria-label": t9,
439
+ className: "min-h-24 resize-y rounded-md border border-border bg-background p-2 font-mono text-xs leading-5 outline-none focus-visible:border-ring",
440
+ "data-testid": "dashboards-form-sql",
441
+ onChange: onSqlChange,
442
+ placeholder: "SELECT author, COUNT(*) AS messages FROM …",
443
+ spellCheck: false,
444
+ value: draft.sql
445
+ }, void 0, false);
446
+ $[25] = draft.sql;
447
+ $[26] = onSqlChange;
448
+ $[27] = t9;
449
+ $[28] = t10;
450
+ } else {
451
+ t10 = $[28];
452
+ }
453
+ let t11;
454
+ if ($[29] !== t) {
455
+ t11 = t("Shard key (optional)");
456
+ $[29] = t;
457
+ $[30] = t11;
458
+ } else {
459
+ t11 = $[30];
460
+ }
461
+ let t12;
462
+ if ($[31] !== t) {
463
+ t12 = t("Shard key (optional)");
464
+ $[31] = t;
465
+ $[32] = t12;
466
+ } else {
467
+ t12 = $[32];
468
+ }
469
+ let t13;
470
+ if ($[33] !== draft.shardKey || $[34] !== onShardChange || $[35] !== t11 || $[36] !== t12) {
471
+ t13 = /* @__PURE__ */ jsxDEV("input", {
472
+ "aria-label": t11,
473
+ className: "h-8 rounded-md border border-border bg-background px-2 font-mono text-xs outline-none focus-visible:border-ring",
474
+ "data-testid": "dashboards-form-shard",
475
+ onChange: onShardChange,
476
+ placeholder: t12,
477
+ type: "text",
478
+ value: draft.shardKey
479
+ }, void 0, false);
480
+ $[33] = draft.shardKey;
481
+ $[34] = onShardChange;
482
+ $[35] = t11;
483
+ $[36] = t12;
484
+ $[37] = t13;
485
+ } else {
486
+ t13 = $[37];
487
+ }
488
+ let t14;
489
+ if ($[38] !== t) {
490
+ t14 = t("Cancel");
491
+ $[38] = t;
492
+ $[39] = t14;
493
+ } else {
494
+ t14 = $[39];
495
+ }
496
+ let t15;
497
+ if ($[40] !== onCancel || $[41] !== t14) {
498
+ t15 = /* @__PURE__ */ jsxDEV(Button, {
499
+ "data-testid": "dashboards-form-cancel",
500
+ onClick: onCancel,
501
+ size: "sm",
502
+ type: "button",
503
+ variant: "outline",
504
+ children: t14
505
+ }, void 0, false);
506
+ $[40] = onCancel;
507
+ $[41] = t14;
508
+ $[42] = t15;
509
+ } else {
510
+ t15 = $[42];
511
+ }
512
+ const t16 = !canSave;
513
+ let t17;
514
+ if ($[43] !== editing || $[44] !== t) {
515
+ t17 = editing ? t("Save widget") : t("Add widget");
516
+ $[43] = editing;
517
+ $[44] = t;
518
+ $[45] = t17;
519
+ } else {
520
+ t17 = $[45];
521
+ }
522
+ let t18;
523
+ if ($[46] !== onSubmitClick || $[47] !== t16 || $[48] !== t17) {
524
+ t18 = /* @__PURE__ */ jsxDEV(Button, {
525
+ "data-testid": "dashboards-form-save",
526
+ disabled: t16,
527
+ onClick: onSubmitClick,
528
+ size: "sm",
529
+ type: "button",
530
+ children: t17
531
+ }, void 0, false);
532
+ $[46] = onSubmitClick;
533
+ $[47] = t16;
534
+ $[48] = t17;
535
+ $[49] = t18;
536
+ } else {
537
+ t18 = $[49];
538
+ }
539
+ let t19;
540
+ if ($[50] !== t15 || $[51] !== t18) {
541
+ t19 = /* @__PURE__ */ jsxDEV("div", {
542
+ className: "flex items-center justify-end gap-2",
543
+ children: [t15, t18]
544
+ }, void 0, true);
545
+ $[50] = t15;
546
+ $[51] = t18;
547
+ $[52] = t19;
548
+ } else {
549
+ t19 = $[52];
550
+ }
551
+ let t20;
552
+ if ($[53] !== t10 || $[54] !== t13 || $[55] !== t19 || $[56] !== t8) {
553
+ t20 = /* @__PURE__ */ jsxDEV(Card, {
554
+ "data-testid": "dashboards-form",
555
+ children: /* @__PURE__ */ jsxDEV(CardContent, {
556
+ className: "flex flex-col gap-3 py-4",
557
+ children: [t8, t10, t13, t19]
558
+ }, void 0, true)
559
+ }, void 0, false);
560
+ $[53] = t10;
561
+ $[54] = t13;
562
+ $[55] = t19;
563
+ $[56] = t8;
564
+ $[57] = t20;
565
+ } else {
566
+ t20 = $[57];
567
+ }
568
+ return t20;
569
+ };
570
+ const DashboardsPanel = (t0) => {
571
+ const $ = c(39);
572
+ const {
573
+ initialShardKey
574
+ } = t0;
575
+ const t = useT();
576
+ const [widgets, setWidgets] = usePersistedList(STORAGE_KEY);
577
+ const [draft, setDraft] = useState(EMPTY_DRAFT);
578
+ const [editingId, setEditingId] = useState(null);
579
+ const [formOpen, setFormOpen] = useState(false);
580
+ let t1;
581
+ if ($[0] !== initialShardKey) {
582
+ t1 = () => {
583
+ setEditingId(null);
584
+ setDraft({
585
+ ...EMPTY_DRAFT,
586
+ shardKey: initialShardKey ?? ""
587
+ });
588
+ setFormOpen(true);
589
+ };
590
+ $[0] = initialShardKey;
591
+ $[1] = t1;
592
+ } else {
593
+ t1 = $[1];
594
+ }
595
+ const openAdd = t1;
596
+ let t2;
597
+ if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
598
+ t2 = () => {
599
+ setFormOpen(false);
600
+ setEditingId(null);
601
+ setDraft(EMPTY_DRAFT);
602
+ };
603
+ $[2] = t2;
604
+ } else {
605
+ t2 = $[2];
606
+ }
607
+ const closeForm = t2;
608
+ let t3;
609
+ if ($[3] !== widgets) {
610
+ t3 = (id) => {
611
+ const found = widgets.find((widget) => widget.id === id);
612
+ if (found !== void 0) {
613
+ setEditingId(id);
614
+ setDraft({
615
+ shardKey: found.shardKey ?? "",
616
+ sql: found.sql,
617
+ title: found.title
618
+ });
619
+ setFormOpen(true);
620
+ }
621
+ };
622
+ $[3] = widgets;
623
+ $[4] = t3;
624
+ } else {
625
+ t3 = $[4];
626
+ }
627
+ const onEdit = t3;
628
+ let t4;
629
+ if ($[5] !== setWidgets) {
630
+ t4 = (id_0) => {
631
+ setWidgets((current) => current.filter((widget_0) => widget_0.id !== id_0));
632
+ };
633
+ $[5] = setWidgets;
634
+ $[6] = t4;
635
+ } else {
636
+ t4 = $[6];
637
+ }
638
+ const onRemove = t4;
639
+ let t5;
640
+ if ($[7] !== draft.shardKey || $[8] !== draft.sql || $[9] !== draft.title || $[10] !== editingId || $[11] !== setWidgets) {
641
+ t5 = () => {
642
+ const title = draft.title.trim();
643
+ const sql = draft.sql.trim();
644
+ if (title === "" || sql === "") {
645
+ return;
646
+ }
647
+ const shardKey = draft.shardKey.trim();
648
+ if (editingId === null) {
649
+ setWidgets((current_0) => [...current_0, {
650
+ id: newId("w"),
651
+ shardKey,
652
+ sql,
653
+ title
654
+ }]);
655
+ } else {
656
+ setWidgets((current_1) => current_1.map((widget_1) => widget_1.id === editingId ? {
657
+ ...widget_1,
658
+ shardKey,
659
+ sql,
660
+ title
661
+ } : widget_1));
662
+ }
663
+ closeForm();
664
+ };
665
+ $[7] = draft.shardKey;
666
+ $[8] = draft.sql;
667
+ $[9] = draft.title;
668
+ $[10] = editingId;
669
+ $[11] = setWidgets;
670
+ $[12] = t5;
671
+ } else {
672
+ t5 = $[12];
673
+ }
674
+ const onSubmit = t5;
675
+ let t6;
676
+ if ($[13] !== t) {
677
+ t6 = t("Chart widgets backed by saved read-only SQL queries.");
678
+ $[13] = t;
679
+ $[14] = t6;
680
+ } else {
681
+ t6 = $[14];
682
+ }
683
+ let t7;
684
+ if ($[15] !== t6) {
685
+ t7 = /* @__PURE__ */ jsxDEV("p", {
686
+ className: "text-sm text-muted-foreground",
687
+ children: t6
688
+ }, void 0, false);
689
+ $[15] = t6;
690
+ $[16] = t7;
691
+ } else {
692
+ t7 = $[16];
693
+ }
694
+ let t8;
695
+ if ($[17] !== formOpen || $[18] !== openAdd || $[19] !== t) {
696
+ t8 = !formOpen && /* @__PURE__ */ jsxDEV(Button, {
697
+ "data-testid": "dashboards-add",
698
+ onClick: openAdd,
699
+ size: "sm",
700
+ type: "button",
701
+ children: t("Add widget")
702
+ }, void 0, false);
703
+ $[17] = formOpen;
704
+ $[18] = openAdd;
705
+ $[19] = t;
706
+ $[20] = t8;
707
+ } else {
708
+ t8 = $[20];
709
+ }
710
+ let t9;
711
+ if ($[21] !== t7 || $[22] !== t8) {
712
+ t9 = /* @__PURE__ */ jsxDEV("div", {
713
+ className: "flex items-center justify-between",
714
+ children: [t7, t8]
715
+ }, void 0, true);
716
+ $[21] = t7;
717
+ $[22] = t8;
718
+ $[23] = t9;
719
+ } else {
720
+ t9 = $[23];
721
+ }
722
+ let t10;
723
+ if ($[24] !== draft || $[25] !== editingId || $[26] !== formOpen || $[27] !== onSubmit) {
724
+ t10 = formOpen && /* @__PURE__ */ jsxDEV(WidgetForm, {
725
+ draft,
726
+ editing: editingId !== null,
727
+ onCancel: closeForm,
728
+ onChange: setDraft,
729
+ onSubmit
730
+ }, void 0, false);
731
+ $[24] = draft;
732
+ $[25] = editingId;
733
+ $[26] = formOpen;
734
+ $[27] = onSubmit;
735
+ $[28] = t10;
736
+ } else {
737
+ t10 = $[28];
738
+ }
739
+ let t11;
740
+ if ($[29] !== formOpen || $[30] !== onEdit || $[31] !== onRemove || $[32] !== t || $[33] !== widgets) {
741
+ t11 = widgets.length === 0 && !formOpen ? /* @__PURE__ */ jsxDEV(EmptyState, {
742
+ description: t("Add a widget to chart a saved SQL query on this browser."),
743
+ testId: "dashboards-empty",
744
+ title: t("No widgets yet")
745
+ }, void 0, false) : /* @__PURE__ */ jsxDEV("div", {
746
+ className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",
747
+ "data-testid": "dashboards-grid",
748
+ children: widgets.map((widget_2) => /* @__PURE__ */ jsxDEV(WidgetCard, {
749
+ onEdit,
750
+ onRemove,
751
+ widget: widget_2
752
+ }, widget_2.id, false))
753
+ }, void 0, false);
754
+ $[29] = formOpen;
755
+ $[30] = onEdit;
756
+ $[31] = onRemove;
757
+ $[32] = t;
758
+ $[33] = widgets;
759
+ $[34] = t11;
760
+ } else {
761
+ t11 = $[34];
762
+ }
763
+ let t12;
764
+ if ($[35] !== t10 || $[36] !== t11 || $[37] !== t9) {
765
+ t12 = /* @__PURE__ */ jsxDEV("div", {
766
+ className: "flex flex-col gap-4",
767
+ "data-testid": "lunora-dashboards",
768
+ children: [t9, t10, t11]
769
+ }, void 0, true);
770
+ $[35] = t10;
771
+ $[36] = t11;
772
+ $[37] = t9;
773
+ $[38] = t12;
774
+ } else {
775
+ t12 = $[38];
776
+ }
777
+ return t12;
778
+ };
779
+
780
+ export { DashboardsPanel as default };