| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721 |
- $(document).ready(function()
- {
- var $diffCode = $('.diff');
- var hidePreview;
- var $bugsPreview = $('#bugsPreview');
- var $bugsPreviewMenu = $('#bugsPreview').children('.dropdown-menu');
- var $rows = $diffCode.find('tr');
- var rowTip = $('#rowTip').html();
- var lastLine;
- $rows.each(function()
- {
- var $row = $(this);
- if(!$row.hasClass('empty'))
- {
- $row.children('th').first().prepend("<div class='comment-btn diff'><span class='icon-wrapper'><i class='icon-plus'></i></span></div>");
- $row.children('td').first().append(rowTip);
- if($row.data('type') != 'all')
- {
- var lineID = $row.data('line');
- var fileSrc = $row.data('src');
- $rightTh = $row.children('th').first().next();
- if(arrange == 'appose') $rightTh = $rightTh.next();
- $rightTh.prepend("<div class='diff-btn diff' onclick=showCommitInfo(this)><i class='icon-info-sign'></i></div>");
- }
- }
- if(lastLine && !$row.data('line'))
- {
- $row.attr('data-line', lastLine);
- }
- else
- {
- lastLine = $row.data('line');
- }
- }).hover(function()
- {
- var $this = $(this);
- if($this.hasClass('empty')) return;
- $this.addClass("over");
- },
- function()
- {
- $(this).removeClass("over");
- });
- var isInline = $.cookie('arrange') == 'inline';
- var $bugFormRow = $('<tr class="action-row"><th></th>' + (isInline ? '<th></th><td class="action-cell"></td>' : '<td colspan="3" class="action-cell"></td>') + '</tr>');
- var $bugForm = $('#bugForm');
- var $commentCell = $('#commentCell');
- var $bugPanel = $('#bugPanel');
- $bugFormRow.find('td').append($bugForm.removeClass('hide'));
- var highlight = function($e)
- {
- $('.highlight').removeClass('highlight');
- $e.addClass('highlight');
- };
- var createComment = function(comment, $comments)
- {
- var $comment = $commentCell.clone()
- .removeClass('hide')
- .attr('id', 'comment-' + comment.id)
- .attr('data-comment', comment.id);
- $comment.find('.realname').text(comment.realname);
- $comment.find('.comment-content').text(comment.comment);
- $comment.find('.date').text(comment.date);
- $comment.find('.edit').toggle(comment.edit);
- $comment.find('.comment-edit-form').attr('action', createLink('repo', 'editComment', 'commentID=' + comment.id));
- if(comment.user.avatar)
- {
- $comment.find('.avatar').removeClass('has-text').addClass('has-img');
- $comment.find('.avatar span').remove();
- $comment.find('.avatar').html('<img src="' + comment.user.avatar + '"/>');
- }
- else
- {
- $comment.find('.avatar').removeClass('has-img').addClass('has-text');
- $comment.find('.avatar img').remove();
- var name = comment.user.name ? comment.user.name : (comment.user.realname ? comment.user.realname : comment.user.account);
- $comment.find('.avatar').html('<span class="text text-len-' + name.replace(/[^\x00-\xff]/g, "00").length + '">' + name + '</span>');
- }
- if($comments)
- {
- if(typeof $comments !== 'object') $comments = $('#bug-' + $comments + ' .comments');
- ($comments.hasClass('comments') ? $comments : $comments.find('.comments')).append($comment);
- }
- return $comment;
- };
- var createBug = function(bug, line, $commentRow, show)
- {
- var commentCount, j;
- var $bug = $bugPanel.clone().removeClass('hide').attr('id', 'bug-' + bug.id).attr('data-bug', bug.id);
- $bug.find('.bugid').text(bug.id);
- $bug.find('.view-bug').attr('title', bug.title);
- $bug.find('.edit').toggle(bug.edit);
- $bug.find('.code-lines').text(bug.lines);
- $bug.find('.delete').toggle(bug.delete);
- $bug.find('input[name="objectID"]').val(bug.id);
- $bug.find('a.view-bug').attr('href', createLink('bug', 'view', 'bugID=' + bug.id + '&from=repo', '', true));
- $bug.find('a.bugEdit').attr('href', createLink('bug', 'edit', 'bugID=' + bug.id + '&from=repo', '', true));
- $bug.data('data', bug);
- $bug.toggleClass('show', show > 1);
- if(show > 2) highlight($bug);
- if(bug.comments)
- {
- commentCount = bug.comments.length;
- $bugComments = $bug.find('.comments');
- for(j = 0; j < commentCount; j++)
- {
- createComment(bug.comments[j], $bugComments);
- }
- }
- if(!line && bug.line) line = bug.line;
- if(line)
- {
- if(!$commentRow)
- {
- var $row = $rows.filter('[data-line="' + line + '"][data-src="' + bug.file + '"]').last();
- $commentRow = $row.next('tr');
- if(!$commentRow.hasClass('comment-row'))
- {
- $commentRow = $('<tr class="comment-row"><th class="w-num"></th>' + (isInline ? '<th class="w-num"></th><td class="comment-cell"><div class="comment-list"></div></td>' : '<td colspan="3" class="comment-cell"><div class="comment-list"></div></td>') + '</tr>');
- $row.addClass('commented').after($commentRow);
- }
- }
- ($commentRow.hasClass('comment-list') ? $commentRow : $commentRow.find('.comment-list')).append($bug);
- if(show && $commentRow.hasClass('comment-row')) $commentRow.addClass('show');
- }
- $bug.find('.iframe').initIframeModal();
- return $bug;
- };
- var toggleComment = function($row, show)
- {
- var $commentRow;
- if($row.hasClass('comment-row'))
- {
- $commentRow = $row;
- $row = $commentRow.prev('tr');
- if($row.hasClass('action-row'))
- {
- $row = $row.prev('tr');
- }
- }
- else
- {
- $commentRow = $row.next('tr');
- if($commentRow.hasClass('action-row'))
- {
- $commentRow = $commentRow.next('tr');
- }
- }
- if(show === undefined)
- {
- show = !$row.hasClass('open');
- }
- if($row.hasClass('commented') && $commentRow.hasClass('comment-row'))
- {
- $commentRow.toggleClass('show', show);
- $row.toggleClass('open', show);
- }
- };
- $diffCode.on('click', '.comment-btn', function(e)
- {
- $rows.removeClass('selected');
- var $row = $(this).closest('tr');
- if($diffCode.hasClass('with-action-row') && $row.hasClass('with-action-row'))
- {
- $diffCode.removeClass('with-action-row');
- }
- else
- {
- $diffCode.addClass('with-action-row');
- var line = $row.data('line');
- var fileName = $row.data('src');
- if(!$row.hasClass('with-action-row'))
- {
- $rows.removeClass('with-action-row')
- $row.addClass('with-action-row');
- $bugForm.find('input[name="entry"]').val(fileName);
- $bugForm.find('input[name="begin"]').val(line);
- $bugForm.find('input[name="end"]').attr('min', line).val(line);
- $bugForm.find('select#assignedTo').val(blamePairs[line]);
- $bugForm.find('select#assignedTo').trigger("chosen:updated");
- $row.after($bugFormRow);
- KindEditor.remove('#commentText');
- $('#commentText').kindeditor();
- var getCommiterLink = createLink('repo', 'ajaxgetcommitter', 'repoID=' + repoID + "&entry=" + file + "&revision=" + revision + "&line=" + line);
- var connector = getCommiterLink.indexOf('&') >= 0 ? '&' : '?';
- getCommiterLink = getCommiterLink + connector + 'entry=' + file;
- $.ajax({url: getCommiterLink}).done(function(responseText)
- {
- $bugForm.find('#assignedTo').val(responseText).trigger("chosen:updated");
- });
- }
- highlight($bugForm);
- $bugForm.find('input[name="title"]').focus();
- $row.addClass('selected');
- }
- e.stopPropagation();
- }).on('click', '.bugCancel', function()
- {
- $rows.removeClass('selected');
- $diffCode.removeClass('with-action-row');
- }).on('click', '.bugEdit,.view-bug', function(e)
- {
- if(!isonlybody) return false;
- }).on('click', '.bugDelete', function(e)
- {
- var $bug = $(this).closest('.panel-bug');
- if(!$bug.length) return;
- if(confirm(confirmDelete))
- {
- var link = createLink('repo', 'deleteBug', 'bugID=' + $bug.data('bug') + '&confirm=yes');
- $.get(link, function(data)
- {
- if(data == 'deleted')
- {
- var $commentRow = $bug.closest('.comment-row');
- if($commentRow.find('.panel-bug').length === 1)
- {
- $commentRow.removeClass('show').prev('tr').removeClass('commented');
- }
- $bug.remove();
- }
- });
- }
- e.stopPropagation();
- return false;
- }).on('click', '.addComment', function()
- {
- $(this).closest('.panel-bug').addClass('show-form').find('.commentForm textarea').focus();
- }).on('click', '.commentCancel', function()
- {
- $(this).closest('.panel-bug').removeClass('show-form');
- }).on('submit', '.commentForm', function()
- {
- var $form = $(this);
- $form.ajaxSubmit(
- {
- success:function(json)
- {
- var $panelBug = $form.closest('.panel-bug');
- $form.find('textarea').val('');
- $panelBug.removeClass('show-form');
- createComment($.parseJSON(json), $panelBug.data('bug'));
- },
- beforeSubmit:function(formData, jqForm)
- {
- var form = jqForm[0];
- if(!form.comment.value)
- {
- alert(commentError);
- return false;
- }
- }
- });
- return false;
- }).on('click', '.commentEdit', function()
- {
- var $comment = $(this).closest('.comment');
- if($comment.hasClass('show-form'))
- {
- $comment.removeClass('show-form');
- return;
- }
- $comment.addClass('show-form').find('textarea').val($comment.find('.comment-content').text()).focus();
- }).on('click', '.commentEditCancel', function()
- {
- $(this).closest('.comment').removeClass('show-form');
- }).on('submit', '.comment-edit-form', function()
- {
- var $form = $(this);
- $form.ajaxSubmit(
- {
- success:function(html)
- {
- var $comment = $form.closest('.comment');
- $comment.find('.comment-content').html(html);
- $comment.removeClass('show-form');
- },
- beforeSubmit:function(formData, jqForm)
- {
- var form = jqForm[0];
- if(!form.commentText.value)
- {
- alert(contentError);
- return false;
- }
- }
- });
- return false;
- }).on('click', '.commentDelete', function()
- {
- var $container = $(this).closest('.commentContainer');
- if(!$container.length) return;
- if(confirm(confirmDeleteComment))
- {
- var commentID = $container.data('comment');
- var link = createLink('repo', 'deleteComment', 'commentID=' + commentID + '&confirm=yes');
- $.get(link, function(data)
- {
- if(data == 'deleted')
- {
- var $commentRow = $container.closest('.comment-row');
- if($commentRow.find('.bugContainer, .commentContainer').length === 1)
- {
- $commentRow.removeClass('show').prev('tr').removeClass('commented');
- }
- $container.remove();
- }
- });
- }
- return false;
- }).on('click', 'tr.commented', function()
- {
- toggleComment($(this));
- }).on('click', '.panel-bug > .panel-heading', function()
- {
- $(this).closest('.panel-bug').toggleClass('show');
- }).on('mouseenter', 'tr.commented td .preview-icon', function(e)
- {
- var $cell = $(this).closest('td');
- var $row = $cell.closest('tr');
- var $commentRow = $row.next('tr');
- var $bugs = $commentRow.find('.panel-bug'), line = '?';
- $bugsPreviewMenu.children('li:not(.dropdown-header)').remove();
- $bugsPreviewMenu.find('.bug-count').text($bugs.length);
- $bugsPreviewMenu.find('.comment-count').text($commentRow.find('.comment').length);
- $bugs.each(function()
- {
- var bug = $(this).data('data');
- line = bug.line;
- $bugsPreviewMenu.append('<li><a href="javascript:;" data-id="#bug-' + bug.id + '"><small class="text-muted">#' + bug.id + '</small> ' + bug.title + '</a></li>');
- });
- $bugsPreviewMenu.find('.code-line').text(line);
- $bugsPreview.prependTo($cell);
- clearTimeout(hidePreview);
- $bugsPreviewMenu.css({top: 0-$bugsPreviewMenu.outerHeight(), left: Math.max(0, e.offsetX-$bugsPreviewMenu.outerWidth())}).addClass('show');
- setTimeout(function(){$bugsPreviewMenu.addClass('in');}, 50);
- }).on('mouseleave', 'tr.commented td', function()
- {
- $bugsPreviewMenu.removeClass('in');
- hidePreview = setTimeout(function(){$bugsPreviewMenu.removeClass('show');}, 200);
- });
- $bugsPreviewMenu.on('click', 'li', function(e)
- {
- var $bug = $($(this).find('a').data('id'));
- if($bug.length)
- {
- $bug.addClass('show');
- toggleComment($bug.closest('tr.comment-row'), true);
- highlight($bug);
- $bugsPreviewMenu.removeClass('in');
- hidePreview = setTimeout(function(){$bugsPreviewMenu.removeClass('show');}, 200);
- }
- e.stopPropagation();
- });
- $bugForm.submit(function()
- {
- $(this).ajaxSubmit(
- {
- success:function(json)
- {
- json = $.parseJSON(json);
- if(json.result == 'fail')
- {
- alert(json.message);
- return false;
- }
- createBug(json, null, null, 3);
- $diffCode.removeClass('with-action-row');
- $diffCode.find('tr.with-action-row.selected').removeClass('selected');
- $bugForm.find('#title').val('');
- KindEditor.html('#commentText', '');
- },
- beforeSubmit:function(formData, jqForm)
- {
- var form = jqForm[0];
- if(!form.product.value)
- {
- alert(productError);
- return false;
- }
- if(!form.title.value)
- {
- alert(titleError);
- $bugForm.find('input[name="title"]').focus();
- return false;
- }
- }
- });
- return false;
- }).on('change', 'input[name="begin"]', function()
- {
- var begin = $(this).val();
- var $end = $bugForm.find('input[name="end"]').attr('min', begin);
- if(parseInt($end.val()) < parseInt(begin))
- {
- $end.val(begin);
- }
- });
- if(bugs)
- {
- var lineBugs, bugsCount, i;
- for(var line in bugs)
- {
- if(line)
- {
- lineBugs = bugs[line];
- bugsCount = lineBugs.length;
- for(i = 0; i < bugsCount; i++)
- {
- createBug(lineBugs[i], line);
- }
- }
- }
- }
- setTimeout(anchor, 200);
- $(document).on('click', function()
- {
- $('.highlight').removeClass('highlight');
- });
- $(document).mouseup(function(e)
- {
- var $box = $('#commit-box');
- if(!$box.is(e.target) && $box.has(e.target).length === 0)
- {
- $('#commit-box').remove();
- }
- });
- function anchor()
- {
- var hash = window.location.hash;
- if(hash)
- {
- var line = hash.substr(1).replace('L', '');
- var $row = $('.diff tr[data-line="' + line +'"]').first();
- if($row.length)
- {
- var anchor = $row.offset().top;
- $('body,html').animate({scrollTop:anchor - 50}, 500);
- $row.addClass('highlight');
- if($row.hasClass('commented'))
- {
- toggleComment($row, true);
- var $commentRow = $row.next('tr');
- if($commentRow.hasClass('comment-row'))
- {
- $commentRow.addClass('highlight');
- }
- }
- }
- }
- }
- /* Diff url locate. */
- $('.diffForm').click(function()
- {
- if($(this).hasClass('disabled')) return false;
- var oldRevision = $('#oldRevision').val();
- var newRevision = $('#newRevision').val();
- var isBranchOrTag = $('#isBranchOrTag').val();
- if(!oldRevision || !newRevision)
- {
- (repo.SCM != 'Subversion') ? alert(repoLang.error.needTwoVersion) : alert(repoLang.error.emptyVersion);
- return false;
- }
- if(repo.SCM == 'Subversion')
- {
- var intRe = /^\d+$/;
- if((intRe.test(oldRevision) == false && oldRevision != '^') || (intRe.test(newRevision) == false && newRevision != '^'))
- {
- alert(repoLang.error.versionError);
- return false;
- }
- }
- if(oldRevision == newRevision)
- {
- alert(repoLang.error.differentVersions);
- return false;
- }
- if(isBranchOrTag)
- {
- oldRevision = btoa(encodeURIComponent(oldRevision));
- newRevision = btoa(encodeURIComponent(newRevision));
- }
- var url = createLink('repo', 'diff', 'repoID=' + repoID + '&objectID=' + objectID + '&entry=&oldRevision=' + oldRevision + '&newRevision=' +newRevision + '&showBug=0&encoding=&isBranchOrTag=' + isBranchOrTag);
- window.location = url;
- });
- $(document).on('click', '.branch-or-tag', function()
- {
- $('.diffForm').removeClass('disabled');
- var isSource = $(this).hasClass('source');
- var version = $(this).text();
- if(isSource)
- {
- if($('#newRevision').val() == version) $('.diffForm').addClass('disabled');
- $('#sourceSwapper .version-name').text(version);
- $('#sourceSwapper .repo-select').attr('title', version);
- $('#oldRevision').val(version);
- $('#sourceSwapper .branch-or-tag').removeClass('selected');
- }
- else
- {
- if($('#oldRevision').val() == version) $('.diffForm').addClass('disabled');
- $('#targetSwapper .version-name').text(version);
- $('#targetSwapper .repo-select').attr('title', version);
- $('#newRevision').val(version);
- $('#targetSwapper .branch-or-tag').removeClass('selected');
- }
- $(this).addClass('selected');
- });
- $(document).on('input', '.svn-version', function()
- {
- $('.diffForm').removeClass('disabled');
- var oldRevision = $('#oldRevision').val();
- var newRevision = $('#newRevision').val();
- if(oldRevision == newRevision) $('.diffForm').addClass('disabled');
- });
- $(document).on('click', '.label-exchange-git', function()
- {
- var source = $('#oldRevision').val();
- var target = $('#newRevision').val();
- if(source && target)
- {
- $('#oldRevision').val(target);
- $('#newRevision').val(source);
- $('.diffForm').click();
- }
- })
- $('.file-name').click(function()
- {
- $(this).prev().click();
- });
- /** Fix English grammar errors. */
- if($(".add-cot").length > 0)
- {
- $('.add-cot').html($('.add-cot').html().replace('1 lines', '1 line'));
- $('.delete-cot').html($('.delete-cot').html().replace('1 lines', '1 line'));
- }
- /* Disable the enter event. */
- $(document).keydown(function(event)
- {
- if(event.keyCode == 13) return false;
- });
- /** Press enter to trigger version search. */
- $("#searchSource").keydown(function(event)
- {
- if(event.keyCode == 13)
- {
- var version = $(this).val();
- if(!version) return;
- $('#sourceSwapper .version-name').text(version);
- $('#sourceSwapper .repo-select').attr('title', version);
- $('#oldRevision').val(version);
- $('#sourceSwapper .branch-or-tag').removeClass('selected');
- }
- });
- $("#searchTarget").keydown(function(event)
- {
- if(event.keyCode == 13)
- {
- var version = $(this).val();
- if(!version) return;
- $('#targetSwapper .version-name').text(version);
- $('#targetSwapper .repo-select').attr('title', version);
- $('#newRevision').val(version);
- $('#targetSwapper .branch-or-tag').removeClass('selected');
- }
- });
- if(['Git', 'Gitlab', 'Gogs', 'Gitea'].indexOf(repo.SCM)) getBranchAndTag();
- });
- /**
- * Change encode.
- *
- * @param string $encoding
- * @access public
- * @return void
- */
- function changeEncoding(encoding)
- {
- $('#encoding').val(encoding);
- $('#encoding').parents('form').submit();
- }
- /**
- * Get branch and tag.
- *
- * @param int $repoID
- * @access public
- * @return void
- */
- function getBranchAndTag()
- {
- if(repoID)
- {
- var link = createLink('repo', 'ajaxGetBranchesAndTags', 'repoID=' + repoID + '&oldRevision=' + sourceRevision + '&newRevision=' + revision);
- $.get(link, function(data)
- {
- var result = $.parseJSON(data);
- $('#sourceList').empty();
- $('#targetList').empty();
- $('#sourceList').append(result.sourceHtml);
- $('#targetList').append(result.targetHtml);
- });
- }
- }
- /**
- * Expand and collapse code blocks.
- *
- * @param node icon
- * @access public
- * @return void
- */
- function diffToggle(icon)
- {
- if($(icon).hasClass('list-toggle-open'))
- {
- $(icon).removeClass('list-toggle-open');
- $(icon).parents('.table').find('tr').hide();
- $(icon).parents('.table').find('.comment-row').addClass('hideImportant');
- }
- else
- {
- $(icon).addClass('list-toggle-open');
- $(icon).parents('.table').find('tr').show();
- $(icon).parents('.table').find('.comment-row').removeClass('hideImportant');
- }
- }
- /**
- * Jump to file.
- *
- * @param int $fileKey
- * @param node $aNode
- * @access public
- * @return void
- */
- function jumpFile(fileKey, aNode)
- {
- $("#fileTree a").removeClass('selected');
- $(aNode).addClass('selected');
- $("#file" + fileKey).find('.list-toggle').click();
- }
- /**
- * Show commit info.
- *
- * @param node $row
- * @access public
- * @return void
- */
- function showCommitInfo(row)
- {
- var fileSrc = $(row).parent().parent().data('src');
- var line = $(row).parent().parent().data('line');
- var link = createLink('repo', 'ajaxGetCommitInfo');
- var data = {
- repoID : repoID,
- entry : fileSrc,
- revision : revision,
- sourceRevision: sourceRevision,
- line : line,
- };
- $.post(link, data, function(html)
- {
- $(row).parent().append(html);
- })
- }
|