Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: show different keys in secondary pages #109

Merged
merged 2 commits into from
Jan 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions ui/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ type ClusterView struct {

func newClusterView(clusters []types.Cluster, app *App) *ClusterView {
return &ClusterView{
View: *newView(app, ClusterPage, basicKeyInputs),
View: *newView(app, ClusterPage, basicKeyInputs, secondaryPageKeyMap{
JsonPage: jsonPageKeys,
}),
clusters: clusters,
}
}
Expand All @@ -45,9 +47,11 @@ func (app *App) showClustersPage() error {
// Build info pages for cluster page
func (v *ClusterView) infoBuilder() *tview.Pages {
for _, c := range v.clusters {
title := *c.ClusterName
entityName := *c.ClusterArn
items := v.infoPagesParam(c)
infoFlex := v.buildInfoFlex(*c.ClusterName, items, v.keys)
v.infoPages.AddPage(*c.ClusterArn, infoFlex, true, true)

v.buildInfoPages(items, title, entityName)
}
// prevent empty clusters
if len(v.clusters) > 0 && v.clusters[0].ClusterArn != nil {
Expand Down
10 changes: 7 additions & 3 deletions ui/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ func newContainerView(containers []types.Container, app *App) *ContainerView {
{key: "Enter", description: sshContainer},
}...)
return &ContainerView{
View: *newView(app, ContainerPage, keys),
View: *newView(app, ContainerPage, keys, secondaryPageKeyMap{
JsonPage: jsonPageKeys,
}),
containers: containers,
}
}
Expand All @@ -39,9 +41,11 @@ func (app *App) showContainersPage() error {
// Build info pages for container page
func (v *ContainerView) infoBuilder() *tview.Pages {
for _, c := range v.containers {
title := util.ArnToName(c.ContainerArn)
entityName := *c.ContainerArn
items := v.infoPagesParam(c)
infoFlex := v.buildInfoFlex(util.ArnToName(c.ContainerArn), items, v.keys)
v.infoPages.AddPage(*c.ContainerArn, infoFlex, true, true)

v.buildInfoPages(items, title, entityName)
}
// prevent empty containers
if len(v.containers) > 0 && v.containers[0].ContainerArn != nil {
Expand Down
52 changes: 20 additions & 32 deletions ui/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,13 @@ func (v *View) switchToTaskDefinitionJson() {
return
}
taskDefinition := ""
entityName := ""
if v.kind == ServicePage {
taskDefinition = *selected.service.TaskDefinition
entityName = *selected.service.ServiceArn
} else if v.kind == TaskPage {
taskDefinition = *selected.task.TaskDefinitionArn
entityName = *selected.task.TaskArn
} else {
return
}
Expand All @@ -38,7 +41,7 @@ func (v *View) switchToTaskDefinitionJson() {
if err != nil {
return
}
entity := Entity{taskDefinition: &td, entityName: *td.TaskDefinitionArn}
entity := Entity{taskDefinition: &td, entityName: entityName}
v.showJsonPages(entity, "task definition")
}

Expand All @@ -47,57 +50,35 @@ func (v *View) switchToTaskDefinitionRevisionsJson() {
if v.kind == ClusterPage {
return
}
family, _ := v.getTaskDefinitionDetail()
family, _, entityName := v.getTaskDefinitionDetail()

revisions, err := v.app.Store.ListTaskDefinition(&family)
if err != nil {
return
}
entity := Entity{taskDefinitionRevisions: revisions, entityName: family}
entity := Entity{taskDefinitionRevisions: revisions, entityName: entityName}
v.showJsonPages(entity, "revisions")
}

// Get td family
func (v *View) getTaskDefinitionDetail() (string, string) {
func (v *View) getTaskDefinitionDetail() (string, string, string) {
selected, err := v.getCurrentSelection()
if err != nil {
return "", ""
return "", "", ""
}
taskDefinition := ""
entityName := ""
if v.kind == ServicePage {
taskDefinition = *selected.service.TaskDefinition
entityName = *selected.service.ServiceArn
} else if v.kind == TaskPage {
taskDefinition = *selected.task.TaskDefinitionArn
entityName = *selected.task.TaskArn
} else {
return "", ""
return "", "", ""
}
familyRevision := strings.Split(util.ArnToName(&taskDefinition), ":")
return familyRevision[0], familyRevision[1]
}

// Switch to selected service events JSON page
func (v *View) switchToServiceEventsList() {
selected, err := v.getCurrentSelection()
if err != nil {
return
}
if v.kind != ServicePage {
return
}
v.showListPages(selected, "events")
}

// Switch to selected service events JSON page
func (v *View) switchToLogsList() {
if v.kind == ClusterPage || v.kind == ContainerPage {
return
}
selected, err := v.getCurrentSelection()
if err != nil {
return
}
v.secondaryKind = LogsPage
v.showListPages(selected, "logs")
return familyRevision[0], familyRevision[1], entityName
}

// Deprecated
Expand Down Expand Up @@ -153,6 +134,7 @@ func (v *View) switchToAutoScalingJson() {
func (v *View) showJsonPages(entity Entity, which string) {
contentString := v.getJsonString(entity, which)
v.handleContentPageSwitch(entity, which, contentString)
v.handleInfoPageSwitch(entity, JsonPage)
}

func (v *View) handleFullScreenContentInput(event *tcell.EventKey) *tcell.EventKey {
Expand All @@ -173,6 +155,12 @@ func (v *View) handleTableContentDone(key tcell.Key) {
v.secondaryKind = v.kind
pageName := v.kind.getTablePageName(v.getClusterArn())
v.tablePages.SwitchToPage(pageName)

selected, err := v.getCurrentSelection()
if err != nil {
v.back()
}
v.infoPages.SwitchToPage(selected.entityName)
}

func (v *View) handleFullScreenContentDone(key tcell.Key) {
Expand Down
6 changes: 5 additions & 1 deletion ui/json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ import (
)

func TestGetJsonData(t *testing.T) {
view := newView(newApp(), ClusterPage, []KeyInput{})
view := newView(newApp(), ClusterPage, []KeyInput{}, secondaryPageKeyMap{
JsonPage: []KeyInput{
{key: string(fKey), description: toggleFullScreen},
},
})
type input struct {
entity Entity
which string
Expand Down
19 changes: 17 additions & 2 deletions ui/kind.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const (
TaskDefinitionPage
TaskDefinitionRevisionsPage
ServiceEventsPage
LogsPage
LogPage
)

func (k Kind) String() string {
Expand All @@ -32,7 +32,7 @@ func (k Kind) String() string {
return "taskDefinitionRevisions"
case ServiceEventsPage:
return "serviceEvents"
case LogsPage:
case LogPage:
return "logs"
default:
return "unknownKind"
Expand Down Expand Up @@ -91,3 +91,18 @@ func (k Kind) getContentPageName(name string) string {
pageName := k.getAppPageName(name)
return pageName + ".json"
}

type secondaryPageKeyMap = map[Kind][]KeyInput

var jsonPageKeys = []KeyInput{
{key: string(fKey), description: toggleFullScreen},
{key: string(bKey), description: openInBrowser},
{key: back, description: backToPrevious},
}

var logPageKeys = []KeyInput{
{key: string(fKey), description: toggleFullScreen},
{key: string(bKey), description: openInBrowser},
{key: ctrlR, description: reloadResource},
{key: back, description: backToPrevious},
}
26 changes: 26 additions & 0 deletions ui/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const (
func (v *View) showListPages(entity Entity, which string) {
contentString := v.getListString(entity, which)
v.handleContentPageSwitch(entity, which, contentString)
v.handleInfoPageSwitch(entity, LogPage)
}

// Based on current entity return list string as content
Expand Down Expand Up @@ -55,3 +56,28 @@ func (v *View) getListString(entity Entity, which string) string {

return contentString
}

// Switch to selected service events JSON page
func (v *View) switchToServiceEventsList() {
selected, err := v.getCurrentSelection()
if err != nil {
return
}
if v.kind != ServicePage {
return
}
v.showListPages(selected, "events")
}

// Switch to selected service events JSON page
func (v *View) switchToLogsList() {
if v.kind == ClusterPage || v.kind == ContainerPage {
return
}
selected, err := v.getCurrentSelection()
if err != nil {
return
}
v.secondaryKind = LogPage
v.showListPages(selected, "logs")
}
2 changes: 1 addition & 1 deletion ui/modal.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ func (v *View) serviceUpdateContent() (*tview.Form, string) {
}

title := " Update [purple::b]" + name + readonly
currentFamily, currentRevision := v.getTaskDefinitionDetail()
currentFamily, currentRevision, _ := v.getTaskDefinitionDetail()

// get data for form
families, err := v.app.Store.ListTaskDefinitionFamilies()
Expand Down
11 changes: 8 additions & 3 deletions ui/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ func newServiceView(services []types.Service, app *App) *ServiceView {
{key: string(lKey), description: showLogs},
}...)
return &ServiceView{
View: *newView(app, ServicePage, keys),
View: *newView(app, ServicePage, keys, secondaryPageKeyMap{
JsonPage: jsonPageKeys,
LogPage: logPageKeys,
}),
services: services,
}
}
Expand All @@ -53,9 +56,11 @@ func (app *App) showServicesPage() error {
// Build info pages for service page
func (v *ServiceView) infoBuilder() *tview.Pages {
for _, s := range v.services {
title := *s.ServiceName
entityName := *s.ServiceArn
items := v.infoPagesParam(s)
infoFlex := v.buildInfoFlex(*s.ServiceName, items, v.keys)
v.infoPages.AddPage(*s.ServiceArn, infoFlex, true, true)

v.buildInfoPages(items, title, entityName)
}
// prevent empty services
if len(v.services) > 0 && v.services[0].ServiceArn != nil {
Expand Down
11 changes: 8 additions & 3 deletions ui/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ func newTaskView(tasks []types.Task, app *App) *TaskView {
{key: string(lKey), description: showLogs},
}...)
return &TaskView{
View: *newView(app, TaskPage, keys),
View: *newView(app, TaskPage, keys, secondaryPageKeyMap{
JsonPage: jsonPageKeys,
LogPage: logPageKeys,
}),
tasks: tasks,
}
}
Expand All @@ -50,9 +53,11 @@ func (app *App) showTasksPages() error {
// Build info pages for task page
func (v *TaskView) infoBuilder() *tview.Pages {
for _, t := range v.tasks {
title := util.ArnToName(t.TaskArn)
entityName := *t.TaskArn
items := v.infoPagesParam(t)
infoFlex := v.buildInfoFlex(util.ArnToName(t.TaskArn), items, v.keys)
v.infoPages.AddPage(*t.TaskArn, infoFlex, true, true)

v.buildInfoPages(items, title, entityName)
}
// prevent empty tasks
if len(v.tasks) > 0 && v.tasks[0].TaskArn != nil {
Expand Down
23 changes: 20 additions & 3 deletions ui/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const (
openInBrowser = "Open in browser"
sshContainer = "SSH container"
toggleFullScreen = "Content Toggle full screen"
backToPrevious = "back"

shell = "/bin/sh"
awsCli = "aws"
Expand All @@ -59,6 +60,7 @@ const (
vKey = 'v'
wKey = 'w'
ctrlR = "ctrl-r"
back = "esc"

upperLowerDiff = rune(32)
)
Expand All @@ -67,7 +69,6 @@ var basicKeyInputs = []KeyInput{
{key: string(bKey), description: openInBrowser},
{key: string(dKey), description: describe},
{key: ctrlR, description: reloadResource},
{key: string(fKey), description: toggleFullScreen},
}

// Keyboard key and description
Expand All @@ -92,9 +93,10 @@ type View struct {
secondaryKind Kind
keys []KeyInput
footer *Footer
pageKeyMap secondaryPageKeyMap
}

func newView(app *App, kind Kind, keys []KeyInput) *View {
func newView(app *App, kind Kind, keys []KeyInput, pageKeys secondaryPageKeyMap) *View {
return &View{
app: app,
infoPages: tview.NewPages(),
Expand All @@ -103,6 +105,7 @@ func newView(app *App, kind Kind, keys []KeyInput) *View {
keys: keys,
kind: kind,
footer: newFooter(),
pageKeyMap: pageKeys,
}
}

Expand Down Expand Up @@ -201,7 +204,7 @@ func (v *View) reloadResource() error {

func (v *View) showKindPage(k Kind) error {
switch v.secondaryKind {
case LogsPage:
case LogPage:
v.switchToLogsList()
return nil
}
Expand Down Expand Up @@ -301,6 +304,10 @@ func (v *View) handleContentPageSwitch(entity Entity, which string, contentStrin
v.tablePages.AddPage(contentPageName, contentTextItem, true, true)
}

func (v *View) handleInfoPageSwitch(entity Entity, kind Kind) {
v.infoPages.SwitchToPage(fmt.Sprintf("%s.%s", entity.entityName, kind))
}

func getContentTextItem(contentStr string, title string) *tview.TextView {
contentText := tview.NewTextView().SetDynamicColors(true).SetText(contentStr)
contentText.SetBorder(true).SetTitle(title).SetBorderPadding(0, 0, 1, 1)
Expand Down Expand Up @@ -352,3 +359,13 @@ func (v *View) ssh(containerName string) {
close(interrupt)
})
}

func (v *View) buildInfoPages(items []InfoItem, title, entityName string) {
infoFlex := v.buildInfoFlex(title, items, v.keys)
v.infoPages.AddPage(entityName, infoFlex, true, true)

for p, k := range v.pageKeyMap {
infoJsonFlex := v.buildInfoFlex(title, items, k)
v.infoPages.AddPage(fmt.Sprintf("%s.%s", entityName, p), infoJsonFlex, true, false)
}
}