Mercurial > kallithea
view kallithea/templates/base/base.html @ 8984:55715fe0a8e1 stable
meta: update copyrights
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Fri, 31 Mar 2023 21:17:02 +0200 |
parents | d625696a5fb1 |
children |
line wrap: on
line source
## -*- coding: utf-8 -*- <%inherit file="root.html"/> <!-- CONTENT --> <div id="content" class="container-fluid"> ${self.flash_msg()} <div id="main"> ${next.main()} </div> </div> <!-- END CONTENT --> <!-- FOOTER --> <div 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–2023 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="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="repolabel(repo_type)"> %if repo_type == 'hg': <span class="label label-repo" title="${_('Mercurial repository')}">hg</span> %endif %if repo_type == 'git': <span class="label label-repo" 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="container-fluid"> <div class="navbar-header"> <div class="navbar-brand"> ${repolabel(c.db_repo.repo_type)} ## public/private %if c.db_repo.private: <i class="icon-lock"></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> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#context-pages" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> </div> <div id="context-pages" class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-right"> <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 == '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> <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.HasRepoPermissionLevel('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.HasRepoPermissionLevel('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> ## 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 request.authuser.username != 'default': <li> <a href="#" class="${'following' if c.repository_following else 'follow'}" onclick="return toggleFollowingRepo(this, ${c.db_repo.repo_id});"> <span class="show-follow"><i class="icon-heart-empty"></i>${_('Follow')}</span> <span class="show-following"><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-fork"></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> </ul> </div> </div> </nav> <script> 'use strict'; $(document).ready(function() { var bcache = {}; var branch_switcher_placeholder = '<i class="icon-exchange"></i>' + ${h.jshtml(_('Switch To'))} + ' <span class="caret"></span>'; $("#branch_switcher").select2({ placeholder: branch_switcher_placeholder, dropdownAutoWidth: true, sortResults: prefixFirstSort, formatResult: function(obj) { return obj.text.html_escape(); }, formatSelection: function(obj) { return obj.text.html_escape(); }, formatNoMatches: function() { return ${h.jshtml(_('No matches found'))}; }, escapeMarkup: function(m) { if (m == branch_switcher_placeholder) return branch_switcher_placeholder; 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': ${h.js(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': ${h.js(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 request.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 request.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-lock"></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 request.authuser.repositories_admin or request.authuser.repository_groups_admin or request.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')}" href=""> <i class="icon-gear"></i>${_('Admin')} </a> ${admin_menu_simple(request.authuser.repositories_admin, request.authuser.repository_groups_admin, request.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" href="#"> ${h.gravatar_div(request.authuser.email, size=20, div_class="icon")} %if request.authuser.username != 'default': <span class="menu_link_user">${request.authuser.username}</span> %else: <span>${_('Not Logged In')}</span> %endif <i class="caret"></i> </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 request.authuser.username == 'default' or request.authuser.user_id is None: ${h.form(h.url('login_home', came_from=request.path_qs), class_='form clearfix')} <h4 id="quick_login_h">${_('Login to Your Account')}</h4> <label> ${_('Username')}: ${h.text('username',class_='form-control')} </label> <label> ${_('Password')}: ${h.password('password',class_='form-control')} </label> <div class="password_forgotten"> ${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> ${h.end_form()} %else: <div class="pull-left"> ${h.gravatar_div(request.authuser.email, size=48, div_class="big_gravatar")} <b class="full_name">${request.authuser.full_name_or_username}</b> <div class="email">${request.authuser.email}</div> </div> <div id="quick_login_h" class="pull-right list-group text-right"> ${h.link_to(_('My Account'),h.url('my_account'),class_='list-group-item')} %if not request.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> 'use strict'; $(document).ready(function(){ var visual_show_public_icon = ${h.js(c.visual.show_public_icon)}; var cache = {} /*format the look of items in the list*/ function format(state){ if (!state.id){ return state.text.html_escape(); // 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="label label-repo" title="${_('Mercurial repository')}">hg</span> '; } else if(obj_dict['repo_type'] === 'git'){ tmpl += '<span class="label label-repo" title="${_('Git repository')}">git</span> '; } if(obj_dict['private']){ tmpl += '<i class="icon-lock"></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.html_escape(); return tmpl; } var repo_switcher_placeholder = '<i class="icon-database"></i>' + ${h.jshtml(_('Repositories'))} + ' <span class="caret"></span>'; $("#repo_switcher").select2({ placeholder: repo_switcher_placeholder, dropdownAutoWidth: true, sortResults: prefixFirstSort, formatResult: format, formatSelection: format, formatNoMatches: function(){ return ${h.jshtml(_('No matches found'))}; }, containerCssClass: "repo-switcher", dropdownCssClass: "repo-switcher-dropdown", escapeMarkup: function(m){ if (m == repo_switcher_placeholder) return repo_switcher_placeholder; 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.js(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> <%def name="parent_child_navigation()"> <div class="pull-left"> <div class="parent-child-link" data-ajax-url="${h.url('changeset_parents',repo_name=c.repo_name, revision=c.changeset.raw_id)}" data-linktype="parent" data-reponame="${c.repo_name}"> <i class="icon-left-open"></i><a href="#">${_('Parent rev.')}</a> </div> </div> <div class="pull-right"> <div class="parent-child-link" data-ajax-url="${h.url('changeset_children',repo_name=c.repo_name, revision=c.changeset.raw_id)}" data-linktype="child" data-reponame="${c.repo_name}"> <a href="#">${_('Child rev.')}</a><i class="icon-right-open"></i> </div> </div> <script> 'use strict'; $(document).ready(function(){ activate_parent_child_links(); }); </script> </%def>