@lunora/studio 1.0.0-alpha.5 → 1.0.0-alpha.50

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