@vertebr/react 0.1.1 → 0.3.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/dist/{VertebrAdmin.d.ts → components/admin/VertebrAdmin.d.ts} +3 -1
- package/dist/components/admin/VertebrAdmin.d.ts.map +1 -0
- package/dist/components/admin/VertebrAdmin.js +375 -0
- package/dist/components/config/ConfigForm.d.ts +3 -0
- package/dist/components/config/ConfigForm.d.ts.map +1 -0
- package/dist/components/config/ConfigForm.js +1 -0
- package/dist/components/config/DescriptionInput.d.ts +18 -0
- package/dist/components/config/DescriptionInput.d.ts.map +1 -0
- package/dist/components/config/DescriptionInput.js +152 -0
- package/dist/components/config/ImagePickerModal.d.ts +18 -0
- package/dist/components/config/ImagePickerModal.d.ts.map +1 -0
- package/dist/components/config/ImagePickerModal.js +120 -0
- package/dist/components/config/PriceInput.d.ts +12 -0
- package/dist/components/config/PriceInput.d.ts.map +1 -0
- package/dist/components/config/PriceInput.js +20 -0
- package/dist/components/config/form/ConfigField.d.ts +21 -0
- package/dist/components/config/form/ConfigField.d.ts.map +1 -0
- package/dist/components/config/form/ConfigField.js +48 -0
- package/dist/components/config/form/ConfigForm.d.ts +4 -0
- package/dist/components/config/form/ConfigForm.d.ts.map +1 -0
- package/dist/components/config/form/ConfigForm.js +70 -0
- package/dist/components/config/form/ConfigFormActions.d.ts +10 -0
- package/dist/components/config/form/ConfigFormActions.d.ts.map +1 -0
- package/dist/components/config/form/ConfigFormActions.js +4 -0
- package/dist/components/config/form/RecordConfigForm.d.ts +21 -0
- package/dist/components/config/form/RecordConfigForm.d.ts.map +1 -0
- package/dist/components/config/form/RecordConfigForm.js +37 -0
- package/dist/components/config/form/SettingsConfigForm.d.ts +21 -0
- package/dist/components/config/form/SettingsConfigForm.d.ts.map +1 -0
- package/dist/components/config/form/SettingsConfigForm.js +7 -0
- package/dist/components/config/form/helpers.d.ts +16 -0
- package/dist/components/config/form/helpers.d.ts.map +1 -0
- package/dist/components/config/form/helpers.js +186 -0
- package/dist/components/config/form/types.d.ts +27 -0
- package/dist/components/config/form/types.d.ts.map +1 -0
- package/dist/{EnvSelect.d.ts → components/env/EnvSelect.d.ts} +1 -1
- package/dist/components/env/EnvSelect.d.ts.map +1 -0
- package/dist/components/gallery/GalleryBoard.d.ts +14 -0
- package/dist/components/gallery/GalleryBoard.d.ts.map +1 -0
- package/dist/components/gallery/GalleryBoard.js +14 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +6 -0
- package/dist/{MetricsBoard.d.ts → components/metrics/MetricsBoard.d.ts} +1 -1
- package/dist/components/metrics/MetricsBoard.d.ts.map +1 -0
- package/dist/components/resources/BulkImageUploadModal.d.ts +17 -0
- package/dist/components/resources/BulkImageUploadModal.d.ts.map +1 -0
- package/dist/components/resources/BulkImageUploadModal.js +47 -0
- package/dist/components/resources/ColumnVisibilityMenu.d.ts +11 -0
- package/dist/components/resources/ColumnVisibilityMenu.d.ts.map +1 -0
- package/dist/components/resources/ColumnVisibilityMenu.js +40 -0
- package/dist/components/resources/ImageUploadControl.d.ts +10 -0
- package/dist/components/resources/ImageUploadControl.d.ts.map +1 -0
- package/dist/components/resources/ImageUploadControl.js +50 -0
- package/dist/components/resources/ResourceCell.d.ts +10 -0
- package/dist/components/resources/ResourceCell.d.ts.map +1 -0
- package/dist/components/resources/ResourceCell.js +100 -0
- package/dist/components/resources/ResourceTable.d.ts +34 -0
- package/dist/components/resources/ResourceTable.d.ts.map +1 -0
- package/dist/components/resources/ResourceTable.js +249 -0
- package/dist/components/resources/ResourceViewModal.d.ts +11 -0
- package/dist/components/resources/ResourceViewModal.d.ts.map +1 -0
- package/dist/components/resources/ResourceViewModal.js +44 -0
- package/dist/components/theme/ThemeToggle.d.ts +7 -0
- package/dist/components/theme/ThemeToggle.d.ts.map +1 -0
- package/dist/components/theme/ThemeToggle.js +10 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/{useVertebrControls.d.ts → hooks/useVertebrControls.d.ts} +2 -2
- package/dist/hooks/useVertebrControls.d.ts.map +1 -0
- package/dist/{useVertebrControls.js → hooks/useVertebrControls.js} +11 -21
- package/dist/hooks/useVertebrTheme.d.ts +7 -0
- package/dist/hooks/useVertebrTheme.d.ts.map +1 -0
- package/dist/hooks/useVertebrTheme.js +38 -0
- package/dist/index.d.ts +20 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -6
- package/dist/lib/description.d.ts +18 -0
- package/dist/lib/description.d.ts.map +1 -0
- package/dist/lib/description.js +85 -0
- package/dist/lib/images.d.ts +14 -0
- package/dist/lib/images.d.ts.map +1 -0
- package/dist/lib/images.js +63 -0
- package/dist/lib/price.d.ts +15 -0
- package/dist/lib/price.d.ts.map +1 -0
- package/dist/lib/price.js +50 -0
- package/dist/styles/auth.css +39 -0
- package/dist/styles/base.css +70 -0
- package/dist/styles/buttons.css +86 -0
- package/dist/styles/cells.css +178 -0
- package/dist/styles/columns.css +103 -0
- package/dist/styles/form.css +773 -0
- package/dist/styles/gallery.css +90 -0
- package/dist/styles/index.css +18 -0
- package/dist/styles/main.css +89 -0
- package/dist/styles/modal.css +225 -0
- package/dist/styles/nav.css +92 -0
- package/dist/styles/panel.css +215 -0
- package/dist/styles/select.css +151 -0
- package/dist/styles/sidebar.css +42 -0
- package/dist/styles/states.css +169 -0
- package/dist/styles/table.css +101 -0
- package/dist/styles/theme-toggle.css +87 -0
- package/dist/styles.css +2 -997
- package/dist/themes/dark.css +55 -0
- package/dist/themes/index.css +2 -0
- package/dist/themes/light.css +102 -0
- package/package.json +13 -3
- package/dist/ConfigForm.d.ts +0 -9
- package/dist/ConfigForm.d.ts.map +0 -1
- package/dist/ConfigForm.js +0 -87
- package/dist/EnvSelect.d.ts.map +0 -1
- package/dist/MetricsBoard.d.ts.map +0 -1
- package/dist/ResourceTable.d.ts +0 -23
- package/dist/ResourceTable.d.ts.map +0 -1
- package/dist/ResourceTable.js +0 -112
- package/dist/VertebrAdmin.d.ts.map +0 -1
- package/dist/VertebrAdmin.js +0 -269
- package/dist/client.d.ts +0 -32
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -65
- package/dist/types.d.ts +0 -103
- package/dist/types.d.ts.map +0 -1
- package/dist/useVertebrControls.d.ts.map +0 -1
- /package/dist/{types.js → components/config/form/types.js} +0 -0
- /package/dist/{EnvSelect.js → components/env/EnvSelect.js} +0 -0
- /package/dist/{MetricsBoard.js → components/metrics/MetricsBoard.js} +0 -0
package/dist/VertebrAdmin.js
DELETED
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
-
import { createVertebrClient } from "./client";
|
|
4
|
-
import { ConfigForm } from "./ConfigForm";
|
|
5
|
-
import { EnvSelect } from "./EnvSelect";
|
|
6
|
-
import { MetricsBoard } from "./MetricsBoard";
|
|
7
|
-
import { ResourcePanel } from "./ResourceTable";
|
|
8
|
-
function readStored(key) {
|
|
9
|
-
try {
|
|
10
|
-
return localStorage.getItem(key);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function writeStored(key, value) {
|
|
17
|
-
try {
|
|
18
|
-
localStorage.setItem(key, value);
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
// ignore
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
function clearStored(key) {
|
|
25
|
-
try {
|
|
26
|
-
localStorage.removeItem(key);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
// ignore
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function VertebrAdmin({ apiBase = "/admin/api", title = "Control plane", envStorageKey = "vertebr:env", tokenStorageKey = "vertebr:token", getAccessToken, authUserLabel, onSignOut, }) {
|
|
33
|
-
const [environment, setEnvironment] = useState(() => readStored(envStorageKey) ?? "");
|
|
34
|
-
const [token, setToken] = useState(() => readStored(tokenStorageKey) ?? "");
|
|
35
|
-
const [tokenDraft, setTokenDraft] = useState(token);
|
|
36
|
-
const getEnvironment = useCallback(() => environment, [environment]);
|
|
37
|
-
const client = useMemo(() => createVertebrClient({
|
|
38
|
-
apiBase,
|
|
39
|
-
getEnvironment,
|
|
40
|
-
getAccessToken: getAccessToken ?? (() => token || null),
|
|
41
|
-
}), [apiBase, getEnvironment, getAccessToken, token]);
|
|
42
|
-
const [bootstrap, setBootstrap] = useState(null);
|
|
43
|
-
const [catalog, setCatalog] = useState(null);
|
|
44
|
-
const [selection, setSelection] = useState({ kind: "overview" });
|
|
45
|
-
const [resourceData, setResourceData] = useState(null);
|
|
46
|
-
const [configData, setConfigData] = useState(null);
|
|
47
|
-
const [metricsData, setMetricsData] = useState(null);
|
|
48
|
-
const [metricsLoading, setMetricsLoading] = useState(false);
|
|
49
|
-
const [error, setError] = useState(null);
|
|
50
|
-
const [loading, setLoading] = useState(true);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
let cancelled = false;
|
|
53
|
-
(async () => {
|
|
54
|
-
try {
|
|
55
|
-
const next = await client.getBootstrap();
|
|
56
|
-
if (cancelled)
|
|
57
|
-
return;
|
|
58
|
-
setBootstrap(next);
|
|
59
|
-
const known = next.environments.map((env) => env.id);
|
|
60
|
-
const preferred = (environment && known.includes(environment) && environment) ||
|
|
61
|
-
next.defaultEnvironment;
|
|
62
|
-
if (preferred !== environment) {
|
|
63
|
-
setEnvironment(preferred);
|
|
64
|
-
writeStored(envStorageKey, preferred);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
if (!cancelled) {
|
|
69
|
-
setError(err instanceof Error ? err.message : "Failed to load bootstrap");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
})();
|
|
73
|
-
return () => {
|
|
74
|
-
cancelled = true;
|
|
75
|
-
};
|
|
76
|
-
}, [client, environment, envStorageKey]);
|
|
77
|
-
useEffect(() => {
|
|
78
|
-
if (!bootstrap || !environment)
|
|
79
|
-
return;
|
|
80
|
-
let cancelled = false;
|
|
81
|
-
(async () => {
|
|
82
|
-
try {
|
|
83
|
-
setLoading(true);
|
|
84
|
-
setError(null);
|
|
85
|
-
const next = await client.getCatalog();
|
|
86
|
-
if (cancelled)
|
|
87
|
-
return;
|
|
88
|
-
setCatalog(next);
|
|
89
|
-
setSelection((current) => {
|
|
90
|
-
if (current?.kind === "overview")
|
|
91
|
-
return current;
|
|
92
|
-
if (current?.kind === "resource") {
|
|
93
|
-
if (next.resources.some((r) => r.id === current.id))
|
|
94
|
-
return current;
|
|
95
|
-
}
|
|
96
|
-
if (current?.kind === "config") {
|
|
97
|
-
if (next.configs.some((c) => c.id === current.id))
|
|
98
|
-
return current;
|
|
99
|
-
}
|
|
100
|
-
if (next.metrics)
|
|
101
|
-
return { kind: "overview" };
|
|
102
|
-
const firstResource = next.resources[0];
|
|
103
|
-
if (firstResource)
|
|
104
|
-
return { kind: "resource", id: firstResource.id };
|
|
105
|
-
const firstConfig = next.configs[0];
|
|
106
|
-
if (firstConfig)
|
|
107
|
-
return { kind: "config", id: firstConfig.id };
|
|
108
|
-
return { kind: "overview" };
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
if (!cancelled) {
|
|
113
|
-
setCatalog(null);
|
|
114
|
-
setError(err instanceof Error ? err.message : "Failed to load catalog");
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
finally {
|
|
118
|
-
if (!cancelled)
|
|
119
|
-
setLoading(false);
|
|
120
|
-
}
|
|
121
|
-
})();
|
|
122
|
-
return () => {
|
|
123
|
-
cancelled = true;
|
|
124
|
-
};
|
|
125
|
-
}, [client, bootstrap, environment]);
|
|
126
|
-
useEffect(() => {
|
|
127
|
-
if (!selection || !catalog)
|
|
128
|
-
return;
|
|
129
|
-
let cancelled = false;
|
|
130
|
-
(async () => {
|
|
131
|
-
try {
|
|
132
|
-
setError(null);
|
|
133
|
-
if (selection.kind === "overview") {
|
|
134
|
-
setMetricsLoading(true);
|
|
135
|
-
const data = await client.getMetrics();
|
|
136
|
-
if (!cancelled) {
|
|
137
|
-
setMetricsData(data);
|
|
138
|
-
setResourceData(null);
|
|
139
|
-
setConfigData(null);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else if (selection.kind === "resource") {
|
|
143
|
-
const data = await client.listResource(selection.id);
|
|
144
|
-
if (!cancelled) {
|
|
145
|
-
setResourceData(data);
|
|
146
|
-
setConfigData(null);
|
|
147
|
-
setMetricsData(null);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
const data = await client.getConfig(selection.id);
|
|
152
|
-
if (!cancelled) {
|
|
153
|
-
setConfigData(data);
|
|
154
|
-
setResourceData(null);
|
|
155
|
-
setMetricsData(null);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
catch (err) {
|
|
160
|
-
if (!cancelled) {
|
|
161
|
-
setError(err instanceof Error ? err.message : "Failed to load panel");
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
finally {
|
|
165
|
-
if (!cancelled)
|
|
166
|
-
setMetricsLoading(false);
|
|
167
|
-
}
|
|
168
|
-
})();
|
|
169
|
-
return () => {
|
|
170
|
-
cancelled = true;
|
|
171
|
-
};
|
|
172
|
-
}, [client, selection, catalog, environment]);
|
|
173
|
-
const refreshResource = useCallback(async () => {
|
|
174
|
-
if (selection?.kind !== "resource")
|
|
175
|
-
return;
|
|
176
|
-
const data = await client.listResource(selection.id);
|
|
177
|
-
setResourceData(data);
|
|
178
|
-
}, [client, selection]);
|
|
179
|
-
const refreshMetrics = useCallback(async () => {
|
|
180
|
-
setMetricsLoading(true);
|
|
181
|
-
try {
|
|
182
|
-
const data = await client.getMetrics();
|
|
183
|
-
setMetricsData(data);
|
|
184
|
-
}
|
|
185
|
-
finally {
|
|
186
|
-
setMetricsLoading(false);
|
|
187
|
-
}
|
|
188
|
-
}, [client]);
|
|
189
|
-
const envList = catalog?.environments ?? bootstrap?.environments ?? [];
|
|
190
|
-
const activeEnv = envList.find((env) => env.id === environment);
|
|
191
|
-
const authRequired = Boolean(activeEnv?.auth?.required);
|
|
192
|
-
const switchEnvironment = (nextEnv) => {
|
|
193
|
-
if (nextEnv === environment)
|
|
194
|
-
return;
|
|
195
|
-
const meta = envList.find((env) => env.id === nextEnv);
|
|
196
|
-
if (meta?.tone === "danger") {
|
|
197
|
-
const ok = window.confirm(`Switch to ${meta.label}? Writes will affect this environment.`);
|
|
198
|
-
if (!ok)
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
writeStored(envStorageKey, nextEnv);
|
|
202
|
-
setEnvironment(nextEnv);
|
|
203
|
-
setResourceData(null);
|
|
204
|
-
setConfigData(null);
|
|
205
|
-
};
|
|
206
|
-
const saveToken = () => {
|
|
207
|
-
const next = tokenDraft.trim();
|
|
208
|
-
setToken(next);
|
|
209
|
-
if (next)
|
|
210
|
-
writeStored(tokenStorageKey, next);
|
|
211
|
-
else
|
|
212
|
-
clearStored(tokenStorageKey);
|
|
213
|
-
};
|
|
214
|
-
const clearToken = () => {
|
|
215
|
-
setToken("");
|
|
216
|
-
setTokenDraft("");
|
|
217
|
-
clearStored(tokenStorageKey);
|
|
218
|
-
};
|
|
219
|
-
if (!bootstrap && loading) {
|
|
220
|
-
return _jsx("div", { className: "vertebr-loading", children: "Loading Vertebr\u2026" });
|
|
221
|
-
}
|
|
222
|
-
if (error && !bootstrap) {
|
|
223
|
-
return _jsx("div", { className: "vertebr-error", children: error });
|
|
224
|
-
}
|
|
225
|
-
const activeLabel = selection?.kind === "overview"
|
|
226
|
-
? (catalog?.metrics?.label ?? "Overview")
|
|
227
|
-
: selection?.kind === "resource"
|
|
228
|
-
? catalog?.resources.find((r) => r.id === selection.id)?.label
|
|
229
|
-
: selection?.kind === "config"
|
|
230
|
-
? catalog?.configs.find((c) => c.id === selection.id)?.label
|
|
231
|
-
: null;
|
|
232
|
-
return (_jsxs("div", { className: "vertebr-root", "data-env": environment, children: [_jsxs("aside", { className: "vertebr-sidebar", children: [_jsxs("div", { className: "vertebr-sidebar-top", children: [_jsxs("div", { className: "vertebr-brand", children: [_jsx("strong", { children: bootstrap?.brand ?? catalog?.brand ?? "Vertebr" }), _jsx("span", { children: title })] }), envList.length > 0 ? (_jsxs("div", { className: "vertebr-env", children: [_jsx("div", { className: "vertebr-nav-label", children: "Environment" }), _jsx(EnvSelect, { environments: envList, value: environment, onChange: switchEnvironment })] })) : null, _jsxs("nav", { className: "vertebr-nav", children: [catalog?.metrics ? (_jsxs("div", { className: "vertebr-nav-group", children: [_jsx("div", { className: "vertebr-nav-label", children: "Analytics" }), _jsx("button", { type: "button", "data-active": selection?.kind === "overview", onClick: () => setSelection({ kind: "overview" }), children: catalog.metrics.label })] })) : null, catalog && catalog.resources.length > 0 ? (_jsxs("div", { className: "vertebr-nav-group", children: [_jsx("div", { className: "vertebr-nav-label", children: "Resources" }), catalog.resources.map((resource) => (_jsx("button", { type: "button", "data-active": selection?.kind === "resource" &&
|
|
233
|
-
selection.id === resource.id, onClick: () => setSelection({ kind: "resource", id: resource.id }), children: resource.label }, resource.id)))] })) : null, catalog && catalog.configs.length > 0 ? (_jsxs("div", { className: "vertebr-nav-group", children: [_jsx("div", { className: "vertebr-nav-label", children: "Config" }), catalog.configs.map((config) => (_jsx("button", { type: "button", "data-active": selection?.kind === "config" && selection.id === config.id, onClick: () => setSelection({ kind: "config", id: config.id }), children: config.label }, config.id)))] })) : null] })] }), _jsxs("div", { className: "vertebr-sidebar-bottom", children: [getAccessToken && authUserLabel ? (_jsxs("div", { className: "vertebr-auth", children: [_jsx("div", { className: "vertebr-nav-label", children: "Signed in" }), _jsx("p", { className: "vertebr-auth-hint", children: authUserLabel }), onSignOut ? (_jsx("button", { type: "button", className: "vertebr-btn", onClick: () => void onSignOut(), children: "Sign out" })) : null] })) : null, !getAccessToken && (authRequired || token) ? (_jsxs("div", { className: "vertebr-auth", children: [_jsx("div", { className: "vertebr-nav-label", children: "Access" }), _jsx("p", { className: "vertebr-auth-hint", children: authRequired
|
|
234
|
-
? `This environment requires auth${activeEnv?.auth?.claimKey
|
|
235
|
-
? ` (${activeEnv.auth.claimKey})`
|
|
236
|
-
: ""}.`
|
|
237
|
-
: "Optional access token for protected environments." }), _jsx("input", { className: "vertebr-auth-input", type: "password", placeholder: "Bearer token", value: tokenDraft, onChange: (event) => setTokenDraft(event.target.value), autoComplete: "off" }), _jsxs("div", { className: "vertebr-auth-actions", children: [_jsx("button", { type: "button", className: "vertebr-btn vertebr-btn-primary", onClick: saveToken, children: "Use token" }), token ? (_jsx("button", { type: "button", className: "vertebr-btn", onClick: clearToken, children: "Clear" })) : null] })] })) : null] })] }), _jsxs("main", { className: "vertebr-main", children: [_jsxs("header", { className: "vertebr-header", children: [_jsxs("div", { children: [_jsxs("div", { className: "vertebr-heading-row", children: [_jsx("h1", { children: activeLabel ?? (catalog ? "Dashboard" : "Sign in") }), activeEnv ? (_jsx("span", { className: "vertebr-env-badge", "data-tone": activeEnv.tone ?? "neutral", children: activeEnv.label })) : null] }), _jsx("p", { children: !catalog && authRequired
|
|
238
|
-
? "Provide an access token to load this environment."
|
|
239
|
-
: selection?.kind === "overview"
|
|
240
|
-
? "Live metrics for the selected environment."
|
|
241
|
-
: selection?.kind === "resource"
|
|
242
|
-
? "Manage records scoped to the selected environment."
|
|
243
|
-
: selection?.kind === "config"
|
|
244
|
-
? "Owner-managed config for this environment."
|
|
245
|
-
: "Select a panel." })] }), error ? (_jsx("span", { className: "vertebr-status", "data-tone": "danger", children: error })) : null] }), _jsx("div", { className: "vertebr-content", children: catalog ? (_jsxs("section", { className: "vertebr-panel", children: [selection?.kind === "overview" ? (_jsx(MetricsBoard, { label: metricsData?.label ?? catalog.metrics?.label, metrics: metricsData?.metrics ?? [], loading: metricsLoading, onRefresh: () => void refreshMetrics() })) : null, selection?.kind === "resource" && resourceData ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "vertebr-panel-head", children: [_jsx("h2", { children: "Records" }), _jsx("span", { className: "vertebr-count", children: resourceData.items.length })] }), _jsx(ResourcePanel, { schema: resourceData.schema, items: resourceData.items, permissions: resourceData.permissions, actions: resourceData.actions, onUpdate: resourceData.permissions.update
|
|
246
|
-
? async (rowId, value) => {
|
|
247
|
-
await client.updateResource(resourceData.id, rowId, value);
|
|
248
|
-
await refreshResource();
|
|
249
|
-
}
|
|
250
|
-
: undefined, onDelete: resourceData.permissions.delete
|
|
251
|
-
? async (rowId) => {
|
|
252
|
-
await client.deleteResource(resourceData.id, rowId);
|
|
253
|
-
await refreshResource();
|
|
254
|
-
}
|
|
255
|
-
: undefined, onAction: async (rowId, actionId) => {
|
|
256
|
-
await client.runResourceAction(resourceData.id, rowId, actionId);
|
|
257
|
-
await refreshResource();
|
|
258
|
-
} })] })) : null, selection?.kind === "config" && configData ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "vertebr-panel-head", children: [_jsx("h2", { children: "Settings" }), _jsxs("span", { className: "vertebr-count", children: [Object.keys(configData.schema).length, " fields"] })] }), _jsx(ConfigForm, { schema: configData.schema, value: configData.value, onSave: async (next) => {
|
|
259
|
-
const saved = await client.setConfig(configData.id, next);
|
|
260
|
-
setConfigData({
|
|
261
|
-
...configData,
|
|
262
|
-
value: saved.value,
|
|
263
|
-
});
|
|
264
|
-
} })] })) : null] })) : (_jsx("section", { className: "vertebr-panel", children: _jsx("div", { className: "vertebr-empty", children: authRequired
|
|
265
|
-
? "Authenticated access required for this environment."
|
|
266
|
-
: loading
|
|
267
|
-
? "Loading…"
|
|
268
|
-
: "Unable to load catalog." }) })) })] })] }));
|
|
269
|
-
}
|
package/dist/client.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { BootstrapResponse, CatalogResponse, ConfigResponse, MetricsResponse, ResourceListResponse } from "./types";
|
|
2
|
-
export declare const VERTEBR_ENV_HEADER = "x-vertebr-env";
|
|
3
|
-
export type VertebrClientOptions = {
|
|
4
|
-
apiBase: string;
|
|
5
|
-
getEnvironment: () => string;
|
|
6
|
-
getAccessToken?: () => string | null | undefined | Promise<string | null | undefined>;
|
|
7
|
-
};
|
|
8
|
-
export type VertebrClient = {
|
|
9
|
-
getBootstrap: () => Promise<BootstrapResponse>;
|
|
10
|
-
getCatalog: () => Promise<CatalogResponse>;
|
|
11
|
-
getMetrics: () => Promise<MetricsResponse>;
|
|
12
|
-
listResource: (id: string) => Promise<ResourceListResponse>;
|
|
13
|
-
createResource: (id: string, value: Record<string, unknown>) => Promise<{
|
|
14
|
-
ok: boolean;
|
|
15
|
-
item: Record<string, unknown>;
|
|
16
|
-
}>;
|
|
17
|
-
updateResource: (id: string, rowId: string, value: Record<string, unknown>) => Promise<{
|
|
18
|
-
ok: boolean;
|
|
19
|
-
item: Record<string, unknown>;
|
|
20
|
-
}>;
|
|
21
|
-
deleteResource: (id: string, rowId: string) => Promise<{
|
|
22
|
-
ok: boolean;
|
|
23
|
-
}>;
|
|
24
|
-
runResourceAction: (id: string, rowId: string, actionId: string, input?: Record<string, unknown>) => Promise<{
|
|
25
|
-
ok: boolean;
|
|
26
|
-
result?: unknown;
|
|
27
|
-
}>;
|
|
28
|
-
getConfig: (id: string) => Promise<ConfigResponse>;
|
|
29
|
-
setConfig: (id: string, value: Record<string, unknown>) => Promise<ConfigResponse>;
|
|
30
|
-
};
|
|
31
|
-
export declare function createVertebrClient(apiBaseOrOptions: string | VertebrClientOptions, getEnvironment?: () => string): VertebrClient;
|
|
32
|
-
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,eAAe,EACf,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MACb,MAAM,GACN,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,UAAU,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7D,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9B,iBAAiB,EAAE,CACjB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChD,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,SAAS,EAAE,CACT,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9B,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,GAAG,oBAAoB,EAC/C,cAAc,CAAC,EAAE,MAAM,MAAM,GAC5B,aAAa,CA4Ff"}
|
package/dist/client.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
export const VERTEBR_ENV_HEADER = "x-vertebr-env";
|
|
2
|
-
export function createVertebrClient(apiBaseOrOptions, getEnvironment) {
|
|
3
|
-
const options = typeof apiBaseOrOptions === "string"
|
|
4
|
-
? {
|
|
5
|
-
apiBase: apiBaseOrOptions,
|
|
6
|
-
getEnvironment: getEnvironment ?? (() => ""),
|
|
7
|
-
}
|
|
8
|
-
: apiBaseOrOptions;
|
|
9
|
-
const base = options.apiBase.replace(/\/$/, "");
|
|
10
|
-
async function request(path, init, opts) {
|
|
11
|
-
const env = options.getEnvironment().trim();
|
|
12
|
-
const rawToken = await options.getAccessToken?.();
|
|
13
|
-
const token = rawToken?.trim();
|
|
14
|
-
const response = await fetch(`${base}${path}`, {
|
|
15
|
-
...init,
|
|
16
|
-
headers: {
|
|
17
|
-
Accept: "application/json",
|
|
18
|
-
"Content-Type": "application/json",
|
|
19
|
-
...(env ? { [VERTEBR_ENV_HEADER]: env } : {}),
|
|
20
|
-
...(opts?.auth !== false && token
|
|
21
|
-
? { Authorization: `Bearer ${token}` }
|
|
22
|
-
: {}),
|
|
23
|
-
...(init?.headers ?? {}),
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
if (!response.ok) {
|
|
27
|
-
const text = await response.text();
|
|
28
|
-
throw new Error(text || `Request failed (${response.status})`);
|
|
29
|
-
}
|
|
30
|
-
return (await response.json());
|
|
31
|
-
}
|
|
32
|
-
return {
|
|
33
|
-
getBootstrap: () => request("/bootstrap", undefined, { auth: false }),
|
|
34
|
-
getCatalog: () => request(""),
|
|
35
|
-
getMetrics: () => request("/metrics"),
|
|
36
|
-
listResource: (id) => request(`/resources/${encodeURIComponent(id)}`),
|
|
37
|
-
createResource: (id, value) => request(`/resources/${encodeURIComponent(id)}`, {
|
|
38
|
-
method: "POST",
|
|
39
|
-
body: JSON.stringify(value),
|
|
40
|
-
}),
|
|
41
|
-
updateResource: (id, rowId, value) => request(`/resources/${encodeURIComponent(id)}/${encodeURIComponent(rowId)}`, {
|
|
42
|
-
method: "PUT",
|
|
43
|
-
body: JSON.stringify(value),
|
|
44
|
-
}),
|
|
45
|
-
deleteResource: (id, rowId) => request(`/resources/${encodeURIComponent(id)}/${encodeURIComponent(rowId)}`, { method: "DELETE" }),
|
|
46
|
-
runResourceAction: (id, rowId, actionId, input) => request(`/resources/${encodeURIComponent(id)}/${encodeURIComponent(rowId)}/actions/${encodeURIComponent(actionId)}`, {
|
|
47
|
-
method: "POST",
|
|
48
|
-
body: JSON.stringify(input ?? {}),
|
|
49
|
-
}),
|
|
50
|
-
getConfig: (id) => request(`/configs/${encodeURIComponent(id)}`),
|
|
51
|
-
setConfig: async (id, value) => {
|
|
52
|
-
const result = await request(`/configs/${encodeURIComponent(id)}`, {
|
|
53
|
-
method: "PUT",
|
|
54
|
-
body: JSON.stringify(value),
|
|
55
|
-
});
|
|
56
|
-
return {
|
|
57
|
-
id: result.id,
|
|
58
|
-
label: id,
|
|
59
|
-
schema: {},
|
|
60
|
-
environment: result.environment,
|
|
61
|
-
value: result.value,
|
|
62
|
-
};
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
}
|
package/dist/types.d.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
export type FieldType = "string" | "number" | "boolean" | "datetime" | "richtext" | "enum" | "enum[]" | "file[]";
|
|
2
|
-
export type FieldSchema = {
|
|
3
|
-
type: FieldType;
|
|
4
|
-
label?: string;
|
|
5
|
-
required?: boolean;
|
|
6
|
-
readOnly?: boolean;
|
|
7
|
-
unique?: boolean;
|
|
8
|
-
min?: number;
|
|
9
|
-
max?: number;
|
|
10
|
-
default?: unknown;
|
|
11
|
-
options?: string[];
|
|
12
|
-
};
|
|
13
|
-
export type EnvironmentAuthPublic = {
|
|
14
|
-
required: boolean;
|
|
15
|
-
claimKey?: string;
|
|
16
|
-
roles?: string[];
|
|
17
|
-
client?: {
|
|
18
|
-
provider: "firebase";
|
|
19
|
-
config: {
|
|
20
|
-
apiKey: string;
|
|
21
|
-
authDomain: string;
|
|
22
|
-
projectId: string;
|
|
23
|
-
appId: string;
|
|
24
|
-
messagingSenderId?: string;
|
|
25
|
-
};
|
|
26
|
-
methods?: Array<"email" | "google">;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
export type AdminEnvironment = {
|
|
30
|
-
id: string;
|
|
31
|
-
label: string;
|
|
32
|
-
tone?: "neutral" | "warn" | "danger";
|
|
33
|
-
auth?: EnvironmentAuthPublic;
|
|
34
|
-
};
|
|
35
|
-
export type CatalogResource = {
|
|
36
|
-
id: string;
|
|
37
|
-
label: string;
|
|
38
|
-
schema: Record<string, FieldSchema>;
|
|
39
|
-
permissions: {
|
|
40
|
-
create?: boolean;
|
|
41
|
-
update?: boolean;
|
|
42
|
-
delete?: boolean;
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
export type CatalogConfig = {
|
|
46
|
-
id: string;
|
|
47
|
-
label: string;
|
|
48
|
-
schema: Record<string, FieldSchema>;
|
|
49
|
-
};
|
|
50
|
-
export type BootstrapResponse = {
|
|
51
|
-
ok: boolean;
|
|
52
|
-
brand: string;
|
|
53
|
-
defaultEnvironment: string;
|
|
54
|
-
environments: AdminEnvironment[];
|
|
55
|
-
};
|
|
56
|
-
export type CatalogResponse = {
|
|
57
|
-
ok: boolean;
|
|
58
|
-
brand: string;
|
|
59
|
-
environment: string;
|
|
60
|
-
environments: AdminEnvironment[];
|
|
61
|
-
defaultEnvironment: string;
|
|
62
|
-
resources: CatalogResource[];
|
|
63
|
-
configs: CatalogConfig[];
|
|
64
|
-
metrics?: {
|
|
65
|
-
id: string;
|
|
66
|
-
label: string;
|
|
67
|
-
} | null;
|
|
68
|
-
};
|
|
69
|
-
export type ResourceActionMeta = {
|
|
70
|
-
label: string;
|
|
71
|
-
input?: Record<string, FieldType>;
|
|
72
|
-
};
|
|
73
|
-
export type ResourceListResponse = {
|
|
74
|
-
id: string;
|
|
75
|
-
label: string;
|
|
76
|
-
schema: Record<string, FieldSchema>;
|
|
77
|
-
environment?: string;
|
|
78
|
-
permissions: CatalogResource["permissions"];
|
|
79
|
-
actions?: Record<string, ResourceActionMeta>;
|
|
80
|
-
items: Record<string, unknown>[];
|
|
81
|
-
};
|
|
82
|
-
export type MetricCard = {
|
|
83
|
-
id: string;
|
|
84
|
-
label: string;
|
|
85
|
-
value: string | number;
|
|
86
|
-
hint?: string;
|
|
87
|
-
tone?: "neutral" | "ok" | "warn" | "danger";
|
|
88
|
-
};
|
|
89
|
-
export type MetricsResponse = {
|
|
90
|
-
ok: boolean;
|
|
91
|
-
id: string;
|
|
92
|
-
label: string;
|
|
93
|
-
environment?: string;
|
|
94
|
-
metrics: MetricCard[];
|
|
95
|
-
};
|
|
96
|
-
export type ConfigResponse = {
|
|
97
|
-
id: string;
|
|
98
|
-
label: string;
|
|
99
|
-
schema: Record<string, FieldSchema>;
|
|
100
|
-
environment?: string;
|
|
101
|
-
value: Record<string, unknown>;
|
|
102
|
-
};
|
|
103
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useVertebrControls.d.ts","sourceRoot":"","sources":["../src/useVertebrControls.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzE,KAAK,oBAAoB,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAIF,MAAM,MAAM,4BAA4B,GAAG;IACzC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AA2BF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,OAAsB,EACtB,WAAW,EACX,QAAQ,GACT,EAAE,4BAA4B,+BA8B9B;AAYD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,GACV;IACD,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAMA;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,IAAI,oBAAoB,CAEzD"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|