package app import ( "fmt" "time" "github.com/seaweedfs/seaweedfs/weed/admin/maintenance" ) templ MaintenanceQueue(data *maintenance.MaintenanceQueueData) {

Maintenance Queue

{fmt.Sprintf("%d", data.Stats.PendingTasks)}

Pending Tasks

{fmt.Sprintf("%d", data.Stats.RunningTasks)}

Running Tasks

{fmt.Sprintf("%d", data.Stats.CompletedToday)}

Completed Today

{fmt.Sprintf("%d", data.Stats.FailedToday)}

Failed Today

Pending Tasks
if data.Stats.PendingTasks == 0 {

No pending maintenance tasks

Pending tasks will appear here when the system detects maintenance needs
} else {
for _, task := range data.Tasks { if string(task.Status) == "pending" { } }
Type Priority Volume Server Reason Created
@TaskTypeIcon(task.Type) {string(task.Type)} @PriorityBadge(task.Priority) {fmt.Sprintf("%d", task.VolumeID)} {task.Server} {task.Reason} {task.CreatedAt.Format("2006-01-02 15:04")}
}
Active Tasks
if data.Stats.RunningTasks == 0 {

No active maintenance tasks

Active tasks will appear here when workers start processing them
} else {
for _, task := range data.Tasks { if string(task.Status) == "assigned" || string(task.Status) == "in_progress" { } }
Type Status Progress Volume Worker Started
@TaskTypeIcon(task.Type) {string(task.Type)} @StatusBadge(task.Status) @ProgressBar(task.Progress, task.Status) {fmt.Sprintf("%d", task.VolumeID)} if task.WorkerID != "" { {task.WorkerID} } else { - } if task.StartedAt != nil { {task.StartedAt.Format("2006-01-02 15:04")} } else { - }
}
Completed Tasks
if data.Stats.CompletedToday == 0 && data.Stats.FailedToday == 0 {

No completed maintenance tasks today

Completed tasks will appear here after workers finish processing them
} else {
for _, task := range data.Tasks { if string(task.Status) == "completed" || string(task.Status) == "failed" || string(task.Status) == "cancelled" { if string(task.Status) == "failed" { } else { } } }
Type Status Volume Worker Duration Completed
@TaskTypeIcon(task.Type) {string(task.Type)} @StatusBadge(task.Status) {fmt.Sprintf("%d", task.VolumeID)} if task.WorkerID != "" { {task.WorkerID} } else { - } if task.StartedAt != nil && task.CompletedAt != nil { {formatDuration(task.CompletedAt.Sub(*task.StartedAt))} } else { - } if task.CompletedAt != nil { {task.CompletedAt.Format("2006-01-02 15:04")} } else { - }
@TaskTypeIcon(task.Type) {string(task.Type)} @StatusBadge(task.Status) {fmt.Sprintf("%d", task.VolumeID)} if task.WorkerID != "" { {task.WorkerID} } else { - } if task.StartedAt != nil && task.CompletedAt != nil { {formatDuration(task.CompletedAt.Sub(*task.StartedAt))} } else { - } if task.CompletedAt != nil { {task.CompletedAt.Format("2006-01-02 15:04")} } else { - }
}
} // Helper components templ TaskTypeIcon(taskType maintenance.MaintenanceTaskType) { } templ PriorityBadge(priority maintenance.MaintenanceTaskPriority) { switch priority { case maintenance.PriorityCritical: Critical case maintenance.PriorityHigh: High case maintenance.PriorityNormal: Normal case maintenance.PriorityLow: Low default: Unknown } } templ StatusBadge(status maintenance.MaintenanceTaskStatus) { switch status { case maintenance.TaskStatusPending: Pending case maintenance.TaskStatusAssigned: Assigned case maintenance.TaskStatusInProgress: Running case maintenance.TaskStatusCompleted: Completed case maintenance.TaskStatusFailed: Failed case maintenance.TaskStatusCancelled: Cancelled default: Unknown } } templ ProgressBar(progress float64, status maintenance.MaintenanceTaskStatus) { if status == maintenance.TaskStatusInProgress || status == maintenance.TaskStatusAssigned {
{fmt.Sprintf("%.1f%%", progress)} } else if status == maintenance.TaskStatusCompleted {
100% } else { - } } func formatDuration(d time.Duration) string { if d < time.Minute { return fmt.Sprintf("%.0fs", d.Seconds()) } else if d < time.Hour { return fmt.Sprintf("%.1fm", d.Minutes()) } else { return fmt.Sprintf("%.1fh", d.Hours()) } } func formatTimeAgo(t time.Time) string { duration := time.Since(t) if duration < time.Minute { return "just now" } else if duration < time.Hour { minutes := int(duration.Minutes()) return fmt.Sprintf("%dm ago", minutes) } else if duration < 24*time.Hour { hours := int(duration.Hours()) return fmt.Sprintf("%dh ago", hours) } else { days := int(duration.Hours() / 24) return fmt.Sprintf("%dd ago", days) } }