From b924ffabf1c0bd9ff9fb19aa90a8f94ffaf1e7b3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 11 Nov 2026 15:32:48 -0800 Subject: [PATCH] admin: calm console restyle with light and dark themes (#12568) * admin: restyle the UI as a calm console Grey canvas with white sheets, a docked sidebar that marks the current page with an indigo tint, ink primary buttons, tinted status pills, dense tables with tabular numbers and spectrum capacity meters. The styles are design tokens layered over Bootstrap's own variables, with light and dark values, so the page templates stay unchanged. Co-Authored-By: Claude Opus 5.5 * admin: add a light, dark and automatic theme switch The choice is kept in localStorage and applied before the page paints, on the sign-in page too; automatic follows the system setting. Co-Authored-By: Claude Opus 5.5 * admin: drop hard-coded colors from page templates The volume id link, utilization track and plugin form borders used fixed light-theme colors; sparklines now use the data palette. Co-Authored-By: Claude Opus 5.5 * admin: theme the plugin job detail panel background Co-Authored-By: Claude Opus 5.5 * admin: keep the selected radio dot visible in dark mode Co-Authored-By: Claude Opus 5.5 * admin: cycle the theme from memory when storage is blocked Co-Authored-By: Claude Opus 5.5 * admin: keep success progress bars green Co-Authored-By: Claude Opus 5.5 * admin: keep keyboard focus visible on the toolbar togglers Co-Authored-By: Claude Opus 5.5 * admin: use contrasting text on danger and success buttons in dark mode Co-Authored-By: Claude Opus 5.5 * admin: lead the dashboard with cluster health and one row of tiles The header now says in one line whether the cluster is healthy and how many masters, volume servers and filers report. The two rows of stat tiles become one: the volume size limit and EC volume count move into footnotes, the mount client card joins the cluster counts, and the counts link to their pages instead of sitting in nested cards. The duplicate version list and the bucket shortcut in the header are gone, and the section menus become plain View all links. Co-Authored-By: Claude Opus 5.5 * admin: export the user columns the table actually has The users table has username, email and access key columns, but the export waited for six cells per row and so always produced only the header line. Co-Authored-By: Claude Opus 5.5 * admin: drop table titles that repeat the page title List pages titled their only table with the page title again. The table now sits right under the summary tiles, and the export actions that were hidden in the table header menu move to the page header as an Export button, matching the cluster pages. The policies menu linked to nothing and is removed. Co-Authored-By: Claude Opus 5.5 * admin: drop clock and duplicate summary tiles Buckets, users, policies and service accounts spent a summary tile on the refresh time, which the page footer already shows (policies gains that footer). The users page also showed its user count twice. Co-Authored-By: Claude Opus 5.5 * admin: show unset bucket settings as a dash Rows of No owner, No quota and Not configured made the bucket table hard to scan. Unset cells now show a quiet dash that keeps the wording as a tooltip and for screen readers, and the name and creation date no longer wrap (the full timestamp is in the date's tooltip). Co-Authored-By: Claude Opus 5.5 * admin: export buckets through the page's API exporter admin.js loads after the page, so its copy of exportBucketList replaced the buckets page's own one. That copy scraped the visible rows, so it exported only the current page, without CSV quoting, and picked up the display text of the cells. The page's exporter reads every bucket from the API with full timestamps and escaped fields. Co-Authored-By: Claude Opus 5.5 * admin: escape quotes in the user export Co-Authored-By: Claude Opus 5.5 * admin: download the bucket export as a Blob The exporter put the CSV into a data URL with encodeURI, which leaves # alone, so a bucket owner containing # ended the download there. Use the shared downloadCSV helper instead. Co-Authored-By: Claude Opus 5.5 * admin: count masters as configured, not reporting The master list comes from raft membership, which keeps a follower that is down, so it does not show which masters are reporting. Co-Authored-By: Claude Opus 5.5 * admin: link the Prometheus metrics endpoint from the sidebar Co-Authored-By: Claude Opus 5.5 * admin: drop the sidebar metrics link Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- weed/admin/dash/dashboard_metrics.go | 14 +- weed/admin/static/css/admin.css | 1118 +++++++++++++---- weed/admin/static/js/admin.js | 59 +- weed/admin/static/js/theme.js | 43 + weed/admin/static_gz/css/admin.css.gz | Bin 1719 -> 5538 bytes weed/admin/static_gz/js/admin.js.gz | Bin 16843 -> 16496 bytes weed/admin/static_gz/js/theme.js.gz | Bin 0 -> 558 bytes weed/admin/view/app/admin.templ | 289 ++--- weed/admin/view/app/admin_render_test.go | 27 +- weed/admin/view/app/admin_templ.go | 856 ++++++------- weed/admin/view/app/cluster_brokers.templ | 5 - weed/admin/view/app/cluster_brokers_templ.go | 14 +- weed/admin/view/app/cluster_filers.templ | 5 - weed/admin/view/app/cluster_filers_templ.go | 18 +- weed/admin/view/app/cluster_masters.templ | 5 - weed/admin/view/app/cluster_masters_templ.go | 16 +- weed/admin/view/app/cluster_s3_servers.templ | 5 - .../view/app/cluster_s3_servers_templ.go | 12 +- .../view/app/cluster_volume_servers.templ | 5 - .../view/app/cluster_volume_servers_templ.go | 90 +- weed/admin/view/app/cluster_volumes.templ | 4 +- weed/admin/view/app/cluster_volumes_templ.go | 4 +- weed/admin/view/app/dashboard_health.go | 59 + weed/admin/view/app/empty_value.templ | 5 + weed/admin/view/app/empty_value_templ.go | 63 + weed/admin/view/app/groups.templ | 3 - weed/admin/view/app/groups_templ.go | 28 +- weed/admin/view/app/mount_clients.templ | 5 - weed/admin/view/app/mount_clients_templ.go | 16 +- weed/admin/view/app/object_store_users.templ | 59 +- .../view/app/object_store_users_templ.go | 224 ++-- weed/admin/view/app/plugin.templ | 10 +- weed/admin/view/app/plugin_templ.go | 2 +- weed/admin/view/app/policies.templ | 45 +- weed/admin/view/app/policies_templ.go | 100 +- weed/admin/view/app/s3_buckets.templ | 66 +- weed/admin/view/app/s3_buckets_templ.go | 314 ++--- weed/admin/view/app/service_accounts.templ | 25 - weed/admin/view/app/service_accounts_templ.go | 197 ++- weed/admin/view/layout/layout.templ | 26 +- weed/admin/view/layout/layout_templ.go | 817 ++++++------ 41 files changed, 2596 insertions(+), 2057 deletions(-) create mode 100644 weed/admin/static/js/theme.js create mode 100644 weed/admin/static_gz/js/theme.js.gz create mode 100644 weed/admin/view/app/dashboard_health.go create mode 100644 weed/admin/view/app/empty_value.templ create mode 100644 weed/admin/view/app/empty_value_templ.go diff --git a/weed/admin/dash/dashboard_metrics.go b/weed/admin/dash/dashboard_metrics.go index 19032a3029..bd59b72b9c 100644 --- a/weed/admin/dash/dashboard_metrics.go +++ b/weed/admin/dash/dashboard_metrics.go @@ -105,16 +105,16 @@ func (s *AdminServer) GetDashboardTrends() DashboardTrends { tasks := series(func(s dashSample) float64 { return s.tasks }) workers := series(func(s dashSample) float64 { return s.workers }) - // Sparkline colors match the existing cards' border colors. + // Sparkline colors follow the data palette. return DashboardTrends{ Samples: len(samples), - Volumes: sparklineSVG(series(func(s dashSample) float64 { return s.volumes }), "#1cc88a"), // success - Chunks: sparklineSVG(series(func(s dashSample) float64 { return s.chunks }), "#36b9cc"), // info - DiskUsed: sparklineSVG(series(func(s dashSample) float64 { return s.diskUsed }), "#f6c23e"), // warning - EcShards: sparklineSVG(series(func(s dashSample) float64 { return s.ecShards }), "#5a5c69"), // dark - Tasks: sparklineSVG(tasks, "#36b9cc"), + Volumes: sparklineSVG(series(func(s dashSample) float64 { return s.volumes }), "#5552e0"), + Chunks: sparklineSVG(series(func(s dashSample) float64 { return s.chunks }), "#00897a"), + DiskUsed: sparklineSVG(series(func(s dashSample) float64 { return s.diskUsed }), "#c2541a"), + EcShards: sparklineSVG(series(func(s dashSample) float64 { return s.ecShards }), "#9a45c2"), + Tasks: sparklineSVG(tasks, "#8f6d10"), TasksValue: trendCount(last(tasks)), - Workers: sparklineSVG(workers, "#4e73df"), + Workers: sparklineSVG(workers, "#5552e0"), WorkersValue: trendCount(last(workers)), } } diff --git a/weed/admin/static/css/admin.css b/weed/admin/static/css/admin.css index 35a0071220..9a3a16f7f3 100644 --- a/weed/admin/static/css/admin.css +++ b/weed/admin/static/css/admin.css @@ -1,7 +1,187 @@ -/* SeaweedFS Dashboard Custom Styles */ +/* SeaweedFS Admin styles: a calm console on Bootstrap 5.3. + Chrome is greys with ink actions; color carries meaning (status, data, the current page). */ -:root { +:root, +[data-bs-theme=light] { --navbar-height: 56px; + --sidebar-width: 240px; + + --k-canvas: #f5f5f7; + --k-sheet: #ffffff; + --k-sidebar: #ffffff; + --k-raised: #f2f2f5; + --k-popover: #ffffff; + --k-label: #1d1d1f; + --k-secondary: #6e6e73; + --k-tertiary: rgba(60, 60, 67, .36); + --k-separator: rgba(0, 0, 0, .08); + --k-fill: rgba(120, 120, 128, .12); + --k-ink: #1d1d1f; + --k-on-ink: #ffffff; + --k-indigo: #5552e0; + --k-indigo-rgb: 85, 82, 224; + --k-nav-current: rgba(85, 82, 224, .09); + --k-nav-current-icon: #5552e0; + --k-good-rgb: 36, 138, 61; + --k-warning-rgb: 201, 52, 0; + --k-critical-rgb: 215, 0, 21; + --k-info-rgb: 85, 82, 224; + --k-neutral-rgb: 110, 110, 115; + --k-spectrum: linear-gradient(90deg, #6366f1, #a855f7, #ec4899, #f97316, #eab308); + --k-sheet-shadow: 0 1px 2px rgba(0, 0, 0, .04); + --k-popover-shadow: 0 12px 40px rgba(0, 0, 0, .14), 0 0 0 .5px rgba(0, 0, 0, .08); + --k-sidebar-shadow: 1px 0 0 var(--k-separator), 4px 0 16px rgba(0, 0, 0, .03); + + --bs-body-font-family: Inter, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", system-ui, Roboto, "Helvetica Neue", Arial, sans-serif; + --bs-body-font-size: .875rem; + --bs-body-bg: var(--k-sheet); + --bs-body-bg-rgb: 255, 255, 255; + --bs-body-color: var(--k-label); + --bs-body-color-rgb: 29, 29, 31; + --bs-emphasis-color: var(--k-label); + --bs-emphasis-color-rgb: 29, 29, 31; + --bs-secondary-color: var(--k-secondary); + --bs-secondary-color-rgb: 110, 110, 115; + --bs-tertiary-color: var(--k-tertiary); + --bs-secondary-bg: var(--k-raised); + --bs-tertiary-bg: var(--k-raised); + --bs-tertiary-bg-rgb: 242, 242, 245; + --bs-border-color: var(--k-separator); + --bs-border-color-translucent: var(--k-separator); + --bs-border-radius: .5rem; + --bs-border-radius-sm: .4375rem; + --bs-border-radius-lg: .75rem; + --bs-link-color: var(--k-ink); + --bs-link-color-rgb: 29, 29, 31; + --bs-link-hover-color: var(--k-ink); + --bs-link-hover-color-rgb: 29, 29, 31; + --bs-focus-ring-color: rgba(29, 29, 31, .55); + --bs-heading-color: var(--k-label); + + --bs-primary-rgb: var(--k-indigo-rgb); + --bs-success-rgb: var(--k-good-rgb); + --bs-warning-rgb: var(--k-warning-rgb); + --bs-danger-rgb: var(--k-critical-rgb); + --bs-info-rgb: var(--k-info-rgb); + --bs-secondary-rgb: var(--k-neutral-rgb); + --bs-dark-rgb: 29, 29, 31; + --bs-light-rgb: 242, 242, 245; + + --bs-primary-text-emphasis: rgb(var(--k-info-rgb)); + --bs-success-text-emphasis: rgb(var(--k-good-rgb)); + --bs-warning-text-emphasis: rgb(var(--k-warning-rgb)); + --bs-danger-text-emphasis: rgb(var(--k-critical-rgb)); + --bs-info-text-emphasis: rgb(var(--k-info-rgb)); + --bs-secondary-text-emphasis: var(--k-secondary); + --bs-primary-bg-subtle: rgba(var(--k-info-rgb), .08); + --bs-success-bg-subtle: rgba(var(--k-good-rgb), .08); + --bs-warning-bg-subtle: rgba(var(--k-warning-rgb), .08); + --bs-danger-bg-subtle: rgba(var(--k-critical-rgb), .08); + --bs-info-bg-subtle: rgba(var(--k-info-rgb), .08); + --bs-secondary-bg-subtle: var(--k-raised); + --bs-light-bg-subtle: var(--k-raised); + --bs-primary-border-subtle: rgba(var(--k-info-rgb), .2); + --bs-success-border-subtle: rgba(var(--k-good-rgb), .2); + --bs-warning-border-subtle: rgba(var(--k-warning-rgb), .2); + --bs-danger-border-subtle: rgba(var(--k-critical-rgb), .2); + --bs-info-border-subtle: rgba(var(--k-info-rgb), .2); + --bs-secondary-border-subtle: var(--k-separator); +} + +[data-bs-theme=dark] { + color-scheme: dark; + + --k-canvas: #0e0e10; + --k-sheet: #1c1c1e; + --k-sidebar: #161618; + --k-raised: #2c2c2e; + --k-popover: #2c2c2e; + --k-label: #f5f5f7; + --k-secondary: #98989f; + --k-tertiary: rgba(235, 235, 245, .32); + --k-separator: rgba(255, 255, 255, .08); + --k-fill: rgba(120, 120, 128, .24); + --k-ink: #f5f5f7; + --k-on-ink: #1d1d1f; + --k-indigo: #8f8cff; + --k-indigo-rgb: 143, 140, 255; + --k-nav-current: rgba(143, 140, 255, .13); + --k-nav-current-icon: #8f8cff; + --k-good-rgb: 48, 209, 88; + --k-warning-rgb: 255, 159, 10; + --k-critical-rgb: 255, 69, 58; + --k-info-rgb: 109, 106, 242; + --k-neutral-rgb: 152, 152, 159; + --k-sheet-shadow: none; + --k-popover-shadow: 0 12px 40px rgba(0, 0, 0, .55), 0 0 0 .5px rgba(255, 255, 255, .1); + --k-sidebar-shadow: 1px 0 0 var(--k-separator), 4px 0 16px rgba(0, 0, 0, .25); + + --bs-body-bg-rgb: 28, 28, 30; + --bs-body-color-rgb: 245, 245, 247; + --bs-emphasis-color-rgb: 245, 245, 247; + --bs-secondary-color-rgb: 152, 152, 159; + --bs-tertiary-bg-rgb: 44, 44, 46; + --bs-link-color-rgb: 245, 245, 247; + --bs-link-hover-color-rgb: 245, 245, 247; + --bs-focus-ring-color: rgba(245, 245, 247, .55); + --bs-dark-rgb: 245, 245, 247; + --bs-light-rgb: 44, 44, 46; +} + +/* Base */ +body { + background-color: var(--k-canvas); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + text-underline-offset: .15em; +} + +a:not(.btn):not(.nav-link):not(.dropdown-item):not(.page-link):hover { + text-decoration: underline; +} + +h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { + letter-spacing: -.01em; +} + +.text-muted { + color: var(--k-secondary) !important; +} + +.text-dark, +.text-gray-800 { + color: var(--k-label) !important; +} + +.text-gray-300 { + color: var(--k-tertiary) !important; +} + +.text-xs { + font-size: .75rem; +} + +.font-weight-bold { + font-weight: 600 !important; +} + +.bg-light { + background-color: var(--k-raised) !important; +} + +code { + color: var(--k-label); + background-color: var(--k-fill); + border-radius: .3rem; + padding: .05rem .3rem; +} + +pre code { + background: none; + padding: 0; } /* Icon sizing and animation helpers used by the admin templates. */ @@ -32,72 +212,271 @@ } } -/* Link colors - muted */ -a { - color: #5b7c99; +/* Toolbar */ +.admin-toolbar { + --bs-navbar-color: var(--k-secondary); + --bs-navbar-hover-color: var(--k-label); + --bs-navbar-active-color: var(--k-label); + --bs-navbar-brand-color: var(--k-label); + --bs-navbar-brand-hover-color: var(--k-label); + min-height: var(--navbar-height); + background-color: var(--k-canvas); + border-bottom: 1px solid var(--k-separator); + z-index: 1030; } -a:hover { - color: #4a6a88; +.admin-toolbar .navbar-brand { + display: flex; + align-items: center; + gap: .625rem; + font-size: .9375rem; + font-weight: 600; } -/* Sidebar Styles */ +.brand-mark { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.75rem; + height: 1.75rem; + border-radius: .5rem; + background: var(--k-ink); + color: var(--k-on-ink); + font-size: .875rem; +} + +.admin-toolbar .navbar-toggler { + border: 0; + color: var(--k-secondary); +} + +.admin-toolbar .navbar-toggler:not(:focus-visible) { + box-shadow: none; +} + +.admin-toolbar .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28110, 110, 115, 1%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.admin-toolbar .nav-link { + display: flex; + align-items: center; + border-radius: .5rem; + padding: .375rem .625rem !important; + font-weight: 500; +} + +.admin-toolbar .nav-link:hover { + background-color: var(--k-fill); +} + +.theme-toggle { + background: none; + border: 0; + width: 2rem; + height: 2rem; + border-radius: .5rem; + color: var(--k-secondary); +} + +.theme-toggle:hover { + background-color: var(--k-fill); + color: var(--k-label); +} + +.theme-toggle .theme-icon { + display: none; +} + +[data-theme-choice=auto] .theme-toggle .theme-icon-auto, +[data-theme-choice=light] .theme-toggle .theme-icon-light, +[data-theme-choice=dark] .theme-toggle .theme-icon-dark { + display: inline; +} + +/* Sidebar */ .sidebar { position: fixed; top: var(--navbar-height); bottom: 0; left: 0; z-index: 100; - padding: 48px 0 0; - box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); + width: var(--sidebar-width); + padding: .25rem 0 1.5rem; + background-color: var(--k-sidebar) !important; + box-shadow: var(--k-sidebar-shadow); overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: var(--k-fill) transparent; +} + +.sidebar .position-sticky { + padding-top: 0 !important; } .sidebar-heading { - font-size: .75rem; + margin: 1.125rem 0 .25rem !important; + padding: 0 1.25rem !important; + font-size: .6875rem; + font-weight: 600; + letter-spacing: .04em; text-transform: uppercase; + color: var(--k-secondary) !important; } .sidebar .nav-link { + display: flex; + align-items: center; + margin: 1px .625rem; + padding: .375rem .625rem; + border-radius: .5rem; + font-size: .8125rem; font-weight: 500; - color: #333; + color: var(--k-label); + transition: background-color .12s ease; +} + +.sidebar .nav-link > i:first-child { + font-size: 1rem; + width: 1.25rem; + color: var(--k-secondary); } .sidebar .nav-link:hover { - color: #5b7c99; + background-color: var(--k-fill); + color: var(--k-label); +} + +.sidebar .nav-link:hover > i:first-child { + color: var(--k-label); } .sidebar .nav-link.active { - color: #5b7c99; + background-color: var(--k-nav-current); + color: var(--k-label); } -.sidebar .nav-link:hover .feather, -.sidebar .nav-link.active .feather { - color: inherit; +.sidebar .nav-link.active > i:first-child { + color: var(--k-nav-current-icon); } -/* Main content area */ +.sidebar .nav-link .bi-chevron-down { + font-size: .6875rem; + color: var(--k-tertiary); + transition: transform .2s ease; +} + +.sidebar .nav-link[aria-expanded="true"] .bi-chevron-down { + transform: rotate(180deg); +} + +.sidebar .nav .nav { + margin: 0 0 .25rem 0 !important; + border: 0; +} + +.sidebar .nav .nav .nav-link { + padding-top: .3125rem !important; + padding-bottom: .3125rem !important; + padding-left: 2.5rem; + font-weight: 400; +} + +.sidebar .nav .nav .nav-link > i:first-child { + font-size: .875rem; +} + +/* Layout */ main { - margin-left: 240px; + margin-left: var(--sidebar-width); +} + +@media (min-width: 768px) { + .admin-toolbar { + position: fixed; + top: 0; + left: 0; + right: 0; + padding-left: var(--sidebar-width); + background-color: rgba(245, 245, 247, .9); + } + + [data-bs-theme=dark] .admin-toolbar { + background-color: rgba(14, 14, 16, .9); + } + + .admin-toolbar .navbar-brand { + position: fixed; + top: 0; + left: 0; + width: var(--sidebar-width); + height: var(--navbar-height); + margin: 0; + padding: 0 1.25rem; + background-color: var(--k-sidebar); + box-shadow: var(--k-sidebar-shadow); + z-index: 101; + } + + .sidebar { + z-index: 1031; + } + + .row > main[class*="col-"] { + flex: 0 0 auto; + width: calc(100% - var(--sidebar-width)); + margin-left: var(--sidebar-width) !important; + padding-top: var(--navbar-height); + } + + .footer { + margin-left: var(--sidebar-width); + } } @media (max-width: 767.98px) { .sidebar { - top: var(--navbar-height); - padding-top: 0; - width: 240px; - background-color: #f8f9fa !important; z-index: 1050; } + .sidebar.show ~ .sidebar-backdrop { display: block; } + main { margin-left: 0; } } -/* Sidebar backdrop for mobile overlay */ +main > .pt-3 { + padding-top: 1.5rem !important; + padding-bottom: 2rem; + max-width: 1600px; +} + +/* Page header: title on the left, actions on the right */ +main .border-bottom:has(h1) { + border-bottom: 0 !important; + padding-top: 0 !important; + margin-bottom: 1.25rem !important; +} + +main h1.h2, +main h1.h3, +main h2.h3, +main h2:has(> .bi:first-child) { + font-size: 1.5rem; + font-weight: 650; + letter-spacing: -.02em; + margin-bottom: 0; +} + +main h1 > i:first-child, +main h2:has(> .bi:first-child) > .bi:first-child { + font-size: .8em; + color: var(--k-secondary); +} + .sidebar-backdrop { display: none; position: fixed; @@ -105,183 +484,491 @@ main { left: 0; right: 0; bottom: 0; - background-color: rgba(0, 0, 0, 0.5); + background-color: rgba(0, 0, 0, .3); z-index: 1040; } -/* Custom card styles */ -.border-left-primary { - border-left: 0.25rem solid #6b8caf !important; +.footer { + background: transparent !important; + font-size: .75rem; } -.border-left-success { - border-left: 0.25rem solid #5a8a72 !important; +.footer a { + color: var(--k-secondary); } -.border-left-info { - border-left: 0.25rem solid #6a9aaa !important; -} - -.border-left-warning { - border-left: 0.25rem solid #b8995e !important; -} - -.border-left-danger { - border-left: 0.25rem solid #a5615c !important; -} - -/* Status badges */ -.badge { - font-size: 0.875em; -} - -/* Muted badge colors - override Bootstrap defaults */ -.badge.bg-primary, -.bg-primary { - background-color: #6b8caf !important; -} - -.badge.bg-success, -.bg-success { - background-color: #5a8a72 !important; -} - -.badge.bg-info, -.bg-info { - background-color: #6a9aaa !important; -} - -.badge.bg-warning, -.bg-warning { - background-color: #b8995e !important; -} - -.badge.bg-danger, -.bg-danger { - background-color: #a5615c !important; -} - -.badge.bg-secondary, -.bg-secondary { - background-color: #7a7d85 !important; -} - -/* Muted card background colors for text-bg-* utility classes */ -.text-bg-primary, -.card.text-bg-primary { - background-color: #6b8caf !important; - color: #fff !important; -} - -.text-bg-success, -.card.text-bg-success { - background-color: #5a8a72 !important; - color: #fff !important; -} - -.text-bg-info, -.card.text-bg-info { - background-color: #6a9aaa !important; - color: #fff !important; -} - -.text-bg-warning, -.card.text-bg-warning { - background-color: #b8995e !important; - color: #fff !important; -} - -.text-bg-danger, -.card.text-bg-danger { - background-color: #a5615c !important; - color: #fff !important; -} - -/* Muted text color utilities */ -.text-primary { - color: #6b8caf !important; -} - -.text-success { - color: #5a8a72 !important; -} - -.text-info { - color: #6a9aaa !important; -} - -.text-warning { - color: #b8995e !important; -} - -.text-danger { - color: #a5615c !important; -} - -/* Progress bars */ -.progress { - background-color: #f8f9fc; - border: 1px solid #e3e6f0; -} - -.progress-bar { - font-size: 0.75rem; - font-weight: 700; - color: #fff; - text-align: center; -} - -/* Tables */ -.table { - color: #5a5c69; -} - -.table thead th { - vertical-align: bottom; - border-bottom: 1px solid #e3e6f0; - font-weight: 700; - color: #5a5c69; - background-color: #f8f9fc; -} - -.table-bordered { - border: 1px solid #e3e6f0; -} - -.table-bordered th, -.table-bordered td { - border: 1px solid #e3e6f0; -} - -/* Cards */ +/* Sheets */ .card { - box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important; - border: 1px solid #e3e6f0; + --bs-card-bg: var(--k-sheet); + --bs-card-border-color: var(--k-separator); + --bs-card-border-radius: .75rem; + --bs-card-inner-border-radius: calc(.75rem - 1px); + --bs-card-cap-bg: transparent; + --bs-card-cap-padding-y: .75rem; + --bs-card-cap-padding-x: 1.25rem; + box-shadow: var(--k-sheet-shadow) !important; +} + +.shadow, +.shadow-sm { + box-shadow: var(--k-sheet-shadow) !important; } .card-header { - background-color: #f8f9fc; - border-bottom: 1px solid #e3e6f0; + border-bottom: 1px solid var(--k-separator); } -/* Buttons */ -.btn-primary { - background-color: #6b8caf; - border-color: #6b8caf; +.card-header h5, +.card-header h6, +.card-header .h5, +.card-header .h6 { + font-size: .9375rem; + font-weight: 600 !important; + color: var(--k-label) !important; } -.btn-primary:hover { - background-color: #5b7c99; - border-color: #5b7c99; +.card-header .text-primary { + color: var(--k-label) !important; } -/* Text utilities */ -.text-gray-800 { - color: #5a5c69 !important; +.card-header .bi { + color: var(--k-secondary); } -.text-gray-300 { - color: #dddfeb !important; +/* Stat tiles: a quiet label over a large value */ +.card[class*="border-left-"], +.card.border-primary, +.card.border-secondary, +.card.border-success, +.card.border-info, +.card.border-warning, +.card.border-danger, +.card.text-bg-primary, +.card.text-bg-success, +.card.text-bg-info, +.card.text-bg-warning, +.card.text-bg-danger { + border: 1px solid var(--k-separator) !important; + background-color: var(--k-sheet) !important; + color: var(--k-label) !important; + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.card[class*="border-left-"] .text-uppercase, +.card[class*="border-"] > .card-body > .text-uppercase, +.card[class*="text-bg-"] .card-title { + font-size: .8125rem; + font-weight: 500 !important; + text-transform: none !important; + letter-spacing: 0; + color: var(--k-secondary) !important; +} + +.card[class*="border-left-"] .h5, +.card[class*="border-"] > .card-body > h4, +.card[class*="text-bg-"] h4, +.card[class*="text-bg-"] h3 { + font-family: ui-rounded, "SF Pro Rounded", var(--bs-body-font-family); + font-size: 1.375rem; + overflow-wrap: anywhere; + font-weight: 600 !important; + letter-spacing: -.02em; + font-variant-numeric: tabular-nums; + color: var(--k-label) !important; +} + +.card[class*="border-left-"] .icon-2x, +.card[class*="text-bg-"] .icon-2x { + font-size: 1.25rem; + color: var(--k-tertiary) !important; +} + +.card[class*="text-bg-"] .text-white, +.card[class*="text-bg-"] small { + color: var(--k-secondary) !important; +} + +.health-dot { + font-size: .5rem; + vertical-align: middle; +} + +.cluster-count { + padding: .5rem .25rem; + border-radius: 8px; + color: var(--k-label); + text-decoration: none; +} + +.cluster-count .h5 { + font-variant-numeric: tabular-nums; + font-weight: 600; +} + +a.cluster-count:hover { + background-color: var(--k-raised); + color: var(--k-label); +} + +/* Tables: dense rows, hairlines, tabular numbers */ +.table { + --bs-table-bg: transparent; + --bs-table-color: var(--k-label); + --bs-table-border-color: var(--k-separator); + --bs-table-striped-bg: rgba(120, 120, 128, .04); + --bs-table-hover-bg: var(--k-raised); + --bs-table-hover-color: var(--k-label); + font-size: .8125rem; + font-variant-numeric: tabular-nums; + margin-bottom: 0; +} + +.table > :not(caption) > * > * { + padding: .625rem .75rem; + vertical-align: middle; +} + +.table thead th, +.table > thead > tr > th { + font-size: .75rem; + font-weight: 500; + color: var(--k-secondary); + background-color: transparent; + border-bottom: 1px solid var(--k-separator); + white-space: nowrap; +} + +.table-light, +.table-dark { + --bs-table-bg: transparent; + --bs-table-color: var(--k-secondary); + --bs-table-border-color: var(--k-separator); +} + +.table-bordered > :not(caption) > * > * { + border-width: 0 0 1px; +} + +.table-bordered > :not(caption) > * { + border-width: 0; +} + +.table > tbody > tr:last-child > * { + border-bottom: 0; +} + +/* Buttons: ink for the primary action, quiet outlines for the rest */ +.btn { + --bs-btn-font-weight: 500; + --bs-btn-border-radius: .5rem; + --bs-btn-focus-box-shadow: 0 0 0 2px var(--bs-focus-ring-color); +} + +.btn-sm, +.btn-group-sm > .btn { + --bs-btn-border-radius: .4375rem; + --bs-btn-padding-y: .2rem; + --bs-btn-padding-x: .55rem; + --bs-btn-font-size: .8125rem; +} + +.btn-primary, +.btn-dark { + --bs-btn-color: var(--k-on-ink); + --bs-btn-bg: var(--k-ink); + --bs-btn-border-color: var(--k-ink); + --bs-btn-hover-color: var(--k-on-ink); + --bs-btn-hover-bg: color-mix(in srgb, var(--k-ink) 85%, var(--k-canvas)); + --bs-btn-hover-border-color: color-mix(in srgb, var(--k-ink) 85%, var(--k-canvas)); + --bs-btn-active-color: var(--k-on-ink); + --bs-btn-active-bg: color-mix(in srgb, var(--k-ink) 75%, var(--k-canvas)); + --bs-btn-active-border-color: color-mix(in srgb, var(--k-ink) 75%, var(--k-canvas)); + --bs-btn-disabled-color: var(--k-on-ink); + --bs-btn-disabled-bg: var(--k-ink); + --bs-btn-disabled-border-color: var(--k-ink); +} + +.btn-outline-primary, +.btn-outline-secondary, +.btn-outline-dark, +.btn-outline-info, +.btn-secondary, +.btn-light { + --bs-btn-color: var(--k-label); + --bs-btn-bg: var(--k-sheet); + --bs-btn-border-color: var(--k-separator); + --bs-btn-hover-color: var(--k-label); + --bs-btn-hover-bg: var(--k-raised); + --bs-btn-hover-border-color: var(--k-separator); + --bs-btn-active-color: var(--k-label); + --bs-btn-active-bg: var(--k-fill); + --bs-btn-active-border-color: var(--k-separator); + --bs-btn-disabled-color: var(--k-tertiary); + --bs-btn-disabled-bg: var(--k-sheet); + --bs-btn-disabled-border-color: var(--k-separator); + box-shadow: 0 1px 1px rgba(0, 0, 0, .03); +} + +.btn-check:checked + .btn-outline-primary, +.btn-check:checked + .btn-outline-secondary, +.btn-outline-primary.active, +.btn-outline-secondary.active { + background-color: var(--k-ink); + border-color: var(--k-ink); + color: var(--k-on-ink); +} + +.btn-danger { + --bs-btn-color: var(--k-on-ink); + --bs-btn-hover-color: var(--k-on-ink); + --bs-btn-active-color: var(--k-on-ink); + --bs-btn-bg: rgb(var(--k-critical-rgb)); + --bs-btn-border-color: rgb(var(--k-critical-rgb)); + --bs-btn-hover-bg: color-mix(in srgb, rgb(var(--k-critical-rgb)) 88%, var(--k-ink)); + --bs-btn-hover-border-color: color-mix(in srgb, rgb(var(--k-critical-rgb)) 88%, var(--k-ink)); + --bs-btn-active-bg: color-mix(in srgb, rgb(var(--k-critical-rgb)) 80%, var(--k-ink)); + --bs-btn-active-border-color: color-mix(in srgb, rgb(var(--k-critical-rgb)) 80%, var(--k-ink)); +} + +.btn-outline-danger { + --bs-btn-color: rgb(var(--k-critical-rgb)); + --bs-btn-bg: var(--k-sheet); + --bs-btn-border-color: var(--k-separator); + --bs-btn-hover-color: var(--k-on-ink); + --bs-btn-hover-bg: rgb(var(--k-critical-rgb)); + --bs-btn-hover-border-color: rgb(var(--k-critical-rgb)); + --bs-btn-active-color: var(--k-on-ink); + --bs-btn-active-bg: rgb(var(--k-critical-rgb)); + --bs-btn-active-border-color: rgb(var(--k-critical-rgb)); +} + +.btn-success { + --bs-btn-color: var(--k-on-ink); + --bs-btn-hover-color: var(--k-on-ink); + --bs-btn-active-color: var(--k-on-ink); + --bs-btn-bg: rgb(var(--k-good-rgb)); + --bs-btn-border-color: rgb(var(--k-good-rgb)); + --bs-btn-hover-bg: color-mix(in srgb, rgb(var(--k-good-rgb)) 88%, var(--k-ink)); + --bs-btn-hover-border-color: color-mix(in srgb, rgb(var(--k-good-rgb)) 88%, var(--k-ink)); +} + +.btn-outline-success, +.btn-outline-warning { + --bs-btn-bg: var(--k-sheet); + --bs-btn-border-color: var(--k-separator); +} + +.btn-close { + --bs-btn-close-focus-shadow: 0 0 0 2px var(--bs-focus-ring-color); +} + +[data-bs-theme=dark] .btn-close { + filter: invert(1) grayscale(100%) brightness(200%); +} + +/* Status pills: a 12% tint with full-strength text */ +.badge { + font-size: .75rem; + font-weight: 500; + padding: .25em .6em; + border-radius: 999px; + font-variant-numeric: tabular-nums; +} + +.badge.bg-primary, +.badge.bg-info, +.badge.text-bg-primary, +.badge.text-bg-info { + background-color: rgba(var(--k-info-rgb), .12) !important; + color: rgb(var(--k-info-rgb)) !important; +} + +.badge.bg-success, +.badge.text-bg-success { + background-color: rgba(var(--k-good-rgb), .12) !important; + color: rgb(var(--k-good-rgb)) !important; +} + +.badge.bg-warning, +.badge.text-bg-warning { + background-color: rgba(var(--k-warning-rgb), .12) !important; + color: rgb(var(--k-warning-rgb)) !important; +} + +.badge.bg-danger, +.badge.text-bg-danger { + background-color: rgba(var(--k-critical-rgb), .12) !important; + color: rgb(var(--k-critical-rgb)) !important; +} + +.badge.bg-secondary, +.badge.bg-light, +.badge.bg-dark, +.badge.text-bg-secondary, +.badge.text-bg-light, +.badge.text-bg-dark { + background-color: var(--k-fill) !important; + color: var(--k-label) !important; +} + +/* Meters: the spectrum below the warning threshold, status colors above it */ +.progress { + --bs-progress-bg: var(--k-fill); + --bs-progress-border-radius: 999px; + --bs-progress-bar-bg: rgb(var(--k-info-rgb)); + border: 0; +} + +.progress-bar { + font-size: .6875rem; + font-weight: 600; +} + +.progress-bar:not([class*="bg-"]), +.progress-bar.bg-primary, +.progress-bar.bg-info { + background: var(--k-spectrum) !important; +} + +/* Forms */ +.form-control, +.form-select { + background-color: var(--k-sheet); + border-color: var(--k-separator); + border-radius: .5rem; +} + +.form-control:focus, +.form-select:focus, +.form-check-input:focus { + border-color: var(--k-separator); + box-shadow: 0 0 0 2px var(--bs-focus-ring-color); +} + +.form-control::placeholder { + color: var(--k-tertiary); +} + +.form-label { + font-size: .8125rem; + font-weight: 500; +} + +.form-check-input:checked { + background-color: var(--k-ink); + border-color: var(--k-ink); +} + +[data-bs-theme=dark] .form-check-input:checked[type=checkbox] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%231d1d1f' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} + +[data-bs-theme=dark] .form-check-input:checked[type=radio] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%231d1d1f'/%3e%3c/svg%3e"); +} + +[data-bs-theme=dark] .form-switch .form-check-input:checked { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%231d1d1f'/%3e%3c/svg%3e"); +} + +.input-group-text { + background-color: var(--k-raised); + border-color: var(--k-separator); + color: var(--k-secondary); +} + +/* Overlays */ +.dropdown-menu { + --bs-dropdown-bg: var(--k-popover); + --bs-dropdown-border-color: transparent; + --bs-dropdown-border-radius: .625rem; + --bs-dropdown-link-hover-bg: var(--k-fill); + --bs-dropdown-link-active-bg: var(--k-ink); + --bs-dropdown-link-active-color: var(--k-on-ink); + --bs-dropdown-font-size: .8125rem; + padding: .3125rem; + box-shadow: var(--k-popover-shadow); +} + +.dropdown-item { + border-radius: .375rem; +} + +.modal-content { + --bs-modal-bg: var(--k-popover); + --bs-modal-border-color: transparent; + --bs-modal-border-radius: .875rem; + --bs-modal-header-border-color: var(--k-separator); + --bs-modal-footer-border-color: var(--k-separator); + box-shadow: var(--k-popover-shadow); +} + +.modal-backdrop { + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: .3; +} + +[data-bs-theme=dark] .modal-backdrop { + --bs-backdrop-opacity: .5; +} + +.toast { + --bs-toast-bg: var(--k-popover); + --bs-toast-border-color: transparent; + box-shadow: var(--k-popover-shadow); +} + +.alert { + --bs-alert-border-radius: .625rem; + font-size: .8125rem; +} + +.list-group { + --bs-list-group-bg: var(--k-sheet); + --bs-list-group-border-color: var(--k-separator); + --bs-list-group-action-hover-bg: var(--k-raised); + --bs-list-group-active-bg: var(--k-ink); + --bs-list-group-active-border-color: var(--k-ink); + --bs-list-group-active-color: var(--k-on-ink); +} + +.nav-tabs { + --bs-nav-tabs-border-color: var(--k-separator); + --bs-nav-tabs-link-active-bg: transparent; + --bs-nav-tabs-link-active-border-color: transparent transparent var(--k-ink); + --bs-nav-tabs-link-hover-border-color: transparent; +} + +.nav-tabs .nav-link { + border-width: 0 0 2px; + color: var(--k-secondary); + font-weight: 500; +} + +.nav-tabs .nav-link.active { + color: var(--k-label); +} + +.nav-pills { + --bs-nav-pills-link-active-bg: var(--k-ink); + --bs-nav-pills-link-active-color: var(--k-on-ink); +} + +.pagination { + --bs-pagination-color: var(--k-label); + --bs-pagination-bg: var(--k-sheet); + --bs-pagination-border-color: var(--k-separator); + --bs-pagination-hover-color: var(--k-label); + --bs-pagination-hover-bg: var(--k-raised); + --bs-pagination-hover-border-color: var(--k-separator); + --bs-pagination-focus-box-shadow: 0 0 0 2px var(--bs-focus-ring-color); + --bs-pagination-active-bg: var(--k-ink); + --bs-pagination-active-border-color: var(--k-ink); + --bs-pagination-active-color: var(--k-on-ink); + --bs-pagination-disabled-bg: var(--k-sheet); + --bs-pagination-disabled-border-color: var(--k-separator); + --bs-pagination-font-size: .8125rem; } /* Animation for HTMX updates */ @@ -298,69 +985,40 @@ main { opacity: 1; } -/* Loading spinner */ .spinner-border-sm { width: 1rem; height: 1rem; } -/* Custom utilities */ -.bg-gradient-primary { - background: linear-gradient(180deg, #6b8caf 10%, #5b7c99 100%); +/* Sign-in: the one place for atmosphere */ +.login-page { + min-height: 100vh; + background: + radial-gradient(60rem 30rem at 15% -10%, rgba(99, 102, 241, .14), transparent 60%), + radial-gradient(50rem 30rem at 110% 110%, rgba(236, 72, 153, .10), transparent 60%), + var(--k-canvas); } -.shadow { - box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important; +.login-page .card { + border-radius: 1rem; + box-shadow: var(--k-popover-shadow) !important; } -/* Navbar user icon color */ -.navbar-toggler .bi-person { - color: rgba(255, 255, 255, 0.75); +.login-page .brand-mark { + width: 3rem; + height: 3rem; + border-radius: .875rem; + font-size: 1.375rem; } -/* Collapsible menu styles */ -.nav-link[data-bs-toggle="collapse"] { - position: relative; +.login-page .login-spectrum { + height: 3px; + border-radius: 999px; + background: var(--k-spectrum); } -.nav-link[data-bs-toggle="collapse"] .bi-chevron-down { - transition: transform 0.2s ease; -} - -.nav-link[data-bs-toggle="collapse"][aria-expanded="true"] .bi-chevron-down { - transform: rotate(180deg); -} - -.nav-link[data-bs-toggle="collapse"]:not(.collapsed) { - color: #5b7c99; -} - -.nav-link[data-bs-toggle="collapse"]:not(.collapsed) .bi-chevron-down { - color: #5b7c99; -} - -/* Submenu styles */ -.nav .nav { - border-left: 1px solid #e3e6f0; - margin-left: 0.5rem; -} - -.nav .nav .nav-link { - font-size: 0.875rem; - padding-left: 1rem; -} - -.nav .nav .nav-link:hover { - background-color: #f8f9fc; -} - -/* Responsive adjustments */ @media (max-width: 576px) { .card-body { padding: 1rem; } - - .h5 { - font-size: 1rem; - } } diff --git a/weed/admin/static/js/admin.js b/weed/admin/static/js/admin.js index ebabb25a32..5ecb422e48 100644 --- a/weed/admin/static/js/admin.js +++ b/weed/admin/static/js/admin.js @@ -573,52 +573,6 @@ function refreshBuckets() { location.reload(); } -// Export bucket list -function exportBucketList() { - // Get table data - const table = document.getElementById('bucketsTable'); - if (!table) return; - - const rows = Array.from(table.querySelectorAll('tbody tr')); - const data = rows.map(row => { - const cells = row.querySelectorAll('td'); - if (cells.length < 5) return null; // Skip empty state row - - return { - name: cells[0].textContent.trim(), - owner: cells[1].textContent.trim(), - created: cells[2].textContent.trim(), - logicalSize: cells[3].textContent.trim(), - physicalSize: cells[4].textContent.trim(), - quota: cells[5].textContent.trim() - }; - }).filter(item => item !== null); - - // Convert to CSV - const csv = [ - ['Name', 'Owner', 'Created', 'Logical Size', 'Physical Size', 'Quota'].join(','), - ...data.map(row => [ - row.name, - row.owner, - row.created, - row.logicalSize, - row.physicalSize, - row.quota - ].join(',')) - ].join('\n'); - - // Download CSV - const blob = new Blob([csv], { type: 'text/csv' }); - const url = window.URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = `seaweedfs-buckets-${new Date().toISOString().split('T')[0]}.csv`; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - window.URL.revokeObjectURL(url); -} - // showAlert is provided by modal-alerts.js with signature: showAlert(message, type) // Format date for display @@ -871,19 +825,18 @@ function exportUsers() { return; } - let csvContent = 'Username,Email,Access Key,Status,Created,Last Login\n'; + let csvContent = 'Username,Email,Access Key\n'; rows.forEach(row => { const cells = row.querySelectorAll('td'); - if (cells.length >= 6) { - const username = cells[0].textContent.trim(); + if (cells.length >= 3) { + const username = (cells[0].querySelector('strong') || cells[0]).textContent.trim(); const email = cells[1].textContent.trim(); const accessKey = cells[2].textContent.trim(); - const status = cells[3].textContent.trim(); - const created = cells[4].textContent.trim(); - const lastLogin = cells[5].textContent.trim(); - csvContent += `"${username}","${email}","${accessKey}","${status}","${created}","${lastLogin}"\n`; + csvContent += [username, email, accessKey] + .map(value => `"${value.replace(/"/g, '""')}"`) + .join(',') + '\n'; } }); diff --git a/weed/admin/static/js/theme.js b/weed/admin/static/js/theme.js new file mode 100644 index 0000000000..79b5ce21f7 --- /dev/null +++ b/weed/admin/static/js/theme.js @@ -0,0 +1,43 @@ +// Applies the saved color theme (auto, light or dark) before the page paints. +(function () { + var storageKey = 'admin-theme'; + var choices = ['auto', 'light', 'dark']; + var media = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null; + var root = document.documentElement; + + function savedChoice() { + try { + var value = localStorage.getItem(storageKey); + return choices.indexOf(value) >= 0 ? value : 'auto'; + } catch (e) { + return 'auto'; + } + } + + function apply(choice) { + var dark = choice === 'dark' || (choice === 'auto' && media && media.matches); + root.setAttribute('data-bs-theme', dark ? 'dark' : 'light'); + root.setAttribute('data-theme-choice', choice); + } + + var current = savedChoice(); + apply(current); + + if (media && media.addEventListener) { + media.addEventListener('change', function () { + apply(current); + }); + } + + document.addEventListener('click', function (event) { + var toggle = event.target.closest && event.target.closest('[data-theme-toggle]'); + if (!toggle) { + return; + } + current = choices[(choices.indexOf(current) + 1) % choices.length]; + try { + localStorage.setItem(storageKey, current); + } catch (e) {} + apply(current); + }); +})(); diff --git a/weed/admin/static_gz/css/admin.css.gz b/weed/admin/static_gz/css/admin.css.gz index 6f9cf739fba5b687d72d13fcbe84b5bb187fd9f4..3fb31cb0fd71030288342a195a36261092a10914 100644 GIT binary patch literal 5538 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 literal 1719 zcmV;o21xlIiwFP!00002|EySVZ{xVpf1gh=&mIm)0!xvTmF;M8z&+QZXo0(;XzoRU zLtl)Se)u-;2p`8h^`05P*GZ&vBlciJ|0;n28thFXOr0z=s-^J-Vdw%XVfXPV zMk%TR6+-P^S+QDbZV%jf%=tyu3B01ZJ)(-+aw?6HRRWQHEGakr!yM!N)-k$Y1k zV_XyoeB9JKi2TA-?gG6U07JqtrIw3ympn(Uc5+P=W zztXpeI3;0DXttylXHfl`F+3MrQrvjT{DNFSCWRqk02N`&nhJYzSEvdu0_*k1kCDqA zKUTyz!fl1Sz=isHwGN**_3q9|9#QWKrVaQLbW5Ydd#A+hz`so~`&=m52o`wj<(vFD zNBBQp)lwN0=CFFe);RLO!FnW*o(eFV>L7(0o*`uu~%lBwD=%;obM{N|wcax0pG4dpH z6)J11l|JOAR4PWQvrtegUZL8%0}j3<5QUFzOoNssXYk!B-DH@L9Nb3A5KK2&Mp|D1 z7UKrjk7vQS$mKQL!e>N0i}Z#{9Fo>KuyphM9Mf4ahN9?W`y3X=t7V)WW3?nSXc`SE zvcfy0{W;C4(V!5wDWj`ac5Pq6TGlGg2!4{%Xrr(OMmaX689;|=;T^rW89ew?Or!af zvpt&gv_(5|`xNbzw>?_xY6~@V`pm9Q_}b$*M_Z^PuTRlVIoqRIPg}6D*QZ$X&K}r{ zGAUSZ|Nikb;u_a%6VK4c(x8j!gP12oo6oxPn-;-6G=`Vl>>(>rYsWSJ^}vS~>iG3H zF=JRn^L)x0k9{D`NacIzbFE6ptdYKN=Ge8$4)h!8dk+z>RoQcNr12eWy`Zq?U8}+_ zbnN0oUX9svA(?a%W9MH;7@fqxeHZdVw|s2<3$foxjI4J)z#s16Z%P)bJwb}fTB7!E zPTIe_D`lSsB_x6NTJ9=PN10Gb}y2z03@c8Tk9n%xNzl!EfM#Rr~z~Rw=PjwLWR; zBN?+@Oy6Ax)n2_&F>A^$Q~y5c#v+KqWp`g#S||FJEZ!_2eqO-pdC@Joo5bmbbF>P( zM(tb*m{RbZZ|s?VYK)P>-7Ac^wpNUk9DnMniLH^pcchG23-F(WG#`ZX_^E0w2N>UJ}Jg7-&DaJhNR6WM=0uKM$w0_sy zN|q(onzsqJBGC*xIX`;%jiJFH)lSDBnZq2d_Ou13L#{qVu4=91RYpwBYk?rMFBkmfe@&+P8Z80bA{ zC-yy`re2zK#;4s(X|BaQQ8vdTk1+O;cEFmQwGFz=K3e@8$mu(SbSYI2%JIWJ{GD_y zh32mW$o|!6Q<1PO>dZ(hUato8tgfD=lI;gWo_^eU$TM~rWJR{|VC~?n!_{AJ{u=-Q N|Nj_MOe)wH0012{Y{UQn diff --git a/weed/admin/static_gz/js/admin.js.gz b/weed/admin/static_gz/js/admin.js.gz index 328f9f92f0eb098f9ff0a3f42d13b7e784a8775e..4e0b72368abb5fad1dbfeeca615ea460e6a18a25 100644 GIT binary patch delta 15671 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 diff --git a/weed/admin/static_gz/js/theme.js.gz b/weed/admin/static_gz/js/theme.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..4b18d0dc2586d2cc7a27e6f5b972f7c8b333cf40 GIT binary patch literal 558 zcmV+}0@3{+iwFP!00002|BO>TZ`&{s-TffQu`7le&WH@U1i*p@wlv znm<{XswMu;v=#@U%Ei%5PuzJsh*W9Y(BI!nk-$oPt??N*J@gz|zXQMyDvAL?C0;MV zo?V#a_c2eo*_aoRTNndHR#8gSeSfIyy7vrkZxG{Xs)Vbn-ooLK?V>QE9bKpb@h!90 zj~$aJ8p(3@82Z_n=BhVCsrfK4{{fN^X1TFq+V@>9#=O%|cHWa^)W;_0yk3u-Qub4! zmk=k^WYgSj$?{Jfm@N6Rc9%0mp;pqiv9t4q8lKbgd-INI?5Frb5u?@9Q4NX-r{1z_ zTSKUk{;gR0mbg;J1qvK#UW$w2ek62;co;hqh5C@=m#6Y{9OHBFqu+#kak>(NAozqY wB|h#~#*l4!^{{wnJ&#s0oUP;(7sMW~)^75iH_?|}8HeZJ03z(?z;y)x080=T;s5{u literal 0 HcmV?d00001 diff --git a/weed/admin/view/app/admin.templ b/weed/admin/view/app/admin.templ index d2c2a3db33..7062d69981 100644 --- a/weed/admin/view/app/admin.templ +++ b/weed/admin/view/app/admin.templ @@ -7,16 +7,18 @@ import ( templ Admin(data dash.AdminData) {
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -89,7 +89,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templruntime.NewAttributeExpression(templ.SafeURL(fmt.Sprintf("//%s", master.Address))).ResolveURL(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 113, Col: 71} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 108, Col: 71} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var4) if templ_7745c5c3_Err != nil { @@ -102,7 +102,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, 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: 114, Col: 28} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 109, Col: 28} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -135,7 +135,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, 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: 132, Col: 30} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 127, Col: 30} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -158,7 +158,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templruntime.NewAttributeExpression(master.Address).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 143, Col: 41} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 138, Col: 41} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7) if templ_7745c5c3_Err != nil { @@ -171,7 +171,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%t", master.IsLeader)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 144, Col: 60} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 139, Col: 60} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8) if templ_7745c5c3_Err != nil { @@ -184,7 +184,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templruntime.NewAttributeExpression(master.Suffrage).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 145, Col: 43} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 140, Col: 43} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9) if templ_7745c5c3_Err != nil { @@ -212,7 +212,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 169, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_masters.templ`, Line: 164, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/cluster_s3_servers.templ b/weed/admin/view/app/cluster_s3_servers.templ index 066629e725..3190a4a017 100644 --- a/weed/admin/view/app/cluster_s3_servers.templ +++ b/weed/admin/view/app/cluster_s3_servers.templ @@ -45,11 +45,6 @@ templ ClusterS3Servers(data dash.ClusterS3ServersData) {
-
-
- S3 Servers -
-
if len(data.S3Servers) > 0 {
diff --git a/weed/admin/view/app/cluster_s3_servers_templ.go b/weed/admin/view/app/cluster_s3_servers_templ.go index abf8699522..cde93497b6 100644 --- a/weed/admin/view/app/cluster_s3_servers_templ.go +++ b/weed/admin/view/app/cluster_s3_servers_templ.go @@ -44,7 +44,7 @@ func ClusterS3Servers(data dash.ClusterS3ServersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
S3 Servers
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -61,7 +61,7 @@ func ClusterS3Servers(data dash.ClusterS3ServersData) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(s3Server.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 69, Col: 29} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 64, Col: 29} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -74,7 +74,7 @@ func ClusterS3Servers(data dash.ClusterS3ServersData) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(s3Server.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 72, Col: 68} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 67, Col: 68} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -87,7 +87,7 @@ func ClusterS3Servers(data dash.ClusterS3ServersData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(s3Server.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 75, Col: 71} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 70, Col: 71} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -101,7 +101,7 @@ func ClusterS3Servers(data dash.ClusterS3ServersData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(s3Server.CreatedAt.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 79, Col: 62} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 74, Col: 62} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -135,7 +135,7 @@ func ClusterS3Servers(data dash.ClusterS3ServersData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 104, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_s3_servers.templ`, Line: 99, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/cluster_volume_servers.templ b/weed/admin/view/app/cluster_volume_servers.templ index 5b4f61997c..2ef1f08f35 100644 --- a/weed/admin/view/app/cluster_volume_servers.templ +++ b/weed/admin/view/app/cluster_volume_servers.templ @@ -87,11 +87,6 @@ templ ClusterVolumeServers(data dash.ClusterVolumeServersData) {
-
-
- Volume Servers -
-
if len(data.VolumeServers) > 0 {
diff --git a/weed/admin/view/app/cluster_volume_servers_templ.go b/weed/admin/view/app/cluster_volume_servers_templ.go index 029c82a504..4a0d52cc4e 100644 --- a/weed/admin/view/app/cluster_volume_servers_templ.go +++ b/weed/admin/view/app/cluster_volume_servers_templ.go @@ -70,7 +70,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
Volume Servers
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -92,7 +92,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templruntime.NewAttributeExpression(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", host.PublicURL))).ResolveURL(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 118, Col: 121} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 113, Col: 121} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var5) if templ_7745c5c3_Err != nil { @@ -105,7 +105,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(host.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 119, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 114, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -123,7 +123,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templruntime.NewAttributeExpression(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", host.Address))).ResolveURL(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 123, Col: 119} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 118, Col: 119} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7) if templ_7745c5c3_Err != nil { @@ -136,7 +136,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(host.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 124, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 119, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -154,7 +154,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(host.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 130, Col: 99} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 125, Col: 99} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { @@ -167,7 +167,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(host.Rack) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 133, Col: 93} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 128, Col: 93} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { @@ -180,7 +180,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var11 string templ_7745c5c3_Var11, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.Version).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 135, Col: 63} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 130, Col: 63} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11) if templ_7745c5c3_Err != nil { @@ -193,7 +193,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var12 string templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(dash.ShortVersion(host.Version)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 136, Col: 76} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 131, Col: 76} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) if templ_7745c5c3_Err != nil { @@ -206,7 +206,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var13 string templ_7745c5c3_Var13, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %d%%", calculatePercent(host.Volumes, host.MaxVolumes))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 142, Col: 139} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 137, Col: 139} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) if templ_7745c5c3_Err != nil { @@ -219,7 +219,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var14 string templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", host.Volumes)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 145, Col: 111} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 140, Col: 111} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) if templ_7745c5c3_Err != nil { @@ -232,7 +232,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", host.MaxVolumes)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 149, Col: 112} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 144, Col: 112} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { @@ -250,7 +250,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", host.EcShards)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 155, Col: 129} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 150, Col: 129} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { @@ -268,7 +268,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var17 string templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d EC volumes", host.EcVolumes)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 160, Col: 127} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 155, Col: 127} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) if templ_7745c5c3_Err != nil { @@ -292,7 +292,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var18 string templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(host.DiskCapacity)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 167, Col: 75} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 162, Col: 75} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) if templ_7745c5c3_Err != nil { @@ -305,7 +305,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var19 string templ_7745c5c3_Var19, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(fmt.Sprintf("width: %d%%", calculatePercent64(host.DiskUsage, host.DiskCapacity))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 172, Col: 145} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 167, Col: 145} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) if templ_7745c5c3_Err != nil { @@ -318,7 +318,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var20 string templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(host.DiskUsage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 175, Col: 83} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 170, Col: 83} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) if templ_7745c5c3_Err != nil { @@ -336,7 +336,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var21 string templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(host.RemoteSize)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 179, Col: 139} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 174, Col: 139} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21)) if templ_7745c5c3_Err != nil { @@ -359,7 +359,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var22 string templ_7745c5c3_Var22, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.ID).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 189, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 184, Col: 72} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22) if templ_7745c5c3_Err != nil { @@ -372,7 +372,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var23 string templ_7745c5c3_Var23, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.Address).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 190, Col: 82} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 185, Col: 82} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var23) if templ_7745c5c3_Err != nil { @@ -385,7 +385,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var24 string templ_7745c5c3_Var24, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.PublicURL).ResolveURL(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 191, Col: 87} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 186, Col: 87} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var24) if templ_7745c5c3_Err != nil { @@ -398,7 +398,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var25 string templ_7745c5c3_Var25, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.DataCenter).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 192, Col: 88} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 187, Col: 88} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var25) if templ_7745c5c3_Err != nil { @@ -411,7 +411,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var26 string templ_7745c5c3_Var26, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.Rack).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 193, Col: 76} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 188, Col: 76} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var26) if templ_7745c5c3_Err != nil { @@ -424,7 +424,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var27 string templ_7745c5c3_Var27, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.Volumes)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 194, Col: 101} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 189, Col: 101} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var27) if templ_7745c5c3_Err != nil { @@ -437,7 +437,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var28 string templ_7745c5c3_Var28, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.MaxVolumes)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 195, Col: 108} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 190, Col: 108} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var28) if templ_7745c5c3_Err != nil { @@ -450,7 +450,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var29 string templ_7745c5c3_Var29, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.DiskUsage)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 196, Col: 106} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 191, Col: 106} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var29) if templ_7745c5c3_Err != nil { @@ -463,7 +463,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var30 string templ_7745c5c3_Var30, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.DiskCapacity)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 197, Col: 112} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 192, Col: 112} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var30) if templ_7745c5c3_Err != nil { @@ -476,7 +476,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var31 string templ_7745c5c3_Var31, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.RemoteSize)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 198, Col: 108} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 193, Col: 108} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var31) if templ_7745c5c3_Err != nil { @@ -489,7 +489,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var32 string templ_7745c5c3_Var32, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.EcVolumes)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 199, Col: 106} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 194, Col: 106} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32) if templ_7745c5c3_Err != nil { @@ -502,7 +502,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var33 string templ_7745c5c3_Var33, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.EcShards)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 200, Col: 104} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 195, Col: 104} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33) if templ_7745c5c3_Err != nil { @@ -515,7 +515,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var34 string templ_7745c5c3_Var34, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.LastHeartbeat.Format("2006-01-02 15:04:05")).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 201, Col: 125} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 196, Col: 125} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34) if templ_7745c5c3_Err != nil { @@ -533,7 +533,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var35 string templ_7745c5c3_Var35, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.ID).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 209, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 204, Col: 72} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35) if templ_7745c5c3_Err != nil { @@ -546,7 +546,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var36 string templ_7745c5c3_Var36, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.Address).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 210, Col: 82} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 205, Col: 82} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36) if templ_7745c5c3_Err != nil { @@ -559,7 +559,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var37 string templ_7745c5c3_Var37, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.Address).ResolveURL(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 211, Col: 85} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 206, Col: 85} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37) if templ_7745c5c3_Err != nil { @@ -572,7 +572,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var38 string templ_7745c5c3_Var38, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.DataCenter).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 212, Col: 88} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 207, Col: 88} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var38) if templ_7745c5c3_Err != nil { @@ -585,7 +585,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var39 string templ_7745c5c3_Var39, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.Rack).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 213, Col: 76} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 208, Col: 76} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var39) if templ_7745c5c3_Err != nil { @@ -598,7 +598,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var40 string templ_7745c5c3_Var40, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.Volumes)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 214, Col: 101} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 209, Col: 101} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40) if templ_7745c5c3_Err != nil { @@ -611,7 +611,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var41 string templ_7745c5c3_Var41, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.MaxVolumes)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 215, Col: 108} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 210, Col: 108} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var41) if templ_7745c5c3_Err != nil { @@ -624,7 +624,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var42 string templ_7745c5c3_Var42, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.DiskUsage)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 216, Col: 106} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 211, Col: 106} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var42) if templ_7745c5c3_Err != nil { @@ -637,7 +637,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var43 string templ_7745c5c3_Var43, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.DiskCapacity)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 217, Col: 112} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 212, Col: 112} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var43) if templ_7745c5c3_Err != nil { @@ -650,7 +650,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var44 string templ_7745c5c3_Var44, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.RemoteSize)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 218, Col: 108} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 213, Col: 108} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var44) if templ_7745c5c3_Err != nil { @@ -663,7 +663,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var45 string templ_7745c5c3_Var45, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.EcVolumes)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 219, Col: 106} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 214, Col: 106} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var45) if templ_7745c5c3_Err != nil { @@ -676,7 +676,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var46 string templ_7745c5c3_Var46, templ_7745c5c3_Err = templruntime.NewAttributeExpression(fmt.Sprintf("%d", host.EcShards)).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 220, Col: 104} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 215, Col: 104} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var46) if templ_7745c5c3_Err != nil { @@ -689,7 +689,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var47 string templ_7745c5c3_Var47, templ_7745c5c3_Err = templruntime.NewAttributeExpression(host.LastHeartbeat.Format("2006-01-02 15:04:05")).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 221, Col: 125} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 216, Col: 125} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var47) if templ_7745c5c3_Err != nil { @@ -722,7 +722,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { var templ_7745c5c3_Var48 string templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 246, Col: 81} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_volume_servers.templ`, Line: 241, Col: 81} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/cluster_volumes.templ b/weed/admin/view/app/cluster_volumes.templ index ea3526b003..4b6192c0b3 100644 --- a/weed/admin/view/app/cluster_volumes.templ +++ b/weed/admin/view/app/cluster_volumes.templ @@ -316,7 +316,7 @@ templ ClusterVolumes(data dash.ClusterVolumesData) { for _, volume := range data.Volumes { - {fmt.Sprintf("%d", volume.Id)} @@ -354,7 +354,7 @@ templ ClusterVolumes(data dash.ClusterVolumesData) { {formatBytes(int64(volume.Size))}
-
+
0 { + if p := calculatePercent64(data.DiskUsage, data.DiskCapacity); p >= diskFullWarnPercent { + issues = append(issues, fmt.Sprintf("disks %d%% full", p)) + } + } + if data.VersionSummary.Mixed() { + issues = append(issues, "mixed server versions") + } + return issues +} + +func clusterHealthSummary(data dash.AdminData) string { + nodes := fmt.Sprintf("%s and %s reporting, %s configured.", + countNoun(len(data.VolumeServers), "volume server"), + countNoun(len(data.FilerNodes), "filer"), + countNoun(len(data.MasterNodes), "master")) + issues := clusterHealthIssues(data) + if len(issues) == 0 { + return "Healthy. " + nodes + } + return "Needs attention: " + strings.Join(issues, ", ") + ". " + nodes +} + +func hasMasterLeader(masters []dash.MasterNode) bool { + for _, m := range masters { + if m.IsLeader { + return true + } + } + return false +} + +func countNoun(n int, noun string) string { + if n == 1 { + return "1 " + noun + } + return fmt.Sprintf("%d %ss", n, noun) +} diff --git a/weed/admin/view/app/empty_value.templ b/weed/admin/view/app/empty_value.templ new file mode 100644 index 0000000000..b7b2e50c57 --- /dev/null +++ b/weed/admin/view/app/empty_value.templ @@ -0,0 +1,5 @@ +package app + +templ emptyValue(label string) { + –{ label } +} diff --git a/weed/admin/view/app/empty_value_templ.go b/weed/admin/view/app/empty_value_templ.go new file mode 100644 index 0000000000..0fafe846ea --- /dev/null +++ b/weed/admin/view/app/empty_value_templ.go @@ -0,0 +1,63 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.1100 + +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" + +func emptyValue(label string) 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) + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "–") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(label) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/empty_value.templ`, Line: 4, Col: 82} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/weed/admin/view/app/groups.templ b/weed/admin/view/app/groups.templ index 683b4a5137..d6cd29ed24 100644 --- a/weed/admin/view/app/groups.templ +++ b/weed/admin/view/app/groups.templ @@ -68,9 +68,6 @@ templ Groups(data dash.GroupsPageData) {
-
-
Groups
-
if len(data.Groups) == 0 {
diff --git a/weed/admin/view/app/groups_templ.go b/weed/admin/view/app/groups_templ.go index e354ff0312..a55d8d2e64 100644 --- a/weed/admin/view/app/groups_templ.go +++ b/weed/admin/view/app/groups_templ.go @@ -57,7 +57,7 @@ func Groups(data dash.GroupsPageData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Groups
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -79,7 +79,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(group.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 96, Col: 63} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 93, Col: 63} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -92,7 +92,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", group.MemberCount)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 99, Col: 109} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 96, Col: 109} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -105,7 +105,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", group.PolicyCount)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 102, Col: 114} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 99, Col: 114} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -133,7 +133,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templruntime.NewAttributeExpression(group.Name).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 113, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 110, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var7) if templ_7745c5c3_Err != nil { @@ -146,7 +146,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templruntime.NewAttributeExpression("View group " + group.Name).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 115, Col: 90} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 112, Col: 90} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var8) if templ_7745c5c3_Err != nil { @@ -159,7 +159,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templruntime.NewAttributeExpression("View " + group.Name).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 116, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 113, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9) if templ_7745c5c3_Err != nil { @@ -172,7 +172,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templruntime.NewAttributeExpression(group.Name).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 120, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 117, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var10) if templ_7745c5c3_Err != nil { @@ -185,7 +185,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var11 string templ_7745c5c3_Var11, templ_7745c5c3_Err = templruntime.NewAttributeExpression("Delete group " + group.Name).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 122, Col: 92} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 119, Col: 92} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11) if templ_7745c5c3_Err != nil { @@ -198,7 +198,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var12 string templ_7745c5c3_Var12, templ_7745c5c3_Err = templruntime.NewAttributeExpression("Delete " + group.Name).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 123, Col: 81} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 120, Col: 81} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var12) if templ_7745c5c3_Err != nil { @@ -226,7 +226,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var13 string templ_7745c5c3_Var13, templ_7745c5c3_Err = templruntime.NewAttributeExpression(user).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 189, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 186, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13) if templ_7745c5c3_Err != nil { @@ -239,7 +239,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var14 string templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(user) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 189, Col: 74} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 186, Col: 74} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) if templ_7745c5c3_Err != nil { @@ -262,7 +262,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templruntime.NewAttributeExpression(policy).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 206, Col: 69} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 203, Col: 69} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var15) if templ_7745c5c3_Err != nil { @@ -275,7 +275,7 @@ func Groups(data dash.GroupsPageData) templ.Component { var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(policy) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 206, Col: 78} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/groups.templ`, Line: 203, Col: 78} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/mount_clients.templ b/weed/admin/view/app/mount_clients.templ index aaffb18bed..79ab82a4f7 100644 --- a/weed/admin/view/app/mount_clients.templ +++ b/weed/admin/view/app/mount_clients.templ @@ -45,11 +45,6 @@ templ MountClients(data dash.MountClientsData) {
-
-
- Mount Clients -
-
if len(data.MountClients) > 0 {
diff --git a/weed/admin/view/app/mount_clients_templ.go b/weed/admin/view/app/mount_clients_templ.go index 5b4b89aebd..19cd37c477 100644 --- a/weed/admin/view/app/mount_clients_templ.go +++ b/weed/admin/view/app/mount_clients_templ.go @@ -44,7 +44,7 @@ func MountClients(data dash.MountClientsData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
Mount Clients
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -61,7 +61,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(c.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 70, Col: 31} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 65, Col: 31} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -74,7 +74,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(c.ClientType) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 72, Col: 63} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 67, Col: 63} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -87,7 +87,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(c.PathPrefix) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 74, Col: 34} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 69, Col: 34} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -100,7 +100,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", c.ClientId)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 75, Col: 45} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 70, Col: 45} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -114,7 +114,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(c.ConnectedAt.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 78, Col: 57} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 73, Col: 57} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -133,7 +133,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(c.FilerAddress) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 84, Col: 66} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 79, Col: 66} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -161,7 +161,7 @@ func MountClients(data dash.MountClientsData) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 106, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/mount_clients.templ`, Line: 101, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/object_store_users.templ b/weed/admin/view/app/object_store_users.templ index ec11b29633..3af9bb9dbd 100644 --- a/weed/admin/view/app/object_store_users.templ +++ b/weed/admin/view/app/object_store_users.templ @@ -16,6 +16,9 @@ templ ObjectStoreUsers(data dash.ObjectStoreUsersData) {

Manage S3 API users and their access credentials

+
- -
-
-
-
-
-
- Total Users -
-
- {fmt.Sprintf("%d", len(data.Users))} -
-
-
- -
-
-
-
-
- -
-
-
-
-
-
- Last Updated -
-
- {data.LastUpdated.Format("15:04")} -
-
-
- -
-
-
-
-
-
-
- Object Store Users -
- -
diff --git a/weed/admin/view/app/object_store_users_templ.go b/weed/admin/view/app/object_store_users_templ.go index f627657a48..d6201ce8bc 100644 --- a/weed/admin/view/app/object_store_users_templ.go +++ b/weed/admin/view/app/object_store_users_templ.go @@ -31,213 +31,187 @@ func ObjectStoreUsers(data dash.ObjectStoreUsersData) templ.Component { } ctx = templ.InitializeContext(ctx) ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

Object Store Users

Manage S3 API users and their access credentials

Total Users
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

Object Store Users

Manage S3 API users and their access credentials

Total Users
") 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.TotalUsers)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 38, Col: 71} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 41, Col: 71} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
Total Users
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var3 string - templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(data.Users))) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 58, Col: 71} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Last Updated
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var4 string - templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("15:04")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 78, Col: 69} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
Object Store Users
Actions:
Export List
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
UsernameEmailAccess KeyActions
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, user := range data.Users { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } if len(data.Users) == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
UsernameEmailAccess KeyActions
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(user.Username) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 74, Col: 74} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if user.IsStatic { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "static") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(user.Email) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 80, Col: 59} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var5 string - templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(user.Username) + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(user.AccessKey) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 127, Col: 74} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 82, Col: 88} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, " ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - if user.IsStatic { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "static") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var7 string - templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(user.AccessKey) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 135, Col: 88} - } - _, 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, 10, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "\"> ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if !user.IsStatic { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + if user.Username != "anonymous" && !user.IsStatic { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + if !user.IsStatic { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - if user.Username != "anonymous" && !user.IsStatic { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, " ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - if !user.IsStatic { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
No users found

Create your first object store user to get started.

No users found

Create your first object store user to get started.

Last updated: ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
Last updated: ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) + var templ_7745c5c3_Var10 string + templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 189, Col: 81} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/object_store_users.templ`, Line: 136, Col: 81} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "
Create New User
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
Create New User
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if !data.HasAnonymousUser { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "
Hold Ctrl/Cmd to select multiple permissions
Apply selected permissions to specific buckets or all buckets
Hold Ctrl/Cmd to select multiple buckets
Hold Ctrl/Cmd to select multiple policies
Edit User
Apply selected permissions to specific buckets or all buckets
Hold Ctrl/Cmd to select multiple buckets
Grants the permission and bucket pickers above cannot show. Uncheck a grant to remove it.
User Details
Manage Access Keys
Access Keys for

Leave blank to auto-generate.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
Hold Ctrl/Cmd to select multiple permissions
Apply selected permissions to specific buckets or all buckets
Hold Ctrl/Cmd to select multiple buckets
Hold Ctrl/Cmd to select multiple policies
Edit User
Apply selected permissions to specific buckets or all buckets
Hold Ctrl/Cmd to select multiple buckets
Grants the permission and bucket pickers above cannot show. Uncheck a grant to remove it.
User Details
Manage Access Keys
Access Keys for

Leave blank to auto-generate.

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/plugin.templ b/weed/admin/view/app/plugin.templ index f0518c95bc..cd0730ae50 100644 --- a/weed/admin/view/app/plugin.templ +++ b/weed/admin/view/app/plugin.templ @@ -546,7 +546,7 @@ templ Plugin(page string, initialJob string, lane string) { } .plugin-form-root .card { - border: 1px solid #dee2e6; + border: 1px solid var(--bs-border-color); } .plugin-form-root textarea { min-height: 12rem; @@ -566,11 +566,11 @@ templ Plugin(page string, initialJob string, lane string) { } .plugin-detection-item { - border: 1px solid #dee2e6; + border: 1px solid var(--bs-border-color); border-radius: 6px; padding: 0.5rem 0.75rem; margin-bottom: 0.5rem; - background: #fbfcfd; + background: var(--bs-tertiary-bg); } .plugin-job-link { @@ -580,8 +580,8 @@ templ Plugin(page string, initialJob string, lane string) { .plugin-job-detail-json { max-height: 220px; overflow: auto; - background: #f8f9fa; - border: 1px solid #dee2e6; + background: var(--bs-tertiary-bg); + border: 1px solid var(--bs-border-color); border-radius: 6px; padding: 0.5rem; margin-bottom: 0; diff --git a/weed/admin/view/app/plugin_templ.go b/weed/admin/view/app/plugin_templ.go index 3bbe948181..3dab45b538 100644 --- a/weed/admin/view/app/plugin_templ.go +++ b/weed/admin/view/app/plugin_templ.go @@ -109,7 +109,7 @@ func Plugin(page string, initialJob string, lane string) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "
Workers

0

Active Jobs

0

Activities (recent)

0

Next scheduled check

-

Per Job Type Summary
Job TypeActive JobsRecent Activities
Loading...
Scheduler State
Sequential scheduler with per-job runtime limits
Job TypeEnabledDetectorIn FlightMax RuntimeExec GlobalExec/WorkerExecutor WorkersEffective ExecLast Run
Loading...
Workers
WorkerAddressCapabilitiesLoad
Loading...
Job Type Configuration
Not loaded
Selected Job Type
-
Descriptor
Select a job type to load schema and config.
Admin Config Form
No admin form loaded.
Worker Config Form
No worker form loaded.
Job Scheduling Settings
How often to check for new work.
Per-attempt deadline for one job. Size-aware tasks may extend this automatically.
Next scheduled check
Scheduler
-
Not scheduled
Run History
Keep last 10 success + last 10 errors
Successful Runs
TimeJob IDWorkerDuration
No data
Error Runs
TimeJob IDWorkerError
No data
Detection Results
Run detection to see proposals.
Job Queue
States: pending/assigned/running
Job IDTypeStateProgressWorkerUpdatedMessage
Loading...
Detection Jobs
Detection activities for selected job type
TimeJob TypeRequest IDWorkerStageSourceMessage
Loading...
Execution Jobs
Job IDTypeStateProgressWorkerUpdatedMessage
Loading...
Execution Activities
Non-detection events only
TimeJob TypeJob IDSourceStageMessage
Loading...
Job Detail
Select a job to view details.
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "
Workers

0

Active Jobs

0

Activities (recent)

0

Next scheduled check

-

Per Job Type Summary
Job TypeActive JobsRecent Activities
Loading...
Scheduler State
Sequential scheduler with per-job runtime limits
Job TypeEnabledDetectorIn FlightMax RuntimeExec GlobalExec/WorkerExecutor WorkersEffective ExecLast Run
Loading...
Workers
WorkerAddressCapabilitiesLoad
Loading...
Job Type Configuration
Not loaded
Selected Job Type
-
Descriptor
Select a job type to load schema and config.
Admin Config Form
No admin form loaded.
Worker Config Form
No worker form loaded.
Job Scheduling Settings
How often to check for new work.
Per-attempt deadline for one job. Size-aware tasks may extend this automatically.
Next scheduled check
Scheduler
-
Not scheduled
Run History
Keep last 10 success + last 10 errors
Successful Runs
TimeJob IDWorkerDuration
No data
Error Runs
TimeJob IDWorkerError
No data
Detection Results
Run detection to see proposals.
Job Queue
States: pending/assigned/running
Job IDTypeStateProgressWorkerUpdatedMessage
Loading...
Detection Jobs
Detection activities for selected job type
TimeJob TypeRequest IDWorkerStageSourceMessage
Loading...
Execution Jobs
Job IDTypeStateProgressWorkerUpdatedMessage
Loading...
Execution Activities
Non-detection events only
TimeJob TypeJob IDSourceStageMessage
Loading...
Job Detail
Select a job to view details.
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/policies.templ b/weed/admin/view/app/policies.templ index 16273178e8..dfbd734b39 100644 --- a/weed/admin/view/app/policies.templ +++ b/weed/admin/view/app/policies.templ @@ -61,48 +61,12 @@ templ Policies(data dash.PoliciesData) { - -
-
-
-
-
-
- Last Updated -
-
- {data.LastUpdated.Format("15:04")} -
-
-
- -
-
-
-
-
-
-
- IAM Policies -
- -
@@ -170,6 +134,15 @@ templ Policies(data dash.PoliciesData) { + +
+
+ + + Last updated: {data.LastUpdated.Format("2006-01-02 15:04:05")} + +
+
@PolicyDatalists() diff --git a/weed/admin/view/app/policies_templ.go b/weed/admin/view/app/policies_templ.go index ca42e1f8f5..ac53ac9151 100644 --- a/weed/admin/view/app/policies_templ.go +++ b/weed/admin/view/app/policies_templ.go @@ -57,140 +57,140 @@ func Policies(data dash.PoliciesData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Last Updated
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var4 string - templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("15:04")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 74, Col: 69} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
IAM Policies
Actions:
Export List
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Policy NameVersionStatementsCreatedUpdatedActions
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, policy := range data.Policies { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } if len(data.Policies) == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
Policy NameVersionStatementsCreatedUpdatedActions
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(policy.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 87, Col: 68} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var5 string - templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(policy.Name) + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(policy.Document.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 123, Col: 68} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 90, Col: 100} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var6 string - templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(policy.Document.Version) + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d statements", len(policy.Document.Statement))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 126, Col: 100} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 93, Col: 142} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var7 string - templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d statements", len(policy.Document.Statement))) + templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(policy.CreatedAt.Format("2006-01-02 15:04")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 129, Col: 142} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 96, Col: 118} } _, 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, 8, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var8 string - templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(policy.CreatedAt.Format("2006-01-02 15:04")) + templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(policy.UpdatedAt.Format("2006-01-02 15:04")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 132, Col: 118} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 99, Col: 118} } _, 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, 9, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
No IAM policies found

Create your first policy to manage access permissions.

No IAM policies found

Create your first policy to manage access permissions.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
Last updated: ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/policies.templ`, Line: 142, Col: 81} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/s3_buckets.templ b/weed/admin/view/app/s3_buckets.templ index fb9384f333..a8fc1b416d 100644 --- a/weed/admin/view/app/s3_buckets.templ +++ b/weed/admin/view/app/s3_buckets.templ @@ -18,6 +18,9 @@ templ S3Buckets(data dash.S3BucketsData) { +
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, user := range data.AvailableUsers { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, " The service account will inherit permissions from this user
Leave empty for no expiration
Service Account Details
Service Account Created Successfully
Important: This is the only time you will see the secret access key. Please save it securely.
AWS CLI Configuration

Use these credentials to configure AWS CLI or SDKs:

Example AWS CLI Usage:
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_ENDPOINT_URL=http://localhost:8333
# List buckets
aws s3 ls
# Upload a file
aws s3 cp myfile.txt s3://mybucket/
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, " The service account will inherit permissions from this user
Leave empty for no expiration
Service Account Details
Service Account Created Successfully
Important: This is the only time you will see the secret access key. Please save it securely.
AWS CLI Configuration

Use these credentials to configure AWS CLI or SDKs:

Example AWS CLI Usage:
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_ENDPOINT_URL=http://localhost:8333
# List buckets
aws s3 ls
# Upload a file
aws s3 cp myfile.txt s3://mybucket/
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/layout/layout.templ b/weed/admin/view/layout/layout.templ index 3e10120a89..b31ffc1e2a 100644 --- a/weed/admin/view/layout/layout.templ +++ b/weed/admin/view/layout/layout.templ @@ -55,6 +55,7 @@ templ Layout(view ViewContext, content templ.Component) { + @@ -69,10 +70,10 @@ templ Layout(view ViewContext, content templ.Component) {
-
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -913,108 +926,95 @@ func Layout(view ViewContext, content templ.Component) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "
© ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var52 string - templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", time.Now().Year())) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 356, Col: 60} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, " SeaweedFS Admin v") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "
© ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var53 string - templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(version.VERSION_NUMBER) + templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", time.Now().Year())) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 356, Col: 102} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 364, Col: 60} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, " SeaweedFS Admin v") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var54 string + templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(version.VERSION_NUMBER) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 364, Col: 102} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if version.COMMIT != "" { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "(") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "(") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var54 string - templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(version.COMMIT) + var templ_7745c5c3_Var55 string + templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(version.COMMIT) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 358, Col: 55} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 366, Col: 55} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, ") ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, ") ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } if !strings.Contains(version.VERSION, "enterprise") { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "• Enterprise Version Available") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "• Enterprise Version Available") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -1072,134 +1085,160 @@ func LoginForm(title string, errorMessage string, csrfToken string) templ.Compon ctx = templ.InitializeContext(ctx) ctx = templ.ClearChildren(ctx) prefix := dash.URLPrefixFromContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var62 string - templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(title) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 391, Col: 17} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, " - Login") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var63 string - templ_7745c5c3_Var63, templ_7745c5c3_Err = templruntime.NewAttributeExpression(prefix + "/static/favicon.ico").ResolveURL(ctx) + templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 392, Col: 58} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 399, Col: 17} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var63) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "\" type=\"image/x-icon\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><link href=\"") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " - Login

Please sign in to continue

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "\" rel=\"stylesheet\"> ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var67 string - templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(errorMessage) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 412, Col: 45} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } + var templ_7745c5c3_Var67 string + templ_7745c5c3_Var67, templ_7745c5c3_Err = templruntime.NewAttributeExpression(prefix + "/static/css/bootstrap-icons.min.css").ResolveURL(ctx) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 404, Col: 63} } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var69 string - templ_7745c5c3_Var69, templ_7745c5c3_Err = templruntime.NewAttributeExpression(csrfToken).Resolve(ctx) + templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 417, Col: 84} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 415, Col: 57} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var69)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "\">

") + var templ_7745c5c3_Var71 string + templ_7745c5c3_Var71, templ_7745c5c3_Err = templruntime.NewAttributeExpression(templ.SafeURL(prefix + "/login")).ResolveURL(ctx) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/layout/layout.templ`, Line: 426, Col: 85} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var71) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "\">
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }
-

- Dashboard -

-
- +
+

+ Dashboard +

+

+ if len(clusterHealthIssues(data)) == 0 { + + } else { + + } + { clusterHealthSummary(data) } +

@@ -40,18 +42,21 @@ templ Admin(data dash.AdminData) { -
-
+
+
- Total Volumes + Volumes
-
+
{fmt.Sprintf("%d", data.TotalVolumes)}
+
+ {fmt.Sprintf("%s limit", formatBytes(int64(data.VolumeSizeLimitMB)*1024*1024))} +
@@ -62,34 +67,13 @@ templ Admin(data dash.AdminData) {
-
-
-
-
-
-
- Total Chunks -
-
- {formatNumber(data.TotalChunks)} -
-
-
- -
-
- @templ.Raw(data.Trends.Chunks) -
-
-
- -
+
- Disk Usage + Disk usage
{formatBytes(data.DiskUsage)} @@ -109,60 +93,43 @@ templ Admin(data dash.AdminData) {
-
-
+
+
-
- Volume Size Limit +
+ Chunks
- {fmt.Sprintf("%d MB", data.VolumeSizeLimitMB)} + {formatNumber(data.TotalChunks)}
- +
+ @templ.Raw(data.Trends.Chunks)
-
- -
-
+
- EC Volumes -
-
- {fmt.Sprintf("%d", data.TotalEcVolumes)} -
-
-
- -
-
-
-
-
- -
-
-
-
-
-
- EC Shards + EC shards
{fmt.Sprintf("%d", data.TotalEcShards)}
+ if data.TotalEcVolumes > 0 { +
+ {fmt.Sprintf("in %s", countNoun(data.TotalEcVolumes, "EC volume"))} +
+ }
@@ -173,13 +140,13 @@ templ Admin(data dash.AdminData) {
-
+
- Active Tasks + Active tasks
{ data.Trends.TasksValue } @@ -194,7 +161,7 @@ templ Admin(data dash.AdminData) {
-
+
@@ -254,7 +221,7 @@ templ Admin(data dash.AdminData) { {fmt.Sprintf("%d", tier.VolumeCount)} if tier.IsRemote { - - + – } else { {fmt.Sprintf("%d", tier.EcShardCount)} } @@ -262,21 +229,21 @@ templ Admin(data dash.AdminData) { {formatBytes(tier.DataSize)} if tier.IsRemote || tier.DiskUsed == 0 { - - + – } else { {formatBytes(tier.DiskUsed)} } if tier.IsRemote { - - + – } else { {formatBytes(tier.DiskCapacity)} } if tier.IsRemote { - - + – } else {
@@ -299,31 +266,6 @@ templ Admin(data dash.AdminData) {
} - -
-
-
-
-
- Mount Clients -
- - View Details - -
-
-
- -
-
{fmt.Sprintf("%d", data.TotalMountClients)}
-
Connected FUSE/VFS mount clients
-
-
-
-
-
-
-
@@ -376,79 +318,44 @@ templ Admin(data dash.AdminData) {
-
-
-
-
-
{fmt.Sprintf("%d", len(data.MasterNodes))}
- Masters -
-
-
-
-
-
-
{fmt.Sprintf("%d", len(data.VolumeServers))}
- Volume Servers -
-
-
-
-
-
-
{fmt.Sprintf("%d", len(data.FilerNodes))}
- Filers -
-
-
-
-
-
-
{fmt.Sprintf("%d", len(data.S3Nodes))}
- S3 Servers -
-
-
-
-
-
-
{fmt.Sprintf("%d", len(data.MessageBrokers))}
- Message Brokers -
-
-
-
-
-
- if data.VersionSummary.Uniform { -
{data.VersionSummary.Version}
- Version - } else if data.VersionSummary.Mixed() { -
- -
- Mixed Versions - } else { -
—
- Version - } -
-
+ - if data.VersionSummary.Mixed() { -
-
- Node Versions - for _, nt := range data.VersionSummary.NodeTypes { -
- {nt.Type} - {nt.Spread()} -
- } -
-
- }
@@ -462,16 +369,9 @@ templ Admin(data dash.AdminData) {
Volume Servers
- + + View all +
@@ -518,7 +418,7 @@ templ Admin(data dash.AdminData) { ({fmt.Sprintf("%d vol", vs.EcVolumes)}) } } else { - - + – } @@ -554,16 +454,9 @@ templ Admin(data dash.AdminData) {
Filer Nodes
- + + View all +
@@ -616,15 +509,9 @@ templ Admin(data dash.AdminData) {
S3 Servers
- + + View all +
diff --git a/weed/admin/view/app/admin_render_test.go b/weed/admin/view/app/admin_render_test.go index 76cf2be4b8..bd4318a4bb 100644 --- a/weed/admin/view/app/admin_render_test.go +++ b/weed/admin/view/app/admin_render_test.go @@ -23,7 +23,7 @@ func TestAdminDashboardShowsDiskUsage(t *testing.T) { t.Fatalf("render: %v", err) } got := buf.String() - for _, want := range []string{"Disk Usage", "348.0 TB", "of 1000.0 TB (34%)"} { + for _, want := range []string{"Disk usage", "348.0 TB", "of 1000.0 TB (34%)"} { if !strings.Contains(got, want) { t.Errorf("dashboard is missing %q", want) } @@ -39,3 +39,28 @@ func TestCalculatePercent64PetabyteScale(t *testing.T) { t.Errorf("100 of 200 PiB = %d%%, want 50%%", got) } } + +func TestClusterHealthSummary(t *testing.T) { + healthy := dash.AdminData{ + MasterNodes: []dash.MasterNode{{Address: "m1:9333", IsLeader: true}}, + VolumeServers: []dash.VolumeServer{{ID: "v1"}, {ID: "v2"}}, + FilerNodes: []dash.FilerNode{{Address: "f1:8888"}}, + DiskUsage: 50, + DiskCapacity: 100, + } + if got, want := clusterHealthSummary(healthy), "Healthy. 2 volume servers and 1 filer reporting, 1 master configured."; got != want { + t.Errorf("healthy summary = %q, want %q", got, want) + } + + degraded := healthy + degraded.MasterNodes = []dash.MasterNode{{Address: "m1:9333"}} + degraded.DiskUsage = 95 + want := "Needs attention: no master leader, disks 95% full. 2 volume servers and 1 filer reporting, 1 master configured." + if got := clusterHealthSummary(degraded); got != want { + t.Errorf("degraded summary = %q, want %q", got, want) + } + + if got := clusterHealthIssues(dash.AdminData{}); strings.Join(got, ", ") != "no master reachable, no volume servers" { + t.Errorf("empty cluster issues = %q", got) + } +} diff --git a/weed/admin/view/app/admin_templ.go b/weed/admin/view/app/admin_templ.go index d343502f89..c1bd3297fc 100644 --- a/weed/admin/view/app/admin_templ.go +++ b/weed/admin/view/app/admin_templ.go @@ -31,79 +31,103 @@ func Admin(data dash.AdminData) templ.Component { } ctx = templ.InitializeContext(ctx) ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if data.VersionSummary.Mixed() { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Mixed cluster versions detected. Not all servers are running the same SeaweedFS version — some servers may not have been upgraded.
    ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "
    Mixed cluster versions detected. Not all servers are running the same SeaweedFS version — some servers may not have been upgraded.
      ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, nt := range data.VersionSummary.NodeTypes { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
    • ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
    • ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(nt.Type) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 34, Col: 40} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 36, Col: 40} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, ": ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, ": ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(nt.Spread()) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 34, Col: 55} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 36, Col: 55} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
    • ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "
    ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "
Total Volumes
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "
Volumes
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalVolumes)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 53, Col: 73} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 55, Col: 73} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s limit", formatBytes(int64(data.VolumeSizeLimitMB)*1024*1024))) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 58, Col: 114} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -111,77 +135,56 @@ func Admin(data dash.AdminData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "
Total Chunks
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var6 string - templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(formatNumber(data.TotalChunks)) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 74, Col: 67} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templ.Raw(data.Trends.Chunks).Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "
Disk Usage
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "
Disk usage
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(data.DiskUsage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 95, Col: 64} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 79, Col: 64} } _, 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, 13, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if data.DiskCapacity > 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
of ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
of ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(data.DiskCapacity)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 99, Col: 74} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 83, Col: 74} } _, 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, 15, " (") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, " (") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d%%", calculatePercent64(data.DiskUsage, data.DiskCapacity))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 99, Col: 152} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 83, Col: 152} } _, 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, 16, ")
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, ")
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -189,46 +192,64 @@ func Admin(data dash.AdminData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
Volume Size Limit
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
Chunks
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var10 string - templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d MB", data.VolumeSizeLimitMB)) + templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(formatNumber(data.TotalChunks)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 121, Col: 81} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 105, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
EC Volumes
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templ.Raw(data.Trends.Chunks).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "
EC shards
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var11 string - templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalEcVolumes)) + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalEcShards)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 144, Col: 75} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 126, Col: 74} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
EC Shards
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalEcShards)) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 164, Col: 74} + if data.TotalEcVolumes > 0 { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("in %s", countNoun(data.TotalEcVolumes, "EC volume"))) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 130, Col: 106} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -236,20 +257,20 @@ func Admin(data dash.AdminData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
Active Tasks
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "
Active tasks
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var13 string templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(data.Trends.TasksValue) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 185, Col: 60} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 152, Col: 60} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -257,20 +278,20 @@ func Admin(data dash.AdminData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "
Workers
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "
Workers
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var14 string templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(data.Trends.WorkersValue) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 206, Col: 62} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 173, Col: 62} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -278,72 +299,72 @@ func Admin(data dash.AdminData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if len(data.TierStats) > 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "
Storage Tiers
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "
Storage Tiers
TierVolumesEC ShardsData SizeDisk UsedCapacityUsage
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, tier := range data.TierStats { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "
TierVolumesEC ShardsData SizeDisk UsedCapacityUsage
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if tier.IsRemote { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(tier.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 248, Col: 108} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 215, Col: 108} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, " remote") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, " remote") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(tier.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 251, Col: 114} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 218, Col: 114} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var17 string templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", tier.VolumeCount)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 254, Col: 88} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 221, Col: 88} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if tier.IsRemote { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "-") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "–") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -351,32 +372,32 @@ func Admin(data dash.AdminData) templ.Component { var templ_7745c5c3_Var18 string templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", tier.EcShardCount)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 259, Col: 93} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 226, Col: 93} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var19 string templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(tier.DataSize)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 262, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 229, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if tier.IsRemote || tier.DiskUsed == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "-") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "–") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -384,19 +405,19 @@ func Admin(data dash.AdminData) templ.Component { var templ_7745c5c3_Var20 string templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(tier.DiskUsed)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 267, Col: 83} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 234, Col: 83} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if tier.IsRemote { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "-") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "–") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -404,794 +425,787 @@ func Admin(data dash.AdminData) templ.Component { var templ_7745c5c3_Var21 string templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(tier.DiskCapacity)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 274, Col: 87} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 241, Col: 87} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if tier.IsRemote { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "-") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "–") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\">
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var23 string templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d%%", tier.UsagePercent())) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 287, Col: 132} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 254, Col: 132} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "
Mount Clients
View Details
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var25 string - templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalMountClients)) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 318, Col: 126} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "
Connected FUSE/VFS mount clients
Master Nodes
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "
Master Nodes
AddressRole
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, master := range data.MasterNodes { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "
AddressRole
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\" target=\"_blank\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var27 string - templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(master.Address) + var templ_7745c5c3_Var25 string + templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(master.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 350, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 292, Col: 67} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if master.IsLeader { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "Leader") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "Leader") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "Follower") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "Follower") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "
Cluster
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\">
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - if data.VersionSummary.Uniform { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var34 string - templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(data.VersionSummary.Version) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 424, Col: 134} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "
Version") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } else if data.VersionSummary.Mixed() { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "
Mixed Versions") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "
—
Version") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } + var templ_7745c5c3_Var33 string + templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(data.S3Nodes))) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 335, Col: 90} } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "
") + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - if data.VersionSummary.Mixed() { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "
Node Versions ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - for _, nt := range data.VersionSummary.NodeTypes { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var35 string - templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(nt.Type) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 445, Col: 58} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, " ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var36 string - templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(nt.Spread()) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 446, Col: 62} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "
S3 servers
Volume Servers
Actions:
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var35 string + templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", data.TotalMountClients)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 339, Col: 95} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "
Mount clients
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var37 string - templ_7745c5c3_Var37, templ_7745c5c3_Err = templruntime.NewAttributeExpression(dash.PUrl(ctx, "/volumes")).ResolveURL(ctx) + templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", len(data.MessageBrokers))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 471, Col: 90} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 343, Col: 97} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "\">View Details Message brokers
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var38 string - templ_7745c5c3_Var38, templ_7745c5c3_Err = templruntime.NewAttributeExpression(dash.PUrl(ctx, "/cluster")).ResolveURL(ctx) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 472, Col: 90} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var38) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "\">Topology View
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - for _, vs := range data.VolumeServers { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "
IDAddressData CenterRackVersionVolumesEC ShardsUsage / Capacity
") + if data.VersionSummary.Uniform { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var39 string - templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(vs.ID) + templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(data.VersionSummary.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 494, Col: 54} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 348, Col: 135} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "
Version") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var40 string - templ_7745c5c3_Var40, templ_7745c5c3_Err = templruntime.NewAttributeExpression(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", vs.GetDisplayAddress()))).ResolveURL(ctx) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 496, Col: 129} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40) + } else if data.VersionSummary.Mixed() { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "
Mixed versions") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "\" target=\"_blank\">") + } else { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "
–
Version") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, vs := range data.VolumeServers { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } if len(data.VolumeServers) == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "
IDAddressData CenterRackVersionVolumesEC ShardsUsage / Capacity
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var41 string - templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(vs.GetDisplayAddress()) + templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(vs.ID) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 497, Col: 75} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 394, Col: 54} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\" target=\"_blank\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var43 string - templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(vs.Rack) + templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(vs.GetDisplayAddress()) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 502, Col: 56} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 397, Col: 75} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var44 string - templ_7745c5c3_Var44, templ_7745c5c3_Err = templruntime.NewAttributeExpression(vs.Version).Resolve(ctx) + templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(vs.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 503, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 401, Col: 62} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var44) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "\">") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var45 string - templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(dash.ShortVersion(vs.Version)) + templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(vs.Rack) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 503, Col: 97} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 402, Col: 56} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var47 string - templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d/%d", vs.Volumes, vs.MaxVolumes)) + templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(dash.ShortVersion(vs.Version)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 511, Col: 131} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 403, Col: 97} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var49 string + templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d/%d", vs.Volumes, vs.MaxVolumes)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 411, Col: 131} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if vs.EcShards > 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var48 string - templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", vs.EcShards)) + var templ_7745c5c3_Var50 string + templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", vs.EcShards)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 516, Col: 127} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 416, Col: 127} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if vs.EcVolumes > 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "(") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "(") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var49 string - templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d vol", vs.EcVolumes)) + var templ_7745c5c3_Var51 string + templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d vol", vs.EcVolumes)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 518, Col: 119} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 418, Col: 119} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, ")") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, ")") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "-") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "–") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var50 string - templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(vs.DiskUsage)) + var templ_7745c5c3_Var52 string + templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(vs.DiskUsage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 525, Col: 74} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 425, Col: 74} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, " / ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, " / ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var51 string - templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(vs.DiskCapacity)) + var templ_7745c5c3_Var53 string + templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(vs.DiskCapacity)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 525, Col: 107} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 425, Col: 107} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } if vs.RemoteSize > 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var52 string - templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(vs.RemoteSize)) + var templ_7745c5c3_Var54 string + templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(formatBytes(vs.RemoteSize)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 528, Col: 137} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 428, Col: 137} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " remote") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, " remote
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "
No volume servers found
No volume servers found
Filer Nodes
Actions:
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\" class=\"btn btn-sm btn-outline-primary\">View all
AddressData CenterRackVersionLast Updated
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, filer := range data.FilerNodes { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } if len(data.FilerNodes) == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "
AddressData CenterRackVersionLast Updated
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "\" target=\"_blank\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var57 string - templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(filer.DataCenter) + templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(filer.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 589, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 478, Col: 66} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var58 string - templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(filer.Rack) + templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(filer.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 590, Col: 59} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 482, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var59 string - templ_7745c5c3_Var59, templ_7745c5c3_Err = templruntime.NewAttributeExpression(filer.Version).Resolve(ctx) + templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(filer.Rack) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 591, Col: 68} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 483, Col: 59} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\">") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var61 string - templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(filer.LastUpdated.Format("2006-01-02 15:04:05")) + templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(dash.ShortVersion(filer.Version)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 592, Col: 96} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 484, Col: 103} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var62 string + templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(filer.LastUpdated.Format("2006-01-02 15:04:05")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 485, Col: 96} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "
No filer nodes found
No filer nodes found
S3 Servers
Actions:
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "\" class=\"btn btn-sm btn-outline-primary\">View all
AddressData CenterVersionLast Updated
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } for _, s3Node := range data.S3Nodes { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } if len(data.S3Nodes) == 0 { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "
AddressData CenterVersionLast Updated
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var63 string - templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(s3Node.Address) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 643, Col: 63} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var64 string - templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinStringErrs(s3Node.DataCenter) + templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinStringErrs(s3Node.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 644, Col: 66} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 530, Col: 63} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var65 string - templ_7745c5c3_Var65, templ_7745c5c3_Err = templruntime.NewAttributeExpression(s3Node.Version).Resolve(ctx) + templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(s3Node.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 645, Col: 69} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 531, Col: 66} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var65) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "\">") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var67 string - templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(s3Node.LastUpdated.Format("2006-01-02 15:04:05")) + templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(dash.ShortVersion(s3Node.Version)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 646, Col: 97} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 532, Col: 105} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var68 string + templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(s3Node.LastUpdated.Format("2006-01-02 15:04:05")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 533, Col: 97} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "
No S3 servers found
No S3 servers found
Last updated: ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "
Last updated: ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var68 string - templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) + var templ_7745c5c3_Var69 string + templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 670, Col: 81} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/admin.templ`, Line: 557, Col: 81} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var69)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/cluster_brokers.templ b/weed/admin/view/app/cluster_brokers.templ index 6b40c4d9fd..e54d04585a 100644 --- a/weed/admin/view/app/cluster_brokers.templ +++ b/weed/admin/view/app/cluster_brokers.templ @@ -45,11 +45,6 @@ templ ClusterBrokers(data dash.ClusterBrokersData) {
-
-
- Message Brokers -
-
if len(data.Brokers) > 0 {
diff --git a/weed/admin/view/app/cluster_brokers_templ.go b/weed/admin/view/app/cluster_brokers_templ.go index 4e22b2d5f2..79d5cdada4 100644 --- a/weed/admin/view/app/cluster_brokers_templ.go +++ b/weed/admin/view/app/cluster_brokers_templ.go @@ -44,7 +44,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
Message Brokers
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -61,7 +61,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(broker.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 70, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 65, Col: 27} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -74,7 +74,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(broker.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 73, Col: 66} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 68, Col: 66} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -87,7 +87,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(broker.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 76, Col: 69} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 71, Col: 69} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -100,7 +100,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(broker.Rack) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 79, Col: 63} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 74, Col: 63} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -114,7 +114,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(broker.CreatedAt.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 83, Col: 60} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 78, Col: 60} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -148,7 +148,7 @@ func ClusterBrokers(data dash.ClusterBrokersData) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 108, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_brokers.templ`, Line: 103, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/cluster_filers.templ b/weed/admin/view/app/cluster_filers.templ index f28cda10e4..4e259e8b30 100644 --- a/weed/admin/view/app/cluster_filers.templ +++ b/weed/admin/view/app/cluster_filers.templ @@ -45,11 +45,6 @@ templ ClusterFilers(data dash.ClusterFilersData) {
-
-
- Filers -
-
if len(data.Filers) > 0 {
diff --git a/weed/admin/view/app/cluster_filers_templ.go b/weed/admin/view/app/cluster_filers_templ.go index 4f27e9a417..4c4e4bd808 100644 --- a/weed/admin/view/app/cluster_filers_templ.go +++ b/weed/admin/view/app/cluster_filers_templ.go @@ -44,7 +44,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
Filers
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -61,7 +61,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templruntime.NewAttributeExpression(templ.SafeURL(fmt.Sprintf("//%s", filer.Address))).ResolveURL(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 71, Col: 70} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 66, Col: 70} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var3) if templ_7745c5c3_Err != nil { @@ -74,7 +74,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(filer.Address) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 72, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 67, Col: 27} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -87,7 +87,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(filer.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 77, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 72, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -100,7 +100,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(filer.DataCenter) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 80, Col: 68} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 75, Col: 68} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -113,7 +113,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(filer.Rack) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 83, Col: 62} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 78, Col: 62} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -127,7 +127,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(filer.CreatedAt.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 87, Col: 59} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 82, Col: 59} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -146,7 +146,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templruntime.NewAttributeExpression(filer.Address).Resolve(ctx) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 94, Col: 149} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 89, Col: 149} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var9) if templ_7745c5c3_Err != nil { @@ -174,7 +174,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(data.LastUpdated.Format("2006-01-02 15:04:05")) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 119, Col: 67} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/app/cluster_filers.templ`, Line: 114, Col: 67} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { diff --git a/weed/admin/view/app/cluster_masters.templ b/weed/admin/view/app/cluster_masters.templ index 7688ba0cfa..b206362ddb 100644 --- a/weed/admin/view/app/cluster_masters.templ +++ b/weed/admin/view/app/cluster_masters.templ @@ -89,11 +89,6 @@ templ ClusterMasters(data dash.ClusterMastersData) {
-
-
- Masters -
-
if len(data.Masters) > 0 {
diff --git a/weed/admin/view/app/cluster_masters_templ.go b/weed/admin/view/app/cluster_masters_templ.go index fd41781748..991aded324 100644 --- a/weed/admin/view/app/cluster_masters_templ.go +++ b/weed/admin/view/app/cluster_masters_templ.go @@ -72,7 +72,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
Masters
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "