cluster_brokers.templ 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package app
  2. import (
  3. "fmt"
  4. "github.com/seaweedfs/seaweedfs/weed/admin/dash"
  5. )
  6. templ ClusterBrokers(data dash.ClusterBrokersData) {
  7. <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
  8. <h1 class="h2">
  9. <i class="fas fa-comments me-2"></i>Message Brokers
  10. </h1>
  11. <div class="btn-toolbar mb-2 mb-md-0">
  12. <div class="btn-group me-2">
  13. <button type="button" class="btn btn-sm btn-outline-primary" onclick="exportBrokers()">
  14. <i class="fas fa-download me-1"></i>Export
  15. </button>
  16. </div>
  17. </div>
  18. </div>
  19. <div id="brokers-content">
  20. <!-- Summary Cards -->
  21. <div class="row mb-4">
  22. <div class="col-xl-12 col-md-12 mb-4">
  23. <div class="card border-left-primary shadow h-100 py-2">
  24. <div class="card-body">
  25. <div class="row no-gutters align-items-center">
  26. <div class="col mr-2">
  27. <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
  28. Total Message Brokers
  29. </div>
  30. <div class="h5 mb-0 font-weight-bold text-gray-800">
  31. { fmt.Sprintf("%d", data.TotalBrokers) }
  32. </div>
  33. </div>
  34. <div class="col-auto">
  35. <i class="fas fa-comments fa-2x text-gray-300"></i>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. <!-- Brokers Table -->
  43. <div class="card shadow mb-4">
  44. <div class="card-header py-3">
  45. <h6 class="m-0 font-weight-bold text-primary">
  46. <i class="fas fa-comments me-2"></i>Message Brokers
  47. </h6>
  48. </div>
  49. <div class="card-body">
  50. if len(data.Brokers) > 0 {
  51. <div class="table-responsive">
  52. <table class="table table-hover" id="brokersTable">
  53. <thead>
  54. <tr>
  55. <th>Address</th>
  56. <th>Version</th>
  57. <th>Data Center</th>
  58. <th>Rack</th>
  59. <th>Created At</th>
  60. </tr>
  61. </thead>
  62. <tbody>
  63. for _, broker := range data.Brokers {
  64. <tr>
  65. <td>
  66. { broker.Address }
  67. </td>
  68. <td>
  69. <span class="badge bg-light text-dark">{ broker.Version }</span>
  70. </td>
  71. <td>
  72. <span class="badge bg-light text-dark">{ broker.DataCenter }</span>
  73. </td>
  74. <td>
  75. <span class="badge bg-light text-dark">{ broker.Rack }</span>
  76. </td>
  77. <td>
  78. if !broker.CreatedAt.IsZero() {
  79. { broker.CreatedAt.Format("2006-01-02 15:04:05") }
  80. } else {
  81. <span class="text-muted">N/A</span>
  82. }
  83. </td>
  84. </tr>
  85. }
  86. </tbody>
  87. </table>
  88. </div>
  89. } else {
  90. <div class="text-center py-5">
  91. <i class="fas fa-comments fa-3x text-muted mb-3"></i>
  92. <h5 class="text-muted">No Message Brokers Found</h5>
  93. <p class="text-muted">No message broker servers are currently available in the cluster.</p>
  94. </div>
  95. }
  96. </div>
  97. </div>
  98. <!-- Last Updated -->
  99. <div class="row">
  100. <div class="col-12">
  101. <small class="text-muted">
  102. <i class="fas fa-clock me-1"></i>
  103. Last updated: { data.LastUpdated.Format("2006-01-02 15:04:05") }
  104. </small>
  105. </div>
  106. </div>
  107. </div>
  108. <script>
  109. function exportBrokers() {
  110. const table = document.getElementById('brokersTable');
  111. if (!table) return;
  112. let csv = 'Address,Version,Data Center,Rack,Created At\n';
  113. const rows = table.querySelectorAll('tbody tr');
  114. rows.forEach(row => {
  115. const cells = row.querySelectorAll('td');
  116. if (cells.length >= 5) {
  117. const address = cells[0].textContent.trim();
  118. const version = cells[1].textContent.trim();
  119. const dataCenter = cells[2].textContent.trim();
  120. const rack = cells[3].textContent.trim();
  121. const createdAt = cells[4].textContent.trim();
  122. csv += `"${address}","${version}","${dataCenter}","${rack}","${createdAt}"\n`;
  123. }
  124. });
  125. const blob = new Blob([csv], { type: 'text/csv' });
  126. const url = window.URL.createObjectURL(blob);
  127. const a = document.createElement('a');
  128. a.href = url;
  129. a.download = 'message-brokers.csv';
  130. a.click();
  131. window.URL.revokeObjectURL(url);
  132. }
  133. </script>
  134. }