volume_details_templ.go 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. // Code generated by templ - DO NOT EDIT.
  2. // templ: version: v0.3.906
  3. package app
  4. //lint:file-ignore SA4006 This context is only used if a nested component is present.
  5. import "github.com/a-h/templ"
  6. import templruntime "github.com/a-h/templ/runtime"
  7. import (
  8. "fmt"
  9. "github.com/seaweedfs/seaweedfs/weed/admin/dash"
  10. "time"
  11. )
  12. func VolumeDetails(data dash.VolumeDetailsData) 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>Volume Details</h1><nav aria-label=\"breadcrumb\"><ol class=\"breadcrumb\"><li class=\"breadcrumb-item\"><a href=\"/admin\" class=\"text-decoration-none\">Dashboard</a></li><li class=\"breadcrumb-item\"><a href=\"/cluster/volumes\" class=\"text-decoration-none\">Volumes</a></li><li class=\"breadcrumb-item active\" aria-current=\"page\">Volume ")
  34. if templ_7745c5c3_Err != nil {
  35. return templ_7745c5c3_Err
  36. }
  37. var templ_7745c5c3_Var2 string
  38. templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.Id))
  39. if templ_7745c5c3_Err != nil {
  40. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 19, Col: 116}
  41. }
  42. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
  43. if templ_7745c5c3_Err != nil {
  44. return templ_7745c5c3_Err
  45. }
  46. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</li></ol></nav></div><div class=\"btn-toolbar mb-2 mb-md-0\"><div class=\"btn-group me-2\"><button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" onclick=\"history.back()\"><i class=\"fas fa-arrow-left me-1\"></i>Back</button> <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" onclick=\"window.location.reload()\"><i class=\"fas fa-refresh me-1\"></i>Refresh</button></div></div></div><div class=\"row\"><!-- Volume Information Card --><div class=\"col-lg-8\"><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-info-circle me-2\"></i>Volume Information</h6></div><div class=\"card-body\"><div class=\"row\"><div class=\"col-md-6\"><div class=\"mb-3\"><label class=\"form-label\"><strong>Volume ID:</strong></label><div><code class=\"fs-5\">")
  47. if templ_7745c5c3_Err != nil {
  48. return templ_7745c5c3_Err
  49. }
  50. var templ_7745c5c3_Var3 string
  51. templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.Id))
  52. if templ_7745c5c3_Err != nil {
  53. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 49, Col: 90}
  54. }
  55. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
  56. if templ_7745c5c3_Err != nil {
  57. return templ_7745c5c3_Err
  58. }
  59. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</code></div></div><div class=\"mb-3\"><label class=\"form-label\"><strong>Server:</strong></label><div><a href=\"")
  60. if templ_7745c5c3_Err != nil {
  61. return templ_7745c5c3_Err
  62. }
  63. var templ_7745c5c3_Var4 templ.SafeURL
  64. templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", data.Volume.Server)))
  65. if templ_7745c5c3_Err != nil {
  66. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 54, Col: 118}
  67. }
  68. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
  69. if templ_7745c5c3_Err != nil {
  70. return templ_7745c5c3_Err
  71. }
  72. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "\" target=\"_blank\" class=\"text-decoration-none\">")
  73. if templ_7745c5c3_Err != nil {
  74. return templ_7745c5c3_Err
  75. }
  76. var templ_7745c5c3_Var5 string
  77. templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.Server)
  78. if templ_7745c5c3_Err != nil {
  79. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 55, Col: 59}
  80. }
  81. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
  82. if templ_7745c5c3_Err != nil {
  83. return templ_7745c5c3_Err
  84. }
  85. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, " <i class=\"fas fa-external-link-alt ms-1 text-muted\"></i></a></div></div><div class=\"mb-3\"><label class=\"form-label\"><strong>Data Center:</strong></label><div><span class=\"badge bg-light text-dark\">")
  86. if templ_7745c5c3_Err != nil {
  87. return templ_7745c5c3_Err
  88. }
  89. var templ_7745c5c3_Var6 string
  90. templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.DataCenter)
  91. if templ_7745c5c3_Err != nil {
  92. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 62, Col: 99}
  93. }
  94. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
  95. if templ_7745c5c3_Err != nil {
  96. return templ_7745c5c3_Err
  97. }
  98. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</span></div></div><div class=\"mb-3\"><label class=\"form-label\"><strong>Rack:</strong></label><div><span class=\"badge bg-light text-dark\">")
  99. if templ_7745c5c3_Err != nil {
  100. return templ_7745c5c3_Err
  101. }
  102. var templ_7745c5c3_Var7 string
  103. templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.Rack)
  104. if templ_7745c5c3_Err != nil {
  105. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 66, Col: 93}
  106. }
  107. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
  108. if templ_7745c5c3_Err != nil {
  109. return templ_7745c5c3_Err
  110. }
  111. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</span></div></div></div><div class=\"col-md-6\"><div class=\"mb-3\"><label class=\"form-label\"><strong>Collection:</strong></label><div>")
  112. if templ_7745c5c3_Err != nil {
  113. return templ_7745c5c3_Err
  114. }
  115. if data.Volume.Collection == "" {
  116. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<a href=\"")
  117. if templ_7745c5c3_Err != nil {
  118. return templ_7745c5c3_Err
  119. }
  120. var templ_7745c5c3_Var8 templ.SafeURL
  121. templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/cluster/volumes?collection=default"))
  122. if templ_7745c5c3_Err != nil {
  123. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 74, Col: 101}
  124. }
  125. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
  126. if templ_7745c5c3_Err != nil {
  127. return templ_7745c5c3_Err
  128. }
  129. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "\" class=\"text-decoration-none\"><span class=\"badge bg-secondary\">default</span></a>")
  130. if templ_7745c5c3_Err != nil {
  131. return templ_7745c5c3_Err
  132. }
  133. } else {
  134. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<a href=\"")
  135. if templ_7745c5c3_Err != nil {
  136. return templ_7745c5c3_Err
  137. }
  138. var templ_7745c5c3_Var9 templ.SafeURL
  139. templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("/cluster/volumes?collection=%s", data.Volume.Collection)))
  140. if templ_7745c5c3_Err != nil {
  141. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 78, Col: 133}
  142. }
  143. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
  144. if templ_7745c5c3_Err != nil {
  145. return templ_7745c5c3_Err
  146. }
  147. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "\" class=\"text-decoration-none\"><span class=\"badge bg-secondary\">")
  148. if templ_7745c5c3_Err != nil {
  149. return templ_7745c5c3_Err
  150. }
  151. var templ_7745c5c3_Var10 string
  152. templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.Collection)
  153. if templ_7745c5c3_Err != nil {
  154. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 79, Col: 100}
  155. }
  156. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
  157. if templ_7745c5c3_Err != nil {
  158. return templ_7745c5c3_Err
  159. }
  160. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "</span></a>")
  161. if templ_7745c5c3_Err != nil {
  162. return templ_7745c5c3_Err
  163. }
  164. }
  165. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</div></div><div class=\"mb-3\"><label class=\"form-label\"><strong>Replication:</strong></label><div><span class=\"badge bg-info\">")
  166. if templ_7745c5c3_Err != nil {
  167. return templ_7745c5c3_Err
  168. }
  169. var templ_7745c5c3_Var11 string
  170. templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%03d", data.Volume.ReplicaPlacement))
  171. if templ_7745c5c3_Err != nil {
  172. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 86, Col: 115}
  173. }
  174. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
  175. if templ_7745c5c3_Err != nil {
  176. return templ_7745c5c3_Err
  177. }
  178. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</span></div></div><div class=\"mb-3\"><label class=\"form-label\"><strong>Disk Type:</strong></label><div><span class=\"badge bg-primary\">")
  179. if templ_7745c5c3_Err != nil {
  180. return templ_7745c5c3_Err
  181. }
  182. if data.Volume.DiskType == "" {
  183. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "hdd")
  184. if templ_7745c5c3_Err != nil {
  185. return templ_7745c5c3_Err
  186. }
  187. } else {
  188. var templ_7745c5c3_Var12 string
  189. templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.DiskType)
  190. if templ_7745c5c3_Err != nil {
  191. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 95, Col: 65}
  192. }
  193. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
  194. if templ_7745c5c3_Err != nil {
  195. return templ_7745c5c3_Err
  196. }
  197. }
  198. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "</span></div></div><div class=\"mb-3\"><label class=\"form-label\"><strong>Version:</strong></label><div><span class=\"badge bg-dark\">")
  199. if templ_7745c5c3_Err != nil {
  200. return templ_7745c5c3_Err
  201. }
  202. var templ_7745c5c3_Var13 string
  203. templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("v%d", data.Volume.Version))
  204. if templ_7745c5c3_Err != nil {
  205. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 102, Col: 105}
  206. }
  207. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
  208. if templ_7745c5c3_Err != nil {
  209. return templ_7745c5c3_Err
  210. }
  211. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</span></div></div></div></div></div></div></div><!-- Statistics Card --><div class=\"col-lg-4\"><!-- Volume Statistics & Health Card --><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-chart-pie me-2\"></i>Volume Statistics & Health</h6></div><div class=\"card-body\"><!-- Storage Metrics --><div class=\"row mb-3\"><div class=\"col-6\"><div class=\"text-center\"><div class=\"h4 mb-0 font-weight-bold text-success\">")
  212. if templ_7745c5c3_Err != nil {
  213. return templ_7745c5c3_Err
  214. }
  215. var templ_7745c5c3_Var14 string
  216. templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(int64(data.Volume.Size - data.Volume.DeletedByteCount)))
  217. if templ_7745c5c3_Err != nil {
  218. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 125, Col: 104}
  219. }
  220. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
  221. if templ_7745c5c3_Err != nil {
  222. return templ_7745c5c3_Err
  223. }
  224. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</div><small class=\"text-muted\">Active Bytes</small></div></div><div class=\"col-6\"><div class=\"text-center\"><div class=\"h4 mb-0 font-weight-bold text-danger\">")
  225. if templ_7745c5c3_Err != nil {
  226. return templ_7745c5c3_Err
  227. }
  228. var templ_7745c5c3_Var15 string
  229. templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(int64(data.Volume.DeletedByteCount)))
  230. if templ_7745c5c3_Err != nil {
  231. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 133, Col: 85}
  232. }
  233. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
  234. if templ_7745c5c3_Err != nil {
  235. return templ_7745c5c3_Err
  236. }
  237. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</div><small class=\"text-muted\">Deleted Bytes</small></div></div></div><!-- File Metrics --><div class=\"row mb-3\"><div class=\"col-6\"><div class=\"text-center\"><div class=\"h4 mb-0 font-weight-bold text-success\">")
  238. if templ_7745c5c3_Err != nil {
  239. return templ_7745c5c3_Err
  240. }
  241. var templ_7745c5c3_Var16 string
  242. templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.FileCount))
  243. if templ_7745c5c3_Err != nil {
  244. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 147, Col: 77}
  245. }
  246. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
  247. if templ_7745c5c3_Err != nil {
  248. return templ_7745c5c3_Err
  249. }
  250. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "</div><small class=\"text-muted\">Active Files</small></div></div><div class=\"col-6\"><div class=\"text-center\"><div class=\"h4 mb-0 font-weight-bold text-danger\">")
  251. if templ_7745c5c3_Err != nil {
  252. return templ_7745c5c3_Err
  253. }
  254. var templ_7745c5c3_Var17 string
  255. templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.DeleteCount))
  256. if templ_7745c5c3_Err != nil {
  257. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 155, Col: 79}
  258. }
  259. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
  260. if templ_7745c5c3_Err != nil {
  261. return templ_7745c5c3_Err
  262. }
  263. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</div><small class=\"text-muted\">Deleted Files</small></div></div></div><!-- Storage Efficiency -->")
  264. if templ_7745c5c3_Err != nil {
  265. return templ_7745c5c3_Err
  266. }
  267. if data.Volume.FileCount > 0 && data.Volume.Size > 0 {
  268. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<div class=\"mb-3\"><div class=\"d-flex justify-content-between align-items-center mb-1\"><small class=\"text-muted\">Storage Efficiency</small> <small class=\"text-muted\">")
  269. if templ_7745c5c3_Err != nil {
  270. return templ_7745c5c3_Err
  271. }
  272. var templ_7745c5c3_Var18 string
  273. templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.1f%%", float64(data.Volume.Size-data.Volume.DeletedByteCount)/float64(data.Volume.Size)*100))
  274. if templ_7745c5c3_Err != nil {
  275. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 170, Col: 144}
  276. }
  277. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
  278. if templ_7745c5c3_Err != nil {
  279. return templ_7745c5c3_Err
  280. }
  281. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</small></div><div class=\"progress\" style=\"height: 8px;\"><div class=\"progress-bar bg-info\" role=\"progressbar\" style=\"")
  282. if templ_7745c5c3_Err != nil {
  283. return templ_7745c5c3_Err
  284. }
  285. var templ_7745c5c3_Var19 string
  286. templ_7745c5c3_Var19, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %.1f%%", float64(data.Volume.Size-data.Volume.DeletedByteCount)/float64(data.Volume.Size)*100))
  287. if templ_7745c5c3_Err != nil {
  288. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 175, Col: 158}
  289. }
  290. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
  291. if templ_7745c5c3_Err != nil {
  292. return templ_7745c5c3_Err
  293. }
  294. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "\" aria-valuenow=\"")
  295. if templ_7745c5c3_Err != nil {
  296. return templ_7745c5c3_Err
  297. }
  298. var templ_7745c5c3_Var20 string
  299. templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.1f", float64(data.Volume.Size-data.Volume.DeletedByteCount)/float64(data.Volume.Size)*100))
  300. if templ_7745c5c3_Err != nil {
  301. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 176, Col: 157}
  302. }
  303. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
  304. if templ_7745c5c3_Err != nil {
  305. return templ_7745c5c3_Err
  306. }
  307. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div></div></div>")
  308. if templ_7745c5c3_Err != nil {
  309. return templ_7745c5c3_Err
  310. }
  311. }
  312. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "<hr class=\"my-3\"><!-- Status & Configuration --><div class=\"row mb-3\"><div class=\"col-12\"><div class=\"text-center mb-2\">")
  313. if templ_7745c5c3_Err != nil {
  314. return templ_7745c5c3_Err
  315. }
  316. if data.Volume.ReadOnly {
  317. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<span class=\"badge bg-warning fs-6 px-3 py-2\"><i class=\"fas fa-lock me-1\"></i>Read Only</span> ")
  318. if templ_7745c5c3_Err != nil {
  319. return templ_7745c5c3_Err
  320. }
  321. if data.Volume.Size >= data.VolumeSizeLimit {
  322. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<div class=\"mt-1\"><small class=\"text-muted\">Size limit exceeded</small></div>")
  323. if templ_7745c5c3_Err != nil {
  324. return templ_7745c5c3_Err
  325. }
  326. }
  327. } else if data.VolumeSizeLimit > data.Volume.Size {
  328. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<span class=\"badge bg-success fs-6 px-3 py-2\"><i class=\"fas fa-edit me-1\"></i>Read/Write</span>")
  329. if templ_7745c5c3_Err != nil {
  330. return templ_7745c5c3_Err
  331. }
  332. } else {
  333. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<span class=\"badge bg-warning fs-6 px-3 py-2\"><i class=\"fas fa-exclamation-triangle me-1\"></i>Size Limit Reached</span>")
  334. if templ_7745c5c3_Err != nil {
  335. return templ_7745c5c3_Err
  336. }
  337. }
  338. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</div></div></div><!-- Maintenance Info --><div class=\"row mb-3\"><div class=\"col-6\"><div class=\"text-center\"><div class=\"h6 mb-0 font-weight-bold text-info\">#")
  339. if templ_7745c5c3_Err != nil {
  340. return templ_7745c5c3_Err
  341. }
  342. var templ_7745c5c3_Var21 string
  343. templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.CompactRevision))
  344. if templ_7745c5c3_Err != nil {
  345. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 216, Col: 84}
  346. }
  347. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
  348. if templ_7745c5c3_Err != nil {
  349. return templ_7745c5c3_Err
  350. }
  351. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</div><small class=\"text-muted\">Vacuum Revision</small></div></div><div class=\"col-6\"><div class=\"text-center\"><div class=\"h6 mb-0 font-weight-bold text-secondary\">")
  352. if templ_7745c5c3_Err != nil {
  353. return templ_7745c5c3_Err
  354. }
  355. if data.Volume.ModifiedAtSecond > 0 {
  356. var templ_7745c5c3_Var22 string
  357. templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(formatTimestamp(data.Volume.ModifiedAtSecond))
  358. if templ_7745c5c3_Err != nil {
  359. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 225, Col: 86}
  360. }
  361. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
  362. if templ_7745c5c3_Err != nil {
  363. return templ_7745c5c3_Err
  364. }
  365. } else {
  366. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<span class=\"text-muted\">Never modified</span>")
  367. if templ_7745c5c3_Err != nil {
  368. return templ_7745c5c3_Err
  369. }
  370. }
  371. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</div><small class=\"text-muted\">Last Modified</small></div></div></div><!-- TTL Configuration -->")
  372. if templ_7745c5c3_Err != nil {
  373. return templ_7745c5c3_Err
  374. }
  375. if data.Volume.Ttl > 0 {
  376. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<div class=\"mb-3 text-center\"><span class=\"badge bg-info fs-6 px-3 py-2\"><i class=\"fas fa-clock me-1\"></i>")
  377. if templ_7745c5c3_Err != nil {
  378. return templ_7745c5c3_Err
  379. }
  380. var templ_7745c5c3_Var23 string
  381. templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(formatTTL(data.Volume.Ttl))
  382. if templ_7745c5c3_Err != nil {
  383. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 239, Col: 92}
  384. }
  385. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
  386. if templ_7745c5c3_Err != nil {
  387. return templ_7745c5c3_Err
  388. }
  389. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</span><div class=\"mt-1\"><small class=\"text-muted\">Time To Live</small></div></div>")
  390. if templ_7745c5c3_Err != nil {
  391. return templ_7745c5c3_Err
  392. }
  393. }
  394. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<!-- Remote Storage Configuration -->")
  395. if templ_7745c5c3_Err != nil {
  396. return templ_7745c5c3_Err
  397. }
  398. if data.Volume.RemoteStorageName != "" {
  399. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<hr class=\"my-3\"><div class=\"mb-2\"><div class=\"text-center\"><div class=\"h6 mb-1 font-weight-bold text-info\"><i class=\"fas fa-cloud me-1\"></i>")
  400. if templ_7745c5c3_Err != nil {
  401. return templ_7745c5c3_Err
  402. }
  403. var templ_7745c5c3_Var24 string
  404. templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.RemoteStorageName)
  405. if templ_7745c5c3_Err != nil {
  406. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 253, Col: 99}
  407. }
  408. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
  409. if templ_7745c5c3_Err != nil {
  410. return templ_7745c5c3_Err
  411. }
  412. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</div><small class=\"text-muted\">Remote Storage</small></div></div>")
  413. if templ_7745c5c3_Err != nil {
  414. return templ_7745c5c3_Err
  415. }
  416. if data.Volume.RemoteStorageKey != "" {
  417. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<div class=\"text-center\"><div class=\"text-xs font-monospace bg-light p-2 rounded text-truncate\" title=\"")
  418. if templ_7745c5c3_Err != nil {
  419. return templ_7745c5c3_Err
  420. }
  421. var templ_7745c5c3_Var25 string
  422. templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.RemoteStorageKey)
  423. if templ_7745c5c3_Err != nil {
  424. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 260, Col: 138}
  425. }
  426. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
  427. if templ_7745c5c3_Err != nil {
  428. return templ_7745c5c3_Err
  429. }
  430. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "\">")
  431. if templ_7745c5c3_Err != nil {
  432. return templ_7745c5c3_Err
  433. }
  434. var templ_7745c5c3_Var26 string
  435. templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.RemoteStorageKey)
  436. if templ_7745c5c3_Err != nil {
  437. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 261, Col: 65}
  438. }
  439. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
  440. if templ_7745c5c3_Err != nil {
  441. return templ_7745c5c3_Err
  442. }
  443. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "</div><small class=\"text-muted\">Storage Key</small></div>")
  444. if templ_7745c5c3_Err != nil {
  445. return templ_7745c5c3_Err
  446. }
  447. }
  448. }
  449. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</div></div></div></div><!-- Replicas Card -->")
  450. if templ_7745c5c3_Err != nil {
  451. return templ_7745c5c3_Err
  452. }
  453. if len(data.Replicas) > 0 {
  454. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<div class=\"row\"><div class=\"col-12\"><div class=\"card shadow mb-4\"><div class=\"card-header py-3\"><h6 class=\"m-0 font-weight-bold text-primary\"><i class=\"fas fa-copy me-2\"></i>Replicas (")
  455. if templ_7745c5c3_Err != nil {
  456. return templ_7745c5c3_Err
  457. }
  458. var templ_7745c5c3_Var27 string
  459. templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.ReplicationCount))
  460. if templ_7745c5c3_Err != nil {
  461. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 279, Col: 111}
  462. }
  463. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
  464. if templ_7745c5c3_Err != nil {
  465. return templ_7745c5c3_Err
  466. }
  467. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, ")</h6></div><div class=\"card-body\"><div class=\"table-responsive\"><table class=\"table table-hover\"><thead><tr><th>Server</th><th>Data Center</th><th>Rack</th><th>Size</th><th>File Count</th><th>Status</th><th>Actions</th></tr></thead> <tbody><!-- Primary Volume (current one) --><tr class=\"table-primary\"><td><strong><a href=\"")
  468. if templ_7745c5c3_Err != nil {
  469. return templ_7745c5c3_Err
  470. }
  471. var templ_7745c5c3_Var28 templ.SafeURL
  472. templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", data.Volume.Server)))
  473. if templ_7745c5c3_Err != nil {
  474. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 301, Col: 130}
  475. }
  476. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
  477. if templ_7745c5c3_Err != nil {
  478. return templ_7745c5c3_Err
  479. }
  480. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\" target=\"_blank\" class=\"text-decoration-none\">")
  481. if templ_7745c5c3_Err != nil {
  482. return templ_7745c5c3_Err
  483. }
  484. var templ_7745c5c3_Var29 string
  485. templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.Server)
  486. if templ_7745c5c3_Err != nil {
  487. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 302, Col: 71}
  488. }
  489. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
  490. if templ_7745c5c3_Err != nil {
  491. return templ_7745c5c3_Err
  492. }
  493. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, " <i class=\"fas fa-external-link-alt ms-1 text-muted\"></i></a></strong> <span class=\"badge bg-success ms-2\">Primary</span></td><td><span class=\"badge bg-light text-dark\">")
  494. if templ_7745c5c3_Err != nil {
  495. return templ_7745c5c3_Err
  496. }
  497. var templ_7745c5c3_Var30 string
  498. templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.DataCenter)
  499. if templ_7745c5c3_Err != nil {
  500. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 308, Col: 106}
  501. }
  502. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
  503. if templ_7745c5c3_Err != nil {
  504. return templ_7745c5c3_Err
  505. }
  506. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</span></td><td><span class=\"badge bg-light text-dark\">")
  507. if templ_7745c5c3_Err != nil {
  508. return templ_7745c5c3_Err
  509. }
  510. var templ_7745c5c3_Var31 string
  511. templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.Rack)
  512. if templ_7745c5c3_Err != nil {
  513. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 309, Col: 100}
  514. }
  515. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
  516. if templ_7745c5c3_Err != nil {
  517. return templ_7745c5c3_Err
  518. }
  519. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</span></td><td>")
  520. if templ_7745c5c3_Err != nil {
  521. return templ_7745c5c3_Err
  522. }
  523. var templ_7745c5c3_Var32 string
  524. templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(int64(data.Volume.Size)))
  525. if templ_7745c5c3_Err != nil {
  526. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 310, Col: 81}
  527. }
  528. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
  529. if templ_7745c5c3_Err != nil {
  530. return templ_7745c5c3_Err
  531. }
  532. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</td><td>")
  533. if templ_7745c5c3_Err != nil {
  534. return templ_7745c5c3_Err
  535. }
  536. var templ_7745c5c3_Var33 string
  537. templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.FileCount))
  538. if templ_7745c5c3_Err != nil {
  539. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 311, Col: 85}
  540. }
  541. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
  542. if templ_7745c5c3_Err != nil {
  543. return templ_7745c5c3_Err
  544. }
  545. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</td><td><span class=\"badge bg-success\">Active</span></td><td><span class=\"text-muted\">Current Volume</span></td></tr><!-- Replica Volumes -->")
  546. if templ_7745c5c3_Err != nil {
  547. return templ_7745c5c3_Err
  548. }
  549. for _, replica := range data.Replicas {
  550. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<tr><td><a href=\"")
  551. if templ_7745c5c3_Err != nil {
  552. return templ_7745c5c3_Err
  553. }
  554. var templ_7745c5c3_Var34 templ.SafeURL
  555. templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", replica.Server)))
  556. if templ_7745c5c3_Err != nil {
  557. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 321, Col: 126}
  558. }
  559. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
  560. if templ_7745c5c3_Err != nil {
  561. return templ_7745c5c3_Err
  562. }
  563. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\" target=\"_blank\" class=\"text-decoration-none\">")
  564. if templ_7745c5c3_Err != nil {
  565. return templ_7745c5c3_Err
  566. }
  567. var templ_7745c5c3_Var35 string
  568. templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(replica.Server)
  569. if templ_7745c5c3_Err != nil {
  570. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 322, Col: 67}
  571. }
  572. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
  573. if templ_7745c5c3_Err != nil {
  574. return templ_7745c5c3_Err
  575. }
  576. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, " <i class=\"fas fa-external-link-alt ms-1 text-muted\"></i></a></td><td><span class=\"badge bg-light text-dark\">")
  577. if templ_7745c5c3_Err != nil {
  578. return templ_7745c5c3_Err
  579. }
  580. var templ_7745c5c3_Var36 string
  581. templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(replica.DataCenter)
  582. if templ_7745c5c3_Err != nil {
  583. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 326, Col: 106}
  584. }
  585. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
  586. if templ_7745c5c3_Err != nil {
  587. return templ_7745c5c3_Err
  588. }
  589. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</span></td><td><span class=\"badge bg-light text-dark\">")
  590. if templ_7745c5c3_Err != nil {
  591. return templ_7745c5c3_Err
  592. }
  593. var templ_7745c5c3_Var37 string
  594. templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(replica.Rack)
  595. if templ_7745c5c3_Err != nil {
  596. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 327, Col: 100}
  597. }
  598. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
  599. if templ_7745c5c3_Err != nil {
  600. return templ_7745c5c3_Err
  601. }
  602. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</span></td><td>")
  603. if templ_7745c5c3_Err != nil {
  604. return templ_7745c5c3_Err
  605. }
  606. var templ_7745c5c3_Var38 string
  607. templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(int64(replica.Size)))
  608. if templ_7745c5c3_Err != nil {
  609. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 328, Col: 81}
  610. }
  611. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
  612. if templ_7745c5c3_Err != nil {
  613. return templ_7745c5c3_Err
  614. }
  615. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</td><td>")
  616. if templ_7745c5c3_Err != nil {
  617. return templ_7745c5c3_Err
  618. }
  619. var templ_7745c5c3_Var39 string
  620. templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", replica.FileCount))
  621. if templ_7745c5c3_Err != nil {
  622. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 329, Col: 85}
  623. }
  624. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
  625. if templ_7745c5c3_Err != nil {
  626. return templ_7745c5c3_Err
  627. }
  628. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</td><td><span class=\"badge bg-info\">Replica</span></td><td><a href=\"")
  629. if templ_7745c5c3_Err != nil {
  630. return templ_7745c5c3_Err
  631. }
  632. var templ_7745c5c3_Var40 templ.SafeURL
  633. templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("/cluster/volumes/%d/%s", replica.Id, replica.Server)))
  634. if templ_7745c5c3_Err != nil {
  635. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 332, Col: 137}
  636. }
  637. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
  638. if templ_7745c5c3_Err != nil {
  639. return templ_7745c5c3_Err
  640. }
  641. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "\" class=\"btn btn-sm btn-outline-primary\"><i class=\"fas fa-eye me-1\"></i>View</a></td></tr>")
  642. if templ_7745c5c3_Err != nil {
  643. return templ_7745c5c3_Err
  644. }
  645. }
  646. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</tbody></table></div></div></div></div></div>")
  647. if templ_7745c5c3_Err != nil {
  648. return templ_7745c5c3_Err
  649. }
  650. }
  651. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "<!-- Actions Card --><div class=\"row\"><div class=\"col-12\"><div class=\"card shadow mb-4\"><div class=\"card-header py-3\"><h6 class=\"m-0 font-weight-bold text-primary\"><i class=\"fas fa-tools me-2\"></i>Actions</h6></div><div class=\"card-body\"><div class=\"btn-group\" role=\"group\"><button type=\"button\" class=\"btn btn-outline-danger vacuum-btn\" title=\"Vacuum Volume\" data-volume-id=\"")
  652. if templ_7745c5c3_Err != nil {
  653. return templ_7745c5c3_Err
  654. }
  655. var templ_7745c5c3_Var41 string
  656. templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.Volume.Id))
  657. if templ_7745c5c3_Err != nil {
  658. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 360, Col: 81}
  659. }
  660. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
  661. if templ_7745c5c3_Err != nil {
  662. return templ_7745c5c3_Err
  663. }
  664. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "\" data-server=\"")
  665. if templ_7745c5c3_Err != nil {
  666. return templ_7745c5c3_Err
  667. }
  668. var templ_7745c5c3_Var42 string
  669. templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(data.Volume.Server)
  670. if templ_7745c5c3_Err != nil {
  671. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 361, Col: 63}
  672. }
  673. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
  674. if templ_7745c5c3_Err != nil {
  675. return templ_7745c5c3_Err
  676. }
  677. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "\"><i class=\"fas fa-compress-alt me-1\"></i>Vacuum</button></div><div class=\"mt-3\"><small class=\"text-muted\"><i class=\"fas fa-info-circle me-1\"></i> Use these actions to perform maintenance operations on the volume.</small></div></div></div></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: ")
  678. if templ_7745c5c3_Err != nil {
  679. return templ_7745c5c3_Err
  680. }
  681. var templ_7745c5c3_Var43 string
  682. templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05"))
  683. if templ_7745c5c3_Err != nil {
  684. return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/volume_details.templ`, Line: 381, Col: 77}
  685. }
  686. _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
  687. if templ_7745c5c3_Err != nil {
  688. return templ_7745c5c3_Err
  689. }
  690. templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</small></div></div><!-- JavaScript for volume actions --><script>\n document.addEventListener('DOMContentLoaded', function() {\n // Add click handler for vacuum button\n const vacuumBtn = document.querySelector('.vacuum-btn');\n if (vacuumBtn) {\n vacuumBtn.addEventListener('click', function() {\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 performVacuum(volumeId, server, button) {\n // Disable button and show loading state\n const originalText = button.innerHTML;\n button.disabled = true;\n button.innerHTML = '<i class=\"fas fa-spinner fa-spin me-1\"></i>Vacuuming...';\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\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 = originalText;\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>")
  691. if templ_7745c5c3_Err != nil {
  692. return templ_7745c5c3_Err
  693. }
  694. return nil
  695. })
  696. }
  697. func formatTimestamp(unixTimestamp int64) string {
  698. if unixTimestamp <= 0 {
  699. return "Never"
  700. }
  701. t := time.Unix(unixTimestamp, 0)
  702. return t.Format("2006-01-02 15:04:05")
  703. }
  704. func formatTTL(ttlSeconds uint32) string {
  705. if ttlSeconds == 0 {
  706. return "No TTL"
  707. }
  708. duration := time.Duration(ttlSeconds) * time.Second
  709. // Convert to human readable format
  710. days := int(duration.Hours()) / 24
  711. hours := int(duration.Hours()) % 24
  712. minutes := int(duration.Minutes()) % 60
  713. if days > 0 {
  714. if hours > 0 {
  715. return fmt.Sprintf("%dd %dh", days, hours)
  716. }
  717. return fmt.Sprintf("%d days", days)
  718. } else if hours > 0 {
  719. if minutes > 0 {
  720. return fmt.Sprintf("%dh %dm", hours, minutes)
  721. }
  722. return fmt.Sprintf("%d hours", hours)
  723. } else if minutes > 0 {
  724. return fmt.Sprintf("%d minutes", minutes)
  725. } else {
  726. return fmt.Sprintf("%d seconds", int(duration.Seconds()))
  727. }
  728. }
  729. var _ = templruntime.GeneratedTemplate