refactor(web): remove deprecated dashboard components and enhance KPI grid
quality / commitlint (push) Skipped
quality / changes (push) Successful in 9s
quality / docker-check (push) Skipped
quality / openapi (push) Successful in 46s
quality / web (push) Successful in 1m16s
quality / go (push) Successful in 2m42s
quality / bird2 (push) Successful in 16s
CD / quality (push) Successful in 5m19s
CD / publish (push) Successful in 7m19s
quality / commitlint (push) Skipped
quality / changes (push) Successful in 9s
quality / docker-check (push) Skipped
quality / openapi (push) Successful in 46s
quality / web (push) Successful in 1m16s
quality / go (push) Successful in 2m42s
quality / bird2 (push) Successful in 16s
CD / quality (push) Successful in 5m19s
CD / publish (push) Successful in 7m19s
- Deleted unused components: `DashboardActivityTimeline`, `DashboardFramePanel`, `DashboardModulesGrid`, `DashboardRecentJobsGrid`, and `DashboardRecentRevisionsGrid` to streamline the dashboard. - Updated `DashboardKpiGrid` to improve KPI display logic, including progress indicators and enhanced badge functionality. - Refactored `DashboardNetworkHealth` to provide better status representation based on loading states and network conditions. - Introduced new properties for KPI cards to support progress tracking and improved visual feedback. This cleanup aims to enhance performance and maintainability of the dashboard while providing a better user experience.
This commit is contained in:
@@ -8,7 +8,6 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/big"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
@@ -190,7 +189,7 @@ func collectModulePrefixRows(ctx context.Context, st store.Backend, hc *http.Cli
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return collectDomainPrefixRows(ctx, hc, mod, profiles, policy, entries, priorSnapshot)
|
||||
return collectDomainPrefixRows(ctx, st, hc, mod, profiles, policy, entries, priorSnapshot)
|
||||
default:
|
||||
return nil, fmt.Errorf("pipeline: unknown module type %q", mod.Type)
|
||||
}
|
||||
@@ -230,9 +229,8 @@ func resolveDomainIPs(ctx context.Context, hc *http.Client, profile *store.DohPr
|
||||
defer cancel()
|
||||
|
||||
baseURL := strings.TrimSpace(profile.URL)
|
||||
// Prefer RFC8484 dns-message transport. Some providers don't support dns-json.
|
||||
v4, err4 := resolveDomainWithDOHMessage(dctx, hc, baseURL, host, dns.TypeA)
|
||||
v6, err6 := resolveDomainWithDOHMessage(dctx, hc, baseURL, host, dns.TypeAAAA)
|
||||
// A and AAAA queries run concurrently: per-domain latency drops from ~2×RTT to ~1×RTT.
|
||||
v4, v6, err4, err6 := resolveDOHMessagePair(dctx, hc, baseURL, host)
|
||||
if err4 != nil {
|
||||
// Fallback to JSON mode for providers that only expose dns-json.
|
||||
v4, err4 = resolveDomainWithDOHJSON(dctx, hc, baseURL, host, "A")
|
||||
@@ -496,168 +494,11 @@ func prefixRowCommunity(r store.PrefixRow) string {
|
||||
}
|
||||
|
||||
func aggregateIPv4Group(rows []store.PrefixRow) []store.PrefixRow {
|
||||
return aggregateCIDRGroup(rows, mergeSiblingPrefixesIPv4)
|
||||
return collapsePrefixGroup(rows, true)
|
||||
}
|
||||
|
||||
func aggregateIPv6Group(rows []store.PrefixRow) []store.PrefixRow {
|
||||
return aggregateCIDRGroup(rows, mergeSiblingPrefixesIPv6)
|
||||
}
|
||||
|
||||
func aggregateCIDRGroup(rows []store.PrefixRow, mergeFn func(map[string]store.PrefixRow) bool) []store.PrefixRow {
|
||||
if len(rows) <= 1 {
|
||||
return rows
|
||||
}
|
||||
set := make(map[string]store.PrefixRow, len(rows))
|
||||
for _, row := range rows {
|
||||
set[row.Prefix] = row
|
||||
}
|
||||
pruneCoveredPrefixes(set)
|
||||
for {
|
||||
if !mergeFn(set) {
|
||||
break
|
||||
}
|
||||
pruneCoveredPrefixes(set)
|
||||
}
|
||||
out := make([]store.PrefixRow, 0, len(set))
|
||||
for _, row := range set {
|
||||
out = append(out, row)
|
||||
}
|
||||
sortPrefixRows(out)
|
||||
return out
|
||||
}
|
||||
|
||||
func pruneCoveredPrefixes(set map[string]store.PrefixRow) {
|
||||
type item struct {
|
||||
key string
|
||||
pfx netip.Prefix
|
||||
bits int
|
||||
}
|
||||
items := make([]item, 0, len(set))
|
||||
for k := range set {
|
||||
p, err := netip.ParsePrefix(k)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
items = append(items, item{key: k, pfx: p, bits: p.Bits()})
|
||||
}
|
||||
sort.Slice(items, func(i, j int) bool {
|
||||
if items[i].bits != items[j].bits {
|
||||
return items[i].bits < items[j].bits
|
||||
}
|
||||
return items[i].key < items[j].key
|
||||
})
|
||||
for i := 0; i < len(items); i++ {
|
||||
for j := i + 1; j < len(items); j++ {
|
||||
if items[j].bits <= items[i].bits {
|
||||
continue
|
||||
}
|
||||
if items[i].pfx.Contains(items[j].pfx.Addr()) {
|
||||
delete(set, items[j].key)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func mergeSiblingPrefixesIPv4(set map[string]store.PrefixRow) bool {
|
||||
merged := false
|
||||
seen := make(map[string]struct{}, len(set))
|
||||
for key, row := range set {
|
||||
if _, done := seen[key]; done {
|
||||
continue
|
||||
}
|
||||
pfx, err := netip.ParsePrefix(key)
|
||||
if err != nil || !pfx.Addr().Is4() {
|
||||
continue
|
||||
}
|
||||
bits := pfx.Bits()
|
||||
if bits <= 8 {
|
||||
continue
|
||||
}
|
||||
netNum := ipv4PrefixNetwork(pfx)
|
||||
blockSize := uint32(1) << (32 - bits)
|
||||
siblingNet := netNum ^ blockSize
|
||||
siblingPfx := netip.PrefixFrom(u32ToIPv4(siblingNet), bits).Masked().String()
|
||||
_, ok := set[siblingPfx]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
parentBits := bits - 1
|
||||
parentBlock := uint32(1) << (32 - parentBits)
|
||||
parentNet := netNum & ^(parentBlock - 1)
|
||||
parentPfx := netip.PrefixFrom(u32ToIPv4(parentNet), parentBits).Masked().String()
|
||||
delete(set, key)
|
||||
delete(set, siblingPfx)
|
||||
parentRow := row
|
||||
parentRow.Prefix = parentPfx
|
||||
set[parentPfx] = parentRow
|
||||
seen[key] = struct{}{}
|
||||
seen[siblingPfx] = struct{}{}
|
||||
merged = true
|
||||
}
|
||||
return merged
|
||||
}
|
||||
|
||||
func ipv4PrefixNetwork(p netip.Prefix) uint32 {
|
||||
a := p.Masked().Addr().As4()
|
||||
return uint32(a[0])<<24 | uint32(a[1])<<16 | uint32(a[2])<<8 | uint32(a[3])
|
||||
}
|
||||
|
||||
func u32ToIPv4(v uint32) netip.Addr {
|
||||
return netip.AddrFrom4([4]byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)})
|
||||
}
|
||||
|
||||
func mergeSiblingPrefixesIPv6(set map[string]store.PrefixRow) bool {
|
||||
merged := false
|
||||
seen := make(map[string]struct{}, len(set))
|
||||
for key, row := range set {
|
||||
if _, done := seen[key]; done {
|
||||
continue
|
||||
}
|
||||
pfx, err := netip.ParsePrefix(key)
|
||||
if err != nil || !pfx.Addr().Is6() {
|
||||
continue
|
||||
}
|
||||
bits := pfx.Bits()
|
||||
if bits <= 16 {
|
||||
continue
|
||||
}
|
||||
netNum := ipv6PrefixNetwork(pfx)
|
||||
blockSize := new(big.Int).Lsh(big.NewInt(1), uint(128-bits))
|
||||
siblingNet := new(big.Int).Xor(netNum, blockSize)
|
||||
siblingPfx := ipv6PrefixFromBigInt(siblingNet, bits).String()
|
||||
if _, ok := set[siblingPfx]; !ok {
|
||||
continue
|
||||
}
|
||||
parentBits := bits - 1
|
||||
parentBlock := new(big.Int).Lsh(big.NewInt(1), uint(128-parentBits))
|
||||
mask := new(big.Int).Sub(parentBlock, big.NewInt(1))
|
||||
mask.Not(mask)
|
||||
parentNet := new(big.Int).And(netNum, mask)
|
||||
parentPfx := ipv6PrefixFromBigInt(parentNet, parentBits).String()
|
||||
delete(set, key)
|
||||
delete(set, siblingPfx)
|
||||
parentRow := row
|
||||
parentRow.Prefix = parentPfx
|
||||
set[parentPfx] = parentRow
|
||||
seen[key] = struct{}{}
|
||||
seen[siblingPfx] = struct{}{}
|
||||
merged = true
|
||||
}
|
||||
return merged
|
||||
}
|
||||
|
||||
func ipv6PrefixNetwork(p netip.Prefix) *big.Int {
|
||||
a := p.Masked().Addr().As16()
|
||||
n := new(big.Int)
|
||||
n.SetBytes(a[:])
|
||||
return n
|
||||
}
|
||||
|
||||
func ipv6PrefixFromBigInt(n *big.Int, bits int) netip.Prefix {
|
||||
b := n.Bytes()
|
||||
var a [16]byte
|
||||
copy(a[16-len(b):], b)
|
||||
return netip.PrefixFrom(netip.AddrFrom16(a), bits).Masked()
|
||||
return collapsePrefixGroup(rows, false)
|
||||
}
|
||||
|
||||
func parentRevision(st store.Backend, tenantID, moduleID string) *string {
|
||||
|
||||
Reference in New Issue
Block a user