@burdenoff/microfe-bigconsole 2026.624.2 → 2026.625.1
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.
- package/dist/bigconsole/BigConsoleRoutes.js +93 -93
- package/dist/bigconsole/assistant/assistantApi.js +215 -0
- package/dist/bigconsole/assistant/assistantApi.js.map +1 -0
- package/dist/bigconsole/assistant/createSandboxAssistantTransport.js +119 -0
- package/dist/bigconsole/assistant/createSandboxAssistantTransport.js.map +1 -0
- package/dist/bigconsole/assistant/index.js +2 -0
- package/dist/bigconsole/assistant/pageContext.js +51 -0
- package/dist/bigconsole/assistant/pageContext.js.map +1 -0
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +48 -48
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +52 -52
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ExportDashboardDialog.js +33 -33
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +179 -179
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +38 -38
- package/dist/bigconsole/components/datasink/DataSinkTableViewer.js +32 -32
- package/dist/bigconsole/components/datasink/ExportDataSinkDialog.js +31 -31
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +98 -98
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ExportParserDialog.js +31 -31
- package/dist/bigconsole/components/parser/ImportParserDialog.js +162 -162
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +79 -79
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +307 -307
- package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +222 -222
- package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +1 -1
- package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +23 -23
- package/dist/bigconsole/index.js +3 -0
- package/dist/bigconsole/pages/DashboardBuilderPage.js +74 -74
- package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardViewPage.js +168 -189
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +266 -310
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +148 -194
- package/dist/bigconsole/pages/DataParsersPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +252 -246
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +256 -231
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinksPage.js +173 -219
- package/dist/bigconsole/pages/DataSinksPage.js.map +1 -1
- package/dist/bigconsole/pages/HomePage.js +125 -141
- package/dist/bigconsole/pages/HomePage.js.map +1 -1
- package/dist/bigconsole/pages/InsightsPage.js +159 -184
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserBuilderPage.js +401 -393
- package/dist/bigconsole/pages/ParserBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/ParserViewPage.js +220 -201
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +212 -206
- package/dist/bigconsole/pages/PipelineBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineViewPage.js +204 -181
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +107 -150
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +184 -171
- package/dist/bigconsole/pages/SettingsPage.js.map +1 -1
- package/dist/bigconsole/pages/WidgetDemoPage.js +69 -81
- package/dist/bigconsole/pages/WidgetDemoPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowViewPage.js +230 -216
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +106 -149
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/generated/wspace-operations.js +87 -36
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/index.js +3 -1
- package/package.json +6 -2
|
@@ -5,9 +5,10 @@ import { ArrowRight as r, Blocks as i, FileCode2 as a, GitBranch as o, LayoutDas
|
|
|
5
5
|
import { gql as l } from "@apollo/client";
|
|
6
6
|
import { useQuery as u } from "@apollo/client/react";
|
|
7
7
|
import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
-
import {
|
|
8
|
+
import { AuroraBackground as f, Button as p, GlassCard as m, GradientText as h, IllustratedEmptyState as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
9
10
|
//#region src/bigconsole/pages/HomePage.tsx
|
|
10
|
-
var
|
|
11
|
+
var b = l`
|
|
11
12
|
query HomepageStats {
|
|
12
13
|
listDashboards(first: 0) {
|
|
13
14
|
totalCount
|
|
@@ -22,7 +23,7 @@ var m = l`
|
|
|
22
23
|
id
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
|
-
`,
|
|
26
|
+
`, x = l`
|
|
26
27
|
query RecentDashboards {
|
|
27
28
|
listDashboards(first: 5, sortBy: "updatedAt", sortOrder: "desc") {
|
|
28
29
|
edges {
|
|
@@ -35,83 +36,85 @@ var m = l`
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
|
-
`,
|
|
39
|
-
return /* @__PURE__ */
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
39
|
+
`, S = t(function({ icon: e, label: t, count: n, loading: r, path: i, onNavigate: a, hero: o = !1 }) {
|
|
40
|
+
return /* @__PURE__ */ v(m, {
|
|
41
|
+
treatment: o ? "glass" : "metric",
|
|
42
|
+
glow: o,
|
|
43
|
+
className: "border-border-seam p-0",
|
|
44
|
+
children: /* @__PURE__ */ y("button", {
|
|
45
|
+
type: "button",
|
|
46
|
+
onClick: () => a(i),
|
|
47
|
+
className: "flex w-full flex-col gap-2 rounded-card p-[var(--space-cardPadding)] text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
|
|
48
|
+
children: [/* @__PURE__ */ y("div", {
|
|
49
|
+
className: "flex items-center gap-2",
|
|
50
|
+
children: [/* @__PURE__ */ v("div", {
|
|
51
|
+
style: { color: "var(--color-action-primary-bg)" },
|
|
52
|
+
children: e
|
|
53
|
+
}), /* @__PURE__ */ v("span", {
|
|
54
|
+
style: {
|
|
55
|
+
fontSize: "var(--font-size-body-sm)",
|
|
56
|
+
color: "var(--color-text-secondary)"
|
|
57
|
+
},
|
|
58
|
+
children: t
|
|
59
|
+
})]
|
|
60
|
+
}), /* @__PURE__ */ v("div", {
|
|
61
|
+
className: "tabular-nums",
|
|
61
62
|
style: {
|
|
62
|
-
fontSize: "var(--font-size-
|
|
63
|
-
|
|
63
|
+
fontSize: "var(--font-size-heading-h4)",
|
|
64
|
+
fontWeight: "var(--font-weight-bold)",
|
|
65
|
+
color: "var(--color-text-primary)"
|
|
64
66
|
},
|
|
65
|
-
children:
|
|
67
|
+
children: r ? /* @__PURE__ */ v(c, {
|
|
68
|
+
size: 20,
|
|
69
|
+
className: "animate-spin"
|
|
70
|
+
}) : n ?? 0
|
|
66
71
|
})]
|
|
67
|
-
})
|
|
68
|
-
style: {
|
|
69
|
-
fontSize: "var(--font-size-heading-h4)",
|
|
70
|
-
fontWeight: "var(--font-weight-bold)",
|
|
71
|
-
color: "var(--color-text-primary)"
|
|
72
|
-
},
|
|
73
|
-
children: r ? /* @__PURE__ */ f(c, {
|
|
74
|
-
size: 20,
|
|
75
|
-
className: "animate-spin"
|
|
76
|
-
}) : n ?? 0
|
|
77
|
-
})]
|
|
72
|
+
})
|
|
78
73
|
});
|
|
79
|
-
}),
|
|
80
|
-
let t = e(), { t: l } = d(),
|
|
74
|
+
}), C = t(function() {
|
|
75
|
+
let t = e(), { t: l } = d(), C = n((e, t) => {
|
|
81
76
|
let n = l(e);
|
|
82
77
|
return n === e ? t : n;
|
|
83
|
-
}, [l]), { data:
|
|
84
|
-
return /* @__PURE__ */
|
|
78
|
+
}, [l]), { data: w, loading: T } = u(b, { fetchPolicy: "cache-and-network" }), { data: E, loading: D } = u(x, { fetchPolicy: "cache-and-network" }), O = E?.listDashboards?.edges?.map((e) => e.node) || [];
|
|
79
|
+
return /* @__PURE__ */ v("div", {
|
|
85
80
|
style: {
|
|
86
81
|
minHeight: "100vh",
|
|
87
82
|
backgroundColor: "var(--color-bg-canvas)"
|
|
88
83
|
},
|
|
89
|
-
children: /* @__PURE__ */
|
|
84
|
+
children: /* @__PURE__ */ y("div", {
|
|
90
85
|
style: {
|
|
91
86
|
padding: "var(--space-pagePadding)",
|
|
92
87
|
maxWidth: 960,
|
|
93
88
|
margin: "0 auto"
|
|
94
89
|
},
|
|
95
90
|
children: [
|
|
96
|
-
/* @__PURE__ */
|
|
97
|
-
|
|
98
|
-
children: [
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
91
|
+
/* @__PURE__ */ y("div", {
|
|
92
|
+
className: "relative mb-[var(--space-sectionGap)] overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ v(f, { intensity: "subtle" }),
|
|
95
|
+
/* @__PURE__ */ v("h1", {
|
|
96
|
+
style: {
|
|
97
|
+
fontSize: "var(--font-size-heading-h4)",
|
|
98
|
+
fontWeight: "var(--font-weight-bold)",
|
|
99
|
+
color: "var(--color-text-primary)"
|
|
100
|
+
},
|
|
101
|
+
children: /* @__PURE__ */ v(h, { children: "BigConsole" })
|
|
102
|
+
}),
|
|
103
|
+
/* @__PURE__ */ v("p", {
|
|
104
|
+
style: {
|
|
105
|
+
fontSize: "var(--font-size-body-md)",
|
|
106
|
+
color: "var(--color-text-secondary)",
|
|
107
|
+
marginTop: 4
|
|
108
|
+
},
|
|
109
|
+
children: C("bigconsole.home.subtitle", "AI-powered analytics platform")
|
|
110
|
+
})
|
|
111
|
+
]
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ v(_, {
|
|
114
|
+
className: "mb-[var(--space-sectionGap)]",
|
|
115
|
+
children: C("bigconsole.home.purpose", "BigConsole is your analytics command center — build live dashboards, wire up data sinks and parsers, then automate it all with pipelines and workflows. Start from the quick actions below or jump back into a recent dashboard.")
|
|
113
116
|
}),
|
|
114
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ y("div", {
|
|
115
118
|
style: {
|
|
116
119
|
display: "grid",
|
|
117
120
|
gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))",
|
|
@@ -119,51 +122,52 @@ var m = l`
|
|
|
119
122
|
marginBottom: "var(--space-sectionGap)"
|
|
120
123
|
},
|
|
121
124
|
children: [
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
/* @__PURE__ */ v(S, {
|
|
126
|
+
hero: !0,
|
|
127
|
+
icon: /* @__PURE__ */ v(s, { size: 20 }),
|
|
128
|
+
label: C("bigconsole.home.stats.dashboards", "Dashboards"),
|
|
129
|
+
count: w?.listDashboards?.totalCount,
|
|
130
|
+
loading: T,
|
|
127
131
|
path: "/dashboards",
|
|
128
132
|
onNavigate: t
|
|
129
133
|
}),
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
icon: /* @__PURE__ */
|
|
132
|
-
label:
|
|
133
|
-
count:
|
|
134
|
-
loading:
|
|
134
|
+
/* @__PURE__ */ v(S, {
|
|
135
|
+
icon: /* @__PURE__ */ v(i, { size: 20 }),
|
|
136
|
+
label: C("bigconsole.home.stats.dataSinks", "Data Sinks"),
|
|
137
|
+
count: w?.listDataSinks?.totalCount,
|
|
138
|
+
loading: T,
|
|
135
139
|
path: "/datasinks",
|
|
136
140
|
onNavigate: t
|
|
137
141
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
icon: /* @__PURE__ */
|
|
140
|
-
label:
|
|
141
|
-
count:
|
|
142
|
-
loading:
|
|
142
|
+
/* @__PURE__ */ v(S, {
|
|
143
|
+
icon: /* @__PURE__ */ v(a, { size: 20 }),
|
|
144
|
+
label: C("bigconsole.home.stats.parsers", "Parsers"),
|
|
145
|
+
count: w?.listParsers?.length,
|
|
146
|
+
loading: T,
|
|
143
147
|
path: "/parsers",
|
|
144
148
|
onNavigate: t
|
|
145
149
|
}),
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
icon: /* @__PURE__ */
|
|
148
|
-
label:
|
|
149
|
-
count:
|
|
150
|
-
loading:
|
|
150
|
+
/* @__PURE__ */ v(S, {
|
|
151
|
+
icon: /* @__PURE__ */ v(o, { size: 20 }),
|
|
152
|
+
label: C("bigconsole.home.stats.pipelines", "Pipelines"),
|
|
153
|
+
count: w?.listPipelines?.length,
|
|
154
|
+
loading: T,
|
|
151
155
|
path: "/pipelines",
|
|
152
156
|
onNavigate: t
|
|
153
157
|
})
|
|
154
158
|
]
|
|
155
159
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ y("div", {
|
|
157
161
|
style: { marginBottom: "var(--space-sectionGap)" },
|
|
158
|
-
children: [/* @__PURE__ */
|
|
162
|
+
children: [/* @__PURE__ */ v("h2", {
|
|
159
163
|
style: {
|
|
160
164
|
fontSize: "var(--font-size-body-md)",
|
|
161
165
|
fontWeight: "var(--font-weight-semibold)",
|
|
162
166
|
color: "var(--color-text-primary)",
|
|
163
167
|
marginBottom: 12
|
|
164
168
|
},
|
|
165
|
-
children:
|
|
166
|
-
}), /* @__PURE__ */
|
|
169
|
+
children: C("bigconsole.home.quickActions.title", "Quick Actions")
|
|
170
|
+
}), /* @__PURE__ */ v("div", {
|
|
167
171
|
style: {
|
|
168
172
|
display: "flex",
|
|
169
173
|
gap: 12,
|
|
@@ -171,26 +175,26 @@ var m = l`
|
|
|
171
175
|
},
|
|
172
176
|
children: [
|
|
173
177
|
{
|
|
174
|
-
label:
|
|
178
|
+
label: C("bigconsole.home.quickActions.newDashboard", "New Dashboard"),
|
|
175
179
|
path: "/dashboards",
|
|
176
|
-
icon: /* @__PURE__ */
|
|
180
|
+
icon: /* @__PURE__ */ v(s, { size: 14 })
|
|
177
181
|
},
|
|
178
182
|
{
|
|
179
|
-
label:
|
|
183
|
+
label: C("bigconsole.home.quickActions.newDataSink", "New Data Sink"),
|
|
180
184
|
path: "/datasinks/new",
|
|
181
|
-
icon: /* @__PURE__ */
|
|
185
|
+
icon: /* @__PURE__ */ v(i, { size: 14 })
|
|
182
186
|
},
|
|
183
187
|
{
|
|
184
|
-
label:
|
|
188
|
+
label: C("bigconsole.home.quickActions.newParser", "New Parser"),
|
|
185
189
|
path: "/parsers/new",
|
|
186
|
-
icon: /* @__PURE__ */
|
|
190
|
+
icon: /* @__PURE__ */ v(a, { size: 14 })
|
|
187
191
|
},
|
|
188
192
|
{
|
|
189
|
-
label:
|
|
193
|
+
label: C("bigconsole.home.quickActions.newPipeline", "New Pipeline"),
|
|
190
194
|
path: "/pipelines/new",
|
|
191
|
-
icon: /* @__PURE__ */
|
|
195
|
+
icon: /* @__PURE__ */ v(o, { size: 14 })
|
|
192
196
|
}
|
|
193
|
-
].map((e) => /* @__PURE__ */
|
|
197
|
+
].map((e) => /* @__PURE__ */ y("button", {
|
|
194
198
|
onClick: () => t(e.path),
|
|
195
199
|
style: {
|
|
196
200
|
display: "flex",
|
|
@@ -212,21 +216,21 @@ var m = l`
|
|
|
212
216
|
}, e.path))
|
|
213
217
|
})]
|
|
214
218
|
}),
|
|
215
|
-
/* @__PURE__ */
|
|
219
|
+
/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ y("div", {
|
|
216
220
|
style: {
|
|
217
221
|
display: "flex",
|
|
218
222
|
justifyContent: "space-between",
|
|
219
223
|
alignItems: "center",
|
|
220
224
|
marginBottom: 12
|
|
221
225
|
},
|
|
222
|
-
children: [/* @__PURE__ */
|
|
226
|
+
children: [/* @__PURE__ */ v("h2", {
|
|
223
227
|
style: {
|
|
224
228
|
fontSize: "var(--font-size-body-md)",
|
|
225
229
|
fontWeight: "var(--font-weight-semibold)",
|
|
226
230
|
color: "var(--color-text-primary)"
|
|
227
231
|
},
|
|
228
|
-
children:
|
|
229
|
-
}), /* @__PURE__ */
|
|
232
|
+
children: C("bigconsole.home.recentDashboards.title", "Recent Dashboards")
|
|
233
|
+
}), /* @__PURE__ */ y("button", {
|
|
230
234
|
onClick: () => t("/dashboards"),
|
|
231
235
|
style: {
|
|
232
236
|
display: "flex",
|
|
@@ -241,61 +245,41 @@ var m = l`
|
|
|
241
245
|
cursor: "pointer"
|
|
242
246
|
},
|
|
243
247
|
children: [
|
|
244
|
-
|
|
248
|
+
C("bigconsole.home.recentDashboards.viewAll", "View all"),
|
|
245
249
|
" ",
|
|
246
|
-
/* @__PURE__ */
|
|
250
|
+
/* @__PURE__ */ v(r, { size: 14 })
|
|
247
251
|
]
|
|
248
252
|
})]
|
|
249
|
-
}),
|
|
253
|
+
}), D ? /* @__PURE__ */ v("div", {
|
|
250
254
|
style: {
|
|
251
255
|
textAlign: "center",
|
|
252
256
|
padding: 24,
|
|
253
257
|
color: "var(--color-text-muted)"
|
|
254
258
|
},
|
|
255
|
-
children: /* @__PURE__ */
|
|
259
|
+
children: /* @__PURE__ */ v(c, {
|
|
256
260
|
size: 20,
|
|
257
261
|
className: "animate-spin",
|
|
258
262
|
style: { margin: "0 auto" }
|
|
259
263
|
})
|
|
260
|
-
}) :
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
size: 32,
|
|
271
|
-
style: {
|
|
272
|
-
color: "var(--color-text-muted)",
|
|
273
|
-
margin: "0 auto 8px"
|
|
274
|
-
}
|
|
275
|
-
}),
|
|
276
|
-
/* @__PURE__ */ f("p", {
|
|
277
|
-
style: {
|
|
278
|
-
color: "var(--color-text-secondary)",
|
|
279
|
-
fontWeight: "var(--font-weight-medium)"
|
|
280
|
-
},
|
|
281
|
-
children: _("bigconsole.home.recentDashboards.emptyTitle", "No dashboards yet")
|
|
282
|
-
}),
|
|
283
|
-
/* @__PURE__ */ f("p", {
|
|
284
|
-
style: {
|
|
285
|
-
color: "var(--color-text-muted)",
|
|
286
|
-
fontSize: "var(--font-size-body-sm)",
|
|
287
|
-
marginTop: 4
|
|
288
|
-
},
|
|
289
|
-
children: _("bigconsole.home.recentDashboards.emptyDescription", "Create your first dashboard to get started")
|
|
264
|
+
}) : O.length === 0 ? /* @__PURE__ */ v(m, {
|
|
265
|
+
treatment: "insight",
|
|
266
|
+
className: "border-border-seam",
|
|
267
|
+
children: /* @__PURE__ */ v(g, {
|
|
268
|
+
illustration: "empty-data",
|
|
269
|
+
title: C("bigconsole.home.recentDashboards.emptyTitle", "No dashboards yet"),
|
|
270
|
+
description: C("bigconsole.home.recentDashboards.emptyDescription", "Create your first dashboard to get started"),
|
|
271
|
+
action: /* @__PURE__ */ v(p, {
|
|
272
|
+
onClick: () => t("/dashboards"),
|
|
273
|
+
children: C("bigconsole.home.quickActions.newDashboard", "New Dashboard")
|
|
290
274
|
})
|
|
291
|
-
|
|
292
|
-
}) : /* @__PURE__ */
|
|
275
|
+
})
|
|
276
|
+
}) : /* @__PURE__ */ v("div", {
|
|
293
277
|
style: {
|
|
294
278
|
display: "flex",
|
|
295
279
|
flexDirection: "column",
|
|
296
280
|
gap: 8
|
|
297
281
|
},
|
|
298
|
-
children:
|
|
282
|
+
children: O.map((e) => /* @__PURE__ */ y("button", {
|
|
299
283
|
onClick: () => t(`/dashboards/${e.id}`),
|
|
300
284
|
style: {
|
|
301
285
|
textAlign: "left",
|
|
@@ -308,21 +292,21 @@ var m = l`
|
|
|
308
292
|
justifyContent: "space-between",
|
|
309
293
|
alignItems: "center"
|
|
310
294
|
},
|
|
311
|
-
children: [/* @__PURE__ */
|
|
295
|
+
children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
312
296
|
style: {
|
|
313
297
|
fontWeight: "var(--font-weight-medium)",
|
|
314
298
|
fontSize: "var(--font-size-body-sm)",
|
|
315
299
|
color: "var(--color-text-primary)"
|
|
316
300
|
},
|
|
317
301
|
children: e.name
|
|
318
|
-
}), e.description && /* @__PURE__ */
|
|
302
|
+
}), e.description && /* @__PURE__ */ v("div", {
|
|
319
303
|
style: {
|
|
320
304
|
fontSize: 11,
|
|
321
305
|
color: "var(--color-text-muted)",
|
|
322
306
|
marginTop: 2
|
|
323
307
|
},
|
|
324
308
|
children: e.description.slice(0, 80)
|
|
325
|
-
})] }), /* @__PURE__ */
|
|
309
|
+
})] }), /* @__PURE__ */ v(r, {
|
|
326
310
|
size: 14,
|
|
327
311
|
style: { color: "var(--color-text-muted)" }
|
|
328
312
|
})]
|
|
@@ -333,6 +317,6 @@ var m = l`
|
|
|
333
317
|
});
|
|
334
318
|
});
|
|
335
319
|
//#endregion
|
|
336
|
-
export {
|
|
320
|
+
export { C as default };
|
|
337
321
|
|
|
338
322
|
//# sourceMappingURL=HomePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/bigconsole/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage\n *\n * BigConsole landing page showing workspace statistics and quick actions.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useAppNavigate } from '../contexts';\nimport { LayoutDashboard, Blocks, FileCode2, GitBranch, ArrowRight, Loader2 } from 'lucide-react';\n\n// ============================================================================\n// GRAPHQL RESPONSE TYPES\n// ============================================================================\n\ninterface HomepageStatsData {\n listDashboards: { totalCount: number };\n listDataSinks: { totalCount: number };\n // TODO: listParsers and listPipelines don't support totalCount pagination yet;\n // using array length as a fallback until the schema is updated.\n listParsers: Array<{ id: string }>;\n listPipelines: Array<{ id: string }>;\n}\n\ninterface RecentDashboardNode {\n id: string;\n name: string;\n description?: string;\n updatedAt: string;\n}\n\ninterface RecentDashboardsData {\n listDashboards: {\n edges: Array<{ node: RecentDashboardNode }>;\n };\n}\n\nconst HOMEPAGE_STATS = gql`\n query HomepageStats {\n listDashboards(first: 0) {\n totalCount\n }\n listDataSinks(first: 0) {\n totalCount\n }\n listParsers {\n id\n }\n listPipelines {\n id\n }\n }\n`;\n\nconst RECENT_DASHBOARDS = gql`\n query RecentDashboards {\n listDashboards(first: 5, sortBy: \"updatedAt\", sortOrder: \"desc\") {\n edges {\n node {\n id\n name\n description\n updatedAt\n }\n }\n }\n }\n`;\n\ninterface StatCardProps {\n icon: React.ReactNode;\n label: string;\n count: number | undefined;\n loading: boolean;\n path: string;\n onNavigate: (path: string) => void;\n}\n\nconst StatCard: FC<StatCardProps> = memo(function StatCard({ icon, label, count, loading, path, onNavigate }) {\n return (\n <button\n onClick={() => onNavigate(path)}\n style={{\n textAlign: 'left',\n padding: 'var(--space-cardPadding)',\n backgroundColor: 'var(--color-bg-surface)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-card)',\n cursor: 'pointer',\n transition: 'border-color 200ms',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>\n <div style={{ color: 'var(--color-action-primary-bg)' }}>{icon}</div>\n <span style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)' }}>{label}</span>\n </div>\n <div\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {loading ? <Loader2 size={20} className=\"animate-spin\" /> : (count ?? 0)}\n </div>\n </button>\n );\n});\n\nexport const HomePage: FC = memo(function HomePage() {\n const navigate = useAppNavigate();\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n },\n [t]\n );\n const { data: stats, loading: statsLoading } = useQuery<HomepageStatsData>(HOMEPAGE_STATS, {\n fetchPolicy: 'cache-and-network',\n });\n const { data: recentData, loading: recentLoading } = useQuery<RecentDashboardsData>(RECENT_DASHBOARDS, {\n fetchPolicy: 'cache-and-network',\n });\n\n const recentDashboards = recentData?.listDashboards?.edges?.map((e) => e.node) || [];\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n <div style={{ padding: 'var(--space-pagePadding)', maxWidth: 960, margin: '0 auto' }}>\n {/* Header */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n BigConsole\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-md)', color: 'var(--color-text-secondary)', marginTop: 4 }}>\n {tr('bigconsole.home.subtitle', 'AI-powered analytics platform')}\n </p>\n </div>\n\n {/* Stats Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: 12,\n marginBottom: 'var(--space-sectionGap)',\n }}\n >\n <StatCard\n icon={<LayoutDashboard size={20} />}\n label={tr('bigconsole.home.stats.dashboards', 'Dashboards')}\n count={stats?.listDashboards?.totalCount}\n loading={statsLoading}\n path=\"/dashboards\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<Blocks size={20} />}\n label={tr('bigconsole.home.stats.dataSinks', 'Data Sinks')}\n count={stats?.listDataSinks?.totalCount}\n loading={statsLoading}\n path=\"/datasinks\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<FileCode2 size={20} />}\n label={tr('bigconsole.home.stats.parsers', 'Parsers')}\n count={stats?.listParsers?.length}\n loading={statsLoading}\n path=\"/parsers\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<GitBranch size={20} />}\n label={tr('bigconsole.home.stats.pipelines', 'Pipelines')}\n count={stats?.listPipelines?.length}\n loading={statsLoading}\n path=\"/pipelines\"\n onNavigate={navigate}\n />\n </div>\n\n {/* Quick Actions */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n marginBottom: 12,\n }}\n >\n {tr('bigconsole.home.quickActions.title', 'Quick Actions')}\n </h2>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {[\n {\n label: tr('bigconsole.home.quickActions.newDashboard', 'New Dashboard'),\n path: '/dashboards',\n icon: <LayoutDashboard size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newDataSink', 'New Data Sink'),\n path: '/datasinks/new',\n icon: <Blocks size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newParser', 'New Parser'),\n path: '/parsers/new',\n icon: <FileCode2 size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newPipeline', 'New Pipeline'),\n path: '/pipelines/new',\n icon: <GitBranch size={14} />,\n },\n ].map((action) => (\n <button\n key={action.path}\n onClick={() => navigate(action.path)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {action.icon} {action.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Recent Dashboards */}\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {tr('bigconsole.home.recentDashboards.title', 'Recent Dashboards')}\n </h2>\n <button\n onClick={() => navigate('/dashboards')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--color-action-primary-bg)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {tr('bigconsole.home.recentDashboards.viewAll', 'View all')} <ArrowRight size={14} />\n </button>\n </div>\n\n {recentLoading ? (\n <div style={{ textAlign: 'center', padding: 24, color: 'var(--color-text-muted)' }}>\n <Loader2 size={20} className=\"animate-spin\" style={{ margin: '0 auto' }} />\n </div>\n ) : recentDashboards.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: 32,\n backgroundColor: 'var(--color-bg-surface)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-card)',\n }}\n >\n <LayoutDashboard size={32} style={{ color: 'var(--color-text-muted)', margin: '0 auto 8px' }} />\n <p style={{ color: 'var(--color-text-secondary)', fontWeight: 'var(--font-weight-medium)' }}>\n {tr('bigconsole.home.recentDashboards.emptyTitle', 'No dashboards yet')}\n </p>\n <p style={{ color: 'var(--color-text-muted)', fontSize: 'var(--font-size-body-sm)', marginTop: 4 }}>\n {tr('bigconsole.home.recentDashboards.emptyDescription', 'Create your first dashboard to get started')}\n </p>\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {recentDashboards.map((d) => (\n <button\n key={d.id}\n onClick={() => navigate(`/dashboards/${d.id}`)}\n style={{\n textAlign: 'left',\n padding: 12,\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n cursor: 'pointer',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div>\n <div\n style={{\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-primary)',\n }}\n >\n {d.name}\n </div>\n {d.description && (\n <div style={{ fontSize: 11, color: 'var(--color-text-muted)', marginTop: 2 }}>\n {d.description.slice(0, 80)}\n </div>\n )}\n </div>\n <ArrowRight size={14} style={{ color: 'var(--color-text-muted)' }} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nexport default HomePage;\n"],"mappings":";;;;;;;;;AAuCA,IAAM,IAAiB,CAAG;;;;;;;;;;;;;;;GAiBpB,IAAoB,CAAG;;;;;;;;;;;;;GAwBvB,IAA8B,EAAK,SAAkB,EAAE,SAAM,UAAO,UAAO,YAAS,SAAM,iBAAc;AAC5G,QACE,kBAAC,UAAD;EACE,eAAe,EAAW,EAAK;EAC/B,OAAO;GACL,WAAW;GACX,SAAS;GACT,iBAAiB;GACjB,QAAQ;GACR,cAAc;GACd,QAAQ;GACR,YAAY;GACb;YAVH,CAYE,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAG,cAAc;IAAG;aAA9E,CACE,kBAAC,OAAD;IAAK,OAAO,EAAE,OAAO,kCAAkC;cAAG;IAAW,CAAA,EACrE,kBAAC,QAAD;IAAM,OAAO;KAAE,UAAU;KAA4B,OAAO;KAA+B;cAAG;IAAa,CAAA,CACvG;MACN,kBAAC,OAAD;GACE,OAAO;IACL,UAAU;IACV,YAAY;IACZ,OAAO;IACR;aAEA,IAAU,kBAAC,GAAD;IAAS,MAAM;IAAI,WAAU;IAAiB,CAAA,GAAI,KAAS;GAClE,CAAA,CACC;;EAEX,EAEW,IAAe,EAAK,WAAoB;CACnD,IAAM,IAAW,GAAgB,EAC3B,EAAE,SAAM,GAAS,EACjB,IAAK,GACR,GAAa,MAAqB;EACjC,IAAM,IAAa,EAAE,EAAI;AACzB,SAAO,MAAe,IAAM,IAAW;IAEzC,CAAC,EAAE,CACJ,EACK,EAAE,MAAM,GAAO,SAAS,MAAiB,EAA4B,GAAgB,EACzF,aAAa,qBACd,CAAC,EACI,EAAE,MAAM,GAAY,SAAS,MAAkB,EAA+B,GAAmB,EACrG,aAAa,qBACd,CAAC,EAEI,IAAmB,GAAY,gBAAgB,OAAO,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE;AAEpF,QACE,kBAAC,OAAD;EAAK,OAAO;GAAE,WAAW;GAAS,iBAAiB;GAA0B;YAC3E,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAA4B,UAAU;IAAK,QAAQ;IAAU;aAApF;IAEE,kBAAC,OAAD;KAAK,OAAO,EAAE,cAAc,2BAA2B;eAAvD,CACE,kBAAC,MAAD;MACE,OAAO;OACL,UAAU;OACV,YAAY;OACZ,OAAO;OACR;gBACF;MAEI,CAAA,EACL,kBAAC,KAAD;MAAG,OAAO;OAAE,UAAU;OAA4B,OAAO;OAA+B,WAAW;OAAG;gBACnG,EAAG,4BAA4B,gCAAgC;MAC9D,CAAA,CACA;;IAGN,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,qBAAqB;MACrB,KAAK;MACL,cAAc;MACf;eANH;MAQE,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAiB,MAAM,IAAM,CAAA;OACnC,OAAO,EAAG,oCAAoC,aAAa;OAC3D,OAAO,GAAO,gBAAgB;OAC9B,SAAS;OACT,MAAK;OACL,YAAY;OACZ,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;OAC1B,OAAO,EAAG,mCAAmC,aAAa;OAC1D,OAAO,GAAO,eAAe;OAC7B,SAAS;OACT,MAAK;OACL,YAAY;OACZ,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;OAC7B,OAAO,EAAG,iCAAiC,UAAU;OACrD,OAAO,GAAO,aAAa;OAC3B,SAAS;OACT,MAAK;OACL,YAAY;OACZ,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;OAC7B,OAAO,EAAG,mCAAmC,YAAY;OACzD,OAAO,GAAO,eAAe;OAC7B,SAAS;OACT,MAAK;OACL,YAAY;OACZ,CAAA;MACE;;IAGN,kBAAC,OAAD;KAAK,OAAO,EAAE,cAAc,2BAA2B;eAAvD,CACE,kBAAC,MAAD;MACE,OAAO;OACL,UAAU;OACV,YAAY;OACZ,OAAO;OACP,cAAc;OACf;gBAEA,EAAG,sCAAsC,gBAAgB;MACvD,CAAA,EACL,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,KAAK;OAAI,UAAU;OAAQ;gBACvD;OACC;QACE,OAAO,EAAG,6CAA6C,gBAAgB;QACvE,MAAM;QACN,MAAM,kBAAC,GAAD,EAAiB,MAAM,IAAM,CAAA;QACpC;OACD;QACE,OAAO,EAAG,4CAA4C,gBAAgB;QACtE,MAAM;QACN,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;QAC3B;OACD;QACE,OAAO,EAAG,0CAA0C,aAAa;QACjE,MAAM;QACN,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;QAC9B;OACD;QACE,OAAO,EAAG,4CAA4C,eAAe;QACrE,MAAM;QACN,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;QAC9B;OACF,CAAC,KAAK,MACL,kBAAC,UAAD;OAEE,eAAe,EAAS,EAAO,KAAK;OACpC,OAAO;QACL,SAAS;QACT,YAAY;QACZ,KAAK;QACL,SAAS;QACT,cAAc;QACd,QAAQ;QACR,iBAAiB;QACjB,OAAO;QACP,UAAU;QACV,QAAQ;QACT;iBAdH;QAgBG,EAAO;QAAK;QAAE,EAAO;QACf;SAhBF,EAAO,KAgBL,CACT;MACE,CAAA,CACF;;IAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,gBAAgB;MAAiB,YAAY;MAAU,cAAc;MAAI;eAAxG,CACE,kBAAC,MAAD;MACE,OAAO;OACL,UAAU;OACV,YAAY;OACZ,OAAO;OACR;gBAEA,EAAG,0CAA0C,oBAAoB;MAC/D,CAAA,EACL,kBAAC,UAAD;MACE,eAAe,EAAS,cAAc;MACtC,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,cAAc;OACd,QAAQ;OACR,iBAAiB;OACjB,OAAO;OACP,UAAU;OACV,QAAQ;OACT;gBAbH;OAeG,EAAG,4CAA4C,WAAW;OAAC;OAAC,kBAAC,GAAD,EAAY,MAAM,IAAM,CAAA;OAC9E;QACL;QAEL,IACC,kBAAC,OAAD;KAAK,OAAO;MAAE,WAAW;MAAU,SAAS;MAAI,OAAO;MAA2B;eAChF,kBAAC,GAAD;MAAS,MAAM;MAAI,WAAU;MAAe,OAAO,EAAE,QAAQ,UAAU;MAAI,CAAA;KACvE,CAAA,GACJ,EAAiB,WAAW,IAC9B,kBAAC,OAAD;KACE,OAAO;MACL,WAAW;MACX,SAAS;MACT,iBAAiB;MACjB,QAAQ;MACR,cAAc;MACf;eAPH;MASE,kBAAC,GAAD;OAAiB,MAAM;OAAI,OAAO;QAAE,OAAO;QAA2B,QAAQ;QAAc;OAAI,CAAA;MAChG,kBAAC,KAAD;OAAG,OAAO;QAAE,OAAO;QAA+B,YAAY;QAA6B;iBACxF,EAAG,+CAA+C,oBAAoB;OACrE,CAAA;MACJ,kBAAC,KAAD;OAAG,OAAO;QAAE,OAAO;QAA2B,UAAU;QAA4B,WAAW;QAAG;iBAC/F,EAAG,qDAAqD,6CAA6C;OACpG,CAAA;MACA;SAEN,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,eAAe;MAAU,KAAK;MAAG;eAC7D,EAAiB,KAAK,MACrB,kBAAC,UAAD;MAEE,eAAe,EAAS,eAAe,EAAE,KAAK;MAC9C,OAAO;OACL,WAAW;OACX,SAAS;OACT,cAAc;OACd,QAAQ;OACR,iBAAiB;OACjB,QAAQ;OACR,SAAS;OACT,gBAAgB;OAChB,YAAY;OACb;gBAbH,CAeE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OACE,OAAO;QACL,YAAY;QACZ,UAAU;QACV,OAAO;QACR;iBAEA,EAAE;OACC,CAAA,EACL,EAAE,eACD,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAI,OAAO;QAA2B,WAAW;QAAG;iBACzE,EAAE,YAAY,MAAM,GAAG,GAAG;OACvB,CAAA,CAEJ,EAAA,CAAA,EACN,kBAAC,GAAD;OAAY,MAAM;OAAI,OAAO,EAAE,OAAO,2BAA2B;OAAI,CAAA,CAC9D;QA/BF,EAAE,GA+BA,CACT;KACE,CAAA,CAEJ,EAAA,CAAA;IACF;;EACF,CAAA;EAER"}
|
|
1
|
+
{"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/bigconsole/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage\n *\n * BigConsole landing page showing workspace statistics and quick actions.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n AuroraBackground,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Button,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useAppNavigate } from '../contexts';\nimport { LayoutDashboard, Blocks, FileCode2, GitBranch, ArrowRight, Loader2 } from 'lucide-react';\n\n// ============================================================================\n// GRAPHQL RESPONSE TYPES\n// ============================================================================\n\ninterface HomepageStatsData {\n listDashboards: { totalCount: number };\n listDataSinks: { totalCount: number };\n // TODO: listParsers and listPipelines don't support totalCount pagination yet;\n // using array length as a fallback until the schema is updated.\n listParsers: Array<{ id: string }>;\n listPipelines: Array<{ id: string }>;\n}\n\ninterface RecentDashboardNode {\n id: string;\n name: string;\n description?: string;\n updatedAt: string;\n}\n\ninterface RecentDashboardsData {\n listDashboards: {\n edges: Array<{ node: RecentDashboardNode }>;\n };\n}\n\nconst HOMEPAGE_STATS = gql`\n query HomepageStats {\n listDashboards(first: 0) {\n totalCount\n }\n listDataSinks(first: 0) {\n totalCount\n }\n listParsers {\n id\n }\n listPipelines {\n id\n }\n }\n`;\n\nconst RECENT_DASHBOARDS = gql`\n query RecentDashboards {\n listDashboards(first: 5, sortBy: \"updatedAt\", sortOrder: \"desc\") {\n edges {\n node {\n id\n name\n description\n updatedAt\n }\n }\n }\n }\n`;\n\ninterface StatCardProps {\n icon: React.ReactNode;\n label: string;\n count: number | undefined;\n loading: boolean;\n path: string;\n onNavigate: (path: string) => void;\n}\n\nconst StatCard: FC<StatCardProps & { hero?: boolean }> = memo(function StatCard({\n icon,\n label,\n count,\n loading,\n path,\n onNavigate,\n hero = false,\n}) {\n return (\n <GlassCard\n treatment={hero ? 'glass' : 'metric'}\n glow={hero}\n className=\"border-border-seam p-0\"\n >\n <button\n type=\"button\"\n onClick={() => onNavigate(path)}\n className=\"flex w-full flex-col gap-2 rounded-card p-[var(--space-cardPadding)] text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex items-center gap-2\">\n <div style={{ color: 'var(--color-action-primary-bg)' }}>{icon}</div>\n <span style={{ fontSize: 'var(--font-size-body-sm)', color: 'var(--color-text-secondary)' }}>{label}</span>\n </div>\n <div\n className=\"tabular-nums\"\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {loading ? <Loader2 size={20} className=\"animate-spin\" /> : (count ?? 0)}\n </div>\n </button>\n </GlassCard>\n );\n});\n\nexport const HomePage: FC = memo(function HomePage() {\n const navigate = useAppNavigate();\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n },\n [t]\n );\n const { data: stats, loading: statsLoading } = useQuery<HomepageStatsData>(HOMEPAGE_STATS, {\n fetchPolicy: 'cache-and-network',\n });\n const { data: recentData, loading: recentLoading } = useQuery<RecentDashboardsData>(RECENT_DASHBOARDS, {\n fetchPolicy: 'cache-and-network',\n });\n\n const recentDashboards = recentData?.listDashboards?.edges?.map((e) => e.node) || [];\n\n return (\n <div style={{ minHeight: '100vh', backgroundColor: 'var(--color-bg-canvas)' }}>\n <div style={{ padding: 'var(--space-pagePadding)', maxWidth: 960, margin: '0 auto' }}>\n {/* Hero Header */}\n <div\n className=\"relative mb-[var(--space-sectionGap)] overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6\"\n >\n <AuroraBackground intensity=\"subtle\" />\n <h1\n style={{\n fontSize: 'var(--font-size-heading-h4)',\n fontWeight: 'var(--font-weight-bold)',\n color: 'var(--color-text-primary)',\n }}\n >\n <GradientText>BigConsole</GradientText>\n </h1>\n <p style={{ fontSize: 'var(--font-size-body-md)', color: 'var(--color-text-secondary)', marginTop: 4 }}>\n {tr('bigconsole.home.subtitle', 'AI-powered analytics platform')}\n </p>\n </div>\n\n <PagePurpose className=\"mb-[var(--space-sectionGap)]\">\n {tr(\n 'bigconsole.home.purpose',\n 'BigConsole is your analytics command center — build live dashboards, wire up data sinks and parsers, then automate it all with pipelines and workflows. Start from the quick actions below or jump back into a recent dashboard.'\n )}\n </PagePurpose>\n\n {/* Stats Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: 12,\n marginBottom: 'var(--space-sectionGap)',\n }}\n >\n <StatCard\n hero\n icon={<LayoutDashboard size={20} />}\n label={tr('bigconsole.home.stats.dashboards', 'Dashboards')}\n count={stats?.listDashboards?.totalCount}\n loading={statsLoading}\n path=\"/dashboards\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<Blocks size={20} />}\n label={tr('bigconsole.home.stats.dataSinks', 'Data Sinks')}\n count={stats?.listDataSinks?.totalCount}\n loading={statsLoading}\n path=\"/datasinks\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<FileCode2 size={20} />}\n label={tr('bigconsole.home.stats.parsers', 'Parsers')}\n count={stats?.listParsers?.length}\n loading={statsLoading}\n path=\"/parsers\"\n onNavigate={navigate}\n />\n <StatCard\n icon={<GitBranch size={20} />}\n label={tr('bigconsole.home.stats.pipelines', 'Pipelines')}\n count={stats?.listPipelines?.length}\n loading={statsLoading}\n path=\"/pipelines\"\n onNavigate={navigate}\n />\n </div>\n\n {/* Quick Actions */}\n <div style={{ marginBottom: 'var(--space-sectionGap)' }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n marginBottom: 12,\n }}\n >\n {tr('bigconsole.home.quickActions.title', 'Quick Actions')}\n </h2>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {[\n {\n label: tr('bigconsole.home.quickActions.newDashboard', 'New Dashboard'),\n path: '/dashboards',\n icon: <LayoutDashboard size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newDataSink', 'New Data Sink'),\n path: '/datasinks/new',\n icon: <Blocks size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newParser', 'New Parser'),\n path: '/parsers/new',\n icon: <FileCode2 size={14} />,\n },\n {\n label: tr('bigconsole.home.quickActions.newPipeline', 'New Pipeline'),\n path: '/pipelines/new',\n icon: <GitBranch size={14} />,\n },\n ].map((action) => (\n <button\n key={action.path}\n onClick={() => navigate(action.path)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 16px',\n borderRadius: 'var(--radius-button)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n color: 'var(--color-text-primary)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {action.icon} {action.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Recent Dashboards */}\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }}>\n <h2\n style={{\n fontSize: 'var(--font-size-body-md)',\n fontWeight: 'var(--font-weight-semibold)',\n color: 'var(--color-text-primary)',\n }}\n >\n {tr('bigconsole.home.recentDashboards.title', 'Recent Dashboards')}\n </h2>\n <button\n onClick={() => navigate('/dashboards')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n borderRadius: 'var(--radius-button)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--color-action-primary-bg)',\n fontSize: 'var(--font-size-body-sm)',\n cursor: 'pointer',\n }}\n >\n {tr('bigconsole.home.recentDashboards.viewAll', 'View all')} <ArrowRight size={14} />\n </button>\n </div>\n\n {recentLoading ? (\n <div style={{ textAlign: 'center', padding: 24, color: 'var(--color-text-muted)' }}>\n <Loader2 size={20} className=\"animate-spin\" style={{ margin: '0 auto' }} />\n </div>\n ) : recentDashboards.length === 0 ? (\n <GlassCard treatment=\"insight\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('bigconsole.home.recentDashboards.emptyTitle', 'No dashboards yet')}\n description={tr(\n 'bigconsole.home.recentDashboards.emptyDescription',\n 'Create your first dashboard to get started'\n )}\n action={\n <Button onClick={() => navigate('/dashboards')}>\n {tr('bigconsole.home.quickActions.newDashboard', 'New Dashboard')}\n </Button>\n }\n />\n </GlassCard>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {recentDashboards.map((d) => (\n <button\n key={d.id}\n onClick={() => navigate(`/dashboards/${d.id}`)}\n style={{\n textAlign: 'left',\n padding: 12,\n borderRadius: 'var(--radius-card)',\n border: '1px solid var(--color-border)',\n backgroundColor: 'var(--color-bg-surface)',\n cursor: 'pointer',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div>\n <div\n style={{\n fontWeight: 'var(--font-weight-medium)',\n fontSize: 'var(--font-size-body-sm)',\n color: 'var(--color-text-primary)',\n }}\n >\n {d.name}\n </div>\n {d.description && (\n <div style={{ fontSize: 11, color: 'var(--color-text-muted)', marginTop: 2 }}>\n {d.description.slice(0, 80)}\n </div>\n )}\n </div>\n <ArrowRight size={14} style={{ color: 'var(--color-text-muted)' }} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nexport default HomePage;\n"],"mappings":"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"}
|