| 1 |
{% extends "base.html" %} |
| 2 |
{% import "repo_tabs.html" as m %} |
| 3 |
{% block title %}Swimlanes of {{ target.label }} · {{ repo.owner }}/{{ repo.name }}{% endblock %} |
| 4 |
{% block bodyattrs %} data-repo="{{ repo.url }}"{% endblock %} |
| 5 |
{% block tabs %}{% call m::tabs(repo, "changes") %}{% endblock %} |
| 6 |
{% block mainclass %} class="wide"{% endblock %} |
| 7 |
{% block content %} |
| 8 |
<div class="head"><h1>Swimlanes <small>{{ target.label }} · {{ board.cards.len() }}{% if total > board.cards.len() %} newest of {{ total }}{% endif %} changes in {{ board.lanes }} lane{% if board.lanes != 1 %}s{% endif %}</small></h1> |
| 9 |
<p class="small mute">Changes that do not depend on each other run in separate lanes, oldest on the left; an edge joins a change to what it depends on. There are no merge nodes: parallel work simply stays parallel. <a href="{{ repo.url }}/changes/{{ target.label }}">list view</a></p></div> |
| 10 |
{% if board.cards.is_empty() %}<p class="empty">No changes.</p>{% else %} |
| 11 |
<div class="lanes-board" style="overflow-x: auto"> |
| 12 |
<svg width="{{ board.width }}" height="{{ board.height }}" viewBox="0 0 {{ board.width }} {{ board.height }}" role="img" aria-label="Swimlanes of {{ target.label }}"> |
| 13 |
{% for e in board.edges %}<path d="{{ e }}" class="lane" fill="none"/>{% endfor %} |
| 14 |
{% for c in board.cards %} |
| 15 |
<a href="{{ repo.url }}/change/{{ c.hash }}"> |
| 16 |
<title>{{ c.short }} {{ c.title }}</title> |
| 17 |
<rect x="{{ c.x }}" y="{{ c.y }}" width="{{ crate::render::graph::CARD_W }}" height="{{ crate::render::graph::CARD_H }}" rx="6" class="node{% if c.head %} head{% endif %}"/> |
| 18 |
<text x="{{ c.x + 8 }}" y="{{ c.y + 14 }}" class="small">{{ c.short }}</text> |
| 19 |
<text x="{{ c.x + 8 }}" y="{{ c.y + 28 }}" class="small">{{ c.title }}</text> |
| 20 |
</a> |
| 21 |
{% endfor %} |
| 22 |
</svg> |
| 23 |
</div> |
| 24 |
{% endif %} |
| 25 |
{% endblock %} |