{{/* Poll Lane status: one row per Site's latest durable pass, refreshing itself so a run can be watched rather than sampled by reloading. The refresh is one attribute on the fragment root and the endpoint answers with this same fragment, so the swap replaces the element that asked. Every figure is read from poll_passes, never from a running poller: a restart answers from the database the moment it is up (issue #145). The browser fact is a deployment-config fact plus a reachability derived from the pass log; the cause chips and the state phrase are decided in Go, this template only prints them. */}} {{define "lanes"}}

Poll Lanes

{{if .PollerOff}}Polling: off {{else}}Browser: {{if not .BrowserConfigured}}not configured{{else if .BrowserReachable}}reachable{{else}}unreachable{{end}}{{end}}

{{if .Rows}}
SiteDueCheckedGap Last passOutcomes · state
{{range .Rows}}
{{.Site}} {{.Due}} {{.Checked}} {{.Gap}} ran {{.Ran}} {{if .HasChips}}{{range $i, $c := .Chips}}{{if $i}} · {{end}}{{$c.Name}} {{$c.Count}}{{end}}{{else}}none observed{{end}}{{if .StatePhrase}} · {{.StatePhrase}}{{end}} {{/* The pause control lives in the one slot the design leaves for it: a running Lane offers the three durations and Pause; a paused Lane offers Resume in the same place. Pause is not destruction — it takes nothing away and reverses in one press — so neither wears a confirm row or the danger accent. The form wraps the select so the offered duration travels with the press. */}} {{if .Paused}}
{{else}}
{{end}}
{{end}}
{{else}}

No data yet — no Lane has recorded a pass.

{{end}}
{{end}}