- Replace 12-item flat menu with 4-item main menu: Health Check, Export support bundle, Settings, Exit - Add Health Check screen (Lenovo-style): per-component checkboxes (GPU/MEM/DISK/CPU), Quick/Standard/Express modes, Run All, letter hotkeys G/M/S/C/R/A/1/2/3 - Add two-column main screen: left = menu, right = hardware panel with colored PASS/FAIL/CANCEL/N/A status per component; Tab/→ switches focus, Enter opens component detail - Add app.LoadHardwarePanel() + ComponentDetailResult() reading audit JSON and SAT summary.txt files - Move Network/Services/audit actions into Settings submenu - Export: support bundle only (remove separate audit JSON export) - Delete screen_acceptance.go; add screen_health_check.go, screen_settings.go, app/panel.go - Add BMC + CPU stress-ng tests to backlog - Update bible submodule - Rewrite tui_test.go for new screen/action structure Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package tui
|
|
|
|
import (
|
|
"strings"
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
func (m model) handleNetworkMenu() (tea.Model, tea.Cmd) {
|
|
switch m.cursor {
|
|
case 0:
|
|
m.busy = true
|
|
m.busyTitle = "Network status"
|
|
return m, func() tea.Msg {
|
|
result, err := m.app.NetworkStatus()
|
|
return resultMsg{title: result.Title, body: result.Body, err: err, back: screenNetwork}
|
|
}
|
|
case 1:
|
|
m.busy = true
|
|
m.busyTitle = "DHCP all interfaces"
|
|
return m, func() tea.Msg {
|
|
result, err := m.app.DHCPAllResult()
|
|
return resultMsg{title: result.Title, body: result.Body, err: err, back: screenNetwork}
|
|
}
|
|
case 2:
|
|
m.pendingAction = actionDHCPOne
|
|
m.busy = true
|
|
m.busyTitle = "Interfaces"
|
|
return m, func() tea.Msg {
|
|
ifaces, err := m.app.ListInterfaces()
|
|
return interfacesMsg{ifaces: ifaces, err: err}
|
|
}
|
|
case 3:
|
|
m.pendingAction = actionStaticIPv4
|
|
m.busy = true
|
|
m.busyTitle = "Interfaces"
|
|
return m, func() tea.Msg {
|
|
ifaces, err := m.app.ListInterfaces()
|
|
return interfacesMsg{ifaces: ifaces, err: err}
|
|
}
|
|
case 4:
|
|
m.screen = screenSettings
|
|
m.cursor = 0
|
|
return m, nil
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
func (m model) handleInterfacePickMenu() (tea.Model, tea.Cmd) {
|
|
if len(m.interfaces) == 0 {
|
|
return m, resultCmd("interfaces", "No physical interfaces found", nil, screenNetwork)
|
|
}
|
|
m.selectedIface = m.interfaces[m.cursor].Name
|
|
switch m.pendingAction {
|
|
case actionDHCPOne:
|
|
m.busy = true
|
|
m.busyTitle = "DHCP on " + m.selectedIface
|
|
return m, func() tea.Msg {
|
|
result, err := m.app.DHCPOneResult(m.selectedIface)
|
|
return resultMsg{title: result.Title, body: result.Body, err: err, back: screenNetwork}
|
|
}
|
|
case actionStaticIPv4:
|
|
defaults := m.app.DefaultStaticIPv4FormFields(m.selectedIface)
|
|
m.formFields = []formField{
|
|
{Label: "IPv4 address", Value: defaults[0]},
|
|
{Label: "Prefix", Value: defaults[1]},
|
|
{Label: "Gateway", Value: strings.TrimSpace(defaults[2])},
|
|
{Label: "DNS (space-separated)", Value: defaults[3]},
|
|
}
|
|
m.formIndex = 0
|
|
m.screen = screenStaticForm
|
|
return m, nil
|
|
default:
|
|
return m, nil
|
|
}
|
|
}
|