aboutsummaryrefslogtreecommitdiff
path: root/internal/app
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app')
-rw-r--r--internal/app/model.go10
-rw-r--r--internal/app/update.go82
-rw-r--r--internal/app/view.go17
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"},