cluster_ec_shards_templ.go 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  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. )
  11. func ClusterEcShards(data dash.ClusterEcShardsData) templ.Component {
  12. return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
  13. templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
  14. if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
  15. return templ_7745c5c3_CtxErr
  16. }
  17. templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
  18. if !templ_7745c5c3_IsBuffer {
  19. defer func() {
  20. templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
  21. if templ_7745c5c3_Err == nil {
  22. templ_7745c5c3_Err = templ_7745c5c3_BufErr
  23. }
  24. }()
  25. }
  26. ctx = templ.InitializeContext(ctx)
  27. templ_7745c5c3_Var1 := templ.GetChildren(ctx)
  28. if templ_7745c5c3_Var1 == nil {
  29. templ_7745c5c3_Var1 = templ.NopComponent
  30. }
  31. ctx = templ.ClearChildren(ctx)
  32. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom\"><div><h1 class=\"h2\"><i class=\"fas fa-th-large me-2\"></i>EC Shards</h1>")
  33. if templ_7745c5c3_Err != nil {
  34. return templ_7745c5c3_Err
  35. }
  36. if data.FilterCollection != "" {
  37. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<div class=\"d-flex align-items-center mt-2\">")
  38. if templ_7745c5c3_Err != nil {
  39. return templ_7745c5c3_Err
  40. }
  41. if data.FilterCollection == "default" {
  42. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<span class=\"badge bg-secondary text-white me-2\"><i class=\"fas fa-filter me-1\"></i>Collection: default</span> ")
  43. if templ_7745c5c3_Err != nil {
  44. return templ_7745c5c3_Err
  45. }
  46. } else {
  47. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<span class=\"badge bg-info text-white me-2\"><i class=\"fas fa-filter me-1\"></i>Collection: ")
  48. if templ_7745c5c3_Err != nil {
  49. return templ_7745c5c3_Err
  50. }
  51. var templ_7745c5c3_Var2 string
  52. templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(data.FilterCollection)
  53. if templ_7745c5c3_Err != nil {
  54. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 22, Col: 96}
  55. }
  56. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
  57. if templ_7745c5c3_Err != nil {
  58. return templ_7745c5c3_Err
  59. }
  60. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</span> ")
  61. if templ_7745c5c3_Err != nil {
  62. return templ_7745c5c3_Err
  63. }
  64. }
  65. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<a href=\"/cluster/ec-shards\" class=\"btn btn-sm btn-outline-secondary\"><i class=\"fas fa-times me-1\"></i>Clear Filter</a></div>")
  66. if templ_7745c5c3_Err != nil {
  67. return templ_7745c5c3_Err
  68. }
  69. }
  70. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</div><div class=\"btn-toolbar mb-2 mb-md-0\"><div class=\"btn-group me-2\"><select class=\"form-select form-select-sm me-2\" id=\"pageSizeSelect\" onchange=\"changePageSize()\" style=\"width: auto;\"><option value=\"50\"")
  71. if templ_7745c5c3_Err != nil {
  72. return templ_7745c5c3_Err
  73. }
  74. if data.PageSize == 50 {
  75. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, " selected=\"selected\"")
  76. if templ_7745c5c3_Err != nil {
  77. return templ_7745c5c3_Err
  78. }
  79. }
  80. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, ">50 per page</option> <option value=\"100\"")
  81. if templ_7745c5c3_Err != nil {
  82. return templ_7745c5c3_Err
  83. }
  84. if data.PageSize == 100 {
  85. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, " selected=\"selected\"")
  86. if templ_7745c5c3_Err != nil {
  87. return templ_7745c5c3_Err
  88. }
  89. }
  90. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, ">100 per page</option> <option value=\"200\"")
  91. if templ_7745c5c3_Err != nil {
  92. return templ_7745c5c3_Err
  93. }
  94. if data.PageSize == 200 {
  95. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, " selected=\"selected\"")
  96. if templ_7745c5c3_Err != nil {
  97. return templ_7745c5c3_Err
  98. }
  99. }
  100. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, ">200 per page</option> <option value=\"500\"")
  101. if templ_7745c5c3_Err != nil {
  102. return templ_7745c5c3_Err
  103. }
  104. if data.PageSize == 500 {
  105. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, " selected=\"selected\"")
  106. if templ_7745c5c3_Err != nil {
  107. return templ_7745c5c3_Err
  108. }
  109. }
  110. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, ">500 per page</option></select> <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" onclick=\"exportEcShards()\"><i class=\"fas fa-download me-1\"></i>Export</button></div></div></div><!-- Statistics Cards --><div class=\"row mb-4\"><div class=\"col-md-3\"><div class=\"card text-bg-primary\"><div class=\"card-body\"><div class=\"d-flex justify-content-between\"><div><h6 class=\"card-title\">Total Shards</h6><h4 class=\"mb-0\">")
  111. if templ_7745c5c3_Err != nil {
  112. return templ_7745c5c3_Err
  113. }
  114. var templ_7745c5c3_Var3 string
  115. templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalShards))
  116. if templ_7745c5c3_Err != nil {
  117. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 54, Col: 81}
  118. }
  119. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
  120. if templ_7745c5c3_Err != nil {
  121. return templ_7745c5c3_Err
  122. }
  123. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</h4></div><div class=\"align-self-center\"><i class=\"fas fa-puzzle-piece fa-2x\"></i></div></div></div></div></div><div class=\"col-md-3\"><div class=\"card text-bg-info\"><div class=\"card-body\"><div class=\"d-flex justify-content-between\"><div><h6 class=\"card-title\">EC Volumes</h6><h4 class=\"mb-0\">")
  124. if templ_7745c5c3_Err != nil {
  125. return templ_7745c5c3_Err
  126. }
  127. var templ_7745c5c3_Var4 string
  128. templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalVolumes))
  129. if templ_7745c5c3_Err != nil {
  130. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 69, Col: 82}
  131. }
  132. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
  133. if templ_7745c5c3_Err != nil {
  134. return templ_7745c5c3_Err
  135. }
  136. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</h4></div><div class=\"align-self-center\"><i class=\"fas fa-database fa-2x\"></i></div></div></div></div></div><div class=\"col-md-3\"><div class=\"card text-bg-success\"><div class=\"card-body\"><div class=\"d-flex justify-content-between\"><div><h6 class=\"card-title\">Healthy Volumes</h6><h4 class=\"mb-0\">")
  137. if templ_7745c5c3_Err != nil {
  138. return templ_7745c5c3_Err
  139. }
  140. var templ_7745c5c3_Var5 string
  141. templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.VolumesWithAllShards))
  142. if templ_7745c5c3_Err != nil {
  143. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 84, Col: 90}
  144. }
  145. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
  146. if templ_7745c5c3_Err != nil {
  147. return templ_7745c5c3_Err
  148. }
  149. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</h4><small>Complete (14/14 shards)</small></div><div class=\"align-self-center\"><i class=\"fas fa-check-circle fa-2x\"></i></div></div></div></div></div><div class=\"col-md-3\"><div class=\"card text-bg-warning\"><div class=\"card-body\"><div class=\"d-flex justify-content-between\"><div><h6 class=\"card-title\">Degraded Volumes</h6><h4 class=\"mb-0\">")
  150. if templ_7745c5c3_Err != nil {
  151. return templ_7745c5c3_Err
  152. }
  153. var templ_7745c5c3_Var6 string
  154. templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.VolumesWithMissingShards))
  155. if templ_7745c5c3_Err != nil {
  156. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 100, Col: 94}
  157. }
  158. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
  159. if templ_7745c5c3_Err != nil {
  160. return templ_7745c5c3_Err
  161. }
  162. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</h4><small>Incomplete/Critical</small></div><div class=\"align-self-center\"><i class=\"fas fa-exclamation-triangle fa-2x\"></i></div></div></div></div></div></div><!-- Shards Table --><div class=\"table-responsive\"><table class=\"table table-striped table-hover\" id=\"ecShardsTable\"><thead><tr><th><a href=\"#\" onclick=\"sortBy('volume_id')\" class=\"text-dark text-decoration-none\">Volume ID ")
  163. if templ_7745c5c3_Err != nil {
  164. return templ_7745c5c3_Err
  165. }
  166. if data.SortBy == "volume_id" {
  167. if data.SortOrder == "asc" {
  168. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<i class=\"fas fa-sort-up ms-1\"></i>")
  169. if templ_7745c5c3_Err != nil {
  170. return templ_7745c5c3_Err
  171. }
  172. } else {
  173. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<i class=\"fas fa-sort-down ms-1\"></i>")
  174. if templ_7745c5c3_Err != nil {
  175. return templ_7745c5c3_Err
  176. }
  177. }
  178. } else {
  179. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<i class=\"fas fa-sort ms-1 text-muted\"></i>")
  180. if templ_7745c5c3_Err != nil {
  181. return templ_7745c5c3_Err
  182. }
  183. }
  184. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</a></th>")
  185. if templ_7745c5c3_Err != nil {
  186. return templ_7745c5c3_Err
  187. }
  188. if data.ShowCollectionColumn {
  189. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<th><a href=\"#\" onclick=\"sortBy('collection')\" class=\"text-dark text-decoration-none\">Collection ")
  190. if templ_7745c5c3_Err != nil {
  191. return templ_7745c5c3_Err
  192. }
  193. if data.SortBy == "collection" {
  194. if data.SortOrder == "asc" {
  195. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<i class=\"fas fa-sort-up ms-1\"></i>")
  196. if templ_7745c5c3_Err != nil {
  197. return templ_7745c5c3_Err
  198. }
  199. } else {
  200. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<i class=\"fas fa-sort-down ms-1\"></i>")
  201. if templ_7745c5c3_Err != nil {
  202. return templ_7745c5c3_Err
  203. }
  204. }
  205. } else {
  206. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<i class=\"fas fa-sort ms-1 text-muted\"></i>")
  207. if templ_7745c5c3_Err != nil {
  208. return templ_7745c5c3_Err
  209. }
  210. }
  211. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</a></th>")
  212. if templ_7745c5c3_Err != nil {
  213. return templ_7745c5c3_Err
  214. }
  215. }
  216. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<th><a href=\"#\" onclick=\"sortBy('server')\" class=\"text-dark text-decoration-none\">Server ")
  217. if templ_7745c5c3_Err != nil {
  218. return templ_7745c5c3_Err
  219. }
  220. if data.SortBy == "server" {
  221. if data.SortOrder == "asc" {
  222. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<i class=\"fas fa-sort-up ms-1\"></i>")
  223. if templ_7745c5c3_Err != nil {
  224. return templ_7745c5c3_Err
  225. }
  226. } else {
  227. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<i class=\"fas fa-sort-down ms-1\"></i>")
  228. if templ_7745c5c3_Err != nil {
  229. return templ_7745c5c3_Err
  230. }
  231. }
  232. } else {
  233. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<i class=\"fas fa-sort ms-1 text-muted\"></i>")
  234. if templ_7745c5c3_Err != nil {
  235. return templ_7745c5c3_Err
  236. }
  237. }
  238. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</a></th>")
  239. if templ_7745c5c3_Err != nil {
  240. return templ_7745c5c3_Err
  241. }
  242. if data.ShowDataCenterColumn {
  243. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<th><a href=\"#\" onclick=\"sortBy('datacenter')\" class=\"text-dark text-decoration-none\">Data Center ")
  244. if templ_7745c5c3_Err != nil {
  245. return templ_7745c5c3_Err
  246. }
  247. if data.SortBy == "datacenter" {
  248. if data.SortOrder == "asc" {
  249. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<i class=\"fas fa-sort-up ms-1\"></i>")
  250. if templ_7745c5c3_Err != nil {
  251. return templ_7745c5c3_Err
  252. }
  253. } else {
  254. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<i class=\"fas fa-sort-down ms-1\"></i>")
  255. if templ_7745c5c3_Err != nil {
  256. return templ_7745c5c3_Err
  257. }
  258. }
  259. } else {
  260. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<i class=\"fas fa-sort ms-1 text-muted\"></i>")
  261. if templ_7745c5c3_Err != nil {
  262. return templ_7745c5c3_Err
  263. }
  264. }
  265. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</a></th>")
  266. if templ_7745c5c3_Err != nil {
  267. return templ_7745c5c3_Err
  268. }
  269. }
  270. if data.ShowRackColumn {
  271. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<th><a href=\"#\" onclick=\"sortBy('rack')\" class=\"text-dark text-decoration-none\">Rack ")
  272. if templ_7745c5c3_Err != nil {
  273. return templ_7745c5c3_Err
  274. }
  275. if data.SortBy == "rack" {
  276. if data.SortOrder == "asc" {
  277. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<i class=\"fas fa-sort-up ms-1\"></i>")
  278. if templ_7745c5c3_Err != nil {
  279. return templ_7745c5c3_Err
  280. }
  281. } else {
  282. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<i class=\"fas fa-sort-down ms-1\"></i>")
  283. if templ_7745c5c3_Err != nil {
  284. return templ_7745c5c3_Err
  285. }
  286. }
  287. } else {
  288. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<i class=\"fas fa-sort ms-1 text-muted\"></i>")
  289. if templ_7745c5c3_Err != nil {
  290. return templ_7745c5c3_Err
  291. }
  292. }
  293. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</a></th>")
  294. if templ_7745c5c3_Err != nil {
  295. return templ_7745c5c3_Err
  296. }
  297. }
  298. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<th class=\"text-dark\">Distribution</th><th class=\"text-dark\">Status</th><th class=\"text-dark\">Actions</th></tr></thead> <tbody>")
  299. if templ_7745c5c3_Err != nil {
  300. return templ_7745c5c3_Err
  301. }
  302. for _, shard := range data.EcShards {
  303. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<tr><td><span class=\"fw-bold\">")
  304. if templ_7745c5c3_Err != nil {
  305. return templ_7745c5c3_Err
  306. }
  307. var templ_7745c5c3_Var7 string
  308. templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", shard.VolumeID))
  309. if templ_7745c5c3_Err != nil {
  310. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 203, Col: 84}
  311. }
  312. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
  313. if templ_7745c5c3_Err != nil {
  314. return templ_7745c5c3_Err
  315. }
  316. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</span></td>")
  317. if templ_7745c5c3_Err != nil {
  318. return templ_7745c5c3_Err
  319. }
  320. if data.ShowCollectionColumn {
  321. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<td>")
  322. if templ_7745c5c3_Err != nil {
  323. return templ_7745c5c3_Err
  324. }
  325. if shard.Collection != "" {
  326. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "<a href=\"/cluster/ec-shards?collection={shard.Collection}\" class=\"text-decoration-none\"><span class=\"badge bg-info text-white\">")
  327. if templ_7745c5c3_Err != nil {
  328. return templ_7745c5c3_Err
  329. }
  330. var templ_7745c5c3_Var8 string
  331. templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(shard.Collection)
  332. if templ_7745c5c3_Err != nil {
  333. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 209, Col: 96}
  334. }
  335. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
  336. if templ_7745c5c3_Err != nil {
  337. return templ_7745c5c3_Err
  338. }
  339. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</span></a>")
  340. if templ_7745c5c3_Err != nil {
  341. return templ_7745c5c3_Err
  342. }
  343. } else {
  344. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "<a href=\"/cluster/ec-shards?collection=default\" class=\"text-decoration-none\"><span class=\"badge bg-secondary text-white\">default</span></a>")
  345. if templ_7745c5c3_Err != nil {
  346. return templ_7745c5c3_Err
  347. }
  348. }
  349. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</td>")
  350. if templ_7745c5c3_Err != nil {
  351. return templ_7745c5c3_Err
  352. }
  353. }
  354. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<td><code class=\"small\">")
  355. if templ_7745c5c3_Err != nil {
  356. return templ_7745c5c3_Err
  357. }
  358. var templ_7745c5c3_Var9 string
  359. templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(shard.Server)
  360. if templ_7745c5c3_Err != nil {
  361. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 219, Col: 61}
  362. }
  363. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
  364. if templ_7745c5c3_Err != nil {
  365. return templ_7745c5c3_Err
  366. }
  367. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</code></td>")
  368. if templ_7745c5c3_Err != nil {
  369. return templ_7745c5c3_Err
  370. }
  371. if data.ShowDataCenterColumn {
  372. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<td><span class=\"badge bg-outline-primary\">")
  373. if templ_7745c5c3_Err != nil {
  374. return templ_7745c5c3_Err
  375. }
  376. var templ_7745c5c3_Var10 string
  377. templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(shard.DataCenter)
  378. if templ_7745c5c3_Err != nil {
  379. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 223, Col: 88}
  380. }
  381. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
  382. if templ_7745c5c3_Err != nil {
  383. return templ_7745c5c3_Err
  384. }
  385. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</span></td>")
  386. if templ_7745c5c3_Err != nil {
  387. return templ_7745c5c3_Err
  388. }
  389. }
  390. if data.ShowRackColumn {
  391. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "<td><span class=\"badge bg-outline-secondary\">")
  392. if templ_7745c5c3_Err != nil {
  393. return templ_7745c5c3_Err
  394. }
  395. var templ_7745c5c3_Var11 string
  396. templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(shard.Rack)
  397. if templ_7745c5c3_Err != nil {
  398. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 228, Col: 84}
  399. }
  400. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
  401. if templ_7745c5c3_Err != nil {
  402. return templ_7745c5c3_Err
  403. }
  404. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</span></td>")
  405. if templ_7745c5c3_Err != nil {
  406. return templ_7745c5c3_Err
  407. }
  408. }
  409. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<td>")
  410. if templ_7745c5c3_Err != nil {
  411. return templ_7745c5c3_Err
  412. }
  413. templ_7745c5c3_Err = displayShardDistribution(shard, data.EcShards).Render(ctx, templ_7745c5c3_Buffer)
  414. if templ_7745c5c3_Err != nil {
  415. return templ_7745c5c3_Err
  416. }
  417. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</td><td>")
  418. if templ_7745c5c3_Err != nil {
  419. return templ_7745c5c3_Err
  420. }
  421. templ_7745c5c3_Err = displayVolumeStatus(shard).Render(ctx, templ_7745c5c3_Buffer)
  422. if templ_7745c5c3_Err != nil {
  423. return templ_7745c5c3_Err
  424. }
  425. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</td><td><div class=\"btn-group\" role=\"group\"><button type=\"button\" class=\"btn btn-sm btn-outline-primary\" onclick=\"showShardDetails(event)\" data-volume-id=\"")
  426. if templ_7745c5c3_Err != nil {
  427. return templ_7745c5c3_Err
  428. }
  429. var templ_7745c5c3_Var12 string
  430. templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", shard.VolumeID))
  431. if templ_7745c5c3_Err != nil {
  432. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 241, Col: 90}
  433. }
  434. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
  435. if templ_7745c5c3_Err != nil {
  436. return templ_7745c5c3_Err
  437. }
  438. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "\" title=\"View EC volume details\"><i class=\"fas fa-info-circle\"></i></button> ")
  439. if templ_7745c5c3_Err != nil {
  440. return templ_7745c5c3_Err
  441. }
  442. if !shard.IsComplete {
  443. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "<button type=\"button\" class=\"btn btn-sm btn-outline-warning\" onclick=\"repairVolume(event)\" data-volume-id=\"")
  444. if templ_7745c5c3_Err != nil {
  445. return templ_7745c5c3_Err
  446. }
  447. var templ_7745c5c3_Var13 string
  448. templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", shard.VolumeID))
  449. if templ_7745c5c3_Err != nil {
  450. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 248, Col: 94}
  451. }
  452. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
  453. if templ_7745c5c3_Err != nil {
  454. return templ_7745c5c3_Err
  455. }
  456. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "\" title=\"Repair missing shards\"><i class=\"fas fa-wrench\"></i></button>")
  457. if templ_7745c5c3_Err != nil {
  458. return templ_7745c5c3_Err
  459. }
  460. }
  461. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</div></td></tr>")
  462. if templ_7745c5c3_Err != nil {
  463. return templ_7745c5c3_Err
  464. }
  465. }
  466. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "</tbody></table></div><!-- Pagination -->")
  467. if templ_7745c5c3_Err != nil {
  468. return templ_7745c5c3_Err
  469. }
  470. if data.TotalPages > 1 {
  471. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<nav aria-label=\"EC Shards pagination\"><ul class=\"pagination justify-content-center\">")
  472. if templ_7745c5c3_Err != nil {
  473. return templ_7745c5c3_Err
  474. }
  475. if data.CurrentPage > 1 {
  476. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<li class=\"page-item\"><a class=\"page-link\" href=\"#\" onclick=\"goToPage(event)\" data-page=\"")
  477. if templ_7745c5c3_Err != nil {
  478. return templ_7745c5c3_Err
  479. }
  480. var templ_7745c5c3_Var14 string
  481. templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage-1))
  482. if templ_7745c5c3_Err != nil {
  483. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 267, Col: 129}
  484. }
  485. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
  486. if templ_7745c5c3_Err != nil {
  487. return templ_7745c5c3_Err
  488. }
  489. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "\"><i class=\"fas fa-chevron-left\"></i></a></li>")
  490. if templ_7745c5c3_Err != nil {
  491. return templ_7745c5c3_Err
  492. }
  493. }
  494. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<!-- First page -->")
  495. if templ_7745c5c3_Err != nil {
  496. return templ_7745c5c3_Err
  497. }
  498. if data.CurrentPage > 3 {
  499. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<li class=\"page-item\"><a class=\"page-link\" href=\"#\" onclick=\"goToPage(1)\">1</a></li>")
  500. if templ_7745c5c3_Err != nil {
  501. return templ_7745c5c3_Err
  502. }
  503. if data.CurrentPage > 4 {
  504. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<li class=\"page-item disabled\"><span class=\"page-link\">...</span></li>")
  505. if templ_7745c5c3_Err != nil {
  506. return templ_7745c5c3_Err
  507. }
  508. }
  509. }
  510. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<!-- Current page and neighbors -->")
  511. if templ_7745c5c3_Err != nil {
  512. return templ_7745c5c3_Err
  513. }
  514. if data.CurrentPage > 1 && data.CurrentPage-1 >= 1 {
  515. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "<li class=\"page-item\"><a class=\"page-link\" href=\"#\" onclick=\"goToPage(event)\" data-page=\"")
  516. if templ_7745c5c3_Err != nil {
  517. return templ_7745c5c3_Err
  518. }
  519. var templ_7745c5c3_Var15 string
  520. templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage-1))
  521. if templ_7745c5c3_Err != nil {
  522. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 288, Col: 129}
  523. }
  524. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
  525. if templ_7745c5c3_Err != nil {
  526. return templ_7745c5c3_Err
  527. }
  528. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "\">")
  529. if templ_7745c5c3_Err != nil {
  530. return templ_7745c5c3_Err
  531. }
  532. var templ_7745c5c3_Var16 string
  533. templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage-1))
  534. if templ_7745c5c3_Err != nil {
  535. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 288, Col: 170}
  536. }
  537. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
  538. if templ_7745c5c3_Err != nil {
  539. return templ_7745c5c3_Err
  540. }
  541. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</a></li>")
  542. if templ_7745c5c3_Err != nil {
  543. return templ_7745c5c3_Err
  544. }
  545. }
  546. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<li class=\"page-item active\"><span class=\"page-link\">")
  547. if templ_7745c5c3_Err != nil {
  548. return templ_7745c5c3_Err
  549. }
  550. var templ_7745c5c3_Var17 string
  551. templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage))
  552. if templ_7745c5c3_Err != nil {
  553. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 293, Col: 80}
  554. }
  555. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
  556. if templ_7745c5c3_Err != nil {
  557. return templ_7745c5c3_Err
  558. }
  559. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</span></li>")
  560. if templ_7745c5c3_Err != nil {
  561. return templ_7745c5c3_Err
  562. }
  563. if data.CurrentPage < data.TotalPages && data.CurrentPage+1 <= data.TotalPages {
  564. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<li class=\"page-item\"><a class=\"page-link\" href=\"#\" onclick=\"goToPage(event)\" data-page=\"")
  565. if templ_7745c5c3_Err != nil {
  566. return templ_7745c5c3_Err
  567. }
  568. var templ_7745c5c3_Var18 string
  569. templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage+1))
  570. if templ_7745c5c3_Err != nil {
  571. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 298, Col: 129}
  572. }
  573. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
  574. if templ_7745c5c3_Err != nil {
  575. return templ_7745c5c3_Err
  576. }
  577. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "\">")
  578. if templ_7745c5c3_Err != nil {
  579. return templ_7745c5c3_Err
  580. }
  581. var templ_7745c5c3_Var19 string
  582. templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage+1))
  583. if templ_7745c5c3_Err != nil {
  584. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 298, Col: 170}
  585. }
  586. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
  587. if templ_7745c5c3_Err != nil {
  588. return templ_7745c5c3_Err
  589. }
  590. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</a></li>")
  591. if templ_7745c5c3_Err != nil {
  592. return templ_7745c5c3_Err
  593. }
  594. }
  595. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<!-- Last page -->")
  596. if templ_7745c5c3_Err != nil {
  597. return templ_7745c5c3_Err
  598. }
  599. if data.CurrentPage < data.TotalPages-2 {
  600. if data.CurrentPage < data.TotalPages-3 {
  601. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<li class=\"page-item disabled\"><span class=\"page-link\">...</span></li>")
  602. if templ_7745c5c3_Err != nil {
  603. return templ_7745c5c3_Err
  604. }
  605. }
  606. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, " <li class=\"page-item\"><a class=\"page-link\" href=\"#\" onclick=\"goToPage(event)\" data-page=\"")
  607. if templ_7745c5c3_Err != nil {
  608. return templ_7745c5c3_Err
  609. }
  610. var templ_7745c5c3_Var20 string
  611. templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalPages))
  612. if templ_7745c5c3_Err != nil {
  613. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 310, Col: 126}
  614. }
  615. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
  616. if templ_7745c5c3_Err != nil {
  617. return templ_7745c5c3_Err
  618. }
  619. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "\">")
  620. if templ_7745c5c3_Err != nil {
  621. return templ_7745c5c3_Err
  622. }
  623. var templ_7745c5c3_Var21 string
  624. templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalPages))
  625. if templ_7745c5c3_Err != nil {
  626. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 310, Col: 164}
  627. }
  628. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
  629. if templ_7745c5c3_Err != nil {
  630. return templ_7745c5c3_Err
  631. }
  632. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</a></li>")
  633. if templ_7745c5c3_Err != nil {
  634. return templ_7745c5c3_Err
  635. }
  636. }
  637. if data.CurrentPage < data.TotalPages {
  638. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<li class=\"page-item\"><a class=\"page-link\" href=\"#\" onclick=\"goToPage(event)\" data-page=\"")
  639. if templ_7745c5c3_Err != nil {
  640. return templ_7745c5c3_Err
  641. }
  642. var templ_7745c5c3_Var22 string
  643. templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage+1))
  644. if templ_7745c5c3_Err != nil {
  645. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 316, Col: 129}
  646. }
  647. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
  648. if templ_7745c5c3_Err != nil {
  649. return templ_7745c5c3_Err
  650. }
  651. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "\"><i class=\"fas fa-chevron-right\"></i></a></li>")
  652. if templ_7745c5c3_Err != nil {
  653. return templ_7745c5c3_Err
  654. }
  655. }
  656. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</ul></nav>")
  657. if templ_7745c5c3_Err != nil {
  658. return templ_7745c5c3_Err
  659. }
  660. }
  661. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<!-- JavaScript --><script>\n function sortBy(field) {\n const currentSort = \"{data.SortBy}\";\n const currentOrder = \"{data.SortOrder}\";\n let newOrder = 'asc';\n \n if (currentSort === field && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n \n updateUrl({\n sortBy: field,\n sortOrder: newOrder,\n page: 1\n });\n }\n\n function goToPage(event) {\n // Get data from the link element (not any child elements)\n const link = event.target.closest('a');\n const page = link.getAttribute('data-page');\n updateUrl({ page: page });\n }\n\n function changePageSize() {\n const pageSize = document.getElementById('pageSizeSelect').value;\n updateUrl({ pageSize: pageSize, page: 1 });\n }\n\n function updateUrl(params) {\n const url = new URL(window.location);\n Object.keys(params).forEach(key => {\n if (params[key]) {\n url.searchParams.set(key, params[key]);\n } else {\n url.searchParams.delete(key);\n }\n });\n window.location.href = url.toString();\n }\n\n function exportEcShards() {\n const url = new URL('/api/cluster/ec-shards/export', window.location.origin);\n const params = new URLSearchParams(window.location.search);\n params.forEach((value, key) => {\n url.searchParams.set(key, value);\n });\n window.open(url.toString(), '_blank');\n }\n\n function showShardDetails(event) {\n // Get data from the button element (not the icon inside it)\n const button = event.target.closest('button');\n const volumeId = button.getAttribute('data-volume-id');\n \n // Navigate to the EC volume details page\n window.location.href = `/cluster/ec-volumes/${volumeId}`;\n }\n\n function repairVolume(event) {\n // Get data from the button element (not the icon inside it)\n const button = event.target.closest('button');\n const volumeId = button.getAttribute('data-volume-id');\n if (confirm(`Are you sure you want to repair missing shards for volume ${volumeId}?`)) {\n fetch(`/api/cluster/volumes/${volumeId}/repair`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n }\n })\n .then(response => response.json())\n .then(data => {\n if (data.success) {\n alert('Repair initiated successfully');\n location.reload();\n } else {\n alert('Failed to initiate repair: ' + data.error);\n }\n })\n .catch(error => {\n alert('Error: ' + error.message);\n });\n }\n }\n </script>")
  662. if templ_7745c5c3_Err != nil {
  663. return templ_7745c5c3_Err
  664. }
  665. return nil
  666. })
  667. }
  668. // displayShardDistribution shows the distribution summary for a volume's shards
  669. func displayShardDistribution(shard dash.EcShardWithInfo, allShards []dash.EcShardWithInfo) templ.Component {
  670. return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
  671. templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
  672. if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
  673. return templ_7745c5c3_CtxErr
  674. }
  675. templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
  676. if !templ_7745c5c3_IsBuffer {
  677. defer func() {
  678. templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
  679. if templ_7745c5c3_Err == nil {
  680. templ_7745c5c3_Err = templ_7745c5c3_BufErr
  681. }
  682. }()
  683. }
  684. ctx = templ.InitializeContext(ctx)
  685. templ_7745c5c3_Var23 := templ.GetChildren(ctx)
  686. if templ_7745c5c3_Var23 == nil {
  687. templ_7745c5c3_Var23 = templ.NopComponent
  688. }
  689. ctx = templ.ClearChildren(ctx)
  690. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<div class=\"small\"><i class=\"fas fa-sitemap me-1\"></i> ")
  691. if templ_7745c5c3_Err != nil {
  692. return templ_7745c5c3_Err
  693. }
  694. var templ_7745c5c3_Var24 string
  695. templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(calculateDistributionSummary(shard.VolumeID, allShards))
  696. if templ_7745c5c3_Err != nil {
  697. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 418, Col: 65}
  698. }
  699. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
  700. if templ_7745c5c3_Err != nil {
  701. return templ_7745c5c3_Err
  702. }
  703. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</div>")
  704. if templ_7745c5c3_Err != nil {
  705. return templ_7745c5c3_Err
  706. }
  707. return nil
  708. })
  709. }
  710. // displayVolumeStatus shows an improved status display
  711. func displayVolumeStatus(shard dash.EcShardWithInfo) templ.Component {
  712. return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
  713. templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
  714. if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
  715. return templ_7745c5c3_CtxErr
  716. }
  717. templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
  718. if !templ_7745c5c3_IsBuffer {
  719. defer func() {
  720. templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
  721. if templ_7745c5c3_Err == nil {
  722. templ_7745c5c3_Err = templ_7745c5c3_BufErr
  723. }
  724. }()
  725. }
  726. ctx = templ.InitializeContext(ctx)
  727. templ_7745c5c3_Var25 := templ.GetChildren(ctx)
  728. if templ_7745c5c3_Var25 == nil {
  729. templ_7745c5c3_Var25 = templ.NopComponent
  730. }
  731. ctx = templ.ClearChildren(ctx)
  732. if shard.IsComplete {
  733. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<span class=\"badge bg-success\"><i class=\"fas fa-check me-1\"></i>Complete</span>")
  734. if templ_7745c5c3_Err != nil {
  735. return templ_7745c5c3_Err
  736. }
  737. } else {
  738. if len(shard.MissingShards) > 10 {
  739. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<span class=\"badge bg-danger\"><i class=\"fas fa-skull me-1\"></i>Critical (")
  740. if templ_7745c5c3_Err != nil {
  741. return templ_7745c5c3_Err
  742. }
  743. var templ_7745c5c3_Var26 string
  744. templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(shard.MissingShards)))
  745. if templ_7745c5c3_Err != nil {
  746. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 428, Col: 129}
  747. }
  748. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
  749. if templ_7745c5c3_Err != nil {
  750. return templ_7745c5c3_Err
  751. }
  752. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, " missing)</span>")
  753. if templ_7745c5c3_Err != nil {
  754. return templ_7745c5c3_Err
  755. }
  756. } else if len(shard.MissingShards) > 6 {
  757. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<span class=\"badge bg-warning\"><i class=\"fas fa-exclamation-triangle me-1\"></i>Degraded (")
  758. if templ_7745c5c3_Err != nil {
  759. return templ_7745c5c3_Err
  760. }
  761. var templ_7745c5c3_Var27 string
  762. templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(shard.MissingShards)))
  763. if templ_7745c5c3_Err != nil {
  764. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 430, Col: 145}
  765. }
  766. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
  767. if templ_7745c5c3_Err != nil {
  768. return templ_7745c5c3_Err
  769. }
  770. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, " missing)</span>")
  771. if templ_7745c5c3_Err != nil {
  772. return templ_7745c5c3_Err
  773. }
  774. } else if len(shard.MissingShards) > 2 {
  775. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<span class=\"badge bg-warning\"><i class=\"fas fa-info-circle me-1\"></i>Incomplete (")
  776. if templ_7745c5c3_Err != nil {
  777. return templ_7745c5c3_Err
  778. }
  779. var templ_7745c5c3_Var28 string
  780. templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(shard.MissingShards)))
  781. if templ_7745c5c3_Err != nil {
  782. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 432, Col: 138}
  783. }
  784. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
  785. if templ_7745c5c3_Err != nil {
  786. return templ_7745c5c3_Err
  787. }
  788. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, " missing)</span>")
  789. if templ_7745c5c3_Err != nil {
  790. return templ_7745c5c3_Err
  791. }
  792. } else {
  793. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<span class=\"badge bg-info\"><i class=\"fas fa-info-circle me-1\"></i>Minor Issues (")
  794. if templ_7745c5c3_Err != nil {
  795. return templ_7745c5c3_Err
  796. }
  797. var templ_7745c5c3_Var29 string
  798. templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(shard.MissingShards)))
  799. if templ_7745c5c3_Err != nil {
  800. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_ec_shards.templ`, Line: 434, Col: 137}
  801. }
  802. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
  803. if templ_7745c5c3_Err != nil {
  804. return templ_7745c5c3_Err
  805. }
  806. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, " missing)</span>")
  807. if templ_7745c5c3_Err != nil {
  808. return templ_7745c5c3_Err
  809. }
  810. }
  811. }
  812. return nil
  813. })
  814. }
  815. // calculateDistributionSummary calculates and formats the distribution summary
  816. func calculateDistributionSummary(volumeID uint32, allShards []dash.EcShardWithInfo) string {
  817. dataCenters := make(map[string]bool)
  818. racks := make(map[string]bool)
  819. servers := make(map[string]bool)
  820. for _, s := range allShards {
  821. if s.VolumeID == volumeID {
  822. dataCenters[s.DataCenter] = true
  823. racks[s.Rack] = true
  824. servers[s.Server] = true
  825. }
  826. }
  827. return fmt.Sprintf("%d DCs, %d racks, %d servers", len(dataCenters), len(racks), len(servers))
  828. }
  829. var _ = templruntime.GeneratedTemplate