feat: TUI Host Forms (add/edit) - Task 17

- HostFormTab with textinput fields for all host fields
- Add (Ctrl+N) and Edit (Ctrl+E) from host list
- Save to JSON storage, auto-reload on save
- Esc to cancel, navigable form with keyboard
This commit is contained in:
swanadiva
2026-06-23 15:05:08 +07:00
parent 809ac1d2e8
commit 3dc482e353
6 changed files with 440 additions and 11 deletions
+44
View File
@@ -1,9 +1,12 @@
package tui
import (
"context"
tea "github.com/charmbracelet/bubbletea"
"git.tukangketik.id/swanadiva/hostkeeper/internal/models"
"git.tukangketik.id/swanadiva/hostkeeper/pkg/storage"
)
// Screen represents different TUI screens (deprecated, use tabs)
@@ -63,6 +66,47 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
cmd := m.tabs.Add(tab)
return m, cmd
case openHostFormMsg:
var tab Tab
if msg.editing != nil {
tab = NewEditHostFormTab(msg.editing, m.dataDir)
} else {
tab = NewAddHostFormTab(m.dataDir)
}
cmd := m.tabs.Add(tab)
return m, cmd
case closeFormMsg:
if m.tabs.Len() > 1 {
m.tabs.CloseActive()
}
return m, nil
case saveHostResultMsg:
if msg.err != nil {
m.Error = msg.err
return m, nil
}
// Close the form tab, switch back to host list
if m.tabs.Len() > 1 {
m.tabs.CloseActive()
}
// Reload hosts
return m, func() tea.Msg {
store, err := storage.NewJSONStorage(m.dataDir)
if err != nil {
return nil
}
hosts, err := store.ListHosts(context.Background())
if err != nil {
return nil
}
return loadedHostsMsg{hosts: hosts}
}
case loadedHostsMsg:
m.LoadHosts(msg.hosts)
case sessionDoneMsg:
if msg.err != nil {
m.Error = msg.err