417 lines
12 KiB
JavaScript
417 lines
12 KiB
JavaScript
var iframeHeight = 0;
|
|
var sidebarHeight = 0;
|
|
var tabTemp;
|
|
var diffAppose = $.cookie.get('renderSideBySide') == 'true';
|
|
|
|
var distance = 0;
|
|
|
|
/**
|
|
* 左右切换关联信息。
|
|
* Aarrow tabs area.
|
|
*
|
|
* @param string domID
|
|
* @param number shift 1|-1
|
|
* @param bool hideRightBtn
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function arrowTabs(domID, shift, hideRightBtn)
|
|
{
|
|
if($('#' + domID).html() == '') return;
|
|
|
|
var hasParent = $('#' + domID + ' .btn-left').length;
|
|
var $leftBtn = hasParent ? $('#' + domID + ' .btn-left') : $('.btn-left');
|
|
var $rightBtn = hasParent ? $('#' + domID + ' .btn-right') : $('.btn-right');
|
|
|
|
$leftBtn.show();
|
|
$rightBtn.show();
|
|
if(hideRightBtn) $rightBtn.hide();
|
|
|
|
var tabItemWidth = 0;
|
|
if($('#' + domID + ' > .nav-tabs')[0]) tabItemWidth = $('#' + domID + ' > .nav-tabs')[0].clientWidth;
|
|
var tabsWidth = $('#' + domID)[0].clientWidth;
|
|
if($('#' + domID + ' .close-bugs').length) tabsWidth = tabsWidth * 0.7;
|
|
|
|
if(tabItemWidth <= tabsWidth)
|
|
{
|
|
$leftBtn.hide();
|
|
$rightBtn.hide();
|
|
if($('#' + domID + ' > .nav-tabs').length) $('#' + domID + ' > .nav-tabs')[0].style.transform = 'translateX(0px)';
|
|
return;
|
|
}
|
|
|
|
distance += tabsWidth * shift * 0.2;
|
|
if(distance > 0) distance = 0;
|
|
if(distance == 0)
|
|
{
|
|
$leftBtn.hide();
|
|
}
|
|
|
|
if((tabItemWidth + distance) <= tabsWidth * 0.75)
|
|
{
|
|
$rightBtn.hide();
|
|
return arrowTabs(domID, 1, true);
|
|
}
|
|
|
|
if(domID == 'monacoTabs' && distance < -60) distance = distance + 60;
|
|
|
|
$('#' + domID + ' > .nav-tabs')[0].style.transform = 'translateX('+ distance +'px)';
|
|
}
|
|
|
|
/**
|
|
* 关闭关联信息tab。
|
|
* Close commit relations.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function closeRelation()
|
|
{
|
|
$('#relationTabs ul li').remove();
|
|
$('#relationTabs .tab-content .tab-pane').remove();
|
|
$('.history').html('');
|
|
$('#log').data('line', 0);
|
|
$('#log').hide();
|
|
|
|
$('#codeContainer').css('height', codeHeight);
|
|
$('#related').css('height', 0);
|
|
};
|
|
|
|
/**
|
|
* 获取tabs内容高度。
|
|
* Get tab-content height.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function getIframeHeight()
|
|
{
|
|
if(iframeHeight) return iframeHeight;
|
|
|
|
var windowHeight = $(window).height();
|
|
var headerHeight = parseInt($('#header').height());
|
|
var mainNavbar = parseInt($('#navbar').height());
|
|
var tabsbar = parseInt($('.nav-tabs').height());
|
|
var mainMenuHeight = parseInt($('#mainContent').css('padding-top')) + parseInt($('#mainContent').css('padding-bottom'));
|
|
var detailHeaderHeight = parseInt($('.detail-header').height());
|
|
var mrMenuHeight = parseInt($('#mrMenu').height());
|
|
var appTabsHeight = parseInt($('#appTabs').height());
|
|
var appsBarHeight = parseInt($('#appsBar').height());
|
|
|
|
appsBarHeight = appsBarHeight ? appsBarHeight : 0;
|
|
appTabsHeight = appTabsHeight ? appTabsHeight : 0;
|
|
mainMenuHeight = mainMenuHeight ? mainMenuHeight : 0;
|
|
mainNavbar = mainNavbar ? mainNavbar : 0;
|
|
iframeHeight = windowHeight - headerHeight - appsBarHeight - appTabsHeight - mainMenuHeight - mainNavbar - tabsbar - detailHeaderHeight - mrMenuHeight - 28;
|
|
|
|
return iframeHeight;
|
|
}
|
|
|
|
/**
|
|
* 获取左侧边栏高度。
|
|
* Get sidebar height.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function getSidebarHeight()
|
|
{
|
|
if(sidebarHeight) return sidebarHeight;
|
|
|
|
var windowHeight = $(window).height();
|
|
var headerHeight = parseInt($('#header').height());
|
|
var mainNavbar = parseInt($('#navbar').height());
|
|
var mainMenuHeight = parseInt($('#mainContent').css('padding-top')) + parseInt($('#mainContent').css('padding-bottom'));
|
|
var appTabsHeight = parseInt($('#appTabs').height());
|
|
var appsBarHeight = parseInt($('#appsBar').height());
|
|
var detailHeaderHeight = parseInt($('.detail-header').height());
|
|
var mrMenuHeight = parseInt($('#mrMenu').height());
|
|
|
|
appsBarHeight = appsBarHeight ? appsBarHeight : 0;
|
|
appTabsHeight = appTabsHeight ? appTabsHeight : 0;
|
|
mainMenuHeight = mainMenuHeight ? mainMenuHeight : 0;
|
|
mainNavbar = mainNavbar ? mainNavbar : 0;
|
|
sidebarHeight = windowHeight - headerHeight - appsBarHeight - appTabsHeight - mainMenuHeight - mainNavbar - detailHeaderHeight - mrMenuHeight - 20;
|
|
|
|
return sidebarHeight;
|
|
}
|
|
|
|
|
|
/**
|
|
* 查找选中元素所有的父元素及选中元素的id。
|
|
* Find parent nodes and item id of selected tree item.
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
function findItemInTreeItems(list, key, level) {
|
|
for (const item of list) {
|
|
if(level === 0)
|
|
{
|
|
parentTree = [item.key];
|
|
}
|
|
|
|
if (item.id === key) return item;
|
|
|
|
if (item.children && item.children.length > 0)
|
|
{
|
|
const findedItem = findItemInTreeItems(item.children, key);
|
|
if (findedItem)
|
|
{
|
|
parentTree.push(item.key);
|
|
return findedItem;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 展开树状结构。
|
|
* Expand tree node.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function expandTree()
|
|
{
|
|
const treeObj = $('#monacoTree').parent().data('zui.Tree');
|
|
if(treeObj == undefined || treeObj.$ == undefined) return;
|
|
|
|
for (const key of parentTree) treeObj.$.expand(key);
|
|
}
|
|
|
|
/* Close tab. */
|
|
window.closeTab = function(obj)
|
|
{
|
|
var eleId = $(obj).parent().attr('href');
|
|
var tabsEle = $(obj).parent().parent().parent();
|
|
var isActive = $(obj).parent().hasClass('active');
|
|
|
|
$(obj).parent().parent().remove();
|
|
$(eleId).remove();
|
|
$('#' + eleId.substring(5)).parent().removeClass('selected');
|
|
if(isActive) tabsEle.children().last().find('a').trigger('click');
|
|
if(!tabsEle.children().length) $('.monaco-dropmenu').addClass('hidden');
|
|
|
|
const fileKey = eleId.substring(5).replace(/-/g, '=');
|
|
$('li[z-key="' + fileKey + '"] .listitem').removeClass('selected');
|
|
}
|
|
|
|
|
|
window.afterPageUpdate = function()
|
|
{
|
|
setTimeout(function()
|
|
{
|
|
var fileAsId = file.replace(/=/g, '-');
|
|
/* Resize moaco height. */
|
|
$('#monacoTree').css('height', getSidebarHeight() - 8 + 'px');
|
|
/* Init tab template. */
|
|
if(!tabTemp) tabTemp = $('#monacoTabs ul li').first().clone();
|
|
|
|
/* Load default tab content. */
|
|
var height = getIframeHeight();
|
|
$.cookie.set('repoCodePath', file, {expires:config.cookieLife, path:config.webRoot});
|
|
$('#tab-' + fileAsId).html("<iframe class='repo-iframe' src='" + $.createLink('repo', 'ajaxGetDiffEditorContent', urlParams.replace('%s', '')) + "' width='100%' height='" + height + "' scrolling='no'></iframe>")
|
|
|
|
/* Select default tree item. */
|
|
const currentElement = findItemInTreeItems(tree, fileAsId, 0);
|
|
if(currentElement != undefined) $('#' + currentElement.id).parent().addClass('selected');
|
|
expandTree();
|
|
|
|
$('.btn-left').on('click', function() {arrowTabs('monacoTabs', 1);});
|
|
$('.btn-right').on('click', function() {arrowTabs('monacoTabs', -2);});
|
|
}, 200);
|
|
};
|
|
|
|
/**
|
|
* 点击左侧菜单打开详情tab。
|
|
* Open new tab when click tree item.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
window.treeClick = function(info)
|
|
{
|
|
if (info.item.items && info.item.items.length > 0) return;
|
|
$('li[z-key="' + info.item.id + '"] .listitem').addClass('selected');
|
|
openTab(info.item.id, info.item.text);
|
|
arrowTabs('monacoTabs', -2);
|
|
}
|
|
|
|
/**
|
|
* Change code encoding.
|
|
*
|
|
* @param string encoding
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function changeEncoding(encoding)
|
|
{
|
|
$('#encoding').val(encoding);
|
|
$('#encoding').parents('form').submit();
|
|
}
|
|
|
|
/**
|
|
* Html code decode.
|
|
*
|
|
* @param string str
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
function htmlspecialchars_decode(str){
|
|
str = str.replace(/&/g, '&');
|
|
str = str.replace(/</g, '<');
|
|
str = str.replace(/>/g, '>');
|
|
str = str.replace(/"/g, "''");
|
|
str = str.replace(/'/g, "'");
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* Get diffs by file name.
|
|
*
|
|
* @param string fileName
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
window.getDiffs = function(fileName)
|
|
{
|
|
if(fileName.indexOf('./') === 0) fileName = fileName.substring(2);
|
|
|
|
var result = {
|
|
'code': {'new': '', 'old': ''},
|
|
'line': {'new': [], 'old': []}
|
|
};
|
|
|
|
const newContent = [];
|
|
const oldContent = [];
|
|
$.each(diffs, function(i, diff)
|
|
{
|
|
if(diff.fileName == fileName)
|
|
{
|
|
if(!diff.contents || typeof diff.contents[0].lines != 'object') return result;
|
|
|
|
$.each(diff.contents, function(k, content)
|
|
{
|
|
var lines = content.lines;
|
|
$.each(lines, function(l, code)
|
|
{
|
|
if(code.type == 'all' || code.type == 'new')
|
|
{
|
|
newContent.push(htmlspecialchars_decode(code.line.substring(1)));
|
|
result.line.new.push(parseInt(code.newlc));
|
|
}
|
|
|
|
if(code.type == 'all' || code.type == 'old')
|
|
{
|
|
oldContent.push(htmlspecialchars_decode(code.line.substring(1)));
|
|
result.line.old.push(parseInt(code.oldlc));
|
|
}
|
|
})
|
|
})
|
|
|
|
result.code.new = newContent.join('\n');
|
|
result.code.old = oldContent.join('\n');
|
|
return result;
|
|
}
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 打开新tab。
|
|
* Open new tab.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function openTab(entry, name)
|
|
{
|
|
var eleId = 'tab-' + entry.replace(/=/g, '-');
|
|
var element = document.getElementById(eleId);
|
|
if (element)
|
|
{
|
|
$("a[href='" + '#' + eleId + "']").trigger('click');
|
|
return;
|
|
}
|
|
|
|
var newTab = tabTemp.clone();
|
|
newTab.find('a').attr('href', '#' + eleId);
|
|
newTab.find('span').text(name);
|
|
$('#monacoTabs .nav-tabs').append(newTab);
|
|
|
|
var height = getIframeHeight();
|
|
$.cookie.set('repoCodePath', entry, {expires:config.cookieLife, path:config.webRoot});
|
|
$('#monacoTabs .tab-content').append("<div id='" + eleId + "' class='tab-pane active in'><iframe class='repo-iframe' src='" + $.createLink('repo', 'ajaxGetDiffEditorContent', urlParams.replace('%s', '')) + "' width='100%' height='" + height + "' scrolling='no'></iframe></div>")
|
|
|
|
if($('.monaco-dropmenu').attr('class').indexOf('hidden')) $('.monaco-dropmenu').removeClass('hidden');
|
|
setTimeout(() => {
|
|
$("a[href='" + '#' + eleId + "']").trigger('click');
|
|
updateEditorInline('#' + eleId);
|
|
}, 100);
|
|
}
|
|
|
|
window.updateEditorInline = function(eleId)
|
|
{
|
|
$.cookie.set('renderSideBySide', diffAppose, {expires:config.cookieLife, path:config.webRoot});
|
|
if(typeof $(eleId + ' iframe')[0].contentWindow.updateEditorInline == 'function')
|
|
{
|
|
$(eleId + ' iframe')[0].contentWindow.updateEditorInline(diffAppose);
|
|
}
|
|
}
|
|
|
|
window.changeDiffType = function(obj)
|
|
{
|
|
const eleId = $(obj).attr('href');
|
|
if(eleId) $(eleId + ' iframe')[0].contentWindow.updateEditorInline(diffAppose);
|
|
}
|
|
|
|
$(document).ready(function()
|
|
{
|
|
if(diffAppose)
|
|
{
|
|
$('.dropdown-menu #inline').show();
|
|
$('.dropdown-menu #appose').hide();
|
|
}
|
|
else
|
|
{
|
|
$('.dropdown-menu #appose').show();
|
|
$('.dropdown-menu #inline').hide();
|
|
}
|
|
|
|
$('.btn-left').on('click', function() {arrowTabs('monacoTabs', 1);});
|
|
$('.btn-right').on('click', function() {arrowTabs('monacoTabs', -2);});
|
|
});
|
|
|
|
window.inlineAppose = function()
|
|
{
|
|
$('.inline-appose').hide();
|
|
diffAppose = !diffAppose;
|
|
if(diffAppose)
|
|
{
|
|
$('.dropdown-menu #inline').show();
|
|
}
|
|
else
|
|
{
|
|
$('.dropdown-menu #appose').show();
|
|
}
|
|
var tabID = $('#monacoTabs .nav-item .active').attr('href');
|
|
updateEditorInline(tabID);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* 在当前页面用modal加载链接。
|
|
* Load link object page.
|
|
*
|
|
* @param string $link
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
window.loadLinkPage = function(link)
|
|
{
|
|
$('#linkObject').attr('href', link);
|
|
$('#linkObject').trigger('click');
|
|
}
|