17ec55cb85
Remove ~126 lines of orphaned CSS from tile slim-down and old detail layout. Consolidate 4 duplicate duration formatters into shared elapsed()/fmtElapsed() helpers. Break 160-line Result handler into focused sub-functions. Implement real Hub.Shutdown() (was a no-op). Standardize agent error responses to JSON. Replace panic() in router init with error return. Extract magic numbers as named constants. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
43 lines
851 B
Go
43 lines
851 B
Go
package templates
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func elapsed(start, end *time.Time) time.Duration {
|
|
if start == nil {
|
|
return -1
|
|
}
|
|
e := time.Now()
|
|
if end != nil {
|
|
e = *end
|
|
}
|
|
d := e.Sub(*start)
|
|
if d < 0 {
|
|
return 0
|
|
}
|
|
return d
|
|
}
|
|
|
|
func fmtElapsed(d time.Duration, long bool) string {
|
|
switch {
|
|
case d < time.Second:
|
|
return fmt.Sprintf("%dms", int(d/time.Millisecond))
|
|
case d < 10*time.Second:
|
|
return fmt.Sprintf("%.1fs", d.Seconds())
|
|
case d < time.Minute:
|
|
return fmt.Sprintf("%ds", int(d/time.Second))
|
|
case d < time.Hour:
|
|
if long {
|
|
return fmt.Sprintf("%dm %ds", int(d/time.Minute), int((d%time.Minute)/time.Second))
|
|
}
|
|
return fmt.Sprintf("%dm", int(d/time.Minute))
|
|
default:
|
|
if long {
|
|
return fmt.Sprintf("%dh %dm", int(d/time.Hour), int((d%time.Hour)/time.Minute))
|
|
}
|
|
return fmt.Sprintf("%dh", int(d/time.Hour))
|
|
}
|
|
}
|