You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							401 lines
						
					
					
						
							27 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							401 lines
						
					
					
						
							27 KiB
						
					
					
				
								// Code generated by templ - DO NOT EDIT.
							 | 
						|
								
							 | 
						|
								// templ: version: v0.3.960
							 | 
						|
								package app
							 | 
						|
								
							 | 
						|
								//lint:file-ignore SA4006 This context is only used if a nested component is present.
							 | 
						|
								
							 | 
						|
								import "github.com/a-h/templ"
							 | 
						|
								import templruntime "github.com/a-h/templ/runtime"
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"fmt"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/admin/dash"
							 | 
						|
									"time"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func MaintenanceWorkers(data *dash.MaintenanceWorkersData) templ.Component {
							 | 
						|
									return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
							 | 
						|
										templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
							 | 
						|
										if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
							 | 
						|
											return templ_7745c5c3_CtxErr
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
							 | 
						|
										if !templ_7745c5c3_IsBuffer {
							 | 
						|
											defer func() {
							 | 
						|
												templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
							 | 
						|
												if templ_7745c5c3_Err == nil {
							 | 
						|
													templ_7745c5c3_Err = templ_7745c5c3_BufErr
							 | 
						|
												}
							 | 
						|
											}()
							 | 
						|
										}
							 | 
						|
										ctx = templ.InitializeContext(ctx)
							 | 
						|
										templ_7745c5c3_Var1 := templ.GetChildren(ctx)
							 | 
						|
										if templ_7745c5c3_Var1 == nil {
							 | 
						|
											templ_7745c5c3_Var1 = templ.NopComponent
							 | 
						|
										}
							 | 
						|
										ctx = templ.ClearChildren(ctx)
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"container-fluid\"><div class=\"row\"><div class=\"col-12\"><div class=\"d-flex justify-content-between align-items-center mb-4\"><div><h1 class=\"h3 mb-0 text-gray-800\">Maintenance Workers</h1><p class=\"text-muted\">Monitor and manage maintenance workers</p></div><div class=\"text-end\"><small class=\"text-muted\">Last updated: ")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										var templ_7745c5c3_Var2 string
							 | 
						|
										templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05"))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 19, Col: 112}
							 | 
						|
										}
							 | 
						|
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</small></div></div></div></div><!-- Summary Cards --><div class=\"row mb-4\"><div class=\"col-xl-3 col-md-6 mb-4\"><div class=\"card border-left-primary shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-primary text-uppercase mb-1\">Total Workers</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										var templ_7745c5c3_Var3 string
							 | 
						|
										templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(data.Workers)))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 35, Col: 122}
							 | 
						|
										}
							 | 
						|
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</div></div><div class=\"col-auto\"><i class=\"fas fa-users fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-3 col-md-6 mb-4\"><div class=\"card border-left-success shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-success text-uppercase mb-1\">Active Workers</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										var templ_7745c5c3_Var4 string
							 | 
						|
										templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.ActiveWorkers))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 54, Col: 75}
							 | 
						|
										}
							 | 
						|
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "</div></div><div class=\"col-auto\"><i class=\"fas fa-check-circle fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-3 col-md-6 mb-4\"><div class=\"card border-left-info shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-info text-uppercase mb-1\">Busy Workers</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										var templ_7745c5c3_Var5 string
							 | 
						|
										templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.BusyWorkers))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 74, Col: 73}
							 | 
						|
										}
							 | 
						|
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</div></div><div class=\"col-auto\"><i class=\"fas fa-spinner fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-3 col-md-6 mb-4\"><div class=\"card border-left-warning shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-warning text-uppercase mb-1\">Total Load</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										var templ_7745c5c3_Var6 string
							 | 
						|
										templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalLoad))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 94, Col: 71}
							 | 
						|
										}
							 | 
						|
										_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</div></div><div class=\"col-auto\"><i class=\"fas fa-tasks fa-2x text-gray-300\"></i></div></div></div></div></div></div><!-- Workers Table --><div class=\"row\"><div class=\"col-12\"><div class=\"card shadow mb-4\"><div class=\"card-header py-3\"><h6 class=\"m-0 font-weight-bold text-primary\">Worker Details</h6></div><div class=\"card-body\">")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										if len(data.Workers) == 0 {
							 | 
						|
											templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<div class=\"text-center py-4\"><i class=\"fas fa-users fa-3x text-gray-300 mb-3\"></i><h5 class=\"text-gray-600\">No Workers Found</h5><p class=\"text-muted\">No maintenance workers are currently registered.</p><div class=\"alert alert-info mt-3\"><strong>Tip:</strong> To start a worker, run:<br><code>weed worker -admin=<admin_server> -capabilities=vacuum,ec,replication</code></div></div>")
							 | 
						|
											if templ_7745c5c3_Err != nil {
							 | 
						|
												return templ_7745c5c3_Err
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<div class=\"table-responsive\"><table class=\"table table-bordered table-hover\" id=\"workersTable\"><thead class=\"table-light\"><tr><th>Worker ID</th><th>Address</th><th>Status</th><th>Capabilities</th><th>Load</th><th>Current Tasks</th><th>Performance</th><th>Last Heartbeat</th><th>Actions</th></tr></thead> <tbody>")
							 | 
						|
											if templ_7745c5c3_Err != nil {
							 | 
						|
												return templ_7745c5c3_Err
							 | 
						|
											}
							 | 
						|
											for _, worker := range data.Workers {
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<tr><td><code>")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var7 string
							 | 
						|
												templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.ID)
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 144, Col: 76}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</code></td><td><code>")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var8 string
							 | 
						|
												templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.Address)
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 147, Col: 81}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</code></td><td>")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												if worker.Worker.Status == "active" {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<span class=\"badge bg-success\">Active</span>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												} else if worker.Worker.Status == "busy" {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<span class=\"badge bg-warning\">Busy</span>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<span class=\"badge bg-danger\">Inactive</span>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "</td><td><div class=\"d-flex flex-wrap gap-1\">")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												for _, capability := range worker.Worker.Capabilities {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<span class=\"badge bg-secondary rounded-pill\">")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var9 string
							 | 
						|
													templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(string(capability))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 161, Col: 126}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</span>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</div></td><td><div class=\"progress\" style=\"height: 20px;\">")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												if worker.Worker.MaxConcurrent > 0 {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<div class=\"progress-bar\" role=\"progressbar\" style=\"")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var10 string
							 | 
						|
													templ_7745c5c3_Var10, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %d%%", (worker.Worker.CurrentLoad*100)/worker.Worker.MaxConcurrent))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 169, Col: 160}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\" aria-valuenow=\"")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var11 string
							 | 
						|
													templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Worker.CurrentLoad))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 170, Col: 125}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" aria-valuemin=\"0\" aria-valuemax=\"")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var12 string
							 | 
						|
													templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Worker.MaxConcurrent))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 172, Col: 127}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\">")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var13 string
							 | 
						|
													templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d/%d", worker.Worker.CurrentLoad, worker.Worker.MaxConcurrent))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 173, Col: 142}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</div>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<div class=\"progress-bar\" role=\"progressbar\" style=\"width: 0%\">0/0</div>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</div></td><td>")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var14 string
							 | 
						|
												templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(worker.CurrentTasks)))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 181, Col: 97}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</td><td><small><div>Completed: ")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var15 string
							 | 
						|
												templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Performance.TasksCompleted))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 185, Col: 122}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "</div><div>Failed: ")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var16 string
							 | 
						|
												templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Performance.TasksFailed))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 186, Col: 116}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</div><div>Success Rate: ")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var17 string
							 | 
						|
												templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.1f%%", worker.Performance.SuccessRate))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 187, Col: 126}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</div></small></td><td>")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												if time.Since(worker.Worker.LastHeartbeat) < 2*time.Minute {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<span class=\"text-success\"><i class=\"fas fa-heartbeat\"></i> ")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var18 string
							 | 
						|
													templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.LastHeartbeat.Format("15:04:05"))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 194, Col: 108}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</span>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<span class=\"text-danger\"><i class=\"fas fa-exclamation-triangle\"></i> ")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var19 string
							 | 
						|
													templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.LastHeartbeat.Format("15:04:05"))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 199, Col: 108}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</span>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</td><td><div class=\"btn-group btn-group-sm\" role=\"group\"><button type=\"button\" class=\"btn btn-outline-info\" onclick=\"showWorkerDetails(event)\" data-worker-id=\"")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												var templ_7745c5c3_Var20 string
							 | 
						|
												templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.ID)
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 205, Col: 175}
							 | 
						|
												}
							 | 
						|
												_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "\"><i class=\"fas fa-info-circle\"></i></button> ")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
												if worker.Worker.Status == "active" {
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<button type=\"button\" class=\"btn btn-outline-warning\" onclick=\"pauseWorker(event)\" data-worker-id=\"")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													var templ_7745c5c3_Var21 string
							 | 
						|
													templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.ID)
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 209, Col: 176}
							 | 
						|
													}
							 | 
						|
													_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
													templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "\"><i class=\"fas fa-pause\"></i></button>")
							 | 
						|
													if templ_7745c5c3_Err != nil {
							 | 
						|
														return templ_7745c5c3_Err
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</div></td></tr>")
							 | 
						|
												if templ_7745c5c3_Err != nil {
							 | 
						|
													return templ_7745c5c3_Err
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</tbody></table></div>")
							 | 
						|
											if templ_7745c5c3_Err != nil {
							 | 
						|
												return templ_7745c5c3_Err
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</div></div></div></div></div><!-- Worker Details Modal --><div class=\"modal fade\" id=\"workerDetailsModal\" tabindex=\"-1\" aria-labelledby=\"workerDetailsModalLabel\" aria-hidden=\"true\"><div class=\"modal-dialog modal-lg\"><div class=\"modal-content\"><div class=\"modal-header\"><h5 class=\"modal-title\" id=\"workerDetailsModalLabel\">Worker Details</h5><button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button></div><div class=\"modal-body\" id=\"workerDetailsContent\"><!-- Content will be loaded dynamically --></div></div></div></div><script>\n    function showWorkerDetails(event) {\n        const workerID = event.target.closest('button').getAttribute('data-worker-id');\n        \n        // Show modal\n        var modal = new bootstrap.Modal(document.getElementById('workerDetailsModal'));\n        \n        // Load worker details\n        fetch('/api/maintenance/workers/' + workerID)\n            .then(response => response.json())\n            .then(data => {\n                const content = document.getElementById('workerDetailsContent');\n                content.innerHTML = '<div class=\"row\">' +\n                    '<div class=\"col-md-6\">' +\n                        '<h6>Worker Information</h6>' +\n                        '<ul class=\"list-unstyled\">' +\n                            '<li><strong>ID:</strong> ' + data.worker.id + '</li>' +\n                            '<li><strong>Address:</strong> ' + data.worker.address + '</li>' +\n                            '<li><strong>Status:</strong> ' + data.worker.status + '</li>' +\n                            '<li><strong>Max Concurrent:</strong> ' + data.worker.max_concurrent + '</li>' +\n                            '<li><strong>Current Load:</strong> ' + data.worker.current_load + '</li>' +\n                        '</ul>' +\n                    '</div>' +\n                    '<div class=\"col-md-6\">' +\n                        '<h6>Performance Metrics</h6>' +\n                        '<ul class=\"list-unstyled\">' +\n                            '<li><strong>Tasks Completed:</strong> ' + data.performance.tasks_completed + '</li>' +\n                            '<li><strong>Tasks Failed:</strong> ' + data.performance.tasks_failed + '</li>' +\n                            '<li><strong>Success Rate:</strong> ' + data.performance.success_rate.toFixed(1) + '%</li>' +\n                            '<li><strong>Average Task Time:</strong> ' + formatDuration(data.performance.average_task_time) + '</li>' +\n                            '<li><strong>Uptime:</strong> ' + formatDuration(data.performance.uptime) + '</li>' +\n                        '</ul>' +\n                    '</div>' +\n                '</div>' +\n                '<hr>' +\n                '<h6>Current Tasks</h6>' +\n                (data.current_tasks.length === 0 ? \n                    '<p class=\"text-muted\">No current tasks</p>' :\n                    data.current_tasks.map(task => \n                        '<div class=\"card mb-2\">' +\n                            '<div class=\"card-body py-2\">' +\n                                '<div class=\"d-flex justify-content-between\">' +\n                                    '<span><strong>' + task.type + '</strong> - Volume ' + task.volume_id + '</span>' +\n                                    '<span class=\"badge bg-info\">' + task.status + '</span>' +\n                                '</div>' +\n                                '<small class=\"text-muted\">' + task.reason + '</small>' +\n                            '</div>' +\n                        '</div>'\n                    ).join('')\n                );\n                modal.show();\n            })\n            .catch(error => {\n                console.error('Error loading worker details:', error);\n                const content = document.getElementById('workerDetailsContent');\n                content.innerHTML = '<div class=\"alert alert-danger\">Failed to load worker details</div>';\n                modal.show();\n            });\n    }\n\n    function pauseWorker(event) {\n        const workerID = event.target.closest('button').getAttribute('data-worker-id');\n        \n        if (confirm('Are you sure you want to pause this worker?')) {\n            fetch('/api/maintenance/workers/' + workerID + '/pause', {\n                method: 'POST'\n            })\n            .then(response => response.json())\n            .then(data => {\n                if (data.success) {\n                    location.reload();\n                } else {\n                    alert('Failed to pause worker: ' + data.error);\n                }\n            })\n            .catch(error => {\n                console.error('Error pausing worker:', error);\n                alert('Failed to pause worker');\n            });\n        }\n    }\n\n    function formatDuration(nanoseconds) {\n        const seconds = Math.floor(nanoseconds / 1000000000);\n        const minutes = Math.floor(seconds / 60);\n        const hours = Math.floor(minutes / 60);\n        \n        if (hours > 0) {\n            return hours + 'h ' + (minutes % 60) + 'm';\n        } else if (minutes > 0) {\n            return minutes + 'm ' + (seconds % 60) + 's';\n        } else {\n            return seconds + 's';\n        }\n    }\n    </script>")
							 | 
						|
										if templ_7745c5c3_Err != nil {
							 | 
						|
											return templ_7745c5c3_Err
							 | 
						|
										}
							 | 
						|
										return nil
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								var _ = templruntime.GeneratedTemplate
							 |