maintenance_workers_templ.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. // Code generated by templ - DO NOT EDIT.
  2. // templ: version: v0.3.906
  3. package app
  4. //lint:file-ignore SA4006 This context is only used if a nested component is present.
  5. import "github.com/a-h/templ"
  6. import templruntime "github.com/a-h/templ/runtime"
  7. import (
  8. "fmt"
  9. "github.com/seaweedfs/seaweedfs/weed/admin/dash"
  10. "time"
  11. )
  12. func MaintenanceWorkers(data *dash.MaintenanceWorkersData) templ.Component {
  13. return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
  14. templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
  15. if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
  16. return templ_7745c5c3_CtxErr
  17. }
  18. templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
  19. if !templ_7745c5c3_IsBuffer {
  20. defer func() {
  21. templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
  22. if templ_7745c5c3_Err == nil {
  23. templ_7745c5c3_Err = templ_7745c5c3_BufErr
  24. }
  25. }()
  26. }
  27. ctx = templ.InitializeContext(ctx)
  28. templ_7745c5c3_Var1 := templ.GetChildren(ctx)
  29. if templ_7745c5c3_Var1 == nil {
  30. templ_7745c5c3_Var1 = templ.NopComponent
  31. }
  32. ctx = templ.ClearChildren(ctx)
  33. 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: ")
  34. if templ_7745c5c3_Err != nil {
  35. return templ_7745c5c3_Err
  36. }
  37. var templ_7745c5c3_Var2 string
  38. templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05"))
  39. if templ_7745c5c3_Err != nil {
  40. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 19, Col: 112}
  41. }
  42. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
  43. if templ_7745c5c3_Err != nil {
  44. return templ_7745c5c3_Err
  45. }
  46. 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\">")
  47. if templ_7745c5c3_Err != nil {
  48. return templ_7745c5c3_Err
  49. }
  50. var templ_7745c5c3_Var3 string
  51. templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(data.Workers)))
  52. if templ_7745c5c3_Err != nil {
  53. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 35, Col: 122}
  54. }
  55. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
  56. if templ_7745c5c3_Err != nil {
  57. return templ_7745c5c3_Err
  58. }
  59. 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\">")
  60. if templ_7745c5c3_Err != nil {
  61. return templ_7745c5c3_Err
  62. }
  63. var templ_7745c5c3_Var4 string
  64. templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.ActiveWorkers))
  65. if templ_7745c5c3_Err != nil {
  66. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 54, Col: 75}
  67. }
  68. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
  69. if templ_7745c5c3_Err != nil {
  70. return templ_7745c5c3_Err
  71. }
  72. 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\">")
  73. if templ_7745c5c3_Err != nil {
  74. return templ_7745c5c3_Err
  75. }
  76. var templ_7745c5c3_Var5 string
  77. templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.BusyWorkers))
  78. if templ_7745c5c3_Err != nil {
  79. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 74, Col: 73}
  80. }
  81. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
  82. if templ_7745c5c3_Err != nil {
  83. return templ_7745c5c3_Err
  84. }
  85. 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\">")
  86. if templ_7745c5c3_Err != nil {
  87. return templ_7745c5c3_Err
  88. }
  89. var templ_7745c5c3_Var6 string
  90. templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalLoad))
  91. if templ_7745c5c3_Err != nil {
  92. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 94, Col: 71}
  93. }
  94. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
  95. if templ_7745c5c3_Err != nil {
  96. return templ_7745c5c3_Err
  97. }
  98. 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\">")
  99. if templ_7745c5c3_Err != nil {
  100. return templ_7745c5c3_Err
  101. }
  102. if len(data.Workers) == 0 {
  103. 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=&lt;admin_server&gt; -capabilities=vacuum,ec,replication</code></div></div>")
  104. if templ_7745c5c3_Err != nil {
  105. return templ_7745c5c3_Err
  106. }
  107. } else {
  108. 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>")
  109. if templ_7745c5c3_Err != nil {
  110. return templ_7745c5c3_Err
  111. }
  112. for _, worker := range data.Workers {
  113. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "<tr><td><code>")
  114. if templ_7745c5c3_Err != nil {
  115. return templ_7745c5c3_Err
  116. }
  117. var templ_7745c5c3_Var7 string
  118. templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.ID)
  119. if templ_7745c5c3_Err != nil {
  120. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 144, Col: 76}
  121. }
  122. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
  123. if templ_7745c5c3_Err != nil {
  124. return templ_7745c5c3_Err
  125. }
  126. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</code></td><td><code>")
  127. if templ_7745c5c3_Err != nil {
  128. return templ_7745c5c3_Err
  129. }
  130. var templ_7745c5c3_Var8 string
  131. templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.Address)
  132. if templ_7745c5c3_Err != nil {
  133. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 147, Col: 81}
  134. }
  135. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
  136. if templ_7745c5c3_Err != nil {
  137. return templ_7745c5c3_Err
  138. }
  139. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</code></td><td>")
  140. if templ_7745c5c3_Err != nil {
  141. return templ_7745c5c3_Err
  142. }
  143. if worker.Worker.Status == "active" {
  144. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<span class=\"badge bg-success\">Active</span>")
  145. if templ_7745c5c3_Err != nil {
  146. return templ_7745c5c3_Err
  147. }
  148. } else if worker.Worker.Status == "busy" {
  149. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<span class=\"badge bg-warning\">Busy</span>")
  150. if templ_7745c5c3_Err != nil {
  151. return templ_7745c5c3_Err
  152. }
  153. } else {
  154. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<span class=\"badge bg-danger\">Inactive</span>")
  155. if templ_7745c5c3_Err != nil {
  156. return templ_7745c5c3_Err
  157. }
  158. }
  159. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "</td><td><div class=\"d-flex flex-wrap gap-1\">")
  160. if templ_7745c5c3_Err != nil {
  161. return templ_7745c5c3_Err
  162. }
  163. for _, capability := range worker.Worker.Capabilities {
  164. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<span class=\"badge bg-secondary rounded-pill\">")
  165. if templ_7745c5c3_Err != nil {
  166. return templ_7745c5c3_Err
  167. }
  168. var templ_7745c5c3_Var9 string
  169. templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(string(capability))
  170. if templ_7745c5c3_Err != nil {
  171. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 161, Col: 126}
  172. }
  173. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
  174. if templ_7745c5c3_Err != nil {
  175. return templ_7745c5c3_Err
  176. }
  177. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</span>")
  178. if templ_7745c5c3_Err != nil {
  179. return templ_7745c5c3_Err
  180. }
  181. }
  182. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</div></td><td><div class=\"progress\" style=\"height: 20px;\">")
  183. if templ_7745c5c3_Err != nil {
  184. return templ_7745c5c3_Err
  185. }
  186. if worker.Worker.MaxConcurrent > 0 {
  187. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<div class=\"progress-bar\" role=\"progressbar\" style=\"")
  188. if templ_7745c5c3_Err != nil {
  189. return templ_7745c5c3_Err
  190. }
  191. var templ_7745c5c3_Var10 string
  192. templ_7745c5c3_Var10, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %d%%", (worker.Worker.CurrentLoad*100)/worker.Worker.MaxConcurrent))
  193. if templ_7745c5c3_Err != nil {
  194. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 169, Col: 160}
  195. }
  196. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
  197. if templ_7745c5c3_Err != nil {
  198. return templ_7745c5c3_Err
  199. }
  200. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\" aria-valuenow=\"")
  201. if templ_7745c5c3_Err != nil {
  202. return templ_7745c5c3_Err
  203. }
  204. var templ_7745c5c3_Var11 string
  205. templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Worker.CurrentLoad))
  206. if templ_7745c5c3_Err != nil {
  207. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 170, Col: 125}
  208. }
  209. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
  210. if templ_7745c5c3_Err != nil {
  211. return templ_7745c5c3_Err
  212. }
  213. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" aria-valuemin=\"0\" aria-valuemax=\"")
  214. if templ_7745c5c3_Err != nil {
  215. return templ_7745c5c3_Err
  216. }
  217. var templ_7745c5c3_Var12 string
  218. templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Worker.MaxConcurrent))
  219. if templ_7745c5c3_Err != nil {
  220. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 172, Col: 127}
  221. }
  222. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
  223. if templ_7745c5c3_Err != nil {
  224. return templ_7745c5c3_Err
  225. }
  226. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\">")
  227. if templ_7745c5c3_Err != nil {
  228. return templ_7745c5c3_Err
  229. }
  230. var templ_7745c5c3_Var13 string
  231. templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d/%d", worker.Worker.CurrentLoad, worker.Worker.MaxConcurrent))
  232. if templ_7745c5c3_Err != nil {
  233. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 173, Col: 142}
  234. }
  235. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
  236. if templ_7745c5c3_Err != nil {
  237. return templ_7745c5c3_Err
  238. }
  239. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</div>")
  240. if templ_7745c5c3_Err != nil {
  241. return templ_7745c5c3_Err
  242. }
  243. } else {
  244. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<div class=\"progress-bar\" role=\"progressbar\" style=\"width: 0%\">0/0</div>")
  245. if templ_7745c5c3_Err != nil {
  246. return templ_7745c5c3_Err
  247. }
  248. }
  249. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</div></td><td>")
  250. if templ_7745c5c3_Err != nil {
  251. return templ_7745c5c3_Err
  252. }
  253. var templ_7745c5c3_Var14 string
  254. templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(worker.CurrentTasks)))
  255. if templ_7745c5c3_Err != nil {
  256. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 181, Col: 97}
  257. }
  258. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
  259. if templ_7745c5c3_Err != nil {
  260. return templ_7745c5c3_Err
  261. }
  262. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</td><td><small><div>✅ ")
  263. if templ_7745c5c3_Err != nil {
  264. return templ_7745c5c3_Err
  265. }
  266. var templ_7745c5c3_Var15 string
  267. templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Performance.TasksCompleted))
  268. if templ_7745c5c3_Err != nil {
  269. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 185, Col: 119}
  270. }
  271. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
  272. if templ_7745c5c3_Err != nil {
  273. return templ_7745c5c3_Err
  274. }
  275. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "</div><div>❌ ")
  276. if templ_7745c5c3_Err != nil {
  277. return templ_7745c5c3_Err
  278. }
  279. var templ_7745c5c3_Var16 string
  280. templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", worker.Performance.TasksFailed))
  281. if templ_7745c5c3_Err != nil {
  282. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 186, Col: 116}
  283. }
  284. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
  285. if templ_7745c5c3_Err != nil {
  286. return templ_7745c5c3_Err
  287. }
  288. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</div><div>📊 ")
  289. if templ_7745c5c3_Err != nil {
  290. return templ_7745c5c3_Err
  291. }
  292. var templ_7745c5c3_Var17 string
  293. templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.1f%%", worker.Performance.SuccessRate))
  294. if templ_7745c5c3_Err != nil {
  295. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 187, Col: 121}
  296. }
  297. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
  298. if templ_7745c5c3_Err != nil {
  299. return templ_7745c5c3_Err
  300. }
  301. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</div></small></td><td>")
  302. if templ_7745c5c3_Err != nil {
  303. return templ_7745c5c3_Err
  304. }
  305. if time.Since(worker.Worker.LastHeartbeat) < 2*time.Minute {
  306. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<span class=\"text-success\"><i class=\"fas fa-heartbeat\"></i> ")
  307. if templ_7745c5c3_Err != nil {
  308. return templ_7745c5c3_Err
  309. }
  310. var templ_7745c5c3_Var18 string
  311. templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.LastHeartbeat.Format("15:04:05"))
  312. if templ_7745c5c3_Err != nil {
  313. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 194, Col: 108}
  314. }
  315. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
  316. if templ_7745c5c3_Err != nil {
  317. return templ_7745c5c3_Err
  318. }
  319. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</span>")
  320. if templ_7745c5c3_Err != nil {
  321. return templ_7745c5c3_Err
  322. }
  323. } else {
  324. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<span class=\"text-danger\"><i class=\"fas fa-exclamation-triangle\"></i> ")
  325. if templ_7745c5c3_Err != nil {
  326. return templ_7745c5c3_Err
  327. }
  328. var templ_7745c5c3_Var19 string
  329. templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.LastHeartbeat.Format("15:04:05"))
  330. if templ_7745c5c3_Err != nil {
  331. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 199, Col: 108}
  332. }
  333. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
  334. if templ_7745c5c3_Err != nil {
  335. return templ_7745c5c3_Err
  336. }
  337. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</span>")
  338. if templ_7745c5c3_Err != nil {
  339. return templ_7745c5c3_Err
  340. }
  341. }
  342. 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=\"")
  343. if templ_7745c5c3_Err != nil {
  344. return templ_7745c5c3_Err
  345. }
  346. var templ_7745c5c3_Var20 string
  347. templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.ID)
  348. if templ_7745c5c3_Err != nil {
  349. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 205, Col: 175}
  350. }
  351. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
  352. if templ_7745c5c3_Err != nil {
  353. return templ_7745c5c3_Err
  354. }
  355. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "\"><i class=\"fas fa-info-circle\"></i></button> ")
  356. if templ_7745c5c3_Err != nil {
  357. return templ_7745c5c3_Err
  358. }
  359. if worker.Worker.Status == "active" {
  360. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<button type=\"button\" class=\"btn btn-outline-warning\" onclick=\"pauseWorker(event)\" data-worker-id=\"")
  361. if templ_7745c5c3_Err != nil {
  362. return templ_7745c5c3_Err
  363. }
  364. var templ_7745c5c3_Var21 string
  365. templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(worker.Worker.ID)
  366. if templ_7745c5c3_Err != nil {
  367. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/maintenance_workers.templ`, Line: 209, Col: 176}
  368. }
  369. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
  370. if templ_7745c5c3_Err != nil {
  371. return templ_7745c5c3_Err
  372. }
  373. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "\"><i class=\"fas fa-pause\"></i></button>")
  374. if templ_7745c5c3_Err != nil {
  375. return templ_7745c5c3_Err
  376. }
  377. }
  378. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</div></td></tr>")
  379. if templ_7745c5c3_Err != nil {
  380. return templ_7745c5c3_Err
  381. }
  382. }
  383. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</tbody></table></div>")
  384. if templ_7745c5c3_Err != nil {
  385. return templ_7745c5c3_Err
  386. }
  387. }
  388. 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>")
  389. if templ_7745c5c3_Err != nil {
  390. return templ_7745c5c3_Err
  391. }
  392. return nil
  393. })
  394. }
  395. var _ = templruntime.GeneratedTemplate