aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZettat123 <zettat123@gmail.com>2024-05-23 21:01:02 +0800
committerGitHub <noreply@github.com>2024-05-23 13:01:02 +0000
commit7ab0988af140aa3e0204979765f75961f1dc9c11 (patch)
treeaafd76063fdfcc027a1ebd63ad4996c7584dc248
parent7b93d6c8f786fe201201060c1785d19a3a1a3be2 (diff)
downloadgitea-7ab0988af140aa3e0204979765f75961f1dc9c11.tar.gz
gitea-7ab0988af140aa3e0204979765f75961f1dc9c11.zip
Support setting the `default` attribute of the issue template dropdown field (#31045)
Fix #31044 According to [GitHub issue template documentation](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema#attributes-for-dropdown), the `default` attribute can be used to specify the preselected option for a dropdown field.
-rw-r--r--modules/issue/template/template.go25
-rw-r--r--modules/issue/template/template_test.go92
-rw-r--r--templates/repo/issue/fields/dropdown.tmpl2
3 files changed, 118 insertions, 1 deletions
diff --git a/modules/issue/template/template.go b/modules/issue/template/template.go
index 3be48b9edc..cf5fcf28e5 100644
--- a/modules/issue/template/template.go
+++ b/modules/issue/template/template.go
@@ -91,6 +91,9 @@ func validateYaml(template *api.IssueTemplate) error {
if err := validateOptions(field, idx); err != nil {
return err
}
+ if err := validateDropdownDefault(position, field.Attributes); err != nil {
+ return err
+ }
case api.IssueFormFieldTypeCheckboxes:
if err := validateStringItem(position, field.Attributes, false, "description"); err != nil {
return err
@@ -249,6 +252,28 @@ func validateBoolItem(position errorPosition, m map[string]any, names ...string)
return nil
}
+func validateDropdownDefault(position errorPosition, attributes map[string]any) error {
+ v, ok := attributes["default"]
+ if !ok {
+ return nil
+ }
+ defaultValue, ok := v.(int)
+ if !ok {
+ return position.Errorf("'default' should be an int")
+ }
+
+ options, ok := attributes["options"].([]any)
+ if !ok {
+ // should not happen
+ return position.Errorf("'options' is required and should be a array")
+ }
+ if defaultValue < 0 || defaultValue >= len(options) {
+ return position.Errorf("the value of 'default' is out of range")
+ }
+
+ return nil
+}
+
type errorPosition string
func (p errorPosition) Errorf(format string, a ...any) error {
diff --git a/modules/issue/template/template_test.go b/modules/issue/template/template_test.go
index e24b962d61..481058754d 100644
--- a/modules/issue/template/template_test.go
+++ b/modules/issue/template/template_test.go
@@ -356,6 +356,96 @@ body:
wantErr: "body[0](checkboxes), option[1]: can not require a hidden checkbox",
},
{
+ name: "dropdown default is not an integer",
+ content: `
+name: "test"
+about: "this is about"
+body:
+ - type: dropdown
+ id: "1"
+ attributes:
+ label: Label of dropdown
+ description: Description of dropdown
+ multiple: true
+ options:
+ - Option 1 of dropdown
+ - Option 2 of dropdown
+ - Option 3 of dropdown
+ default: "def"
+ validations:
+ required: true
+`,
+ wantErr: "body[0](dropdown): 'default' should be an int",
+ },
+ {
+ name: "dropdown default is out of range",
+ content: `
+name: "test"
+about: "this is about"
+body:
+ - type: dropdown
+ id: "1"
+ attributes:
+ label: Label of dropdown
+ description: Description of dropdown
+ multiple: true
+ options:
+ - Option 1 of dropdown
+ - Option 2 of dropdown
+ - Option 3 of dropdown
+ default: 3
+ validations:
+ required: true
+`,
+ wantErr: "body[0](dropdown): the value of 'default' is out of range",
+ },
+ {
+ name: "dropdown without default is valid",
+ content: `
+name: "test"
+about: "this is about"
+body:
+ - type: dropdown
+ id: "1"
+ attributes:
+ label: Label of dropdown
+ description: Description of dropdown
+ multiple: true
+ options:
+ - Option 1 of dropdown
+ - Option 2 of dropdown
+ - Option 3 of dropdown
+ validations:
+ required: true
+`,
+ want: &api.IssueTemplate{
+ Name: "test",
+ About: "this is about",
+ Fields: []*api.IssueFormField{
+ {
+ Type: "dropdown",
+ ID: "1",
+ Attributes: map[string]any{
+ "label": "Label of dropdown",
+ "description": "Description of dropdown",
+ "multiple": true,
+ "options": []any{
+ "Option 1 of dropdown",
+ "Option 2 of dropdown",
+ "Option 3 of dropdown",
+ },
+ },
+ Validations: map[string]any{
+ "required": true,
+ },
+ Visible: []api.IssueFormFieldVisible{api.IssueFormFieldVisibleForm, api.IssueFormFieldVisibleContent},
+ },
+ },
+ FileName: "test.yaml",
+ },
+ wantErr: "",
+ },
+ {
name: "valid",
content: `
name: Name
@@ -399,6 +489,7 @@ body:
- Option 1 of dropdown
- Option 2 of dropdown
- Option 3 of dropdown
+ default: 1
validations:
required: true
- type: checkboxes
@@ -475,6 +566,7 @@ body:
"Option 2 of dropdown",
"Option 3 of dropdown",
},
+ "default": 1,
},
Validations: map[string]any{
"required": true,
diff --git a/templates/repo/issue/fields/dropdown.tmpl b/templates/repo/issue/fields/dropdown.tmpl
index f4fa79738c..26505f58a5 100644
--- a/templates/repo/issue/fields/dropdown.tmpl
+++ b/templates/repo/issue/fields/dropdown.tmpl
@@ -2,7 +2,7 @@
{{template "repo/issue/fields/header" .}}
{{/* FIXME: required validation */}}
<div class="ui fluid selection dropdown {{if .item.Attributes.multiple}}multiple clearable{{end}}">
- <input type="hidden" name="form-field-{{.item.ID}}" value="0">
+ <input type="hidden" name="form-field-{{.item.ID}}" value="{{.item.Attributes.default}}">
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
{{if not .item.Validations.required}}
{{svg "octicon-x" 14 "remove icon"}}