Skip to content

Fix multi-table pager display #551

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

Merged
merged 2 commits into from
Jan 10, 2025
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
17 changes: 9 additions & 8 deletions internal/cmd/beta/server/describe/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ func outputResult(p *print.Printer, model *inputModel, server *iaas.Server) erro

return nil
default:
content := []tables.Table{}

table := tables.NewTable()
table.SetTitle("Server")

Expand Down Expand Up @@ -182,10 +184,7 @@ func outputResult(p *print.Printer, model *inputModel, server *iaas.Server) erro
table.AddSeparator()
}

err := table.Display(p)
if err != nil {
return fmt.Errorf("render table: %w", err)
}
content = append(content, table)

if server.Nics != nil && len(*server.Nics) > 0 {
nicsTable := tables.NewTable()
Expand All @@ -201,10 +200,12 @@ func outputResult(p *print.Printer, model *inputModel, server *iaas.Server) erro
nicsTable.AddSeparator()
}

err := nicsTable.Display(p)
if err != nil {
return fmt.Errorf("render table: %w", err)
}
content = append(content, nicsTable)
}

err := tables.DisplayTables(p, content)
if err != nil {
return fmt.Errorf("render table: %w", err)
}

return nil
Expand Down
92 changes: 34 additions & 58 deletions internal/cmd/beta/sqlserverflex/options/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,120 +300,96 @@ func outputResult(p *print.Printer, model *inputModel, flavors *sqlserverflex.Li
}

func outputResultAsTable(p *print.Printer, model *inputModel, options *options) error {
content := ""
if model.Flavors {
content += renderFlavors(*options.Flavors)
content := []tables.Table{}
if model.Flavors && len(*options.Flavors) != 0 {
content = append(content, buildFlavorsTable(*options.Flavors))
}
if model.Versions {
content += renderVersions(*options.Versions)
if model.Versions && len(*options.Versions) != 0 {
content = append(content, buildVersionsTable(*options.Versions))
}
if model.Storages {
content += renderStorages(options.Storages.Storages)
if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) != 0 {
content = append(content, buildStoragesTable(*options.Storages.Storages))
}
if model.UserRoles {
content += renderUserRoles(options.UserRoles)
if model.UserRoles && len(options.UserRoles.UserRoles) != 0 {
content = append(content, buildUserRoles(options.UserRoles))
}
if model.DBCompatibilities {
content += renderDBCompatibilities(options.DBCompatibilities)
if model.DBCompatibilities && len(options.DBCompatibilities.DBCompatibilities) != 0 {
content = append(content, buildDBCompatibilitiesTable(options.DBCompatibilities.DBCompatibilities))
}
// Rendered at last because table is very long
if model.DBCollations {
content += renderDBCollations(options.DBCollations)
if model.DBCollations && len(options.DBCollations.DBCollations) != 0 {
content = append(content, buildDBCollationsTable(options.DBCollations.DBCollations))
}

err := p.PagerDisplay(content)
err := tables.DisplayTables(p, content)
if err != nil {
return fmt.Errorf("display output: %w", err)
}

return nil
}

func renderFlavors(flavors []sqlserverflex.InstanceFlavorEntry) string {
if len(flavors) == 0 {
return ""
}

func buildFlavorsTable(flavors []sqlserverflex.InstanceFlavorEntry) tables.Table {
table := tables.NewTable()
table.SetTitle("Flavors")
table.SetHeader("ID", "CPU", "MEMORY", "DESCRIPTION", "VALID INSTANCE TYPES")
for i := range flavors {
f := flavors[i]
table.AddRow(*f.Id, *f.Cpu, *f.Memory, *f.Description, *f.Categories)
}
return table.Render()
return table
}

func renderVersions(versions []string) string {
if len(versions) == 0 {
return ""
}

func buildVersionsTable(versions []string) tables.Table {
table := tables.NewTable()
table.SetTitle("Versions")
table.SetHeader("VERSION")
for i := range versions {
v := versions[i]
table.AddRow(v)
}
return table.Render()
return table
}

func renderStorages(resp *sqlserverflex.ListStoragesResponse) string {
if resp.StorageClasses == nil || len(*resp.StorageClasses) == 0 {
return ""
}
storageClasses := *resp.StorageClasses

func buildStoragesTable(storagesResp sqlserverflex.ListStoragesResponse) tables.Table {
storages := *storagesResp.StorageClasses
table := tables.NewTable()
table.SetTitle("Storages")
table.SetHeader("MINIMUM", "MAXIMUM", "STORAGE CLASS")
for i := range storageClasses {
sc := storageClasses[i]
table.AddRow(*resp.StorageRange.Min, *resp.StorageRange.Max, sc)
for i := range storages {
sc := storages[i]
table.AddRow(*storagesResp.StorageRange.Min, *storagesResp.StorageRange.Max, sc)
}
table.EnableAutoMergeOnColumns(1, 2, 3)
return table.Render()
return table
}

func renderUserRoles(roles *instanceUserRoles) string {
if len(roles.UserRoles) == 0 {
return ""
}

func buildUserRoles(roles *instanceUserRoles) tables.Table {
table := tables.NewTable()
table.SetTitle("User Roles")
table.SetHeader("ROLE")
for i := range roles.UserRoles {
table.AddRow(roles.UserRoles[i])
}
return table.Render()
return table
}

func renderDBCollations(dbCollations *instanceDBCollations) string {
if len(dbCollations.DBCollations) == 0 {
return ""
}

func buildDBCollationsTable(dbCollations []sqlserverflex.MssqlDatabaseCollation) tables.Table {
table := tables.NewTable()
table.SetTitle("DB Collations")
table.SetHeader("NAME", "DESCRIPTION")
for i := range dbCollations.DBCollations {
table.AddRow(*dbCollations.DBCollations[i].CollationName, *dbCollations.DBCollations[i].Description)
for i := range dbCollations {
table.AddRow(dbCollations[i].CollationName, dbCollations[i].Description)
}
return table.Render()
return table
}

func renderDBCompatibilities(dbCompatibilities *instanceDBCompatibilities) string {
if len(dbCompatibilities.DBCompatibilities) == 0 {
return ""
}

func buildDBCompatibilitiesTable(dbCompatibilities []sqlserverflex.MssqlDatabaseCompatibility) tables.Table {
table := tables.NewTable()
table.SetTitle("DB Compatibilities")
table.SetHeader("COMPATIBILITY LEVEL", "DESCRIPTION")
for i := range dbCompatibilities.DBCompatibilities {
table.AddRow(*dbCompatibilities.DBCompatibilities[i].CompatibilityLevel, *dbCompatibilities.DBCompatibilities[i].Description)
for i := range dbCompatibilities {
table.AddRow(dbCompatibilities[i].CompatibilityLevel, dbCompatibilities[i].Description)
}
return table.Render()
return table
}
22 changes: 12 additions & 10 deletions internal/cmd/load-balancer/describe/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,25 +121,27 @@ func outputResult(p *print.Printer, outputFormat string, loadBalancer *loadbalan
}

func outputResultAsTable(p *print.Printer, loadBalancer *loadbalancer.LoadBalancer) error {
content := renderLoadBalancer(loadBalancer)
content := []tables.Table{}

content = append(content, buildLoadBalancerTable(loadBalancer))

if loadBalancer.Listeners != nil {
content += renderListeners(*loadBalancer.Listeners)
content = append(content, buildListenersTable(*loadBalancer.Listeners))
}

if loadBalancer.TargetPools != nil {
content += renderTargetPools(*loadBalancer.TargetPools)
content = append(content, buildTargetPoolsTable(*loadBalancer.TargetPools))
}

err := p.PagerDisplay(content)
err := tables.DisplayTables(p, content)
if err != nil {
return fmt.Errorf("display output: %w", err)
}

return nil
}

func renderLoadBalancer(loadBalancer *loadbalancer.LoadBalancer) string {
func buildLoadBalancerTable(loadBalancer *loadbalancer.LoadBalancer) tables.Table {
acl := []string{}
privateAccessOnly := false
if loadBalancer.Options != nil {
Expand Down Expand Up @@ -187,26 +189,26 @@ func renderLoadBalancer(loadBalancer *loadbalancer.LoadBalancer) string {
table.AddRow("ATTACHED NETWORK ID", networkId)
table.AddSeparator()
table.AddRow("ACL", acl)
return table.Render()
return table
}

func renderListeners(listeners []loadbalancer.Listener) string {
func buildListenersTable(listeners []loadbalancer.Listener) tables.Table {
table := tables.NewTable()
table.SetTitle("Listeners")
table.SetHeader("NAME", "PORT", "PROTOCOL", "TARGET POOL")
for i := range listeners {
listener := listeners[i]
table.AddRow(*listener.Name, *listener.Port, *listener.Protocol, *listener.TargetPool)
}
return table.Render()
return table
}

func renderTargetPools(targetPools []loadbalancer.TargetPool) string {
func buildTargetPoolsTable(targetPools []loadbalancer.TargetPool) tables.Table {
table := tables.NewTable()
table.SetTitle("Target Pools")
table.SetHeader("NAME", "PORT", "TARGETS")
for _, targetPool := range targetPools {
table.AddRow(*targetPool.Name, *targetPool.TargetPort, len(*targetPool.Targets))
}
return table.Render()
return table
}
48 changes: 18 additions & 30 deletions internal/cmd/mongodbflex/options/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,68 +206,56 @@ func outputResult(p *print.Printer, model *inputModel, flavors *mongodbflex.List
}

func outputResultAsTable(p *print.Printer, model *inputModel, options *options) error {
content := ""
if model.Flavors {
content += renderFlavors(*options.Flavors)
content := []tables.Table{}
if model.Flavors && len(*options.Flavors) != 0 {
content = append(content, buildFlavorsTable(*options.Flavors))
}
if model.Versions {
content += renderVersions(*options.Versions)
if model.Versions && len(*options.Versions) != 0 {
content = append(content, buildVersionsTable(*options.Versions))
}
if model.Storages {
content += renderStorages(options.Storages.Storages)
if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) == 0 {
content = append(content, buildStoragesTable(*options.Storages.Storages))
}

err := p.PagerDisplay(content)
err := tables.DisplayTables(p, content)
if err != nil {
return fmt.Errorf("display output: %w", err)
}

return nil
}

func renderFlavors(flavors []mongodbflex.HandlersInfraFlavor) string {
if len(flavors) == 0 {
return ""
}

func buildFlavorsTable(flavors []mongodbflex.HandlersInfraFlavor) tables.Table {
table := tables.NewTable()
table.SetTitle("Flavors")
table.SetHeader("ID", "CPU", "MEMORY", "DESCRIPTION", "VALID INSTANCE TYPES")
for i := range flavors {
f := flavors[i]
table.AddRow(*f.Id, *f.Cpu, *f.Memory, *f.Description, *f.Categories)
}
return table.Render()
return table
}

func renderVersions(versions []string) string {
if len(versions) == 0 {
return ""
}

func buildVersionsTable(versions []string) tables.Table {
table := tables.NewTable()
table.SetTitle("Versions")
table.SetHeader("VERSION")
for i := range versions {
v := versions[i]
table.AddRow(v)
}
return table.Render()
return table
}

func renderStorages(resp *mongodbflex.ListStoragesResponse) string {
if resp.StorageClasses == nil || len(*resp.StorageClasses) == 0 {
return ""
}
storageClasses := *resp.StorageClasses

func buildStoragesTable(storagesResp mongodbflex.ListStoragesResponse) tables.Table {
storages := *storagesResp.StorageClasses
table := tables.NewTable()
table.SetTitle("Storages")
table.SetHeader("MINIMUM", "MAXIMUM", "STORAGE CLASS")
for i := range storageClasses {
sc := storageClasses[i]
table.AddRow(*resp.StorageRange.Min, *resp.StorageRange.Max, sc)
for i := range storages {
sc := storages[i]
table.AddRow(*storagesResp.StorageRange.Min, *storagesResp.StorageRange.Max, sc)
}
table.EnableAutoMergeOnColumns(1, 2, 3)
return table.Render()
return table
}
Loading
Loading