Mercurial > kallithea
view kallithea/templates/files/files.html @ 7748:fd03ac0708cf
files: keep _repo_files_url as "global" const variable
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Sun, 30 Jun 2019 13:03:35 +0200 |
parents | 7135fd2db7c9 |
children | a512e843cd31 |
line wrap: on
line source
<%inherit file="/base/base.html"/> <%block name="title"> ${_('%s Files') % c.repo_name} %if hasattr(c,'file'): · ${h.safe_unicode(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 el = e.currentTarget; var url = el.href; //extract rev and the f_path from url. 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(h.safe_unicode(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(h.safe_unicode(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(h.safe_unicode(c.repo_name))}, 'revision': selected, 'f_path': ${h.js(h.safe_unicode(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(h.safe_unicode(c.file.path))}}), success: function(data) { $('#file_authors').html(data); $('#file_authors').show(); tooltip_activate(); } }); }); }); </script> </%def>