mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
feat(cli): preserve table column order (#16843)
Fixes: https://github.com/coder/coder/issues/16055
This commit is contained in:
@ -31,10 +31,33 @@ func Table() table.Writer {
|
|||||||
// e.g. `[]any{someRow, TableSeparator, someRow}`
|
// e.g. `[]any{someRow, TableSeparator, someRow}`
|
||||||
type TableSeparator struct{}
|
type TableSeparator struct{}
|
||||||
|
|
||||||
// filterTableColumns returns configurations to hide columns
|
// filterHeaders filters the headers to only include the columns
|
||||||
|
// that are provided in the array. If the array is empty, all
|
||||||
|
// headers are included.
|
||||||
|
func filterHeaders(header table.Row, columns []string) table.Row {
|
||||||
|
if len(columns) == 0 {
|
||||||
|
return header
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredHeaders := make(table.Row, len(columns))
|
||||||
|
for i, column := range columns {
|
||||||
|
column = strings.ReplaceAll(column, "_", " ")
|
||||||
|
|
||||||
|
for _, headerTextRaw := range header {
|
||||||
|
headerText, _ := headerTextRaw.(string)
|
||||||
|
if strings.EqualFold(column, headerText) {
|
||||||
|
filteredHeaders[i] = headerText
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filteredHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
// createColumnConfigs returns configuration to hide columns
|
||||||
// that are not provided in the array. If the array is empty,
|
// that are not provided in the array. If the array is empty,
|
||||||
// no filtering will occur!
|
// no filtering will occur!
|
||||||
func filterTableColumns(header table.Row, columns []string) []table.ColumnConfig {
|
func createColumnConfigs(header table.Row, columns []string) []table.ColumnConfig {
|
||||||
if len(columns) == 0 {
|
if len(columns) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -157,10 +180,13 @@ func DisplayTable(out any, sort string, filterColumns []string) (string, error)
|
|||||||
func renderTable(out any, sort string, headers table.Row, filterColumns []string) (string, error) {
|
func renderTable(out any, sort string, headers table.Row, filterColumns []string) (string, error) {
|
||||||
v := reflect.Indirect(reflect.ValueOf(out))
|
v := reflect.Indirect(reflect.ValueOf(out))
|
||||||
|
|
||||||
|
headers = filterHeaders(headers, filterColumns)
|
||||||
|
columnConfigs := createColumnConfigs(headers, filterColumns)
|
||||||
|
|
||||||
// Setup the table formatter.
|
// Setup the table formatter.
|
||||||
tw := Table()
|
tw := Table()
|
||||||
tw.AppendHeader(headers)
|
tw.AppendHeader(headers)
|
||||||
tw.SetColumnConfigs(filterTableColumns(headers, filterColumns))
|
tw.SetColumnConfigs(columnConfigs)
|
||||||
if sort != "" {
|
if sort != "" {
|
||||||
tw.SortBy([]table.SortBy{{
|
tw.SortBy([]table.SortBy{{
|
||||||
Name: sort,
|
Name: sort,
|
||||||
|
@ -41,7 +41,7 @@ func (r *RootCmd) provisionerJobsList() *serpent.Command {
|
|||||||
client = new(codersdk.Client)
|
client = new(codersdk.Client)
|
||||||
orgContext = NewOrganizationContext()
|
orgContext = NewOrganizationContext()
|
||||||
formatter = cliui.NewOutputFormatter(
|
formatter = cliui.NewOutputFormatter(
|
||||||
cliui.TableFormat([]provisionerJobRow{}, []string{"created at", "id", "organization", "status", "type", "queue", "tags"}),
|
cliui.TableFormat([]provisionerJobRow{}, []string{"created at", "id", "type", "template display name", "status", "queue", "tags"}),
|
||||||
cliui.JSONFormat(),
|
cliui.JSONFormat(),
|
||||||
)
|
)
|
||||||
status []string
|
status []string
|
||||||
|
@ -36,7 +36,7 @@ func (r *RootCmd) provisionerList() *serpent.Command {
|
|||||||
client = new(codersdk.Client)
|
client = new(codersdk.Client)
|
||||||
orgContext = NewOrganizationContext()
|
orgContext = NewOrganizationContext()
|
||||||
formatter = cliui.NewOutputFormatter(
|
formatter = cliui.NewOutputFormatter(
|
||||||
cliui.TableFormat([]provisionerDaemonRow{}, []string{"name", "organization", "status", "key name", "created at", "last seen at", "version", "tags"}),
|
cliui.TableFormat([]provisionerDaemonRow{}, []string{"created at", "last seen at", "key name", "name", "version", "status", "tags"}),
|
||||||
cliui.JSONFormat(),
|
cliui.JSONFormat(),
|
||||||
)
|
)
|
||||||
limit int64
|
limit int64
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
ID CREATED AT STATUS TAGS TYPE ORGANIZATION QUEUE
|
CREATED AT ID TYPE TEMPLATE DISPLAY NAME STATUS QUEUE TAGS
|
||||||
==========[version job ID]========== ====[timestamp]===== succeeded map[owner: scope:organization] template_version_import Coder
|
====[timestamp]===== ==========[version job ID]========== template_version_import succeeded map[owner: scope:organization]
|
||||||
======[workspace build job ID]====== ====[timestamp]===== succeeded map[owner: scope:organization] workspace_build Coder
|
====[timestamp]===== ======[workspace build job ID]====== workspace_build succeeded map[owner: scope:organization]
|
||||||
|
@ -11,7 +11,7 @@ OPTIONS:
|
|||||||
-O, --org string, $CODER_ORGANIZATION
|
-O, --org string, $CODER_ORGANIZATION
|
||||||
Select which organization (uuid or name) to use.
|
Select which organization (uuid or name) to use.
|
||||||
|
|
||||||
-c, --column [id|created at|started at|completed at|canceled at|error|error code|status|worker id|file id|tags|queue position|queue size|organization id|template version id|workspace build id|type|available workers|template version name|template id|template name|template display name|template icon|workspace id|workspace name|organization|queue] (default: created at,id,organization,status,type,queue,tags)
|
-c, --column [id|created at|started at|completed at|canceled at|error|error code|status|worker id|file id|tags|queue position|queue size|organization id|template version id|workspace build id|type|available workers|template version name|template id|template name|template display name|template icon|workspace id|workspace name|organization|queue] (default: created at,id,type,template display name,status,queue,tags)
|
||||||
Columns to display in table output.
|
Columns to display in table output.
|
||||||
|
|
||||||
-l, --limit int, $CODER_PROVISIONER_JOB_LIST_LIMIT (default: 50)
|
-l, --limit int, $CODER_PROVISIONER_JOB_LIST_LIMIT (default: 50)
|
||||||
|
4
cli/testdata/coder_provisioner_list.golden
vendored
4
cli/testdata/coder_provisioner_list.golden
vendored
@ -1,2 +1,2 @@
|
|||||||
CREATED AT LAST SEEN AT NAME VERSION TAGS KEY NAME STATUS ORGANIZATION
|
CREATED AT LAST SEEN AT KEY NAME NAME VERSION STATUS TAGS
|
||||||
====[timestamp]===== ====[timestamp]===== test v0.0.0-devel map[owner: scope:organization] built-in idle Coder
|
====[timestamp]===== ====[timestamp]===== built-in test v0.0.0-devel idle map[owner: scope:organization]
|
||||||
|
@ -11,7 +11,7 @@ OPTIONS:
|
|||||||
-O, --org string, $CODER_ORGANIZATION
|
-O, --org string, $CODER_ORGANIZATION
|
||||||
Select which organization (uuid or name) to use.
|
Select which organization (uuid or name) to use.
|
||||||
|
|
||||||
-c, --column [id|organization id|created at|last seen at|name|version|api version|tags|key name|status|current job id|current job status|current job template name|current job template icon|current job template display name|previous job id|previous job status|previous job template name|previous job template icon|previous job template display name|organization] (default: name,organization,status,key name,created at,last seen at,version,tags)
|
-c, --column [id|organization id|created at|last seen at|name|version|api version|tags|key name|status|current job id|current job status|current job template name|current job template icon|current job template display name|previous job id|previous job status|previous job template name|previous job template icon|previous job template display name|organization] (default: created at,last seen at,key name,name,version,status,tags)
|
||||||
Columns to display in table output.
|
Columns to display in table output.
|
||||||
|
|
||||||
-l, --limit int, $CODER_PROVISIONER_LIST_LIMIT (default: 50)
|
-l, --limit int, $CODER_PROVISIONER_LIST_LIMIT (default: 50)
|
||||||
|
2
docs/reference/cli/provisioner_jobs_list.md
generated
2
docs/reference/cli/provisioner_jobs_list.md
generated
@ -48,7 +48,7 @@ Select which organization (uuid or name) to use.
|
|||||||
| | |
|
| | |
|
||||||
|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Type | <code>[id\|created at\|started at\|completed at\|canceled at\|error\|error code\|status\|worker id\|file id\|tags\|queue position\|queue size\|organization id\|template version id\|workspace build id\|type\|available workers\|template version name\|template id\|template name\|template display name\|template icon\|workspace id\|workspace name\|organization\|queue]</code> |
|
| Type | <code>[id\|created at\|started at\|completed at\|canceled at\|error\|error code\|status\|worker id\|file id\|tags\|queue position\|queue size\|organization id\|template version id\|workspace build id\|type\|available workers\|template version name\|template id\|template name\|template display name\|template icon\|workspace id\|workspace name\|organization\|queue]</code> |
|
||||||
| Default | <code>created at,id,organization,status,type,queue,tags</code> |
|
| Default | <code>created at,id,type,template display name,status,queue,tags</code> |
|
||||||
|
|
||||||
Columns to display in table output.
|
Columns to display in table output.
|
||||||
|
|
||||||
|
2
docs/reference/cli/provisioner_list.md
generated
2
docs/reference/cli/provisioner_list.md
generated
@ -39,7 +39,7 @@ Select which organization (uuid or name) to use.
|
|||||||
| | |
|
| | |
|
||||||
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Type | <code>[id\|organization id\|created at\|last seen at\|name\|version\|api version\|tags\|key name\|status\|current job id\|current job status\|current job template name\|current job template icon\|current job template display name\|previous job id\|previous job status\|previous job template name\|previous job template icon\|previous job template display name\|organization]</code> |
|
| Type | <code>[id\|organization id\|created at\|last seen at\|name\|version\|api version\|tags\|key name\|status\|current job id\|current job status\|current job template name\|current job template icon\|current job template display name\|previous job id\|previous job status\|previous job template name\|previous job template icon\|previous job template display name\|organization]</code> |
|
||||||
| Default | <code>name,organization,status,key name,created at,last seen at,version,tags</code> |
|
| Default | <code>created at,last seen at,key name,name,version,status,tags</code> |
|
||||||
|
|
||||||
Columns to display in table output.
|
Columns to display in table output.
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ OPTIONS:
|
|||||||
-O, --org string, $CODER_ORGANIZATION
|
-O, --org string, $CODER_ORGANIZATION
|
||||||
Select which organization (uuid or name) to use.
|
Select which organization (uuid or name) to use.
|
||||||
|
|
||||||
-c, --column [id|created at|started at|completed at|canceled at|error|error code|status|worker id|file id|tags|queue position|queue size|organization id|template version id|workspace build id|type|available workers|template version name|template id|template name|template display name|template icon|workspace id|workspace name|organization|queue] (default: created at,id,organization,status,type,queue,tags)
|
-c, --column [id|created at|started at|completed at|canceled at|error|error code|status|worker id|file id|tags|queue position|queue size|organization id|template version id|workspace build id|type|available workers|template version name|template id|template name|template display name|template icon|workspace id|workspace name|organization|queue] (default: created at,id,type,template display name,status,queue,tags)
|
||||||
Columns to display in table output.
|
Columns to display in table output.
|
||||||
|
|
||||||
-l, --limit int, $CODER_PROVISIONER_JOB_LIST_LIMIT (default: 50)
|
-l, --limit int, $CODER_PROVISIONER_JOB_LIST_LIMIT (default: 50)
|
||||||
|
@ -11,7 +11,7 @@ OPTIONS:
|
|||||||
-O, --org string, $CODER_ORGANIZATION
|
-O, --org string, $CODER_ORGANIZATION
|
||||||
Select which organization (uuid or name) to use.
|
Select which organization (uuid or name) to use.
|
||||||
|
|
||||||
-c, --column [id|organization id|created at|last seen at|name|version|api version|tags|key name|status|current job id|current job status|current job template name|current job template icon|current job template display name|previous job id|previous job status|previous job template name|previous job template icon|previous job template display name|organization] (default: name,organization,status,key name,created at,last seen at,version,tags)
|
-c, --column [id|organization id|created at|last seen at|name|version|api version|tags|key name|status|current job id|current job status|current job template name|current job template icon|current job template display name|previous job id|previous job status|previous job template name|previous job template icon|previous job template display name|organization] (default: created at,last seen at,key name,name,version,status,tags)
|
||||||
Columns to display in table output.
|
Columns to display in table output.
|
||||||
|
|
||||||
-l, --limit int, $CODER_PROVISIONER_LIST_LIMIT (default: 50)
|
-l, --limit int, $CODER_PROVISIONER_LIST_LIMIT (default: 50)
|
||||||
|
Reference in New Issue
Block a user