{% extends "repo_master.html" %}
{% from "_render_repo.html" import pagination_link %}
{% block title %}Issues - {{
repo.namespace + '/' if repo.namespace }}{{ repo.name }}{% endblock %}
{% set tag = "home"%}
{% block repo %}
<h2>
{% if status|lower in ['open', 'true'] %}
{{ issues|count }} Open Issues (of {{ issues_cnt }})
{% elif status|lower not in ['open', 'true', 'all', 'none'] %}
{{ issues|count }} Closed Issues (of {{ issues_cnt }})
{% else %}
{{ issues|count }} Issues (of {{ issues_cnt }})
{% endif %}
<span class="btn-group btn-group-sm pull-xs-right" role="group">
{% if repo.milestones %}
<a href="{{ url_for(
'view_roadmap',
repo=repo.name,
username=username,
namespace=repo.namespace) }}">
<button class="btn btn-secondary btn-sm">Roadmap</button>
</a>
{% endif %}
{% if g.repo.reports %}
<div class="dropdown" id="PR-dropdown">
<button class="btn btn-primary btn-sm dropdown-toggle"
type="button" id="dropdownMenu1" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
Report
</button>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu1">
{% for report in repo.reports %}
<a class="dropdown-item" href="{{ url_for(
'view_report', namespace=repo.namespace,
username=username, repo=repo.name, report=report) }}">
<small>Report: {{ report }}</small>
</a>
{% endfor %}
</div>
</div>
{% endif %}
</span>
</h2>
{% if oth_issues_cnt %}
<div class="addrem_bar issues_pbar m-b-1 {%
if status|lower not in ['open', 'true'] %}closed{%
endif %}" title="{{
(100 - (100.0 * (issues_cnt / total_issues_cnt)))|round|int }}% of {%
if status|lower in ['open', 'true'] %}closed{%
else %}open{%
endif %} issues of total {{ total_issues_cnt }} issues">
{% if (issues | length + oth_issues_cnt) %}
<span style="width: {{
(100.0 * (issues_cnt / total_issues_cnt))|round|int }}%" title="{{
(100.0 * (issues_cnt / total_issues_cnt))|round|int }}% of {%
if status|lower in ['open', 'true'] %}open{%
else %}closed{%
endif %} issues of total {{ total_issues_cnt }} issues">
{{ (100.0 * (issues_cnt / total_issues_cnt))|round|int }}%
</span>
{% endif %}
</div>
{% endif %}
<section id="tags">
<div class="m-b-1">
<span class="btn-group btn-group issues-tagbar" role="group">
<a class="btn {%
if status|lower in ['open', 'true'] %}btn-primary{%
else %}btn-secondary{%
endif %} btn-sm" href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
search_pattern=search_pattern,
tags=tags, author=author,
assignee=assignee) }}">Open</a>
<a class="btn {%
if status|lower in ['closed', 'false'] %}btn-primary{%
else %}btn-secondary{%
endif %} btn-sm" href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
search_pattern=search_pattern,
tags=tags, author=author, status='Closed',
assignee=assignee) }}">Closed</a>
<a class="btn {%
if status|lower in ['all', 'none'] %}btn-primary{%
else %}btn-secondary{%
endif %} btn-sm" href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
search_pattern=search_pattern,
tags=tags, author=author, status='all',
assignee=assignee) }}">All</a>
<a class="btn btn-secondary btn-sm" href="#stats"
id="issues_stats_btn">Stats</a>
</span>
<span class="col-lg-3 col-sm-5 pull-xs-right tiny p-r-0">
<form action="{{ url_for('view_issues',
username=username,
namespace=repo.namespace,
repo=repo.name ) }}" method="GET">
<input type="hidden" name="status" value="{{ status or 'all' }}" />
{% for tag in tags %}
<input type="hidden" name="tags" value="{{ tag }}" />
{% endfor %}
<div class="input-group input-group-sm">
<input type="text" class="form-control"
name="search_pattern" placeholder="Search"
value="{{ search_pattern or '' }}" />
<span class="input-group-btn">
<input type="submit" class="btn btn-secondary" value="Go!" />
</span>
</div>
</form>
</span>
</div>
<div class="m-b-1">
<section id="stats">
<span id="issues_stats_spinner" style="display:none;"></span>
<span id="issues_stats" style="display:none;"></span>
</section>
</div>
<span class="btn-group btn-group-sm issues-tagbar" role="group" aria-label="Basic example">
{% for tag in tag_list %}
<a class="btn btn-secondary btn-sm {% if tag.tag in tags%}active{%endif%}"
href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
tags=tag.tag | add_or_remove(tags[:]),
search_pattern=search_pattern,
author=author,
assignee=assignee,
status=status or 'all') }}"
title="Filter issues by tag">
<span class="oi" data-glyph="tag"></span>
{{ tag.tag }}</a>
{% endfor %}
</span>
</section>
{% set base_url_for = dict(
repo=repo.name, username=username,namespace=repo.namespace, tags=tags,
author=author, assignee=assignee, priority=priority) %}
<div class="card m-t-1 table-responsive">
<table id="pagure-issues-list" class="table table-hover table-striped m-b-0">
<thead class="thead-default">
<tr>
<th id="issue-title"><a href="{{ url_for('view_issues', **dict(
base_url_for, status=status or 'all', order_key='title',
order='title' | table_get_link_order(order_key, order))) }}">Issue</a>
{{ 'title' | table_sort_arrow(order_key, order) | safe }}</th>
<th class="open_date"><a href="{{ url_for('view_issues', **dict(
base_url_for, status=status or 'all', order_key='date_created',
order='date_created' | table_get_link_order(order_key, order))) }}">Opened</a>
{{ 'date_created' | table_sort_arrow(order_key, order) | safe }}</th>
{% if status and status|lower != 'open' %}
<th class="close_date"><a href="{{ url_for('view_issues', **dict(
base_url_for, status='Closed', order_key='closed_at',
order='closed_at' | table_get_link_order(order_key, order))) }}">Closed</a>
{{ 'closed_at' | table_sort_arrow(order_key, order) | safe }}</th>
{% else %}
<th class="mod_date"><a href="{{ url_for('view_issues', **dict(
base_url_for, status=status or 'all', order_key='last_updated',
order='last_updated' | table_get_link_order(order_key, order))) }}">Modified</a>
{{ 'last_updated' | table_sort_arrow(order_key, order) | safe }}</th>
{% endif %}
<th class="Priority"><a href="{{ url_for('view_issues', **dict(
base_url_for, status=status or 'all', order_key='priority',
order='priority' | table_get_link_order(order_key, order))) }}">Priority</a>
{{ 'priority' | table_sort_arrow(order_key, order) | safe }}</th>
<th class="open_by"><a href="{{ url_for('view_issues', **dict(
base_url_for, status=status or 'all', order_key='user',
order='user' | table_get_link_order(order_key, order))) }}">Reporter</a>
{{ 'user' | table_sort_arrow(order_key, order) | safe }}</th>
{% if not status or status|lower == 'open' %}
<th class="assigned"><a href="{{ url_for('view_issues', **dict(
base_url_for, status=status or 'all', order_key='assignee',
order='assignee' | table_get_link_order(order_key, order))) }}">Assignee</a>
{{ 'assignee' | table_sort_arrow(order_key, order) | safe }}</th>
{% endif %}
</tr>
</thead>
<tfoot>
</tfoot>
<tbody>
{% for issue in issues %}
<tr>
<td>
<span class="label label-default">#{{ issue.id }}</span>
{% if status != 'Open' %}
<span class="label {%
if issue.close_status|lower == 'invalid' %}label-danger{%
elif issue.close_status|lower == 'fixed' %}label-success{%
elif issue.close_status|lower == 'insufficient data' %}label-warning{%
elif issue.close_status|lower == 'duplicate' %}label-default{%
elif issue.status|lower == 'open' %}label-primary{%
else %}label-info{%
endif %}">{{issue.close_status if issue.status == 'Closed' else issue.status }}</span>
{% endif %}
{% if issue.private %}
<span class="oi red-icon" data-glyph="lock-locked" title="Private issue"></span>
{% endif %}
<a href="{{ url_for('view_issue',
repo=repo.name,
username=username,
namespace=repo.namespace,
issueid=issue.id) }}">
{{ issue.title | noJS("img") | safe }}
</a>
{% if issue.user_comments|count > 0 %}
<span class="text-muted">
<span class="oi" data-glyph="comment-square"
title="Comments on the ticket"></span>
{{issue.user_comments|count}}
</span>
{% endif %}
{% if issue.parents %}
<span class="oi" data-glyph="ban" title="Issue blocked by one or more issue(s)"></span>
{% endif %}
{% if issue.children %}
<span class="oi" data-glyph="lock-unlocked" title="Issue blocking one or more issue(s)"></span>
{% endif %}
{% for tag in issue.tags %}
<a class="label label-info"
href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
tags=tag.tag,
status=status or 'all') }}"
style="background-color:{{tag.tag_color}}"
title="{{ tag.tag_description or '' }}">{{tag.tag}}</a>
{% endfor%}
</td>
<td class="td-open_date nowrap">
<span title="{{issue.date_created.strftime('%Y-%m-%d %H:%M:%S')}}">{{
issue.date_created | humanize}}</span>
</td>
{% if status and status|lower != 'open' %}
<td class="nowrap">
{% if issue.closed_at != None %}
<span title="{{issue.closed_at.strftime('%Y-%m-%d %H:%M:%S')}}">{{
issue.closed_at | humanize}}</span>
{% endif %}
</td>
{% else %}
<td class="td-mod_date nowrap">
<span title="{{issue.last_updated.strftime('%Y-%m-%d %H:%M:%S')}}">{{
issue.last_updated | humanize}}</span>
</td>
{% endif %}
<td class="td-priority nowrap" data-sort-value="{{
issue.priority
if issue.priority
else repo.priorities | increment_largest_priority | string }}">
{% if issue.priority is not none %}
<a href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
author=author, tags=tags, assignee=assignee,
status=status, priority=issue.priority) }}"
title="Filter issues by priority">{{
repo.priorities[issue.priority | string] }}
</a>
{% endif %}
</td>
<td class="nowrap">
<a href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
author=issue.user.user, tags=tags,
assignee=assignee, status=status) }}"
title="Filter issues by reporter">
{{ issue.user.default_email | avatar(16) | safe }}
{{ issue.user.user }}
</a>
</td>
{% if not status or status|lower == 'open' %}
<td class="nowrap">
{% if issue.assignee %}
<a href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
assignee=issue.assignee.username,
tags=tags, author=author, status=status) }}"
title="Filter issues by assignee">
{{ issue.assignee.default_email | avatar(16) | safe }}
{{ issue.assignee.user }}
</a>
{% else %}
<a class="text-muted" href="{{ url_for('view_issues',
repo=repo.name,
username=username,
namespace=repo.namespace,
tags=tags, author=author, status=status,
assignee=0) }}">unassigned
</a>
{% endif %}
</td>
{% endif %}
</tr>
{% else %}
<tr>
<td colspan="6" class="noresult">No issues found</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if g.repo_admin %}
<button type="button" class="btn btn-secondary btn-sm pull-xs-right"
data-toggle="modal" data-target="#report_modal">
Save report
</button>
<button type="button" class="btn btn-secondary btn-sm pull-xs-right"
data-toggle="modal" data-target="#milestone_modal">
Add milestone
</button>
<div class="modal fade" id="report_modal" tabindex="-1"
role="dialog" aria-labelledby="New report" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
<span class="sr-only">Close</span>
</button>
<h4 class="modal-title" id="myModalLabel">New Report</h4>
</div>
<div class="modal-body">
<form action="{{ url_for(
'.save_reports', namespace=repo.namespace,
username=username, repo=repo.name) }}" method="post" class="icon">
<fieldset class="form-group">
<label for="report_name">Report name</label>
<input class="form-control" name="report_name" required/>
<small class="text-muted">name of the report</small>
</fieldset>
{{ add_report_form.csrf_token }}
<button class="btn btn-primary" type="submit" title="Save this report">
Save
</button>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="milestone_modal" tabindex="-1"
role="dialog" aria-labelledby="New milestone" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
<span class="sr-only">Close</span>
</button>
</div>
<div class="modal-body">
{% set tag_form = add_report_form %}
{% set from = 'issues' %}
{% include 'settings_milestones.html' %}
</div>
</div>
</div>
</div>
{% endif %}
{{ pagination_link('page', g.page, total_page) }}
{% endblock %}
{% block jscripts %}
{{ super() }}
<script type="text/javascript" src="{{
url_for('static', filename='vendor/d3/d3.v4.min.js') }}"></script>
<script type="text/javascript" src="{{
url_for('static', filename='issues_stats.js') }}"></script>
<script type="text/javascript">
$(document).ready(function() {
var _stats_url = "{{ url_for(
'api_ns.api_view_issues_history_stats',
repo=repo.name,
username=username,
namespace=repo.namespace,) }}";
$("#issues_stats_btn").click(function(ev){
var _b = $("#issues_stats");
var _s = $("#issues_stats_spinner");
if (!_b.is(':visible')){
_s.html(
"<img id='spinnergif' src='{{ url_for('static', filename='images/spinner.gif') }}'>"
)
_s.show();
_b.html(
"<p>Number of issues open on 7 days windows</p>"
+ "<svg width=\"100%\" height=\"250\"></svg>"
);
issues_history_stats_plot(_stats_url, _b, _s);
} else {
_b.hide();
_s.hide();
}
});
$('.extend-form').click(function(e) {
const tgt = $(this).attr('data-target');
let form = $(tgt + ' > div:last-child').clone();
form.find('input[type=text], textarea').val('');
$(tgt).append(form);
});
});
</script>
{% endblock %}