2025-07-01 01:28:09 -07:00
// Code generated by templ - DO NOT EDIT.
2025-07-11 13:03:04 -07:00
// templ: version: v0.3.906
2025-07-01 01:28:09 -07:00
package app
//lint:file-ignore SA4006 This context is only used if a nested component is present.
import "github.com/a-h/templ"
import templruntime "github.com/a-h/templ/runtime"
import (
"fmt"
"github.com/seaweedfs/seaweedfs/weed/admin/dash"
)
func ClusterMasters ( data dash . ClusterMastersData ) templ . Component {
return templruntime . GeneratedTemplate ( func ( templ_7745c5c3_Input templruntime . GeneratedComponentInput ) ( templ_7745c5c3_Err error ) {
templ_7745c5c3_W , ctx := templ_7745c5c3_Input . Writer , templ_7745c5c3_Input . Context
if templ_7745c5c3_CtxErr := ctx . Err ( ) ; templ_7745c5c3_CtxErr != nil {
return templ_7745c5c3_CtxErr
}
templ_7745c5c3_Buffer , templ_7745c5c3_IsBuffer := templruntime . GetBuffer ( templ_7745c5c3_W )
if ! templ_7745c5c3_IsBuffer {
defer func ( ) {
templ_7745c5c3_BufErr := templruntime . ReleaseBuffer ( templ_7745c5c3_Buffer )
if templ_7745c5c3_Err == nil {
templ_7745c5c3_Err = templ_7745c5c3_BufErr
}
} ( )
}
ctx = templ . InitializeContext ( ctx )
templ_7745c5c3_Var1 := templ . GetChildren ( ctx )
if templ_7745c5c3_Var1 == nil {
templ_7745c5c3_Var1 = templ . NopComponent
}
ctx = templ . ClearChildren ( ctx )
2025-07-02 23:17:27 -07:00
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\"><h1 class=\"h2\"><i class=\"fas fa-crown me-2\"></i>Masters</h1><div class=\"btn-toolbar mb-2 mb-md-0\"><div class=\"btn-group me-2\"><button type=\"button\" class=\"btn btn-sm btn-outline-primary\" onclick=\"exportMasters()\"><i class=\"fas fa-download me-1\"></i>Export</button></div></div></div><div id=\"masters-content\"><!-- Summary Cards --><div class=\"row mb-4\"><div class=\"col-xl-4 col-md-6 mb-4\"><div class=\"card border-left-primary shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-primary text-uppercase mb-1\">Total Masters</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var2 string
templ_7745c5c3_Var2 , templ_7745c5c3_Err = templ . JoinStringErrs ( fmt . Sprintf ( "%d" , data . TotalMasters ) )
if templ_7745c5c3_Err != nil {
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 34 , Col : 47 }
}
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var2 ) )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 2 , "</div></div><div class=\"col-auto\"><i class=\"fas fa-crown fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-4 col-md-6 mb-4\"><div class=\"card border-left-info shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-info text-uppercase mb-1\">Leaders</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var3 string
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Var3 , templ_7745c5c3_Err = templ . JoinStringErrs ( fmt . Sprintf ( "%d" , data . LeaderCount ) )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
2025-07-02 23:17:27 -07:00
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 54 , Col : 46 }
2025-07-01 01:28:09 -07:00
}
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var3 ) )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 3 , "</div></div><div class=\"col-auto\"><i class=\"fas fa-star fa-2x text-gray-300\"></i></div></div></div></div></div><div class=\"col-xl-4 col-md-6 mb-4\"><div class=\"card border-left-warning shadow h-100 py-2\"><div class=\"card-body\"><div class=\"row no-gutters align-items-center\"><div class=\"col mr-2\"><div class=\"text-xs font-weight-bold text-warning text-uppercase mb-1\">Cluster Health</div><div class=\"h5 mb-0 font-weight-bold text-gray-800\">" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
if data . LeaderCount > 0 {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 4 , "Healthy" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
} else {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 5 , "Warning" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 6 , "</div></div><div class=\"col-auto\"><i class=\"fas fa-heartbeat fa-2x text-gray-300\"></i></div></div></div></div></div></div><!-- Masters 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-crown me-2\"></i>Masters</h6></div><div class=\"card-body\">" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
if len ( data . Masters ) > 0 {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 7 , "<div class=\"table-responsive\"><table class=\"table table-hover\" id=\"mastersTable\"><thead><tr><th>Address</th><th>Role</th><th>Suffrage</th><th>Actions</th></tr></thead> <tbody>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
for _ , master := range data . Masters {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 8 , "<tr><td><a href=\"" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-11 13:03:04 -07:00
var templ_7745c5c3_Var4 templ . SafeURL
templ_7745c5c3_Var4 , templ_7745c5c3_Err = templ . JoinURLErrs ( templ . SafeURL ( fmt . Sprintf ( "http://%s" , master . Address ) ) )
if templ_7745c5c3_Err != nil {
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 113 , Col : 76 }
}
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var4 ) )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 9 , "\" target=\"_blank\" class=\"text-decoration-none\">" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
var templ_7745c5c3_Var5 string
templ_7745c5c3_Var5 , templ_7745c5c3_Err = templ . JoinStringErrs ( master . Address )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
2025-07-02 23:17:27 -07:00
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 114 , Col : 28 }
2025-07-01 01:28:09 -07:00
}
2025-07-02 23:17:27 -07:00
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var5 ) )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 10 , " <i class=\"fas fa-external-link-alt ms-1 text-muted\"></i></a></td><td>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
if master . IsLeader {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 11 , "<span class=\"badge bg-warning text-dark\"><i class=\"fas fa-star me-1\"></i>Leader</span>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
} else {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 12 , "<span class=\"badge bg-secondary\"><i class=\"fas fa-circle me-1\"></i>Follower</span>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 13 , "</td><td>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
if master . Suffrage != "" {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 14 , "<span class=\"badge bg-info text-dark\">" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
var templ_7745c5c3_Var6 string
templ_7745c5c3_Var6 , templ_7745c5c3_Err = templ . JoinStringErrs ( master . Suffrage )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
2025-07-02 23:17:27 -07:00
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 132 , Col : 30 }
2025-07-01 01:28:09 -07:00
}
2025-07-02 23:17:27 -07:00
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var6 ) )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 15 , "</span>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
} else {
2025-07-02 23:17:27 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 16 , "<span class=\"text-muted\">-</span>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
}
2025-07-12 01:13:11 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 17 , "</td><td><button type=\"button\" class=\"btn btn-outline-primary btn-sm\" title=\"View Details\" data-action=\"view-details\" data-address=\"" )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var7 string
templ_7745c5c3_Var7 , templ_7745c5c3_Err = templ . JoinStringErrs ( master . Address )
if templ_7745c5c3_Err != nil {
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 143 , Col : 41 }
}
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var7 ) )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 18 , "\" data-leader=\"" )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var8 string
templ_7745c5c3_Var8 , templ_7745c5c3_Err = templ . JoinStringErrs ( fmt . Sprintf ( "%t" , master . IsLeader ) )
if templ_7745c5c3_Err != nil {
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 144 , Col : 60 }
}
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var8 ) )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 19 , "\" data-suffrage=\"" )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var9 string
templ_7745c5c3_Var9 , templ_7745c5c3_Err = templ . JoinStringErrs ( master . Suffrage )
if templ_7745c5c3_Err != nil {
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 145 , Col : 43 }
}
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var9 ) )
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 20 , "\"><i class=\"fas fa-eye\"></i></button></td></tr>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
}
2025-07-12 01:13:11 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 21 , "</tbody></table></div>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
} else {
2025-07-12 01:13:11 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 22 , "<div class=\"text-center py-5\"><i class=\"fas fa-crown fa-3x text-muted mb-3\"></i><h5 class=\"text-muted\">No Masters Found</h5><p class=\"text-muted\">No master servers are currently available in the cluster.</p></div>" )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
}
2025-07-12 01:13:11 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 23 , "</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: " )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-12 01:13:11 -07:00
var templ_7745c5c3_Var10 string
templ_7745c5c3_Var10 , templ_7745c5c3_Err = templ . JoinStringErrs ( data . LastUpdated . Format ( "2006-01-02 15:04:05" ) )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
2025-07-12 01:13:11 -07:00
return templ . Error { Err : templ_7745c5c3_Err , FileName : ` view/app/cluster_masters.templ ` , Line : 169 , Col : 67 }
2025-07-01 01:28:09 -07:00
}
2025-07-12 01:13:11 -07:00
_ , templ_7745c5c3_Err = templ_7745c5c3_Buffer . WriteString ( templ . EscapeString ( templ_7745c5c3_Var10 ) )
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
2025-07-12 01:13:11 -07:00
templ_7745c5c3_Err = templruntime . WriteString ( templ_7745c5c3_Buffer , 24 , "</small></div></div></div><!-- JavaScript for cluster masters functionality --><script>\n\tdocument.addEventListener('DOMContentLoaded', function() {\n\t\t// Handle master action buttons\n\t\tdocument.addEventListener('click', function(e) {\n\t\t\tconst button = e.target.closest('[data-action]');\n\t\t\tif (!button) return;\n\t\t\t\n\t\t\tconst action = button.getAttribute('data-action');\n\t\t\tconst address = button.getAttribute('data-address');\n\t\t\t\n\t\t\tif (!address) return;\n\t\t\t\n\t\t\tswitch(action) {\n\t\t\t\tcase 'view-details':\n\t\t\t\t\tconst isLeader = button.getAttribute('data-leader') === 'true';\n\t\t\t\t\tconst suffrage = button.getAttribute('data-suffrage');\n\t\t\t\t\tshowMasterDetails(address, isLeader, suffrage);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t});\n\t\n\tfunction showMasterDetails(address, isLeader, suffrage) {\n\t\tconst modalHtml = '<div class=\"modal fade\" id=\"masterDetailsModal\" tabindex=\"-1\">' +\n\t\t\t'<div class=\"modal-dialog modal-lg\">' +\n\t\t\t'<div class=\"modal-content\">' +\n\t\t\t'<div class=\"modal-header\">' +\n\t\t\t'<h5 class=\"modal-title\"><i class=\"fas fa-crown me-2\"></i>Master Details: ' + address + '</h5>' +\n\t\t\t'<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\"></button>' +\n\t\t\t'</div>' +\n\t\t\t'<div class=\"modal-body\">' +\n\t\t\t'<div class=\"row\">' +\n\t\t\t'<div class=\"col-md-6\">' +\n\t\t\t'<h6 class=\"text-primary\"><i class=\"fas fa-info-circle me-1\"></i>Basic Information</h6>' +\n\t\t\t'<table class=\"table table-sm\">' +\n\t\t\t'<tr><td><strong>Address:</strong></td><td>' + address + '</td></tr>' +\n\t\t\t'<tr><td><strong>Role:</strong></td><td>' + \n\t\t\t(isLeader ? '<span class=\"badge bg-warning text-dark\"><i class=\"fas fa-star me-1\"></i>Leader</span>' : \n\t\t\t'<span class=\"badge bg-secondary\">Follower</span>') + '</td></tr>' +\n\t\t\t'<tr><td><strong>Suffrage:</strong></td><td>' + (suffrage || 'N/A') + '</td></tr>' +\n\t\t\t'<tr><td><strong>Status:</strong></td><td><span class=\"badge bg-success\">Active</span></td></tr>' +\n\t\t\t'</table>' +\n\t\t\t'</div>' +\n\t\t\t'<div class=\"col-md-6\">' +\n\t\t\t'<h6 class=\"text-primary\"><i class=\"fas fa-link me-1\"></i>Quick Actions</h6>' +\n\t\t\t'<div class=\"d-grid gap-2\">' +\n\t\t\t'<a href=\"http://' + address + '\" target=\"_blank\" class=\"btn btn-outline-primary\">' +\n\t\t\t'<i class=\"fas fa-external-link-alt me-1\"></i>Open Master UI' +\n\t\t\t'</a>' +\n\t\t\t'</div>' +\n\t\t\t'</div>' +\n\t\t\t'</div>' +\n\t\t\t'</div>' +\n\t\t\t'<div class=\"modal-footer\">' +\n\t\t\t'<button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>' +\n\t\t\t'</div>' +\n\t\t\t'</div>' +\n\t\t\t'</div>' +\n\t\t\t'</div>';\n\t\t\n\t\t// Remove existing modal if present\n\t\tconst existingModal = document.getElementById('masterDetailsModal');\n\t\tif (existingModal) {\n\t\t\texistingModal.remove();\n\t\t}\n\t\t\n\t\t// Add modal to body and show\n\t\tdocument.body.insertAdjacentHTML('beforeend', modalHtml);\n\t\tconst modal = new bootstrap.Modal(document.getElementById('masterDetailsModal'));\n\t\tmodal.show();\n\t\t\n\t\t// Remove modal when hidden\n\t\tdocument.getElementById('masterDetailsModal').addEventListener('hidden.bs.modal', function() {\n\t\t\tthis.remove();\n\t\t});\n\t}\n\t\n\tfunction exportMasters() {\n\t\t// Simple CSV export of masters list\n\t\tconst rows = Array.from(document.querySelectorAll('#mastersTable tbody tr')).map(row => {\n\t\t\tconst cells = row.querySelectorAll('td');\n\t\t\tif (cells.length > 1) {\n\t\t\t\treturn {\n\t\t\t\t\taddress: cells[0].textContent.trim(),\n\t\t\t\t\trole: cells[1].textContent.trim(),\n\t\t\t\t\tsuffrage: cells[2].textContent.trim()\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn null;\n\t\t}).filter(row => row !== null);\n\t\t\n\t\tconst csvContent = \"data:text/csv;charset=utf-8,\" + \n\t\t\t\"Address,Role,Suffrage\\n\" +\n\t\t\trows.map(r => '\"' + r.address + '\",\"' + r.role + '\",\"' + r.suffrage + '\"').join(\"
2025-07-01 01:28:09 -07:00
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
return nil
} )
}
var _ = templruntime . GeneratedTemplate