changeset.mako
467 lines
| 19.8 KiB
| application/x-mako
|
MakoHtmlLexer
r1282 | ||||
<%inherit file="/base/base.mako"/> | ||||
r3882 | <%namespace name="base" file="/base/base.mako"/> | |||
r1282 | <%namespace name="diff_block" file="/changeset/diff_block.mako"/> | |||
r3882 | <%namespace name="file_base" file="/files/base.mako"/> | |||
r4485 | <%namespace name="sidebar" file="/base/sidebar.mako"/> | |||
r1282 | ||||
<%def name="title()"> | ||||
r3882 | ${_('{} Commit').format(c.repo_name)} - ${h.show_id(c.commit)} | |||
r1282 | %if c.rhodecode_name: | |||
· ${h.branding(c.rhodecode_name)} | ||||
%endif | ||||
</%def> | ||||
<%def name="menu_bar_nav()"> | ||||
${self.menu_items(active='repositories')} | ||||
</%def> | ||||
<%def name="menu_bar_subnav()"> | ||||
r3742 | ${self.repo_menu(active='commits')} | |||
r1282 | </%def> | |||
<%def name="main()"> | ||||
r3882 | <script type="text/javascript"> | |||
r1282 | templateContext.commit_data.commit_id = "${c.commit.raw_id}"; | |||
</script> | ||||
r3882 | ||||
r1282 | <div class="box"> | |||
r3882 | <div class="summary"> | |||
<div class="fieldset"> | ||||
<div class="left-content"> | ||||
r4026 | <% | |||
rc_user = h.discover_user(c.commit.author_email) | ||||
%> | ||||
r3882 | <div class="left-content-avatar"> | |||
r5255 | <% | |||
email = h.email_or_none(c.commit.author) | ||||
rc_user = h.discover_user(c.commit.author) | ||||
%> | ||||
${base.gravatar(email, 30, tooltip=(True if rc_user else False), user=rc_user)} | ||||
r3882 | </div> | |||
<div class="left-content-message"> | ||||
<div class="fieldset collapsable-content no-hide" data-toggle="summary-details"> | ||||
<div class="commit truncate-wrap">${h.urlify_commit_message(h.chop_at_smart(c.commit.message, '\n', suffix_if_chopped='...'), c.repo_name)}</div> | ||||
</div> | ||||
r2129 | ||||
r3882 | <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none"> | |||
r5255 | ||||
r3882 | <div class="commit">${h.urlify_commit_message(c.commit.message,c.repo_name)}</div> | |||
</div> | ||||
<div class="fieldset" data-toggle="summary-details"> | ||||
<div class=""> | ||||
<table> | ||||
r4026 | <tr class="file_author"> | |||
r1738 | ||||
r3882 | <td> | |||
r4026 | <span class="user commit-author">${h.link_to_user(rc_user or c.commit.author)}</span> | |||
r3882 | <span class="commit-date">- ${h.age_component(c.commit.date)}</span> | |||
</td> | ||||
r1738 | ||||
r3882 | <td> | |||
## second cell for consistency with files | ||||
</td> | ||||
</tr> | ||||
</table> | ||||
Liviu
|
r3685 | </div> | ||
r2129 | </div> | |||
Liviu
|
r3685 | |||
r3882 | </div> | |||
</div> | ||||
Liviu
|
r3685 | |||
r3882 | <div class="right-content"> | |||
<div data-toggle="summary-details"> | ||||
<div class="tags tags-main"> | ||||
<code><a href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.commit.raw_id)}">${h.show_id(c.commit)}</a></code> | ||||
<i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.commit.raw_id}" title="${_('Copy the full commit id')}"></i> | ||||
${file_base.refs(c.commit)} | ||||
r4839 | ||||
r3882 | ## phase | |||
% if hasattr(c.commit, 'phase') and getattr(c.commit, 'phase') != 'public': | ||||
<span class="tag phase-${c.commit.phase} tooltip" title="${_('Commit phase')}"> | ||||
<i class="icon-info"></i>${c.commit.phase} | ||||
</span> | ||||
% endif | ||||
r1282 | ||||
r3882 | ## obsolete commits | |||
% if getattr(c.commit, 'obsolete', False): | ||||
<span class="tag obsolete-${c.commit.obsolete} tooltip" title="${_('Evolve State')}"> | ||||
${_('obsolete')} | ||||
</span> | ||||
% endif | ||||
## hidden commits | ||||
% if getattr(c.commit, 'hidden', False): | ||||
<span class="tag hidden-${c.commit.hidden} tooltip" title="${_('Evolve State')}"> | ||||
${_('hidden')} | ||||
</span> | ||||
% endif | ||||
</div> | ||||
<span id="parent_link" class="tag tagtag"> | ||||
<a href="#parentCommit" title="${_('Parent Commit')}"><i class="icon-left icon-no-margin"></i>${_('parent')}</a> | ||||
</span> | ||||
<span id="child_link" class="tag tagtag"> | ||||
<a href="#childCommit" title="${_('Child Commit')}">${_('child')}<i class="icon-right icon-no-margin"></i></a> | ||||
</span> | ||||
r4839 | <span class="tag tooltip" title="${_('Browse files at this commit')}"> | |||
<i class="icon-code"></i> | ||||
<a href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.commit.raw_id, f_path='')}">${_('Browse files')}</a> | ||||
</span> | ||||
r4485 | ||||
r1282 | </div> | |||
r4485 | ||||
r1282 | </div> | |||
</div> | ||||
r3882 | <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;"> | |||
r1282 | </div> | |||
r3882 | <div class="clear-fix"></div> | |||
r5586 | <div class="btn-collapse" id="break-button" data-toggle="summary-details"> | |||
r3882 | ${_('Show More')} | |||
r1282 | </div> | |||
r3882 | </div> | |||
r1385 | ||||
r1282 | <div class="cs_files"> | |||
<%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> | ||||
r4446 | ${cbdiffs.render_diffset_menu(c.changes[c.commit.raw_id], commit=c.commit)} | |||
r1282 | ${cbdiffs.render_diffset( | |||
r4485 | c.changes[c.commit.raw_id], commit=c.commit, use_comments=True, | |||
inline_comments=c.inline_comments, | ||||
show_todos=False)} | ||||
r1282 | </div> | |||
r3884 | ## template for inline comment form | |||
<%namespace name="comment" file="/changeset/changeset_file_comment.mako"/> | ||||
## comments heading with count | ||||
r3882 | <div class="comments-heading"> | |||
<i class="icon-comment"></i> | ||||
r4485 | ${_('General Comments')} ${len(c.comments)} | |||
r3882 | </div> | |||
r1282 | ## render comments | |||
r1332 | ${comment.generate_comments(c.comments)} | |||
r1282 | ||||
## main comment form and it status | ||||
r1951 | ${comment.comments(h.route_path('repo_commit_comment_create', repo_name=c.repo_name, commit_id=c.commit.raw_id), | |||
r1282 | h.commit_status(c.rhodecode_db_repo, c.commit.raw_id))} | |||
</div> | ||||
r4485 | ### NAV SIDEBAR | |||
<aside class="right-sidebar right-sidebar-expanded" id="commit-nav-sticky" style="display: none"> | ||||
<div class="sidenav navbar__inner" > | ||||
## TOGGLE | ||||
<div class="sidebar-toggle" onclick="toggleSidebar(); return false"> | ||||
<a href="#toggleSidebar" class="grey-link-action"> | ||||
</a> | ||||
</div> | ||||
## CONTENT | ||||
<div class="sidebar-content"> | ||||
r1282 | ||||
r4485 | ## RULES SUMMARY/RULES | |||
<div class="sidebar-element clear-both"> | ||||
<% vote_title = _ungettext( | ||||
'Status calculated based on votes from {} reviewer', | ||||
r4500 | 'Status calculated based on votes from {} reviewers', c.reviewers_count).format(c.reviewers_count) | |||
r4485 | %> | |||
<div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${vote_title}"> | ||||
<i class="icon-circle review-status-${c.commit_review_status}"></i> | ||||
r4500 | ${c.reviewers_count} | |||
r4485 | </div> | |||
</div> | ||||
r1282 | ||||
r4485 | ## REVIEWERS | |||
<div class="right-sidebar-expanded-state pr-details-title"> | ||||
<span class="tooltip sidebar-heading" title="${vote_title}"> | ||||
<i class="icon-circle review-status-${c.commit_review_status}"></i> | ||||
${_('Reviewers')} | ||||
</span> | ||||
</div> | ||||
<div id="reviewers" class="right-sidebar-expanded-state pr-details-content reviewers"> | ||||
<table id="review_members" class="group_members"> | ||||
## This content is loaded via JS and ReviewersPanel | ||||
</table> | ||||
</div> | ||||
## TODOs | ||||
<div class="sidebar-element clear-both"> | ||||
<div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="TODOs"> | ||||
<i class="icon-flag-filled"></i> | ||||
<span id="todos-count">${len(c.unresolved_comments)}</span> | ||||
</div> | ||||
<div class="right-sidebar-expanded-state pr-details-title"> | ||||
## Only show unresolved, that is only what matters | ||||
<span class="sidebar-heading noselect" onclick="refreshTODOs(); return false"> | ||||
<i class="icon-flag-filled"></i> | ||||
TODOs | ||||
</span> | ||||
% if c.resolved_comments: | ||||
<span class="block-right action_button last-item noselect" onclick="$('.unresolved-todo-text').toggle(); return toggleElement(this, '.resolved-todo');" data-toggle-on="Show resolved" data-toggle-off="Hide resolved">Show resolved</span> | ||||
% else: | ||||
<span class="block-right last-item noselect">Show resolved</span> | ||||
% endif | ||||
</div> | ||||
r1282 | ||||
r4485 | <div class="right-sidebar-expanded-state pr-details-content"> | |||
% if c.unresolved_comments + c.resolved_comments: | ||||
${sidebar.comments_table(c.unresolved_comments + c.resolved_comments, len(c.unresolved_comments), todo_comments=True, is_pr=False)} | ||||
% else: | ||||
<table> | ||||
<tr> | ||||
<td> | ||||
${_('No TODOs yet')} | ||||
</td> | ||||
</tr> | ||||
</table> | ||||
% endif | ||||
</div> | ||||
</div> | ||||
## COMMENTS | ||||
<div class="sidebar-element clear-both"> | ||||
<div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Comments')}"> | ||||
<i class="icon-comment" style="color: #949494"></i> | ||||
<span id="comments-count">${len(c.inline_comments_flat+c.comments)}</span> | ||||
<span class="display-none" id="general-comments-count">${len(c.comments)}</span> | ||||
<span class="display-none" id="inline-comments-count">${len(c.inline_comments_flat)}</span> | ||||
</div> | ||||
<div class="right-sidebar-expanded-state pr-details-title"> | ||||
<span class="sidebar-heading noselect" onclick="refreshComments(); return false"> | ||||
<i class="icon-comment" style="color: #949494"></i> | ||||
${_('Comments')} | ||||
</span> | ||||
</div> | ||||
r1282 | ||||
r4485 | <div class="right-sidebar-expanded-state pr-details-content"> | |||
% if c.inline_comments_flat + c.comments: | ||||
${sidebar.comments_table(c.inline_comments_flat + c.comments, len(c.inline_comments_flat+c.comments), is_pr=False)} | ||||
% else: | ||||
<table> | ||||
<tr> | ||||
<td> | ||||
${_('No Comments yet')} | ||||
</td> | ||||
</tr> | ||||
</table> | ||||
% endif | ||||
</div> | ||||
</div> | ||||
</div> | ||||
</div> | ||||
</aside> | ||||
r1282 | ||||
r4485 | ## FORM FOR MAKING JS ACTION AS CHANGESET COMMENTS | |||
<script type="text/javascript"> | ||||
window.setReviewersData = ${c.commit_set_reviewers_data_json | n}; | ||||
$(document).ready(function () { | ||||
var boxmax = parseInt($('#trimmed_message_box').css('max-height'), 10); | ||||
if ($('#trimmed_message_box').height() === boxmax) { | ||||
$('#message_expand').show(); | ||||
} | ||||
$('#message_expand').on('click', function (e) { | ||||
$('#trimmed_message_box').css('max-height', 'none'); | ||||
$(this).hide(); | ||||
}); | ||||
$('.show-inline-comments').on('click', function (e) { | ||||
var boxid = $(this).attr('data-comment-id'); | ||||
var button = $(this); | ||||
if (button.hasClass("comments-visible")) { | ||||
$('#{0} .inline-comments'.format(boxid)).each(function (index) { | ||||
$(this).hide(); | ||||
r1282 | }); | |||
button.removeClass("comments-visible"); | ||||
r4485 | } else { | |||
$('#{0} .inline-comments'.format(boxid)).each(function (index) { | ||||
$(this).show(); | ||||
r1282 | }); | |||
button.addClass("comments-visible"); | ||||
r4485 | } | |||
}); | ||||
r1282 | ||||
r4485 | // next links | |||
$('#child_link').on('click', function (e) { | ||||
// fetch via ajax what is going to be the next link, if we have | ||||
// >1 links show them to user to choose | ||||
if (!$('#child_link').hasClass('disabled')) { | ||||
$.ajax({ | ||||
r1951 | url: '${h.route_path('repo_commit_children',repo_name=c.repo_name, commit_id=c.commit.raw_id)}', | |||
r4485 | success: function (data) { | |||
if (data.results.length === 0) { | ||||
$('#child_link').html("${_('No Child Commits')}").addClass('disabled'); | ||||
} | ||||
if (data.results.length === 1) { | ||||
var commit = data.results[0]; | ||||
window.location = pyroutes.url('repo_commit', { | ||||
'repo_name': '${c.repo_name}', | ||||
'commit_id': commit.raw_id | ||||
}); | ||||
} else if (data.results.length === 2) { | ||||
$('#child_link').addClass('disabled'); | ||||
$('#child_link').addClass('double'); | ||||
r3852 | ||||
r4485 | var _html = ''; | |||
_html += '<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a> ' | ||||
.replace('__branch__', data.results[0].branch) | ||||
.replace('__rev__', 'r{0}:{1}'.format(data.results[0].revision, data.results[0].raw_id.substr(0, 6))) | ||||
.replace('__title__', data.results[0].message) | ||||
.replace('__url__', pyroutes.url('repo_commit', { | ||||
'repo_name': '${c.repo_name}', | ||||
'commit_id': data.results[0].raw_id | ||||
})); | ||||
_html += ' | '; | ||||
_html += '<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a> ' | ||||
.replace('__branch__', data.results[1].branch) | ||||
.replace('__rev__', 'r{0}:{1}'.format(data.results[1].revision, data.results[1].raw_id.substr(0, 6))) | ||||
.replace('__title__', data.results[1].message) | ||||
.replace('__url__', pyroutes.url('repo_commit', { | ||||
'repo_name': '${c.repo_name}', | ||||
'commit_id': data.results[1].raw_id | ||||
})); | ||||
$('#child_link').html(_html); | ||||
} | ||||
r1282 | } | |||
r4485 | }); | |||
e.preventDefault(); | ||||
} | ||||
}); | ||||
r1282 | ||||
r4485 | // prev links | |||
$('#parent_link').on('click', function (e) { | ||||
// fetch via ajax what is going to be the next link, if we have | ||||
// >1 links show them to user to choose | ||||
if (!$('#parent_link').hasClass('disabled')) { | ||||
$.ajax({ | ||||
r1951 | url: '${h.route_path("repo_commit_parents",repo_name=c.repo_name, commit_id=c.commit.raw_id)}', | |||
r4485 | success: function (data) { | |||
if (data.results.length === 0) { | ||||
$('#parent_link').html('${_('No Parent Commits')}').addClass('disabled'); | ||||
} | ||||
if (data.results.length === 1) { | ||||
var commit = data.results[0]; | ||||
window.location = pyroutes.url('repo_commit', { | ||||
'repo_name': '${c.repo_name}', | ||||
'commit_id': commit.raw_id | ||||
}); | ||||
} else if (data.results.length === 2) { | ||||
$('#parent_link').addClass('disabled'); | ||||
$('#parent_link').addClass('double'); | ||||
r3852 | ||||
r4485 | var _html = ''; | |||
_html += '<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a>' | ||||
.replace('__branch__', data.results[0].branch) | ||||
.replace('__rev__', 'r{0}:{1}'.format(data.results[0].revision, data.results[0].raw_id.substr(0, 6))) | ||||
.replace('__title__', data.results[0].message) | ||||
.replace('__url__', pyroutes.url('repo_commit', { | ||||
'repo_name': '${c.repo_name}', | ||||
'commit_id': data.results[0].raw_id | ||||
})); | ||||
_html += ' | '; | ||||
_html += '<a title="__title__" href="__url__"><span class="tag branchtag"><i class="icon-code-fork"></i>__branch__</span> __rev__</a>' | ||||
.replace('__branch__', data.results[1].branch) | ||||
.replace('__rev__', 'r{0}:{1}'.format(data.results[1].revision, data.results[1].raw_id.substr(0, 6))) | ||||
.replace('__title__', data.results[1].message) | ||||
.replace('__url__', pyroutes.url('repo_commit', { | ||||
'repo_name': '${c.repo_name}', | ||||
'commit_id': data.results[1].raw_id | ||||
})); | ||||
$('#parent_link').html(_html); | ||||
} | ||||
r1282 | } | |||
r4485 | }); | |||
e.preventDefault(); | ||||
} | ||||
}); | ||||
r1282 | ||||
r4485 | // browse tree @ revision | |||
$('#files_link').on('click', function (e) { | ||||
window.location = '${h.route_path('repo_files:default_path',repo_name=c.repo_name, commit_id=c.commit.raw_id)}'; | ||||
e.preventDefault(); | ||||
}); | ||||
r1282 | ||||
r4503 | reviewersController = new ReviewersController(); | |||
ReviewersPanel.init(reviewersController, null, setReviewersData); | ||||
r4485 | ||||
var channel = '${c.commit_broadcast_channel}'; | ||||
new ReviewerPresenceController(channel) | ||||
r5586 | function breakLongCommitMessage() { | |||
const commitElements = document.querySelectorAll(".left-content-message .commit"); | ||||
const maxAllowedWidth = window.innerWidth * 0.9; | ||||
commitElements.forEach(commitElement => { | ||||
const originalText = commitElement.textContent; | ||||
const lines = originalText.split("\n"); | ||||
const brokenLines = []; | ||||
commitElement.style.whiteSpace = "nowrap"; | ||||
for (let line of lines) { | ||||
let brokenLine = ""; | ||||
let words = line.split(" "); | ||||
let currentLine = ""; | ||||
words.forEach(word => { | ||||
const testLine = currentLine.length > 0 ? currentLine + " " + word : word; | ||||
commitElement.textContent = testLine; | ||||
const testLineWidth = commitElement.offsetWidth; | ||||
if (testLineWidth > maxAllowedWidth) { | ||||
brokenLine += currentLine + "\n"; | ||||
currentLine = word; | ||||
} else { | ||||
currentLine = testLine; | ||||
} | ||||
}); | ||||
brokenLine += currentLine; | ||||
brokenLines.push(brokenLine.trim()); | ||||
} | ||||
commitElement.textContent = brokenLines.join("\n"); | ||||
commitElement.style.whiteSpace = "pre-wrap"; | ||||
}); | ||||
} | ||||
window.addEventListener("load", function () { | ||||
const button = document.getElementById("break-button"); | ||||
button.addEventListener("click", breakLongCommitMessage); | ||||
}); | ||||
r4485 | }) | |||
</script> | ||||
r1282 | ||||
</%def> | ||||