diff options
-rw-r--r-- | issues.go | 41 | ||||
-rw-r--r-- | list.tmpl | 8 | ||||
-rw-r--r-- | table.tmpl | 194 |
3 files changed, 149 insertions, 94 deletions
@@ -36,7 +36,7 @@ type Issue struct { Category KeyVal TargetVersion KeyVal `json:"target_version"` Reporter KeyVal - handler KeyVal + Handler KeyVal Status KeyVal Resolution KeyVal ViewState KeyVal `json:"view_state"` @@ -103,6 +103,15 @@ func (b ByCategory) Less(i, j int) bool { } func (b ByCategory) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +type ByAssignment []Issue + +func (b ByAssignment) Len() int { return len(b) } +func (b ByAssignment) Less(i, j int) bool { + return strings.Compare(b[i].Handler.Name, b[j].Handler.Name) < 0 +} +func (b ByAssignment) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + + type ById []Issue func (b ById) Len() int { return len(b) } @@ -117,6 +126,19 @@ func (b ByTarget) Less(i, j int) bool { } func (b ByTarget) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +type ByHandlerAndId []Issue + +func (b ByHandlerAndId) Len() int { return len(b) } +func (b ByHandlerAndId) Less(i, j int) bool { + if (b[i].Handler.Name == "") == (b[j].Handler.Name == "") { + return b[i].Id < b[j].Id + } else if b[i].Handler.Name == "" { + return true + } + return false +} +func (b ByHandlerAndId) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + func (i Issues) Tags() (tags []string) { var m = map[string]bool{} for _, issue := range i { @@ -131,6 +153,19 @@ func (i Issues) Tags() (tags []string) { return } +func (is Issues) Assigned(assigned bool) (n int) { + for _, i := range is { + if assigned == (i.Handler.Name != "") { + n += 1 + } + } + return n +} + +func (i *Issue) IsHandled() bool { + return i.Handler.Name != "" +} + func (i Issues) TargetVersions() (targets []string) { var m = map[string]bool{} for _, issue := range i { @@ -164,7 +199,7 @@ func (i Issues) ByCategory(cat string) (issues Issues) { issues = append(issues, issue) } } - sort.Sort(ById(issues)) + sort.Sort(sort.Reverse(ByHandlerAndId(issues))) return issues } @@ -175,6 +210,6 @@ func (i Issues) ByCategoryAndTarget(cat, tar string) (issues Issues) { issues = append(issues, is) } } - sort.Sort(ById(issues)) + sort.Sort(sort.Reverse(ByHandlerAndId(issues))) return } @@ -42,14 +42,18 @@ pre { <h4>Features</h4> {{- range $features.ByCategory $cat }} <details> - <summary><a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}</summary> + <summary> + {{ if .IsHandled }}<span title="assigned to {{.Handler.Name}}">🥷</span>{{else}}<span title="unassigned">❓</span>{{end}} + <a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}</summary> <pre>{{ .Description }}</pre> </details> {{ end -}} <h4>Issues</h4> {{- range $issues.ByCategory $cat }} <details> - <summary><a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}</summary> + <summary> + {{ if .IsHandled }}<span title="assigned to {{.Handler.Name}}">🥷</span>{{else}}<span title="unassigned">❓</span>{{end}} + <a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}</summary> <pre>{{ .Description }}</pre> </details> {{ end -}} @@ -1,121 +1,137 @@ <!DOCTYPE html> - <head><title>GNU Taler Dashboard</title> + <head><title>GNU Taler Dashboard</title> <style> body { - margin-left:1%; - margin-right:1%; - font-family:sans-serif; + margin-left:1%; + margin-right:1%; + font-family:sans-serif; } table { - background: white; - border-collapse: collapse; + background: white; + border-collapse: collapse; } th, td { - padding: 8px; - border: 1px solid #ddd; - vertical-align: top; + padding: 8px; + border: 1px solid #ddd; + vertical-align: top; } td { - min-width: 10em; + min-width: 10em; } th.side { - color: brown; - text-align: right; + color: brown; + text-align: right; } tr:hover { - background: #efe; + background: #efefef; } .feature { - background: #cde; + background: #cdf; } .issue { - background: #edc; + background: #edc; } .minh { - min-height: 5em; + min-height: 5em; +} +summary { + display: flex; + justify-content: space-between; + align-items: center; + gap: 5px; +} +.assignment { + font-size: smaller; + color: grey; } details { - max-width: 50vw; - border-radius: 5px; - padding: 8px; - overflow-x: auto; - white-space: nowrap; - text-overflow: ellipsis; + max-width: 50vw; + border-radius: 5px; + padding: 8px; + overflow-x: auto; + white-space: nowrap; + text-overflow: ellipsis; } details[open] { - position: absolute; - background: white; - border: 2px grey solid; + position: absolute; + background: white; + border: 2px grey solid; } details.version { - max-width: 30vw; - padding: 5px; - font-weight: normal; - overflow: none; - white-space: normal; - text-align: justify; + max-width: 30vw; + padding: 5px; + font-weight: normal; + overflow: none; + white-space: normal; + text-align: justify; } details[open].feature { - background: aliceblue; - border: 2px midnightblue solid; + background: aliceblue; + border: 2px midnightblue solid; } details[open].issue { - background: lightyellow; - border: 2px brown solid; + background: lightyellow; + border: 2px brown solid; } </style></head> - <body> - <h1>GNU Taler Dashboard</h1> - <h2>Table view | <a href="/list">List View</a></h2> - Data from {{ .Timestamp.Format "02 Jan 06 15:04 MST"}}, updateting every {{ .Freq }} (no auto-refresh) - {{- with .Lasterror }}, Last error: {{ . }} {{end }} - {{- $top := . -}} - {{- $features := .Features -}} - {{- $issues := .Issues -}} - {{- $versions := .VersionsByDate -}} - <!--p> - {{- range $top.Tags -}}<button>{{ . }}</button>{{- end -}} - </p--> - <table> - <tr> - <th class="side"></th> - {{- range $vname := $top.TargetVersions }} - {{- with $version := $versions.Get . }} - <th> - <details class="version"> - <summary><b>{{ $vname }}</b> ({{ $version.Timestamp.Format "02 Jan 06"}})</summary> - <div>{{ $version.Description }}</div> - </details> - </th> - {{- end}} - {{- end}} - </tr> - {{- range $cat := $top.Categories }} - <tr> - <th class="side">{{ . }}</th> - {{- range $tar := $top.TargetVersions }} - {{- with $version := $versions.Get . }} - <td><div class="minh">{{ with $features.ByCategoryAndTarget $cat $tar }} - <details class="feature"> - <summary>{{ $l := len .}}{{ if lt 1 $l }}{{ $l }} features{{ else }}1 feature{{ end }}</summary> - {{- range . }} - <a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}<br> - {{- end}} - </details> - {{- end }} - {{- with $issues.ByCategoryAndTarget $cat $tar }} - <details class="issue"> - <summary>{{ $l := len .}}{{ if lt 1 $l }}{{ $l }} issues{{ else }}1 issue{{ end }}</summary> - {{- range . }} - <a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}<br>{{end}} - </details> - {{ end -}} - </div></td>{{ end }} - {{ end }} - </tr> - {{- end}} - </table> - <p> - <i>taler-dashboard - version: {{.Commit}} - <a href="https://git.kesim.org/taler/taler-dashboard">https://git.kesim.org/taler/taler-dashboard</a> </i> - </body> + <body> + <h1>GNU Taler Dashboard</h1> + <h2>Table view | <a href="/list">List View</a></h2> + Data from {{ .Timestamp.Format "02 Jan 06 15:04 MST"}}, updateting every {{ .Freq }} (no auto-refresh) + {{- with .Lasterror }}, Last error: {{ . }} {{end }} + {{- $top := . -}} + {{- $features := .Features -}} + {{- $issues := .Issues -}} + {{- $versions := .VersionsByDate -}} + <!--p> + {{- range $top.Tags -}}<button>{{ . }}</button>{{- end -}} + </p--> + <table> + <tr> + <th class="side"></th> + {{- range $vname := $top.TargetVersions }} + {{- with $version := $versions.Get . }} + <th> + <details class="version"> + <summary><b>{{ $vname }}</b> ({{ $version.Timestamp.Format "02 Jan 06"}})</summary> + <div>{{ $version.Description }}</div> + </details> + </th> + {{- end}} + {{- end}} + </tr> + {{- range $cat := $top.Categories }} + <tr> + <th class="side">{{ . }}</th> + {{- range $tar := $top.TargetVersions }} + {{- with $version := $versions.Get . }} + <td><div class="minh">{{ with $features.ByCategoryAndTarget $cat $tar }} + <details class="feature"> + <summary>{{ $l := len .}}{{ if lt 1 $l }}{{ $l }} features{{ else }}1 feature{{ end }} + {{- $unassigned := .Assigned false }}{{if gt $unassigned 0 }} <span class="assignment">({{ $unassigned}} unassigned)</span>{{ end -}} + </summary> + {{- range . }} + {{ if .IsHandled }}<span title="assigned to {{.Handler.Name}}">🥷</span>{{else}}<span title="unassigned">❓</span>{{end}} + <a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}<br> + {{- end}} + </details> + {{- end }} + {{- with $issues.ByCategoryAndTarget $cat $tar }} + <details class="issue"> + <summary>{{ $l := len .}}{{ if lt 1 $l }}{{ $l }} issues{{ else }}1 issue{{ end }} + {{- $unassigned := .Assigned false }}{{if gt $unassigned 0 }} <span class="assignment">({{ $unassigned}} unassigned)</span>{{ end -}} + </summary> + {{- range . }} + {{ if .IsHandled }}<span title="assigned to {{.Handler.Name}}">🥷</span>{{else}}<span title="unassigned">❓</span>{{end}} + <a href="https://bugs.gnunet.org/view.php?id={{.Id}}" target="_blank">{{.Id}}</a> {{.Summary}}<br>{{end}} + </details> + {{ end -}} + </div></td>{{ end }} + {{ end }} + </tr> + {{- end}} + </table> + <p> + <i>taler-dashboard - version: {{.Commit}} - <a href="https://git.kesim.org/taler/taler-dashboard">https://git.kesim.org/taler/taler-dashboard</a> </i> + </body> </html> |