Round dashboards: one face at a time, a face per widget type, paged by swipe, dots and keys; slider reading; face row in the editor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Melvin Strobl
2026-10-14 15:24:25 +02:00
co-authored by Claude Opus 5.5
parent 8b8cb5cda9
commit 84071ee106
20 changed files with 1238 additions and 604 deletions
+18 -15
View File
@@ -127,21 +127,24 @@ async function captureRuns(page, dir) {
// The API is its own host here, unless the stack serves it under the SPA's
// own origin (a LAN stack), whose CSP then refuses the other host.
const apiUrl = APP_URL.replace("//app.", "//api.")
const results = await page.evaluate(async (bases) => {
for (const base of bases) {
const answer = await fetch(`${base}/api/v1/dashboards/`, {
headers: {
Authorization: `Bearer ${localStorage.getItem("access_token")}`,
},
}).catch(() => null)
if (!answer?.ok) continue
const body = await answer.json()
return (body.data || [])
.map((one) => one.name)
.find((n) => n.endsWith("_results"))
}
return null
}, [apiUrl, ""])
const results = await page.evaluate(
async (bases) => {
for (const base of bases) {
const answer = await fetch(`${base}/api/v1/dashboards/`, {
headers: {
Authorization: `Bearer ${localStorage.getItem("access_token")}`,
},
}).catch(() => null)
if (!answer?.ok) continue
const body = await answer.json()
return (body.data || [])
.map((one) => one.name)
.find((n) => n.endsWith("_results"))
}
return null
},
[apiUrl, ""],
)
// A dashboard read against two runs: the same page a live run is watched
// on, showing finished ones. This is the seam the feature exists for — and