blob: c20031c936475106a5fd9a0b03e2708be4e52a80 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Go Release Dashboard</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font: 13px monospace;
padding: 1rem;
}
a:link,
a:visited {
color: #00c;
}
.CountSummary {
font-weight: bold;
list-style: none;
margin: .5em 0 1em;
}
.Header {
display: flex;
flex-wrap: wrap;
font-weight: bold;
justify-content: space-between;
}
.BurndownChart {
height: 250px;
width: 500px;
}
.Section {
border-top: 1px solid #aaa;
padding-bottom: 2em;
}
.Section-title {
margin: .5em 0;
}
.Performance-separator {
margin-left:4ch;
}
.Item {
display: flex;
}
.Item-num {
margin-left: 1ch;
min-width: 12ch;
}
.Mark {
width: 3ch;
height: 1ch;
text-align: center;
vertical-align: middle;
}
.DirTitle {
margin: 1em 0 .25em;
}
</style>
<header class="Header">
<div class="Header-left">
<div>Release dashboard</div>
<div>{{.LastUpdated}}</div>
<ul class="CountSummary">
{{range .Sections}}
<li><a href="#{{.Title}}">{{.Count}} {{.Title}}</a></li>
{{end}}
</ul>
</div>
<div class="BurndownChart">
<canvas class="js-burndownChart"></canvas>
</div>
</header>
<main>
{{range .Sections}}
<section class="Section">
<h3 class="Section-title" id="{{.Title}}">{{.Title}}</h3>
{{range .Groups}}
{{if .Dir}}<h4 class="DirTitle">{{.Dir}}</h4>{{end}}
{{range .Items}}
{{if .FirstPerformance}}<h5 class="Performance-separator">performance</h5>{{end}}
{{$i := .Issue}}
{{if $i}}
<div class="Item">
{{$currentBlocker := and (eq .Issue.Milestone.Title $.CurMilestone) .ReleaseBlocker}}
{{if $currentBlocker}}
<div class="Mark" title="{{.Issue.Milestone.Title}} release blocker"></div>
{{else if .ReleaseBlocker}}
<div class="Mark" title="Release blocker"></div>
{{else if .EarlyInCycle}}
<div class="Mark" title="Early In Cycle">&#x23F1;&#xE0100;</div>
{{else}}
<div class="Mark"> </div>
{{end}}
<a class="Item-num" href="https://golang.org/issue/{{.Issue.Number}}" target="_blank">#{{.Issue.Number}}</a>
<span class="Item-title">{{.Issue.Title}}</span>
</div>
{{end}}
{{range .CLs}}
{{if not .Closed}}
<div class="Item">
<div class="Mark"></div>
<span class="Item-num">
{{if $i}}⤷{{end}} <a href="{{.ReviewURL}}" target="_blank">CL {{.Number}}</a>
</span>
<span class="Item-title">{{if $i}}⤷{{end}} {{.NoPrefixTitle}}</span>
</div>
{{end}}
{{end}}
{{end}}
{{end}}
</section>
{{end}}
</main>
<script src="/js/Chart.min.js"></script>
<script>
const data = {{.BurndownJSON}}
new Chart(document.querySelector('.js-burndownChart'), {
type: 'line',
data: {
labels: data.entries.map(d => d.dateStr),
datasets: [
{
label: `${data.milestone} total issues`,
yAxisID: 'total',
data: data.entries.map(d => d.open),
backgroundColor: 'transparent',
borderColor: 'rgba(54, 162, 235, 0.8)',
pointRadius: 0,
},
{
label: `${data.milestone} release blocking`,
yAxisID: 'release-blocking',
data: data.entries.map(d => d.blockers),
backgroundColor: 'rgba(0,0,0,0)',
borderColor: 'rgba(255, 99, 132, 0.8)',
pointRadius: 0,
},
],
},
options: {
animation: {
duration: 0,
},
title: {
display: true,
text: `${data.milestone} Issues`,
position: 'left',
},
legend: {
display: false,
},
tooltips: {
intersect: false,
},
scales: {
yAxes: [
{
id: 'total',
ticks: {
beginAtZero: true,
},
position: 'left',
},
{
id: 'release-blocking',
ticks: {
beginAtZero: true,
},
position: 'right',
},
],
},
},
});
</script>