@lunora/studio 1.0.0-alpha.3 → 1.0.0-alpha.30

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