Admin: Apply on the right; Service timing ⓘ in three sentences

The module forms' "Save & re-init" becomes "Apply", sitting at the right of
its row with the status text on the left — where a form's action belongs. The
PCO Plan Service timing help was a paragraph behind its ⓘ; it now says the
same thing in three sentences: who owns the clock and when it hands over, how
a service starts and ends, and where the document lists come from.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Waters Church
2026-09-13 13:55:36 -04:00
co-authored by Claude Fable 5.1
parent 54ed388591
commit b9d9e2894a
3 changed files with 8 additions and 5 deletions
+1 -1
View File
@@ -16,7 +16,7 @@
"help": "Create a Personal Access Token at api.planningcenteronline.com and paste its Client ID + Secret here, or paste an OAuth 2.0 access token instead. Saved secrets never reach browsers."
},
"Service timing": {
"help": "A plan's services (9:00, 11:00…) take turns owning the service clock: the next one takes over Pre-roll minutes before its scheduled start, once the previous one has ended or was due to end, and the elapsed clock, item timing and countdown start afresh for it. A service starts at its scheduled time unless Service start is set to a ProPresenter document — then it starts the moment that document goes live in ProPresenter (the document that opens the service; from Pre-roll before the scheduled start), falling back to the scheduled time if the document has not appeared Start failsafe minutes after it. It ends when the End document goes live (the document that closes the service — a post-service loop, say), or, without one, when the next service takes over or an hour after the last one's scheduled end. Documents are matched by name the way plan items are, so a renamed \"Post-Service Loop\" still counts as \"Post Service Loop\". The document lists hold what the ProPresenter module has shown or listed since ProdDash started plus what is saved here; a saved name stays selectable even when ProPresenter is off."
"help": "Each service in the plan takes its turn owning the service clock: the next one takes over Pre-roll minutes before its scheduled start, and the elapsed clock, item timing and countdown start afresh for it. A service starts at its scheduled time — or, with document triggers on, the moment the chosen Start document goes live in ProPresenter (falling back to the schedule after the start failsafe) — and ends when the End document goes live, or when the next service takes over. The document lists hold what ProPresenter has shown or listed since ProdDash started plus what is saved here; names are matched loosely, so a renamed \"Post-Service Loop\" still counts."
}
},
"configSchema": {
+3
View File
@@ -295,12 +295,15 @@ details.field-group > summary.field-group-title:hover { color: var(--text); }
}
.field.switch-field .switch-label { font-size: 13px; }
/* status on the left, Apply on the right */
.module-actions {
display: flex;
align-items: center;
gap: 10px;
margin-top: 4px;
}
.module-actions .admin-status { flex: 1; margin-top: 0; }
.module-actions .btn { margin-left: auto; }
.admin-status { min-height: 16px; font-size: 12px; color: var(--muted); margin-top: 8px; }
.admin-status.error { color: var(--danger); }
+4 -4
View File
@@ -586,10 +586,10 @@ function buildModuleCard(mod) {
actions.className = 'module-actions';
const save = document.createElement('button');
save.className = 'btn primary';
save.textContent = 'Save & re-init';
save.textContent = 'Apply';
const status = document.createElement('span');
status.className = 'admin-status';
actions.append(save, status);
actions.append(status, save);
form.appendChild(actions);
card.appendChild(form);
@@ -597,14 +597,14 @@ function buildModuleCard(mod) {
const config = {};
for (const [key, read] of readers) config[key] = read();
save.disabled = true;
status.textContent = 'Saving…';
status.textContent = 'Applying…';
status.className = 'admin-status';
try {
await api(`/api/admin/modules/${encodeURIComponent(mod.id)}/config`, {
method: 'PUT',
body: JSON.stringify({ config }),
});
status.textContent = 'Saved — module re-initialised. Open tiles reconnect on their own.';
status.textContent = 'Applied — module re-initialised. Open tiles reconnect on their own.';
status.className = 'admin-status ok';
refreshStatus();
// What the module can list may have changed (credentials just