@burdenoff/microfe-bigconsole 2026.714.4 → 2026.715.2
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/AdminRoot.js +48 -0
- package/dist/bigconsole/AdminRoot.js.map +1 -0
- package/dist/bigconsole/AdminRoutes.js +14 -0
- package/dist/bigconsole/AdminRoutes.js.map +1 -0
- package/dist/bigconsole/index.js +1 -0
- package/dist/bigconsole/pages/AdminPage.js +504 -0
- package/dist/bigconsole/pages/AdminPage.js.map +1 -0
- package/dist/index.js +4 -3
- package/package.json +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { BigConsoleProvider as e } from "./context/BigConsoleContext.js";
|
|
2
|
+
import "./context/index.js";
|
|
3
|
+
import { AdminRoutes as t } from "./AdminRoutes.js";
|
|
4
|
+
import { useEffect as n } from "react";
|
|
5
|
+
import { ErrorBoundary as r } from "@burdenoff/fe-libs/shared/components";
|
|
6
|
+
import { FeatureFlagProvider as i } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
7
|
+
import { BarChart3 as a } from "lucide-react";
|
|
8
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
9
|
+
//#region src/bigconsole/AdminRoot.tsx
|
|
10
|
+
var s = (s) => {
|
|
11
|
+
let { registerNavItems: c, registerFooterItems: l, basePath: u = "/admin/bigconsole" } = s;
|
|
12
|
+
return n(() => {
|
|
13
|
+
if (c) return c([{
|
|
14
|
+
id: "bigconsole-admin",
|
|
15
|
+
label: "BigConsole",
|
|
16
|
+
path: u,
|
|
17
|
+
icon: /* @__PURE__ */ o(a, { size: 20 }),
|
|
18
|
+
order: 55,
|
|
19
|
+
group: "admin"
|
|
20
|
+
}]);
|
|
21
|
+
}, [c, u]), n(() => {
|
|
22
|
+
if (l) return l([{
|
|
23
|
+
id: "bigconsole-admin-status",
|
|
24
|
+
label: "BigConsole Admin",
|
|
25
|
+
type: "status",
|
|
26
|
+
order: 55,
|
|
27
|
+
section: "left"
|
|
28
|
+
}]);
|
|
29
|
+
}, [l]), /* @__PURE__ */ o(r, {
|
|
30
|
+
fallback: /* @__PURE__ */ o("div", {
|
|
31
|
+
className: "p-6 text-center text-text-secondary",
|
|
32
|
+
children: "Something went wrong loading BigConsole Admin. Please refresh the page."
|
|
33
|
+
}),
|
|
34
|
+
children: /* @__PURE__ */ o(i, {
|
|
35
|
+
workspaceId: null,
|
|
36
|
+
gateway: "global",
|
|
37
|
+
defaultEnabled: !0,
|
|
38
|
+
children: /* @__PURE__ */ o(e, {
|
|
39
|
+
props: s,
|
|
40
|
+
children: /* @__PURE__ */ o(t, {})
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { s as AdminRoot };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=AdminRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminRoot.js","names":[],"sources":["../../src/bigconsole/AdminRoot.tsx"],"sourcesContent":["/**\n * BigConsole Admin Root\n *\n * Entry point for the BigConsole admin surface mounted inside the platform\n * admin-app. Reuses the same provider stack as the main BigConsoleRoot where\n * appropriate, but keeps the admin UI lightweight and independent of dashboard\n * rendering concerns.\n */\n\nimport type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { BarChart3 } from 'lucide-react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport type { AdminRootProps } from './types';\nimport { AdminRoutes } from './AdminRoutes';\nimport { BigConsoleProvider } from './context';\n\n/**\n * Root component for the BigConsole admin microfrontend.\n *\n * This is the admin entry point that host applications import and render.\n */\nexport const AdminRoot: FC<AdminRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/admin/bigconsole' } = props;\n\n // Register a single admin nav item with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n const cleanup = registerNavItems([\n {\n id: 'bigconsole-admin',\n label: 'BigConsole',\n path: basePath,\n icon: <BarChart3 size={20} />,\n order: 55,\n group: 'admin',\n },\n ]);\n\n return cleanup;\n }, [registerNavItems, basePath]);\n\n // Register footer status item\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const cleanup = registerFooterItems([\n {\n id: 'bigconsole-admin-status',\n label: 'BigConsole Admin',\n type: 'status' as const,\n order: 55,\n section: 'left' as const,\n },\n ]);\n\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading BigConsole Admin. Please refresh the page.\n </div>\n }\n >\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <BigConsoleProvider props={props}>\n <AdminRoutes />\n </BigConsoleProvider>\n </FeatureFlagProvider>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;AAuBA,IAAa,KAAiC,MAAU;CACtD,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,wBAAwB;AAqClF,QAlCA,QAAgB;AACT,QAaL,QAXgB,EAAiB,CAC/B;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;GAC7B,OAAO;GACP,OAAO;GACR,CACF,CAAC;IAGD,CAAC,GAAkB,EAAS,CAAC,EAGhC,QAAgB;AACT,QAYL,QAVgB,EAAoB,CAClC;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAAC;IAGD,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EACE,UACE,kBAAC,OAAD;GAAK,WAAU;aAAsC;GAE/C,CAAA;YAGR,kBAAC,GAAD;GAAqB,aAAa;GAAM,SAAQ;GAAS,gBAAgB;aACvE,kBAAC,GAAD;IAA2B;cACzB,kBAAC,GAAD,EAAe,CAAA;IACI,CAAA;GACD,CAAA;EACR,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AdminPage as e } from "./pages/AdminPage.js";
|
|
2
|
+
import { Route as t, Routes as n } from "react-router-dom";
|
|
3
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/bigconsole/AdminRoutes.tsx
|
|
5
|
+
function i() {
|
|
6
|
+
return /* @__PURE__ */ r(n, { children: /* @__PURE__ */ r(t, {
|
|
7
|
+
path: "*",
|
|
8
|
+
element: /* @__PURE__ */ r(e, {})
|
|
9
|
+
}) });
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { i as AdminRoutes };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=AdminRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminRoutes.js","names":[],"sources":["../../src/bigconsole/AdminRoutes.tsx"],"sourcesContent":["/**\n * BigConsole Admin Routes\n *\n * Internal routing for the admin surface mounted inside admin-app.\n */\n\nimport { Route, Routes } from 'react-router-dom';\nimport { AdminPage } from './pages/AdminPage';\n\nexport function AdminRoutes() {\n return (\n <Routes>\n <Route path=\"*\" element={<AdminPage />} />\n </Routes>\n );\n}\n"],"mappings":";;;;AASA,SAAgB,IAAc;AAC5B,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAO,MAAK;EAAI,SAAS,kBAAC,GAAD,EAAa,CAAA;EAAI,CAAA,EACnC,CAAA"}
|
package/dist/bigconsole/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import "./components/DrilldownModal.js";
|
|
|
6
6
|
import "./hooks/useDrilldown.js";
|
|
7
7
|
import "./hooks/index.js";
|
|
8
8
|
import "./BigConsoleRoot.js";
|
|
9
|
+
import "./AdminRoot.js";
|
|
9
10
|
import "./assistant/pageContext.js";
|
|
10
11
|
import "./assistant/createSandboxAssistantTransport.js";
|
|
11
12
|
import "./assistant/index.js";
|
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { ListDataSinksDocument as e, ListEventLogsDocument as t } from "../../generated/wspace-operations.js";
|
|
2
|
+
import { memo as n, useCallback as r, useMemo as i, useState as a } from "react";
|
|
3
|
+
import { AlertCircle as o, Database as s, Flag as c, LayoutDashboard as l, RefreshCw as u, ScrollText as d, Search as f } from "lucide-react";
|
|
4
|
+
import { useQuery as p } from "@apollo/client/react";
|
|
5
|
+
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { Badge as h, Button as g, Card as _, CardContent as v, CardDescription as y, CardHeader as b, CardTitle as x, Input as S, Spinner as C, Tabs as w, TabsContent as T, TabsList as E, TabsTrigger as D } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
8
|
+
import { formatDistanceToNow as A } from "date-fns";
|
|
9
|
+
//#region src/bigconsole/pages/AdminPage.tsx
|
|
10
|
+
var j = [
|
|
11
|
+
{
|
|
12
|
+
id: "flag-1",
|
|
13
|
+
key: "bigconsole.ai-insights",
|
|
14
|
+
name: "AI Insights",
|
|
15
|
+
description: "Enable AI-generated insights across dashboards",
|
|
16
|
+
enabled: !0,
|
|
17
|
+
scope: "organization"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "flag-2",
|
|
21
|
+
key: "bigconsole.real-time-collaboration",
|
|
22
|
+
name: "Real-time Collaboration",
|
|
23
|
+
description: "Allow multiple users to edit dashboards simultaneously",
|
|
24
|
+
enabled: !1,
|
|
25
|
+
scope: "workspace"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "flag-3",
|
|
29
|
+
key: "bigconsole.advanced-drilldown",
|
|
30
|
+
name: "Advanced Drilldown",
|
|
31
|
+
description: "Enable cross-dashboard drilldown and parameter passing",
|
|
32
|
+
enabled: !0,
|
|
33
|
+
scope: "organization"
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
function M(e) {
|
|
37
|
+
if (e == null || e === 0) return "0 B";
|
|
38
|
+
let t = [
|
|
39
|
+
"B",
|
|
40
|
+
"KB",
|
|
41
|
+
"MB",
|
|
42
|
+
"GB",
|
|
43
|
+
"TB"
|
|
44
|
+
], n = Math.floor(Math.log(e) / Math.log(1024));
|
|
45
|
+
return `${(e / 1024 ** n).toFixed(2)} ${t[n]}`;
|
|
46
|
+
}
|
|
47
|
+
function N(e) {
|
|
48
|
+
if (!e) return "—";
|
|
49
|
+
try {
|
|
50
|
+
return A(new Date(e), { addSuffix: !0 });
|
|
51
|
+
} catch {
|
|
52
|
+
return e;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
var P = n(function() {
|
|
56
|
+
let { t } = m(), n = r((e, n) => {
|
|
57
|
+
let r = t(e);
|
|
58
|
+
return r === e ? n : r;
|
|
59
|
+
}, [t]), [c, d] = a(""), { data: w, loading: T, error: E, refetch: D } = p(e, {
|
|
60
|
+
variables: {
|
|
61
|
+
first: 50,
|
|
62
|
+
search: c || void 0
|
|
63
|
+
},
|
|
64
|
+
notifyOnNetworkStatusChange: !0
|
|
65
|
+
}), A = i(() => (w?.listDataSinks?.edges ?? []).map((e) => e.node), [w]);
|
|
66
|
+
return /* @__PURE__ */ k("div", {
|
|
67
|
+
className: "space-y-6",
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ k("div", {
|
|
70
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
71
|
+
children: [/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
|
|
72
|
+
className: "text-lg font-semibold text-text-primary",
|
|
73
|
+
children: n("bigconsole.admin.registry.title", "Widget & Data-sink Registry")
|
|
74
|
+
}), /* @__PURE__ */ O("p", {
|
|
75
|
+
className: "text-sm text-text-secondary",
|
|
76
|
+
children: n("bigconsole.admin.registry.subtitle", "Browse and govern dashboards, widgets, and data sinks across the organization.")
|
|
77
|
+
})] }), /* @__PURE__ */ k("div", {
|
|
78
|
+
className: "flex items-center gap-2",
|
|
79
|
+
children: [/* @__PURE__ */ k("div", {
|
|
80
|
+
className: "relative",
|
|
81
|
+
children: [/* @__PURE__ */ O(f, { className: "absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary" }), /* @__PURE__ */ O(S, {
|
|
82
|
+
type: "text",
|
|
83
|
+
placeholder: n("bigconsole.admin.registry.search", "Search data sinks..."),
|
|
84
|
+
value: c,
|
|
85
|
+
onChange: (e) => d(e.target.value),
|
|
86
|
+
className: "pl-9 w-full sm:w-64"
|
|
87
|
+
})]
|
|
88
|
+
}), /* @__PURE__ */ O(g, {
|
|
89
|
+
variant: "outline",
|
|
90
|
+
size: "icon",
|
|
91
|
+
onClick: () => D(),
|
|
92
|
+
disabled: T,
|
|
93
|
+
"aria-label": n("bigconsole.admin.registry.refresh", "Refresh"),
|
|
94
|
+
children: /* @__PURE__ */ O(u, { className: `h-4 w-4 ${T ? "animate-spin" : ""}` })
|
|
95
|
+
})]
|
|
96
|
+
})]
|
|
97
|
+
}),
|
|
98
|
+
/* @__PURE__ */ k(_, {
|
|
99
|
+
className: "border-dashed border-border-default bg-bg-surface/50",
|
|
100
|
+
children: [/* @__PURE__ */ k(b, {
|
|
101
|
+
className: "pb-3",
|
|
102
|
+
children: [/* @__PURE__ */ k(x, {
|
|
103
|
+
className: "text-base font-medium text-text-primary flex items-center gap-2",
|
|
104
|
+
children: [/* @__PURE__ */ O(l, { className: "h-4 w-4 text-text-secondary" }), n("bigconsole.admin.registry.widgets", "Widget Registry")]
|
|
105
|
+
}), /* @__PURE__ */ O(y, {
|
|
106
|
+
className: "text-sm text-text-secondary",
|
|
107
|
+
children: n("bigconsole.admin.registry.widgets.description", "Cross-workspace widget listing requires a backend query that supports organization-scoped pagination (listWidgets currently requires pageId).")
|
|
108
|
+
})]
|
|
109
|
+
}), /* @__PURE__ */ O(v, { children: /* @__PURE__ */ k("div", {
|
|
110
|
+
className: "flex items-start gap-3 rounded-md bg-warning-bg/10 p-3 text-sm text-warning-fg",
|
|
111
|
+
children: [/* @__PURE__ */ O(o, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
112
|
+
className: "font-medium",
|
|
113
|
+
children: n("bigconsole.admin.registry.widgets.gap.title", "Backend gap")
|
|
114
|
+
}), /* @__PURE__ */ O("p", {
|
|
115
|
+
className: "mt-1 text-text-secondary",
|
|
116
|
+
children: n("bigconsole.admin.registry.widgets.gap.body", "Add adminBigConsoleWidgets(organizationId, first, after) to global or workspace schema, then wire it here.")
|
|
117
|
+
})] })]
|
|
118
|
+
}) })]
|
|
119
|
+
}),
|
|
120
|
+
/* @__PURE__ */ k(_, {
|
|
121
|
+
className: "bg-bg-surface border-border-default",
|
|
122
|
+
children: [/* @__PURE__ */ k(b, {
|
|
123
|
+
className: "pb-3",
|
|
124
|
+
children: [/* @__PURE__ */ k(x, {
|
|
125
|
+
className: "text-base font-medium text-text-primary flex items-center gap-2",
|
|
126
|
+
children: [/* @__PURE__ */ O(s, { className: "h-4 w-4 text-text-secondary" }), n("bigconsole.admin.registry.datasinks", "Data-sink Registry")]
|
|
127
|
+
}), /* @__PURE__ */ O(y, {
|
|
128
|
+
className: "text-sm text-text-secondary",
|
|
129
|
+
children: n("bigconsole.admin.registry.datasinks.description", "Live view of data sinks across the organization.")
|
|
130
|
+
})]
|
|
131
|
+
}), /* @__PURE__ */ O(v, { children: E ? /* @__PURE__ */ O("div", {
|
|
132
|
+
className: "rounded-md bg-danger-bg/10 p-4 text-sm text-danger-fg",
|
|
133
|
+
children: E.message
|
|
134
|
+
}) : T && !w ? /* @__PURE__ */ O("div", {
|
|
135
|
+
className: "flex items-center justify-center py-12",
|
|
136
|
+
children: /* @__PURE__ */ O(C, { className: "h-8 w-8" })
|
|
137
|
+
}) : A.length === 0 ? /* @__PURE__ */ O("div", {
|
|
138
|
+
className: "text-center py-12 text-text-secondary text-sm",
|
|
139
|
+
children: n("bigconsole.admin.registry.datasinks.empty", "No data sinks found.")
|
|
140
|
+
}) : /* @__PURE__ */ O("div", {
|
|
141
|
+
className: "overflow-x-auto",
|
|
142
|
+
children: /* @__PURE__ */ k("table", {
|
|
143
|
+
className: "w-full text-sm",
|
|
144
|
+
children: [/* @__PURE__ */ O("thead", { children: /* @__PURE__ */ k("tr", {
|
|
145
|
+
className: "border-b border-border-default text-left text-text-secondary",
|
|
146
|
+
children: [
|
|
147
|
+
/* @__PURE__ */ O("th", {
|
|
148
|
+
className: "pb-3 pr-4 font-medium",
|
|
149
|
+
children: n("bigconsole.admin.registry.datasinks.name", "Name")
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ O("th", {
|
|
152
|
+
className: "pb-3 pr-4 font-medium",
|
|
153
|
+
children: n("bigconsole.admin.registry.datasinks.status", "Status")
|
|
154
|
+
}),
|
|
155
|
+
/* @__PURE__ */ O("th", {
|
|
156
|
+
className: "pb-3 pr-4 font-medium",
|
|
157
|
+
children: n("bigconsole.admin.registry.datasinks.size", "Size")
|
|
158
|
+
}),
|
|
159
|
+
/* @__PURE__ */ O("th", {
|
|
160
|
+
className: "pb-3 pr-4 font-medium",
|
|
161
|
+
children: n("bigconsole.admin.registry.datasinks.links", "Links")
|
|
162
|
+
}),
|
|
163
|
+
/* @__PURE__ */ O("th", {
|
|
164
|
+
className: "pb-3 pr-4 font-medium",
|
|
165
|
+
children: n("bigconsole.admin.registry.datasinks.refreshed", "Refreshed")
|
|
166
|
+
}),
|
|
167
|
+
/* @__PURE__ */ O("th", {
|
|
168
|
+
className: "pb-3 font-medium",
|
|
169
|
+
children: n("bigconsole.admin.registry.datasinks.active", "Active")
|
|
170
|
+
})
|
|
171
|
+
]
|
|
172
|
+
}) }), /* @__PURE__ */ O("tbody", {
|
|
173
|
+
className: "text-text-primary",
|
|
174
|
+
children: A.map((e) => /* @__PURE__ */ k("tr", {
|
|
175
|
+
className: "border-b border-border-seam last:border-0",
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ k("td", {
|
|
178
|
+
className: "py-3 pr-4",
|
|
179
|
+
children: [/* @__PURE__ */ O("div", {
|
|
180
|
+
className: "font-medium",
|
|
181
|
+
children: e.name || e.key
|
|
182
|
+
}), /* @__PURE__ */ O("div", {
|
|
183
|
+
className: "text-xs text-text-tertiary",
|
|
184
|
+
children: e.key
|
|
185
|
+
})]
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ O("td", {
|
|
188
|
+
className: "py-3 pr-4",
|
|
189
|
+
children: /* @__PURE__ */ O(h, {
|
|
190
|
+
variant: e.status === "ready" ? "default" : "secondary",
|
|
191
|
+
children: e.status
|
|
192
|
+
})
|
|
193
|
+
}),
|
|
194
|
+
/* @__PURE__ */ O("td", {
|
|
195
|
+
className: "py-3 pr-4 tabular-nums",
|
|
196
|
+
children: M(e.sizeBytes)
|
|
197
|
+
}),
|
|
198
|
+
/* @__PURE__ */ O("td", {
|
|
199
|
+
className: "py-3 pr-4 tabular-nums",
|
|
200
|
+
children: e.linkedWorkflowCount ?? 0
|
|
201
|
+
}),
|
|
202
|
+
/* @__PURE__ */ O("td", {
|
|
203
|
+
className: "py-3 pr-4 text-text-secondary",
|
|
204
|
+
children: N(e.lastRefreshedAt)
|
|
205
|
+
}),
|
|
206
|
+
/* @__PURE__ */ O("td", {
|
|
207
|
+
className: "py-3",
|
|
208
|
+
children: /* @__PURE__ */ O(h, {
|
|
209
|
+
variant: e.isActive ? "default" : "outline",
|
|
210
|
+
children: e.isActive ? "Yes" : "No"
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
]
|
|
214
|
+
}, e.id))
|
|
215
|
+
})]
|
|
216
|
+
})
|
|
217
|
+
}) })]
|
|
218
|
+
})
|
|
219
|
+
]
|
|
220
|
+
});
|
|
221
|
+
}), F = n(function() {
|
|
222
|
+
let { t: e } = m(), t = r((t, n) => {
|
|
223
|
+
let r = e(t);
|
|
224
|
+
return r === t ? n : r;
|
|
225
|
+
}, [e]), [n, i] = a(j), s = r((e) => {
|
|
226
|
+
i((t) => t.map((t) => t.id === e ? {
|
|
227
|
+
...t,
|
|
228
|
+
enabled: !t.enabled
|
|
229
|
+
} : t));
|
|
230
|
+
}, []);
|
|
231
|
+
return /* @__PURE__ */ k("div", {
|
|
232
|
+
className: "space-y-6",
|
|
233
|
+
children: [
|
|
234
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
|
|
235
|
+
className: "text-lg font-semibold text-text-primary",
|
|
236
|
+
children: t("bigconsole.admin.featureFlags.title", "Org-level Feature Flags")
|
|
237
|
+
}), /* @__PURE__ */ O("p", {
|
|
238
|
+
className: "text-sm text-text-secondary",
|
|
239
|
+
children: t("bigconsole.admin.featureFlags.subtitle", "Manage BigConsole features across organizations and workspaces.")
|
|
240
|
+
})] }),
|
|
241
|
+
/* @__PURE__ */ k("div", {
|
|
242
|
+
className: "flex items-start gap-3 rounded-md bg-info-bg/10 p-3 text-sm text-info-fg",
|
|
243
|
+
children: [/* @__PURE__ */ O(o, { className: "mt-0.5 h-4 w-4 shrink-0" }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
244
|
+
className: "font-medium",
|
|
245
|
+
children: t("bigconsole.admin.featureFlags.placeholder.title", "Placeholder data")
|
|
246
|
+
}), /* @__PURE__ */ O("p", {
|
|
247
|
+
className: "mt-1 text-text-secondary",
|
|
248
|
+
children: t("bigconsole.admin.featureFlags.placeholder.body", "Wire this to the feature-flag service admin API (list/upsert organization feature flags) when available.")
|
|
249
|
+
})] })]
|
|
250
|
+
}),
|
|
251
|
+
/* @__PURE__ */ O("div", {
|
|
252
|
+
className: "grid gap-4",
|
|
253
|
+
children: n.map((e) => /* @__PURE__ */ O(_, {
|
|
254
|
+
className: "bg-bg-surface border-border-default",
|
|
255
|
+
children: /* @__PURE__ */ O(v, {
|
|
256
|
+
className: "p-4",
|
|
257
|
+
children: /* @__PURE__ */ k("div", {
|
|
258
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
259
|
+
children: [/* @__PURE__ */ k("div", {
|
|
260
|
+
className: "space-y-1",
|
|
261
|
+
children: [
|
|
262
|
+
/* @__PURE__ */ k("div", {
|
|
263
|
+
className: "flex items-center gap-2",
|
|
264
|
+
children: [
|
|
265
|
+
/* @__PURE__ */ O(c, { className: "h-4 w-4 text-text-secondary" }),
|
|
266
|
+
/* @__PURE__ */ O("span", {
|
|
267
|
+
className: "font-medium text-text-primary",
|
|
268
|
+
children: e.name
|
|
269
|
+
}),
|
|
270
|
+
/* @__PURE__ */ O(h, {
|
|
271
|
+
variant: "outline",
|
|
272
|
+
children: e.scope
|
|
273
|
+
})
|
|
274
|
+
]
|
|
275
|
+
}),
|
|
276
|
+
/* @__PURE__ */ O("p", {
|
|
277
|
+
className: "text-sm text-text-secondary",
|
|
278
|
+
children: e.description
|
|
279
|
+
}),
|
|
280
|
+
/* @__PURE__ */ O("code", {
|
|
281
|
+
className: "text-xs text-text-tertiary bg-bg-sunken px-1.5 py-0.5 rounded",
|
|
282
|
+
children: e.key
|
|
283
|
+
})
|
|
284
|
+
]
|
|
285
|
+
}), /* @__PURE__ */ O(g, {
|
|
286
|
+
variant: e.enabled ? "default" : "outline",
|
|
287
|
+
size: "sm",
|
|
288
|
+
onClick: () => s(e.id),
|
|
289
|
+
className: "shrink-0",
|
|
290
|
+
children: e.enabled ? t("bigconsole.admin.featureFlags.enabled", "Enabled") : t("bigconsole.admin.featureFlags.disabled", "Disabled")
|
|
291
|
+
})]
|
|
292
|
+
})
|
|
293
|
+
})
|
|
294
|
+
}, e.id))
|
|
295
|
+
})
|
|
296
|
+
]
|
|
297
|
+
});
|
|
298
|
+
}), I = n(function() {
|
|
299
|
+
let { t: e } = m(), n = r((t, n) => {
|
|
300
|
+
let r = e(t);
|
|
301
|
+
return r === t ? n : r;
|
|
302
|
+
}, [e]), [o, s] = a("all"), { data: c, loading: l, error: d, refetch: f } = p(t, {
|
|
303
|
+
variables: {
|
|
304
|
+
first: 50,
|
|
305
|
+
status: o === "all" ? void 0 : o
|
|
306
|
+
},
|
|
307
|
+
notifyOnNetworkStatusChange: !0
|
|
308
|
+
}), y = i(() => (c?.listEventLogs?.edges ?? []).map((e) => e.node), [c]);
|
|
309
|
+
return /* @__PURE__ */ k("div", {
|
|
310
|
+
className: "space-y-6",
|
|
311
|
+
children: [/* @__PURE__ */ k("div", {
|
|
312
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
313
|
+
children: [/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
|
|
314
|
+
className: "text-lg font-semibold text-text-primary",
|
|
315
|
+
children: n("bigconsole.admin.auditLog.title", "Audit Log Viewer")
|
|
316
|
+
}), /* @__PURE__ */ O("p", {
|
|
317
|
+
className: "text-sm text-text-secondary",
|
|
318
|
+
children: n("bigconsole.admin.auditLog.subtitle", "Widget event delivery log. Organization-level audit trail requires a dedicated admin audit query.")
|
|
319
|
+
})] }), /* @__PURE__ */ k("div", {
|
|
320
|
+
className: "flex items-center gap-2",
|
|
321
|
+
children: [/* @__PURE__ */ k("select", {
|
|
322
|
+
value: o,
|
|
323
|
+
onChange: (e) => s(e.target.value),
|
|
324
|
+
className: "h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-focus-ring",
|
|
325
|
+
children: [
|
|
326
|
+
/* @__PURE__ */ O("option", {
|
|
327
|
+
value: "all",
|
|
328
|
+
children: n("bigconsole.admin.auditLog.filter.all", "All statuses")
|
|
329
|
+
}),
|
|
330
|
+
/* @__PURE__ */ O("option", {
|
|
331
|
+
value: "success",
|
|
332
|
+
children: n("bigconsole.admin.auditLog.filter.success", "Success")
|
|
333
|
+
}),
|
|
334
|
+
/* @__PURE__ */ O("option", {
|
|
335
|
+
value: "failed",
|
|
336
|
+
children: n("bigconsole.admin.auditLog.filter.failed", "Failed")
|
|
337
|
+
})
|
|
338
|
+
]
|
|
339
|
+
}), /* @__PURE__ */ O(g, {
|
|
340
|
+
variant: "outline",
|
|
341
|
+
size: "icon",
|
|
342
|
+
onClick: () => f(),
|
|
343
|
+
disabled: l,
|
|
344
|
+
"aria-label": n("bigconsole.admin.auditLog.refresh", "Refresh"),
|
|
345
|
+
children: /* @__PURE__ */ O(u, { className: `h-4 w-4 ${l ? "animate-spin" : ""}` })
|
|
346
|
+
})]
|
|
347
|
+
})]
|
|
348
|
+
}), /* @__PURE__ */ O(_, {
|
|
349
|
+
className: "bg-bg-surface border-border-default",
|
|
350
|
+
children: /* @__PURE__ */ O(v, {
|
|
351
|
+
className: "p-0",
|
|
352
|
+
children: d ? /* @__PURE__ */ O("div", {
|
|
353
|
+
className: "rounded-md bg-danger-bg/10 p-4 text-sm text-danger-fg",
|
|
354
|
+
children: d.message
|
|
355
|
+
}) : l && !c ? /* @__PURE__ */ O("div", {
|
|
356
|
+
className: "flex items-center justify-center py-12",
|
|
357
|
+
children: /* @__PURE__ */ O(C, { className: "h-8 w-8" })
|
|
358
|
+
}) : y.length === 0 ? /* @__PURE__ */ O("div", {
|
|
359
|
+
className: "text-center py-12 text-text-secondary text-sm",
|
|
360
|
+
children: n("bigconsole.admin.auditLog.empty", "No audit events found.")
|
|
361
|
+
}) : /* @__PURE__ */ O("div", {
|
|
362
|
+
className: "overflow-x-auto",
|
|
363
|
+
children: /* @__PURE__ */ k("table", {
|
|
364
|
+
className: "w-full text-sm",
|
|
365
|
+
children: [/* @__PURE__ */ O("thead", { children: /* @__PURE__ */ k("tr", {
|
|
366
|
+
className: "border-b border-border-default text-left text-text-secondary",
|
|
367
|
+
children: [
|
|
368
|
+
/* @__PURE__ */ O("th", {
|
|
369
|
+
className: "pb-3 pr-4 font-medium p-4",
|
|
370
|
+
children: n("bigconsole.admin.auditLog.event", "Event")
|
|
371
|
+
}),
|
|
372
|
+
/* @__PURE__ */ O("th", {
|
|
373
|
+
className: "pb-3 pr-4 font-medium",
|
|
374
|
+
children: n("bigconsole.admin.auditLog.action", "Action")
|
|
375
|
+
}),
|
|
376
|
+
/* @__PURE__ */ O("th", {
|
|
377
|
+
className: "pb-3 pr-4 font-medium",
|
|
378
|
+
children: n("bigconsole.admin.auditLog.status", "Status")
|
|
379
|
+
}),
|
|
380
|
+
/* @__PURE__ */ O("th", {
|
|
381
|
+
className: "pb-3 pr-4 font-medium",
|
|
382
|
+
children: n("bigconsole.admin.auditLog.widget", "Widget")
|
|
383
|
+
}),
|
|
384
|
+
/* @__PURE__ */ O("th", {
|
|
385
|
+
className: "pb-3 pr-4 font-medium",
|
|
386
|
+
children: n("bigconsole.admin.auditLog.dashboard", "Dashboard")
|
|
387
|
+
}),
|
|
388
|
+
/* @__PURE__ */ O("th", {
|
|
389
|
+
className: "pb-3 font-medium",
|
|
390
|
+
children: n("bigconsole.admin.auditLog.time", "Time")
|
|
391
|
+
})
|
|
392
|
+
]
|
|
393
|
+
}) }), /* @__PURE__ */ O("tbody", {
|
|
394
|
+
className: "text-text-primary",
|
|
395
|
+
children: y.map((e) => /* @__PURE__ */ k("tr", {
|
|
396
|
+
className: "border-b border-border-seam last:border-0",
|
|
397
|
+
children: [
|
|
398
|
+
/* @__PURE__ */ k("td", {
|
|
399
|
+
className: "py-3 pr-4 p-4",
|
|
400
|
+
children: [/* @__PURE__ */ O("div", {
|
|
401
|
+
className: "font-medium",
|
|
402
|
+
children: e.eventName
|
|
403
|
+
}), e.errorMessage && /* @__PURE__ */ O("div", {
|
|
404
|
+
className: "text-xs text-danger-fg mt-1 max-w-xs truncate",
|
|
405
|
+
children: e.errorMessage
|
|
406
|
+
})]
|
|
407
|
+
}),
|
|
408
|
+
/* @__PURE__ */ O("td", {
|
|
409
|
+
className: "py-3 pr-4",
|
|
410
|
+
children: e.actionName || "—"
|
|
411
|
+
}),
|
|
412
|
+
/* @__PURE__ */ O("td", {
|
|
413
|
+
className: "py-3 pr-4",
|
|
414
|
+
children: /* @__PURE__ */ O(h, {
|
|
415
|
+
variant: e.status === "success" ? "default" : e.status === "failed" ? "destructive" : "secondary",
|
|
416
|
+
children: e.status
|
|
417
|
+
})
|
|
418
|
+
}),
|
|
419
|
+
/* @__PURE__ */ O("td", {
|
|
420
|
+
className: "py-3 pr-4 font-mono text-xs text-text-tertiary",
|
|
421
|
+
children: e.widgetId || "—"
|
|
422
|
+
}),
|
|
423
|
+
/* @__PURE__ */ O("td", {
|
|
424
|
+
className: "py-3 pr-4 font-mono text-xs text-text-tertiary",
|
|
425
|
+
children: e.dashboardId || "—"
|
|
426
|
+
}),
|
|
427
|
+
/* @__PURE__ */ O("td", {
|
|
428
|
+
className: "py-3 text-text-secondary",
|
|
429
|
+
children: N(e.createdAt)
|
|
430
|
+
})
|
|
431
|
+
]
|
|
432
|
+
}, e.id))
|
|
433
|
+
})]
|
|
434
|
+
})
|
|
435
|
+
})
|
|
436
|
+
})
|
|
437
|
+
})]
|
|
438
|
+
});
|
|
439
|
+
}), L = n(function() {
|
|
440
|
+
let { t: e } = m(), t = r((t, n) => {
|
|
441
|
+
let r = e(t);
|
|
442
|
+
return r === t ? n : r;
|
|
443
|
+
}, [e]), [n, i] = a("registry");
|
|
444
|
+
return /* @__PURE__ */ O("div", {
|
|
445
|
+
className: "min-h-screen bg-bg-base p-6",
|
|
446
|
+
children: /* @__PURE__ */ k("div", {
|
|
447
|
+
className: "mx-auto max-w-7xl space-y-6",
|
|
448
|
+
children: [/* @__PURE__ */ k("div", {
|
|
449
|
+
className: "space-y-1",
|
|
450
|
+
children: [/* @__PURE__ */ O("h1", {
|
|
451
|
+
className: "text-2xl font-bold text-text-primary",
|
|
452
|
+
children: t("bigconsole.admin.title", "BigConsole Admin")
|
|
453
|
+
}), /* @__PURE__ */ O("p", {
|
|
454
|
+
className: "text-sm text-text-secondary",
|
|
455
|
+
children: t("bigconsole.admin.description", "Product-specific administration and governance for BigConsole.")
|
|
456
|
+
})]
|
|
457
|
+
}), /* @__PURE__ */ k(w, {
|
|
458
|
+
value: n,
|
|
459
|
+
onValueChange: (e) => i(e),
|
|
460
|
+
children: [
|
|
461
|
+
/* @__PURE__ */ k(E, {
|
|
462
|
+
className: "bg-bg-surface border border-border-default",
|
|
463
|
+
children: [
|
|
464
|
+
/* @__PURE__ */ k(D, {
|
|
465
|
+
value: "registry",
|
|
466
|
+
className: "flex items-center gap-2",
|
|
467
|
+
children: [/* @__PURE__ */ O(l, { className: "h-4 w-4" }), t("bigconsole.admin.tab.registry", "Registry")]
|
|
468
|
+
}),
|
|
469
|
+
/* @__PURE__ */ k(D, {
|
|
470
|
+
value: "feature-flags",
|
|
471
|
+
className: "flex items-center gap-2",
|
|
472
|
+
children: [/* @__PURE__ */ O(c, { className: "h-4 w-4" }), t("bigconsole.admin.tab.featureFlags", "Feature Flags")]
|
|
473
|
+
}),
|
|
474
|
+
/* @__PURE__ */ k(D, {
|
|
475
|
+
value: "audit-log",
|
|
476
|
+
className: "flex items-center gap-2",
|
|
477
|
+
children: [/* @__PURE__ */ O(d, { className: "h-4 w-4" }), t("bigconsole.admin.tab.auditLog", "Audit Log")]
|
|
478
|
+
})
|
|
479
|
+
]
|
|
480
|
+
}),
|
|
481
|
+
/* @__PURE__ */ O(T, {
|
|
482
|
+
value: "registry",
|
|
483
|
+
className: "mt-6",
|
|
484
|
+
children: /* @__PURE__ */ O(P, {})
|
|
485
|
+
}),
|
|
486
|
+
/* @__PURE__ */ O(T, {
|
|
487
|
+
value: "feature-flags",
|
|
488
|
+
className: "mt-6",
|
|
489
|
+
children: /* @__PURE__ */ O(F, {})
|
|
490
|
+
}),
|
|
491
|
+
/* @__PURE__ */ O(T, {
|
|
492
|
+
value: "audit-log",
|
|
493
|
+
className: "mt-6",
|
|
494
|
+
children: /* @__PURE__ */ O(I, {})
|
|
495
|
+
})
|
|
496
|
+
]
|
|
497
|
+
})]
|
|
498
|
+
})
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
//#endregion
|
|
502
|
+
export { L as AdminPage };
|
|
503
|
+
|
|
504
|
+
//# sourceMappingURL=AdminPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminPage.js","names":[],"sources":["../../../src/bigconsole/pages/AdminPage.tsx"],"sourcesContent":["/**\n * BigConsole Admin Page\n *\n * Product-specific admin surface mounted inside the platform admin-app.\n * Provides governance views for:\n * - Widget / Data-sink registry\n * - Org-level feature flags\n * - Audit log viewer\n *\n * Uses real GraphQL queries where they exist and documented placeholders\n * where backend support is still needed.\n */\n\nimport { type FC, memo, useCallback, useMemo, useState } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Badge,\n Spinner,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { LayoutDashboard, Database, Flag, ScrollText, Search, AlertCircle, RefreshCw } from 'lucide-react';\nimport { formatDistanceToNow } from 'date-fns';\nimport {\n ListDataSinksDocument,\n ListEventLogsDocument,\n type ListDataSinksQuery,\n type ListEventLogsQuery,\n} from '../../generated/wspace-operations';\nimport type { DataSink } from '../types';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ntype AdminTab = 'registry' | 'feature-flags' | 'audit-log';\n\ninterface EventLogNode {\n id: string;\n eventName: string;\n actionName?: string | null;\n status: string;\n widgetId?: string | null;\n dashboardId?: string | null;\n createdAt: string;\n errorMessage?: string | null;\n}\n\n// ============================================================================\n// PLACEHOLDER DATA\n// ============================================================================\n\ninterface FeatureFlag {\n id: string;\n key: string;\n name: string;\n description: string;\n enabled: boolean;\n scope: 'organization' | 'workspace' | 'global';\n}\n\nconst PLACEHOLDER_FEATURE_FLAGS: FeatureFlag[] = [\n {\n id: 'flag-1',\n key: 'bigconsole.ai-insights',\n name: 'AI Insights',\n description: 'Enable AI-generated insights across dashboards',\n enabled: true,\n scope: 'organization',\n },\n {\n id: 'flag-2',\n key: 'bigconsole.real-time-collaboration',\n name: 'Real-time Collaboration',\n description: 'Allow multiple users to edit dashboards simultaneously',\n enabled: false,\n scope: 'workspace',\n },\n {\n id: 'flag-3',\n key: 'bigconsole.advanced-drilldown',\n name: 'Advanced Drilldown',\n description: 'Enable cross-dashboard drilldown and parameter passing',\n enabled: true,\n scope: 'organization',\n },\n];\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction formatBytes(bytes: number | undefined | null): string {\n if (bytes === undefined || bytes === null || bytes === 0) return '0 B';\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n}\n\nfunction formatDate(iso: string | undefined | null): string {\n if (!iso) return '—';\n try {\n return formatDistanceToNow(new Date(iso), { addSuffix: true });\n } catch {\n return iso;\n }\n}\n\n// ============================================================================\n// SECTIONS\n// ============================================================================\n\nconst RegistrySection: FC = memo(function RegistrySection() {\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\n const [search, setSearch] = useState('');\n\n const {\n data: dataSinksData,\n loading: dataSinksLoading,\n error: dataSinksError,\n refetch: refetchDataSinks,\n } = useQuery<ListDataSinksQuery>(ListDataSinksDocument, {\n variables: { first: 50, search: search || undefined },\n notifyOnNetworkStatusChange: true,\n });\n\n const dataSinks = useMemo<DataSink[]>(() => {\n return (dataSinksData?.listDataSinks?.edges ?? []).map((edge) => edge.node as unknown as DataSink);\n }, [dataSinksData]);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('bigconsole.admin.registry.title', 'Widget & Data-sink Registry')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'bigconsole.admin.registry.subtitle',\n 'Browse and govern dashboards, widgets, and data sinks across the organization.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" />\n <Input\n type=\"text\"\n placeholder={tr('bigconsole.admin.registry.search', 'Search data sinks...')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9 w-full sm:w-64\"\n />\n </div>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => refetchDataSinks()}\n disabled={dataSinksLoading}\n aria-label={tr('bigconsole.admin.registry.refresh', 'Refresh')}\n >\n <RefreshCw className={`h-4 w-4 ${dataSinksLoading ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n </div>\n\n {/* Widget registry placeholder — backend query needs cross-workspace support */}\n <Card className=\"border-dashed border-border-default bg-bg-surface/50\">\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base font-medium text-text-primary flex items-center gap-2\">\n <LayoutDashboard className=\"h-4 w-4 text-text-secondary\" />\n {tr('bigconsole.admin.registry.widgets', 'Widget Registry')}\n </CardTitle>\n <CardDescription className=\"text-sm text-text-secondary\">\n {tr(\n 'bigconsole.admin.registry.widgets.description',\n 'Cross-workspace widget listing requires a backend query that supports organization-scoped pagination (listWidgets currently requires pageId).'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-start gap-3 rounded-md bg-warning-bg/10 p-3 text-sm text-warning-fg\">\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <div>\n <p className=\"font-medium\">{tr('bigconsole.admin.registry.widgets.gap.title', 'Backend gap')}</p>\n <p className=\"mt-1 text-text-secondary\">\n {tr(\n 'bigconsole.admin.registry.widgets.gap.body',\n 'Add adminBigConsoleWidgets(organizationId, first, after) to global or workspace schema, then wire it here.'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Data-sink registry — backed by listDataSinks */}\n <Card className=\"bg-bg-surface border-border-default\">\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base font-medium text-text-primary flex items-center gap-2\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n {tr('bigconsole.admin.registry.datasinks', 'Data-sink Registry')}\n </CardTitle>\n <CardDescription className=\"text-sm text-text-secondary\">\n {tr('bigconsole.admin.registry.datasinks.description', 'Live view of data sinks across the organization.')}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {dataSinksError ? (\n <div className=\"rounded-md bg-danger-bg/10 p-4 text-sm text-danger-fg\">{dataSinksError.message}</div>\n ) : dataSinksLoading && !dataSinksData ? (\n <div className=\"flex items-center justify-center py-12\">\n <Spinner className=\"h-8 w-8\" />\n </div>\n ) : dataSinks.length === 0 ? (\n <div className=\"text-center py-12 text-text-secondary text-sm\">\n {tr('bigconsole.admin.registry.datasinks.empty', 'No data sinks found.')}\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-default text-left text-text-secondary\">\n <th className=\"pb-3 pr-4 font-medium\">{tr('bigconsole.admin.registry.datasinks.name', 'Name')}</th>\n <th className=\"pb-3 pr-4 font-medium\">\n {tr('bigconsole.admin.registry.datasinks.status', 'Status')}\n </th>\n <th className=\"pb-3 pr-4 font-medium\">{tr('bigconsole.admin.registry.datasinks.size', 'Size')}</th>\n <th className=\"pb-3 pr-4 font-medium\">\n {tr('bigconsole.admin.registry.datasinks.links', 'Links')}\n </th>\n <th className=\"pb-3 pr-4 font-medium\">\n {tr('bigconsole.admin.registry.datasinks.refreshed', 'Refreshed')}\n </th>\n <th className=\"pb-3 font-medium\">{tr('bigconsole.admin.registry.datasinks.active', 'Active')}</th>\n </tr>\n </thead>\n <tbody className=\"text-text-primary\">\n {dataSinks.map((sink) => (\n <tr key={sink.id} className=\"border-b border-border-seam last:border-0\">\n <td className=\"py-3 pr-4\">\n <div className=\"font-medium\">{sink.name || sink.key}</div>\n <div className=\"text-xs text-text-tertiary\">{sink.key}</div>\n </td>\n <td className=\"py-3 pr-4\">\n <Badge variant={sink.status === 'ready' ? 'default' : 'secondary'}>{sink.status}</Badge>\n </td>\n <td className=\"py-3 pr-4 tabular-nums\">{formatBytes(sink.sizeBytes)}</td>\n <td className=\"py-3 pr-4 tabular-nums\">{sink.linkedWorkflowCount ?? 0}</td>\n <td className=\"py-3 pr-4 text-text-secondary\">{formatDate(sink.lastRefreshedAt)}</td>\n <td className=\"py-3\">\n <Badge variant={sink.isActive ? 'default' : 'outline'}>{sink.isActive ? 'Yes' : 'No'}</Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n});\n\nconst FeatureFlagsSection: FC = memo(function FeatureFlagsSection() {\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\n const [flags, setFlags] = useState<FeatureFlag[]>(PLACEHOLDER_FEATURE_FLAGS);\n\n const toggleFlag = useCallback((id: string) => {\n setFlags((prev) => prev.map((flag) => (flag.id === id ? { ...flag, enabled: !flag.enabled } : flag)));\n }, []);\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('bigconsole.admin.featureFlags.title', 'Org-level Feature Flags')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'bigconsole.admin.featureFlags.subtitle',\n 'Manage BigConsole features across organizations and workspaces.'\n )}\n </p>\n </div>\n\n <div className=\"flex items-start gap-3 rounded-md bg-info-bg/10 p-3 text-sm text-info-fg\">\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <div>\n <p className=\"font-medium\">{tr('bigconsole.admin.featureFlags.placeholder.title', 'Placeholder data')}</p>\n <p className=\"mt-1 text-text-secondary\">\n {tr(\n 'bigconsole.admin.featureFlags.placeholder.body',\n 'Wire this to the feature-flag service admin API (list/upsert organization feature flags) when available.'\n )}\n </p>\n </div>\n </div>\n\n <div className=\"grid gap-4\">\n {flags.map((flag) => (\n <Card key={flag.id} className=\"bg-bg-surface border-border-default\">\n <CardContent className=\"p-4\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Flag className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"font-medium text-text-primary\">{flag.name}</span>\n <Badge variant=\"outline\">{flag.scope}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary\">{flag.description}</p>\n <code className=\"text-xs text-text-tertiary bg-bg-sunken px-1.5 py-0.5 rounded\">{flag.key}</code>\n </div>\n <Button\n variant={flag.enabled ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => toggleFlag(flag.id)}\n className=\"shrink-0\"\n >\n {flag.enabled\n ? tr('bigconsole.admin.featureFlags.enabled', 'Enabled')\n : tr('bigconsole.admin.featureFlags.disabled', 'Disabled')}\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n});\n\nconst AuditLogSection: FC = memo(function AuditLogSection() {\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\n const [statusFilter, setStatusFilter] = useState<string>('all');\n\n const {\n data: logsData,\n loading: logsLoading,\n error: logsError,\n refetch: refetchLogs,\n } = useQuery<ListEventLogsQuery>(ListEventLogsDocument, {\n variables: {\n first: 50,\n status: statusFilter === 'all' ? undefined : (statusFilter as 'success' | 'failed'),\n },\n notifyOnNetworkStatusChange: true,\n });\n\n const logs = useMemo<EventLogNode[]>(() => {\n return (logsData?.listEventLogs?.edges ?? []).map((edge) => edge.node as unknown as EventLogNode);\n }, [logsData]);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('bigconsole.admin.auditLog.title', 'Audit Log Viewer')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'bigconsole.admin.auditLog.subtitle',\n 'Widget event delivery log. Organization-level audit trail requires a dedicated admin audit query.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-focus-ring\"\n >\n <option value=\"all\">{tr('bigconsole.admin.auditLog.filter.all', 'All statuses')}</option>\n <option value=\"success\">{tr('bigconsole.admin.auditLog.filter.success', 'Success')}</option>\n <option value=\"failed\">{tr('bigconsole.admin.auditLog.filter.failed', 'Failed')}</option>\n </select>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => refetchLogs()}\n disabled={logsLoading}\n aria-label={tr('bigconsole.admin.auditLog.refresh', 'Refresh')}\n >\n <RefreshCw className={`h-4 w-4 ${logsLoading ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n </div>\n\n <Card className=\"bg-bg-surface border-border-default\">\n <CardContent className=\"p-0\">\n {logsError ? (\n <div className=\"rounded-md bg-danger-bg/10 p-4 text-sm text-danger-fg\">{logsError.message}</div>\n ) : logsLoading && !logsData ? (\n <div className=\"flex items-center justify-center py-12\">\n <Spinner className=\"h-8 w-8\" />\n </div>\n ) : logs.length === 0 ? (\n <div className=\"text-center py-12 text-text-secondary text-sm\">\n {tr('bigconsole.admin.auditLog.empty', 'No audit events found.')}\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-default text-left text-text-secondary\">\n <th className=\"pb-3 pr-4 font-medium p-4\">{tr('bigconsole.admin.auditLog.event', 'Event')}</th>\n <th className=\"pb-3 pr-4 font-medium\">{tr('bigconsole.admin.auditLog.action', 'Action')}</th>\n <th className=\"pb-3 pr-4 font-medium\">{tr('bigconsole.admin.auditLog.status', 'Status')}</th>\n <th className=\"pb-3 pr-4 font-medium\">{tr('bigconsole.admin.auditLog.widget', 'Widget')}</th>\n <th className=\"pb-3 pr-4 font-medium\">{tr('bigconsole.admin.auditLog.dashboard', 'Dashboard')}</th>\n <th className=\"pb-3 font-medium\">{tr('bigconsole.admin.auditLog.time', 'Time')}</th>\n </tr>\n </thead>\n <tbody className=\"text-text-primary\">\n {logs.map((log) => (\n <tr key={log.id} className=\"border-b border-border-seam last:border-0\">\n <td className=\"py-3 pr-4 p-4\">\n <div className=\"font-medium\">{log.eventName}</div>\n {log.errorMessage && (\n <div className=\"text-xs text-danger-fg mt-1 max-w-xs truncate\">{log.errorMessage}</div>\n )}\n </td>\n <td className=\"py-3 pr-4\">{log.actionName || '—'}</td>\n <td className=\"py-3 pr-4\">\n <Badge\n variant={\n log.status === 'success' ? 'default' : log.status === 'failed' ? 'destructive' : 'secondary'\n }\n >\n {log.status}\n </Badge>\n </td>\n <td className=\"py-3 pr-4 font-mono text-xs text-text-tertiary\">{log.widgetId || '—'}</td>\n <td className=\"py-3 pr-4 font-mono text-xs text-text-tertiary\">{log.dashboardId || '—'}</td>\n <td className=\"py-3 text-text-secondary\">{formatDate(log.createdAt)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n});\n\n// ============================================================================\n// PAGE\n// ============================================================================\n\nexport const AdminPage: FC = memo(function AdminPage() {\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\n const [activeTab, setActiveTab] = useState<AdminTab>('registry');\n\n return (\n <div className=\"min-h-screen bg-bg-base p-6\">\n <div className=\"mx-auto max-w-7xl space-y-6\">\n <div className=\"space-y-1\">\n <h1 className=\"text-2xl font-bold text-text-primary\">{tr('bigconsole.admin.title', 'BigConsole Admin')}</h1>\n <p className=\"text-sm text-text-secondary\">\n {tr('bigconsole.admin.description', 'Product-specific administration and governance for BigConsole.')}\n </p>\n </div>\n\n <Tabs value={activeTab} onValueChange={(value) => setActiveTab(value as AdminTab)}>\n <TabsList className=\"bg-bg-surface border border-border-default\">\n <TabsTrigger value=\"registry\" className=\"flex items-center gap-2\">\n <LayoutDashboard className=\"h-4 w-4\" />\n {tr('bigconsole.admin.tab.registry', 'Registry')}\n </TabsTrigger>\n <TabsTrigger value=\"feature-flags\" className=\"flex items-center gap-2\">\n <Flag className=\"h-4 w-4\" />\n {tr('bigconsole.admin.tab.featureFlags', 'Feature Flags')}\n </TabsTrigger>\n <TabsTrigger value=\"audit-log\" className=\"flex items-center gap-2\">\n <ScrollText className=\"h-4 w-4\" />\n {tr('bigconsole.admin.tab.auditLog', 'Audit Log')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"registry\" className=\"mt-6\">\n <RegistrySection />\n </TabsContent>\n <TabsContent value=\"feature-flags\" className=\"mt-6\">\n <FeatureFlagsSection />\n </TabsContent>\n <TabsContent value=\"audit-log\" className=\"mt-6\">\n <AuditLogSection />\n </TabsContent>\n </Tabs>\n </div>\n </div>\n );\n});\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,8 @@ import { useBigConsole as t } from "./bigconsole/context/BigConsoleContext.js";
|
|
|
3
3
|
import n from "./bigconsole/components/DrilldownModal.js";
|
|
4
4
|
import r from "./bigconsole/hooks/useDrilldown.js";
|
|
5
5
|
import { BigConsoleRoot as i } from "./bigconsole/BigConsoleRoot.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { AdminRoot as a } from "./bigconsole/AdminRoot.js";
|
|
7
|
+
import { gatherPageContext as o, resolveBigConsoleConversationContext as s } from "./bigconsole/assistant/pageContext.js";
|
|
8
|
+
import { useSandboxAssistantTransport as c } from "./bigconsole/assistant/createSandboxAssistantTransport.js";
|
|
8
9
|
import "./bigconsole/index.js";
|
|
9
|
-
export { i as BigConsoleRoot, n as DrilldownModal,
|
|
10
|
+
export { a as AdminRoot, i as BigConsoleRoot, n as DrilldownModal, o as gatherPageContext, s as resolveBigConsoleConversationContext, t as useBigConsole, r as useDrilldown, e as useDrilldownStore, c as useSandboxAssistantTransport };
|