Standardize TUI formatting and styling across all screens
This commit is contained in:
@@ -28,8 +28,9 @@ type ListScreen struct {
|
||||
|
||||
// ClientWithStatus wraps a client with its connection status
|
||||
type ClientWithStatus struct {
|
||||
Client wireguard.Client
|
||||
Status string
|
||||
Client wireguard.Client
|
||||
Status string
|
||||
Quality string
|
||||
}
|
||||
|
||||
// NewListScreen creates a new list screen
|
||||
@@ -204,7 +205,6 @@ func (s *ListScreen) View() string {
|
||||
Foreground(lipgloss.Color("241")).
|
||||
Render("Last updated: " + timeAgo)
|
||||
|
||||
|
||||
// Add keyboard shortcuts help
|
||||
helpText := lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color("63")).
|
||||
@@ -225,6 +225,8 @@ func formatDuration(d time.Duration) string {
|
||||
return fmt.Sprintf("%d hr ago", int(d.Hours()))
|
||||
}
|
||||
|
||||
// loadClients loads clients from wireguard config
|
||||
|
||||
// loadClients loads clients from wireguard config
|
||||
func (s *ListScreen) loadClients() tea.Msg {
|
||||
clients, err := wireguard.ListClients()
|
||||
@@ -232,16 +234,31 @@ func (s *ListScreen) loadClients() tea.Msg {
|
||||
return ErrMsg{Err: err}
|
||||
}
|
||||
|
||||
// Get status for each client
|
||||
// Get all peer statuses to retrieve quality information
|
||||
peerStatuses, err := wireguard.GetAllPeers()
|
||||
if err != nil {
|
||||
return ErrMsg{Err: err}
|
||||
}
|
||||
|
||||
// Match clients with their peer status
|
||||
clientsWithStatus := make([]ClientWithStatus, len(clients))
|
||||
for i, client := range clients {
|
||||
status, err := wireguard.GetClientStatus(client.PublicKey)
|
||||
if err != nil {
|
||||
status = wireguard.StatusDisconnected
|
||||
status := wireguard.StatusDisconnected
|
||||
quality := ""
|
||||
|
||||
// Find matching peer status
|
||||
for _, peerStatus := range peerStatuses {
|
||||
if peerStatus.PublicKey == client.PublicKey {
|
||||
status = peerStatus.Status
|
||||
quality = peerStatus.Quality
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
clientsWithStatus[i] = ClientWithStatus{
|
||||
Client: client,
|
||||
Status: status,
|
||||
Client: client,
|
||||
Status: status,
|
||||
Quality: quality,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -281,8 +298,11 @@ func (s *ListScreen) applyFilter() {
|
||||
}
|
||||
|
||||
// formatStatusWithIcon formats the status with a colored circle icon
|
||||
func (s *ListScreen) formatStatusWithIcon(status string) string {
|
||||
func (s *ListScreen) formatStatusWithIcon(status string, quality string) string {
|
||||
if status == wireguard.StatusConnected {
|
||||
if quality != "" {
|
||||
return lipgloss.NewStyle().Foreground(lipgloss.Color("46")).Render("●") + " " + status + " (" + quality + ")"
|
||||
}
|
||||
return lipgloss.NewStyle().Foreground(lipgloss.Color("46")).Render("●") + " " + status
|
||||
}
|
||||
return lipgloss.NewStyle().Foreground(lipgloss.Color("196")).Render("●") + " " + status
|
||||
@@ -305,11 +325,30 @@ func (s *ListScreen) buildTable() {
|
||||
|
||||
var rows []table.Row
|
||||
for _, cws := range displayClients {
|
||||
statusText := s.formatStatusWithIcon(cws.Status)
|
||||
// Apply highlighting based on filter type
|
||||
name := cws.Client.Name
|
||||
ipv4 := cws.Client.IPv4
|
||||
ipv6 := cws.Client.IPv6
|
||||
status := cws.Status
|
||||
|
||||
if s.search.IsActive() {
|
||||
switch s.search.GetFilterType() {
|
||||
case components.FilterByName:
|
||||
name = s.search.HighlightMatches(name)
|
||||
case components.FilterByIPv4:
|
||||
ipv4 = s.search.HighlightMatches(ipv4)
|
||||
case components.FilterByIPv6:
|
||||
ipv6 = s.search.HighlightMatches(ipv6)
|
||||
case components.FilterByStatus:
|
||||
status = s.search.HighlightMatches(status)
|
||||
}
|
||||
}
|
||||
|
||||
statusText := s.formatStatusWithIcon(status, "")
|
||||
row := table.Row{
|
||||
cws.Client.Name,
|
||||
cws.Client.IPv4,
|
||||
cws.Client.IPv6,
|
||||
name,
|
||||
ipv4,
|
||||
ipv6,
|
||||
statusText,
|
||||
}
|
||||
rows = append(rows, row)
|
||||
|
||||
Reference in New Issue
Block a user