aboutsummaryrefslogtreecommitdiffstats
path: root/modules/structs
diff options
context:
space:
mode:
authorJason Song <i@wolfogre.com>2022-09-02 15:58:49 +0800
committerGitHub <noreply@github.com>2022-09-02 15:58:49 +0800
commit84447df4d366324ab81894b028b00fd66be85caf (patch)
tree5291442a85faccb6bc17b54ca71a53c16530dfe3 /modules/structs
parentb7a4b45ff83dc19febcfb85279215ea6bd224033 (diff)
downloadgitea-84447df4d366324ab81894b028b00fd66be85caf.tar.gz
gitea-84447df4d366324ab81894b028b00fd66be85caf.zip
Support Issue forms and PR forms (#20987)
* feat: extend issue template for yaml * feat: support yaml template * feat: render form to markdown * feat: support yaml template for pr * chore: rename to Fields * feat: template unmarshal * feat: split template * feat: render to markdown * feat: use full name as template file name * chore: remove useless file * feat: use dropdown of fomantic ui * feat: update input style * docs: more comments * fix: render text without render * chore: fix lint error * fix: support use description as about in markdown * fix: add field class in form * chore: generate swagger * feat: validate template * feat: support is_nummber and regex * test: fix broken unit tests * fix: ignore empty body of md template * fix: make multiple easymde editors work in one page * feat: better UI * fix: js error in pr form * chore: generate swagger * feat: support regex validation * chore: generate swagger * fix: refresh each markdown editor * chore: give up required validation * fix: correct issue template candidates * fix: correct checkboxes style * chore: ignore .hugo_build.lock in docs * docs: separate out a new doc for merge templates * docs: introduce syntax of yaml template * feat: show a alert for invalid templates * test: add case for a valid template * fix: correct attributes of required checkbox * fix: add class not-under-easymde for dropzone * fix: use more back-quotes * chore: remove translation in zh-CN * fix EasyMDE statusbar margin * fix: remove repeated blocks * fix: reuse regex for quotes Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'modules/structs')
-rw-r--r--modules/structs/issue.go60
1 files changed, 49 insertions, 11 deletions
diff --git a/modules/structs/issue.go b/modules/structs/issue.go
index c72487fe4d..27ec81f728 100644
--- a/modules/structs/issue.go
+++ b/modules/structs/issue.go
@@ -5,7 +5,7 @@
package structs
import (
- "strings"
+ "path/filepath"
"time"
)
@@ -120,19 +120,57 @@ type IssueDeadline struct {
Deadline *time.Time `json:"due_date"`
}
+// IssueFormFieldType defines issue form field type, can be "markdown", "textarea", "input", "dropdown" or "checkboxes"
+type IssueFormFieldType string
+
+const (
+ IssueFormFieldTypeMarkdown IssueFormFieldType = "markdown"
+ IssueFormFieldTypeTextarea IssueFormFieldType = "textarea"
+ IssueFormFieldTypeInput IssueFormFieldType = "input"
+ IssueFormFieldTypeDropdown IssueFormFieldType = "dropdown"
+ IssueFormFieldTypeCheckboxes IssueFormFieldType = "checkboxes"
+)
+
+// IssueFormField represents a form field
+// swagger:model
+type IssueFormField struct {
+ Type IssueFormFieldType `json:"type" yaml:"type"`
+ ID string `json:"id" yaml:"id"`
+ Attributes map[string]interface{} `json:"attributes" yaml:"attributes"`
+ Validations map[string]interface{} `json:"validations" yaml:"validations"`
+}
+
// IssueTemplate represents an issue template for a repository
// swagger:model
type IssueTemplate struct {
- Name string `json:"name" yaml:"name"`
- Title string `json:"title" yaml:"title"`
- About string `json:"about" yaml:"about"`
- Labels []string `json:"labels" yaml:"labels"`
- Ref string `json:"ref" yaml:"ref"`
- Content string `json:"content" yaml:"-"`
- FileName string `json:"file_name" yaml:"-"`
+ Name string `json:"name" yaml:"name"`
+ Title string `json:"title" yaml:"title"`
+ About string `json:"about" yaml:"about"` // Using "description" in a template file is compatible
+ Labels []string `json:"labels" yaml:"labels"`
+ Ref string `json:"ref" yaml:"ref"`
+ Content string `json:"content" yaml:"-"`
+ Fields []*IssueFormField `json:"body" yaml:"body"`
+ FileName string `json:"file_name" yaml:"-"`
}
-// Valid checks whether an IssueTemplate is considered valid, e.g. at least name and about
-func (it IssueTemplate) Valid() bool {
- return strings.TrimSpace(it.Name) != "" && strings.TrimSpace(it.About) != ""
+// IssueTemplateType defines issue template type
+type IssueTemplateType string
+
+const (
+ IssueTemplateTypeMarkdown IssueTemplateType = "md"
+ IssueTemplateTypeYaml IssueTemplateType = "yaml"
+)
+
+// Type returns the type of IssueTemplate, can be "md", "yaml" or empty for known
+func (it IssueTemplate) Type() IssueTemplateType {
+ if it.Name == "config.yaml" || it.Name == "config.yml" {
+ // ignore config.yaml which is a special configuration file
+ return ""
+ }
+ if ext := filepath.Ext(it.FileName); ext == ".md" {
+ return IssueTemplateTypeMarkdown
+ } else if ext == ".yaml" || ext == ".yml" {
+ return "yaml"
+ }
+ return IssueTemplateTypeYaml
}