Files @ 01591e4b1ac8
Branch filter:

Location: kallithea/kallithea/templates/pullrequests/pullrequest_show.html - annotation

mads
js: simplify statistics.html
d1addaf7a91e
d1addaf7a91e
0ee5a36aaa99
0ee5a36aaa99
37354e1ab283
196c46444d98
37354e1ab283
d1addaf7a91e
d1addaf7a91e
196c46444d98
d1addaf7a91e
d1addaf7a91e
ec39e73be935
d1addaf7a91e
ec39e73be935
d1addaf7a91e
d1addaf7a91e
a17c8e5f6712
d1addaf7a91e
80a15e10857a
ba18d1f6d081
fcd461ff2350
fcd461ff2350
d1addaf7a91e
1f02a239c23c
f939793f3ceb
96bd919192b0
41dd3c2f820c
3922aa544fbb
96bd919192b0
96bd919192b0
96bd919192b0
41dd3c2f820c
96bd919192b0
ee3343f3658f
96bd919192b0
88ce09daea37
f460139aa6d6
fee908b9bd2d
9d34bea3059d
20830dfe3ed8
96bd919192b0
d1addaf7a91e
f460139aa6d6
2f4effc51867
9d34bea3059d
2f4effc51867
d1addaf7a91e
96bd919192b0
fee908b9bd2d
2f4effc51867
d1923cd0521c
dd42c2ad28d7
67e53a272e1a
96bd919192b0
2f4effc51867
96bd919192b0
2f4effc51867
d1923cd0521c
cf3cc1fa4222
785a9770e8e0
96bd919192b0
96bd919192b0
96bd919192b0
96bd919192b0
2f4effc51867
a3a2dc51f0d6
dd42c2ad28d7
cfd9115db2a5
a181d4bd4c3d
c40e567e4b82
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
cfd9115db2a5
293066605a43
d1addaf7a91e
d1addaf7a91e
96bd919192b0
2f4effc51867
d1923cd0521c
dd42c2ad28d7
f295fad8adff
6cb077e99873
6cb077e99873
6cb077e99873
f295fad8adff
f295fad8adff
7d09d136ea72
96bd919192b0
2f4effc51867
d1923cd0521c
dd42c2ad28d7
43a4f3b285a6
43a4f3b285a6
43a4f3b285a6
6cb077e99873
6cb077e99873
43a4f3b285a6
205521e789ec
96bd919192b0
2f4effc51867
d1923cd0521c
dd42c2ad28d7
19e619f3cde1
7d09d136ea72
7d09d136ea72
d1addaf7a91e
67962f489ddd
d1addaf7a91e
67962f489ddd
d1addaf7a91e
d1addaf7a91e
19e619f3cde1
d1addaf7a91e
96bd919192b0
2f4effc51867
d1923cd0521c
dd42c2ad28d7
d1addaf7a91e
d1addaf7a91e
96bd919192b0
2f4effc51867
d1923cd0521c
dd42c2ad28d7
f287754980cc
68011c4e6f33
68011c4e6f33
205521e789ec
4d7d3445e388
4d7d3445e388
b9c9216d6fa7
96bd919192b0
f295fad8adff
2f4effc51867
d1923cd0521c
dd42c2ad28d7
53df5d6f0862
abaf8e1033a6
88ce09daea37
ffb70a338ce1
88ce09daea37
5d5d8ec14aa7
88ce09daea37
5d5d8ec14aa7
9a523af15c9f
19e619f3cde1
a166954bf84c
d42d7b2a3b2f
38fa9fe39baa
d42d7b2a3b2f
a166954bf84c
5258b66bf5d7
d42d7b2a3b2f
a166954bf84c
d42d7b2a3b2f
a166954bf84c
d42d7b2a3b2f
a166954bf84c
88ce09daea37
12919ffab34c
d42d7b2a3b2f
88ce09daea37
5fe9bb7acee6
97ea346aa4bd
5fe9bb7acee6
d4b39ef6cadf
5fe9bb7acee6
5fe9bb7acee6
6a120c401d25
d42d7b2a3b2f
d42d7b2a3b2f
f295fad8adff
f295fad8adff
f295fad8adff
f295fad8adff
53df5d6f0862
f5e3e703b186
53df5d6f0862
53df5d6f0862
53df5d6f0862
f5e3e703b186
2145dfdc3af3
2f4effc51867
2f4effc51867
2f4effc51867
2f4effc51867
2f4effc51867
2f4effc51867
2f4effc51867
2f4effc51867
2f4effc51867
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
4749158e7d1c
a3a2dc51f0d6
88ce09daea37
d1addaf7a91e
d1addaf7a91e
69ee6a249f55
69ee6a249f55
69ee6a249f55
b172a000249d
d1addaf7a91e
ea284e51ec2e
ea284e51ec2e
ea284e51ec2e
d1addaf7a91e
0b51254050a2
1d600909421e
0b51254050a2
0590e974ac35
0b51254050a2
0b51254050a2
0b51254050a2
346a56c690ff
cd6176c0634a
346a56c690ff
346a56c690ff
0b51254050a2
fee908b9bd2d
af5eef651c77
882f300d652e
af5eef651c77
d1addaf7a91e
0b51254050a2
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
fee908b9bd2d
541383de7568
541383de7568
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
66d6dc56479b
66d6dc56479b
41dd3c2f820c
88ce09daea37
66d6dc56479b
66d6dc56479b
66d6dc56479b
9c01335db346
cd6176c0634a
66d6dc56479b
cb187a32c8e3
41dd3c2f820c
782db8fc95ea
782db8fc95ea
782db8fc95ea
782db8fc95ea
782db8fc95ea
782db8fc95ea
cb187a32c8e3
66d6dc56479b
66d6dc56479b
66d6dc56479b
66d6dc56479b
66d6dc56479b
fcd461ff2350
2145dfdc3af3
fcd461ff2350
d1addaf7a91e
80a15e10857a
ba18d1f6d081
06c7273e2086
fcd461ff2350
d99afb88579e
1f02a239c23c
1f02a239c23c
41dd3c2f820c
0ee5a36aaa99
41dd3c2f820c
d1addaf7a91e
41dd3c2f820c
0b14eb8c690b
41dd3c2f820c
d1addaf7a91e
d1addaf7a91e
41dd3c2f820c
205521e789ec
12919ffab34c
41dd3c2f820c
205521e789ec
d1addaf7a91e
41dd3c2f820c
d1addaf7a91e
4034992774fa
d1addaf7a91e
4034992774fa
d1addaf7a91e
41dd3c2f820c
d1addaf7a91e
4034992774fa
647e7e0ce812
d1addaf7a91e
1cf51cd05e36
e34cf36e024a
b66e4d720198
72acb38da217
e35373106528
b66e4d720198
73234a550e7d
d1addaf7a91e
d1addaf7a91e
72acb38da217
72acb38da217
72acb38da217
d1addaf7a91e
1f02a239c23c
1f02a239c23c
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
33b71a130b16
33b71a130b16
d1addaf7a91e
33b71a130b16
33b71a130b16
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
1f02a239c23c
329c0584cba8
d1addaf7a91e
e457b951aabe
4034992774fa
4034992774fa
d1addaf7a91e
e46de90d5554
d1addaf7a91e
329c0584cba8
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
1721c30d9cbe
d1addaf7a91e
aba28699ec41
7834f845505a
d1addaf7a91e
d1addaf7a91e
e271a8766951
205daed7185b
205daed7185b
d1addaf7a91e
99d29f43bdd1
e87baa8f1c5b
d1addaf7a91e
d1addaf7a91e
33b71a130b16
5d5d8ec14aa7
48a96c4059df
5d5d8ec14aa7
0d39e48baec0
0d39e48baec0
0d39e48baec0
5d5d8ec14aa7
e87baa8f1c5b
348ecbd25577
d42d7b2a3b2f
d42d7b2a3b2f
d42d7b2a3b2f
d42d7b2a3b2f
d42d7b2a3b2f
2145dfdc3af3
2145dfdc3af3
b9c9216d6fa7
2145dfdc3af3
d42d7b2a3b2f
d42d7b2a3b2f
2145dfdc3af3
b845d1e94e2e
9dfd9d242728
9dfd9d242728
9dfd9d242728
9dfd9d242728
9dfd9d242728
66d6dc56479b
66d6dc56479b
66d6dc56479b
782db8fc95ea
66d6dc56479b
fee908b9bd2d
d1addaf7a91e
f939793f3ceb
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
<%inherit file="/base/base.html"/>

<%namespace name="comment" file="/changeset/changeset_file_comment.html"/>

<%block name="title">
    ${_('%s Pull Request %s') % (c.repo_name, c.pull_request.nice_id())}
</%block>

<%def name="breadcrumbs_links()">
    ${_('Pull request %s from %s#%s') % (c.pull_request.nice_id(), c.pull_request.org_repo.repo_name, c.cs_branch_name)}
</%def>

<%block name="header_menu">
    ${self.menu('repositories')}
</%block>

<%def name="main()">
<% editable = not c.pull_request.is_closed() and (h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionLevel('admin')(c.repo_name) or c.pull_request.owner_id == request.authuser.user_id) %>
${self.repo_context_bar('showpullrequest')}
<div class="panel panel-primary">
  <div class="panel-heading clearfix">
    ${self.breadcrumbs()}
  </div>

  ${h.form(url('pullrequest_post', repo_name=c.repo_name, pull_request_id=c.pull_request.pull_request_id), method='post', id='pull_request_form',class_='panel-body')}
    <div class="form pr-box pull-left">
      <div class="pr-details-title ${'closed' if c.pull_request.is_closed() else ''}">
        <h3>
          ${_('Title')}: ${h.urlify_text(c.pull_request.title, c.pull_request.org_repo.repo_name)}
          %if c.pull_request.is_closed():
              (${_('Closed')})
          %endif
        </h3>
      </div>
      <div id="pr-summary">

        <div class="pr-not-edit form-group">
            <label>${_('Description')}:
            %if editable:
            <div id="pr-edit-btn">
              <a class="btn btn-default btn-xs" onclick="$('.pr-do-edit').show();$('.pr-not-edit').hide()">${_("Edit")}</a>
            </div>
            %endif
            </label>
            <div>
              <div class="formatted-fixed">${h.urlify_text(c.pull_request.description, c.pull_request.org_repo.repo_name)}</div>
            </div>
        </div>

        %if editable:
        <div class="pr-do-edit form-group" style="display:none">
              <label for="pullrequest_title">${_('Title')}:</label>
              <div>
                  ${h.text('pullrequest_title',class_='form-control',value=c.pull_request.title,placeholder=_('Summarize the changes'))}
              </div>
        </div>

        <div class="pr-do-edit form-group" style="display:none">
              <label for="pullrequest_desc">${_('Description')}:</label>
              <div>
                  ${h.textarea('pullrequest_desc',content=c.pull_request.description,placeholder=_('Write a short description on this pull request'),class_='form-control')}
              </div>
        </div>
        %endif

        <div class="form-group">
          <label>${_('Voting Result')}:</label>
          <div>
            %if c.current_voting_result:
              <i class="icon-circle changeset-status-${c.current_voting_result}" title="${_('Pull request status calculated from votes')}"></i>
              <span class="changeset-status-lbl" data-toggle="tooltip" title="${_('Pull request status calculated from votes')}">
                %if c.pull_request.is_closed():
                    ${_('Closed')},
                %endif
                ${h.changeset_status_lbl(c.current_voting_result)}
              </span>
            %endif
          </div>
        </div>
        <div class="form-group">
          <label>${_('Origin')}:</label>
          <div>
            <div>
              ${h.link_to_ref(c.pull_request.org_repo.repo_name, c.cs_ref_type, c.cs_ref_name, c.cs_rev)}
              %if c.cs_ref_type != 'branch':
                ${_('on')} ${h.link_to_ref(c.pull_request.org_repo.repo_name, 'branch', c.cs_branch_name)}
              %endif
            </div>
          </div>
        </div>
        <div class="form-group">
          <label>${_('Target')}:</label>
          <div>
            %if c.is_range:
              ${_("This is just a range of changesets and doesn't have a target or a real merge ancestor.")}
            %else:
              ${h.link_to_ref(c.pull_request.other_repo.repo_name, c.a_ref_type, c.a_ref_name)}
              ## we don't know other rev - c.a_rev is ancestor and not necessarily on other_name_branch branch
            %endif
          </div>
        </div>
        <div class="form-group">
          <label>${_('Pull changes')}:</label>
          <div>
            %if c.cs_ranges:
              <div>
               ## TODO: use cs_ranges[-1] or org_ref_parts[1] in both cases?
               %if h.is_hg(c.pull_request.org_repo):
                 <span>hg pull ${c.pull_request.org_repo.clone_url(clone_uri_tmpl=c.clone_uri_tmpl)} -r ${h.short_id(c.cs_ranges[-1].raw_id)}</span>
               %elif h.is_git(c.pull_request.org_repo):
                 <span>git pull ${c.pull_request.org_repo.clone_url(clone_uri_tmpl=c.clone_uri_tmpl)} ${c.pull_request.org_ref_parts[1]}</span>
               %endif
              </div>
            %endif
          </div>
        </div>
        <div class="form-group">
          <label>${_('Created on')}:</label>
          <div>
              <div>${h.fmt_date(c.pull_request.created_on)}</div>
          </div>
        </div>
        <div class="form-group">
          <label>${_('Owner')}:</label>
          <div class="pr-not-edit">
                  ${h.gravatar_div(c.pull_request.owner.email, size=20)}
                  <span>${c.pull_request.owner.full_name_and_username}</span><br/>
                  <span><a href="mailto:${c.pull_request.owner.email}">${c.pull_request.owner.email}</a></span><br/>
          </div>
          <div class="pr-do-edit" style="display:none">
               ${h.text('owner', class_='form-control', value=c.pull_request.owner.username, placeholder=_('Type name of user'))}
          </div>
        </div>

        <div class="form-group">
          <label>${_('Next iteration')}:</label>
            <div>
              <p>${c.update_msg}</p>
              %if c.avail_cs:
              <div id="updaterevs" class="clearfix">
                <div id="updaterevs-graph">
                  <canvas id="avail_graph_canvas"></canvas>
                </div>
                <table class="table" id="updaterevs-table">
                  %for cnt, cs in enumerate(c.avail_cs):
                    <tr id="chg_available_${cnt+1}" class="${'mergerow' if len(cs.parents) > 1 and not (editable and cs.revision in c.avail_revs) else ''}">
                      %if c.cs_ranges and cs.revision == c.cs_ranges[-1].revision:
                        %if editable:
                        <td>
                            ${h.radio(name='updaterev', value='', checked=True)}
                        </td>
                        %endif
                        <td colspan="4"><span>${_("Current revision - no change")}</span></td>
                      %else:
                        %if editable:
                        <td>
                          ${h.radio(name='updaterev', value=cs.raw_id, style=None if cs.revision in c.avail_revs else 'visibility: hidden')}
                        </td>
                        %endif
                        <td><span data-toggle="tooltip" title="${h.age(cs.date)}">${cs.date}</span></td>
                        <td>${h.link_to(h.show_id(cs),h.url('changeset_home',repo_name=c.cs_repo.repo_name,revision=cs.raw_id), class_='changeset_hash')}</td>
                        <td>
                          <div class="pull-right">
                            %for tag in cs.tags:
                              <span class="label label-tag" title="${_('Tag %s') % tag}">
                                ${h.link_to(tag,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
                              </span>
                            %endfor
                          </div>
                          <div class="message">${h.urlify_text(cs.message.splitlines()[0], c.repo_name)}</div>
                        </td>
                      %endif
                    </tr>
                  %endfor
                </table>
              </div>
              <div class="alert alert-info">${_("Pull request iterations do not change content once created. Select a revision to create a new iteration.")}</div>
              %endif
              %if c.update_msg_other:
                <div class="alert alert-info">${c.update_msg_other}</div>
              %endif
            </div>
        </div>
        %if editable:
        <div class="form-group">
          <div class="buttons">
            ${h.submit('pr-form-save',_('Save Changes'),class_="btn btn-default btn-sm")}
            ${h.submit('pr-form-clone',_('Create New Iteration with Changes'),class_="btn btn-default btn-sm",disabled='disabled')}
            ${h.reset('pr-form-reset',_('Cancel Changes'),class_="btn btn-default btn-sm")}
          </div>
        </div>
        %endif
      </div>
    </div>
    ## REVIEWERS
    <div class="pr-reviewers-box pull-left">
        <h4 class="pr-details-title">${_('Reviewers')}</h4>
        <div id="reviewers">
          ## members goes here !
          <div>
            %for member,status in c.pull_request_reviewers:
              <input type="hidden" value="${member.user_id}" name="org_review_members" />
            %endfor
            <ul id="review_members" class="list-unstyled">
            %for member,status in c.pull_request_reviewers:
              ## WARNING: the HTML below is duplicate with
              ## kallithea/public/js/base.js
              ## If you change something here it should be reflected in the template too.
              <li id="reviewer_${member.user_id}">
                <span class="reviewers_member">
                  <input type="hidden" value="${member.user_id}" name="review_members" />
                  <span class="reviewer_status" data-toggle="tooltip" title="${h.changeset_status_lbl(status)}">
                      <i class="icon-circle changeset-status-${status}"></i>
                  </span>
                  ${h.gravatar(member.email, size=14)}
                  <span>
                    ${member.full_name_and_username}
                    %if c.pull_request.owner_id == member.user_id:
                      (${_('Owner')})
                    %endif
                  </span>
                  %if editable:
                  <a href="#" class="reviewer_member_remove" onclick="removeReviewMember(${member.user_id})" title="${_('Remove reviewer')}">
                      <i class="icon-minus-circled"></i>
                  </a>
                  %endif
                </span>
              </li>
            %endfor
            </ul>
          </div>
          %if editable:
          <div>
             ${h.text('user', class_='form-control',placeholder=_('Type name of reviewer to add'))}
          </div>
          %endif
        </div>

        %if not c.pull_request_reviewers:
        <h4>${_('Potential Reviewers')}</h4>
        <div>
          <div>
            ${_('Click to add the repository owner as reviewer:')}
          </div>
          <ul class="list-unstyled">
            %for u in [c.pull_request.other_repo.owner]:
              <li>
                <a class="btn btn-default btn-xs missing_reviewer missing_reviewer_${u.user_id}"
                  href="#"
                  data-user_id="${u.user_id}"
                  data-fname="${u.name}"
                  data-lname="${u.lastname}"
                  data-nname="${u.username}"
                  data-gravatar_lnk="${h.gravatar_url(u.email, size=28, default='default')}"
                  data-gravatar_size="14"
                  title="Click to add reviewer to the list, then Save Changes."><i class="icon-plus"></i>${u.full_name}</a>
              </li>
            %endfor
          </ul>
        </div>
        %endif
    </div>
  ${h.end_form()}
</div>

<div class="panel panel-primary">
    <div class="panel-heading clearfix">
      <div class="panel-title">${_('Pull Request Content')}</div>
    </div>
    <div class="panel-body">
        <div>
            <div id="changeset_compare_view_content">
              <h5>
                  ${comment.comment_count(c.inline_cnt, len(c.comments))}
              </h5>
              ##CS
              <h5>
                ${ungettext('Showing %s commit','Showing %s commits', len(c.cs_ranges)) % len(c.cs_ranges)}
              </h5>
              <%include file="/compare/compare_cs.html" />

              <h5>
              ${_('Common ancestor')}:
              ${h.link_to(h.short_id(c.a_rev),h.url('changeset_home',repo_name=c.a_repo.repo_name,revision=c.a_rev), class_="changeset_hash")}
              </h5>

              ## FILES
              <h5>
              % if c.limited_diff:
                  ${ungettext('%s file changed', '%s files changed', len(c.file_diff_data)) % len(c.file_diff_data)}:
              % else:
                  ${ungettext('%s file changed with %s insertions and %s deletions','%s files changed with %s insertions and %s deletions', len(c.file_diff_data)) % (len(c.file_diff_data),c.lines_added,c.lines_deleted)}:
              %endif
              </h5>
              <div class="cs_files">
                %if not c.file_diff_data:
                   <span class="text-muted">${_('No files')}</span>
                %endif
                %for fid, url_fid, op, a_path, path, diff, stats in c.file_diff_data:
                    <div class="cs_${op} clearfix">
                      <span class="node">
                          <i class="icon-diff-${op}"></i>
                          ${h.link_to(path, '#%s' % fid)}
                      </span>
                      <div class="changes">${h.fancy_file_stats(stats)}</div>
                    </div>
                %endfor
                %if c.limited_diff:
                  <h5>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h5>
                %endif
              </div>
            </div>
        </div>
    </div>
    <script>
    // TODO: switch this to pyroutes
    AJAX_COMMENT_URL = ${h.js(url('pullrequest_comment',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id))};
    AJAX_COMMENT_DELETE_URL = ${h.js(url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__'))};

    pyroutes.register('pullrequest_comment', ${h.js(url('pullrequest_comment',repo_name='%(repo_name)s',pull_request_id='%(pull_request_id)s'))}, ['repo_name', 'pull_request_id']);
    pyroutes.register('pullrequest_comment_delete', ${h.js(url('pullrequest_comment_delete',repo_name='%(repo_name)s',comment_id='%(comment_id)s'))}, ['repo_name', 'comment_id']);

    </script>

    ## diff block
    <div class="panel-body">
    <div class="commentable-diff">
    <%namespace name="diff_block" file="/changeset/diff_block.html"/>
    ${diff_block.diff_block_js()}
    ${diff_block.diff_block(c.a_repo.repo_name, c.a_ref_type, c.a_ref_name, c.a_rev,
                            c.cs_repo.repo_name, c.cs_ref_type, c.cs_ref_name, c.cs_rev, c.file_diff_data)}
    % if c.limited_diff:
      <h4>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h4>
    % endif
    </div>

    ## template for inline comment form
    ${comment.comment_inline_form()}

    ## render comments and inlines
    ${comment.generate_comments()}

    ## main comment form and it status
    ${comment.comments(change_status=c.allowed_to_change_status)}

    <script type="text/javascript">
      $(document).ready(function(){
          PullRequestAutoComplete($('#user'));
          SimpleUserAutoComplete($('#owner'));

          $('.code-difftable').on('click', '.add-bubble', function(e){
              show_comment_form($(this));
          });

          var avail_jsdata = ${h.js(c.avail_jsdata)};
          var avail_r = new BranchRenderer('avail_graph_canvas', 'updaterevs-table', 'chg_available_');
          avail_r.render(avail_jsdata);

          $(window).resize(function(){
              avail_r.render(avail_jsdata);
          });

          move_comments($(".comments .comments-list-chunk"));

          $('#updaterevs input').change(function(e){
              var update = !!e.target.value;
              $('#pr-form-save').prop('disabled',update);
              $('#pr-form-clone').prop('disabled',!update);
          });
          var $org_review_members = $('#review_members').clone();
          $('#pr-form-reset').click(function(e){
              $('.pr-do-edit').hide();
              $('.pr-not-edit').show();
              $('#pr-form-save').prop('disabled',false);
              $('#pr-form-clone').prop('disabled',true);
              $('#review_members').html($org_review_members);
          });

          // hack: re-navigate to target after JS is done ... if a target is set and setting href thus won't reload
          if (window.location.hash != "") {
              window.location.href = window.location.href;
          }

          $('.missing_reviewer').click(function(){
            var $this = $(this);
            addReviewMember($this.data('user_id'), $this.data('fname'), $this.data('lname'), $this.data('nname'), $this.data('gravatar_lnk'), $this.data('gravatar_size'));
          });
      });
    </script>
    </div>

</div>

</%def>