cluster_volumes_templ.go 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  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. "strings"
  11. )
  12. func ClusterVolumes(data dash.ClusterVolumesData) 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=\"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-database me-2\"></i>Cluster Volumes</h1>")
  34. if templ_7745c5c3_Err != nil {
  35. return templ_7745c5c3_Err
  36. }
  37. if data.FilterCollection != "" {
  38. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<div class=\"d-flex align-items-center mt-2\"><span class=\"badge bg-info me-2\"><i class=\"fas fa-filter me-1\"></i>Collection: ")
  39. if templ_7745c5c3_Err != nil {
  40. return templ_7745c5c3_Err
  41. }
  42. var templ_7745c5c3_Var2 string
  43. templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(data.FilterCollection)
  44. if templ_7745c5c3_Err != nil {
  45. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 18, Col: 92}
  46. }
  47. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
  48. if templ_7745c5c3_Err != nil {
  49. return templ_7745c5c3_Err
  50. }
  51. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</span> <a href=\"/cluster/volumes\" class=\"btn btn-sm btn-outline-secondary\"><i class=\"fas fa-times me-1\"></i>Clear Filter</a></div>")
  52. if templ_7745c5c3_Err != nil {
  53. return templ_7745c5c3_Err
  54. }
  55. }
  56. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "</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\"")
  57. if templ_7745c5c3_Err != nil {
  58. return templ_7745c5c3_Err
  59. }
  60. if data.PageSize == 50 {
  61. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, " selected=\"selected\"")
  62. if templ_7745c5c3_Err != nil {
  63. return templ_7745c5c3_Err
  64. }
  65. }
  66. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, ">50 per page</option> <option value=\"100\"")
  67. if templ_7745c5c3_Err != nil {
  68. return templ_7745c5c3_Err
  69. }
  70. if data.PageSize == 100 {
  71. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, " selected=\"selected\"")
  72. if templ_7745c5c3_Err != nil {
  73. return templ_7745c5c3_Err
  74. }
  75. }
  76. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, ">100 per page</option> <option value=\"200\"")
  77. if templ_7745c5c3_Err != nil {
  78. return templ_7745c5c3_Err
  79. }
  80. if data.PageSize == 200 {
  81. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, " selected=\"selected\"")
  82. if templ_7745c5c3_Err != nil {
  83. return templ_7745c5c3_Err
  84. }
  85. }
  86. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, ">200 per page</option> <option value=\"500\"")
  87. if templ_7745c5c3_Err != nil {
  88. return templ_7745c5c3_Err
  89. }
  90. if data.PageSize == 500 {
  91. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, " selected=\"selected\"")
  92. if templ_7745c5c3_Err != nil {
  93. return templ_7745c5c3_Err
  94. }
  95. }
  96. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, ">500 per page</option></select> <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" onclick=\"exportVolumes()\"><i class=\"fas fa-download me-1\"></i>Export</button></div></div></div><div id=\"volumes-content\"><!-- Summary Cards --><div class=\"row mb-4\"><div class=\"col-xl-2 col-md-4 col-sm-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 Volumes</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  97. if templ_7745c5c3_Err != nil {
  98. return templ_7745c5c3_Err
  99. }
  100. var templ_7745c5c3_Var3 string
  101. templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalVolumes))
  102. if templ_7745c5c3_Err != nil {
  103. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 53, Col: 73}
  104. }
  105. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
  106. if templ_7745c5c3_Err != nil {
  107. return templ_7745c5c3_Err
  108. }
  109. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</div></div><div class=\"col-auto\"><i class=\"fas fa-database fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-2 col-md-4 col-sm-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\">")
  110. if templ_7745c5c3_Err != nil {
  111. return templ_7745c5c3_Err
  112. }
  113. if data.CollectionCount == 1 {
  114. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "Collection")
  115. if templ_7745c5c3_Err != nil {
  116. return templ_7745c5c3_Err
  117. }
  118. } else {
  119. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "Collections")
  120. if templ_7745c5c3_Err != nil {
  121. return templ_7745c5c3_Err
  122. }
  123. }
  124. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  125. if templ_7745c5c3_Err != nil {
  126. return templ_7745c5c3_Err
  127. }
  128. if data.CollectionCount == 1 {
  129. var templ_7745c5c3_Var4 string
  130. templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(data.SingleCollection)
  131. if templ_7745c5c3_Err != nil {
  132. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 78, Col: 62}
  133. }
  134. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
  135. if templ_7745c5c3_Err != nil {
  136. return templ_7745c5c3_Err
  137. }
  138. } else {
  139. var templ_7745c5c3_Var5 string
  140. templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CollectionCount))
  141. if templ_7745c5c3_Err != nil {
  142. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 80, Col: 80}
  143. }
  144. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
  145. if templ_7745c5c3_Err != nil {
  146. return templ_7745c5c3_Err
  147. }
  148. }
  149. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</div></div><div class=\"col-auto\"><i class=\"fas fa-layer-group fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-2 col-md-4 col-sm-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\">")
  150. if templ_7745c5c3_Err != nil {
  151. return templ_7745c5c3_Err
  152. }
  153. if data.DataCenterCount == 1 {
  154. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "Data Center")
  155. if templ_7745c5c3_Err != nil {
  156. return templ_7745c5c3_Err
  157. }
  158. } else {
  159. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "Data Centers")
  160. if templ_7745c5c3_Err != nil {
  161. return templ_7745c5c3_Err
  162. }
  163. }
  164. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  165. if templ_7745c5c3_Err != nil {
  166. return templ_7745c5c3_Err
  167. }
  168. if data.DataCenterCount == 1 {
  169. var templ_7745c5c3_Var6 string
  170. templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(data.SingleDataCenter)
  171. if templ_7745c5c3_Err != nil {
  172. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 106, Col: 62}
  173. }
  174. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
  175. if templ_7745c5c3_Err != nil {
  176. return templ_7745c5c3_Err
  177. }
  178. } else {
  179. var templ_7745c5c3_Var7 string
  180. templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.DataCenterCount))
  181. if templ_7745c5c3_Err != nil {
  182. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 108, Col: 80}
  183. }
  184. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
  185. if templ_7745c5c3_Err != nil {
  186. return templ_7745c5c3_Err
  187. }
  188. }
  189. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</div></div><div class=\"col-auto\"><i class=\"fas fa-building fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-2 col-md-4 col-sm-6 mb-4\"><div class=\"card border-left-secondary 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-secondary text-uppercase mb-1\">")
  190. if templ_7745c5c3_Err != nil {
  191. return templ_7745c5c3_Err
  192. }
  193. if data.RackCount == 1 {
  194. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "Rack")
  195. if templ_7745c5c3_Err != nil {
  196. return templ_7745c5c3_Err
  197. }
  198. } else {
  199. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "Racks")
  200. if templ_7745c5c3_Err != nil {
  201. return templ_7745c5c3_Err
  202. }
  203. }
  204. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  205. if templ_7745c5c3_Err != nil {
  206. return templ_7745c5c3_Err
  207. }
  208. if data.RackCount == 1 {
  209. var templ_7745c5c3_Var8 string
  210. templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(data.SingleRack)
  211. if templ_7745c5c3_Err != nil {
  212. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 134, Col: 56}
  213. }
  214. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
  215. if templ_7745c5c3_Err != nil {
  216. return templ_7745c5c3_Err
  217. }
  218. } else {
  219. var templ_7745c5c3_Var9 string
  220. templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.RackCount))
  221. if templ_7745c5c3_Err != nil {
  222. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 136, Col: 74}
  223. }
  224. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
  225. if templ_7745c5c3_Err != nil {
  226. return templ_7745c5c3_Err
  227. }
  228. }
  229. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</div></div><div class=\"col-auto\"><i class=\"fas fa-server fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-2 col-md-4 col-sm-6 mb-4\"><div class=\"card border-left-dark 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-dark text-uppercase mb-1\">")
  230. if templ_7745c5c3_Err != nil {
  231. return templ_7745c5c3_Err
  232. }
  233. if data.DiskTypeCount == 1 {
  234. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "Disk Type")
  235. if templ_7745c5c3_Err != nil {
  236. return templ_7745c5c3_Err
  237. }
  238. } else {
  239. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "Disk Types")
  240. if templ_7745c5c3_Err != nil {
  241. return templ_7745c5c3_Err
  242. }
  243. }
  244. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  245. if templ_7745c5c3_Err != nil {
  246. return templ_7745c5c3_Err
  247. }
  248. if data.DiskTypeCount == 1 {
  249. var templ_7745c5c3_Var10 string
  250. templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(data.SingleDiskType)
  251. if templ_7745c5c3_Err != nil {
  252. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 162, Col: 60}
  253. }
  254. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
  255. if templ_7745c5c3_Err != nil {
  256. return templ_7745c5c3_Err
  257. }
  258. } else {
  259. var templ_7745c5c3_Var11 string
  260. templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(data.AllDiskTypes, ", "))
  261. if templ_7745c5c3_Err != nil {
  262. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 164, Col: 78}
  263. }
  264. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
  265. if templ_7745c5c3_Err != nil {
  266. return templ_7745c5c3_Err
  267. }
  268. }
  269. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</div></div><div class=\"col-auto\"><i class=\"fas fa-hdd fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-2 col-md-4 col-sm-6 mb-4\"><div class=\"card border-left-purple 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-purple text-uppercase mb-1\">")
  270. if templ_7745c5c3_Err != nil {
  271. return templ_7745c5c3_Err
  272. }
  273. if data.VersionCount == 1 {
  274. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "Version")
  275. if templ_7745c5c3_Err != nil {
  276. return templ_7745c5c3_Err
  277. }
  278. } else {
  279. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "Versions")
  280. if templ_7745c5c3_Err != nil {
  281. return templ_7745c5c3_Err
  282. }
  283. }
  284. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  285. if templ_7745c5c3_Err != nil {
  286. return templ_7745c5c3_Err
  287. }
  288. if data.VersionCount == 1 {
  289. var templ_7745c5c3_Var12 string
  290. templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(data.SingleVersion)
  291. if templ_7745c5c3_Err != nil {
  292. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 190, Col: 59}
  293. }
  294. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
  295. if templ_7745c5c3_Err != nil {
  296. return templ_7745c5c3_Err
  297. }
  298. } else {
  299. var templ_7745c5c3_Var13 string
  300. templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(data.AllVersions, ", "))
  301. if templ_7745c5c3_Err != nil {
  302. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 192, Col: 77}
  303. }
  304. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
  305. if templ_7745c5c3_Err != nil {
  306. return templ_7745c5c3_Err
  307. }
  308. }
  309. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</div></div><div class=\"col-auto\"><i class=\"fas fa-code-branch fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-2 col-md-4 col-sm-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 Size</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">")
  310. if templ_7745c5c3_Err != nil {
  311. return templ_7745c5c3_Err
  312. }
  313. var templ_7745c5c3_Var14 string
  314. templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(data.TotalSize))
  315. if templ_7745c5c3_Err != nil {
  316. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 213, Col: 64}
  317. }
  318. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
  319. if templ_7745c5c3_Err != nil {
  320. return templ_7745c5c3_Err
  321. }
  322. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</div></div><div class=\"col-auto\"><i class=\"fas fa-chart-area fa-2x text-gray-300\"></i></div></div></div></div></div></div><!-- Volumes Table --><div class=\"card shadow mb-4\"><div class=\"card-header py-3\"><h6 class=\"m-0 font-weight-bold text-primary\"><i class=\"fas fa-database me-2\"></i>Volume Details</h6></div><div class=\"card-body\">")
  323. if templ_7745c5c3_Err != nil {
  324. return templ_7745c5c3_Err
  325. }
  326. if len(data.Volumes) > 0 {
  327. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<div class=\"table-responsive\"><table class=\"table table-hover\" id=\"volumesTable\"><thead><tr><th><a href=\"#\" onclick=\"sortTable('id')\" class=\"text-decoration-none text-dark\">Volume ID")
  328. if templ_7745c5c3_Err != nil {
  329. return templ_7745c5c3_Err
  330. }
  331. templ_7745c5c3_Err = getSortIcon("id", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  332. if templ_7745c5c3_Err != nil {
  333. return templ_7745c5c3_Err
  334. }
  335. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</a></th><th><a href=\"#\" onclick=\"sortTable('server')\" class=\"text-decoration-none text-dark\">Server")
  336. if templ_7745c5c3_Err != nil {
  337. return templ_7745c5c3_Err
  338. }
  339. templ_7745c5c3_Err = getSortIcon("server", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  340. if templ_7745c5c3_Err != nil {
  341. return templ_7745c5c3_Err
  342. }
  343. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</a></th>")
  344. if templ_7745c5c3_Err != nil {
  345. return templ_7745c5c3_Err
  346. }
  347. if data.ShowDataCenterColumn {
  348. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<th><a href=\"#\" onclick=\"sortTable('datacenter')\" class=\"text-decoration-none text-dark\">Data Center")
  349. if templ_7745c5c3_Err != nil {
  350. return templ_7745c5c3_Err
  351. }
  352. templ_7745c5c3_Err = getSortIcon("datacenter", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  353. if templ_7745c5c3_Err != nil {
  354. return templ_7745c5c3_Err
  355. }
  356. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</a></th>")
  357. if templ_7745c5c3_Err != nil {
  358. return templ_7745c5c3_Err
  359. }
  360. }
  361. if data.ShowRackColumn {
  362. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<th><a href=\"#\" onclick=\"sortTable('rack')\" class=\"text-decoration-none text-dark\">Rack")
  363. if templ_7745c5c3_Err != nil {
  364. return templ_7745c5c3_Err
  365. }
  366. templ_7745c5c3_Err = getSortIcon("rack", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  367. if templ_7745c5c3_Err != nil {
  368. return templ_7745c5c3_Err
  369. }
  370. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</a></th>")
  371. if templ_7745c5c3_Err != nil {
  372. return templ_7745c5c3_Err
  373. }
  374. }
  375. if data.ShowCollectionColumn {
  376. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<th><a href=\"#\" onclick=\"sortTable('collection')\" class=\"text-decoration-none text-dark\">Collection")
  377. if templ_7745c5c3_Err != nil {
  378. return templ_7745c5c3_Err
  379. }
  380. templ_7745c5c3_Err = getSortIcon("collection", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  381. if templ_7745c5c3_Err != nil {
  382. return templ_7745c5c3_Err
  383. }
  384. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</a></th>")
  385. if templ_7745c5c3_Err != nil {
  386. return templ_7745c5c3_Err
  387. }
  388. }
  389. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<th><a href=\"#\" onclick=\"sortTable('size')\" class=\"text-decoration-none text-dark\">Size")
  390. if templ_7745c5c3_Err != nil {
  391. return templ_7745c5c3_Err
  392. }
  393. templ_7745c5c3_Err = getSortIcon("size", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  394. if templ_7745c5c3_Err != nil {
  395. return templ_7745c5c3_Err
  396. }
  397. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</a></th><th>Volume Utilization</th><th><a href=\"#\" onclick=\"sortTable('filecount')\" class=\"text-decoration-none text-dark\">File Count")
  398. if templ_7745c5c3_Err != nil {
  399. return templ_7745c5c3_Err
  400. }
  401. templ_7745c5c3_Err = getSortIcon("filecount", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  402. if templ_7745c5c3_Err != nil {
  403. return templ_7745c5c3_Err
  404. }
  405. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</a></th><th><a href=\"#\" onclick=\"sortTable('replication')\" class=\"text-decoration-none text-dark\">Replication")
  406. if templ_7745c5c3_Err != nil {
  407. return templ_7745c5c3_Err
  408. }
  409. templ_7745c5c3_Err = getSortIcon("replication", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  410. if templ_7745c5c3_Err != nil {
  411. return templ_7745c5c3_Err
  412. }
  413. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</a></th>")
  414. if templ_7745c5c3_Err != nil {
  415. return templ_7745c5c3_Err
  416. }
  417. if data.ShowDiskTypeColumn {
  418. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "<th><a href=\"#\" onclick=\"sortTable('disktype')\" class=\"text-decoration-none text-dark\">Disk Type")
  419. if templ_7745c5c3_Err != nil {
  420. return templ_7745c5c3_Err
  421. }
  422. templ_7745c5c3_Err = getSortIcon("disktype", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  423. if templ_7745c5c3_Err != nil {
  424. return templ_7745c5c3_Err
  425. }
  426. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</a></th>")
  427. if templ_7745c5c3_Err != nil {
  428. return templ_7745c5c3_Err
  429. }
  430. }
  431. if data.ShowVersionColumn {
  432. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "<th><a href=\"#\" onclick=\"sortTable('version')\" class=\"text-decoration-none text-dark\">Version")
  433. if templ_7745c5c3_Err != nil {
  434. return templ_7745c5c3_Err
  435. }
  436. templ_7745c5c3_Err = getSortIcon("version", data.SortBy, data.SortOrder).Render(ctx, templ_7745c5c3_Buffer)
  437. if templ_7745c5c3_Err != nil {
  438. return templ_7745c5c3_Err
  439. }
  440. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</a></th>")
  441. if templ_7745c5c3_Err != nil {
  442. return templ_7745c5c3_Err
  443. }
  444. }
  445. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<th>Actions</th></tr></thead> <tbody>")
  446. if templ_7745c5c3_Err != nil {
  447. return templ_7745c5c3_Err
  448. }
  449. for _, volume := range data.Volumes {
  450. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "<tr><td><code class=\"volume-id-link\" style=\"cursor: pointer; text-decoration: underline; color: #0d6efd;\" data-volume-id=\"")
  451. if templ_7745c5c3_Err != nil {
  452. return templ_7745c5c3_Err
  453. }
  454. var templ_7745c5c3_Var15 string
  455. templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", volume.Id))
  456. if templ_7745c5c3_Err != nil {
  457. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 317, Col: 94}
  458. }
  459. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
  460. if templ_7745c5c3_Err != nil {
  461. return templ_7745c5c3_Err
  462. }
  463. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\" title=\"Click to view volume details\">")
  464. if templ_7745c5c3_Err != nil {
  465. return templ_7745c5c3_Err
  466. }
  467. var templ_7745c5c3_Var16 string
  468. templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", volume.Id))
  469. if templ_7745c5c3_Err != nil {
  470. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 319, Col: 77}
  471. }
  472. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
  473. if templ_7745c5c3_Err != nil {
  474. return templ_7745c5c3_Err
  475. }
  476. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</code></td><td><a href=\"")
  477. if templ_7745c5c3_Err != nil {
  478. return templ_7745c5c3_Err
  479. }
  480. var templ_7745c5c3_Var17 templ.SafeURL
  481. templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", volume.Server)))
  482. if templ_7745c5c3_Err != nil {
  483. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 323, Col: 121}
  484. }
  485. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
  486. if templ_7745c5c3_Err != nil {
  487. return templ_7745c5c3_Err
  488. }
  489. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "\" target=\"_blank\" class=\"text-decoration-none\">")
  490. if templ_7745c5c3_Err != nil {
  491. return templ_7745c5c3_Err
  492. }
  493. var templ_7745c5c3_Var18 string
  494. templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(volume.Server)
  495. if templ_7745c5c3_Err != nil {
  496. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 324, Col: 62}
  497. }
  498. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
  499. if templ_7745c5c3_Err != nil {
  500. return templ_7745c5c3_Err
  501. }
  502. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, " <i class=\"fas fa-external-link-alt ms-1 text-muted\"></i></a></td>")
  503. if templ_7745c5c3_Err != nil {
  504. return templ_7745c5c3_Err
  505. }
  506. if data.ShowDataCenterColumn {
  507. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<td><span class=\"badge bg-light text-dark\">")
  508. if templ_7745c5c3_Err != nil {
  509. return templ_7745c5c3_Err
  510. }
  511. var templ_7745c5c3_Var19 string
  512. templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(volume.DataCenter)
  513. if templ_7745c5c3_Err != nil {
  514. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 330, Col: 105}
  515. }
  516. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
  517. if templ_7745c5c3_Err != nil {
  518. return templ_7745c5c3_Err
  519. }
  520. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</span></td>")
  521. if templ_7745c5c3_Err != nil {
  522. return templ_7745c5c3_Err
  523. }
  524. }
  525. if data.ShowRackColumn {
  526. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<td><span class=\"badge bg-light text-dark\">")
  527. if templ_7745c5c3_Err != nil {
  528. return templ_7745c5c3_Err
  529. }
  530. var templ_7745c5c3_Var20 string
  531. templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(volume.Rack)
  532. if templ_7745c5c3_Err != nil {
  533. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 335, Col: 99}
  534. }
  535. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
  536. if templ_7745c5c3_Err != nil {
  537. return templ_7745c5c3_Err
  538. }
  539. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</span></td>")
  540. if templ_7745c5c3_Err != nil {
  541. return templ_7745c5c3_Err
  542. }
  543. }
  544. if data.ShowCollectionColumn {
  545. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "<td>")
  546. if templ_7745c5c3_Err != nil {
  547. return templ_7745c5c3_Err
  548. }
  549. if volume.Collection == "" {
  550. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<a href=\"")
  551. if templ_7745c5c3_Err != nil {
  552. return templ_7745c5c3_Err
  553. }
  554. var templ_7745c5c3_Var21 templ.SafeURL
  555. templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/cluster/volumes?collection=default"))
  556. if templ_7745c5c3_Err != nil {
  557. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 341, Col: 113}
  558. }
  559. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
  560. if templ_7745c5c3_Err != nil {
  561. return templ_7745c5c3_Err
  562. }
  563. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "\" class=\"text-decoration-none\"><span class=\"badge bg-secondary\">default</span></a>")
  564. if templ_7745c5c3_Err != nil {
  565. return templ_7745c5c3_Err
  566. }
  567. } else {
  568. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<a href=\"")
  569. if templ_7745c5c3_Err != nil {
  570. return templ_7745c5c3_Err
  571. }
  572. var templ_7745c5c3_Var22 templ.SafeURL
  573. templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("/cluster/volumes?collection=%s", volume.Collection)))
  574. if templ_7745c5c3_Err != nil {
  575. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 345, Col: 140}
  576. }
  577. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
  578. if templ_7745c5c3_Err != nil {
  579. return templ_7745c5c3_Err
  580. }
  581. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\" class=\"text-decoration-none\"><span class=\"badge bg-secondary\">")
  582. if templ_7745c5c3_Err != nil {
  583. return templ_7745c5c3_Err
  584. }
  585. var templ_7745c5c3_Var23 string
  586. templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(volume.Collection)
  587. if templ_7745c5c3_Err != nil {
  588. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 346, Col: 107}
  589. }
  590. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
  591. if templ_7745c5c3_Err != nil {
  592. return templ_7745c5c3_Err
  593. }
  594. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</span></a>")
  595. if templ_7745c5c3_Err != nil {
  596. return templ_7745c5c3_Err
  597. }
  598. }
  599. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</td>")
  600. if templ_7745c5c3_Err != nil {
  601. return templ_7745c5c3_Err
  602. }
  603. }
  604. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<td>")
  605. if templ_7745c5c3_Err != nil {
  606. return templ_7745c5c3_Err
  607. }
  608. var templ_7745c5c3_Var24 string
  609. templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(int64(volume.Size)))
  610. if templ_7745c5c3_Err != nil {
  611. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 351, Col: 100}
  612. }
  613. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
  614. if templ_7745c5c3_Err != nil {
  615. return templ_7745c5c3_Err
  616. }
  617. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</td><td><div class=\"d-flex align-items-center\"><div class=\"progress me-2\" style=\"width: 80px; height: 16px; background-color: #e9ecef;\"><!-- Active data (green) --><div class=\"progress-bar bg-success\" role=\"progressbar\" style=\"")
  618. if templ_7745c5c3_Err != nil {
  619. return templ_7745c5c3_Err
  620. }
  621. var templ_7745c5c3_Var25 string
  622. templ_7745c5c3_Var25, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %.1f%%",
  623. func() float64 {
  624. if volume.Size > 0 {
  625. activePct := float64(volume.Size-volume.DeletedByteCount) / float64(volume.Size) * 100
  626. if data.VolumeSizeLimit > 0 {
  627. return activePct * float64(volume.Size) / float64(data.VolumeSizeLimit) * 100
  628. }
  629. return activePct
  630. }
  631. return 0
  632. }()))
  633. if templ_7745c5c3_Err != nil {
  634. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 367, Col: 49}
  635. }
  636. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
  637. if templ_7745c5c3_Err != nil {
  638. return templ_7745c5c3_Err
  639. }
  640. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "\" title=\"")
  641. if templ_7745c5c3_Err != nil {
  642. return templ_7745c5c3_Err
  643. }
  644. var templ_7745c5c3_Var26 string
  645. templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("Active: %s", formatBytes(int64(volume.Size-volume.DeletedByteCount))))
  646. if templ_7745c5c3_Err != nil {
  647. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 368, Col: 132}
  648. }
  649. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
  650. if templ_7745c5c3_Err != nil {
  651. return templ_7745c5c3_Err
  652. }
  653. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "\"></div><!-- Garbage data (red) --><div class=\"progress-bar bg-danger\" role=\"progressbar\" style=\"")
  654. if templ_7745c5c3_Err != nil {
  655. return templ_7745c5c3_Err
  656. }
  657. var templ_7745c5c3_Var27 string
  658. templ_7745c5c3_Var27, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %.1f%%",
  659. func() float64 {
  660. if volume.Size > 0 && volume.DeletedByteCount > 0 {
  661. garbagePct := float64(volume.DeletedByteCount) / float64(volume.Size) * 100
  662. if data.VolumeSizeLimit > 0 {
  663. return garbagePct * float64(volume.Size) / float64(data.VolumeSizeLimit) * 100
  664. }
  665. return garbagePct
  666. }
  667. return 0
  668. }()))
  669. if templ_7745c5c3_Err != nil {
  670. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 382, Col: 49}
  671. }
  672. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
  673. if templ_7745c5c3_Err != nil {
  674. return templ_7745c5c3_Err
  675. }
  676. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "\" title=\"")
  677. if templ_7745c5c3_Err != nil {
  678. return templ_7745c5c3_Err
  679. }
  680. var templ_7745c5c3_Var28 string
  681. templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("Garbage: %s", formatBytes(int64(volume.DeletedByteCount))))
  682. if templ_7745c5c3_Err != nil {
  683. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 383, Col: 119}
  684. }
  685. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
  686. if templ_7745c5c3_Err != nil {
  687. return templ_7745c5c3_Err
  688. }
  689. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "\"></div></div><small class=\"text-muted\">")
  690. if templ_7745c5c3_Err != nil {
  691. return templ_7745c5c3_Err
  692. }
  693. var templ_7745c5c3_Var29 string
  694. templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(func() string {
  695. if data.VolumeSizeLimit > 0 {
  696. return fmt.Sprintf("%.0f%%", float64(volume.Size)/float64(data.VolumeSizeLimit)*100)
  697. }
  698. return "N/A"
  699. }())
  700. if templ_7745c5c3_Err != nil {
  701. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 392, Col: 39}
  702. }
  703. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
  704. if templ_7745c5c3_Err != nil {
  705. return templ_7745c5c3_Err
  706. }
  707. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</small></div></td><td>")
  708. if templ_7745c5c3_Err != nil {
  709. return templ_7745c5c3_Err
  710. }
  711. var templ_7745c5c3_Var30 string
  712. templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", volume.FileCount))
  713. if templ_7745c5c3_Err != nil {
  714. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 396, Col: 64}
  715. }
  716. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
  717. if templ_7745c5c3_Err != nil {
  718. return templ_7745c5c3_Err
  719. }
  720. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</td><td><span class=\"badge bg-info\">")
  721. if templ_7745c5c3_Err != nil {
  722. return templ_7745c5c3_Err
  723. }
  724. var templ_7745c5c3_Var31 string
  725. templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%03d", volume.ReplicaPlacement))
  726. if templ_7745c5c3_Err != nil {
  727. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 398, Col: 101}
  728. }
  729. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
  730. if templ_7745c5c3_Err != nil {
  731. return templ_7745c5c3_Err
  732. }
  733. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</span></td>")
  734. if templ_7745c5c3_Err != nil {
  735. return templ_7745c5c3_Err
  736. }
  737. if data.ShowDiskTypeColumn {
  738. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<td><span class=\"badge bg-primary\">")
  739. if templ_7745c5c3_Err != nil {
  740. return templ_7745c5c3_Err
  741. }
  742. var templ_7745c5c3_Var32 string
  743. templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(volume.DiskType)
  744. if templ_7745c5c3_Err != nil {
  745. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 402, Col: 95}
  746. }
  747. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
  748. if templ_7745c5c3_Err != nil {
  749. return templ_7745c5c3_Err
  750. }
  751. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span></td>")
  752. if templ_7745c5c3_Err != nil {
  753. return templ_7745c5c3_Err
  754. }
  755. }
  756. if data.ShowVersionColumn {
  757. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "<td><span class=\"badge bg-dark\">")
  758. if templ_7745c5c3_Err != nil {
  759. return templ_7745c5c3_Err
  760. }
  761. var templ_7745c5c3_Var33 string
  762. templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("v%d", volume.Version))
  763. if templ_7745c5c3_Err != nil {
  764. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 407, Col: 111}
  765. }
  766. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
  767. if templ_7745c5c3_Err != nil {
  768. return templ_7745c5c3_Err
  769. }
  770. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</span></td>")
  771. if templ_7745c5c3_Err != nil {
  772. return templ_7745c5c3_Err
  773. }
  774. }
  775. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<td><div class=\"btn-group btn-group-sm\"><button type=\"button\" class=\"btn btn-outline-primary btn-sm view-details-btn\" title=\"View Details\" data-volume-id=\"")
  776. if templ_7745c5c3_Err != nil {
  777. return templ_7745c5c3_Err
  778. }
  779. var templ_7745c5c3_Var34 string
  780. templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", volume.Id))
  781. if templ_7745c5c3_Err != nil {
  782. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 413, Col: 121}
  783. }
  784. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
  785. if templ_7745c5c3_Err != nil {
  786. return templ_7745c5c3_Err
  787. }
  788. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "\"><i class=\"fas fa-eye\"></i></button> <button type=\"button\" class=\"btn btn-outline-secondary btn-sm vacuum-btn\" title=\"Vacuum\" data-volume-id=\"")
  789. if templ_7745c5c3_Err != nil {
  790. return templ_7745c5c3_Err
  791. }
  792. var templ_7745c5c3_Var35 string
  793. templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", volume.Id))
  794. if templ_7745c5c3_Err != nil {
  795. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 418, Col: 100}
  796. }
  797. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
  798. if templ_7745c5c3_Err != nil {
  799. return templ_7745c5c3_Err
  800. }
  801. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "\" data-server=\"")
  802. if templ_7745c5c3_Err != nil {
  803. return templ_7745c5c3_Err
  804. }
  805. var templ_7745c5c3_Var36 string
  806. templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(volume.Server)
  807. if templ_7745c5c3_Err != nil {
  808. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 419, Col: 82}
  809. }
  810. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
  811. if templ_7745c5c3_Err != nil {
  812. return templ_7745c5c3_Err
  813. }
  814. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "\"><i class=\"fas fa-compress-alt\"></i></button></div></td></tr>")
  815. if templ_7745c5c3_Err != nil {
  816. return templ_7745c5c3_Err
  817. }
  818. }
  819. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</tbody></table></div><!-- Volume Summary --> <div class=\"d-flex justify-content-between align-items-center mt-3\"><div><small class=\"text-muted\">Showing ")
  820. if templ_7745c5c3_Err != nil {
  821. return templ_7745c5c3_Err
  822. }
  823. var templ_7745c5c3_Var37 string
  824. templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", (data.CurrentPage-1)*data.PageSize+1))
  825. if templ_7745c5c3_Err != nil {
  826. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 434, Col: 98}
  827. }
  828. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
  829. if templ_7745c5c3_Err != nil {
  830. return templ_7745c5c3_Err
  831. }
  832. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, " to ")
  833. if templ_7745c5c3_Err != nil {
  834. return templ_7745c5c3_Err
  835. }
  836. var templ_7745c5c3_Var38 string
  837. templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", minInt(data.CurrentPage*data.PageSize, data.TotalVolumes)))
  838. if templ_7745c5c3_Err != nil {
  839. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 434, Col: 180}
  840. }
  841. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
  842. if templ_7745c5c3_Err != nil {
  843. return templ_7745c5c3_Err
  844. }
  845. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, " of ")
  846. if templ_7745c5c3_Err != nil {
  847. return templ_7745c5c3_Err
  848. }
  849. var templ_7745c5c3_Var39 string
  850. templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalVolumes))
  851. if templ_7745c5c3_Err != nil {
  852. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 434, Col: 222}
  853. }
  854. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
  855. if templ_7745c5c3_Err != nil {
  856. return templ_7745c5c3_Err
  857. }
  858. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, " volumes</small></div>")
  859. if templ_7745c5c3_Err != nil {
  860. return templ_7745c5c3_Err
  861. }
  862. if data.TotalPages > 1 {
  863. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<div><small class=\"text-muted\">Page ")
  864. if templ_7745c5c3_Err != nil {
  865. return templ_7745c5c3_Err
  866. }
  867. var templ_7745c5c3_Var40 string
  868. templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage))
  869. if templ_7745c5c3_Err != nil {
  870. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 440, Col: 77}
  871. }
  872. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
  873. if templ_7745c5c3_Err != nil {
  874. return templ_7745c5c3_Err
  875. }
  876. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, " of ")
  877. if templ_7745c5c3_Err != nil {
  878. return templ_7745c5c3_Err
  879. }
  880. var templ_7745c5c3_Var41 string
  881. templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalPages))
  882. if templ_7745c5c3_Err != nil {
  883. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 440, Col: 117}
  884. }
  885. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
  886. if templ_7745c5c3_Err != nil {
  887. return templ_7745c5c3_Err
  888. }
  889. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</small></div>")
  890. if templ_7745c5c3_Err != nil {
  891. return templ_7745c5c3_Err
  892. }
  893. }
  894. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "</div><!-- Pagination Controls --> ")
  895. if templ_7745c5c3_Err != nil {
  896. return templ_7745c5c3_Err
  897. }
  898. if data.TotalPages > 1 {
  899. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "<div class=\"d-flex justify-content-center mt-3\"><nav aria-label=\"Volumes pagination\"><ul class=\"pagination pagination-sm mb-0\"><!-- Previous Button -->")
  900. if templ_7745c5c3_Err != nil {
  901. return templ_7745c5c3_Err
  902. }
  903. if data.CurrentPage > 1 {
  904. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<li class=\"page-item\"><a class=\"page-link pagination-link\" href=\"#\" data-page=\"")
  905. if templ_7745c5c3_Err != nil {
  906. return templ_7745c5c3_Err
  907. }
  908. var templ_7745c5c3_Var42 string
  909. templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage-1))
  910. if templ_7745c5c3_Err != nil {
  911. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 454, Col: 138}
  912. }
  913. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
  914. if templ_7745c5c3_Err != nil {
  915. return templ_7745c5c3_Err
  916. }
  917. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "\"><i class=\"fas fa-chevron-left\"></i></a></li>")
  918. if templ_7745c5c3_Err != nil {
  919. return templ_7745c5c3_Err
  920. }
  921. } else {
  922. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<li class=\"page-item disabled\"><span class=\"page-link\"><i class=\"fas fa-chevron-left\"></i></span></li>")
  923. if templ_7745c5c3_Err != nil {
  924. return templ_7745c5c3_Err
  925. }
  926. }
  927. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "<!-- Page Numbers -->")
  928. if templ_7745c5c3_Err != nil {
  929. return templ_7745c5c3_Err
  930. }
  931. for i := maxInt(1, data.CurrentPage-2); i <= minInt(data.TotalPages, data.CurrentPage+2); i++ {
  932. if i == data.CurrentPage {
  933. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<li class=\"page-item active\"><span class=\"page-link\">")
  934. if templ_7745c5c3_Err != nil {
  935. return templ_7745c5c3_Err
  936. }
  937. var templ_7745c5c3_Var43 string
  938. templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", i))
  939. if templ_7745c5c3_Err != nil {
  940. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 470, Col: 93}
  941. }
  942. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
  943. if templ_7745c5c3_Err != nil {
  944. return templ_7745c5c3_Err
  945. }
  946. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "</span></li>")
  947. if templ_7745c5c3_Err != nil {
  948. return templ_7745c5c3_Err
  949. }
  950. } else {
  951. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "<li class=\"page-item\"><a class=\"page-link pagination-link\" href=\"#\" data-page=\"")
  952. if templ_7745c5c3_Err != nil {
  953. return templ_7745c5c3_Err
  954. }
  955. var templ_7745c5c3_Var44 string
  956. templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", i))
  957. if templ_7745c5c3_Err != nil {
  958. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 474, Col: 125}
  959. }
  960. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
  961. if templ_7745c5c3_Err != nil {
  962. return templ_7745c5c3_Err
  963. }
  964. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\">")
  965. if templ_7745c5c3_Err != nil {
  966. return templ_7745c5c3_Err
  967. }
  968. var templ_7745c5c3_Var45 string
  969. templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", i))
  970. if templ_7745c5c3_Err != nil {
  971. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 474, Col: 148}
  972. }
  973. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
  974. if templ_7745c5c3_Err != nil {
  975. return templ_7745c5c3_Err
  976. }
  977. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</a></li>")
  978. if templ_7745c5c3_Err != nil {
  979. return templ_7745c5c3_Err
  980. }
  981. }
  982. }
  983. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "<!-- Next Button -->")
  984. if templ_7745c5c3_Err != nil {
  985. return templ_7745c5c3_Err
  986. }
  987. if data.CurrentPage < data.TotalPages {
  988. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "<li class=\"page-item\"><a class=\"page-link pagination-link\" href=\"#\" data-page=\"")
  989. if templ_7745c5c3_Err != nil {
  990. return templ_7745c5c3_Err
  991. }
  992. var templ_7745c5c3_Var46 string
  993. templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.CurrentPage+1))
  994. if templ_7745c5c3_Err != nil {
  995. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 482, Col: 138}
  996. }
  997. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
  998. if templ_7745c5c3_Err != nil {
  999. return templ_7745c5c3_Err
  1000. }
  1001. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\"><i class=\"fas fa-chevron-right\"></i></a></li>")
  1002. if templ_7745c5c3_Err != nil {
  1003. return templ_7745c5c3_Err
  1004. }
  1005. } else {
  1006. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "<li class=\"page-item disabled\"><span class=\"page-link\"><i class=\"fas fa-chevron-right\"></i></span></li>")
  1007. if templ_7745c5c3_Err != nil {
  1008. return templ_7745c5c3_Err
  1009. }
  1010. }
  1011. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</ul></nav></div>")
  1012. if templ_7745c5c3_Err != nil {
  1013. return templ_7745c5c3_Err
  1014. }
  1015. }
  1016. } else {
  1017. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<div class=\"text-center py-5\"><i class=\"fas fa-database fa-3x text-muted mb-3\"></i><h5 class=\"text-muted\">No Volumes Found</h5><p class=\"text-muted\">No volumes are currently available in the cluster.</p></div>")
  1018. if templ_7745c5c3_Err != nil {
  1019. return templ_7745c5c3_Err
  1020. }
  1021. }
  1022. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "</div></div><!-- Last Updated --><div class=\"row\"><div class=\"col-12\"><small class=\"text-muted\"><i class=\"fas fa-clock me-1\"></i> Last updated: ")
  1023. if templ_7745c5c3_Err != nil {
  1024. return templ_7745c5c3_Err
  1025. }
  1026. var templ_7745c5c3_Var47 string
  1027. templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05"))
  1028. if templ_7745c5c3_Err != nil {
  1029. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volumes.templ`, Line: 512, Col: 81}
  1030. }
  1031. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
  1032. if templ_7745c5c3_Err != nil {
  1033. return templ_7745c5c3_Err
  1034. }
  1035. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "</small></div></div></div><!-- JavaScript for pagination and sorting --><script>\n // Initialize pagination links when page loads\n document.addEventListener('DOMContentLoaded', function() {\n // Add click handlers to pagination links\n document.querySelectorAll('.pagination-link').forEach(link => {\n link.addEventListener('click', function(e) {\n e.preventDefault();\n const page = this.getAttribute('data-page');\n goToPage(page);\n });\n });\n \n // Add click handlers to view details buttons\n document.querySelectorAll('.view-details-btn').forEach(button => {\n button.addEventListener('click', function(e) {\n e.preventDefault();\n const volumeId = this.getAttribute('data-volume-id');\n viewVolumeDetails(volumeId);\n });\n });\n\n // Add click handlers to volume ID links\n document.querySelectorAll('.volume-id-link').forEach(link => {\n link.addEventListener('click', function(e) {\n e.preventDefault();\n const volumeId = this.getAttribute('data-volume-id');\n viewVolumeDetails(volumeId);\n });\n });\n\n // Add click handlers to vacuum buttons\n document.querySelectorAll('.vacuum-btn').forEach(button => {\n button.addEventListener('click', function(e) {\n e.preventDefault();\n const volumeId = this.getAttribute('data-volume-id');\n const server = this.getAttribute('data-server');\n performVacuum(volumeId, server, this);\n });\n });\n });\n \n function goToPage(page) {\n const url = new URL(window.location);\n url.searchParams.set('page', page);\n window.location.href = url.toString();\n }\n \n function changePageSize() {\n const pageSize = document.getElementById('pageSizeSelect').value;\n const url = new URL(window.location);\n url.searchParams.set('pageSize', pageSize);\n url.searchParams.set('page', '1'); // Reset to first page\n window.location.href = url.toString();\n }\n \n function sortTable(column) {\n const url = new URL(window.location);\n const currentSort = url.searchParams.get('sortBy');\n const currentOrder = url.searchParams.get('sortOrder') || 'asc';\n \n let newOrder = 'asc';\n if (currentSort === column && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n \n url.searchParams.set('sortBy', column);\n url.searchParams.set('sortOrder', newOrder);\n url.searchParams.set('page', '1'); // Reset to first page\n window.location.href = url.toString();\n }\n \n function exportVolumes() {\n // TODO: Implement volume export functionality\n alert('Export functionality to be implemented');\n }\n \n function viewVolumeDetails(volumeId) {\n // Get the server from the current row - works for both buttons and volume ID links\n const clickedElement = event.target;\n const row = clickedElement.closest('tr');\n const serverCell = row.querySelector('td:nth-child(2) a');\n const server = serverCell ? serverCell.textContent.trim() : 'unknown';\n \n window.location.href = `/cluster/volumes/${volumeId}/${encodeURIComponent(server)}`;\n }\n\n function performVacuum(volumeId, server, button) {\n // Disable button and show loading state\n const originalHTML = button.innerHTML;\n button.disabled = true;\n button.innerHTML = '<i class=\"fas fa-spinner fa-spin\"></i>';\n\n // Send vacuum request\n fetch(`/api/volumes/${volumeId}/${encodeURIComponent(server)}/vacuum`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n }\n })\n .then(response => response.json())\n .then(data => {\n if (data.error) {\n showMessage(data.error, 'error');\n } else {\n showMessage(data.message || 'Volume vacuum started successfully', 'success');\n // Optionally refresh the page after a delay to show updated vacuum status\n setTimeout(() => {\n window.location.reload();\n }, 2000);\n }\n })\n .catch(error => {\n console.error('Error:', error);\n showMessage('Failed to start vacuum operation', 'error');\n })\n .finally(() => {\n // Re-enable button\n button.disabled = false;\n button.innerHTML = originalHTML;\n });\n }\n\n function showMessage(message, type) {\n // Create toast notification\n const toast = document.createElement('div');\n toast.className = `alert alert-${type === 'error' ? 'danger' : 'success'} alert-dismissible fade show position-fixed`;\n toast.style.top = '20px';\n toast.style.right = '20px';\n toast.style.zIndex = '9999';\n toast.style.minWidth = '300px';\n \n toast.innerHTML = `\n ${message}\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>\n `;\n \n document.body.appendChild(toast);\n \n // Auto-remove after 5 seconds\n setTimeout(() => {\n if (toast.parentNode) {\n toast.parentNode.removeChild(toast);\n }\n }, 5000);\n }\n </script>")
  1036. if templ_7745c5c3_Err != nil {
  1037. return templ_7745c5c3_Err
  1038. }
  1039. return nil
  1040. })
  1041. }
  1042. func countActiveVolumes(volumes []dash.VolumeWithTopology) int {
  1043. // Since we removed status tracking, consider all volumes as active
  1044. return len(volumes)
  1045. }
  1046. func countUniqueDataCenters(volumes []dash.VolumeWithTopology) int {
  1047. dcMap := make(map[string]bool)
  1048. for _, volume := range volumes {
  1049. dcMap[volume.DataCenter] = true
  1050. }
  1051. return len(dcMap)
  1052. }
  1053. func countUniqueRacks(volumes []dash.VolumeWithTopology) int {
  1054. rackMap := make(map[string]bool)
  1055. for _, volume := range volumes {
  1056. if volume.Rack != "" {
  1057. rackMap[volume.Rack] = true
  1058. }
  1059. }
  1060. return len(rackMap)
  1061. }
  1062. func countUniqueDiskTypes(volumes []dash.VolumeWithTopology) int {
  1063. diskTypeMap := make(map[string]bool)
  1064. for _, volume := range volumes {
  1065. diskType := volume.DiskType
  1066. if diskType == "" {
  1067. diskType = "hdd"
  1068. }
  1069. diskTypeMap[diskType] = true
  1070. }
  1071. return len(diskTypeMap)
  1072. }
  1073. func getSortIcon(column, currentSort, currentOrder string) templ.Component {
  1074. return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
  1075. templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
  1076. if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
  1077. return templ_7745c5c3_CtxErr
  1078. }
  1079. templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
  1080. if !templ_7745c5c3_IsBuffer {
  1081. defer func() {
  1082. templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
  1083. if templ_7745c5c3_Err == nil {
  1084. templ_7745c5c3_Err = templ_7745c5c3_BufErr
  1085. }
  1086. }()
  1087. }
  1088. ctx = templ.InitializeContext(ctx)
  1089. templ_7745c5c3_Var48 := templ.GetChildren(ctx)
  1090. if templ_7745c5c3_Var48 == nil {
  1091. templ_7745c5c3_Var48 = templ.NopComponent
  1092. }
  1093. ctx = templ.ClearChildren(ctx)
  1094. if column != currentSort {
  1095. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "<i class=\"fas fa-sort text-muted ms-1\"></i>")
  1096. if templ_7745c5c3_Err != nil {
  1097. return templ_7745c5c3_Err
  1098. }
  1099. } else if currentOrder == "asc" {
  1100. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "<i class=\"fas fa-sort-up text-primary ms-1\"></i>")
  1101. if templ_7745c5c3_Err != nil {
  1102. return templ_7745c5c3_Err
  1103. }
  1104. } else {
  1105. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "<i class=\"fas fa-sort-down text-primary ms-1\"></i>")
  1106. if templ_7745c5c3_Err != nil {
  1107. return templ_7745c5c3_Err
  1108. }
  1109. }
  1110. return nil
  1111. })
  1112. }
  1113. func minInt(a, b int) int {
  1114. if a < b {
  1115. return a
  1116. }
  1117. return b
  1118. }
  1119. func maxInt(a, b int) int {
  1120. if a > b {
  1121. return a
  1122. }
  1123. return b
  1124. }
  1125. var _ = templruntime.GeneratedTemplate