|
|
<%inherit file="/base/base.html"/>
|
|
|
|
|
|
<%block name="title">
|
|
|
${_('%s Files') % c.repo_name}
|
|
|
%if hasattr(c,'file'):
|
|
|
· ${c.file.path or '/'}
|
|
|
%endif
|
|
|
</%block>
|
|
|
|
|
|
<%def name="breadcrumbs_links()">
|
|
|
${_('Files')}
|
|
|
%if c.file:
|
|
|
@ ${h.show_id(c.changeset)}
|
|
|
%endif
|
|
|
</%def>
|
|
|
|
|
|
<%block name="header_menu">
|
|
|
${self.menu('repositories')}
|
|
|
</%block>
|
|
|
|
|
|
<%def name="main()">
|
|
|
${self.repo_context_bar('files', c.revision)}
|
|
|
<div class="panel panel-primary">
|
|
|
<div class="panel-heading clearfix">
|
|
|
<div class="pull-left">
|
|
|
${self.breadcrumbs()}
|
|
|
</div>
|
|
|
<div class="pull-right">
|
|
|
${_("Branch filter:")} ${h.select('branch_selector',c.changeset.raw_id,c.revision_options)}
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="panel-body">
|
|
|
<div id="files_data">
|
|
|
<%include file='files_ypjax.html'/>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<script type="text/javascript">
|
|
|
var CACHE = {};
|
|
|
var CACHE_EXPIRE = 5*60*1000; //cache for 5*60s
|
|
|
//used to construct links from the search list
|
|
|
var _repo_files_url = ${h.jshtml(h.url("files_home",repo_name=c.repo_name,revision='',f_path='').replace('//', '/'))};
|
|
|
var url_base = ${h.js(h.url("files_home",repo_name=c.repo_name,revision='__REV__',f_path='__FPATH__'))};
|
|
|
//send the nodelist request to this url
|
|
|
var node_list_url = ${h.js(h.url("files_nodelist_home",repo_name=c.repo_name,revision='__REV__',f_path='__FPATH__'))};
|
|
|
|
|
|
## new pyroutes URLs
|
|
|
pyroutes.register('files_nodelist_home', ${h.js(h.url('files_nodelist_home', repo_name=c.repo_name,revision='%(revision)s',f_path='%(f_path)s'))}, ['revision', 'f_path']);
|
|
|
pyroutes.register('files_history_home', ${h.js(h.url('files_history_home', repo_name=c.repo_name,revision='%(revision)s',f_path='%(f_path)s'))}, ['revision', 'f_path']);
|
|
|
pyroutes.register('files_authors_home', ${h.js(h.url('files_authors_home', repo_name=c.repo_name,revision='%(revision)s',f_path='%(f_path)s'))}, ['revision', 'f_path']);
|
|
|
|
|
|
var ypjax_links = function(){
|
|
|
$('.ypjax-link').click(function(e){
|
|
|
|
|
|
//don't do ypjax on middle click
|
|
|
if (e.which == 2) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
var url = e.currentTarget.href;
|
|
|
|
|
|
//extract rev and the f_path from url.
|
|
|
var parts = url.split(_repo_files_url);
|
|
|
if (parts.length != 2) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var parts2 = parts[1].split('/');
|
|
|
var rev = parts2.shift(); // pop the first element which is the revision
|
|
|
var f_path = parts2.join('/');
|
|
|
|
|
|
//page title - make this consistent with title mako block above
|
|
|
var title = ${h.jshtml(_('%s Files') % c.repo_name)} + " \u00B7 " + (f_path || '/') + " \u00B7 " + ${h.jshtml(c.site_name)};
|
|
|
|
|
|
var _node_list_url = node_list_url.replace('__REV__',rev).replace('__FPATH__', f_path);
|
|
|
var _url_base = url_base.replace('__REV__',rev);
|
|
|
|
|
|
// Change our States and save some data for handling events
|
|
|
var state = {url:url, title:title, url_base:_url_base,
|
|
|
node_list_url:_node_list_url, rev:rev, f_path:f_path};
|
|
|
window.history.pushState(state, null, url);
|
|
|
load_state(state);
|
|
|
|
|
|
//now we're sure that we can do ypjax things
|
|
|
e.preventDefault();
|
|
|
return false;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
var load_state = function(state) {
|
|
|
var $files_data = $('#files_data');
|
|
|
var cache_key = state.url;
|
|
|
var _cache_obj = CACHE[cache_key];
|
|
|
var _cur_time = new Date().getTime();
|
|
|
if (_cache_obj !== undefined && _cache_obj[0] > _cur_time) {
|
|
|
$files_data.html(_cache_obj[1]);
|
|
|
$files_data.css('opacity', '1.0');
|
|
|
post_load_state(state);
|
|
|
} else {
|
|
|
asynchtml(state.url, $files_data, function() {
|
|
|
post_load_state(state);
|
|
|
var expire_on = new Date().getTime() + CACHE_EXPIRE;
|
|
|
CACHE[cache_key] = [expire_on, $files_data.html()];
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var post_load_state = function(state) {
|
|
|
ypjax_links();
|
|
|
tooltip_activate();
|
|
|
|
|
|
if(state !== undefined) {
|
|
|
document.title = state.title;
|
|
|
|
|
|
//initially loaded stuff
|
|
|
var _f_path = state.f_path;
|
|
|
var _rev = state.rev;
|
|
|
|
|
|
fileBrowserListeners(state.node_list_url, state.url_base);
|
|
|
// Inform Google Analytics of the change
|
|
|
if ( typeof window.pageTracker !== 'undefined' ) {
|
|
|
window.pageTracker._trackPageview(state.url);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function highlight_lines(lines){
|
|
|
for(pos in lines){
|
|
|
$('#L'+lines[pos]).css('background-color','#FFFFBE');
|
|
|
}
|
|
|
}
|
|
|
page_highlights = location.href.substring(location.href.indexOf('#')+1).split('L');
|
|
|
if (page_highlights.length == 2){
|
|
|
highlight_ranges = page_highlights[1].split(",");
|
|
|
|
|
|
var h_lines = [];
|
|
|
for (pos in highlight_ranges){
|
|
|
var _range = highlight_ranges[pos].split('-');
|
|
|
if(_range.length == 2){
|
|
|
var start = parseInt(_range[0]);
|
|
|
var end = parseInt(_range[1]);
|
|
|
if (start < end){
|
|
|
for(var i=start;i<=end;i++){
|
|
|
h_lines.push(i);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else{
|
|
|
h_lines.push(parseInt(highlight_ranges[pos]));
|
|
|
}
|
|
|
}
|
|
|
highlight_lines(h_lines);
|
|
|
$('#L'+h_lines[0]).each(function(){
|
|
|
this.scrollIntoView();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// select code link event
|
|
|
$('#hlcode').mouseup(getSelectionLink);
|
|
|
|
|
|
// history select field
|
|
|
var cache = {};
|
|
|
$('#diff1').prev('.select2-container').remove(); // Hack to handle repeated JS initialization on reused DOM
|
|
|
$("#diff1").select2({
|
|
|
placeholder: _TM['Select changeset'],
|
|
|
dropdownAutoWidth: true,
|
|
|
maxResults: 50,
|
|
|
query: function(query){
|
|
|
var key = 'cache';
|
|
|
var cached = cache[key] ;
|
|
|
if(cached) {
|
|
|
var data = {results: []};
|
|
|
var queryLower = query.term.toLowerCase();
|
|
|
//filter results
|
|
|
$.each(cached.results, function(){
|
|
|
var section = this.text;
|
|
|
var children = [];
|
|
|
$.each(this.children, function(){
|
|
|
if(children.length < 50 ?
|
|
|
((queryLower.length == 0) || (this.text.toLowerCase().indexOf(queryLower) >= 0)) :
|
|
|
((queryLower.length != 0) && (this.text.toLowerCase().indexOf(queryLower) == 0))) {
|
|
|
children.push(this);
|
|
|
}
|
|
|
});
|
|
|
children = branchSort(children, undefined, query)
|
|
|
data.results.push({'text': section, 'children': children});
|
|
|
});
|
|
|
//push the typed in changeset
|
|
|
data.results.push({'text':_TM['Specify changeset'],
|
|
|
'children': [{'id': query.term, 'text': query.term, 'type': 'rev'}]});
|
|
|
query.callback(data);
|
|
|
}else{
|
|
|
$.ajax({
|
|
|
url: pyroutes.url('files_history_home', {'revision': _rev, 'f_path': _f_path}),
|
|
|
data: {},
|
|
|
dataType: 'json',
|
|
|
type: 'GET',
|
|
|
success: function(data) {
|
|
|
cache[key] = data;
|
|
|
query.callback(data);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
$(document).ready(function(){
|
|
|
ypjax_links();
|
|
|
|
|
|
// Process history navigation event and load its state
|
|
|
window.addEventListener('popstate', function(e){
|
|
|
if (e.state)
|
|
|
load_state(e.state);
|
|
|
else
|
|
|
load_state(initial_state);
|
|
|
});
|
|
|
|
|
|
// init the search filter
|
|
|
var _node_list_url = node_list_url.replace('__REV__', ${h.js(c.changeset.raw_id)}).replace('__FPATH__', ${h.js(c.file.path)});
|
|
|
var _url_base = url_base.replace('__REV__', ${h.js(c.changeset.raw_id)});
|
|
|
fileBrowserListeners(_node_list_url, _url_base);
|
|
|
|
|
|
var initial_state = {url:window.location.href, title:document.title, url_base:_url_base,
|
|
|
node_list_url:_node_list_url, rev:${h.js(c.changeset.raw_id)}, f_path:${h.js(c.file.path)}};
|
|
|
|
|
|
// change branch filter
|
|
|
$("#branch_selector").select2({
|
|
|
dropdownAutoWidth: true,
|
|
|
maxResults: 50,
|
|
|
sortResults: branchSort
|
|
|
});
|
|
|
|
|
|
$("#branch_selector").change(function(e){
|
|
|
var selected = e.currentTarget.options[e.currentTarget.selectedIndex].value;
|
|
|
if(selected && selected != ${h.js(c.changeset.raw_id)}){
|
|
|
window.location = pyroutes.url('files_home', {'repo_name': ${h.js(c.repo_name)}, 'revision': selected, 'f_path': ${h.js(c.file.path)}});
|
|
|
$("#body").hide();
|
|
|
} else {
|
|
|
$("#branch_selector").val(${h.js(c.changeset.raw_id)});
|
|
|
}
|
|
|
});
|
|
|
$('#show_authors').on('click', function(){
|
|
|
$.ajax({
|
|
|
url: pyroutes.url('files_authors_home', {'revision': ${h.js(c.changeset.raw_id)}, 'f_path': ${h.js(c.file.path)}}),
|
|
|
success: function(data) {
|
|
|
$('#file_authors').html(data);
|
|
|
$('#file_authors').show();
|
|
|
tooltip_activate();
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
</script>
|
|
|
|
|
|
</%def>
|
|
|
|