READY page: drop the MICS and STAGE keys

BOH MIX is the one tap key left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-14 20:46:00 -04:00
co-authored by Claude Opus 5.5
parent d5ede0c91e
commit bf128e1bad
7 changed files with 6 additions and 38 deletions
+3 -4
View File
@@ -106,7 +106,7 @@ HyperDeck is recording). **STATUS PAGE** (bottom left) goes back.
|--------|-------|-------|-------|-------|-------| |--------|-------|-------|-------|-------|-------|
| row 0 (Ableton) | TRACKS | FOH MIX | BOH MIX (tap) | LIGHTS | MIDI | | row 0 (Ableton) | TRACKS | FOH MIX | BOH MIX (tap) | LIGHTS | MIDI |
| row 1 (ProP / Resolume) | PROP | TIMECODE | BKGDS | LED CROSS | | | row 1 (ProP / Resolume) | PROP | TIMECODE | BKGDS | LED CROSS | |
| row 2 (backstage, stage) | LINEUP TV | | MICS (tap) | STAGE (tap) | | | row 2 (backstage) | LINEUP TV | | | | |
| row 3 (outgoing) | TRACKS OUT | PROP OUT | | | | | row 3 (outgoing) | TRACKS OUT | PROP OUT | | | |
The READY key at row 3 col 7 (and the one on the status page) shows how many keys still have something to do and The READY key at row 3 col 7 (and the one on the status page) shows how many keys still have something to do and
@@ -116,9 +116,8 @@ the first of them.
still missing turns **blinking red**. A song that is not mixed stays amber, because it is only a guess. These keys still missing turns **blinking red**. A song that is not mixed stays amber, because it is only a guess. These keys
are not part of ALL, so an unfinished checklist on a Tuesday never turns the page-number keys red. are not part of ALL, so an unfinished checklist on a Tuesday never turns the page-number keys red.
**Tap keys** (BOH MIX, MICS, STAGE) are things only a person can see. Tap once when it is done; the key **BOH MIX** is a tap key: only a person can judge it. Tap once when it is done; the key shows `DONE THU 14:02`.
shows `DONE THU 14:02`. Tap again to take it back. Everything resets on Monday at midnight. MICS also says which mics Tap again to take it back. It resets on Monday at midnight.
this weekend needs, from Planning Center (`4 VOX MC TIM`).
**Hold any key for 2 s** to fix what can be fixed, or to look again now if there is no fix. **Hold READY** to fix **Hold any key for 2 s** to fix what can be fixed, or to look again now if there is no fix. **Hold READY** to fix
everything on the page at once. everything on the page at once.
-30
View File
@@ -1186,36 +1186,6 @@
} }
] ]
}, },
{
"id": "rd_mics",
"label": "MICS",
"pos": [
2,
3
],
"checks": [
{
"type": "ready_manual",
"item": "mics",
"msg": "TAP WHEN SET"
}
]
},
{
"id": "rd_stage",
"label": "STAGE",
"pos": [
2,
4
],
"checks": [
{
"type": "ready_manual",
"item": "stage",
"msg": "HELIX, RISERS: TAP"
}
]
},
{ {
"id": "rd_trk_out", "id": "rd_trk_out",
"label": "TRACKS OUT", "label": "TRACKS OUT",
Binary file not shown.
+1 -1
View File
@@ -316,7 +316,7 @@ field("ready.due", "list", [], "From when gaps are red instead of amber.", "Read
field("ready.due[].days", "days", None, "", "Ready", required=True) field("ready.due[].days", "days", None, "", "Ready", required=True)
field("ready.due[].start", "hhmm", None, "", "Ready", required=True) field("ready.due[].start", "hhmm", None, "", "Ready", required=True)
field("ready.due[].end", "hhmm", None, "", "Ready", required=True) field("ready.due[].end", "hhmm", None, "", "Ready", required=True)
field("ready.reset_day", "enum", "mon", "Taps (BOH mix, mics, stage) count from midnight on this day.", "Ready", field("ready.reset_day", "enum", "mon", "Taps (BOH mix) count from midnight on this day.", "Ready",
options=list(sp.DAYS)) options=list(sp.DAYS))
field("ready.pco_credentials", "path", "~/Library/Application Support/ProdDash/modules.json", "ProdDash's settings " field("ready.pco_credentials", "path", "~/Library/Application Support/ProdDash/modules.json", "ProdDash's settings "
"file, which holds the Planning Center login.", "Ready", advanced=True) "file, which holds the Planning Center login.", "Ready", advanced=True)
+1 -1
View File
@@ -506,7 +506,7 @@
const snap = await api("/api/snapshot").catch(() => ({})); const snap = await api("/api/snapshot").catch(() => ({}));
const r = snap.ready || {}; const r = snap.ready || {};
const plan = r.plan ? `<p class="small muted">Plan: ${esc(r.plan.title || "")} ${esc(r.plan.dates || "")}${r.time ? ` · looked ${esc(new Date(r.time * 1000).toLocaleTimeString())}` : ""}</p>` : `<p class="small muted">Not looked yet.</p>`; const plan = r.plan ? `<p class="small muted">Plan: ${esc(r.plan.title || "")} ${esc(r.plan.dates || "")}${r.time ? ` · looked ${esc(new Date(r.time * 1000).toLocaleTimeString())}` : ""}</p>` : `<p class="small muted">Not looked yet.</p>`;
if (i < 0) return `<div class="card"><h2 style="margin-top:4px">The weekly checklist</h2>${plan}<p class="small">Amber: still to do. Blinking red: still missing once it is due (${esc(((c.ready || {}).due || []).map((w) => w.days.join("/") + " " + w.start + "-" + w.end).join(", "))}). Tap keys (BOH MIX, MICS, STAGE) are tapped done on the deck and reset every ${esc((c.ready || {}).reset_day || "mon")}. Hold any key ${esc(hold)} to fix it or look again; hold READY to fix everything.</p><p class="small muted">Click a key to see what it checks and why it is amber or red.</p></div>`; if (i < 0) return `<div class="card"><h2 style="margin-top:4px">The weekly checklist</h2>${plan}<p class="small">Amber: still to do. Blinking red: still missing once it is due (${esc(((c.ready || {}).due || []).map((w) => w.days.join("/") + " " + w.start + "-" + w.end).join(", "))}). BOH MIX is tapped done on the deck and reset every ${esc((c.ready || {}).reset_day || "mon")}. Hold any key ${esc(hold)} to fix it or look again; hold READY to fix everything.</p><p class="small muted">Click a key to see what it checks and why it is amber or red.</p></div>`;
const k = c.ready_page.keys[i], chk = (k.checks || [])[0] || {}; const k = c.ready_page.keys[i], chk = (k.checks || [])[0] || {};
const item = r.items && chk.item ? r.items[chk.item] : null; const item = r.items && chk.item ? r.items[chk.item] : null;
const fix = chk.fix && c.fixes[chk.fix]; const fix = chk.fix && c.fixes[chk.fix];
+1 -1
View File
@@ -553,7 +553,7 @@ def check_ready(chk, snap, ctx):
def check_ready_manual(chk, snap, ctx): def check_ready_manual(chk, snap, ctx):
"""A checklist line only a person can see (BOH mix, stage): a tap marks it done for the week.""" """A checklist line only a person can judge (BOH mix): a tap marks it done for the week."""
done = ctx.get("ready_done", {}).get(chk["item"]) done = ctx.get("ready_done", {}).get(chk["item"])
if done: if done:
return [("done", Result(OK, info="DONE " + datetime.fromtimestamp(done).strftime("%a %H:%M").upper()))] return [("done", Result(OK, info="DONE " + datetime.fromtimestamp(done).strftime("%a %H:%M").upper()))]
-1
View File
@@ -354,7 +354,6 @@ class TestWatchdog(unittest.TestCase):
self.assertEqual(tiles["rd_trk_out"]["x"], "TRACKS OUT\nNOT SENT SC") self.assertEqual(tiles["rd_trk_out"]["x"], "TRACKS OUT\nNOT SENT SC")
self.assertEqual(tiles["rd_trk_out"]["b"], sp.COLORS["warn"][0][0]) self.assertEqual(tiles["rd_trk_out"]["b"], sp.COLORS["warn"][0][0])
self.assertEqual(tiles["rd_boh"]["x"], "BOH MIX\nTAP WHEN DONE") self.assertEqual(tiles["rd_boh"]["x"], "BOH MIX\nTAP WHEN DONE")
self.assertEqual(tiles["rd_mics"]["x"], "MICS\n2 VOX MC TIM\nTAP WHEN SET")
self.assertEqual(tiles["rd_cross"]["b"], sp.COLORS["ok"][0][0]) self.assertEqual(tiles["rd_cross"]["b"], sp.COLORS["ok"][0][0])
self.assertTrue(tiles["ready"]["x"].startswith("READY\n")) self.assertTrue(tiles["ready"]["x"].startswith("READY\n"))
self.assertIn("TO DO", tiles["ready"]["x"]) self.assertIn("TO DO", tiles["ready"]["x"])