mirror of
https://github.com/coder/coder.git
synced 2025-07-06 15:41:45 +00:00
feat: add "display_order" column to coder_parameter to keep parameters sorted in UI (#8227)
This commit is contained in:
@ -2410,6 +2410,12 @@ func (q *fakeQuerier) GetTemplateVersionParameters(_ context.Context, templateVe
|
||||
}
|
||||
parameters = append(parameters, param)
|
||||
}
|
||||
sort.Slice(parameters, func(i, j int) bool {
|
||||
if parameters[i].DisplayOrder != parameters[j].DisplayOrder {
|
||||
return parameters[i].DisplayOrder < parameters[j].DisplayOrder
|
||||
}
|
||||
return strings.ToLower(parameters[i].Name) < strings.ToLower(parameters[j].Name)
|
||||
})
|
||||
return parameters, nil
|
||||
}
|
||||
|
||||
@ -3934,6 +3940,7 @@ func (q *fakeQuerier) InsertTemplateVersionParameter(_ context.Context, arg data
|
||||
ValidationMax: arg.ValidationMax,
|
||||
ValidationMonotonic: arg.ValidationMonotonic,
|
||||
Required: arg.Required,
|
||||
DisplayOrder: arg.DisplayOrder,
|
||||
LegacyVariableName: arg.LegacyVariableName,
|
||||
}
|
||||
q.templateVersionParameters = append(q.templateVersionParameters, param)
|
||||
|
3
coderd/database/dump.sql
generated
3
coderd/database/dump.sql
generated
@ -461,6 +461,7 @@ CREATE TABLE template_version_parameters (
|
||||
required boolean DEFAULT true NOT NULL,
|
||||
legacy_variable_name text DEFAULT ''::text NOT NULL,
|
||||
display_name text DEFAULT ''::text NOT NULL,
|
||||
display_order integer DEFAULT 0 NOT NULL,
|
||||
CONSTRAINT validation_monotonic_order CHECK ((validation_monotonic = ANY (ARRAY['increasing'::text, 'decreasing'::text, ''::text])))
|
||||
);
|
||||
|
||||
@ -494,6 +495,8 @@ COMMENT ON COLUMN template_version_parameters.legacy_variable_name IS 'Name of t
|
||||
|
||||
COMMENT ON COLUMN template_version_parameters.display_name IS 'Display name of the rich parameter';
|
||||
|
||||
COMMENT ON COLUMN template_version_parameters.display_order IS 'Specifies the order in which to display parameters in user interfaces.';
|
||||
|
||||
CREATE TABLE template_version_variables (
|
||||
template_version_id uuid NOT NULL,
|
||||
name text NOT NULL,
|
||||
|
@ -0,0 +1 @@
|
||||
ALTER TABLE template_version_parameters DROP COLUMN display_order;
|
@ -0,0 +1,4 @@
|
||||
ALTER TABLE template_version_parameters ADD COLUMN display_order integer NOT NULL DEFAULT 0;
|
||||
|
||||
COMMENT ON COLUMN template_version_parameters.display_order
|
||||
IS 'Specifies the order in which to display parameters in user interfaces.';
|
@ -1631,6 +1631,8 @@ type TemplateVersionParameter struct {
|
||||
LegacyVariableName string `db:"legacy_variable_name" json:"legacy_variable_name"`
|
||||
// Display name of the rich parameter
|
||||
DisplayName string `db:"display_name" json:"display_name"`
|
||||
// Specifies the order in which to display parameters in user interfaces.
|
||||
DisplayOrder int32 `db:"display_order" json:"display_order"`
|
||||
}
|
||||
|
||||
type TemplateVersionVariable struct {
|
||||
|
@ -4153,7 +4153,7 @@ func (q *sqlQuerier) UpdateTemplateScheduleByID(ctx context.Context, arg UpdateT
|
||||
}
|
||||
|
||||
const getTemplateVersionParameters = `-- name: GetTemplateVersionParameters :many
|
||||
SELECT template_version_id, name, description, type, mutable, default_value, icon, options, validation_regex, validation_min, validation_max, validation_error, validation_monotonic, required, legacy_variable_name, display_name FROM template_version_parameters WHERE template_version_id = $1
|
||||
SELECT template_version_id, name, description, type, mutable, default_value, icon, options, validation_regex, validation_min, validation_max, validation_error, validation_monotonic, required, legacy_variable_name, display_name, display_order FROM template_version_parameters WHERE template_version_id = $1 ORDER BY display_order ASC, LOWER(name) ASC
|
||||
`
|
||||
|
||||
func (q *sqlQuerier) GetTemplateVersionParameters(ctx context.Context, templateVersionID uuid.UUID) ([]TemplateVersionParameter, error) {
|
||||
@ -4182,6 +4182,7 @@ func (q *sqlQuerier) GetTemplateVersionParameters(ctx context.Context, templateV
|
||||
&i.Required,
|
||||
&i.LegacyVariableName,
|
||||
&i.DisplayName,
|
||||
&i.DisplayOrder,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -4214,7 +4215,8 @@ INSERT INTO
|
||||
validation_monotonic,
|
||||
required,
|
||||
legacy_variable_name,
|
||||
display_name
|
||||
display_name,
|
||||
display_order
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@ -4233,8 +4235,9 @@ VALUES
|
||||
$13,
|
||||
$14,
|
||||
$15,
|
||||
$16
|
||||
) RETURNING template_version_id, name, description, type, mutable, default_value, icon, options, validation_regex, validation_min, validation_max, validation_error, validation_monotonic, required, legacy_variable_name, display_name
|
||||
$16,
|
||||
$17
|
||||
) RETURNING template_version_id, name, description, type, mutable, default_value, icon, options, validation_regex, validation_min, validation_max, validation_error, validation_monotonic, required, legacy_variable_name, display_name, display_order
|
||||
`
|
||||
|
||||
type InsertTemplateVersionParameterParams struct {
|
||||
@ -4254,6 +4257,7 @@ type InsertTemplateVersionParameterParams struct {
|
||||
Required bool `db:"required" json:"required"`
|
||||
LegacyVariableName string `db:"legacy_variable_name" json:"legacy_variable_name"`
|
||||
DisplayName string `db:"display_name" json:"display_name"`
|
||||
DisplayOrder int32 `db:"display_order" json:"display_order"`
|
||||
}
|
||||
|
||||
func (q *sqlQuerier) InsertTemplateVersionParameter(ctx context.Context, arg InsertTemplateVersionParameterParams) (TemplateVersionParameter, error) {
|
||||
@ -4274,6 +4278,7 @@ func (q *sqlQuerier) InsertTemplateVersionParameter(ctx context.Context, arg Ins
|
||||
arg.Required,
|
||||
arg.LegacyVariableName,
|
||||
arg.DisplayName,
|
||||
arg.DisplayOrder,
|
||||
)
|
||||
var i TemplateVersionParameter
|
||||
err := row.Scan(
|
||||
@ -4293,6 +4298,7 @@ func (q *sqlQuerier) InsertTemplateVersionParameter(ctx context.Context, arg Ins
|
||||
&i.Required,
|
||||
&i.LegacyVariableName,
|
||||
&i.DisplayName,
|
||||
&i.DisplayOrder,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
@ -16,7 +16,8 @@ INSERT INTO
|
||||
validation_monotonic,
|
||||
required,
|
||||
legacy_variable_name,
|
||||
display_name
|
||||
display_name,
|
||||
display_order
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@ -35,8 +36,9 @@ VALUES
|
||||
$13,
|
||||
$14,
|
||||
$15,
|
||||
$16
|
||||
$16,
|
||||
$17
|
||||
) RETURNING *;
|
||||
|
||||
-- name: GetTemplateVersionParameters :many
|
||||
SELECT * FROM template_version_parameters WHERE template_version_id = $1;
|
||||
SELECT * FROM template_version_parameters WHERE template_version_id = $1 ORDER BY display_order ASC, LOWER(name) ASC;
|
||||
|
@ -825,6 +825,7 @@ func (server *Server) CompleteJob(ctx context.Context, completed *proto.Complete
|
||||
ValidationMax: validationMax,
|
||||
ValidationMonotonic: richParameter.ValidationMonotonic,
|
||||
Required: richParameter.Required,
|
||||
DisplayOrder: richParameter.Order,
|
||||
LegacyVariableName: richParameter.LegacyVariableName,
|
||||
})
|
||||
if err != nil {
|
||||
|
@ -1291,3 +1291,93 @@ func TestTemplateVersionPatch(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestTemplateVersionParameters_Order(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
const (
|
||||
firstParameterName = "first_parameter"
|
||||
firstParameterType = "string"
|
||||
firstParameterValue = "aaa"
|
||||
// no order
|
||||
|
||||
secondParameterName = "Second_parameter"
|
||||
secondParameterType = "number"
|
||||
secondParameterValue = "2"
|
||||
secondParameterOrder = 3
|
||||
|
||||
thirdParameterName = "third_parameter"
|
||||
thirdParameterType = "number"
|
||||
thirdParameterValue = "3"
|
||||
thirdParameterOrder = 3
|
||||
|
||||
fourthParameterName = "Fourth_parameter"
|
||||
fourthParameterType = "number"
|
||||
fourthParameterValue = "3"
|
||||
fourthParameterOrder = 2
|
||||
|
||||
fifthParameterName = "Fifth_parameter"
|
||||
fifthParameterType = "string"
|
||||
fifthParameterValue = "aaa"
|
||||
// no order
|
||||
)
|
||||
|
||||
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||
user := coderdtest.CreateFirstUser(t, client)
|
||||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
|
||||
Parse: echo.ParseComplete,
|
||||
ProvisionPlan: []*proto.Provision_Response{
|
||||
{
|
||||
Type: &proto.Provision_Response_Complete{
|
||||
Complete: &proto.Provision_Complete{
|
||||
Parameters: []*proto.RichParameter{
|
||||
{
|
||||
Name: firstParameterName,
|
||||
Type: firstParameterType,
|
||||
// No order
|
||||
},
|
||||
{
|
||||
Name: secondParameterName,
|
||||
Type: secondParameterType,
|
||||
Order: secondParameterOrder,
|
||||
},
|
||||
{
|
||||
Name: thirdParameterName,
|
||||
Type: thirdParameterType,
|
||||
Order: thirdParameterOrder,
|
||||
},
|
||||
{
|
||||
Name: fourthParameterName,
|
||||
Type: fourthParameterType,
|
||||
Order: fourthParameterOrder,
|
||||
},
|
||||
{
|
||||
Name: fifthParameterName,
|
||||
Type: fifthParameterType,
|
||||
// No order
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
ProvisionApply: []*proto.Provision_Response{{
|
||||
Type: &proto.Provision_Response_Complete{
|
||||
Complete: &proto.Provision_Complete{},
|
||||
},
|
||||
}},
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||
defer cancel()
|
||||
|
||||
templateRichParameters, err := client.TemplateVersionRichParameters(ctx, version.ID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, templateRichParameters, 5)
|
||||
require.Equal(t, fifthParameterName, templateRichParameters[0].Name)
|
||||
require.Equal(t, firstParameterName, templateRichParameters[1].Name)
|
||||
require.Equal(t, fourthParameterName, templateRichParameters[2].Name)
|
||||
require.Equal(t, secondParameterName, templateRichParameters[3].Name)
|
||||
require.Equal(t, thirdParameterName, templateRichParameters[4].Name)
|
||||
}
|
||||
|
Reference in New Issue
Block a user