Blob Blame History Raw
{% 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>
               &nbsp;&nbsp;
              {% 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">&times;</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">&times;</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 %}