Files
seaweedFS/weed/server/volume_server_ui/templates.go
Chris Lu 63b2fe0d76 fix: EC UI template error when viewing shard details (#7955)
* fix: EC UI template error when viewing shard details

Fixed field name mismatch in volume.html where it was using .ShardDetails
instead of .Shards. Added a robust type conversion wrapper in templates.go
to handle int64 to uint64 conversion for bytesToHumanReadable.
Added regression test to ensure future stability.

* refactor: improve bytesToHumanReadable and test robustness

- Handled more integer types (uint32, int32, uint) in bytesToHumanReadable.
- Improved volume_test.go to verify both shards are formatted correctly.

* refactor: add bounds checking to bytesToHumanReadable

Added checks for negative values in signed integer types to avoid incorrect
formatting when converting to uint64.
Addressed feedback from coderabbitai.
2026-01-03 22:45:48 -08:00

64 lines
1.3 KiB
Go

package volume_server_ui
import (
_ "embed"
"fmt"
"html/template"
"strconv"
"strings"
"github.com/seaweedfs/seaweedfs/weed/util"
)
func percentFrom(total uint64, part_of uint64) string {
return fmt.Sprintf("%.2f", (float64(part_of)/float64(total))*100)
}
func bytesToHumanReadable(b interface{}) string {
switch v := b.(type) {
case uint64:
return util.BytesToHumanReadable(v)
case int64:
if v < 0 {
return fmt.Sprintf("%d B", v)
}
return util.BytesToHumanReadable(uint64(v))
case int:
if v < 0 {
return fmt.Sprintf("%d B", v)
}
return util.BytesToHumanReadable(uint64(v))
case uint32:
return util.BytesToHumanReadable(uint64(v))
case int32:
if v < 0 {
return fmt.Sprintf("%d B", v)
}
return util.BytesToHumanReadable(uint64(v))
case uint:
return util.BytesToHumanReadable(uint64(v))
default:
return fmt.Sprintf("%v", b)
}
}
func join(data []int64) string {
var ret []string
for _, d := range data {
ret = append(ret, strconv.Itoa(int(d)))
}
return strings.Join(ret, ",")
}
var funcMap = template.FuncMap{
"join": join,
"bytesToHumanReadable": bytesToHumanReadable,
"percentFrom": percentFrom,
"isNotEmpty": util.IsNotEmpty,
}
//go:embed volume.html
var volumeHtml string
var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(volumeHtml))