fix(booth): asks were invisible in a booth serving its own index.html
A custom index.html is returned verbatim, so booth.html's asks panel never rendered there — a valid ask (emmie-anchor/anchor.ask.json) was listed by the CLI and shown nowhere, with nothing to say so. - panel extracted to _asks.html; new GET /b/<name>/asks standalone page - verbatim pages get an amber '? N open asks' chip beside the back chip - POST /answer honours back=asks so answering returns to that page - single-question asks now keep an optional 'title' (was silently dropped) - README + routes table; 8 regression tests; v0.1.12
This commit is contained in:
@@ -111,7 +111,8 @@ booth asks r18-ab # list a booth's asks + state
|
||||
# Options can carry an id + detail line instead of a bare label — write the
|
||||
# JSON yourself (booth.asks.write_ask validates the same way):
|
||||
cat > ~/booth-data/r18-ab/plan.ask.json <<'EOF'
|
||||
{"prompt": "Ship which?",
|
||||
{"title": "optional short label above the question",
|
||||
"prompt": "Ship which?",
|
||||
"options": [{"id": "a", "label": "Plan A", "detail": "smaller diff, no migration"},
|
||||
{"id": "b", "label": "Plan B", "detail": "cleaner, needs the DB change"}],
|
||||
"notes": true, "notes_label": "why / conditions"}
|
||||
@@ -160,6 +161,12 @@ Rules of the primitive:
|
||||
- **A broken ask is shown as broken**, not hidden: if the JSON does not
|
||||
validate, the page says why, so a session never thinks it posted a question
|
||||
the operator cannot see.
|
||||
- **A booth with its own `index.html` shows a chip, not the panel.** That page is
|
||||
served verbatim by design, so the inline panel cannot appear on it: the Booth
|
||||
injects an amber `? N open asks` chip (next to the back chip) linking to
|
||||
**`/b/<name>/asks`**, a standalone page carrying the real forms. Answering
|
||||
there returns there. Put the media in the booth and the ask beside it either
|
||||
way — the ask is never lost, whichever shape the booth takes.
|
||||
- Ask/answer files are not gallery items and do not count toward the booth's
|
||||
item count; they render as the panel above the gallery. Answering bumps the
|
||||
booth's mtime, so it lives another TTL — the session has 24h to read it.
|
||||
@@ -213,7 +220,8 @@ to a safe basename (no path traversal).
|
||||
| `GET /b/<name>/` | A booth (its `index.html`, else auto-gallery) |
|
||||
| `GET /b/<name>/<file>` | Serve a file out of the booth |
|
||||
| `POST /upload` | Upload files → new pickup booth; 303-redirects to `/b/<id>/` (id in `Location`) |
|
||||
| `POST /b/<name>/answer` | Answer an ask (form fields `ask` = stem, `choice` = option id, `notes`); writes `<stem>.answer.json`, 303 back to the booth |
|
||||
| `GET /b/<name>/asks` | The asks panel on its own page — the only place a verbatim-`index.html` booth can show its asks |
|
||||
| `POST /b/<name>/answer` | Answer an ask (fields `ask` = stem, `choice`/`choice.<key>`, `notes`/`notes.<key>`, `back`); writes `<stem>.answer.json`, 303 back |
|
||||
| `POST /b/<name>/delete` | Wipe a booth (the UI's "Wipe now" button) |
|
||||
| `POST /b/<name>/keep` | Pin a booth — exempt from the sweep |
|
||||
| `POST /b/<name>/unkeep` | Release the pin (the UI's "release" button on kept cards) |
|
||||
|
||||
Reference in New Issue
Block a user