Files
ProdDash/modules/band-lineup/module.json
T
christianandClaude Opus 5.5 4b0f161c93 Band Lineup 1.11.1: Sync replaces last week's hand-placed people
Sync only filled empty spots and spots it had filled itself, so anyone
dragged in by hand stayed forever — pressing Sync for a new week swapped
some photos and left others, depending on how each spot got filled.

Hand placements are now stamped with the plan they were made for. Sync
keeps the ones made for the plan it is loading (a sub dragged in this
week survives a re-sync) and replaces or clears the rest. The last
synced plan is saved so placements made after a restart stamp right.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:03:31 -04:00

155 lines
4.6 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"id": "band-lineup",
"name": "Band Lineup",
"version": "1.11.1",
"proddash": ">=1.4.0",
"description": "Stage lineup photos with mic/pack labels — a drag-in photo library plus optional Planning Center auto-fill",
"client": "client.js",
"server": "server.js",
"style": "style.css",
"minSize": {
"w": 4,
"h": 3
},
"defaultSize": {
"w": 8,
"h": 5
},
"configGroups": {
"Planning Center credentials": {
"collapsed": "whenSet",
"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. Reading photos and birthdays needs People access on the token. Saved secrets never reach browsers."
},
"Stage": {
"help": "One mic/pack label per line, in the order they sit on stage. Scheduled people are matched into these by their Planning Center position (e.g. a line '[VOX 2] MIX 2' takes whoever is scheduled on Vox 2). Blank lines are empty spots."
},
"Photo library": {
"help": "Paste a Google Drive folder share link (set the folder to 'Anyone with the link → Viewer'). Every image is imported (file name → person's name) and kept in sync — add or remove photos in Drive and the board follows. A local folder path also works. If Drive can't be read, the board falls back to Planning Center photos."
}
},
"configSchema": {
"appId": {
"type": "string",
"label": "Client ID",
"default": "",
"group": "Planning Center credentials"
},
"secret": {
"type": "password",
"label": "Secret",
"default": "",
"group": "Planning Center credentials"
},
"accessToken": {
"type": "password",
"label": "OAuth 2.0 access token (instead of Client ID + Secret)",
"default": "",
"group": "Planning Center credentials"
},
"serviceTypeId": {
"type": "select",
"label": "Service type",
"default": "",
"optionsRoute": "/service-types"
},
"planId": {
"type": "select",
"label": "Plan",
"default": "",
"options": [
{
"value": "",
"label": "Automatic — today's plan, else the next upcoming"
}
],
"optionsRoute": "/plans",
"optionsDependsOn": "serviceTypeId"
},
"teams": {
"type": "text",
"label": "Teams to include",
"default": "Band\nWorship\nVocal\nProduction\nCommunication",
"help": "One team name (or keyword) per line. A person on any matching Planning Center team is eligible for the board."
},
"slots": {
"type": "text",
"label": "Stage slots",
"default": "[LEADER, VOX 1, ACOUSTIC] MIX 1\n[VOX 2] MIX 2\n[VOX 3] MIX 3\n[VOX 4] MIX 4\n[GUITAR, LEAD] MIX 5\n[BASS] MIX 6\n[VOX 5] MIX 7\n[PIANO]\n[DRUMS]\n[KEYS 2]\n[CALL TO WORSHIP] MC2\nSTAGE MANAGER\n[MC] MC1\n[SPEAKER] HEADSET",
"group": "Stage"
},
"columns": {
"type": "number",
"label": "Columns",
"default": 7,
"group": "Stage",
"help": "Default slots per row (each screen can still adjust with the − / + buttons in its title bar)."
},
"photoFolder": {
"type": "string",
"label": "Google Drive folder link",
"default": "",
"group": "Photo library",
"help": "e.g. https://drive.google.com/drive/folders/… (a local folder path also works). Leave blank to use Planning Center photos only."
}
},
"instanceGroups": {
"Birthday": {
"toggle": "birthdays"
}
},
"instanceSchema": {
"showNames": {
"type": "boolean",
"label": "Names",
"default": true
},
"showLabels": {
"type": "boolean",
"label": "Mic labels",
"default": true
},
"parallax": {
"type": "boolean",
"label": "Parallax motion",
"default": true
},
"birthdays": {
"type": "switch",
"label": "Birthday confetti",
"default": true,
"group": "Birthday"
},
"birthdayIntensity": {
"type": "select",
"label": "Intensity",
"default": "subtle",
"group": "Birthday",
"showWhen": "birthdays",
"options": [
{
"value": "subtle",
"label": "Subtle"
},
{
"value": "full",
"label": "Full"
}
]
},
"birthdayTest": {
"type": "select",
"label": "Force on (test)",
"default": "",
"group": "Birthday",
"showWhen": "birthdays",
"options": [
{
"value": "",
"label": "Off"
}
],
"optionsRoute": "/people"
}
}
}