replace #27187 close #23688 The badge has two parts: label(workflow name) and message(action status). 5 colors are provided with 7 statuses. Color mapping: ```go var statusColorMap = map[actions_model.Status]string{ actions_model.StatusSuccess: "#4c1", // Green actions_model.StatusSkipped: "#dfb317", // Yellow actions_model.StatusUnknown: "#97ca00", // Light Green actions_model.StatusFailure: "#e05d44", // Red actions_model.StatusCancelled: "#fe7d37", // Orange actions_model.StatusWaiting: "#dfb317", // Yellow actions_model.StatusRunning: "#dfb317", // Yellow actions_model.StatusBlocked: "#dfb317", // Yellow } ``` preview:      --------- Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io> Co-authored-by: delvh <dev.lh@web.de>
105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package badge
|
|
|
|
import (
|
|
actions_model "code.gitea.io/gitea/models/actions"
|
|
)
|
|
|
|
// The Badge layout: |offset|label|message|
|
|
// We use 10x scale to calculate more precisely
|
|
// Then scale down to normal size in tmpl file
|
|
|
|
type Label struct {
|
|
text string
|
|
width int
|
|
}
|
|
|
|
func (l Label) Text() string {
|
|
return l.text
|
|
}
|
|
|
|
func (l Label) Width() int {
|
|
return l.width
|
|
}
|
|
|
|
func (l Label) TextLength() int {
|
|
return int(float64(l.width-defaultOffset) * 9.5)
|
|
}
|
|
|
|
func (l Label) X() int {
|
|
return l.width*5 + 10
|
|
}
|
|
|
|
type Message struct {
|
|
text string
|
|
width int
|
|
x int
|
|
}
|
|
|
|
func (m Message) Text() string {
|
|
return m.text
|
|
}
|
|
|
|
func (m Message) Width() int {
|
|
return m.width
|
|
}
|
|
|
|
func (m Message) X() int {
|
|
return m.x
|
|
}
|
|
|
|
func (m Message) TextLength() int {
|
|
return int(float64(m.width-defaultOffset) * 9.5)
|
|
}
|
|
|
|
type Badge struct {
|
|
Color string
|
|
FontSize int
|
|
Label Label
|
|
Message Message
|
|
}
|
|
|
|
func (b Badge) Width() int {
|
|
return b.Label.width + b.Message.width
|
|
}
|
|
|
|
const (
|
|
defaultOffset = 9
|
|
defaultFontSize = 11
|
|
DefaultColor = "#9f9f9f" // Grey
|
|
defaultFontWidth = 7 // approximate speculation
|
|
)
|
|
|
|
var StatusColorMap = map[actions_model.Status]string{
|
|
actions_model.StatusSuccess: "#4c1", // Green
|
|
actions_model.StatusSkipped: "#dfb317", // Yellow
|
|
actions_model.StatusUnknown: "#97ca00", // Light Green
|
|
actions_model.StatusFailure: "#e05d44", // Red
|
|
actions_model.StatusCancelled: "#fe7d37", // Orange
|
|
actions_model.StatusWaiting: "#dfb317", // Yellow
|
|
actions_model.StatusRunning: "#dfb317", // Yellow
|
|
actions_model.StatusBlocked: "#dfb317", // Yellow
|
|
}
|
|
|
|
// GenerateBadge generates badge with given template
|
|
func GenerateBadge(label, message, color string) Badge {
|
|
lw := defaultFontWidth*len(label) + defaultOffset
|
|
mw := defaultFontWidth*len(message) + defaultOffset
|
|
x := lw*10 + mw*5 - 10
|
|
return Badge{
|
|
Label: Label{
|
|
text: label,
|
|
width: lw,
|
|
},
|
|
Message: Message{
|
|
text: message,
|
|
width: mw,
|
|
x: x,
|
|
},
|
|
FontSize: defaultFontSize * 10,
|
|
Color: color,
|
|
}
|
|
}
|