diff options
Diffstat (limited to 'internal/app')
| -rw-r--r-- | internal/app/model.go | 10 | ||||
| -rw-r--r-- | internal/app/update.go | 82 | ||||
| -rw-r--r-- | internal/app/view.go | 17 |
3 files changed, 109 insertions, 0 deletions
diff --git a/internal/app/model.go b/internal/app/model.go index 90cfecf..0bfdba0 100644 --- a/internal/app/model.go +++ b/internal/app/model.go @@ -24,6 +24,7 @@ const ( ModeDeepSearch ModeRename ModeConfirm + ModeReassign ) type ConfirmAction int @@ -64,6 +65,8 @@ type Model struct { previewSearchQuery string previewSearchMatches []int previewSearchIndex int + reassignInput textinput.Model + reassignAll bool } func NewModel(sessions []claude.Session) Model { @@ -85,12 +88,19 @@ func NewModel(sessions []claude.Session) Model { deepSearchInput.CharLimit = 100 deepSearchInput.Width = 50 + reassignInput := textinput.New() + + reassignInput.Placeholder = "Enter new project path" + reassignInput.CharLimit = 500 + reassignInput.Width = 80 + model := Model{ sessions: sessions, keys: ui.DefaultKeyMap(), searchInput: searchInput, renameInput: renameInput, deepSearchInput: deepSearchInput, + reassignInput: reassignInput, showPreview: false, } diff --git a/internal/app/update.go b/internal/app/update.go index 7e8409e..eaadef9 100644 --- a/internal/app/update.go +++ b/internal/app/update.go @@ -32,6 +32,8 @@ func (m Model) Update(message tea.Msg) (tea.Model, tea.Cmd) { return m.handleRenameMode(typedMessage) case ModeConfirm: return m.handleConfirmMode(typedMessage) + case ModeReassign: + return m.handleReassignMode(typedMessage) default: return m.handleNormalMode(typedMessage) } @@ -198,6 +200,32 @@ func (m Model) handleNormalMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { return m, textinput.Blink } + case key.Matches(keyMessage, m.keys.Reassign): + if len(m.filtered) > 0 { + session := &m.filtered[m.cursor] + + m.reassignInput.SetValue(session.ProjectPath) + m.reassignInput.Focus() + + m.reassignAll = false + m.mode = ModeReassign + + return m, textinput.Blink + } + + case key.Matches(keyMessage, m.keys.ReassignAll): + if len(m.filtered) > 0 { + session := &m.filtered[m.cursor] + + m.reassignInput.SetValue(session.ProjectPath) + m.reassignInput.Focus() + + m.reassignAll = true + m.mode = ModeReassign + + return m, textinput.Blink + } + case key.Matches(keyMessage, m.keys.Clear): if m.tab == TabTrash { m.confirmAction = ConfirmEmptyTrash @@ -382,6 +410,60 @@ func (m Model) handleRenameMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { return m, command } +func (m Model) handleReassignMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { + switch { + case key.Matches(keyMessage, m.keys.Escape): + m.mode = ModeNormal + + m.reassignInput.Blur() + + return m, nil + + case key.Matches(keyMessage, m.keys.Enter): + if len(m.filtered) > 0 { + newPath := m.reassignInput.Value() + + if newPath != "" { + session := m.selectedSession() + + if session != nil { + oldPath := session.ProjectPath + + if m.reassignAll { + count, reassignError := claude.ReassignProjectPath(oldPath, newPath) + + if reassignError != nil { + m.setMessage(fmt.Sprintf("Error: %v", reassignError)) + } else { + m.setMessage(fmt.Sprintf("Reassigned %d sessions", count)) + m.reloadSessions() + } + } else { + if reassignError := claude.ReassignSessionPath(session, newPath); reassignError != nil { + m.setMessage(fmt.Sprintf("Error: %v", reassignError)) + } else { + m.setMessage("Reassigned") + m.reloadSessions() + } + } + } + } + } + + m.mode = ModeNormal + + m.reassignInput.Blur() + + return m, nil + } + + var command tea.Cmd + + m.reassignInput, command = m.reassignInput.Update(keyMessage) + + return m, command +} + func (m Model) handleConfirmMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { switch { case key.Matches(keyMessage, m.keys.Escape), keyMessage.String() == "n", keyMessage.String() == "N": diff --git a/internal/app/view.go b/internal/app/view.go index 48239d2..1c7be10 100644 --- a/internal/app/view.go +++ b/internal/app/view.go @@ -46,6 +46,11 @@ func (m Model) View() string { builder.WriteString("\n") } + if m.mode == ModeReassign { + builder.WriteString(m.renderReassign()) + builder.WriteString("\n") + } + if m.mode == ModeConfirm { builder.WriteString(m.renderConfirm()) builder.WriteString("\n\n") @@ -345,6 +350,16 @@ func (m Model) renderRename() string { return ui.SearchInputStyle.Render("✏️ " + m.renameInput.View()) } +func (m Model) renderReassign() string { + label := "📁 Reassign folder" + + if m.reassignAll { + label = "📁 Reassign ALL sessions with this folder" + } + + return ui.SearchInputStyle.Render(label + ": " + m.reassignInput.View()) +} + func (m Model) renderConfirm() string { var confirmMessage string @@ -471,6 +486,8 @@ func (m Model) renderHelp() string { {"d", "Move to Bin"}, {"u", "Restore from Bin"}, {"c", "Rename session"}, + {"r", "Reassign folder"}, + {"R", "Reassign all with folder"}, {"D", "Empty Bin"}, {"?", "Show help"}, {"q", "Quit"}, |