UI: basic label list

- create new label
This commit is contained in:
Unknwon committed 2015-07-24 21:02:49 +08:00
1 parent 86dbda0b42
commit ac95f6d50f
27 files changed
+3686 -166

No files matched your search

-1
View File
@@ -29,7 +29,6 @@ profile/
__pycache__ __pycache__
*.pem *.pem
output* output*
config.codekit
.brackets.json .brackets.json
docker/fig.yml docker/fig.yml
docker/docker/Dockerfile docker/docker/Dockerfile
+3 -4
View File
@@ -80,7 +80,7 @@ func checkVersion() {
// Check dependency version. // Check dependency version.
checkers := []VerChecker{ checkers := []VerChecker{
{"github.com/Unknwon/macaron", macaron.Version, "0.5.4"}, {"github.com/Unknwon/macaron", macaron.Version, "0.5.4"},
{"github.com/macaron-contrib/binding", binding.Version, "0.0.6"}, {"github.com/macaron-contrib/binding", binding.Version, "0.1.0"},
{"github.com/macaron-contrib/cache", cache.Version, "0.0.7"}, {"github.com/macaron-contrib/cache", cache.Version, "0.0.7"},
{"github.com/macaron-contrib/csrf", csrf.Version, "0.0.3"}, {"github.com/macaron-contrib/csrf", csrf.Version, "0.0.3"},
{"github.com/macaron-contrib/i18n", i18n.Version, "0.0.7"}, {"github.com/macaron-contrib/i18n", i18n.Version, "0.0.7"},
@@ -442,15 +442,14 @@ func runWeb(ctx *cli.Context) {
m.Group("/:username/:reponame", func() { m.Group("/:username/:reponame", func() {
m.Get("/releases", middleware.RepoRef(), repo.Releases) m.Get("/releases", middleware.RepoRef(), repo.Releases)
m.Get("/issues", repo.Issues) m.Get("/issues", repo.RetrieveLabels, repo.Issues)
m.Get("/issues/:index", repo.ViewIssue) m.Get("/issues/:index", repo.ViewIssue)
m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
m.Get("/milestones", repo.Milestones) m.Get("/milestones", repo.Milestones)
m.Get("/pulls", repo.Pulls) m.Get("/pulls", repo.Pulls)
m.Get("/branches", repo.Branches) m.Get("/branches", repo.Branches)
m.Get("/archive/*", repo.Download) m.Get("/archive/*", repo.Download)
m.Get("/issues2/", repo.Issues2)
m.Get("/pulls2/", repo.PullRequest2) m.Get("/pulls2/", repo.PullRequest2)
m.Get("/labels2/", repo.Labels2)
m.Get("/milestone2/", repo.Milestones2) m.Get("/milestone2/", repo.Milestones2)
m.Group("", func() { m.Group("", func() {
+9
View File
@@ -159,6 +159,7 @@ AdminEmail = Admin E-mail
require_error = ` cannot be empty.` require_error = ` cannot be empty.`
alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.` alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.`
alpha_dash_dot_error = ` must be valid alpha or numeric or dash(-_) or dot characters.` alpha_dash_dot_error = ` must be valid alpha or numeric or dash(-_) or dot characters.`
size_error = ` must be size %s.`
min_size_error = ` must contain at least %s characters.` min_size_error = ` must contain at least %s characters.`
max_size_error = ` must contain at most %s characters.` max_size_error = ` must contain at most %s characters.`
email_error = ` is not a valid e-mail address.` email_error = ` is not a valid e-mail address.`
@@ -358,6 +359,8 @@ commits.older = Older
commits.newer = Newer commits.newer = Newer
issues.new = New Issue issues.new = New Issue
issues.new_label = New Label
issues.new_label_placeholder = Label name...
issues.open_tab = %d Open issues.open_tab = %d Open
issues.close_tab = %d Closed issues.close_tab = %d Closed
issues.filter_label = Label issues.filter_label = Label
@@ -369,6 +372,12 @@ issues.filter_type.assigned_to_you = Assigned to you
issues.filter_type.created_by_you = Created by you issues.filter_type.created_by_you = Created by you
issues.filter_type.mentioning_you = Mentioning you issues.filter_type.mentioning_you = Mentioning you
issues.opened_by = opened %s by <a href="/%[2]s">%[2]s</a> issues.opened_by = opened %s by <a href="/%[2]s">%[2]s</a>
issues.label_title = Label name
issues.label_color = Label color
issues.label_count = %d labels
issues.label_open_issues = %d open issues
issues.label_edit = Edit
issues.label_delete = Delete
issues.previous = Previous Page issues.previous = Previous Page
issues.next = Next Page issues.next = Next Page
+1989
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
const APP_VER = "0.6.1.0724 Beta" const APP_VER = "0.6.2.0724 Beta"
func init() { func init() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())
+5 -5
View File
@@ -153,7 +153,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1) url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1)
message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message) message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message)
if _, err = CreateComment(userId, issue.RepoId, issue.Id, 0, 0, COMMENT_TYPE_COMMIT, message, nil); err != nil { if _, err = CreateComment(userId, issue.RepoId, issue.ID, 0, 0, COMMENT_TYPE_COMMIT, message, nil); err != nil {
return err return err
} }
} }
@@ -202,7 +202,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
if err = UpdateIssue(issue); err != nil { if err = UpdateIssue(issue); err != nil {
return err return err
} else if err = UpdateIssueUserPairsByStatus(issue.Id, issue.IsClosed); err != nil { } else if err = UpdateIssueUserPairsByStatus(issue.ID, issue.IsClosed); err != nil {
return err return err
} }
@@ -211,7 +211,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
} }
// If commit happened in the referenced repository, it means the issue can be closed. // If commit happened in the referenced repository, it means the issue can be closed.
if _, err = CreateComment(userId, repoId, issue.Id, 0, 0, COMMENT_TYPE_CLOSE, "", nil); err != nil { if _, err = CreateComment(userId, repoId, issue.ID, 0, 0, COMMENT_TYPE_CLOSE, "", nil); err != nil {
return err return err
} }
} }
@@ -261,7 +261,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
if err = UpdateIssue(issue); err != nil { if err = UpdateIssue(issue); err != nil {
return err return err
} else if err = UpdateIssueUserPairsByStatus(issue.Id, issue.IsClosed); err != nil { } else if err = UpdateIssueUserPairsByStatus(issue.ID, issue.IsClosed); err != nil {
return err return err
} }
@@ -270,7 +270,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com
} }
// If commit happened in the referenced repository, it means the issue can be closed. // If commit happened in the referenced repository, it means the issue can be closed.
if _, err = CreateComment(userId, repoId, issue.Id, 0, 0, COMMENT_TYPE_REOPEN, "", nil); err != nil { if _, err = CreateComment(userId, repoId, issue.ID, 0, 0, COMMENT_TYPE_REOPEN, "", nil); err != nil {
return err return err
} }
} }
+12 -12
View File
@@ -32,7 +32,7 @@ var (
// Issue represents an issue or pull request of repository. // Issue represents an issue or pull request of repository.
type Issue struct { type Issue struct {
Id int64 ID int64 `xorm:"pk autoincr"`
RepoId int64 `xorm:"INDEX"` RepoId int64 `xorm:"INDEX"`
Index int64 // Index in one repository. Index int64 // Index in one repository.
Name string Name string
@@ -100,15 +100,15 @@ func (i *Issue) GetAssignee() (err error) {
} }
func (i *Issue) Attachments() []*Attachment { func (i *Issue) Attachments() []*Attachment {
a, _ := GetAttachmentsForIssue(i.Id) a, _ := GetAttachmentsForIssue(i.ID)
return a return a
} }
func (i *Issue) AfterDelete() { func (i *Issue) AfterDelete() {
_, err := DeleteAttachmentsByIssue(i.Id, true) _, err := DeleteAttachmentsByIssue(i.ID, true)
if err != nil { if err != nil {
log.Info("Could not delete files for issue #%d: %s", i.Id, err) log.Info("Could not delete files for issue #%d: %s", i.ID, err)
} }
} }
@@ -175,7 +175,7 @@ func GetIssueByIndex(rid, index int64) (*Issue, error) {
// GetIssueById returns an issue by ID. // GetIssueById returns an issue by ID.
func GetIssueById(id int64) (*Issue, error) { func GetIssueById(id int64) (*Issue, error) {
issue := &Issue{Id: id} issue := &Issue{ID: id}
has, err := x.Get(issue) has, err := x.Get(issue)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -456,7 +456,7 @@ func GetUserIssueStats(uid int64, filterMode int) *IssueStats {
// UpdateIssue updates information of issue. // UpdateIssue updates information of issue.
func UpdateIssue(issue *Issue) error { func UpdateIssue(issue *Issue) error {
_, err := x.Id(issue.Id).AllCols().Update(issue) _, err := x.Id(issue.ID).AllCols().Update(issue)
if err != nil { if err != nil {
return err return err
@@ -526,7 +526,7 @@ func UpdateIssueUserPairsByMentions(uids []int64, iid int64) error {
// Label represents a label of repository for issues. // Label represents a label of repository for issues.
type Label struct { type Label struct {
Id int64 ID int64 `xorm:"pk autoincr"`
RepoId int64 `xorm:"INDEX"` RepoId int64 `xorm:"INDEX"`
Name string Name string
Color string `xorm:"VARCHAR(7)"` Color string `xorm:"VARCHAR(7)"`
@@ -553,7 +553,7 @@ func GetLabelById(id int64) (*Label, error) {
return nil, ErrLabelNotExist return nil, ErrLabelNotExist
} }
l := &Label{Id: id} l := &Label{ID: id}
has, err := x.Get(l) has, err := x.Get(l)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -572,7 +572,7 @@ func GetLabels(repoId int64) ([]*Label, error) {
// UpdateLabel updates label information. // UpdateLabel updates label information.
func UpdateLabel(l *Label) error { func UpdateLabel(l *Label) error {
_, err := x.Id(l.Id).AllCols().Update(l) _, err := x.Id(l.ID).AllCols().Update(l)
return err return err
} }
@@ -600,7 +600,7 @@ func DeleteLabel(repoId int64, strId string) error {
for _, issue := range issues { for _, issue := range issues {
issue.LabelIds = strings.Replace(issue.LabelIds, "$"+strId+"|", "", -1) issue.LabelIds = strings.Replace(issue.LabelIds, "$"+strId+"|", "", -1)
if _, err = sess.Id(issue.Id).AllCols().Update(issue); err != nil { if _, err = sess.Id(issue.ID).AllCols().Update(issue); err != nil {
sess.Rollback() sess.Rollback()
return err return err
} }
@@ -788,7 +788,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
} }
rawSql := "UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?" rawSql := "UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?"
if _, err = sess.Exec(rawSql, issue.Id); err != nil { if _, err = sess.Exec(rawSql, issue.ID); err != nil {
sess.Rollback() sess.Rollback()
return err return err
} }
@@ -816,7 +816,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
} }
rawSql := "UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?" rawSql := "UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?"
if _, err = sess.Exec(rawSql, m.Id, issue.Id); err != nil { if _, err = sess.Exec(rawSql, m.Id, issue.ID); err != nil {
sess.Rollback() sess.Rollback()
return err return err
} }
+1 -1
View File
@@ -876,7 +876,7 @@ func DeleteRepository(uid, repoID int64, userName string) error {
return err return err
} }
for i := range issues { for i := range issues {
if _, err = sess.Delete(&Comment{IssueId: issues[i].Id}); err != nil { if _, err = sess.Delete(&Comment{IssueId: issues[i].ID}); err != nil {
return err return err
} }
} }
+7 -1
View File
@@ -171,12 +171,16 @@ func AssignForm(form interface{}, data map[string]interface{}) {
func getSize(field reflect.StructField, prefix string) string { func getSize(field reflect.StructField, prefix string) string {
for _, rule := range strings.Split(field.Tag.Get("binding"), ";") { for _, rule := range strings.Split(field.Tag.Get("binding"), ";") {
if strings.HasPrefix(rule, prefix) { if strings.HasPrefix(rule, prefix) {
return rule[8 : len(rule)-1] return rule[len(prefix) : len(rule)-1]
} }
} }
return "" return ""
} }
func GetSize(field reflect.StructField) string {
return getSize(field, "Size(")
}
func GetMinSize(field reflect.StructField) string { func GetMinSize(field reflect.StructField) string {
return getSize(field, "MinSize(") return getSize(field, "MinSize(")
} }
@@ -227,6 +231,8 @@ func validate(errs binding.Errors, data map[string]interface{}, f Form, l macaro
data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_error") data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_error")
case binding.ERR_ALPHA_DASH_DOT: case binding.ERR_ALPHA_DASH_DOT:
data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_dot_error") data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_dot_error")
case binding.ERR_SIZE:
data["ErrorMsg"] = trName + l.Tr("form.size_error", GetSize(field))
case binding.ERR_MIN_SIZE: case binding.ERR_MIN_SIZE:
data["ErrorMsg"] = trName + l.Tr("form.min_size_error", GetMinSize(field)) data["ErrorMsg"] = trName + l.Tr("form.min_size_error", GetMinSize(field))
case binding.ERR_MAX_SIZE: case binding.ERR_MAX_SIZE:
+2 -2
View File
@@ -134,8 +134,8 @@ func (f *CreateMilestoneForm) Validate(ctx *macaron.Context, errs binding.Errors
// \/ \/ \/ \/ // \/ \/ \/ \/
type CreateLabelForm struct { type CreateLabelForm struct {
Title string `form:"title" binding:"Required;MaxSize(50)"` Title string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_name"`
Color string `form:"color" binding:"Required;Size(7)"` Color string `binding:"Required;Size(7)" locale:"repo.issues.label_color"`
} }
func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+3 -3
View File
@@ -726,7 +726,7 @@ func confLocaleTranslators() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "conf/locale/TRANSLATORS", size: 606, mode: os.FileMode(420), modTime: time.Unix(1437262032, 0)} info := bindataFileInfo{name: "conf/locale/TRANSLATORS", size: 606, mode: os.FileMode(420), modTime: time.Unix(1437728161, 0)}
a := &asset{bytes: bytes, info: info} a := &asset{bytes: bytes, info: info}
return a, nil return a, nil
} }
@@ -771,7 +771,7 @@ func confLocaleLocale_deDeIni() (*asset, error) {
return a, nil return a, nil
} }
var _confLocaleLocale_enUsIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x7d\xeb\x72\xdc\x48\xb2\xde\x7f\x3c\x05\x66\x1c\xb2\x66\x22\xa8\x56\xcc\x4c\xd8\xe1\x98\x90\x34\xe6\x90\xa3\xcb\x1e\x51\xd4\x11\xa9\x5d\x1f\x2b\x14\x58\x74\x03\xec\xc6\xb2\x1b\xe8\xc5\x85\x3d\xdc\x5f\x7e\x0d\xbf\x9e\x9f\xc4\x99\x5f\x66\xd6\x05\x40\x53\xa3\x3d\x0e\x9f\x3f\x64\xa1\x2a\xeb\x96\x95\x95\x95\xb7\xaa\xce\xf7\xfb\xac\x28\xbb\x55\xfa\x3c\x3d\x4d\xf7\x79\x55\x6f\xcb\xae\x4b\xbb\x72\x7b\xf3\x64\xd3\x74\x7d\x59\xa4\xaf\xaa\x9e\xbe\xdb\xbb\x6a\x55\x26\xc9\xa6\xd9\x95\x04\xfa\x9a\xfe\x25\x45\xde\x6d\x96\x4d\xde\x16\x94\x71\x6e\xe9\xa4\xfc\x7d\xbf\x6d\x5a\x06\xfa\x4d\x52\xc9\xa6\xdc\xee\xb9\x0e\xfd\x4b\xba\x6a\x5d\x67\x55\x4d\x9f\x57\x94\x4a\xdf\xd4\x49\xd7\xac\xaa\x7c\x9b\x05\x05\xc8\xb0\xf2\x9f\xd3\x1f\xeb\x22\xbd\xea\xcb\x7d\xfa\xac\xdb\xe5\xdb\xed\x8b\xbc\x43\x95\xbe\x4c\xf3\xd5\xaa\x19\xea\xfe\xd9\x53\x29\x90\xc6\x9b\xa1\xb7\xd6\x2f\x87\x5e\xf2\x86\xbd\x65\x7d\xdc\x27\x6d\xb9\xae\x68\x62\x2d\x65\x7d\xd0\x64\x72\x28\x97\x5d\xd5\xf3\xa0\xff\x22\xa9\xe4\xae\x6c\xbb\xaa\xe1\xf1\xfc\x59\x52\xc9\x3e\x5f\x33\xc0\x7b\xfa\x97\xf4\xe5\x6e\xbf\xcd\x51\xe1\x5a\x93\xc9\x36\xaf\xd7\x83\xc0\xbc\xd5\x64\x92\x0c\x84\xb9\x3a\x07\xce\x3e\x6a\x32\x29\x77\x79\xb5\x65\xfc\x3c\xe1\x04\xb5\xdb\x75\x87\x06\x58\x7c\xaf\x49\x1a\x63\xd6\xdf\xef\x4b\x0c\xf1\xc9\x35\xa5\x92\x55\xbe\xef\x57\x9b\x9c\x72\xce\x24\x95\x10\xd0\xbe\xa1\xb1\x36\xed\x3d\xe0\xec\x23\x69\xda\x75\x5e\x57\xff\xc8\x7b\x19\xff\x65\xf0\x99\xec\xaa\xb6\x6d\x78\xea\x17\x48\x24\x75\x79\xc8\xb8\x1d\xca\x79\x57\x1e\xc2\x56\xb8\x64\x57\xad\x5b\x99\x25\x17\x5e\xe0\x8b\x5b\xe1\xb2\x9b\xa6\xbd\xd5\x82\x97\x9c\x1c\x55\xa5\x41\x68\x69\xdc\x7f\x5e\x13\x5e\xb4\xf4\x02\x1f\x11\x40\x97\xe4\xc5\xae\xaa\xb3\x7d\x5e\x97\x8c\xa3\x53\xfe\x22\xbc\xd0\x57\xa2\xcb\x9d\x75\x65\xdf\x57\xf5\xba\xe3\x62\xc9\x4a\xaf\x34\x2b\x09\xca\x5c\x1e\x8f\xa7\xcb\x6e\xca\xb2\x90\x11\x75\xe9\x4b\x4a\x27\xfb\x61\xbb\xa5\xb9\xff\x7d\x28\xbb\x9e\xe1\xdf\xd3\x37\xcd\x42\xbe\x93\xaa\xeb\x28\x41\xd9\x6f\x90\x48\x68\x01\xea\x15\x86\x74\x86\x44\x92\x7c\xea\xca\xbc\x5d\x6d\x3e\x27\xf2\x1f\x3d\x72\x62\xb1\x58\x1c\x5d\x1a\x26\x07\x25\x05\xe9\xc1\x3a\x48\x56\x4d\xc1\x1f\x67\xf4\x8f\x9a\xae\xea\xae\x27\x92\xfe\x9c\x68\x82\xc1\x24\x25\x68\xec\xab\x7e\x5b\xfa\x4c\xec\x8f\x8e\xd7\x21\x7d\x59\xb5\x5d\xff\xa4\xaf\x88\xe4\x3e\x0c\x75\xc2\xf3\x23\x72\xce\x8a\xa5\xed\xf2\x57\x0d\x61\x07\xd9\x2d\xcd\xef\xe2\xfe\xea\x5f\xdf\x9e\xa4\xef\x69\xab\xaf\xdb\x92\xd2\x29\xb5\x41\xff\xa8\xce\x4f\x8b\x84\x6a\x59\x4f\xe7\x79\x9f\x2f\xf3\xae\xf4\x68\xe5\x42\xa1\x51\x57\x06\x4a\x65\xb6\x01\x16\xd1\xf5\xd1\x7c\xe7\xe8\x9c\xda\xd0\xdd\xe1\xda\x78\xc7\x5b\x84\xf2\x99\x6b\xa0\xf2\xfb\x6d\xc9\xf9\xd4\x54\xfa\xe6\xdd\xbb\xcb\xf3\x5f\xd3\xb2\x5e\x57\x75\x99\x1e\xaa\x7e\x93\x0e\xfd\xcd\x7f\xcb\xd6\x65\x5d\xb6\xc4\x44\x56\x55\x4a\x3b\xa3\x25\x22\x48\x89\x3c\x65\x72\x8b\xa4\xeb\xb6\xd9\x4e\xd0\x7b\x75\xf5\x36\xbd\x60\x14\xef\xf3\x7e\x83\x81\xf4\x9b\xa4\xfb\xfb\x96\x51\xe4\x3a\xbc\xde\x94\xe9\x4d\x45\xb3\x06\x50\x73\x63\xf8\x48\x0b\x1d\xe3\x22\x29\xdb\x36\xa3\x7d\xdf\xdf\x67\x5a\x59\xdb\x1b\x43\x4a\x13\x44\x3a\x75\xd3\xa7\xcb\x32\x45\x9d\x45\x92\xd8\x80\x0d\xbb\xa7\xfb\xfd\xb6\x5a\xc9\x8e\x7d\x25\x65\x1e\xd1\xcc\xa2\x15\x4b\x21\x1c\x10\x65\x65\x01\xba\x88\xff\xdd\x37\x43\x9b\x46\x6c\x00\xf5\x37\x25\xf1\xe5\xcd\x40\x5b\x2e\x27\x9e\xba\x6d\x86\xe2\x1b\x50\xaa\x8d\xde\x13\x6a\xfa\xa1\xa1\x01\x03\x3b\x0e\xc0\x77\x71\x4a\x14\xc7\xa7\x42\x5b\xee\x1a\xe2\x0e\x8e\xd8\x2b\x22\xa8\x43\x45\x85\x34\xd3\x2e\xbf\xa3\xfd\xd6\x37\x69\xbf\xa9\xba\xb4\x20\x62\x5b\x71\xc3\xb4\x35\x06\xe2\xc7\x42\x16\x44\xa0\x42\x1a\x96\x17\xaf\x01\xa0\x76\x03\x51\xd3\x86\x1a\x63\x6e\xcf\x47\x13\x35\x39\x37\x4e\x4c\x89\xda\x01\x7d\x13\xe5\x36\xc4\x5b\x99\xfb\x9d\x23\xa1\xdf\x61\xfb\x34\xaa\xfc\xe6\x86\x46\xd5\x11\x55\xbc\x4e\x57\xdb\x86\x48\xea\xe3\x87\xb7\x54\x79\xd3\xf7\xfb\x6c\xdf\xb4\x20\xe3\xeb\xeb\xf7\xb4\x3d\xda\xde\xe7\x06\xb8\x66\x98\x7a\xd8\x2d\xe9\xeb\xb0\xa9\x88\x09\xe4\xc1\x02\x01\x15\x5b\x3e\x60\xea\xb4\xa9\x17\x58\xab\xa1\xdd\x8e\x96\x91\xba\xb4\x92\x23\xc3\xe3\x21\x3c\xe5\x3f\x57\x7e\x94\x98\x6e\x47\xa7\xf0\x01\x8b\x4a\x53\x2d\x71\x9a\x10\x6d\x35\x7b\x6e\x37\x20\xae\x4b\xcd\xf0\x14\x85\x13\xc8\x95\xcb\x39\x44\xa5\x38\xe3\x03\x5e\xba\xa3\x09\xeb\x6e\xbe\xba\x20\x34\x60\x4b\x23\xf7\xa6\x6d\x76\x94\xfb\x92\xfe\xf9\x0c\x3f\xfc\x0b\x6e\x0f\x30\x79\x51\x10\x9b\xe9\x4e\xd2\x0f\x2f\xcf\xd2\xff\xf2\xd3\x8f\x3f\x2e\xd2\x37\x3d\x6f\x08\xa6\x91\xbf\xf1\xda\x52\x52\x0e\x44\x07\x4a\x3b\xb7\xa7\xe5\xff\x96\x09\xfc\xdb\xf4\x19\x4a\xff\x7b\xf9\x7b\x4e\xe7\x6c\xb9\x58\x35\xbb\x17\xbc\xb9\x77\x79\xbf\x48\xb8\x84\xa8\x46\xc9\xe9\xaa\xac\x0b\x4a\xe8\xb1\xaa\x65\x01\xd7\xd1\xf2\xe0\x90\x95\xd3\x3f\x5b\x35\xf5\x4d\xd5\xf2\x84\x7e\xab\xf3\x25\xe1\xc4\xe4\x02\x62\xc7\x28\xb1\xb3\x8b\x90\x46\x1b\xb9\xba\xb9\xf7\xa0\x98\xea\x3b\xce\xd4\x05\x4d\x58\x56\xa2\x46\x55\x64\x72\x58\xbe\x42\x36\xd6\xed\x92\xa6\xd7\x1a\xbe\x3b\x8f\xf0\xe6\xe6\x66\x4b\x8c\xcd\x98\x95\xf6\x70\x29\xb9\xc2\xb7\x42\x10\x22\xc6\x3d\x24\x9b\xfLine truncated var _confLocaleLocale_enUsIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x7d\xeb\x72\xdc\x48\xb2\xde\x7f\x3c\x05\x66\x1c\xb2\x66\x22\xa8\x56\xcc\x4c\xd8\xe1\x98\x90\x34\xe6\x90\xa3\xcb\x1e\x51\xd4\x11\xa9\x5d\x1f\x2b\x14\x58\x74\x03\xec\xc6\xb2\x1b\xe8\xc5\x85\x3d\xdc\x5f\x7e\x0d\xbf\x9e\x9f\xc4\x99\x5f\x66\xd6\x05\x40\x53\xa3\x3d\x0e\x9f\x3f\x64\x75\x55\xd6\x2d\x2b\x2b\x2b\x6f\x55\xc8\xf7\xfb\xac\x28\xbb\x55\xfa\x3c\x3d\x4d\xf7\x79\x55\x6f\xcb\xae\x4b\xbb\x72\x7b\xf3\x64\xd3\x74\x7d\x59\xa4\xaf\xaa\x9e\x7e\xb7\x77\xd5\xaa\x4c\x92\x4d\xb3\x2b\x09\xf4\x35\xfd\x4b\x8a\xbc\xdb\x2c\x9b\xbc\x2d\x28\xe3\xdc\xd2\x49\xf9\xfb\x7e\xdb\xb4\x0c\xf4\x9b\xa4\x92\x4d\xb9\xdd\x73\x1d\xfa\x97\x74\xd5\xba\xce\xaa\x9a\x7e\x5e\x51\x2a\x7d\x53\x27\x5d\xb3\xaa\xf2\x6d\x16\x14\x20\xc3\xca\x7f\x4e\x7f\xac\x8b\xf4\xaa\x2f\xf7\xe9\xb3\x6e\x97\x6f\xb7\x2f\xf2\x0e\x55\xfa\x32\xcd\x57\xab\x66\xa8\xfb\x67\x4f\xa5\x40\x1a\x6f\x86\xde\x5a\xbf\x1c\x7a\xc9\x1b\xf6\x96\xf5\x71\x9f\xb4\xe5\xba\xa2\x89\xb5\x94\xf5\x41\x93\xc9\xa1\x5c\x76\x55\xcf\x83\xfe\x8b\xa4\x92\xbb\xb2\xed\xaa\x86\xc7\xf3\x67\x49\x25\xfb\x7c\xcd\x00\xef\xe9\x5f\xd2\x97\xbb\xfd\x36\x47\x85\x6b\x4d\x26\xdb\xbc\x5e\x0f\x02\xf3\x56\x93\x49\x32\x10\xe6\xea\x1c\x38\xfb\xa8\xc9\xa4\xdc\xe5\xd5\x96\xf1\xf3\x84\x13\xd4\x6e\xd7\x1d\x1a\x60\xf1\xbd\x26\x69\x8c\x59\x7f\xbf\x2f\x31\xc4\x27\xd7\x94\x4a\x56\xf9\xbe\x5f\x6d\x72\xca\x39\x93\x54\x42\x40\xfb\x86\xc6\xda\xb4\xf7\x80\xb3\x1f\x49\xd3\xae\xf3\xba\xfa\x47\xde\xcb\xf8\x2f\x83\x9f\xc9\xae\x6a\xdb\x86\xa7\x7e\x81\x44\x52\x97\x87\x8c\xdb\xa1\x9c\x77\xe5\x21\x6c\x85\x4b\x76\xd5\xba\x95\x59\x72\xe1\x05\x7e\x71\x2b\x5c\x76\xd3\xb4\xb7\x5a\xf0\x92\x93\xa3\xaa\x34\x08\x2d\x8d\xfb\xcf\x6b\xc2\x8b\x96\x5e\xe0\x47\x04\xd0\x25\x79\xb1\xab\xea\x6c\x9f\xd7\x25\xe3\xe8\x94\x7f\x11\x5e\xe8\x57\xa2\xcb\x9d\x75\x65\xdf\x57\xf5\xba\xe3\x62\xc9\x4a\xaf\x34\x2b\x09\xca\x5c\x1e\x8f\xa7\xcb\x6e\xca\xb2\x90\x11\x75\xe9\x4b\x4a\x27\xfb\x61\xbb\xa5\xb9\xff\x7d\x28\xbb\x9e\xe1\xdf\xd3\x6f\x9a\x85\xfc\x4e\xaa\xae\xa3\x04\x65\xbf\x41\x22\xa1\x05\xa8\x57\x18\xd2\x19\x12\x49\xf2\xa9\x2b\xf3\x76\xb5\xf9\x9c\xc8\x7f\xf4\xc8\x89\xc5\x62\x71\x74\x69\x98\x1c\x94\x14\xa4\x07\xeb\x20\x59\x35\x05\xff\x38\xa3\x7f\xd4\x74\x55\x77\x3d\x91\xf4\xe7\x44\x13\x0c\x26\x29\x41\x63\x5f\xf5\xdb\xd2\x67\x62\x7f\x74\xbc\x0e\xe9\xcb\xaa\xed\xfa\x27\x7d\x45\x24\xf7\x61\xa8\x13\x9e\x1f\x91\x73\x56\x2c\x6d\x97\xbf\x6a\x08\x3b\xc8\x6e\x69\x7e\x17\xf7\x57\xff\xfa\xf6\x24\x7d\x4f\x5b\x7d\xdd\x96\x94\x4e\xa9\x0d\xfa\x47\x75\x7e\x5a\x24\x54\xcb\x7a\x3a\xcf\xfb\x7c\x99\x77\xa5\x47\x2b\x17\x0a\x8d\xba\x32\x50\x2a\xb3\x0d\xb0\x88\xae\x8f\xe6\x3b\x47\xe7\xd4\x86\xee\x0e\xd7\xc6\x3b\xde\x22\x94\xcf\x5c\x03\x95\xdf\x6f\x4b\xce\xa7\xa6\xd2\x37\xef\xde\x5d\x9e\xff\x9a\x96\xf5\xba\xaa\xcb\xf4\x50\xf5\x9b\x74\xe8\x6f\xfe\x5b\xb6\x2e\xeb\xb2\x25\x26\xb2\xaa\x52\xda\x19\x2d\x11\x41\x4a\xe4\x29\x93\x5b\x24\x5d\xb7\xcd\x76\x82\xde\xab\xab\xb7\xe9\x05\xa3\x78\x9f\xf7\x1b\x0c\xa4\xdf\x24\xdd\xdf\xb7\x8c\x22\xd7\xe1\xf5\xa6\x4c\x6f\x2a\x9a\x35\x80\x9a\x1b\xc3\x47\x5a\xe8\x18\x17\x49\xd9\xb6\x19\xed\xfb\xfe\x3e\xd3\xca\xda\xde\x18\x52\x9a\x20\xd2\xa9\x9b\x3e\x5d\x96\x29\xea\x2c\x92\xc4\x06\x6c\xd8\x3d\xdd\xef\xb7\xd5\x4a\x76\xec\x2b\x29\xf3\x88\x66\x16\xad\x58\x0a\xe1\x80\x28\x2b\x0b\xd0\x45\xfc\xef\xbe\x19\xda\x34\x62\x03\xa8\xbf\x29\x89\x2f\x6f\x06\xda\x72\x39\xf1\xd4\x6d\x33\x14\xdf\x80\x52\x6d\xf4\x9e\x50\xd3\x0f\x0d\x0d\x18\xd8\x71\x00\xbe\x8b\x53\xa2\x38\x3e\x15\xda\x72\xd7\x10\x77\x70\xc4\x5e\x11\x41\x1d\x2a\x2a\xa4\x99\x76\xf9\x1d\xed\xb7\xbe\x49\xfb\x4d\xd5\xa5\x05\x11\xdb\x8a\x1b\xa6\xad\x31\x10\x3f\x16\xb2\x20\x02\x15\xd2\xb0\xbc\x78\x0d\x00\xb5\x1b\x88\x9a\x36\xd4\x18\x73\x7b\x3e\x9a\xa8\xc9\xb9\x71\x62\x4a\xd4\x0e\xe8\x9b\x28\xb7\x21\xde\xca\xdc\xef\x1c\x09\xfd\x1d\xb6\x4f\xa3\xca\x6f\x6e\x68\x54\x1d\x51\xc5\xeb\x74\xb5\x6d\x88\xa4\x3e\x7e\x78\x4b\x95\x37\x7d\xbf\xcf\xf6\x4d\x0b\x32\xbe\xbe\x7e\x4f\xdb\xa3\xed\x7d\x6e\x80\x6b\x86\xa9\x87\xdd\x92\x7e\x1d\x36\x15\x31\x81\x3c\x58\x20\xa0\x62\xcb\x07\x4c\x9d\x36\xf5\x02\x6b\x35\xb4\xdb\xd1\x32\x52\x97\x56\x72\x64\x78\x3c\x84\xa7\xfc\xe7\xca\x8f\x12\xd3\xed\xe8\x14\x3e\x60\x51\x69\xaa\x25\x4e\x13\xa2\xad\x66\xcf\xed\x06\xc4\x75\xa9\x19\x9e\xa2\x70\x02\xb9\x72\x39\x87\xa8\x14\x67\x7c\xc0\x4b\x77\x34\x61\xdd\xcd\x57\x17\x84\x06\x6c\x69\xe4\xde\xb4\xcd\x8e\x72\x5f\xd2\x3f\x9f\xe1\x87\x7f\xc1\xed\x01\x26\x2f\x0a\x62\x33\xdd\x49\xfa\xe1\xe5\x59\xfa\x5f\x7e\xfa\xf1\xc7\x45\xfa\xa6\xe7\x0d\xc1\x34\xf2\x37\x5e\x5b\x4a\xca\x81\xe8\x40\x69\xe7\xf6\xb4\xfc\xdf\x32\x81\x7f\x9b\x3e\x43\xe9\x7f\x2f\x7f\xcf\xe9\x9c\x2d\x17\xab\x66\xf7\x82\x37\xf7\x2e\xef\x17\x09\x97\x10\xd5\x28\x39\x5d\x95\x75\x41\x09\x3d\x56\xb5\x2c\xe0\x3a\x5a\x1e\x1c\xb2\x72\xfa\x67\xab\xa6\xbe\xa9\x5a\x9e\xd0\x6f\x75\xbe\x24\x9c\x98\x5c\x40\xec\x18\x25\x76\x76\x11\xd2\x68\x23\x57\x37\xf7\x1e\x14\x53\x7d\xc7\x99\xba\xa0\x09\xcb\x4a\xd4\xa8\x8a\x4c\x0e\xcb\x57\xc8\xc6\xba\x5d\xd2\xf4\x5a\xc3\x77\xe7\x11\xde\xdc\xdc\x6c\x89\xb1\x19\xb3\xd2\x1e\x2e\x25\x57\xf8\x56\x08\x42\xc4\xb8\x87\x6Line truncated
func confLocaleLocale_enUsIniBytes() ([]byte, error) { func confLocaleLocale_enUsIniBytes() ([]byte, error) {
return bindataRead( return bindataRead(
@@ -786,7 +786,7 @@ func confLocaleLocale_enUsIni() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 33385, mode: os.FileMode(420), modTime: time.Unix(1437725453, 0)} info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 33685, mode: os.FileMode(420), modTime: time.Unix(1437742006, 0)}
a := &asset{bytes: bytes, info: info} a := &asset{bytes: bytes, info: info}
return a, nil return a, nil
} }
+1143 -1
View File
File diff suppressed because it is too large. Load diff
+278
View File
@@ -0,0 +1,278 @@
.minicolors {
position: relative;
}
.minicolors-sprite {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2YAAACWCAYAAAC1r5t6AAEuWklEQVR42uz9a8xt25YVhrU+1ner7qseLiEjhERwfkDFeWAEl6dCQcAUCBDCwUSJwg+jRPIzgGVZMcZ2DCKyIycxiSOi2JbMr8hBgFNVGKNAHgKCTBnbUYCYEsHYIoiKKuYW9zzu2XvP0fNjjUfrbfQx5/r23ufWPnX2PvrOWmvOueYc87HmHG201luzv/GzvstvVmG4/3N39H8GAwzAnASHw8zgDpjRdAcOFPz0v/J1mvrm/374h3+48Oevfe1rOh/PnF/xdv+5TvgLf+EvLAv9vJ/38/ATsdzP/bk/l9tZ6c/l/XEyr8/3B9ZT3X07r/1hM/04+U62XW1X2ka/X9Rn63l0e33fHmnLbtvhONOxqiffw9m+9HW4+9h+X87dR5vbv4M+11prHW/mP3/16lU9jqO+fPnSP/nkk/rxxx/XDz74oP7Yj/2Y/8iP/Ej9F/7l/8lLfAXAVwB8mV75L5v26LwvAh8X4EMAHwH40O9//P5Dm58/wn3ZD/pnu7//AMA3APw4gB9ty8GSX++Y9iXAfyqA7wbsOwH/jtYg/vvquiP+ZcC+StO+dJ+GrwDHF+4N+tCBj+3+NxrdduJjzJ3t0z+k6R+01w8B/B0AXwfwX2R3H6AA+J7291UAX4Xjq7DldH0Fjq/A8GV425v7+/s00PRxSnDDJ9TQj0ejDB/D23RrO+Ft+n3+R+F17tQ32s58HUCFHzWen7d9p7Zv0cre6rZ+QnbwJ6AZ9MVnrGMu2t+tX7bvKOnPNnz+0sl96er+9kWEX8ZH9P7Di/f9l6D3q/9ve3/+7zsB/FQA39Xef0f71ev9Sm/U8U4Qpr26xR3Iduijzfv++QO6Z32j3av+Nj3N6N+3Afi72x58B7X4q9JCPkVfkcOfff42AMCLTcO1wWdn7IPkfvW3743/o2/xB/cE4MmAL2D+PXl7tfv78NrmP9F3nxy4GQ5zvALwCoYDwCsAB7y9WpvnOML87LUv4+174/NT+/xLDthX27LffwD/JV0n/+n65zbw1w7Yn2yfv3HA/lzb5qtX67bHfvB613Va2O/dsXA8wfAExxOAG9A+zwP7BThusPYKfAEWTxIcX2jffUuXwk/HJ4DX/S3PLZ9mhMh6z8YNZvZWnwx//s//+bf9pHkHnlzfun+1VrRr8VFAspvn1Ol/k/U8GwwlgITbA26btNN3856zzBusiwYunHsOBsDatPQzvS9t/8PASfbq7n1Zb5/HX1/mOI7Spo1lGhDDcRx49eoVXr165S9fvsSLFy/w4sUL//jjj/HBBx/gx3/8x/G3/tbf8h/5kR95rLeU/HkG7elMO51Zr3rhbQ6uzRejASNr/7PWHitJG4v27qwt2E6LtVcvbXppG7f1z6gxTt+1Ns/ae8fcsOkdSXbGbV3Ozu9i/aKZLbOweAm7baMza2NJH9+6z3VaJ+9zRLVlLD2/c35hrONbDofXdujaOeFu9iP99dNlfF3Q274/H2P4g0N2vj56rnbkdcCNt2vmbQKr1wJZ/bo9+/JunofB3kfPtS/fr3Qtzp/uuJD1D8uPJv6Q9Admj/UoXL6S/Yz7342ac3u4m9c7j7dkB3jndjvzGsPPdvEH2oki72u+B9miu9XuDr8/66J+ZGcgF8kNsNs8O3Z8nrqSX76PVuL77jjafmMjb34RYF+6vy/hmVPGrzBekbW93h/5Tsv572xn5EMAf76dgz8K4McA/F/akORHn4eD/XQfV5VfS+/ZKC0We5qzwzGuewPwN98q8Pna175mb8iQfa6BGTOgz1yWAUJpAxHt8rC3ts0z4IJ9l9Toe/UChNtVm2jesm1337alzSsEVvV54SfgqzSGq7ehgypdDjTNGtgO66O/oy/XAJe5u7XXDsxqm4fjOFBrtfbeXr16Za9evSovX770Fy9e+CeffGLf/OY38eGHH9o3vvEN+/rXv24/+qM/ih/7sR8zz35JHVBhgiG+XVwCNY8Ard7HelB9351Huw110BZm2WwPdn1Wz3p5Gb52mZ5darxTm1uNKyponVjfdfapk+s21+2vdxuzDn7aJ0sOgtOrJ03vc9bT760rzHN17CTrLIn0wufjxNu+ejsvxnvRgLC5w3UPze64tnfPra+HwG77yfK6nbv5xmOTNpFCmN1b5APOTqjHx7kddeNz5+OaXLbL63I0lYrPdVGb5jctXHtm/Vje97t42HRsedj8fVvG5JVbU8vMTYz9Nx6c9fBrsAC6+8CHj9/tvP9mR65dTeZ0PzEB0u1Y+Bxc6Oc4rL8kIxY7sGXJz1e/43t87gkgQ7Jq7bDqwMrTQ7/mpw2oKEmDffcYze9VdoJfrnYo25myh5ZFxsjKCVQ6G5/yizvfeWOxOStlDtZZaeDsJ3038osAfjaA7wfwXwHs1wL2RYN9l4VBuzscm09GC5KhOI9BmY/391cf593hXynwX9GA269og3xftzsp/e8C+MsA/k8A/l+NEv3JCMy+C7B6/sMcd2JbAVlY9u0Ds0/hF/B5ZMweAUV6p/LnAK8N8HkEZIHATxhT6+vsQFAAFOi7fTmTZXwDNHcADFfATJfj7XFb5HvhcwNObmaF2KxKoCoFZg2QIQNpDYDd7pPqYMRqrf3vrmM8Dj+Ow2ut3hiy2l7tOA57+fIl2l/55JNP8PHHH/sHH3yAv/N3/g5+/Md/HF//+tf9gw8+CEM5jgmsLMMw9NkSMLaAMwJmFe2VcElt/TCvE7ghYdX4SnbIIL7vrhJPAFRNgJogSdR7Q8YOtmnmQOWdcfoqIcoOzsJ7BmXc+b1mRjJQtVLMVR6a1s7rBBQV3qZ7W+ZoU/qjtT+OK33LCbx56JjPLncEgsbAFkYsr7ULAksXv19vlad1YC1gbZDZnowYeNjyipEds9PvK4BFwMtzG3RnAN8exzbGaTUaW54jCR0c3XcnwuJ5Mce23MHs/cfhPNDQLruJeH2AngD4x2/Hm5CmL9v2k7oK7tbOu9GPOIP30pfwDjh9gfV92GACQKdDwmebAKj7OMbekLShtvtCO07KkFny2RJEgAQ1IQcndgF7rv60OSck04aWKgnytM10CPjwPclkZ0OeJ0RdETrwtoeWJVnMNntjD+DB65254jIZiLH6oRBr9uonW3fxSwD+mwB+PYBfDdjPLiioA3yZ3NXX1yqMGT8huYNnBNBW9iy+lvuT5rsNjgL/h+rc4n8C4E8A+CEAfxZ3bf1PEmBm38nDZ3l3vJjchHyzrH0WgNR7YLYCsvPBpmsQtrtX+gMMmm9A2hlQ8k27+Dm2kwyeMmEbIHYGzFy27y49DmLTOnM11snAirY/ANYdazqfS+/va63eARsDtVpr6V9qrBg6GOt/r1696sAMx3F4B2QvXryoL168wMuXL8vLly/x0Ucf+QcffIBvfOMb+MY3voEPPvjAP/roI0LPiKUhZ4jAG4hSfFMnGGNpY/UJyjrBUQnP9PkO6m9b7P+5EmGgJ0NKUFnojId7njPwYtAm83ln7ADqrTW2s2QdpNUVhDnp91xqbnB2711/UFcAbf3z8YD0AMYqFTs6jXdmpagd3jHn4QKpnDrWHrvZdc67E1Se7KqFNclNIDkez1ANnM7ziy9Zun09Ab5dIBvwum6pL8v7+Q65zs9Y2mQFvrK+ft7ITTv8ep927dqdFd+dKT8HD0qOnNE02yfcvnUZaDhTTKqU8RyYMZR5RL6oSNOxlfj5BRjDBshmgIx3Kvl3S1b1iKr0SmH6WBcF+ZZNQJkpWHt79UQ/wf++DcAvBPDfAezXGexn3ve0DPjTQdmUJzJL1sGYEdiyFJA5saGRQWP2LANnE6D5+OwowPdW1O8F8NsN/tcA/2MA/g8A/n0ALz/jwOyr8ZdoOx1u6GoDKmH47ACpt7q+d8noI1vuww8/3B6HM5DzpuxaIovc3R3LlRxRwNCWMRO2LZM92hVoOwNmm/cdBBmAgxiwsH7+LBLIgODa50qAC8SIjScJAbPBijUTDzQvjw7SrNZaGJQdxxGAGdeUvXz5Ep988ol/85vfrC9evLAXL17Yhx9+iP738ccf+4sXL6b6zqNsyXFJ06wyRtU6tPoyL+0VAtCYFevLYYK1paNqcewpkDPZVRoka77pyPKONGYMjR1j1sylWK4StbesypNiOpbe9fvu479aXawiShl9/FeI50JjyjLwVsNaLIV3SN531ikyXwtzlgIr2yADEh/aZIOss2BlldY1jiVI5Dy5DuL0uyzQCfXPzTk86AMn6zXWYSt5bwIhWPjY98PhKE3COOZ7Gyjtpd4ygGBc3hVFjunl7jyeOrZTSUcqkkUdw7V+zgpxXjlJYR7PAYg9DW02D4TwfT8jRF94D4vnK4COMzbsTerJNmVyV+Vn9uDfifqPAMXTBZQ52xHbt/xsv0sCZIFznablwOwm+M1OYKTCqOd16Naa2P2ZS+qCTWuPP/PA7O8B8NsB/BrAfrahNCBUiB3jv1mPXNoxqu39TsroWKWMJFcMIE2kjAGU9fkdwFmDg6UByPv0+l8uwD9RUf+JxqT9uwB+P4D//LMJzPAVqSPzeLfTIT7LLnRQjRnetitjWN9bcGX83NeYPQrImAzCXmF/xogtrNIDbVTQ5AlQc3lMVGH/kGyTvzeAUqvdGCDVzALLmEkK5b2Cq/A9BlZmZg04mZkNRqtJNcc8RMnjaB/Vinlr45je5+n74zisyxYbc1ZqrUO+2P7w8uVL60DsxYsX+Pjjj+2jjz6yFy9e+De/+U3rfw28WaV+TyWABsIkdlJDBsItOm1IGQmbBFxjMv2I8kVWBzKZtQU0JqArW9aUDpSdcmq4yhm5SK5mO+OJlJGli1V2Jlzpyy1XuqULZzUfnj64r7tEsT9YPcXLtQGzLmOcnFo8FixzNGLY4pq3IzoJsDxnWMJdwn0eqjqPoYvMjhRLine truncated
}
.minicolors-no-data-uris .minicolors-sprite {
background-image: url(jquery.minicolors.png);
}
.minicolors-swatch {
position: absolute;
vertical-align: middle;
background-position: -80px 0;
border: solid 1px #ccc;
cursor: text;
padding: 0;
margin: 0;
display: inline-block;
}
.minicolors-swatch-color {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.minicolors input[type=hidden] + .minicolors-swatch {
width: 28px;
position: static;
cursor: pointer;
}
.minicolors input[type=hidden][disabled] + .minicolors-swatch {
cursor: default;
}
/* Panel */
.minicolors-panel {
position: absolute;
width: 173px;
height: 152px;
background: white;
border: solid 1px #CCC;
box-shadow: 0 0 20px rgba(0, 0, 0, .2);
z-index: 99999;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
display: none;
}
.minicolors-panel.minicolors-visible {
display: block;
}
/* Panel positioning */
.minicolors-position-top .minicolors-panel {
top: -154px;
}
.minicolors-position-right .minicolors-panel {
right: 0;
}
.minicolors-position-bottom .minicolors-panel {
top: auto;
}
.minicolors-position-left .minicolors-panel {
left: 0;
}
.minicolors-with-opacity .minicolors-panel {
width: 194px;
}
.minicolors .minicolors-grid {
position: absolute;
top: 1px;
left: 1px;
width: 150px;
height: 150px;
background-position: -120px 0;
cursor: crosshair;
}
.minicolors .minicolors-grid-inner {
position: absolute;
top: 0;
left: 0;
width: 150px;
height: 150px;
}
.minicolors-slider-saturation .minicolors-grid {
background-position: -420px 0;
}
.minicolors-slider-saturation .minicolors-grid-inner {
background-position: -270px 0;
background-image: inherit;
}
.minicolors-slider-brightness .minicolors-grid {
background-position: -570px 0;
}
.minicolors-slider-brightness .minicolors-grid-inner {
background-color: black;
}
.minicolors-slider-wheel .minicolors-grid {
background-position: -720px 0;
}
.minicolors-slider,
.minicolors-opacity-slider {
position: absolute;
top: 1px;
left: 152px;
width: 20px;
height: 150px;
background-color: white;
background-position: 0 0;
cursor: row-resize;
}
.minicolors-slider-saturation .minicolors-slider {
background-position: -60px 0;
}
.minicolors-slider-brightness .minicolors-slider {
background-position: -20px 0;
}
.minicolors-slider-wheel .minicolors-slider {
background-position: -20px 0;
}
.minicolors-opacity-slider {
left: 173px;
background-position: -40px 0;
display: none;
}
.minicolors-with-opacity .minicolors-opacity-slider {
display: block;
}
/* Pickers */
.minicolors-grid .minicolors-picker {
position: absolute;
top: 70px;
left: 70px;
width: 12px;
height: 12px;
border: solid 1px black;
border-radius: 10px;
margin-top: -6px;
margin-left: -6px;
background: none;
}
.minicolors-grid .minicolors-picker > div {
position: absolute;
top: 0;
left: 0;
width: 8px;
height: 8px;
border-radius: 8px;
border: solid 2px white;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
.minicolors-picker {
position: absolute;
top: 0;
left: 0;
width: 18px;
height: 2px;
background: white;
border: solid 1px black;
margin-top: -2px;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
/* Inline controls */
.minicolors-inline {
display: inline-block;
}
.minicolors-inline .minicolors-input {
display: none !important;
}
.minicolors-inline .minicolors-panel {
position: relative;
top: auto;
left: auto;
box-shadow: none;
z-index: auto;
display: inline-block;
}
/* Default theme */
.minicolors-theme-default .minicolors-swatch {
top: 5px;
left: 5px;
width: 18px;
height: 18px;
}
.minicolors-theme-default.minicolors-position-right .minicolors-swatch {
left: auto;
right: 5px;
}
.minicolors-theme-default.minicolors {
width: auto;
display: inline-block;
}
.minicolors-theme-default .minicolors-input {
height: 20px;
width: auto;
display: inline-block;
padding-left: 26px;
}
.minicolors-theme-default.minicolors-position-right .minicolors-input {
padding-right: 26px;
padding-left: inherit;
}
/* Bootstrap theme */
.minicolors-theme-bootstrap .minicolors-swatch {
z-index: 2;
top: 3px;
left: 3px;
width: 28px;
height: 28px;
border-radius: 3px;
}
.minicolors-theme-bootstrap .minicolors-swatch-color {
border-radius: inherit;
}
.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch {
left: auto;
right: 3px;
}
.minicolors-theme-bootstrap .minicolors-input {
float: none;
padding-left: 44px;
}
.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input {
padding-right: 44px;
padding-left: 12px;
}
.minicolors-theme-bootstrap .minicolors-input.input-lg + .minicolors-swatch {
top: 4px;
left: 4px;
width: 37px;
height: 37px;
border-radius: 5px;
}
.minicolors-theme-bootstrap .minicolors-input.input-sm + .minicolors-swatch {
width: 24px;
height: 24px;
}
.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
+19
View File
@@ -32,6 +32,24 @@ function initInstall() {
}); });
}; };
function initRepository(){
if ($('.repository').length == 0) {
return;
}
if ($('.labels').length == 0) {
return;
}
$('.color-picker').each( function() {
$(this).minicolors();
});
$('.precolors .color').click(function(){
var color_hex = $(this).data('color-hex')
$('.color-picker').val(color_hex);
$('.minicolors-swatch-color').css("background-color", color_hex);
});
};
$(document).ready(function () { $(document).ready(function () {
// Semantic UI modules. // Semantic UI modules.
$('.dropdown').dropdown(); $('.dropdown').dropdown();
@@ -46,4 +64,5 @@ $(document).ready(function () {
$('.poping.up').popup(); $('.poping.up').popup();
initInstall(); initInstall();
initRepository();
}); });
+11
View File
@@ -0,0 +1,11 @@
/*
* jQuery MiniColors: A tiny color picker built on jQuery
*
* Copyright: Cory LaViska for A Beautiful Site, LLC: http://www.abeautifulsite.net/
*
* Contribute: https://github.com/claviska/jquery-minicolors
*
* @license: http://opensource.org/licenses/MIT
*
*/
!function(i){"function"==typeof define&&define.amd?define(["jquery"],i):"object"==typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function($){function i(i,t){var o=$('<div class="minicolors" />'),n=$.minicolors.defaults;i.data("minicolors-initialized")||(t=$.extend(!0,{},n,t),o.addClass("minicolors-theme-"+t.theme).toggleClass("minicolors-with-opacity",t.opacity).toggleClass("minicolors-no-data-uris",t.dataUris!==!0),void 0!==t.position&&$.each(t.position.split(" "),function(){o.addClass("minicolors-position-"+this)}),i.addClass("minicolors-input").data("minicolors-initialized",!1).data("minicolors-settings",t).prop("size",7).wrap(o).after('<div class="minicolors-panel minicolors-slider-'+t.control+'"><div class="minicolors-slider minicolors-sprite"><div class="minicolors-picker"></div></div><div class="minicolors-opacity-slider minicolors-sprite"><div class="minicolors-picker"></div></div><div class="minicolors-grid minicolors-sprite"><div class="minicolors-grid-inner"></div><div class="minicolors-picker"><div></div></div></div></div>'),t.inline||(i.after('<span class="minicolors-swatch minicolors-sprite"><span class="minicolors-swatch-color"></span></span>'),i.next(".minicolors-swatch").on("click",function(t){t.preventDefault(),i.focus()})),i.parent().find(".minicolors-panel").on("selectstart",function(){return!1}).end(),t.inline&&i.parent().addClass("minicolors-inline"),e(i,!1),i.data("minicolors-initialized",!0))}function t(i){var t=i.parent();i.removeData("minicolors-initialized").removeData("minicolors-settings").removeProp("size").removeClass("minicolors-input"),t.before(i).remove()}function o(i){var t=i.parent(),o=t.find(".minicolors-panel"),s=i.data("minicolors-settings");!i.data("minicolors-initialized")||i.prop("disabled")||t.hasClass("minicolors-inline")||t.hasClass("minicolors-focus")||(n(),t.addClass("minicolors-focus"),o.stop(!0,!0).fadeIn(s.showSpeed,function(){s.show&&s.show.call(i.get(0))}))}function n(){$(".minicolors-focus").each(function(){var i=$(this),t=i.find(".minicolors-input"),o=i.find(".minicolors-panel"),n=t.data("minicolors-settings");o.fadeOut(n.hideSpeed,function(){n.hide&&n.hide.call(t.get(0)),i.removeClass("minicolors-focus")})})}function s(i,t,o){var n=i.parents(".minicolors").find(".minicolors-input"),s=n.data("minicolors-settings"),e=i.find("[class$=-picker]"),r=i.offset().left,c=i.offset().top,l=Math.round(t.pageX-r),h=Math.round(t.pageY-c),d=o?s.animationSpeed:0,u,g,p,m;t.originalEvent.changedTouches&&(l=t.originalEvent.changedTouches[0].pageX-r,h=t.originalEvent.changedTouches[0].pageY-c),0>l&&(l=0),0>h&&(h=0),l>i.width()&&(l=i.width()),h>i.height()&&(h=i.height()),i.parent().is(".minicolors-slider-wheel")&&e.parent().is(".minicolors-grid")&&(u=75-l,g=75-h,p=Math.sqrt(u*u+g*g),m=Math.atan2(g,u),0>m&&(m+=2*Math.PI),p>75&&(p=75,l=75-75*Math.cos(m),h=75-75*Math.sin(m)),l=Math.round(l),h=Math.round(h)),i.is(".minicolors-grid")?e.stop(!0).animate({top:h+"px",left:l+"px"},d,s.animationEasing,function(){a(n,i)}):e.stop(!0).animate({top:h+"px"},d,s.animationEasing,function(){a(n,i)})}function a(i,t){function o(i,t){var o,n;return i.length&&t?(o=i.offset().left,n=i.offset().top,{x:o-t.offset().left+i.outerWidth()/2,y:n-t.offset().top+i.outerHeight()/2}):null}var n,s,a,e,c,l,d,g=i.val(),p=i.attr("data-opacity"),f=i.parent(),v=i.data("minicolors-settings"),b=f.find(".minicolors-swatch"),y=f.find(".minicolors-grid"),M=f.find(".minicolors-slider"),w=f.find(".minicolors-opacity-slider"),x=y.find("[class$=-picker]"),C=M.find("[class$=-picker]"),k=w.find("[class$=-picker]"),S=o(x,y),z=o(C,M),D=o(k,w);if(t.is(".minicolors-grid, .minicolors-slider")){switch(v.control){case"wheel":e=y.width()/2-S.x,c=y.height()/2-S.y,l=Math.sqrt(e*e+c*c),d=Math.atan2(c,e),0>d&&(d+=2*Math.PI),l>75&&(l=75,S.x=69-75*Math.cos(d),S.y=69-75*Math.sin(d)),s=u(l/.75,0,100),n=u(180*d/Math.PI,0,360),a=u(100-Math.floor(z.y*(100/M.height())),0,100),g=m({h:n,s:s,b:a}),M.css("backgroundColor",m({h:n,s:s,b:100}));break;case"saturation":n=u(parseInt(S.x*(360/y.width()),10),0,360),s=u(100-Math.floor(z.y*(100/M.height())),0,100),a=u(100-Math.floor(S.y*(100/y.height())),0,100),g=m({h:n,s:s,b:a}),M.css("backgroundColor",m({h:n,s:100,b:a})),f.find(".minicolors-grid-inner").css("opacity",s/100);break;case"brightness":n=u(parseInt(S.x*(360/y.width()),10),0,360),s=u(100-Math.floor(S.y*(100/y.height())),0,100),a=u(100-Math.floor(z.y*(100/M.height())),0,100),g=m({h:n,s:s,b:a}),M.css("backgroundColor",m({h:n,s:s,b:100})),f.find(".minicolors-grid-inner").css("opacity",1-a/100);break;default:n=u(360-parseInt(z.y*(360/M.height()),10),0,360),s=u(Math.floor(S.x*(100/y.width())),0,100),a=u(100-Math.floor(S.y*(100/y.height())),0,100),g=m({h:n,s:s,b:a}),y.css("backgroundColor",m({h:n,s:100,b:100}))}i.val(h(g,v.letterCase))}t.is(".minicolors-opacity-slider")&&(p=v.opacity?parseFloat(1-D.y/w.height()).toFixed(2):1,v.opacity&&i.attr("data-opacity",p)),b.find("SPAN").css({backgroundColor:g,opacity:p}),r(i,g,p)}function e(i,t){vLine truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

-1
View File
@@ -1 +0,0 @@
$(document).ready(function(){$(".dropdown").dropdown({transition:"slide up"})});
+59 -1
View File
@@ -41,6 +41,42 @@
.navbar { .navbar {
height: 60px; height: 60px;
padding-top: 20px; padding-top: 20px;
.ui.secondary.menu .item {
margin-left: -10px;
margin-top: -7px;
&>.input {
.new-label-input,
.color-picker {
background-color: white;
border: 1px solid rgba(0,0,0,.15);
}
}
.new-label-input {
width: 150px;
}
.color-picker {
height: 35px;
width: auto;
padding-left: 30px;
}
.minicolors-swatch.minicolors-sprite {
top: 10px;
left: 10px;
width: 15px;
height: 15px;
}
&.precolors {
padding-left: 0;
padding-right: 0;
margin-right: 10px;
width: 120px;
.color {
float: left;
width: 15px;
height: 15px;
}
}
}
} }
.filter.menu .label.color { .filter.menu .label.color {
padding: 0 8px; padding: 0 8px;
@@ -50,9 +86,10 @@
left: auto!important; left: auto!important;
} }
.issue.list { .issue.list {
clear: both;
list-style: none; list-style: none;
font-size: 13px; font-size: 13px;
padding-top: 45px; padding-top: 15px;
.item { .item {
padding-top: 15px; padding-top: 15px;
padding-bottom: 10px; padding-bottom: 10px;
@@ -79,4 +116,25 @@
padding-top: 15px; padding-top: 15px;
} }
} }
.label.list {
clear: both;
padding-top: 15px;
.item {
padding-top: 10px;
padding-bottom: 10px;
border-bottom: 1px dashed #AAA;
a {
font-size: 15px;
padding-top: 5px;
padding-right: 10px;
color: #666;
&:hover {
color: #000;
}
&.open-issues {
margin-right: 30px;
}
}
}
}
} }
+58 -50
View File
@@ -30,6 +30,8 @@ const (
ISSUE_CREATE base.TplName = "repo/issue/create" ISSUE_CREATE base.TplName = "repo/issue/create"
ISSUE_VIEW base.TplName = "repo/issue/view" ISSUE_VIEW base.TplName = "repo/issue/view"
LABELS base.TplName = "repo/issue/labels"
MILESTONE base.TplName = "repo/issue/milestone" MILESTONE base.TplName = "repo/issue/milestone"
MILESTONE_NEW base.TplName = "repo/issue/milestone_new" MILESTONE_NEW base.TplName = "repo/issue/milestone_new"
MILESTONE_EDIT base.TplName = "repo/issue/milestone_edit" MILESTONE_EDIT base.TplName = "repo/issue/milestone_edit"
@@ -40,6 +42,19 @@ var (
ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded") ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded")
) )
func RetrieveLabels(ctx *middleware.Context) {
labels, err := models.GetLabels(ctx.Repo.Repository.Id)
if err != nil {
ctx.Handle(500, "RetrieveLabels.GetLabels: %v", err)
return
}
for _, l := range labels {
l.CalOpenIssues()
}
ctx.Data["Labels"] = labels
ctx.Data["NumLabels"] = len(labels)
}
func Issues(ctx *middleware.Context) { func Issues(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("repo.issues") ctx.Data["Title"] = ctx.Tr("repo.issues")
ctx.Data["PageIsIssueList"] = true ctx.Data["PageIsIssueList"] = true
@@ -85,17 +100,6 @@ func Issues(ctx *middleware.Context) {
mid = mile.Id mid = mile.Id
} }
selectLabels := ctx.Query("labels")
labels, err := models.GetLabels(repo.Id)
if err != nil {
ctx.Handle(500, "GetLabels: %v", err)
return
}
for _, l := range labels {
l.CalOpenIssues()
}
ctx.Data["Labels"] = labels
page := ctx.QueryInt("page") page := ctx.QueryInt("page")
if page <= 1 { if page <= 1 {
page = 1 page = 1
@@ -107,6 +111,8 @@ func Issues(ctx *middleware.Context) {
ctx.Data["NextPage"] = page + 1 ctx.Data["NextPage"] = page + 1
} }
selectLabels := ctx.Query("labels")
// Get issues. // Get issues.
issues, err := models.GetIssues(assigneeId, repo.Id, posterId, mid, page, issues, err := models.GetIssues(assigneeId, repo.Id, posterId, mid, page,
isShowClosed, selectLabels, ctx.Query("sortType")) isShowClosed, selectLabels, ctx.Query("sortType"))
@@ -125,24 +131,26 @@ func Issues(ctx *middleware.Context) {
// Get posters. // Get posters.
for i := range issues { for i := range issues {
if err = issues[i].GetLabels(); err != nil { if err = issues[i].GetLabels(); err != nil {
ctx.Handle(500, "GetLabels", fmt.Errorf("[#%d]%v", issues[i].Id, err)) ctx.Handle(500, "GetLabels", fmt.Errorf("[#%d]%v", issues[i].ID, err))
return return
} }
idx := models.PairsContains(pairs, issues[i].Id, ctx.User.Id) if ctx.IsSigned {
idx := models.PairsContains(pairs, issues[i].ID, ctx.User.Id)
if filterMode == models.FM_MENTION && (idx == -1 || !pairs[idx].IsMentioned) { if filterMode == models.FM_MENTION && (idx == -1 || !pairs[idx].IsMentioned) {
continue continue
} }
if idx > -1 { if idx > -1 {
issues[i].IsRead = pairs[idx].IsRead issues[i].IsRead = pairs[idx].IsRead
} else { } else {
issues[i].IsRead = true issues[i].IsRead = true
}
} }
if err = issues[i].GetPoster(); err != nil { if err = issues[i].GetPoster(); err != nil {
ctx.Handle(500, "GetPoster", fmt.Errorf("[#%d]%v", issues[i].Id, err)) ctx.Handle(500, "GetPoster", fmt.Errorf("[#%d]%v", issues[i].ID, err))
return return
} }
} }
@@ -257,14 +265,14 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
if err := models.NewIssue(issue); err != nil { if err := models.NewIssue(issue); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} else if err := models.NewIssueUserPairs(ctx.Repo.Repository, issue.Id, ctx.Repo.Owner.Id, } else if err := models.NewIssueUserPairs(ctx.Repo.Repository, issue.ID, ctx.Repo.Owner.Id,
ctx.User.Id, form.AssigneeId); err != nil { ctx.User.Id, form.AssigneeId); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} }
if setting.AttachmentEnabled { if setting.AttachmentEnabled {
uploadFiles(ctx, issue.Id, 0) uploadFiles(ctx, issue.ID, 0)
} }
// Update mentions. // Update mentions.
@@ -274,7 +282,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
ms[i] = ms[i][1:] ms[i] = ms[i][1:]
} }
if err := models.UpdateMentions(ms, issue.Id); err != nil { if err := models.UpdateMentions(ms, issue.ID); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} }
@@ -321,7 +329,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
return return
} }
} }
log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.Id) log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.ID)
send(200, fmt.Sprintf("%s/%s/%s/issues/%d", setting.AppSubUrl, ctx.Params(":username"), ctx.Params(":reponame"), issue.Index), nil) send(200, fmt.Sprintf("%s/%s/%s/issues/%d", setting.AppSubUrl, ctx.Params(":username"), ctx.Params(":reponame"), issue.Index), nil)
} }
@@ -329,7 +337,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
func checkLabels(labels, allLabels []*models.Label) { func checkLabels(labels, allLabels []*models.Label) {
for _, l := range labels { for _, l := range labels {
for _, l2 := range allLabels { for _, l2 := range allLabels {
if l.Id == l2.Id { if l.ID == l2.ID {
l2.IsChecked = true l2.IsChecked = true
break break
} }
@@ -403,7 +411,7 @@ func ViewIssue(ctx *middleware.Context) {
if ctx.IsSigned { if ctx.IsSigned {
// Update issue-user. // Update issue-user.
if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.Id); err != nil { if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil {
ctx.Handle(500, "issue.ViewIssue(UpdateIssueUserPairByRead): %v", err) ctx.Handle(500, "issue.ViewIssue(UpdateIssueUserPairByRead): %v", err)
return return
} }
@@ -420,7 +428,7 @@ func ViewIssue(ctx *middleware.Context) {
issue.RenderedContent = string(base.RenderMarkdown([]byte(issue.Content), ctx.Repo.RepoLink)) issue.RenderedContent = string(base.RenderMarkdown([]byte(issue.Content), ctx.Repo.RepoLink))
// Get comments. // Get comments.
comments, err := models.GetIssueComments(issue.Id) comments, err := models.GetIssueComments(issue.ID)
if err != nil { if err != nil {
ctx.Handle(500, "issue.ViewIssue(GetIssueComments): %v", err) ctx.Handle(500, "issue.ViewIssue(GetIssueComments): %v", err)
return return
@@ -642,7 +650,7 @@ func UpdateAssignee(ctx *middleware.Context) {
aid := com.StrTo(ctx.Query("assigneeid")).MustInt64() aid := com.StrTo(ctx.Query("assigneeid")).MustInt64()
// Not check for invalid assignee id and give responsibility to owners. // Not check for invalid assignee id and give responsibility to owners.
issue.AssigneeId = aid issue.AssigneeId = aid
if err = models.UpdateIssueUserPairByAssignee(aid, issue.Id); err != nil { if err = models.UpdateIssueUserPairByAssignee(aid, issue.ID); err != nil {
ctx.Handle(500, "UpdateIssueUserPairByAssignee: %v", err) ctx.Handle(500, "UpdateIssueUserPairByAssignee: %v", err)
return return
} else if err = models.UpdateIssue(issue); err != nil { } else if err = models.UpdateIssue(issue); err != nil {
@@ -774,7 +782,7 @@ func Comment(ctx *middleware.Context) {
if err = models.UpdateIssue(issue); err != nil { if err = models.UpdateIssue(issue); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} else if err = models.UpdateIssueUserPairsByStatus(issue.Id, issue.IsClosed); err != nil { } else if err = models.UpdateIssueUserPairsByStatus(issue.ID, issue.IsClosed); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} }
@@ -809,11 +817,11 @@ func Comment(ctx *middleware.Context) {
cmtType = models.COMMENT_TYPE_REOPEN cmtType = models.COMMENT_TYPE_REOPEN
} }
if _, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, cmtType, "", nil); err != nil { if _, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.ID, 0, 0, cmtType, "", nil); err != nil {
send(200, nil, err) send(200, nil, err)
return return
} }
log.Trace("%s Issue(%d) status changed: %v", ctx.Req.RequestURI, issue.Id, !issue.IsClosed) log.Trace("%s Issue(%d) status changed: %v", ctx.Req.RequestURI, issue.ID, !issue.IsClosed)
} }
} }
@@ -825,7 +833,7 @@ func Comment(ctx *middleware.Context) {
if len(content) > 0 || len(ctx.Req.MultipartForm.File["attachments"]) > 0 { if len(content) > 0 || len(ctx.Req.MultipartForm.File["attachments"]) > 0 {
switch ctx.Params(":action") { switch ctx.Params(":action") {
case "new": case "new":
if comment, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, models.COMMENT_TYPE_COMMENT, content, nil); err != nil { if comment, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.ID, 0, 0, models.COMMENT_TYPE_COMMENT, content, nil); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} }
@@ -837,13 +845,13 @@ func Comment(ctx *middleware.Context) {
ms[i] = ms[i][1:] ms[i] = ms[i][1:]
} }
if err := models.UpdateMentions(ms, issue.Id); err != nil { if err := models.UpdateMentions(ms, issue.ID); err != nil {
send(500, nil, err) send(500, nil, err)
return return
} }
} }
log.Trace("%s Comment created: %d", ctx.Req.RequestURI, issue.Id) log.Trace("%s Comment created: %d", ctx.Req.RequestURI, issue.ID)
default: default:
ctx.Handle(404, "issue.Comment", err) ctx.Handle(404, "issue.Comment", err)
return return
@@ -851,7 +859,7 @@ func Comment(ctx *middleware.Context) {
} }
if comment != nil { if comment != nil {
uploadFiles(ctx, issue.Id, comment.Id) uploadFiles(ctx, issue.ID, comment.Id)
} }
// Notify watchers. // Notify watchers.
@@ -899,9 +907,19 @@ func Comment(ctx *middleware.Context) {
send(200, fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, index), nil) send(200, fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, index), nil)
} }
func Labels(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("repo.labels")
ctx.Data["PageIsLabels"] = true
ctx.HTML(200, LABELS)
}
func NewLabel(ctx *middleware.Context, form auth.CreateLabelForm) { func NewLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
ctx.Data["Title"] = ctx.Tr("repo.labels")
ctx.Data["PageIsLabels"] = true
if ctx.HasError() { if ctx.HasError() {
Issues(ctx) ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
return return
} }
@@ -911,10 +929,10 @@ func NewLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
Color: form.Color, Color: form.Color,
} }
if err := models.NewLabel(l); err != nil { if err := models.NewLabel(l); err != nil {
ctx.Handle(500, "issue.NewLabel(NewLabel)", err) ctx.Handle(500, "NewLabel", err)
return return
} }
ctx.Redirect(ctx.Repo.RepoLink + "/issues") ctx.Redirect(ctx.Repo.RepoLink + "/labels")
} }
func UpdateLabel(ctx *middleware.Context, form auth.CreateLabelForm) { func UpdateLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
@@ -925,7 +943,7 @@ func UpdateLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
} }
l := &models.Label{ l := &models.Label{
Id: id, ID: id,
Name: form.Title, Name: form.Title,
Color: form.Color, Color: form.Color,
} }
@@ -1151,20 +1169,10 @@ func IssueGetAttachment(ctx *middleware.Context) {
ctx.ServeFile(attachment.Path, "\""+attachment.Name+"\"") ctx.ServeFile(attachment.Path, "\""+attachment.Name+"\"")
} }
// testing route handler for new issue ui page
// todo : move to Issue() function
func Issues2(ctx *middleware.Context) {
ctx.HTML(200, "repo/issue2/list")
}
func PullRequest2(ctx *middleware.Context) { func PullRequest2(ctx *middleware.Context) {
ctx.HTML(200, "repo/pr2/list") ctx.HTML(200, "repo/pr2/list")
} }
func Labels2(ctx *middleware.Context) {
ctx.HTML(200, "repo/issue2/labels")
}
func Milestones2(ctx *middleware.Context) { func Milestones2(ctx *middleware.Context) {
ctx.HTML(200, "repo/milestone2/list") ctx.HTML(200, "repo/milestone2/list")
} }
+1 -1
View File
@@ -1 +1 @@
0.6.1.0724 Beta 0.6.2.0724 Beta
+6
View File
@@ -29,6 +29,12 @@
<script src="{{AppSubUrl}}/js/semantic.min.js?v={{AppVer}}"></script> <script src="{{AppSubUrl}}/js/semantic.min.js?v={{AppVer}}"></script>
<script src="{{AppSubUrl}}/js/gogs.js?v={{AppVer}}"></script> <script src="{{AppSubUrl}}/js/gogs.js?v={{AppVer}}"></script>
<!-- Third-party libraries -->
{{if .PageIsLabels}}
<link rel="stylesheet" href="{{AppSubUrl}}/css/jquery.minicolors.css?v={{AppVer}}">
<script src="{{AppSubUrl}}/js/libs/jquery.minicolors.min.js?v={{AppVer}}"></script>
{{end}}
<title>{{if .Title}}{{.Title}} - {{end}}{{AppName}}</title> <title>{{if .Title}}{{.Title}} - {{end}}{{AppName}}</title>
</head> </head>
<body> <body>
+5
View File
@@ -0,0 +1,5 @@
{{if .Flash}}
<div class="sixteen wide center aligned centered column">
{{template "base/alert" .}}
</div>
{{end}}
+64
View File
@@ -0,0 +1,64 @@
{{template "base/head" .}}
<div class="repository labels">
{{template "repo/header" .}}
<div class="ui middle page grid body">
<div class="navbar">
{{template "repo/issue/navbar" .}}
{{if .IsRepositoryAdmin}}
<form class="ui right form" action="{{$.RepoLink}}/labels/new" method="post">
{{.CsrfTokenHtml}}
<div class="ui right floated secondary menu">
<div class="item">
<div class="ui large input">
<input class="new-label-input" name="title" placeholder="{{.i18n.Tr "repo.issues.new_label_placeholder"}}" required>
</div>
</div>
<div class="item">
<div class="ui large input">
<input class="color-picker" name="color" value="#70c24a" required>
</div>
</div>
<div class="item precolors">
<a class="color" style="background-color:#e11d21" data-color-hex="#e11d21"></a>
<a class="color" style="background-color:#eb6420" data-color-hex="#eb6420"></a>
<a class="color" style="background-color:#fbca04" data-color-hex="#fbca04"></a>
<a class="color" style="background-color:#009800" data-color-hex="#009800"></a>
<a class="color" style="background-color:#006b75" data-color-hex="#006b75"></a>
<a class="color" style="background-color:#207de5" data-color-hex="#207de5"></a>
<a class="color" style="background-color:#0052cc" data-color-hex="#0052cc"></a>
<a class="color" style="background-color:#53e917" data-color-hex="#53e917"></a>
<a class="color" style="background-color:#f6c6c7" data-color-hex="#f6c6c7"></a>
<a class="color" style="background-color:#fad8c7" data-color-hex="#fad8c7"></a>
<a class="color" style="background-color:#fef2c0" data-color-hex="#fef2c0"></a>
<a class="color" style="background-color:#bfe5bf" data-color-hex="#bfe5bf"></a>
<a class="color" style="background-color:#bfdadc" data-color-hex="#bfdadc"></a>
<a class="color" style="background-color:#c7def8" data-color-hex="#c7def8"></a>
<a class="color" style="background-color:#bfd4f2" data-color-hex="#bfd4f2"></a>
<a class="color" style="background-color:#d4c5f9" data-color-hex="#d4c5f9"></a>
</div>
<button class="ui green button">{{.i18n.Tr "repo.issues.new_label"}}</button>
</div>
</form>
{{end}}
</div>
<div class="ui divider"></div>
{{template "repo/issue/alert" .}}
<div class="ui left">
<div class="ui black label">{{.i18n.Tr "repo.issues.label_count" .NumLabels}}</div>
</div>
<div class="label list">
{{range .Labels}}
<li class="item">
<div class="ui label" style="background-color: {{.Color}}"><i class="octicon octicon-tag"></i> {{.Name}}</div>
{{if $.IsRepositoryAdmin}}
<a class="ui right" href="#"><i class="octicon octicon-x"></i> {{$.i18n.Tr "repo.issues.label_delete"}}</a>
<a class="ui right" href="#"><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a>
{{end}}
<a class="ui right open-issues" href="{{$.RepoLink}}/issues?labels={{.ID}}"><i class="octicon octicon-issue-opened"></i> {{$.i18n.Tr "repo.issues.label_open_issues" .NumOpenIssues}}</a>
</li>
{{end}}
</div>
</div>
</div>
{{template "base/footer" .}}
+4 -2
View File
@@ -4,9 +4,11 @@
<div class="ui middle page grid body"> <div class="ui middle page grid body">
<div class="navbar"> <div class="navbar">
{{template "repo/issue/navbar" .}} {{template "repo/issue/navbar" .}}
{{if .IsRepositoryAdmin}}
<div class="ui right floated secondary menu"> <div class="ui right floated secondary menu">
<a class="ui green button" href="{{$.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a> <a class="ui green button" href="{{$.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a>
</div> </div>
{{end}}
</div> </div>
<div class="ui divider"></div> <div class="ui divider"></div>
<div class="ui left"> <div class="ui left">
@@ -29,7 +31,7 @@
</span> </span>
<div class="menu"> <div class="menu">
{{range .Labels}} {{range .Labels}}
<a class="item" href="{{$.RepoLink}}/issues?type={{$.ViewType}}&state={{$.State}}&labels={{.Id}}"><span class="label color" style="background-color: {{.Color}}"></span> {{.Name}}</a> <a class="item" href="{{$.RepoLink}}/issues?type={{$.ViewType}}&state={{$.State}}&labels={{.ID}}"><span class="label color" style="background-color: {{.Color}}"></span> {{.Name}}</a>
{{end}} {{end}}
</div> </div>
</div> </div>
@@ -73,7 +75,7 @@
{{range .Issues}} {{range .Issues}}
{{ $timeStr:= TimeSince .Created $.Lang }} {{ $timeStr:= TimeSince .Created $.Lang }}
<li class="item"> <li class="item">
<div class="ui {{if .IsRead}}black{{else}}green{{end}} label">#{{.Id}}</div> <div class="ui {{if .IsRead}}black{{else}}green{{end}} label">#{{.Index}}</div>
<a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Name}}</a> <a class="title" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Name}}</a>
{{if .NumComments}}<span class="comment ui right"><i class="octicon octicon-comment"></i> {{.NumComments}}</span>{{end}} {{if .NumComments}}<span class="comment ui right"><i class="octicon octicon-comment"></i> {{.NumComments}}</span>{{end}}
<p class="desc">{{$.i18n.Tr "repo.issues.opened_by" $timeStr .Poster.Name|Str2html}}</p> <p class="desc">{{$.i18n.Tr "repo.issues.opened_by" $timeStr .Poster.Name|Str2html}}</p>
+1 -1
View File
@@ -1,7 +1,7 @@
<div class="ui left"> <div class="ui left">
<div class="ui compact menu"> <div class="ui compact menu">
<a class="{{if .PageIsIssueList}}active{{end}} item" href="{{.RepoLink}}/issues">{{.i18n.Tr "repo.issues"}}</a> <a class="{{if .PageIsIssueList}}active{{end}} item" href="{{.RepoLink}}/issues">{{.i18n.Tr "repo.issues"}}</a>
<a class="item" href="{{.RepoLink}}/labels">{{.i18n.Tr "repo.labels"}}</a> <a class="{{if .PageIsLabels}}active{{end}} item" href="{{.RepoLink}}/labels">{{.i18n.Tr "repo.labels"}}</a>
<a class="item" href="{{.RepoLink}}/milestones">{{.i18n.Tr "repo.milestones"}}</a> <a class="item" href="{{.RepoLink}}/milestones">{{.i18n.Tr "repo.milestones"}}</a>
</div> </div>
</div> </div>
+5 -5
View File
@@ -3,15 +3,15 @@
{{template "repo/nav" .}} {{template "repo/nav" .}}
{{template "repo/toolbar" .}} {{template "repo/toolbar" .}}
<div id="body" class="container"> <div id="body" class="container">
<div id="issue" data-id="{{.Issue.Id}}"> <div id="issue" data-id="{{.Issue.ID}}">
<div id="issue-{{.Issue.Id}}" class="issue-whole issue-is-opening"> <div id="issue-{{.Issue.ID}}" class="issue-whole issue-is-opening">
<div class="issue-wrap col-md-10"> <div class="issue-wrap col-md-10">
<div class="issue-head clearfix"> <div class="issue-head clearfix">
<div class="number pull-right">#{{.Issue.Index}}</div> <div class="number pull-right">#{{.Issue.Index}}</div>
<a class="author pull-left" href="{{AppSubUrl}}/{{.Issue.Poster.Name}}"><img class="avatar" src="{{.Issue.Poster.AvatarLink}}" alt="" width="30"/></a> <a class="author pull-left" href="{{AppSubUrl}}/{{.Issue.Poster.Name}}"><img class="avatar" src="{{.Issue.Poster.AvatarLink}}" alt="" width="30"/></a>
<h1 class="title pull-left">{{.Issue.Name}}</h1> <h1 class="title pull-left">{{.Issue.Name}}</h1>
<input id="issue-edit-title" class="form-control input-lg pull-left hidden" type="text" value="{{.Issue.Name}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="title"/> <input id="issue-edit-title" class="form-control input-lg pull-left hidden" type="text" value="{{.Issue.Name}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="title"/>
<input type="hidden" value="{{.Issue.Id}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="issue_id"/> <input type="hidden" value="{{.Issue.ID}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="issue_id"/>
<p class="info pull-left"> <p class="info pull-left">
{{if .IsIssueOwner}}<a class="btn btn-default pull-right issue-edit" href="#" id="issue-edit-btn">Edit</a> {{if .IsIssueOwner}}<a class="btn btn-default pull-right issue-edit" href="#" id="issue-edit-btn">Edit</a>
<a class="btn btn-danger pull-right issue-edit-cancel hidden" href="#">Cancel</a> <a class="btn btn-danger pull-right issue-edit-cancel hidden" href="#">Cancel</a>
@@ -178,7 +178,7 @@
<div class="dropdown-menu dropdown-menu-right no"> <div class="dropdown-menu dropdown-menu-right no">
<ul class="list-unstyled"> <ul class="list-unstyled">
{{range .Labels}} {{range .Labels}}
<li class="{{if not .IsChecked}}no-{{end}}checked" data-id="{{.Id}}"> <li class="{{if not .IsChecked}}no-{{end}}checked" data-id="{{.ID}}">
{{if .IsChecked}}<span class="check pull-left"><i class="fa fa-check"></i></span>{{end}} {{if .IsChecked}}<span class="check pull-left"><i class="fa fa-check"></i></span>{{end}}
<span class="color" style="background-color: {{.Color}}"></span> <span class="color" style="background-color: {{.Color}}"></span>
<span class="name">{{.Name}}</span> <span class="name">{{.Name}}</span>
@@ -191,7 +191,7 @@
<h4>Labels</h4> <h4>Labels</h4>
{{if .Issue.Labels}} {{if .Issue.Labels}}
{{range .Issue.Labels}} {{range .Issue.Labels}}
<p id="label-{{.Id}}" class="label-item label-white" style="background-color: {{.Color}}"><strong>{{.Name}}</strong></p> <p id="label-{{.ID}}" class="label-item label-white" style="background-color: {{.Color}}"><strong>{{.Name}}</strong></p>
{{end}} {{end}}
{{else}} {{else}}
<p>None yet</p> <p>None yet</p>
-74
View File
@@ -1,74 +0,0 @@
{{template "ng/base/head" .}}
{{template "ng/base/header" .}}
<div id="repo-wrapper">
{{template "repo/header_old" .}}
<div class="issue-main container repo-wide-wrapper">
<ul id="issue-list-nav" class="menu menu-line">
<li><a href="#">Issue</a></li>
<li><a href="#">Pull Request</a></li>
<li class="current"><a href="#">Labels</a></li>
<li><a href="#">Milestones</a></li>
<li class="right" id="label-new"><a href="#"><button id="label-new-btn" class="btn btn-green text-bold">New Label</button></a></li>
</ul>
<form id="label-add-form" action="#" class="form clear hidden">
<input type="text" class="ipt" name="name" placeholder="label name" id="label-add-name"/>
<div class="inline down drop label-color-drop">
<label for="label-add-color"></label>
<input class="ipt" name="color" type="text" placeholder="color" id="label-add-color"/>
<div class="drop-down">
<a href="#" class="color" style="background: red"></a>
<a href="#" class="color" style="background: green"></a>
</div>
</div>
<button class="btn btn-gray right" type="button" id="label-cancel-btn">Cancel</button>
<button class="btn btn-green right" id="label-add-btn">Create</button>
</form>
<div id="issue-list-container">
<div id="issue-list-menu">
<div class="left"><span class="label label-black" id="labels-num">6</span><strong>Labels</strong></div>
<div class="clear"></div>
</div>
<ul id="label-list" class="list-no-style">
<li class="item" id="label-id">
<a class="right delete" href="#"><i class="octicon octicon-x"></i>Delete</a>
<a class="right edit" href="#"><i class="octicon octicon-pencil"></i>Edit</a>
<a class="right issue-num" href="#"><i class="octicon octicon-issue-opened"></i><strong class="num">12</strong>Issues</a>
<a class="left label clear" href="#" style="background-color: #0052cc" data-color-hex="#0052cc"><i class="octicon octicon-tag"></i><strong>bug</strong></a>
</li>
<li class="item" id="label-id">
<a class="right" href="#"><i class="octicon octicon-x"></i>Delete</a>
<a class="right" href="#"><i class="octicon octicon-pencil"></i>Edit</a>
<a class="right issue-num" href="#"><i class="octicon octicon-issue-opened"></i><strong class="num">12</strong>Issues</a>
<a class="left label clear" href="#" style="background-color: red"><i class="octicon octicon-tag"></i><strong>bug</strong></a>
</li>
</ul>
</div>
</div>
</div>
<div id="label-edit-form-tpl" class="hidden">
<li class="item"><form id="label-edit-form" action="#" class="form clear">
<input type="text" class="ipt" name="name" placeholder="label name" id="label-edit-name"/>
<input type="hidden" name="id" value="id"/>
<div class="inline down drop label-color-drop">
<label for="label-add-color"></label>
<input class="ipt" name="color" type="text" placeholder="color" id="label-edit-color"/>
<div class="drop-down">
<a href="#" class="color" style="background: red"></a>
<a href="#" class="color" style="background: green"></a>
</div>
</div>
<button class="btn btn-gray right" type="button" id="label-edit-cancel-btn">Cancel</button>
<button class="btn btn-green right" id="label-edit-btn">Save Changes</button>
</form></li>
</div>
<div id="label-delete-form-tpl" class="hidden">
<li class="item">
<form id="label-delete-form" action="#">
<input type="hidden" name="id" value="id"/>
<span><strong class="text-red">Are you sure?</strong> Deleting a label will remove it from all issues and pull requests.</span>
<button class="btn btn-gray right" type="button" id="label-del-cancel-btn">Cancel</button>
<button class="btn btn-red right" id="label-del-btn">Delete</button>
</form>
</li>
</div>
{{template "ng/base/footer" .}}