2022-03-23 00:56:33 +00:00
|
|
|
package ui
|
|
|
|
|
|
|
|
import (
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
2022-03-28 10:36:47 +00:00
|
|
|
"github.com/lmika/awstools/internal/common/ui/commandctrl"
|
2022-05-19 00:48:47 +00:00
|
|
|
"github.com/lmika/awstools/internal/common/ui/events"
|
2022-03-23 04:40:31 +00:00
|
|
|
"github.com/lmika/awstools/internal/dynamo-browse/controllers"
|
2022-05-25 22:11:30 +00:00
|
|
|
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/dialogprompt"
|
2022-03-27 22:23:28 +00:00
|
|
|
"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/layout"
|
|
|
|
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/statusandprompt"
|
2022-06-22 01:57:12 +00:00
|
|
|
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/styles"
|
2022-03-27 22:23:28 +00:00
|
|
|
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/tableselect"
|
2022-05-19 00:48:47 +00:00
|
|
|
"github.com/pkg/errors"
|
2022-03-23 00:56:33 +00:00
|
|
|
)
|
|
|
|
|
2022-03-27 22:23:28 +00:00
|
|
|
type Model struct {
|
2022-03-30 10:04:30 +00:00
|
|
|
tableReadController *controllers.TableReadController
|
|
|
|
tableWriteController *controllers.TableWriteController
|
|
|
|
commandController *commandctrl.CommandController
|
|
|
|
statusAndPrompt *statusandprompt.StatusAndPrompt
|
|
|
|
tableSelect *tableselect.Model
|
2022-03-23 00:56:33 +00:00
|
|
|
|
2022-03-30 10:04:30 +00:00
|
|
|
root tea.Model
|
|
|
|
tableView *dynamotableview.Model
|
2022-03-23 00:56:33 +00:00
|
|
|
}
|
|
|
|
|
2022-03-30 10:04:30 +00:00
|
|
|
func NewModel(rc *controllers.TableReadController, wc *controllers.TableWriteController, cc *commandctrl.CommandController) Model {
|
2022-06-22 01:57:12 +00:00
|
|
|
uiStyles := styles.DefaultStyles
|
|
|
|
|
|
|
|
dtv := dynamotableview.New(uiStyles)
|
|
|
|
div := dynamoitemview.New(uiStyles)
|
|
|
|
statusAndPrompt := statusandprompt.New(layout.NewVBox(layout.LastChildFixedAt(17), dtv, div), "", uiStyles.StatusAndPrompt)
|
2022-05-25 22:11:30 +00:00
|
|
|
dialogPrompt := dialogprompt.New(statusAndPrompt)
|
2022-06-27 06:12:17 +00:00
|
|
|
tableSelect := tableselect.New(dialogPrompt, uiStyles)
|
2022-03-23 21:49:09 +00:00
|
|
|
|
2022-03-30 10:04:30 +00:00
|
|
|
cc.AddCommands(&commandctrl.CommandContext{
|
|
|
|
Commands: map[string]commandctrl.Command{
|
|
|
|
"q": commandctrl.NoArgCommand(tea.Quit),
|
|
|
|
"table": func(args []string) tea.Cmd {
|
|
|
|
if len(args) == 0 {
|
|
|
|
return rc.ListTables()
|
|
|
|
} else {
|
|
|
|
return rc.ScanTable(args[0])
|
|
|
|
}
|
|
|
|
},
|
2022-05-19 00:48:47 +00:00
|
|
|
"export": func(args []string) tea.Cmd {
|
|
|
|
if len(args) == 0 {
|
|
|
|
return events.SetError(errors.New("expected filename"))
|
|
|
|
}
|
2022-05-19 00:58:56 +00:00
|
|
|
return rc.ExportCSV(args[0])
|
2022-05-19 00:48:47 +00:00
|
|
|
},
|
2022-03-30 10:55:16 +00:00
|
|
|
"unmark": commandctrl.NoArgCommand(rc.Unmark()),
|
2022-03-30 10:04:30 +00:00
|
|
|
"delete": commandctrl.NoArgCommand(wc.DeleteMarked()),
|
2022-05-25 23:01:39 +00:00
|
|
|
|
|
|
|
// TEMP
|
|
|
|
"new-item": commandctrl.NoArgCommand(wc.NewItem()),
|
2022-06-09 10:33:19 +00:00
|
|
|
"set-s": func(args []string) tea.Cmd {
|
|
|
|
if len(args) == 0 {
|
|
|
|
return events.SetError(errors.New("expected field"))
|
|
|
|
}
|
|
|
|
return wc.SetStringValue(dtv.SelectedItemIndex(), args[0])
|
|
|
|
},
|
2022-07-06 03:03:19 +00:00
|
|
|
"set-n": func(args []string) tea.Cmd {
|
|
|
|
if len(args) == 0 {
|
|
|
|
return events.SetError(errors.New("expected field"))
|
|
|
|
}
|
|
|
|
return wc.SetNumberValue(dtv.SelectedItemIndex(), args[0])
|
|
|
|
},
|
2022-06-03 05:39:12 +00:00
|
|
|
|
2022-05-26 00:17:21 +00:00
|
|
|
"put": func(args []string) tea.Cmd {
|
|
|
|
return wc.PutItem(dtv.SelectedItemIndex())
|
2022-05-25 23:01:39 +00:00
|
|
|
},
|
2022-05-26 01:00:40 +00:00
|
|
|
"touch": func(args []string) tea.Cmd {
|
|
|
|
return wc.TouchItem(dtv.SelectedItemIndex())
|
|
|
|
},
|
|
|
|
"noisy-touch": func(args []string) tea.Cmd {
|
|
|
|
return wc.NoisyTouchItem(dtv.SelectedItemIndex())
|
|
|
|
},
|
2022-03-30 10:04:30 +00:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2022-07-06 03:03:19 +00:00
|
|
|
root := layout.FullScreen(tableSelect)
|
2022-03-23 21:49:09 +00:00
|
|
|
|
2022-03-27 22:23:28 +00:00
|
|
|
return Model{
|
2022-03-30 10:04:30 +00:00
|
|
|
tableReadController: rc,
|
|
|
|
tableWriteController: wc,
|
|
|
|
commandController: cc,
|
|
|
|
statusAndPrompt: statusAndPrompt,
|
|
|
|
tableSelect: tableSelect,
|
|
|
|
root: root,
|
|
|
|
tableView: dtv,
|
2022-03-23 21:49:09 +00:00
|
|
|
}
|
2022-03-23 04:40:31 +00:00
|
|
|
}
|
|
|
|
|
2022-03-27 22:23:28 +00:00
|
|
|
func (m Model) Init() tea.Cmd {
|
2022-03-27 23:19:38 +00:00
|
|
|
return m.tableReadController.Init()
|
2022-03-23 00:56:33 +00:00
|
|
|
}
|
|
|
|
|
2022-03-27 22:23:28 +00:00
|
|
|
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
2022-03-29 04:46:18 +00:00
|
|
|
switch msg := msg.(type) {
|
2022-03-30 10:04:30 +00:00
|
|
|
case controllers.ResultSetUpdated:
|
|
|
|
m.tableView.Refresh()
|
2022-03-29 04:46:18 +00:00
|
|
|
case tea.KeyMsg:
|
|
|
|
if !m.statusAndPrompt.InPrompt() && !m.tableSelect.Visible() {
|
|
|
|
switch msg.String() {
|
2022-03-30 10:04:30 +00:00
|
|
|
case "m":
|
2022-03-30 10:55:16 +00:00
|
|
|
if idx := m.tableView.SelectedItemIndex(); idx >= 0 {
|
|
|
|
return m, m.tableWriteController.ToggleMark(idx)
|
|
|
|
}
|
2022-06-21 03:37:07 +00:00
|
|
|
case "R":
|
2022-03-29 04:46:18 +00:00
|
|
|
return m, m.tableReadController.Rescan()
|
2022-06-21 03:37:07 +00:00
|
|
|
case "?":
|
|
|
|
return m, m.tableReadController.PromptForQuery()
|
2022-03-30 10:55:16 +00:00
|
|
|
case "/":
|
|
|
|
return m, m.tableReadController.Filter()
|
2022-03-29 04:46:18 +00:00
|
|
|
case ":":
|
|
|
|
return m, m.commandController.Prompt()
|
|
|
|
case "ctrl+c", "esc":
|
|
|
|
return m, tea.Quit
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-27 22:23:28 +00:00
|
|
|
var cmd tea.Cmd
|
|
|
|
m.root, cmd = m.root.Update(msg)
|
|
|
|
return m, cmd
|
2022-03-23 00:56:33 +00:00
|
|
|
}
|
|
|
|
|
2022-03-27 22:23:28 +00:00
|
|
|
func (m Model) View() string {
|
|
|
|
return m.root.View()
|
2022-03-23 00:56:33 +00:00
|
|
|
}
|