Schedule
{#if canManage}
showAdd = !showAdd}>+ Add shift
{/if}
{#if error}
{error}
{/if} {#if showAdd && canManage}
Department *
Select department…
{#each visibleDepts as d}
{d.name}
{/each}
Shift name *
Day *
Capacity
(0 = unlimited)
Start time *
End time *
{adding ? 'Adding…' : 'Add shift'}
showAdd = false}>Cancel
{/if} {#if ($allShifts ?? []).length === 0 && !showAdd}
No shifts scheduled yet
Create departments first, then add shifts here. Volunteers can self-select shifts via the kiosk.
{:else} {#each board as { dept, days }} {#if days.length > 0}
{dept.name}
{#each days as [day, rows]}
{formatDay(day)}
{#each rows as { shift, assigned, hasConflict }, i}
{#if editShiftID === shift.id}
Name
Day
Start
End
Capacity
{saving ? '…' : 'Save'}
Cancel
{:else}
{shift.name}
{fmt(shift.start_time)}–{fmt(shift.end_time)}
{#if shift.capacity > 0}
{assigned.length}/{shift.capacity}
{:else if assigned.length > 0}
{assigned.length}
{/if} {#if hasConflict}
⚠ conflict
{/if}
startEdit(shift)}>Edit
reorder(shift.id, -1, rows)}>↑
reorder(shift.id, 1, rows)}>↓
deleteShift(shift)}>Delete
{#if assigned.length > 0}
{#each assigned as { vs, volunteer }}
{volunteer.name} {#if volunteer.is_lead}
Co-Lead
{/if} {#if checkConflict(volunteer.id, shift.id, $allVolunteerShifts ?? [], $allShifts ?? [])}
⚠
{/if}
unassign(shift.id, volunteer.id)} title="Remove">×
{/each}
{/if} {#if assigningShiftID === shift.id}
— Select volunteer —
{#each $allVolunteers ?? [] as v}
{v.name}
{/each}
doAssign(shift.id)} disabled={!assignVolID || assigning}> {assigning ? '…' : 'Assign'}
doAssignForce(shift.id)} disabled={!assignVolID || assigning} title="Assign ignoring conflicts"> Force
{ assigningShiftID = null; assignVolID = 0 }}>Cancel
{:else}
startAssign(shift.id)}>+ Assign volunteer
{/if} {/if}
{/each} {/each}
{/if} {/each} {/if}