Mercurial > kallithea
view kallithea/templates/base/base.html @ 6442:e9f0d8527a9b
template: avoid duplicate id="logo" - use "repo-logo" in the subordinate repo header
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Wed, 18 Jan 2017 01:44:26 +0100 |
parents | 3c96eb1865e2 |
children | 3dcf1f82311a |
line wrap: on
line source
## -*- coding: utf-8 -*- <%inherit file="root.html"/> <!-- CONTENT --> <div id="content"> ${self.flash_msg()} <div id="main"> ${next.main()} </div> </div> <!-- END CONTENT --> <!-- FOOTER --> <div id="footer" class="footer navbar navbar-inverse"> <span class="navbar-text pull-left"> ${_('Server instance: %s') % c.instance_id if c.instance_id else ''} </span> <span class="navbar-text pull-right"> This site is powered by %if c.visual.show_version: <a class="navbar-link" href="${h.url('kallithea_project_url')}" target="_blank">Kallithea</a> ${c.kallithea_version}, %else: <a class="navbar-link" href="${h.url('kallithea_project_url')}" target="_blank">Kallithea</a>, %endif which is <a class="navbar-link" href="${h.canonical_url('about')}#copyright">© 2010–2017 by various authors & licensed under GPLv3</a>. %if c.issues_url: – <a class="navbar-link" href="${c.issues_url}" target="_blank">${_('Support')}</a> %endif </span> </div> <!-- END FOOTER --> ### MAKO DEFS ### <%block name="branding_title"> %if c.site_name: · ${c.site_name} %endif </%block> <%def name="flash_msg()"> <%include file="/base/flash_msg.html"/> </%def> <%def name="breadcrumbs()"> <div class="breadcrumbs panel-title"> ${self.breadcrumbs_links()} </div> </%def> <%def name="admin_menu()"> <ul class="dropdown-menu" role="menu"> <li><a href="${h.url('admin_home')}"><i class="icon-book"></i> ${_('Admin Journal')}</a></li> <li><a href="${h.url('repos')}"><i class="icon-database"></i> ${_('Repositories')}</a></li> <li><a href="${h.url('repos_groups')}"><i class="icon-folder"></i> ${_('Repository Groups')}</a></li> <li><a href="${h.url('users')}"><i class="icon-user"></i> ${_('Users')}</a></li> <li><a href="${h.url('users_groups')}"><i class="icon-users"></i> ${_('User Groups')}</a></li> <li><a href="${h.url('admin_permissions')}"><i class="icon-block"></i> ${_('Default Permissions')}</a></li> <li><a href="${h.url('auth_home')}"><i class="icon-key"></i> ${_('Authentication')}</a></li> <li><a href="${h.url('defaults')}"><i class="icon-wrench"></i> ${_('Repository Defaults')}</a></li> <li class="last"><a href="${h.url('admin_settings')}"><i class="icon-gear"></i> ${_('Settings')}</a></li> </ul> </%def> ## admin menu used for people that have some admin resources <%def name="admin_menu_simple(repositories=None, repository_groups=None, user_groups=None)"> <ul class="dropdown-menu" role="menu"> %if repositories: <li><a href="${h.url('repos')}"><i class="icon-database"></i> ${_('Repositories')}</a></li> %endif %if repository_groups: <li><a href="${h.url('repos_groups')}"><i class="icon-folder"></i> ${_('Repository Groups')}</a></li> %endif %if user_groups: <li><a href="${h.url('users_groups')}"><i class="icon-users"></i> ${_('User Groups')}</a></li> %endif </ul> </%def> <%def name="repotag(repo)"> %if h.is_hg(repo): <span class="repotag" title="${_('Mercurial repository')}">hg</span> %endif %if h.is_git(repo): <span class="repotag" title="${_('Git repository')}">git</span> %endif </%def> <%def name="repo_context_bar(current=None, rev=None)"> <% rev = None if rev == 'tip' else rev %> <!--- CONTEXT BAR --> <nav id="context-bar" class="navbar navbar-inverse"> <div class="navbar-header"> <div class="navbar-brand"> ${repotag(c.db_repo)} ## public/private %if c.db_repo.private: <i class="icon-keyhole-circled"></i> %else: <i class="icon-globe"></i> %endif %for group in c.db_repo.groups_with_parents: ${h.link_to(group.name, url('repos_group_home', group_name=group.group_name), class_='navbar-link')} » %endfor ${h.link_to(c.db_repo.just_name, url('summary_home', repo_name=c.db_repo.repo_name), class_='navbar-link')} %if current == 'createfork': - ${_('Create Fork')} %endif </div> </div> <ul id="context-pages" class="nav navbar-nav navbar-right navbar-collapse collapse"> <li class="${'active' if current == 'summary' else ''}" data-context="summary"><a href="${h.url('summary_home', repo_name=c.repo_name)}"><i class="icon-doc-text"></i> ${_('Summary')}</a></li> %if rev: <li class="${'active' if current == 'changelog' else ''}" data-context="changelog"><a href="${h.url('changelog_file_home', repo_name=c.repo_name, revision=rev, f_path='')}"><i class="icon-clock"></i> ${_('Changelog')}</a></li> %else: <li class="${'active' if current == 'changelog' else ''}" data-context="changelog"><a href="${h.url('changelog_home', repo_name=c.repo_name)}"><i class="icon-clock"></i> ${_('Changelog')}</a></li> %endif <li class="${'active' if current == 'files' else ''}" data-context="files"><a href="${h.url('files_home', repo_name=c.repo_name, revision=rev or 'tip')}"><i class="icon-doc-inv"></i> ${_('Files')}</a></li> <li class="${'active' if current == 'switch-to' else ''}" data-context="switch-to"> <input id="branch_switcher" name="branch_switcher" type="hidden"> </li> <li class="${'active' if current == 'options' else ''} dropdown" data-context="options"> %if h.HasRepoPermissionAny('repository.admin')(c.repo_name): <a href="${h.url('edit_repo',repo_name=c.repo_name)}" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true"><i class="icon-wrench"></i> ${_('Options')} <i class="caret"></i></a> %else: <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true"><i class="icon-wrench"></i> ${_('Options')} <i class="caret"></i></a> %endif <ul class="dropdown-menu" role="menu" aria-hidden="true"> %if h.HasRepoPermissionAny('repository.admin')(c.repo_name): <li><a href="${h.url('edit_repo',repo_name=c.repo_name)}"><i class="icon-gear"></i> ${_('Settings')}</a></li> %endif %if c.db_repo.fork: <li><a href="${h.url('compare_url',repo_name=c.db_repo.fork.repo_name,org_ref_type=c.db_repo.landing_rev[0],org_ref_name=c.db_repo.landing_rev[1], other_repo=c.repo_name,other_ref_type='branch' if request.GET.get('branch') else c.db_repo.landing_rev[0],other_ref_name=request.GET.get('branch') or c.db_repo.landing_rev[1], merge=1)}"> <i class="icon-git-compare"></i> ${_('Compare Fork')}</a></li> %endif <li><a href="${h.url('compare_home',repo_name=c.repo_name)}"><i class="icon-git-compare"></i> ${_('Compare')}</a></li> <li><a href="${h.url('search_repo',repo_name=c.repo_name)}"><i class="icon-search"></i> ${_('Search')}</a></li> %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.db_repo.enable_locking: %if c.db_repo.locked[0]: <li><a href="${h.url('toggle_locking', repo_name=c.repo_name)}"><i class="icon-lock"></i> ${_('Unlock')}</a></li> %else: <li><a href="${h.url('toggle_locking', repo_name=c.repo_name)}"><i class="icon-lock-open-alt"></i> ${_('Lock')}</li> %endif %endif ## TODO: this check feels wrong, it would be better to have a check for permissions ## also it feels like a job for the controller %if c.authuser.username != 'default': <li> <a href="#" class="${'following' if c.repository_following else 'follow'}" onclick="toggleFollowingRepo(this, ${c.db_repo.repo_id});"> <span class="show-follow ${'hidden' if c.repository_following else ''}"><i class="icon-heart-empty"></i> ${_('Follow')}</span> <span class="show-following ${'' if c.repository_following else 'hidden'}"><i class="icon-heart"></i> ${_('Unfollow')}</span> </a> </li> <li><a href="${h.url('repo_fork_home',repo_name=c.repo_name)}"><i class="icon-git-pull-request"></i> ${_('Fork')}</a></li> <li><a href="${h.url('pullrequest_home',repo_name=c.repo_name)}"><i class="icon-git-pull-request"></i> ${_('Create Pull Request')}</a></li> %endif </ul> </li> <li class="${'active' if current == 'showpullrequest' else ''}" data-context="showpullrequest"> <a href="${h.url('pullrequest_show_all',repo_name=c.repo_name)}" title="${_('Show Pull Requests for %s') % c.repo_name}"> <i class="icon-git-pull-request"></i> ${_('Pull Requests')} %if c.repository_pull_requests: <span class="badge">${c.repository_pull_requests}</span> %endif </a> </li> </ul> </nav> <script type="text/javascript"> $(document).ready(function() { var bcache = {}; $("#branch_switcher").select2({ placeholder: '<span class="navbar-text"> <i class="icon-exchange"></i> ${_('Switch To')} <span class="caret"></span></span>', dropdownAutoWidth: true, sortResults: prefixFirstSort, formatResult: function(obj) { return obj.text; }, formatSelection: function(obj) { return obj.text; }, formatNoMatches: function(term) { return "${_('No matches found')}"; }, escapeMarkup: function(m) { // don't escape our custom placeholder if (m.substr(0, 25) == '<span class="navbar-text"') { return m; } return Select2.util.escapeMarkup(m); }, containerCssClass: "branch-switcher", dropdownCssClass: "repo-switcher-dropdown", query: function(query) { var key = 'cache'; var cached = bcache[key]; if (cached) { var data = { results: [] }; // filter results $.each(cached.results, function() { var section = this.text; var children = []; $.each(this.children, function() { if (query.term.length === 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) { children.push({ 'id': this.id, 'text': this.text, 'type': this.type, 'obj': this.obj }); } }); if (children.length !== 0) { data.results.push({ 'text': section, 'children': children }); } }); query.callback(data); } else { $.ajax({ url: pyroutes.url('repo_refs_data', { 'repo_name': '${c.repo_name}' }), data: {}, dataType: 'json', type: 'GET', success: function(data) { bcache[key] = data; query.callback(data); } }); } } }); $("#branch_switcher").on('select2-selecting', function(e) { e.preventDefault(); var context = $('#context-bar .active').data('context'); if (context == 'files') { window.location = pyroutes.url('files_home', { 'repo_name': REPO_NAME, 'revision': e.choice.id, 'f_path': '', 'at': e.choice.text }); } else if (context == 'changelog') { if (e.choice.type == 'tag' || e.choice.type == 'book') { $("#branch_filter").append($('<'+'option/>').val(e.choice.text)); } $("#branch_filter").val(e.choice.text).change(); } else { window.location = pyroutes.url('changelog_home', { 'repo_name': '${c.repo_name}', 'branch': e.choice.text }); } }); }); </script> <!--- END CONTEXT BAR --> </%def> <%def name="menu(current=None)"> <ul id="quick" class="nav navbar-nav navbar-right"> <!-- repo switcher --> <li class="${'active' if current == 'repositories' else ''}"> <input id="repo_switcher" name="repo_switcher" type="hidden"> </li> ##ROOT MENU %if c.authuser.username != 'default': <li class="${'active' if current == 'journal' else ''}"> <a class="menu_link" title="${_('Show recent activity')}" href="${h.url('journal')}"> <i class="icon-book"></i> ${_('Journal')} </a> </li> %else: <li class="${'active' if current == 'journal' else ''}"> <a class="menu_link" title="${_('Public journal')}" href="${h.url('public_journal')}"> <i class="icon-book"></i> ${_('Public journal')} </a> </li> %endif <li class="${'active' if current == 'gists' else ''} dropdown"> <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" title="${_('Show public gists')}" href="${h.url('gists')}"> <i class="icon-clippy"></i> ${_('Gists')} <span class="caret"></span> </a> <ul class="dropdown-menu" role="menu"> <li><a href="${h.url('new_gist', public=1)}"><i class="icon-paste"></i> ${_('Create New Gist')}</a></li> <li><a href="${h.url('gists')}"><i class="icon-globe"></i> ${_('All Public Gists')}</a></li> %if c.authuser.username != 'default': <li><a href="${h.url('gists', public=1)}"><i class="icon-user"></i> ${_('My Public Gists')}</a></li> <li><a href="${h.url('gists', private=1)}"><i class="icon-keyhole-circled"></i> ${_('My Private Gists')}</a></li> %endif </ul> </li> <li class="${'active' if current == 'search' else ''}"> <a class="menu_link" title="${_('Search in repositories')}" href="${h.url('search')}"> <i class="icon-search"></i> ${_('Search')} </a> </li> % if h.HasPermissionAny('hg.admin')('access admin main page'): <li class="${'active' if current == 'admin' else ''} dropdown"> <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" title="${_('Admin')}" href="${h.url('admin_home')}"> <i class="icon-gear"></i> ${_('Admin')} <span class="caret"></span> </a> ${admin_menu()} </li> % elif c.authuser.repositories_admin or c.authuser.repository_groups_admin or c.authuser.user_groups_admin: <li class="${'active' if current == 'admin' else ''} dropdown"> <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" title="${_('Admin')}"> <i class="icon-gear"></i> ${_('Admin')} </a> ${admin_menu_simple(c.authuser.repositories_admin, c.authuser.repository_groups_admin, c.authuser.user_groups_admin or h.HasPermissionAny('hg.usergroup.create.true')())} </li> % endif <li class="${'active' if current == 'my_pullrequests' else ''}"> <a class="menu_link" title="${_('My Pull Requests')}" href="${h.url('my_pullrequests')}"> <i class="icon-git-pull-request"></i> ${_('My Pull Requests')} %if c.my_pr_count != 0: <span class="badge">${c.my_pr_count}</span> %endif </a> </li> ## USER MENU <li class="dropdown"> <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" id="quick_login_link" aria-expanded="false" aria-controls="quick_login" %if c.authuser.username != 'default': href="${h.url('notifications')}" %else: href="#" %endif > ${h.gravatar_div(c.authuser.email, size=20, div_class="icon")} %if c.authuser.username != 'default': <span class="menu_link_user">${c.authuser.username}</span> %if c.unread_notifications != 0: <span class="badge">${c.unread_notifications}</span> %endif %else: <span>${_('Not Logged In')}</span> %endif </a> <div class="dropdown-menu user-menu" role="menu"> <div id="quick_login" role="form" aria-describedby="quick_login_h" aria-hidden="true" class="container-fluid"> %if c.authuser.username == 'default' or c.authuser.user_id is None: <h4 id="quick_login_h">${_('Login to Your Account')}</h4> ${h.form(h.url('login_home', came_from=request.path_qs))} <div class="form"> <div> <div> <div> <label for="username">${_('Username')}:</label> </div> <div> ${h.text('username',class_='form-control')} </div> </div> <div> <div> <label for="password">${_('Password')}:</label> </div> <div> ${h.password('password',class_='form-control')} </div> </div> <div class="buttons"> <div class="password_forgoten">${h.link_to(_('Forgot password ?'),h.url('reset_password'))}</div> <div class="register"> %if h.HasPermissionAny('hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')(): ${h.link_to(_("Don't have an account ?"),h.url('register'))} %endif </div> <div class="submit"> ${h.submit('sign_in',_('Log In'),class_="btn btn-default btn-xs")} </div> </div> </div> </div> ${h.end_form()} %else: <div class="pull-left"> ${h.gravatar_div(c.authuser.email, size=48, div_class="big_gravatar")} <b class="full_name">${c.authuser.full_name_or_username}</b> <div class="email">${c.authuser.email}</div> </div> <div id="quick_login_h" class="pull-right list-group text-right"> <a class="list-group-item" href="${h.url('notifications')}">${_('Notifications')}: ${c.unread_notifications}</a> ${h.link_to(_('My Account'),h.url('my_account'),class_='list-group-item')} %if not c.authuser.is_external_auth: ## Cannot log out if using external (container) authentication. ${h.link_to(_('Log Out'), h.url('logout_home'),class_='list-group-item')} %endif </div> %endif </div> </div> </li> </ul> <script type="text/javascript"> $(document).ready(function(){ var visual_show_public_icon = "${c.visual.show_public_icon}" == "True"; var cache = {} /*format the look of items in the list*/ var format = function(state){ if (!state.id){ return state.text; // optgroup } var obj_dict = state.obj; var tmpl = ''; if(obj_dict && state.type == 'repo'){ tmpl += '<span class="repo-icons">'; if(obj_dict['repo_type'] === 'hg'){ tmpl += '<span class="repotag">hg</span> '; } else if(obj_dict['repo_type'] === 'git'){ tmpl += '<span class="repotag">git</span> '; } if(obj_dict['private']){ tmpl += '<i class="icon-keyhole-circled"></i> '; } else if(visual_show_public_icon){ tmpl += '<i class="icon-globe"></i> '; } tmpl += '</span>'; } if(obj_dict && state.type == 'group'){ tmpl += '<i class="icon-folder"></i> '; } tmpl += state.text; return tmpl; } $("#repo_switcher").select2({ placeholder: '<span class="navbar-text"><i class="icon-database"></i> ${_('Repositories')} <span class="caret"></span></span>', dropdownAutoWidth: true, sortResults: prefixFirstSort, formatResult: format, formatSelection: format, formatNoMatches: function(term){ return "${_('No matches found')}"; }, containerCssClass: "repo-switcher", dropdownCssClass: "repo-switcher-dropdown", escapeMarkup: function(m){ // don't escape our custom placeholder if(m.substr(0,55) == '<span class="navbar-text"><i class="icon-database"></i>'){ return m; } return Select2.util.escapeMarkup(m); }, query: function(query){ var key = 'cache'; var cached = cache[key] ; if(cached) { var data = {results: []}; //filter results $.each(cached.results, function(){ var section = this.text; var children = []; $.each(this.children, function(){ if(query.term.length == 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0 ){ children.push({'id': this.id, 'text': this.text, 'type': this.type, 'obj': this.obj}); } }); if(children.length !== 0){ data.results.push({'text': section, 'children': children}); } }); query.callback(data); }else{ $.ajax({ url: "${h.url('repo_switcher_data')}", data: {}, dataType: 'json', type: 'GET', success: function(data) { cache[key] = data; query.callback({results: data.results}); } }); } } }); $("#repo_switcher").on('select2-selecting', function(e){ e.preventDefault(); window.location = pyroutes.url('summary_home', {'repo_name': e.val}); }); $(document).on('shown.bs.dropdown', function(event) { var dropdown = $(event.target); dropdown.attr('aria-expanded', true); dropdown.find('.dropdown-menu').attr('aria-hidden', false); }); $(document).on('hidden.bs.dropdown', function(event) { var dropdown = $(event.target); dropdown.attr('aria-expanded', false); dropdown.find('.dropdown-menu').attr('aria-hidden', true); }); }); </script> </%def>