Have got the item view working

This commit is contained in:
Leon Mika 2022-03-27 21:43:53 +00:00 committed by GitHub
parent 2638597f42
commit c3d19d5891
4 changed files with 112 additions and 4 deletions

View file

@ -21,6 +21,7 @@ import (
"github.com/lmika/awstools/internal/dynamo-browse/services/tables" "github.com/lmika/awstools/internal/dynamo-browse/services/tables"
"github.com/lmika/awstools/internal/dynamo-browse/ui" "github.com/lmika/awstools/internal/dynamo-browse/ui"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels" "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/dynamoitemview"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/dynamotableview" "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/dynamotableview"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/frame" "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/frame"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout" "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout"
@ -81,7 +82,7 @@ func main() {
layout.NewVBox( layout.NewVBox(
layout.LastChildFixedAt(11), layout.LastChildFixedAt(11),
frame.NewFrame("This is the header", true, dynamotableview.New(tableReadController)), frame.NewFrame("This is the header", true, dynamotableview.New(tableReadController)),
frame.NewFrame("This is another header", false, layout.Model(newTestModel("this is the bottom"))), frame.NewFrame("This is another header", false, dynamoitemview.New()),
), ),
"Hello world", "Hello world",
) )

View file

@ -0,0 +1,8 @@
package dynamoitemview
import "github.com/lmika/awstools/internal/dynamo-browse/models"
type NewItemSelected struct {
ResultSet *models.ResultSet
Item models.Item
}

View file

@ -0,0 +1,89 @@
package dynamoitemview
import (
"fmt"
"strings"
"text/tabwriter"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/lmika/awstools/internal/dynamo-browse/models"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout"
)
type Model struct {
ready bool
viewport viewport.Model
w, h int
// model state
currentResultSet *models.ResultSet
selectedItem models.Item
}
func New() Model {
return Model{
viewport: viewport.New(100, 100),
}
}
func (Model) Init() tea.Cmd {
return nil
}
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case NewItemSelected:
m.currentResultSet = msg.ResultSet
m.selectedItem = msg.Item
m.updateViewportToSelectedMessage()
return m, nil
}
return m, nil
}
func (m Model) View() string {
if !m.ready {
return ""
}
return m.viewport.View()
}
func (m Model) Resize(w, h int) layout.ResizingModel {
m.w, m.h = w, h
if !m.ready {
m.viewport = viewport.New(w, h-1)
m.ready = true
} else {
m.viewport.Width = w
m.viewport.Height = h
}
return m
}
func (m *Model) updateViewportToSelectedMessage() {
if m.selectedItem == nil {
m.viewport.SetContent("")
}
viewportContent := &strings.Builder{}
tabWriter := tabwriter.NewWriter(viewportContent, 0, 1, 1, ' ', 0)
for _, colName := range m.currentResultSet.Columns {
switch colVal := m.selectedItem[colName].(type) {
case nil:
break
case *types.AttributeValueMemberS:
fmt.Fprintf(tabWriter, "%v\tS\t%s\n", colName, colVal.Value)
case *types.AttributeValueMemberN:
fmt.Fprintf(tabWriter, "%v\tN\t%s\n", colName, colVal.Value)
default:
fmt.Fprintf(tabWriter, "%v\t?\t%s\n", colName, "(other)")
}
}
tabWriter.Flush()
m.viewport.Width = m.w
m.viewport.Height = m.h
m.viewport.SetContent(viewportContent.String())
}

View file

@ -5,6 +5,7 @@ import (
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/lmika/awstools/internal/dynamo-browse/controllers" "github.com/lmika/awstools/internal/dynamo-browse/controllers"
"github.com/lmika/awstools/internal/dynamo-browse/models" "github.com/lmika/awstools/internal/dynamo-browse/models"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/dynamoitemview"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout" "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout"
) )
@ -34,16 +35,16 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case controllers.NewResultSet: case controllers.NewResultSet:
m.resultSet = msg.ResultSet m.resultSet = msg.ResultSet
m.updateTable() m.updateTable()
return m, nil return m, m.postSelectedItemChanged
case tea.KeyMsg: case tea.KeyMsg:
switch msg.String() { switch msg.String() {
// Table nav // Table nav
case "i", "up": case "i", "up":
m.table.GoUp() m.table.GoUp()
return m, nil return m, m.postSelectedItemChanged
case "k", "down": case "k", "down":
m.table.GoDown() m.table.GoDown()
return m, nil return m, m.postSelectedItemChanged
// TEMP // TEMP
case "s": case "s":
@ -91,6 +92,15 @@ func (m *Model) selectedItem() (itemTableRow, bool) {
return itemTableRow{}, false return itemTableRow{}, false
} }
func (m *Model) postSelectedItemChanged() tea.Msg {
item, ok := m.selectedItem()
if !ok {
return nil
}
return dynamoitemview.NewItemSelected{ResultSet: item.resultSet, Item: item.item}
}
/* /*
func (m *Model) updateViewportToSelectedMessage() { func (m *Model) updateViewportToSelectedMessage() {
selectedItem, ok := m.selectedItem() selectedItem, ok := m.selectedItem()