* 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
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/rivo/tview"
|
|
|
|
"git.warky.dev/wdevs/relspecgo/pkg/models"
|
|
)
|
|
|
|
// SchemaEditor represents the interactive schema editor
|
|
type SchemaEditor struct {
|
|
db *models.Database
|
|
app *tview.Application
|
|
pages *tview.Pages
|
|
loadConfig *LoadConfig
|
|
saveConfig *SaveConfig
|
|
}
|
|
|
|
// NewSchemaEditor creates a new schema editor
|
|
func NewSchemaEditor(db *models.Database) *SchemaEditor {
|
|
return &SchemaEditor{
|
|
db: db,
|
|
app: tview.NewApplication(),
|
|
pages: tview.NewPages(),
|
|
loadConfig: nil,
|
|
saveConfig: nil,
|
|
}
|
|
}
|
|
|
|
// NewSchemaEditorWithConfigs creates a new schema editor with load/save configurations
|
|
func NewSchemaEditorWithConfigs(db *models.Database, loadConfig *LoadConfig, saveConfig *SaveConfig) *SchemaEditor {
|
|
return &SchemaEditor{
|
|
db: db,
|
|
app: tview.NewApplication(),
|
|
pages: tview.NewPages(),
|
|
loadConfig: loadConfig,
|
|
saveConfig: saveConfig,
|
|
}
|
|
}
|
|
|
|
// Run starts the interactive editor
|
|
func (se *SchemaEditor) Run() error {
|
|
// If no database is loaded, show load screen
|
|
if se.db == nil {
|
|
se.showLoadScreen()
|
|
} else {
|
|
// Create main menu view
|
|
mainMenu := se.createMainMenu()
|
|
se.pages.AddPage("main", mainMenu, true, true)
|
|
}
|
|
|
|
// Run the application
|
|
if err := se.app.SetRoot(se.pages, true).Run(); err != nil {
|
|
return fmt.Errorf("application error: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetDatabase returns the current database
|
|
func (se *SchemaEditor) GetDatabase() *models.Database {
|
|
return se.db
|
|
}
|
|
|
|
// Helper function to get sorted column names
|
|
func getColumnNames(table *models.Table) []string {
|
|
names := make([]string, 0, len(table.Columns))
|
|
for name := range table.Columns {
|
|
names = append(names, name)
|
|
}
|
|
return names
|
|
}
|