feat: TUI Key & Snippet Management - Task 19

- KeyListTab: view/add/edit/delete SSH keys (Ctrl+K from host list)
- KeyFormTab: add/edit key form with name, type, private key, passphrase
- SnippetListTab: view/add/edit/delete snippets (Ctrl+P from host list)
- SnippetFormTab: add/edit snippet form with name, command, description, tags
- Updated status bar with new hints
- Save/delete commands for both key pairs and snippets
This commit is contained in:
swanadiva
2026-06-23 15:10:20 +07:00
parent 94ec00c303
commit 43858dda87
8 changed files with 1029 additions and 1 deletions
+63
View File
@@ -81,6 +81,36 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
cmd := m.tabs.Add(tab)
return m, cmd
case openKeyListMsg:
tab := NewKeyListTab(m.dataDir)
cmd := m.tabs.Add(tab)
return m, cmd
case openSnippetListMsg:
tab := NewSnippetListTab(m.dataDir)
cmd := m.tabs.Add(tab)
return m, cmd
case openKeyFormMsg:
var tab Tab
if msg.editing != nil {
tab = NewEditKeyFormTab(msg.editing, m.dataDir)
} else {
tab = NewAddKeyFormTab(m.dataDir)
}
cmd := m.tabs.Add(tab)
return m, cmd
case openSnippetFormMsg:
var tab Tab
if msg.editing != nil {
tab = NewEditSnippetFormTab(msg.editing, m.dataDir)
} else {
tab = NewAddSnippetFormTab(m.dataDir)
}
cmd := m.tabs.Add(tab)
return m, cmd
case closeFormMsg:
if m.tabs.Len() > 1 {
m.tabs.CloseActive()
@@ -112,6 +142,39 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case loadedHostsMsg:
m.LoadHosts(msg.hosts)
case saveKeyResultMsg:
if msg.err != nil {
m.Error = msg.err
return m, nil
}
// Close form tab and return to list (which auto-refreshes via Init)
if m.tabs.Len() > 1 {
m.tabs.CloseActive()
}
return m, nil
case deleteKeyResultMsg:
if msg.err != nil {
m.Error = msg.err
}
return m, nil
case saveSnippetResultMsg:
if msg.err != nil {
m.Error = msg.err
return m, nil
}
if m.tabs.Len() > 1 {
m.tabs.CloseActive()
}
return m, nil
case deleteSnippetResultMsg:
if msg.err != nil {
m.Error = msg.err
}
return m, nil
case sessionDoneMsg:
if msg.err != nil {
m.Error = msg.err