mirror of
https://github.com/taigrr/teaqlite.git
synced 2026-04-02 04:59:03 -07:00
cell editing works better
This commit is contained in:
@@ -29,7 +29,12 @@ type (
|
|||||||
RowIndex, ColIndex int
|
RowIndex, ColIndex int
|
||||||
Value string
|
Value string
|
||||||
}
|
}
|
||||||
ExecuteQueryMsg struct{ Query string }
|
ExecuteQueryMsg struct{ Query string }
|
||||||
|
QueryCompletedMsg struct {
|
||||||
|
Results [][]string
|
||||||
|
Columns []string
|
||||||
|
Error error
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Model is the main application model
|
// Model is the main application model
|
||||||
@@ -506,6 +511,9 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
if msg.String() == "ctrl+c" {
|
if msg.String() == "ctrl+c" {
|
||||||
return m, tea.Quit
|
return m, tea.Quit
|
||||||
}
|
}
|
||||||
|
if msg.String() == "ctrl+z" {
|
||||||
|
return m, tea.Suspend
|
||||||
|
}
|
||||||
|
|
||||||
case SwitchToTableListMsg:
|
case SwitchToTableListMsg:
|
||||||
m.currentView = NewTableListModel(m.getSharedData())
|
m.currentView = NewTableListModel(m.getSharedData())
|
||||||
@@ -563,6 +571,13 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
m.err = err
|
m.err = err
|
||||||
}
|
}
|
||||||
return m, func() tea.Msg { return SwitchToRowDetailMsg{msg.RowIndex} }
|
return m, func() tea.Msg { return SwitchToRowDetailMsg{msg.RowIndex} }
|
||||||
|
|
||||||
|
case QueryCompletedMsg:
|
||||||
|
// Forward the query completion to the query model
|
||||||
|
if queryModel, ok := m.currentView.(*QueryModel); ok {
|
||||||
|
queryModel.handleQueryCompletion(msg)
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.err != nil {
|
if m.err != nil {
|
||||||
|
|||||||
@@ -82,14 +82,14 @@ func (m *EditCellModel) View() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
content := TitleStyle.Render(fmt.Sprintf("Edit Cell: %s", columnName)) + "\n\n"
|
content := TitleStyle.Render(fmt.Sprintf("Edit Cell: %s", columnName)) + "\n\n"
|
||||||
|
|
||||||
// Display value with visible cursor
|
// Display value with visible cursor
|
||||||
displayValue := m.value
|
displayValue := m.value
|
||||||
if m.cursor <= len(displayValue) {
|
if m.cursor <= len(displayValue) {
|
||||||
// Insert cursor character at cursor position
|
// Insert cursor character at cursor position
|
||||||
displayValue = displayValue[:m.cursor] + "_" + displayValue[m.cursor:]
|
displayValue = displayValue[:m.cursor] + "_" + displayValue[m.cursor:]
|
||||||
}
|
}
|
||||||
|
|
||||||
content += fmt.Sprintf("Value: %s\n\n", displayValue)
|
content += fmt.Sprintf("Value: %s\n\n", displayValue)
|
||||||
content += HelpStyle.Render("enter: save • esc: cancel")
|
content += HelpStyle.Render("enter: save • esc: cancel")
|
||||||
|
|
||||||
|
|||||||
@@ -221,21 +221,18 @@ func (m *QueryModel) executeQuery() tea.Cmd {
|
|||||||
|
|
||||||
rows, err := m.Shared.DB.Query(modifiedQuery)
|
rows, err := m.Shared.DB.Query(modifiedQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.err = err
|
return QueryCompletedMsg{Error: err}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
// Get column names
|
// Get column names
|
||||||
columns, err := rows.Columns()
|
columns, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m.err = err
|
return QueryCompletedMsg{Error: err}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
m.columns = columns
|
|
||||||
|
|
||||||
// Get results
|
// Get results
|
||||||
m.results = [][]string{}
|
var results [][]string
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
values := make([]any, len(columns))
|
values := make([]any, len(columns))
|
||||||
valuePtrs := make([]any, len(columns))
|
valuePtrs := make([]any, len(columns))
|
||||||
@@ -244,8 +241,7 @@ func (m *QueryModel) executeQuery() tea.Cmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := rows.Scan(valuePtrs...); err != nil {
|
if err := rows.Scan(valuePtrs...); err != nil {
|
||||||
m.err = err
|
return QueryCompletedMsg{Error: err}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
row := make([]string, len(columns))
|
row := make([]string, len(columns))
|
||||||
@@ -256,22 +252,36 @@ func (m *QueryModel) executeQuery() tea.Cmd {
|
|||||||
row[i] = fmt.Sprintf("%v", val)
|
row[i] = fmt.Sprintf("%v", val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.results = append(m.results, row)
|
results = append(results, row)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update shared data for row detail view
|
return QueryCompletedMsg{
|
||||||
m.Shared.FilteredData = m.results
|
Results: results,
|
||||||
m.Shared.Columns = m.columns
|
Columns: columns,
|
||||||
m.Shared.IsQueryResult = true
|
Error: nil,
|
||||||
|
}
|
||||||
m.FocusOnInput = false
|
|
||||||
m.selectedRow = 0
|
|
||||||
m.err = nil
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *QueryModel) handleQueryCompletion(msg QueryCompletedMsg) {
|
||||||
|
if msg.Error != nil {
|
||||||
|
m.err = msg.Error
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m.results = msg.Results
|
||||||
|
m.columns = msg.Columns
|
||||||
|
|
||||||
|
// Update shared data for row detail view
|
||||||
|
m.Shared.FilteredData = m.results
|
||||||
|
m.Shared.Columns = m.columns
|
||||||
|
m.Shared.IsQueryResult = true
|
||||||
|
|
||||||
|
m.FocusOnInput = false
|
||||||
|
m.selectedRow = 0
|
||||||
|
m.err = nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *QueryModel) View() string {
|
func (m *QueryModel) View() string {
|
||||||
var content strings.Builder
|
var content strings.Builder
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,16 @@ func (m *TableDataModel) handleSearchInput(msg tea.KeyMsg) (tea.Model, tea.Cmd)
|
|||||||
|
|
||||||
func (m *TableDataModel) handleNavigation(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
|
func (m *TableDataModel) handleNavigation(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
|
||||||
switch msg.String() {
|
switch msg.String() {
|
||||||
case "q", "esc":
|
case "q":
|
||||||
|
return m, func() tea.Msg { return SwitchToTableListMsg{} }
|
||||||
|
|
||||||
|
case "esc":
|
||||||
|
if m.searchInput != "" {
|
||||||
|
// Clear search filter
|
||||||
|
m.searchInput = ""
|
||||||
|
m.filterData()
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
return m, func() tea.Msg { return SwitchToTableListMsg{} }
|
return m, func() tea.Msg { return SwitchToTableListMsg{} }
|
||||||
|
|
||||||
case "enter":
|
case "enter":
|
||||||
|
|||||||
Reference in New Issue
Block a user