@fonderie/react-admin-screens 0.1.0
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/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/index.cjs +507 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +51 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +473 -0
- package/dist/index.js.map +1 -0
- package/package.json +73 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
// src/screens/AdminShell.tsx
|
|
2
|
+
import { ConfigEditorScreen, ConfigListScreen } from "@fonderie/react-config-admin-screens";
|
|
3
|
+
import { TemplateEditorScreen, TemplateListScreen } from "@fonderie/react-courier-admin-screens";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
|
|
6
|
+
// src/styles.ts
|
|
7
|
+
var styles = {
|
|
8
|
+
shell: {
|
|
9
|
+
display: "flex",
|
|
10
|
+
minHeight: "100vh",
|
|
11
|
+
fontFamily: "system-ui, sans-serif",
|
|
12
|
+
color: "#111"
|
|
13
|
+
},
|
|
14
|
+
nav: { width: 220, borderRight: "1px solid #eee", padding: 16, flexShrink: 0 },
|
|
15
|
+
navGroup: {
|
|
16
|
+
fontSize: 11,
|
|
17
|
+
textTransform: "uppercase",
|
|
18
|
+
letterSpacing: 0.6,
|
|
19
|
+
color: "#888",
|
|
20
|
+
margin: "16px 0 6px"
|
|
21
|
+
},
|
|
22
|
+
navItem: {
|
|
23
|
+
display: "block",
|
|
24
|
+
width: "100%",
|
|
25
|
+
textAlign: "left",
|
|
26
|
+
background: "none",
|
|
27
|
+
border: "none",
|
|
28
|
+
borderRadius: 6,
|
|
29
|
+
padding: "6px 8px",
|
|
30
|
+
cursor: "pointer",
|
|
31
|
+
fontSize: 14,
|
|
32
|
+
color: "#111"
|
|
33
|
+
},
|
|
34
|
+
navItemActive: { background: "#f3f4f6", fontWeight: 600 },
|
|
35
|
+
main: { flex: 1, padding: 24, maxWidth: 960 },
|
|
36
|
+
container: { padding: 24, maxWidth: 960 },
|
|
37
|
+
title: { fontSize: 20, fontWeight: 700, marginTop: 0, marginBottom: 12 },
|
|
38
|
+
subtitle: { fontSize: 15, fontWeight: 600, marginTop: 24, marginBottom: 8 },
|
|
39
|
+
status: { padding: 12, color: "#666" },
|
|
40
|
+
error: { color: "#e11d48", marginBottom: 12, fontSize: 14 },
|
|
41
|
+
ok: { color: "#15803d", fontWeight: 600 },
|
|
42
|
+
bad: { color: "#e11d48", fontWeight: 600 },
|
|
43
|
+
advice: { color: "#b45309" },
|
|
44
|
+
muted: { color: "#666", fontSize: 13 },
|
|
45
|
+
mono: { fontFamily: "ui-monospace, monospace", fontSize: 13 },
|
|
46
|
+
table: { width: "100%", borderCollapse: "collapse", fontSize: 14 },
|
|
47
|
+
th: {
|
|
48
|
+
textAlign: "left",
|
|
49
|
+
borderBottom: "1px solid #ddd",
|
|
50
|
+
padding: "6px 8px",
|
|
51
|
+
fontWeight: 600,
|
|
52
|
+
color: "#444"
|
|
53
|
+
},
|
|
54
|
+
td: { borderBottom: "1px solid #eee", padding: "6px 8px", verticalAlign: "top" },
|
|
55
|
+
list: { listStyle: "none", padding: 0, margin: 0 },
|
|
56
|
+
row: { borderBottom: "1px solid #eee", padding: "8px 0" },
|
|
57
|
+
badge: {
|
|
58
|
+
display: "inline-block",
|
|
59
|
+
borderRadius: 999,
|
|
60
|
+
padding: "1px 8px",
|
|
61
|
+
fontSize: 12,
|
|
62
|
+
background: "#f3f4f6"
|
|
63
|
+
},
|
|
64
|
+
button: {
|
|
65
|
+
background: "none",
|
|
66
|
+
border: "1px solid #ddd",
|
|
67
|
+
borderRadius: 8,
|
|
68
|
+
padding: "4px 10px",
|
|
69
|
+
cursor: "pointer",
|
|
70
|
+
fontSize: 13
|
|
71
|
+
},
|
|
72
|
+
toolbar: { display: "flex", gap: 8, alignItems: "center", marginBottom: 12 }
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// src/screens/AdminLogScreen.tsx
|
|
76
|
+
import { useAdminLog } from "@fonderie/react-admin";
|
|
77
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
78
|
+
function AdminLogScreen({ client, pageSize = 50 }) {
|
|
79
|
+
const { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {
|
|
80
|
+
limit: pageSize
|
|
81
|
+
});
|
|
82
|
+
return /* @__PURE__ */ jsxs("div", { style: styles.container, children: [
|
|
83
|
+
/* @__PURE__ */ jsxs("div", { style: styles.toolbar, children: [
|
|
84
|
+
/* @__PURE__ */ jsx("h1", { style: { ...styles.title, marginBottom: 0 }, children: "Admin log" }),
|
|
85
|
+
/* @__PURE__ */ jsx(
|
|
86
|
+
"button",
|
|
87
|
+
{
|
|
88
|
+
type: "button",
|
|
89
|
+
style: styles.button,
|
|
90
|
+
onClick: () => void refresh(),
|
|
91
|
+
disabled: isLoading,
|
|
92
|
+
children: "Refresh"
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
] }),
|
|
96
|
+
error ? /* @__PURE__ */ jsx("p", { style: styles.error, role: "alert", children: error.status === 404 ? "The admin log is off \u2014 give AdminModule a store." : error.explanation }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
97
|
+
/* @__PURE__ */ jsxs("table", { style: styles.table, children: [
|
|
98
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
99
|
+
/* @__PURE__ */ jsx("th", { style: styles.th, children: "When" }),
|
|
100
|
+
/* @__PURE__ */ jsx("th", { style: styles.th, children: "Actor" }),
|
|
101
|
+
/* @__PURE__ */ jsx("th", { style: styles.th, children: "Request" }),
|
|
102
|
+
/* @__PURE__ */ jsx("th", { style: styles.th, children: "Status" }),
|
|
103
|
+
/* @__PURE__ */ jsx("th", { style: styles.th, children: "Module" })
|
|
104
|
+
] }) }),
|
|
105
|
+
/* @__PURE__ */ jsx("tbody", { children: entries.map((e) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
106
|
+
/* @__PURE__ */ jsx("td", { style: { ...styles.td, ...styles.muted }, children: new Date(e.at).toLocaleString() }),
|
|
107
|
+
/* @__PURE__ */ jsx("td", { style: styles.td, children: e.actor }),
|
|
108
|
+
/* @__PURE__ */ jsxs("td", { style: { ...styles.td, ...styles.mono }, children: [
|
|
109
|
+
e.method,
|
|
110
|
+
" ",
|
|
111
|
+
e.path
|
|
112
|
+
] }),
|
|
113
|
+
/* @__PURE__ */ jsxs("td", { style: styles.td, children: [
|
|
114
|
+
/* @__PURE__ */ jsx("span", { style: e.status >= 400 ? styles.bad : styles.ok, children: e.status }),
|
|
115
|
+
" ",
|
|
116
|
+
/* @__PURE__ */ jsxs("span", { style: styles.muted, children: [
|
|
117
|
+
e.durationMs,
|
|
118
|
+
" ms"
|
|
119
|
+
] })
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx("td", { style: { ...styles.td, ...styles.muted }, children: e.module })
|
|
122
|
+
] }, e.id)) })
|
|
123
|
+
] }),
|
|
124
|
+
isLoading ? /* @__PURE__ */ jsx("p", { style: styles.status, children: "Loading\u2026" }) : null,
|
|
125
|
+
hasMore && !isLoading ? /* @__PURE__ */ jsx(
|
|
126
|
+
"button",
|
|
127
|
+
{
|
|
128
|
+
type: "button",
|
|
129
|
+
style: { ...styles.button, marginTop: 12 },
|
|
130
|
+
onClick: () => void loadMore(),
|
|
131
|
+
children: "Load more"
|
|
132
|
+
}
|
|
133
|
+
) : null
|
|
134
|
+
] })
|
|
135
|
+
] });
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// src/screens/AttentionScreen.tsx
|
|
139
|
+
import { useAttention } from "@fonderie/react-admin";
|
|
140
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
141
|
+
function AttentionScreen({ client }) {
|
|
142
|
+
const { attention, isLoading, error, refresh } = useAttention(client);
|
|
143
|
+
return /* @__PURE__ */ jsxs2("div", { style: styles.container, children: [
|
|
144
|
+
/* @__PURE__ */ jsxs2("div", { style: styles.toolbar, children: [
|
|
145
|
+
/* @__PURE__ */ jsx2("h1", { style: { ...styles.title, marginBottom: 0 }, children: "Attention" }),
|
|
146
|
+
/* @__PURE__ */ jsx2(
|
|
147
|
+
"button",
|
|
148
|
+
{
|
|
149
|
+
type: "button",
|
|
150
|
+
style: styles.button,
|
|
151
|
+
onClick: () => void refresh(),
|
|
152
|
+
disabled: isLoading,
|
|
153
|
+
children: "Refresh"
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
] }),
|
|
157
|
+
isLoading && !attention ? /* @__PURE__ */ jsx2("p", { style: styles.status, children: "Running the checks\u2026" }) : error ? /* @__PURE__ */ jsx2("p", { style: styles.error, role: "alert", children: error.explanation }) : attention?.items.length === 0 ? /* @__PURE__ */ jsxs2("p", { style: styles.ok, children: [
|
|
158
|
+
"Nothing needs you. Checked ",
|
|
159
|
+
new Date(attention.generatedAt).toLocaleString(),
|
|
160
|
+
"."
|
|
161
|
+
] }) : /* @__PURE__ */ jsx2("ul", { style: styles.list, children: attention?.items.map((item) => /* @__PURE__ */ jsxs2("li", { style: styles.row, children: [
|
|
162
|
+
/* @__PURE__ */ jsx2("span", { style: item.severity === "error" ? styles.bad : styles.advice, children: item.severity === "error" ? "error" : "advice" }),
|
|
163
|
+
" ",
|
|
164
|
+
/* @__PURE__ */ jsx2("span", { style: styles.mono, children: item.source }),
|
|
165
|
+
" \u2014 ",
|
|
166
|
+
item.message
|
|
167
|
+
] }, `${item.source}:${item.message}`)) })
|
|
168
|
+
] });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// src/screens/ConfigScreen.tsx
|
|
172
|
+
import { useAdminConfig } from "@fonderie/react-admin";
|
|
173
|
+
import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
174
|
+
function ConfigScreen({ client }) {
|
|
175
|
+
const { report, isLoading, error } = useAdminConfig(client);
|
|
176
|
+
return /* @__PURE__ */ jsxs3("div", { style: styles.container, children: [
|
|
177
|
+
/* @__PURE__ */ jsx3("h1", { style: styles.title, children: "Configuration" }),
|
|
178
|
+
isLoading ? /* @__PURE__ */ jsx3("p", { style: styles.status, children: "Loading\u2026" }) : error ? /* @__PURE__ */ jsx3("p", { style: styles.error, role: "alert", children: error.explanation }) : report ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
179
|
+
/* @__PURE__ */ jsx3("h2", { style: styles.subtitle, children: "Readiness" }),
|
|
180
|
+
/* @__PURE__ */ jsx3("ul", { style: styles.list, children: report.modules.map((m) => /* @__PURE__ */ jsxs3("li", { style: styles.row, children: [
|
|
181
|
+
/* @__PURE__ */ jsx3("span", { style: styles.mono, children: m.name }),
|
|
182
|
+
" ",
|
|
183
|
+
m.problems.length === 0 ? /* @__PURE__ */ jsx3("span", { style: styles.ok, children: "ok" }) : m.problems.map((p) => /* @__PURE__ */ jsx3(
|
|
184
|
+
"div",
|
|
185
|
+
{
|
|
186
|
+
style: p.severity === "error" ? styles.bad : styles.advice,
|
|
187
|
+
children: p.message
|
|
188
|
+
},
|
|
189
|
+
p.message
|
|
190
|
+
))
|
|
191
|
+
] }, m.name)) }),
|
|
192
|
+
/* @__PURE__ */ jsx3("h2", { style: styles.subtitle, children: "Environment" }),
|
|
193
|
+
report.env.length === 0 ? /* @__PURE__ */ jsx3("p", { style: styles.muted, children: "No variables declared \u2014 pass `env` to AdminModule." }) : /* @__PURE__ */ jsx3("ul", { style: styles.list, children: report.env.map((e) => /* @__PURE__ */ jsxs3("li", { style: styles.row, children: [
|
|
194
|
+
/* @__PURE__ */ jsx3("span", { style: styles.mono, children: e.name }),
|
|
195
|
+
" ",
|
|
196
|
+
e.set ? /* @__PURE__ */ jsx3("span", { style: styles.ok, children: "set" }) : /* @__PURE__ */ jsx3("span", { style: styles.bad, children: "missing" })
|
|
197
|
+
] }, e.name)) })
|
|
198
|
+
] }) : null
|
|
199
|
+
] });
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// src/screens/DoctorScreen.tsx
|
|
203
|
+
import { useDoctor } from "@fonderie/react-admin";
|
|
204
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
205
|
+
function DoctorScreen({ client }) {
|
|
206
|
+
const { report, isLoading, error, refresh } = useDoctor(client);
|
|
207
|
+
return /* @__PURE__ */ jsxs4("div", { style: styles.container, children: [
|
|
208
|
+
/* @__PURE__ */ jsxs4("div", { style: styles.toolbar, children: [
|
|
209
|
+
/* @__PURE__ */ jsx4("h1", { style: { ...styles.title, marginBottom: 0 }, children: "Doctor" }),
|
|
210
|
+
/* @__PURE__ */ jsx4(
|
|
211
|
+
"button",
|
|
212
|
+
{
|
|
213
|
+
type: "button",
|
|
214
|
+
style: styles.button,
|
|
215
|
+
onClick: () => void refresh(),
|
|
216
|
+
disabled: isLoading,
|
|
217
|
+
children: "Run again"
|
|
218
|
+
}
|
|
219
|
+
),
|
|
220
|
+
report && !isLoading ? /* @__PURE__ */ jsx4("span", { style: report.ok ? styles.ok : styles.bad, children: report.ok ? "all checks pass" : "a check failed" }) : null
|
|
221
|
+
] }),
|
|
222
|
+
isLoading && !report ? /* @__PURE__ */ jsx4("p", { style: styles.status, children: "Running the checks\u2026" }) : error ? /* @__PURE__ */ jsx4("p", { style: styles.error, role: "alert", children: error.explanation }) : /* @__PURE__ */ jsx4("ul", { style: styles.list, children: report?.checks.map((c) => /* @__PURE__ */ jsxs4("li", { style: styles.row, children: [
|
|
223
|
+
/* @__PURE__ */ jsx4("span", { style: c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad, children: c.skipped ? "skipped" : c.ok ? "ok" : "failed" }),
|
|
224
|
+
" ",
|
|
225
|
+
/* @__PURE__ */ jsx4("span", { style: styles.mono, children: c.name }),
|
|
226
|
+
" ",
|
|
227
|
+
/* @__PURE__ */ jsxs4("span", { style: styles.muted, children: [
|
|
228
|
+
c.module,
|
|
229
|
+
" \xB7 ",
|
|
230
|
+
c.durationMs,
|
|
231
|
+
" ms"
|
|
232
|
+
] }),
|
|
233
|
+
c.skipped ? /* @__PURE__ */ jsx4("div", { style: styles.muted, children: c.skipped }) : null,
|
|
234
|
+
c.findings.map((f) => /* @__PURE__ */ jsx4("div", { style: c.ok ? styles.advice : styles.bad, children: f }, f))
|
|
235
|
+
] }, c.name)) })
|
|
236
|
+
] });
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// src/screens/ModulesScreen.tsx
|
|
240
|
+
import { useManifest } from "@fonderie/react-admin";
|
|
241
|
+
import { Fragment as Fragment3, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
242
|
+
function ModulesScreen({ client }) {
|
|
243
|
+
const { manifest, isLoading, error } = useManifest(client);
|
|
244
|
+
return /* @__PURE__ */ jsxs5("div", { style: styles.container, children: [
|
|
245
|
+
/* @__PURE__ */ jsx5("h1", { style: styles.title, children: "Modules" }),
|
|
246
|
+
isLoading ? /* @__PURE__ */ jsx5("p", { style: styles.status, children: "Loading\u2026" }) : error ? /* @__PURE__ */ jsx5("p", { style: styles.error, role: "alert", children: error.explanation }) : manifest ? /* @__PURE__ */ jsxs5(Fragment3, { children: [
|
|
247
|
+
/* @__PURE__ */ jsxs5("p", { style: styles.muted, children: [
|
|
248
|
+
manifest.env,
|
|
249
|
+
" \xB7 admin ",
|
|
250
|
+
manifest.admin.version,
|
|
251
|
+
" \xB7 admin log",
|
|
252
|
+
" ",
|
|
253
|
+
manifest.admin.log ? "on" : "off",
|
|
254
|
+
" \xB7 ",
|
|
255
|
+
manifest.routes.length,
|
|
256
|
+
" routes"
|
|
257
|
+
] }),
|
|
258
|
+
/* @__PURE__ */ jsxs5("table", { style: styles.table, children: [
|
|
259
|
+
/* @__PURE__ */ jsx5("thead", { children: /* @__PURE__ */ jsxs5("tr", { children: [
|
|
260
|
+
/* @__PURE__ */ jsx5("th", { style: styles.th, children: "Module" }),
|
|
261
|
+
/* @__PURE__ */ jsx5("th", { style: styles.th, children: "Version" }),
|
|
262
|
+
/* @__PURE__ */ jsx5("th", { style: styles.th, children: "Readiness" }),
|
|
263
|
+
/* @__PURE__ */ jsx5("th", { style: styles.th, children: "Describes admin" })
|
|
264
|
+
] }) }),
|
|
265
|
+
/* @__PURE__ */ jsx5("tbody", { children: manifest.modules.map((m) => /* @__PURE__ */ jsxs5("tr", { children: [
|
|
266
|
+
/* @__PURE__ */ jsx5("td", { style: { ...styles.td, ...styles.mono }, children: m.name }),
|
|
267
|
+
/* @__PURE__ */ jsx5("td", { style: styles.td, children: m.version ?? /* @__PURE__ */ jsx5("span", { style: styles.muted, children: "not reported" }) }),
|
|
268
|
+
/* @__PURE__ */ jsxs5("td", { style: styles.td, children: [
|
|
269
|
+
m.readiness.ok ? /* @__PURE__ */ jsx5("span", { style: styles.ok, children: "ok" }) : /* @__PURE__ */ jsx5("span", { style: styles.bad, children: "error" }),
|
|
270
|
+
m.readiness.problems.map((p) => /* @__PURE__ */ jsx5(
|
|
271
|
+
"div",
|
|
272
|
+
{
|
|
273
|
+
style: p.severity === "error" ? styles.bad : styles.advice,
|
|
274
|
+
children: p.message
|
|
275
|
+
},
|
|
276
|
+
p.message
|
|
277
|
+
))
|
|
278
|
+
] }),
|
|
279
|
+
/* @__PURE__ */ jsx5("td", { style: styles.td, children: m.describesAdmin ? "yes" : /* @__PURE__ */ jsx5("span", { style: styles.muted, children: "no" }) })
|
|
280
|
+
] }, m.name)) })
|
|
281
|
+
] })
|
|
282
|
+
] }) : null
|
|
283
|
+
] });
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// src/screens/RoutesScreen.tsx
|
|
287
|
+
import { useAdminRoutes } from "@fonderie/react-admin";
|
|
288
|
+
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
289
|
+
function RoutesScreen({ client }) {
|
|
290
|
+
const { report, isLoading, error } = useAdminRoutes(client);
|
|
291
|
+
return /* @__PURE__ */ jsxs6("div", { style: styles.container, children: [
|
|
292
|
+
/* @__PURE__ */ jsx6("h1", { style: styles.title, children: "Routes" }),
|
|
293
|
+
isLoading ? /* @__PURE__ */ jsx6("p", { style: styles.status, children: "Loading\u2026" }) : error ? /* @__PURE__ */ jsx6("p", { style: styles.error, role: "alert", children: error.explanation }) : /* @__PURE__ */ jsxs6("table", { style: styles.table, children: [
|
|
294
|
+
/* @__PURE__ */ jsx6("thead", { children: /* @__PURE__ */ jsxs6("tr", { children: [
|
|
295
|
+
/* @__PURE__ */ jsx6("th", { style: styles.th, children: "Method" }),
|
|
296
|
+
/* @__PURE__ */ jsx6("th", { style: styles.th, children: "Path" }),
|
|
297
|
+
/* @__PURE__ */ jsx6("th", { style: styles.th, children: "Guard" }),
|
|
298
|
+
/* @__PURE__ */ jsx6("th", { style: styles.th, children: "Module" })
|
|
299
|
+
] }) }),
|
|
300
|
+
/* @__PURE__ */ jsx6("tbody", { children: report?.routes.map((r) => /* @__PURE__ */ jsxs6("tr", { children: [
|
|
301
|
+
/* @__PURE__ */ jsx6("td", { style: { ...styles.td, ...styles.mono }, children: r.method }),
|
|
302
|
+
/* @__PURE__ */ jsx6("td", { style: { ...styles.td, ...styles.mono }, children: r.path }),
|
|
303
|
+
/* @__PURE__ */ jsx6("td", { style: styles.td, children: /* @__PURE__ */ jsx6("span", { style: styles.badge, children: r.guard }) }),
|
|
304
|
+
/* @__PURE__ */ jsx6("td", { style: { ...styles.td, ...styles.muted }, children: r.module ?? "application" })
|
|
305
|
+
] }, `${r.method} ${r.path}`)) })
|
|
306
|
+
] })
|
|
307
|
+
] });
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/screens/TokensScreen.tsx
|
|
311
|
+
import { useAdminTokens } from "@fonderie/react-admin";
|
|
312
|
+
import { Fragment as Fragment4, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
313
|
+
function TokensScreen({ client }) {
|
|
314
|
+
const { report, isLoading, error } = useAdminTokens(client);
|
|
315
|
+
return /* @__PURE__ */ jsxs7("div", { style: styles.container, children: [
|
|
316
|
+
/* @__PURE__ */ jsx7("h1", { style: styles.title, children: "Access" }),
|
|
317
|
+
isLoading ? /* @__PURE__ */ jsx7("p", { style: styles.status, children: "Loading\u2026" }) : error ? /* @__PURE__ */ jsx7("p", { style: styles.error, role: "alert", children: error.explanation }) : report ? /* @__PURE__ */ jsxs7(Fragment4, { children: [
|
|
318
|
+
/* @__PURE__ */ jsx7("h2", { style: styles.subtitle, children: "Admin token" }),
|
|
319
|
+
/* @__PURE__ */ jsxs7("p", { children: [
|
|
320
|
+
report.admin.ok ? /* @__PURE__ */ jsx7("span", { style: styles.ok, children: "strong" }) : /* @__PURE__ */ jsx7("span", { style: styles.bad, children: "weak" }),
|
|
321
|
+
report.admin.problems.map((p) => /* @__PURE__ */ jsx7("div", { style: styles.bad, children: p.message }, p.message))
|
|
322
|
+
] }),
|
|
323
|
+
/* @__PURE__ */ jsx7("h2", { style: styles.subtitle, children: "Legacy per-brick tokens" }),
|
|
324
|
+
report.legacy.length === 0 ? /* @__PURE__ */ jsx7("p", { style: styles.muted, children: "None \u2014 every brick's admin surface goes through this token." }) : /* @__PURE__ */ jsx7("ul", { style: styles.list, children: report.legacy.map((l) => /* @__PURE__ */ jsxs7("li", { style: styles.row, children: [
|
|
325
|
+
/* @__PURE__ */ jsx7("span", { style: styles.mono, children: l.module }),
|
|
326
|
+
" ",
|
|
327
|
+
/* @__PURE__ */ jsx7("span", { style: styles.muted, children: "still registers its standalone routes with its own token (deprecated)" })
|
|
328
|
+
] }, l.module)) })
|
|
329
|
+
] }) : null
|
|
330
|
+
] });
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// src/screens/AdminShell.tsx
|
|
334
|
+
import { Fragment as Fragment5, jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
335
|
+
var NAV = [
|
|
336
|
+
{ group: "Today", items: [{ page: "attention", label: "Attention" }] },
|
|
337
|
+
{
|
|
338
|
+
group: "System",
|
|
339
|
+
items: [
|
|
340
|
+
{ page: "modules", label: "Modules" },
|
|
341
|
+
{ page: "config", label: "Configuration" },
|
|
342
|
+
{ page: "doctor", label: "Doctor" },
|
|
343
|
+
{ page: "routes", label: "Routes" }
|
|
344
|
+
]
|
|
345
|
+
},
|
|
346
|
+
{ group: "Settings", items: [{ page: "settings", label: "Config & secrets", needs: "config" }] },
|
|
347
|
+
{ group: "Messaging", items: [{ page: "templates", label: "Templates", needs: "courier" }] },
|
|
348
|
+
{
|
|
349
|
+
group: "Activity",
|
|
350
|
+
items: [
|
|
351
|
+
{ page: "log", label: "Admin log" },
|
|
352
|
+
{ page: "tokens", label: "Access" }
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
];
|
|
356
|
+
function AdminShell({
|
|
357
|
+
client,
|
|
358
|
+
configClient,
|
|
359
|
+
courierClient,
|
|
360
|
+
environment,
|
|
361
|
+
page,
|
|
362
|
+
onNavigate
|
|
363
|
+
}) {
|
|
364
|
+
const [own, setOwn] = useState("attention");
|
|
365
|
+
const current = page ?? own;
|
|
366
|
+
const go = (p) => {
|
|
367
|
+
if (onNavigate) onNavigate(p);
|
|
368
|
+
if (page === void 0) setOwn(p);
|
|
369
|
+
};
|
|
370
|
+
const [editing, setEditing] = useState(null);
|
|
371
|
+
const has = { config: Boolean(configClient), courier: Boolean(courierClient) };
|
|
372
|
+
let body;
|
|
373
|
+
switch (current) {
|
|
374
|
+
case "attention":
|
|
375
|
+
body = /* @__PURE__ */ jsx8(AttentionScreen, { client });
|
|
376
|
+
break;
|
|
377
|
+
case "modules":
|
|
378
|
+
body = /* @__PURE__ */ jsx8(ModulesScreen, { client });
|
|
379
|
+
break;
|
|
380
|
+
case "doctor":
|
|
381
|
+
body = /* @__PURE__ */ jsx8(DoctorScreen, { client });
|
|
382
|
+
break;
|
|
383
|
+
case "config":
|
|
384
|
+
body = /* @__PURE__ */ jsx8(ConfigScreen, { client });
|
|
385
|
+
break;
|
|
386
|
+
case "routes":
|
|
387
|
+
body = /* @__PURE__ */ jsx8(RoutesScreen, { client });
|
|
388
|
+
break;
|
|
389
|
+
case "tokens":
|
|
390
|
+
body = /* @__PURE__ */ jsx8(TokensScreen, { client });
|
|
391
|
+
break;
|
|
392
|
+
case "log":
|
|
393
|
+
body = /* @__PURE__ */ jsx8(AdminLogScreen, { client });
|
|
394
|
+
break;
|
|
395
|
+
case "settings":
|
|
396
|
+
body = !configClient ? /* @__PURE__ */ jsx8("p", { style: styles.status, children: "Pass a ConfigAdminClient to manage config and secrets here." }) : editing && editing.kind !== "template" ? /* @__PURE__ */ jsxs8(Fragment5, { children: [
|
|
397
|
+
/* @__PURE__ */ jsx8("button", { type: "button", style: styles.button, onClick: () => setEditing(null), children: "\u2190 Back" }),
|
|
398
|
+
/* @__PURE__ */ jsx8(
|
|
399
|
+
ConfigEditorScreen,
|
|
400
|
+
{
|
|
401
|
+
client: configClient,
|
|
402
|
+
kind: editing.kind,
|
|
403
|
+
configKey: editing.key,
|
|
404
|
+
...environment !== void 0 ? { environment } : {},
|
|
405
|
+
onSaved: () => setEditing(null)
|
|
406
|
+
}
|
|
407
|
+
)
|
|
408
|
+
] }) : /* @__PURE__ */ jsx8(
|
|
409
|
+
ConfigListScreen,
|
|
410
|
+
{
|
|
411
|
+
client: configClient,
|
|
412
|
+
...environment !== void 0 ? { environment } : {},
|
|
413
|
+
onSelectConfig: (key) => setEditing({ kind: "config", key }),
|
|
414
|
+
onSelectSecret: (key) => setEditing({ kind: "secret", key })
|
|
415
|
+
}
|
|
416
|
+
);
|
|
417
|
+
break;
|
|
418
|
+
case "templates":
|
|
419
|
+
body = !courierClient ? /* @__PURE__ */ jsx8("p", { style: styles.status, children: "Pass a CourierAdminClient to manage templates here." }) : editing?.kind === "template" ? /* @__PURE__ */ jsxs8(Fragment5, { children: [
|
|
420
|
+
/* @__PURE__ */ jsx8("button", { type: "button", style: styles.button, onClick: () => setEditing(null), children: "\u2190 Back" }),
|
|
421
|
+
/* @__PURE__ */ jsx8(
|
|
422
|
+
TemplateEditorScreen,
|
|
423
|
+
{
|
|
424
|
+
client: courierClient,
|
|
425
|
+
type: editing.type,
|
|
426
|
+
onSaved: () => setEditing(null)
|
|
427
|
+
}
|
|
428
|
+
)
|
|
429
|
+
] }) : /* @__PURE__ */ jsx8(
|
|
430
|
+
TemplateListScreen,
|
|
431
|
+
{
|
|
432
|
+
client: courierClient,
|
|
433
|
+
onSelectTemplate: (t) => setEditing({ kind: "template", type: t.type })
|
|
434
|
+
}
|
|
435
|
+
);
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
return /* @__PURE__ */ jsxs8("div", { style: styles.shell, children: [
|
|
439
|
+
/* @__PURE__ */ jsx8("nav", { style: styles.nav, "aria-label": "Admin", children: NAV.map((g) => {
|
|
440
|
+
const items = g.items.filter((i) => !i.needs || has[i.needs]);
|
|
441
|
+
if (items.length === 0) return null;
|
|
442
|
+
return /* @__PURE__ */ jsxs8("div", { children: [
|
|
443
|
+
/* @__PURE__ */ jsx8("div", { style: styles.navGroup, children: g.group }),
|
|
444
|
+
items.map((i) => /* @__PURE__ */ jsx8(
|
|
445
|
+
"button",
|
|
446
|
+
{
|
|
447
|
+
type: "button",
|
|
448
|
+
style: { ...styles.navItem, ...current === i.page ? styles.navItemActive : {} },
|
|
449
|
+
"aria-current": current === i.page ? "page" : void 0,
|
|
450
|
+
onClick: () => {
|
|
451
|
+
setEditing(null);
|
|
452
|
+
go(i.page);
|
|
453
|
+
},
|
|
454
|
+
children: i.label
|
|
455
|
+
},
|
|
456
|
+
i.page
|
|
457
|
+
))
|
|
458
|
+
] }, g.group);
|
|
459
|
+
}) }),
|
|
460
|
+
/* @__PURE__ */ jsx8("main", { style: styles.main, children: body })
|
|
461
|
+
] });
|
|
462
|
+
}
|
|
463
|
+
export {
|
|
464
|
+
AdminLogScreen,
|
|
465
|
+
AdminShell,
|
|
466
|
+
AttentionScreen,
|
|
467
|
+
ConfigScreen,
|
|
468
|
+
DoctorScreen,
|
|
469
|
+
ModulesScreen,
|
|
470
|
+
RoutesScreen,
|
|
471
|
+
TokensScreen
|
|
472
|
+
};
|
|
473
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/screens/AdminShell.tsx","../src/styles.ts","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/ConfigScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/TokensScreen.tsx"],"sourcesContent":["import type { AdminClient, ConfigAdminClient, CourierAdminClient } from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { TokensScreen } from './TokensScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'config'\n\t| 'routes'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{ page: AdminPage; label: string; needs?: 'config' | 'courier' }>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n}: IAdminShellProps) {\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = { config: Boolean(configClient), courier: Boolean(courierClient) };\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'config':\n\t\t\tbody = <ConfigScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={styles.status}>Pass a ConfigAdminClient to manage config and secrets here.</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={styles.status}>Pass a CourierAdminClient to manage templates here.</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div style={styles.shell}>\n\t\t\t<nav style={styles.nav} aria-label=\"Admin\">\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, ...(current === i.page ? styles.navItemActive : {}) }}\n\t\t\t\t\t\t\t\t\taria-current={current === i.page ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\tgo(i.page);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{i.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t\t<main style={styles.main}>{body}</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: 'system-ui, sans-serif',\n\t\tcolor: '#111',\n\t},\n\tnav: { width: 220, borderRight: '1px solid #eee', padding: 16, flexShrink: 0 },\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: '#888',\n\t\tmargin: '16px 0 6px',\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: 6,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: '#111',\n\t},\n\tnavItemActive: { background: '#f3f4f6', fontWeight: 600 },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: { fontSize: 20, fontWeight: 700, marginTop: 0, marginBottom: 12 },\n\tsubtitle: { fontSize: 15, fontWeight: 600, marginTop: 24, marginBottom: 8 },\n\tstatus: { padding: 12, color: '#666' },\n\terror: { color: '#e11d48', marginBottom: 12, fontSize: 14 },\n\tok: { color: '#15803d', fontWeight: 600 },\n\tbad: { color: '#e11d48', fontWeight: 600 },\n\tadvice: { color: '#b45309' },\n\tmuted: { color: '#666', fontSize: 13 },\n\tmono: { fontFamily: 'ui-monospace, monospace', fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: '1px solid #ddd',\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: '#444',\n\t},\n\ttd: { borderBottom: '1px solid #eee', padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: '1px solid #eee', padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: '#f3f4f6',\n\t},\n\tbutton: {\n\t\tbackground: 'none',\n\t\tborder: '1px solid #ddd',\n\t\tborderRadius: 8,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Admin log</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{e.method} {e.path}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<span style={e.status >= 400 ? styles.bad : styles.ok}>{e.status}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\n\n// What needs the operator today. Empty is green.\nexport function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Attention</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : attention?.items.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\tNothing needs you. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{attention?.items.map((item) => (\n\t\t\t\t\t\t<li key={`${item.source}:${item.message}`} style={styles.row}>\n\t\t\t\t\t\t\t<span style={item.severity === 'error' ? styles.bad : styles.advice}>\n\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span> — {item.message}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IConfigScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function ConfigScreen({ client }: IConfigScreenProps) {\n\tconst { report, isLoading, error } = useAdminConfig(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Configuration</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>{' '}\n\t\t\t\t\t\t\t\t{m.problems.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tm.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t\t<h2 style={styles.subtitle}>Environment</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.name} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t{e.set ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>set</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>missing</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Doctor</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRun again\n\t\t\t\t</button>\n\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t<span style={report.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t<li key={c.name} style={styles.row}>\n\t\t\t\t\t\t\t<span style={c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t\t\t{c.skipped ? 'skipped' : c.ok ? 'ok' : 'failed'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t{c.module} · {c.durationMs} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{c.skipped ? <div style={styles.muted}>{c.skipped}</div> : null}\n\t\t\t\t\t\t\t{c.findings.map((f) => (\n\t\t\t\t\t\t\t\t<div key={f} style={c.ok ? styles.advice : styles.bad}>\n\t\t\t\t\t\t\t\t\t{f}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Modules</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<>\n\t\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\t\t{manifest.env} · admin {manifest.admin.version} · admin log{' '}\n\t\t\t\t\t\t{manifest.admin.log ? 'on' : 'off'} · {manifest.routes.length} routes\n\t\t\t\t\t</p>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Describes admin</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{m.name}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>error</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.describesAdmin ? 'yes' : <span style={styles.muted}>no</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Routes</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.method}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<span style={styles.badge}>{r.guard}</span>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\n\nexport function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error } = useAdminTokens(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Admin token</h2>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\n\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</p>\n\t\t\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t\t\t{report.legacy.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.legacy.map((l) => (\n\t\t\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fonderie/react-admin-screens",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"fonderie": {
|
|
5
|
+
"stability": "experimental"
|
|
6
|
+
},
|
|
7
|
+
"description": "The admin shell for React: navigation by the operator's questions, seven pages over @fonderie/admin (attention, modules, doctor, configuration, routes, access, admin log), and the config/secrets and template screens composed as sub-pages under the one admin token. Mount it on one route; it owns nothing else.",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"fonderiejs",
|
|
10
|
+
"admin",
|
|
11
|
+
"dashboard",
|
|
12
|
+
"shell",
|
|
13
|
+
"react",
|
|
14
|
+
"screens",
|
|
15
|
+
"typescript"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"type": "module",
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=20"
|
|
21
|
+
},
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js",
|
|
26
|
+
"require": "./dist/index.cjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/index.cjs",
|
|
30
|
+
"module": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"dev": "tsup --watch",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"lint": "biome lint src",
|
|
37
|
+
"format": "biome format --write src",
|
|
38
|
+
"check": "biome check --write src"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@fonderie/client": "*",
|
|
42
|
+
"@fonderie/react-admin": "*",
|
|
43
|
+
"@fonderie/react-config-admin-screens": "*",
|
|
44
|
+
"@fonderie/react-courier-admin-screens": "*"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"react": ">=18.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^26.5.1",
|
|
51
|
+
"@types/react": "^19.3.0",
|
|
52
|
+
"react": "^19.3.0",
|
|
53
|
+
"tsup": "^8.5.1",
|
|
54
|
+
"typescript": "^6.0.3"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"dist",
|
|
61
|
+
"LICENSE",
|
|
62
|
+
"README.md"
|
|
63
|
+
],
|
|
64
|
+
"repository": {
|
|
65
|
+
"type": "git",
|
|
66
|
+
"url": "git+https://github.com/fonderiejs/fonderie.git",
|
|
67
|
+
"directory": "packages/react-admin-screens"
|
|
68
|
+
},
|
|
69
|
+
"homepage": "https://github.com/fonderiejs/fonderie/tree/main/packages/react-admin-screens#readme",
|
|
70
|
+
"bugs": {
|
|
71
|
+
"url": "https://github.com/fonderiejs/fonderie/issues"
|
|
72
|
+
}
|
|
73
|
+
}
|