* Add schema management screen with list and editor * Implement table management screen with list and editor * Create data operations for schema and table management * Define UI rules and guidelines for consistency * Ensure circular tab navigation and keyboard shortcuts * Add forms for creating and editing schemas and tables * Implement confirmation dialogs for destructive actions
140 lines
4.2 KiB
Go
140 lines
4.2 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
)
|
|
|
|
// showExitConfirmation shows a confirmation dialog when trying to exit without saving
|
|
func (se *SchemaEditor) showExitConfirmation(pageToRemove, pageToSwitchTo string) {
|
|
modal := tview.NewModal().
|
|
SetText("Exit without saving changes?").
|
|
AddButtons([]string{"Cancel", "No, exit without saving"}).
|
|
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
if buttonLabel == "No, exit without saving" {
|
|
se.pages.RemovePage(pageToRemove)
|
|
se.pages.SwitchToPage(pageToSwitchTo)
|
|
}
|
|
se.pages.RemovePage("exit-confirm")
|
|
})
|
|
|
|
modal.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == tcell.KeyEscape {
|
|
se.pages.RemovePage("exit-confirm")
|
|
return nil
|
|
}
|
|
return event
|
|
})
|
|
|
|
se.pages.AddPage("exit-confirm", modal, true, true)
|
|
}
|
|
|
|
// showExitEditorConfirm shows confirmation dialog when trying to exit the entire editor
|
|
func (se *SchemaEditor) showExitEditorConfirm() {
|
|
modal := tview.NewModal().
|
|
SetText("Exit RelSpec Editor? Press ESC again to confirm.").
|
|
AddButtons([]string{"Cancel", "Exit"}).
|
|
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
if buttonLabel == "Exit" {
|
|
se.app.Stop()
|
|
}
|
|
se.pages.RemovePage("exit-editor-confirm")
|
|
})
|
|
|
|
modal.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == tcell.KeyEscape {
|
|
se.app.Stop()
|
|
return nil
|
|
}
|
|
return event
|
|
})
|
|
|
|
se.pages.AddPage("exit-editor-confirm", modal, true, true)
|
|
}
|
|
|
|
// showDeleteSchemaConfirm shows confirmation dialog for schema deletion
|
|
func (se *SchemaEditor) showDeleteSchemaConfirm(schemaIndex int) {
|
|
modal := tview.NewModal().
|
|
SetText(fmt.Sprintf("Delete schema '%s'? This will delete all tables in this schema.",
|
|
se.db.Schemas[schemaIndex].Name)).
|
|
AddButtons([]string{"Cancel", "Delete"}).
|
|
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
if buttonLabel == "Delete" {
|
|
se.DeleteSchema(schemaIndex)
|
|
se.pages.RemovePage("schema-editor")
|
|
se.pages.RemovePage("schemas")
|
|
se.showSchemaList()
|
|
}
|
|
se.pages.RemovePage("confirm-delete-schema")
|
|
})
|
|
|
|
modal.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == tcell.KeyEscape {
|
|
se.pages.RemovePage("confirm-delete-schema")
|
|
return nil
|
|
}
|
|
return event
|
|
})
|
|
|
|
se.pages.AddPage("confirm-delete-schema", modal, true, true)
|
|
}
|
|
|
|
// showDeleteTableConfirm shows confirmation dialog for table deletion
|
|
func (se *SchemaEditor) showDeleteTableConfirm(schemaIndex, tableIndex int) {
|
|
table := se.db.Schemas[schemaIndex].Tables[tableIndex]
|
|
modal := tview.NewModal().
|
|
SetText(fmt.Sprintf("Delete table '%s'? This action cannot be undone.",
|
|
table.Name)).
|
|
AddButtons([]string{"Cancel", "Delete"}).
|
|
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
if buttonLabel == "Delete" {
|
|
se.DeleteTable(schemaIndex, tableIndex)
|
|
schema := se.db.Schemas[schemaIndex]
|
|
se.pages.RemovePage("table-editor")
|
|
se.pages.RemovePage("schema-editor")
|
|
se.showSchemaEditor(schemaIndex, schema)
|
|
}
|
|
se.pages.RemovePage("confirm-delete-table")
|
|
})
|
|
|
|
modal.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == tcell.KeyEscape {
|
|
se.pages.RemovePage("confirm-delete-table")
|
|
return nil
|
|
}
|
|
return event
|
|
})
|
|
|
|
se.pages.AddPage("confirm-delete-table", modal, true, true)
|
|
}
|
|
|
|
// showDeleteColumnConfirm shows confirmation dialog for column deletion
|
|
func (se *SchemaEditor) showDeleteColumnConfirm(schemaIndex, tableIndex int, columnName string) {
|
|
modal := tview.NewModal().
|
|
SetText(fmt.Sprintf("Delete column '%s'? This action cannot be undone.",
|
|
columnName)).
|
|
AddButtons([]string{"Cancel", "Delete"}).
|
|
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
if buttonLabel == "Delete" {
|
|
se.DeleteColumn(schemaIndex, tableIndex, columnName)
|
|
se.pages.RemovePage("column-editor")
|
|
se.pages.RemovePage("confirm-delete-column")
|
|
se.pages.SwitchToPage("table-editor")
|
|
} else {
|
|
se.pages.RemovePage("confirm-delete-column")
|
|
}
|
|
})
|
|
|
|
modal.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == tcell.KeyEscape {
|
|
se.pages.RemovePage("confirm-delete-column")
|
|
return nil
|
|
}
|
|
return event
|
|
})
|
|
|
|
se.pages.AddPage("confirm-delete-column", modal, true, true)
|
|
}
|