Add ForegroundColor for labels to resolve #2033tags/v1.2.0-rc1
@@ -8,10 +8,12 @@ import ( | |||||
"bytes" | "bytes" | ||||
"errors" | "errors" | ||||
"fmt" | "fmt" | ||||
"html/template" | |||||
"io" | "io" | ||||
"mime/multipart" | "mime/multipart" | ||||
"os" | "os" | ||||
"path" | "path" | ||||
"strconv" | |||||
"strings" | "strings" | ||||
"time" | "time" | ||||
@@ -958,6 +960,26 @@ func (m *Label) CalOpenIssues() { | |||||
m.NumOpenIssues = m.NumIssues - m.NumClosedIssues | m.NumOpenIssues = m.NumIssues - m.NumClosedIssues | ||||
} | } | ||||
// ForegroundColor calculates the text color for labels based | |||||
// on their background color | |||||
func (l *Label) ForegroundColor() template.CSS { | |||||
if strings.HasPrefix(l.Color, "#") { | |||||
if color, err := strconv.ParseUint(l.Color[1:], 16, 64); err == nil { | |||||
r := float32(0xFF & (color >> 16)) | |||||
g := float32(0xFF & (color >> 8)) | |||||
b := float32(0xFF & color) | |||||
luminance := (0.2126*r + 0.7152*g + 0.0722*b) / 255 | |||||
if luminance < 0.5 { | |||||
return template.CSS("rgba(255,255,255,.8)") | |||||
} | |||||
} | |||||
} | |||||
// default to black | |||||
return template.CSS("rgba(0,0,0,.8)") | |||||
} | |||||
// NewLabel creates new label of repository. | // NewLabel creates new label of repository. | ||||
func NewLabel(l *Label) error { | func NewLabel(l *Label) error { | ||||
_, err := x.Insert(l) | _, err := x.Insert(l) | ||||
@@ -39,7 +39,7 @@ | |||||
<div class="label list"> | <div class="label list"> | ||||
{{range .Labels}} | {{range .Labels}} | ||||
<li class="item"> | <li class="item"> | ||||
<div class="ui label" style="background-color: {{.Color}}"><i class="octicon octicon-tag"></i> {{.Name}}</div> | |||||
<div class="ui label" style="color: {{.ForegroundColor}}; background-color: {{.Color}}"><i class="octicon octicon-tag"></i> {{.Name}}</div> | |||||
{{if $.IsRepositoryAdmin}} | {{if $.IsRepositoryAdmin}} | ||||
<a class="ui right delete-button" href="#" data-url="{{$.RepoLink}}/labels/delete" data-id="{{.ID}}"><i class="octicon octicon-trashcan"></i> {{$.i18n.Tr "repo.issues.label_delete"}}</a> | <a class="ui right delete-button" href="#" data-url="{{$.RepoLink}}/labels/delete" data-id="{{.ID}}"><i class="octicon octicon-trashcan"></i> {{$.i18n.Tr "repo.issues.label_delete"}}</a> | ||||
<a class="ui right edit-label-button" href="#" data-id={{.ID}} data-title={{.Name}} data-color={{.Color}}><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a> | <a class="ui right edit-label-button" href="#" data-id={{.ID}} data-title={{.Name}} data-color={{.Color}}><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a> | ||||
@@ -105,7 +105,7 @@ | |||||
<a class="title" href="{{$.Link}}/{{.Index}}">{{.Name}}</a> | <a class="title" href="{{$.Link}}/{{.Index}}">{{.Name}}</a> | ||||
{{range .Labels}} | {{range .Labels}} | ||||
<a class="ui label" href="{{$.Link}}?type={{$.ViewType}}&state={{$.State}}&labels={{.ID}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}" style="background-color: {{.Color}}">{{.Name}}</a> | |||||
<a class="ui label" href="{{$.Link}}?type={{$.ViewType}}&state={{$.State}}&labels={{.ID}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}}">{{.Name}}</a> | |||||
{{end}} | {{end}} | ||||
{{if .NumComments}} | {{if .NumComments}} | ||||