feat(spa): wire playout delete/reset/erase + scheduling context + templates preview calendar (#210)
Adds the SPA slice for the newly-merged playout endpoints:
- api/playouts: deletePlayout, resetChannelPlayout, erasePlayoutItems,
erasePlayoutItemsAndHistory, getPlayoutItemSchedulingContext (+ types).
- PlayoutsScreen: enable per-playout Reset (channel playout reset), Delete
(danger, confirm), and erase-by-kind buttons (Block = items + items&history;
Classic/Sequential/Scripted = items&history; none for ExternalJson); replaces
the stale "no per-playout reset endpoint" block. Disable Alternate schedules
for OnDemand Classic playouts (Blazor parity).
- Per-item scheduling-context dialog (info button when hasSchedulingContext &&
id != null), rendering the decoded JSON in a scrollable <pre>.
- Playout-templates editor: "Preview calendar" toggle with a Monday-first month
grid; winning template per day computed client-side via a colocated
appliesToDate/firstMatchingIndex helper that ports
AlternateScheduleSelector.GetScheduleForDate / PlayoutTemplateEditViewModel
.AppliesToDate exactly (inclusive range, year-wrap reverse, start-day rollover,
end-day clamp, explicit-year override).
- Button gains a title prop (parity with IconButton) for the disabled-button hint.
Tests: api client URL/method assertions, PlayoutsScreen action flows
(delete/reset/erase per kind, OnDemand gating, scheduling-context dialog +
error), calendar-helper unit tests, and a preview-calendar render test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>