Skip to content

[Phase 1.3] Implement Dialog System with Stack Management #133

@urbantech

Description

@urbantech

Overview

Dialog system is COMPLETELY MISSING. We need modal dialogs for confirmations, inputs, and selections.

What Exists

  • ❌ NO dialog system
  • ❌ NO confirmation dialogs
  • ❌ NO input prompts
  • ❌ NO modal management

Objective

Create a production-ready dialog system similar to VS Crush, with:

  • Dialog stacking (multiple dialogs)
  • Focus management
  • Layer-based rendering
  • Common dialog types

Tasks

1. Create Dialog Manager

// internal/tui/dialogs/manager.go

type DialogModel interface {
    Component
    Sizeable
    Position() (int, int)
    ID() DialogID
}

type DialogManager struct {
    dialogs []DialogModel
    idMap   map[DialogID]int
    width, height int
}

func (d *DialogManager) Open(dialog DialogModel) tea.Cmd
func (d *DialogManager) Close() tea.Cmd
func (d *DialogManager) CloseAll() tea.Cmd
func (d *DialogManager) GetLayers() []*lipgloss.Layer

2. Implement Common Dialog Types

Confirmation Dialog

// internal/tui/dialogs/confirm.go

type ConfirmDialog struct {
    title   string
    message string
    onYes   func() tea.Msg
    onNo    func() tea.Msg
    selected int // 0 = Yes, 1 = No
}

Input Dialog

// internal/tui/dialogs/input.go

type InputDialog struct {
    title       string
    placeholder string
    input       textinput.Model
    onSubmit    func(string) tea.Msg
    onCancel    func() tea.Msg
}

Selection Dialog

// internal/tui/dialogs/select.go

type SelectDialog struct {
    title     string
    items     []SelectItem
    selected  int
    onSelect  func(SelectItem) tea.Msg
    searchable bool
}

3. Dialog Messages

// internal/tui/dialogs/messages.go

type OpenDialogMsg struct {
    Model DialogModel
}

type CloseDialogMsg struct{}

type DialogResultMsg struct {
    DialogID DialogID
    Result   interface{}
}

Deliverables

  • internal/tui/dialogs/manager.go - Dialog stack manager
  • internal/tui/dialogs/confirm.go - Confirmation dialog
  • internal/tui/dialogs/input.go - Text input dialog
  • internal/tui/dialogs/select.go - Selection dialog
  • internal/tui/dialogs/messages.go - Dialog messages
  • internal/tui/dialogs/styles.go - Dialog styling
  • Unit tests for each dialog type
  • Integration test with main model

Files to Update

  • internal/tui/model.go - Add DialogManager field
  • internal/tui/update.go - Handle dialog messages
  • internal/tui/view.go - Render dialog layers
  • internal/cmd/setup.go - Use dialogs for prompts

Example Usage

// Open confirmation dialog
return m, util.CmdHandler(dialogs.OpenDialogMsg{
    Model: dialogs.NewConfirmDialog(
        "Quit?",
        "Are you sure you want to quit?",
        func() tea.Msg { return tea.Quit() },
        func() tea.Msg { return nil },
    ),
})

// Open input dialog
return m, util.CmdHandler(dialogs.OpenDialogMsg{
    Model: dialogs.NewInputDialog(
        "Enter Session Name",
        "My Session",
        func(name string) tea.Msg {
            return CreateSessionMsg{Name: name}
        },
    ),
})

Success Criteria

  • ✅ 3 dialog types working (confirm, input, select)
  • ✅ Dialog stacking works (multiple dialogs)
  • ✅ Focus management correct
  • ✅ ESC closes dialog
  • ✅ No memory leaks

Dependencies

Estimated Effort

4-5 days

Reference

  • Gap Analysis: docs/gap-analysis/BUBBLETEA_UI_UX_GAP_ANALYSIS.md section 4
  • VS Crush Example: vs-crush/internal/tui/components/dialogs/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions