##// END OF EJS Templates
ui: moved counter for PRs to last position as in style.
marcink -
r3767:97ee3f9f new-ui
parent child Browse files
Show More
@@ -1,974 +1,974 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%inherit file="root.mako"/>
2 <%inherit file="root.mako"/>
3
3
4 <%include file="/ejs_templates/templates.html"/>
4 <%include file="/ejs_templates/templates.html"/>
5
5
6 <div class="outerwrapper">
6 <div class="outerwrapper">
7 <!-- HEADER -->
7 <!-- HEADER -->
8 <div class="header">
8 <div class="header">
9 <div id="header-inner" class="wrapper">
9 <div id="header-inner" class="wrapper">
10 <div id="logo">
10 <div id="logo">
11 <div class="logo-wrapper">
11 <div class="logo-wrapper">
12 <a href="${h.route_path('home')}"><img src="${h.asset('images/rhodecode-logo-white-60x60.png')}" alt="RhodeCode"/></a>
12 <a href="${h.route_path('home')}"><img src="${h.asset('images/rhodecode-logo-white-60x60.png')}" alt="RhodeCode"/></a>
13 </div>
13 </div>
14 % if c.rhodecode_name:
14 % if c.rhodecode_name:
15 <div class="branding">
15 <div class="branding">
16 <a href="${h.route_path('home')}">${h.branding(c.rhodecode_name)}</a>
16 <a href="${h.route_path('home')}">${h.branding(c.rhodecode_name)}</a>
17 </div>
17 </div>
18 % endif
18 % endif
19 </div>
19 </div>
20 <!-- MENU BAR NAV -->
20 <!-- MENU BAR NAV -->
21 ${self.menu_bar_nav()}
21 ${self.menu_bar_nav()}
22 <!-- END MENU BAR NAV -->
22 <!-- END MENU BAR NAV -->
23 </div>
23 </div>
24 </div>
24 </div>
25 ${self.menu_bar_subnav()}
25 ${self.menu_bar_subnav()}
26 <!-- END HEADER -->
26 <!-- END HEADER -->
27
27
28 <!-- CONTENT -->
28 <!-- CONTENT -->
29 <div id="content" class="wrapper">
29 <div id="content" class="wrapper">
30
30
31 <rhodecode-toast id="notifications"></rhodecode-toast>
31 <rhodecode-toast id="notifications"></rhodecode-toast>
32
32
33 <div class="main">
33 <div class="main">
34 ${next.main()}
34 ${next.main()}
35 </div>
35 </div>
36 </div>
36 </div>
37 <!-- END CONTENT -->
37 <!-- END CONTENT -->
38
38
39 </div>
39 </div>
40 <!-- FOOTER -->
40 <!-- FOOTER -->
41 <div id="footer">
41 <div id="footer">
42 <div id="footer-inner" class="title wrapper">
42 <div id="footer-inner" class="title wrapper">
43 <div>
43 <div>
44 <p class="footer-link-right">
44 <p class="footer-link-right">
45 % if c.visual.show_version:
45 % if c.visual.show_version:
46 RhodeCode Enterprise ${c.rhodecode_version} ${c.rhodecode_edition}
46 RhodeCode Enterprise ${c.rhodecode_version} ${c.rhodecode_edition}
47 % endif
47 % endif
48 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
48 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
49 % if c.visual.rhodecode_support_url:
49 % if c.visual.rhodecode_support_url:
50 <a href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a>
50 <a href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a>
51 % endif
51 % endif
52 </p>
52 </p>
53 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
53 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
54 <p class="server-instance" style="display:${sid}">
54 <p class="server-instance" style="display:${sid}">
55 ## display hidden instance ID if specially defined
55 ## display hidden instance ID if specially defined
56 % if c.rhodecode_instanceid:
56 % if c.rhodecode_instanceid:
57 ${_('RhodeCode instance id: {}').format(c.rhodecode_instanceid)}
57 ${_('RhodeCode instance id: {}').format(c.rhodecode_instanceid)}
58 % endif
58 % endif
59 </p>
59 </p>
60 </div>
60 </div>
61 </div>
61 </div>
62 </div>
62 </div>
63
63
64 <!-- END FOOTER -->
64 <!-- END FOOTER -->
65
65
66 ### MAKO DEFS ###
66 ### MAKO DEFS ###
67
67
68 <%def name="menu_bar_subnav()">
68 <%def name="menu_bar_subnav()">
69 </%def>
69 </%def>
70
70
71 <%def name="breadcrumbs(class_='breadcrumbs')">
71 <%def name="breadcrumbs(class_='breadcrumbs')">
72 <div class="${class_}">
72 <div class="${class_}">
73 ${self.breadcrumbs_links()}
73 ${self.breadcrumbs_links()}
74 </div>
74 </div>
75 </%def>
75 </%def>
76
76
77 <%def name="admin_menu(active=None)">
77 <%def name="admin_menu(active=None)">
78 <%
78 <%
79 def is_active(selected):
79 def is_active(selected):
80 if selected == active:
80 if selected == active:
81 return "active"
81 return "active"
82 %>
82 %>
83
83
84 <div id="context-bar">
84 <div id="context-bar">
85 <div class="wrapper">
85 <div class="wrapper">
86 <div class="title">
86 <div class="title">
87 <div class="title-content">
87 <div class="title-content">
88 <div class="title-main">
88 <div class="title-main">
89 % if c.is_super_admin:
89 % if c.is_super_admin:
90 ${_('Super Admin Panel')}
90 ${_('Super Admin Panel')}
91 % else:
91 % else:
92 ${_('Delegated Admin Panel')}
92 ${_('Delegated Admin Panel')}
93 % endif
93 % endif
94 </div>
94 </div>
95 </div>
95 </div>
96 </div>
96 </div>
97
97
98 <ul id="context-pages" class="navigation horizontal-list">
98 <ul id="context-pages" class="navigation horizontal-list">
99
99
100 ## super admin case
100 ## super admin case
101 % if c.is_super_admin:
101 % if c.is_super_admin:
102 <li class="${is_active('audit_logs')}"><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
102 <li class="${is_active('audit_logs')}"><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
103 <li class="${is_active('repositories')}"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
103 <li class="${is_active('repositories')}"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
104 <li class="${is_active('repository_groups')}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
104 <li class="${is_active('repository_groups')}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
105 <li class="${is_active('users')}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
105 <li class="${is_active('users')}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
106 <li class="${is_active('user_groups')}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
106 <li class="${is_active('user_groups')}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
107 <li class="${is_active('permissions')}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
107 <li class="${is_active('permissions')}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
108 <li class="${is_active('authentication')}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
108 <li class="${is_active('authentication')}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
109 <li class="${is_active('integrations')}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
109 <li class="${is_active('integrations')}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
110 <li class="${is_active('defaults')}"><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
110 <li class="${is_active('defaults')}"><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
111 <li class="${is_active('settings')}"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
111 <li class="${is_active('settings')}"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
112
112
113 ## delegated admin
113 ## delegated admin
114 % elif c.is_delegated_admin:
114 % elif c.is_delegated_admin:
115 <%
115 <%
116 repositories=c.auth_user.repositories_admin or c.can_create_repo
116 repositories=c.auth_user.repositories_admin or c.can_create_repo
117 repository_groups=c.auth_user.repository_groups_admin or c.can_create_repo_group
117 repository_groups=c.auth_user.repository_groups_admin or c.can_create_repo_group
118 user_groups=c.auth_user.user_groups_admin or c.can_create_user_group
118 user_groups=c.auth_user.user_groups_admin or c.can_create_user_group
119 %>
119 %>
120
120
121 %if repositories:
121 %if repositories:
122 <li class="${is_active('repositories')} local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
122 <li class="${is_active('repositories')} local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
123 %endif
123 %endif
124 %if repository_groups:
124 %if repository_groups:
125 <li class="${is_active('repository_groups')} local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
125 <li class="${is_active('repository_groups')} local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
126 %endif
126 %endif
127 %if user_groups:
127 %if user_groups:
128 <li class="${is_active('user_groups')} local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
128 <li class="${is_active('user_groups')} local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
129 %endif
129 %endif
130 % endif
130 % endif
131 </ul>
131 </ul>
132
132
133 </div>
133 </div>
134 <div class="clear"></div>
134 <div class="clear"></div>
135 </div>
135 </div>
136 </%def>
136 </%def>
137
137
138 <%def name="dt_info_panel(elements)">
138 <%def name="dt_info_panel(elements)">
139 <dl class="dl-horizontal">
139 <dl class="dl-horizontal">
140 %for dt, dd, title, show_items in elements:
140 %for dt, dd, title, show_items in elements:
141 <dt>${dt}:</dt>
141 <dt>${dt}:</dt>
142 <dd title="${h.tooltip(title)}">
142 <dd title="${h.tooltip(title)}">
143 %if callable(dd):
143 %if callable(dd):
144 ## allow lazy evaluation of elements
144 ## allow lazy evaluation of elements
145 ${dd()}
145 ${dd()}
146 %else:
146 %else:
147 ${dd}
147 ${dd}
148 %endif
148 %endif
149 %if show_items:
149 %if show_items:
150 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
150 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
151 %endif
151 %endif
152 </dd>
152 </dd>
153
153
154 %if show_items:
154 %if show_items:
155 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
155 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
156 %for item in show_items:
156 %for item in show_items:
157 <dt></dt>
157 <dt></dt>
158 <dd>${item}</dd>
158 <dd>${item}</dd>
159 %endfor
159 %endfor
160 </div>
160 </div>
161 %endif
161 %endif
162
162
163 %endfor
163 %endfor
164 </dl>
164 </dl>
165 </%def>
165 </%def>
166
166
167 <%def name="gravatar(email, size=16)">
167 <%def name="gravatar(email, size=16)">
168 <%
168 <%
169 if (size > 16):
169 if (size > 16):
170 gravatar_class = 'gravatar gravatar-large'
170 gravatar_class = 'gravatar gravatar-large'
171 else:
171 else:
172 gravatar_class = 'gravatar'
172 gravatar_class = 'gravatar'
173 %>
173 %>
174 <%doc>
174 <%doc>
175 TODO: johbo: For now we serve double size images to make it smooth
175 TODO: johbo: For now we serve double size images to make it smooth
176 for retina. This is how it worked until now. Should be replaced
176 for retina. This is how it worked until now. Should be replaced
177 with a better solution at some point.
177 with a better solution at some point.
178 </%doc>
178 </%doc>
179 <img class="${gravatar_class}" src="${h.gravatar_url(email, size * 2)}" height="${size}" width="${size}">
179 <img class="${gravatar_class}" src="${h.gravatar_url(email, size * 2)}" height="${size}" width="${size}">
180 </%def>
180 </%def>
181
181
182
182
183 <%def name="gravatar_with_user(contact, size=16, show_disabled=False)">
183 <%def name="gravatar_with_user(contact, size=16, show_disabled=False)">
184 <% email = h.email_or_none(contact) %>
184 <% email = h.email_or_none(contact) %>
185 <div class="rc-user tooltip" title="${h.tooltip(h.author_string(email))}">
185 <div class="rc-user tooltip" title="${h.tooltip(h.author_string(email))}">
186 ${self.gravatar(email, size)}
186 ${self.gravatar(email, size)}
187 <span class="${'user user-disabled' if show_disabled else 'user'}"> ${h.link_to_user(contact)}</span>
187 <span class="${'user user-disabled' if show_disabled else 'user'}"> ${h.link_to_user(contact)}</span>
188 </div>
188 </div>
189 </%def>
189 </%def>
190
190
191
191
192 <%def name="repo_page_title(repo_instance)">
192 <%def name="repo_page_title(repo_instance)">
193 <div class="title-content repo-title">
193 <div class="title-content repo-title">
194
194
195 <div class="title-main">
195 <div class="title-main">
196 ## SVN/HG/GIT icons
196 ## SVN/HG/GIT icons
197 %if h.is_hg(repo_instance):
197 %if h.is_hg(repo_instance):
198 <i class="icon-hg"></i>
198 <i class="icon-hg"></i>
199 %endif
199 %endif
200 %if h.is_git(repo_instance):
200 %if h.is_git(repo_instance):
201 <i class="icon-git"></i>
201 <i class="icon-git"></i>
202 %endif
202 %endif
203 %if h.is_svn(repo_instance):
203 %if h.is_svn(repo_instance):
204 <i class="icon-svn"></i>
204 <i class="icon-svn"></i>
205 %endif
205 %endif
206
206
207 ## public/private
207 ## public/private
208 %if repo_instance.private:
208 %if repo_instance.private:
209 <i class="icon-repo-private"></i>
209 <i class="icon-repo-private"></i>
210 %else:
210 %else:
211 <i class="icon-repo-public"></i>
211 <i class="icon-repo-public"></i>
212 %endif
212 %endif
213
213
214 ## repo name with group name
214 ## repo name with group name
215 ${h.breadcrumb_repo_link(repo_instance)}
215 ${h.breadcrumb_repo_link(repo_instance)}
216
216
217 ## Context Actions
217 ## Context Actions
218 <div class="pull-right">
218 <div class="pull-right">
219 %if c.rhodecode_user.username != h.DEFAULT_USER:
219 %if c.rhodecode_user.username != h.DEFAULT_USER:
220 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_name, _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
220 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_name, _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
221
221
222 <a href="#WatchRepo" onclick="toggleFollowingRepo(this, templateContext.repo_id); return false" title="${_('Watch this Repository and actions on it in your personalized journal')}" class="btn btn-sm ${('watching' if c.repository_is_user_following else '')}">
222 <a href="#WatchRepo" onclick="toggleFollowingRepo(this, templateContext.repo_id); return false" title="${_('Watch this Repository and actions on it in your personalized journal')}" class="btn btn-sm ${('watching' if c.repository_is_user_following else '')}">
223 % if c.repository_is_user_following:
223 % if c.repository_is_user_following:
224 <i class="icon-eye-off"></i>${_('Unwatch')}
224 <i class="icon-eye-off"></i>${_('Unwatch')}
225 % else:
225 % else:
226 <i class="icon-eye"></i>${_('Watch')}
226 <i class="icon-eye"></i>${_('Watch')}
227 % endif
227 % endif
228
228
229 </a>
229 </a>
230 %else:
230 %else:
231 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_name)}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
231 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_name)}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
232 %endif
232 %endif
233 </div>
233 </div>
234
234
235 </div>
235 </div>
236
236
237 ## FORKED
237 ## FORKED
238 %if repo_instance.fork:
238 %if repo_instance.fork:
239 <p class="discreet">
239 <p class="discreet">
240 <i class="icon-code-fork"></i> ${_('Fork of')}
240 <i class="icon-code-fork"></i> ${_('Fork of')}
241 ${h.link_to_if(c.has_origin_repo_read_perm,repo_instance.fork.repo_name, h.route_path('repo_summary', repo_name=repo_instance.fork.repo_name))}
241 ${h.link_to_if(c.has_origin_repo_read_perm,repo_instance.fork.repo_name, h.route_path('repo_summary', repo_name=repo_instance.fork.repo_name))}
242 </p>
242 </p>
243 %endif
243 %endif
244
244
245 ## IMPORTED FROM REMOTE
245 ## IMPORTED FROM REMOTE
246 %if repo_instance.clone_uri:
246 %if repo_instance.clone_uri:
247 <p class="discreet">
247 <p class="discreet">
248 <i class="icon-code-fork"></i> ${_('Clone from')}
248 <i class="icon-code-fork"></i> ${_('Clone from')}
249 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
249 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
250 </p>
250 </p>
251 %endif
251 %endif
252
252
253 ## LOCKING STATUS
253 ## LOCKING STATUS
254 %if repo_instance.locked[0]:
254 %if repo_instance.locked[0]:
255 <p class="locking_locked discreet">
255 <p class="locking_locked discreet">
256 <i class="icon-repo-lock"></i>
256 <i class="icon-repo-lock"></i>
257 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
257 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
258 </p>
258 </p>
259 %elif repo_instance.enable_locking:
259 %elif repo_instance.enable_locking:
260 <p class="locking_unlocked discreet">
260 <p class="locking_unlocked discreet">
261 <i class="icon-repo-unlock"></i>
261 <i class="icon-repo-unlock"></i>
262 ${_('Repository not locked. Pull repository to lock it.')}
262 ${_('Repository not locked. Pull repository to lock it.')}
263 </p>
263 </p>
264 %endif
264 %endif
265
265
266 </div>
266 </div>
267 </%def>
267 </%def>
268
268
269 <%def name="repo_menu(active=None)">
269 <%def name="repo_menu(active=None)">
270 <%
270 <%
271 def is_active(selected):
271 def is_active(selected):
272 if selected == active:
272 if selected == active:
273 return "active"
273 return "active"
274 %>
274 %>
275 % if c.rhodecode_db_repo.archived:
275 % if c.rhodecode_db_repo.archived:
276 <div class="alert alert-warning text-center">
276 <div class="alert alert-warning text-center">
277 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
277 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
278 </div>
278 </div>
279 % endif
279 % endif
280
280
281 <!--- REPO CONTEXT BAR -->
281 <!--- REPO CONTEXT BAR -->
282 <div id="context-bar">
282 <div id="context-bar">
283 <div class="wrapper">
283 <div class="wrapper">
284
284
285 <div class="title">
285 <div class="title">
286 ${self.repo_page_title(c.rhodecode_db_repo)}
286 ${self.repo_page_title(c.rhodecode_db_repo)}
287 </div>
287 </div>
288
288
289 <ul id="context-pages" class="navigation horizontal-list">
289 <ul id="context-pages" class="navigation horizontal-list">
290 <li class="${is_active('summary')}"><a class="menulink" href="${h.route_path('repo_summary', repo_name=c.repo_name)}"><div class="menulabel">${_('Summary')}</div></a></li>
290 <li class="${is_active('summary')}"><a class="menulink" href="${h.route_path('repo_summary', repo_name=c.repo_name)}"><div class="menulabel">${_('Summary')}</div></a></li>
291 <li class="${is_active('commits')}"><a class="menulink" href="${h.route_path('repo_commits', repo_name=c.repo_name)}"><div class="menulabel">${_('Commits')}</div></a></li>
291 <li class="${is_active('commits')}"><a class="menulink" href="${h.route_path('repo_commits', repo_name=c.repo_name)}"><div class="menulabel">${_('Commits')}</div></a></li>
292 <li class="${is_active('files')}"><a class="menulink" href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.rhodecode_db_repo.landing_rev[1], f_path='')}"><div class="menulabel">${_('Files')}</div></a></li>
292 <li class="${is_active('files')}"><a class="menulink" href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.rhodecode_db_repo.landing_rev[1], f_path='')}"><div class="menulabel">${_('Files')}</div></a></li>
293 <li class="${is_active('compare')}"><a class="menulink" href="${h.route_path('repo_compare_select',repo_name=c.repo_name)}"><div class="menulabel">${_('Compare')}</div></a></li>
293 <li class="${is_active('compare')}"><a class="menulink" href="${h.route_path('repo_compare_select',repo_name=c.repo_name)}"><div class="menulabel">${_('Compare')}</div></a></li>
294
294
295 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
295 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
296 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
296 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
297 <li class="${is_active('showpullrequest')}">
297 <li class="${is_active('showpullrequest')}">
298 <a class="menulink" href="${h.route_path('pullrequest_show_all', repo_name=c.repo_name)}" title="${h.tooltip(_('Show Pull Requests for %s') % c.repo_name)}">
298 <a class="menulink" href="${h.route_path('pullrequest_show_all', repo_name=c.repo_name)}" title="${h.tooltip(_('Show Pull Requests for %s') % c.repo_name)}">
299 <div class="menulabel">
299 <div class="menulabel">
300 %if c.repository_pull_requests == 1:
300 %if c.repository_pull_requests == 1:
301 ${c.repository_pull_requests} ${_('Pull Request')}
301 ${_('Pull Request')} ${c.repository_pull_requests}
302 %else:
302 %else:
303 ${c.repository_pull_requests} ${_('Pull Requests')}
303 ${_('Pull Requests')} ${c.repository_pull_requests}
304 %endif
304 %endif
305 </div>
305 </div>
306 </a>
306 </a>
307 </li>
307 </li>
308 %endif
308 %endif
309
309
310 <li class="${is_active('artifacts')}"><a class="menulink" href="${h.route_path('repo_artifacts_list',repo_name=c.repo_name)}"><div class="menulabel">${_('Artifacts')} (BETA)</div></a></li>
310 <li class="${is_active('artifacts')}"><a class="menulink" href="${h.route_path('repo_artifacts_list',repo_name=c.repo_name)}"><div class="menulabel">${_('Artifacts')} (BETA)</div></a></li>
311
311
312 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
312 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
313 <li class="${is_active('settings')}"><a class="menulink" href="${h.route_path('edit_repo',repo_name=c.repo_name)}"><div class="menulabel">${_('Repository Settings')}</div></a></li>
313 <li class="${is_active('settings')}"><a class="menulink" href="${h.route_path('edit_repo',repo_name=c.repo_name)}"><div class="menulabel">${_('Repository Settings')}</div></a></li>
314 %endif
314 %endif
315
315
316 ## determine if we have "any" option available
316 ## determine if we have "any" option available
317 <%
317 <%
318 can_lock = h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking
318 can_lock = h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking
319 has_actions = (c.rhodecode_user.username != h.DEFAULT_USER and c.rhodecode_db_repo.repo_type in ['git','hg'] ) or can_lock
319 has_actions = (c.rhodecode_user.username != h.DEFAULT_USER and c.rhodecode_db_repo.repo_type in ['git','hg'] ) or can_lock
320 %>
320 %>
321 <li class="${is_active('options')}">
321 <li class="${is_active('options')}">
322 % if has_actions:
322 % if has_actions:
323 <a class="menulink dropdown">
323 <a class="menulink dropdown">
324 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
324 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
325 </a>
325 </a>
326 <ul class="submenu">
326 <ul class="submenu">
327 <li><a href="${h.route_path('repo_fork_new',repo_name=c.repo_name)}">${_('Fork this repository')}</a></li>
327 <li><a href="${h.route_path('repo_fork_new',repo_name=c.repo_name)}">${_('Fork this repository')}</a></li>
328 <li><a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a></li>
328 <li><a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a></li>
329 %if can_lock:
329 %if can_lock:
330 %if c.rhodecode_db_repo.locked[0]:
330 %if c.rhodecode_db_repo.locked[0]:
331 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock Repository')}</a></li>
331 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock Repository')}</a></li>
332 %else:
332 %else:
333 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock Repository')}</a></li>
333 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock Repository')}</a></li>
334 %endif
334 %endif
335 %endif
335 %endif
336 </ul>
336 </ul>
337 % else:
337 % else:
338 <a class="menulink disabled">
338 <a class="menulink disabled">
339 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
339 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
340 </a>
340 </a>
341 % endif
341 % endif
342 </li>
342 </li>
343
343
344 </ul>
344 </ul>
345 </div>
345 </div>
346 <div class="clear"></div>
346 <div class="clear"></div>
347 </div>
347 </div>
348
348
349 <!--- REPO END CONTEXT BAR -->
349 <!--- REPO END CONTEXT BAR -->
350
350
351 </%def>
351 </%def>
352
352
353 <%def name="repo_group_page_title(repo_group_instance)">
353 <%def name="repo_group_page_title(repo_group_instance)">
354 <div class="title-content">
354 <div class="title-content">
355 <div class="title-main">
355 <div class="title-main">
356 ## Repository Group icon
356 ## Repository Group icon
357 <i class="icon-repo-group"></i>
357 <i class="icon-repo-group"></i>
358
358
359 ## repo name with group name
359 ## repo name with group name
360 ${h.breadcrumb_repo_group_link(repo_group_instance)}
360 ${h.breadcrumb_repo_group_link(repo_group_instance)}
361 </div>
361 </div>
362
362
363 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
363 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
364 <div class="repo-group-desc discreet">
364 <div class="repo-group-desc discreet">
365 ${dt.repo_group_desc(repo_group_instance.description_safe, repo_group_instance.personal, c.visual.stylify_metatags)}
365 ${dt.repo_group_desc(repo_group_instance.description_safe, repo_group_instance.personal, c.visual.stylify_metatags)}
366 </div>
366 </div>
367
367
368 </div>
368 </div>
369 </%def>
369 </%def>
370
370
371 <%def name="repo_group_menu(active=None)">
371 <%def name="repo_group_menu(active=None)">
372 <%
372 <%
373 def is_active(selected):
373 def is_active(selected):
374 if selected == active:
374 if selected == active:
375 return "active"
375 return "active"
376
376
377 gr_name = c.repo_group.group_name if c.repo_group else None
377 gr_name = c.repo_group.group_name if c.repo_group else None
378 # create repositories with write permission on group is set to true
378 # create repositories with write permission on group is set to true
379 create_on_write = h.HasPermissionAny('hg.create.write_on_repogroup.true')()
379 create_on_write = h.HasPermissionAny('hg.create.write_on_repogroup.true')()
380 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
380 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
381 group_write = h.HasRepoGroupPermissionAny('group.write')(gr_name, 'can write into group index page')
381 group_write = h.HasRepoGroupPermissionAny('group.write')(gr_name, 'can write into group index page')
382
382
383 %>
383 %>
384
384
385 <!--- REPO GROUP CONTEXT BAR -->
385 <!--- REPO GROUP CONTEXT BAR -->
386 <div id="context-bar">
386 <div id="context-bar">
387 <div class="wrapper">
387 <div class="wrapper">
388 <div class="title">
388 <div class="title">
389 ${self.repo_group_page_title(c.repo_group)}
389 ${self.repo_group_page_title(c.repo_group)}
390 </div>
390 </div>
391
391
392 <ul id="context-pages" class="navigation horizontal-list">
392 <ul id="context-pages" class="navigation horizontal-list">
393 <li class="${is_active('home')}"><a class="menulink" href="${h.route_path('repo_group_home', repo_group_name=c.repo_group.group_name)}"><div class="menulabel">${_('Group Home')}</div></a></li>
393 <li class="${is_active('home')}"><a class="menulink" href="${h.route_path('repo_group_home', repo_group_name=c.repo_group.group_name)}"><div class="menulabel">${_('Group Home')}</div></a></li>
394 % if c.is_super_admin or group_admin:
394 % if c.is_super_admin or group_admin:
395 <li class="${is_active('settings')}"><a class="menulink" href="${h.route_path('edit_repo_group',repo_group_name=c.repo_group.group_name)}" title="${_('You have admin right to this group, and can edit it')}"><div class="menulabel">${_('Group Settings')}</div></a></li>
395 <li class="${is_active('settings')}"><a class="menulink" href="${h.route_path('edit_repo_group',repo_group_name=c.repo_group.group_name)}" title="${_('You have admin right to this group, and can edit it')}"><div class="menulabel">${_('Group Settings')}</div></a></li>
396 % endif
396 % endif
397 ## determine if we have "any" option available
397 ## determine if we have "any" option available
398 <%
398 <%
399 can_create_repos = c.is_super_admin or group_admin or (group_write and create_on_write)
399 can_create_repos = c.is_super_admin or group_admin or (group_write and create_on_write)
400 can_create_repo_groups = c.is_super_admin or group_admin
400 can_create_repo_groups = c.is_super_admin or group_admin
401 has_actions = can_create_repos or can_create_repo_groups
401 has_actions = can_create_repos or can_create_repo_groups
402 %>
402 %>
403 <li class="${is_active('options')}">
403 <li class="${is_active('options')}">
404 % if has_actions:
404 % if has_actions:
405 <a class="menulink dropdown">
405 <a class="menulink dropdown">
406 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
406 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
407 </a>
407 </a>
408 <ul class="submenu">
408 <ul class="submenu">
409 %if can_create_repos:
409 %if can_create_repos:
410 <li><a href="${h.route_path('repo_new',_query=dict(parent_group=c.repo_group.group_id))}">${_('Add Repository')}</a></li>
410 <li><a href="${h.route_path('repo_new',_query=dict(parent_group=c.repo_group.group_id))}">${_('Add Repository')}</a></li>
411 %endif
411 %endif
412 %if can_create_repo_groups:
412 %if can_create_repo_groups:
413 <li><a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.repo_group.group_id))}">${_(u'Add Repository Group')}</a></li>
413 <li><a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.repo_group.group_id))}">${_(u'Add Repository Group')}</a></li>
414 %endif
414 %endif
415 </ul>
415 </ul>
416 % else:
416 % else:
417 <a class="menulink disabled">
417 <a class="menulink disabled">
418 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
418 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
419 </a>
419 </a>
420 % endif
420 % endif
421 </li>
421 </li>
422 </ul>
422 </ul>
423 </div>
423 </div>
424 <div class="clear"></div>
424 <div class="clear"></div>
425 </div>
425 </div>
426
426
427 <!--- REPO GROUP CONTEXT BAR -->
427 <!--- REPO GROUP CONTEXT BAR -->
428
428
429 </%def>
429 </%def>
430
430
431
431
432 <%def name="usermenu(active=False)">
432 <%def name="usermenu(active=False)">
433 ## USER MENU
433 ## USER MENU
434 <li id="quick_login_li" class="${'active' if active else ''}">
434 <li id="quick_login_li" class="${'active' if active else ''}">
435 % if c.rhodecode_user.username == h.DEFAULT_USER:
435 % if c.rhodecode_user.username == h.DEFAULT_USER:
436 <a id="quick_login_link" class="menulink childs" href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">
436 <a id="quick_login_link" class="menulink childs" href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">
437 ${gravatar(c.rhodecode_user.email, 20)}
437 ${gravatar(c.rhodecode_user.email, 20)}
438 <span class="user">
438 <span class="user">
439 <span>${_('Sign in')}</span>
439 <span>${_('Sign in')}</span>
440 </span>
440 </span>
441 </a>
441 </a>
442 % else:
442 % else:
443 ## logged in user
443 ## logged in user
444 <a id="quick_login_link" class="menulink childs">
444 <a id="quick_login_link" class="menulink childs">
445 ${gravatar(c.rhodecode_user.email, 20)}
445 ${gravatar(c.rhodecode_user.email, 20)}
446 <span class="user">
446 <span class="user">
447 <span class="menu_link_user">${c.rhodecode_user.username}</span>
447 <span class="menu_link_user">${c.rhodecode_user.username}</span>
448 <div class="show_more"></div>
448 <div class="show_more"></div>
449 </span>
449 </span>
450 </a>
450 </a>
451 ## subnav with menu for logged in user
451 ## subnav with menu for logged in user
452 <div class="user-menu submenu">
452 <div class="user-menu submenu">
453 <div id="quick_login">
453 <div id="quick_login">
454 %if c.rhodecode_user.username != h.DEFAULT_USER:
454 %if c.rhodecode_user.username != h.DEFAULT_USER:
455 <div class="">
455 <div class="">
456 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
456 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
457 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
457 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
458 <div class="email">${c.rhodecode_user.email}</div>
458 <div class="email">${c.rhodecode_user.email}</div>
459 </div>
459 </div>
460 <div class="">
460 <div class="">
461 <ol class="links">
461 <ol class="links">
462 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
462 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
463 % if c.rhodecode_user.personal_repo_group:
463 % if c.rhodecode_user.personal_repo_group:
464 <li>${h.link_to(_(u'My personal group'), h.route_path('repo_group_home', repo_group_name=c.rhodecode_user.personal_repo_group.group_name))}</li>
464 <li>${h.link_to(_(u'My personal group'), h.route_path('repo_group_home', repo_group_name=c.rhodecode_user.personal_repo_group.group_name))}</li>
465 % endif
465 % endif
466 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
466 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
467 ## bookmark-items
467 ## bookmark-items
468 <li class="bookmark-items">
468 <li class="bookmark-items">
469 ${_('Bookmarks')}
469 ${_('Bookmarks')}
470 <div class="pull-right">
470 <div class="pull-right">
471 <a href="${h.route_path('my_account_bookmarks')}">${_('Manage')}</a>
471 <a href="${h.route_path('my_account_bookmarks')}">${_('Manage')}</a>
472 </div>
472 </div>
473 </li>
473 </li>
474 % if not c.bookmark_items:
474 % if not c.bookmark_items:
475 <li>
475 <li>
476 <a href="${h.route_path('my_account_bookmarks')}">${_('No Bookmarks yet.')}</a>
476 <a href="${h.route_path('my_account_bookmarks')}">${_('No Bookmarks yet.')}</a>
477 </li>
477 </li>
478 % endif
478 % endif
479 % for item in c.bookmark_items:
479 % for item in c.bookmark_items:
480 <li>
480 <li>
481 % if item.repository:
481 % if item.repository:
482 <div>
482 <div>
483 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
483 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
484 <code>${item.position}</code>
484 <code>${item.position}</code>
485 % if item.repository.repo_type == 'hg':
485 % if item.repository.repo_type == 'hg':
486 <i class="icon-hg" title="${_('Repository')}" style="font-size: 16px"></i>
486 <i class="icon-hg" title="${_('Repository')}" style="font-size: 16px"></i>
487 % elif item.repository.repo_type == 'git':
487 % elif item.repository.repo_type == 'git':
488 <i class="icon-git" title="${_('Repository')}" style="font-size: 16px"></i>
488 <i class="icon-git" title="${_('Repository')}" style="font-size: 16px"></i>
489 % elif item.repository.repo_type == 'svn':
489 % elif item.repository.repo_type == 'svn':
490 <i class="icon-svn" title="${_('Repository')}" style="font-size: 16px"></i>
490 <i class="icon-svn" title="${_('Repository')}" style="font-size: 16px"></i>
491 % endif
491 % endif
492 ${(item.title or h.shorter(item.repository.repo_name, 30))}
492 ${(item.title or h.shorter(item.repository.repo_name, 30))}
493 </a>
493 </a>
494 </div>
494 </div>
495 % elif item.repository_group:
495 % elif item.repository_group:
496 <div>
496 <div>
497 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
497 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
498 <code>${item.position}</code>
498 <code>${item.position}</code>
499 <i class="icon-repo-group" title="${_('Repository group')}" style="font-size: 14px"></i>
499 <i class="icon-repo-group" title="${_('Repository group')}" style="font-size: 14px"></i>
500 ${(item.title or h.shorter(item.repository_group.group_name, 30))}
500 ${(item.title or h.shorter(item.repository_group.group_name, 30))}
501 </a>
501 </a>
502 </div>
502 </div>
503 % else:
503 % else:
504 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
504 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
505 <code>${item.position}</code>
505 <code>${item.position}</code>
506 ${item.title}
506 ${item.title}
507 </a>
507 </a>
508 % endif
508 % endif
509 </li>
509 </li>
510 % endfor
510 % endfor
511
511
512 <li class="logout">
512 <li class="logout">
513 ${h.secure_form(h.route_path('logout'), request=request)}
513 ${h.secure_form(h.route_path('logout'), request=request)}
514 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
514 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
515 ${h.end_form()}
515 ${h.end_form()}
516 </li>
516 </li>
517 </ol>
517 </ol>
518 </div>
518 </div>
519 %endif
519 %endif
520 </div>
520 </div>
521 </div>
521 </div>
522 ## unread counter
522 ## unread counter
523 <div class="pill_container">
523 <div class="pill_container">
524 <a class="menu_link_notifications ${'empty' if c.unread_notifications == 0 else ''}" href="${h.route_path('notifications_show_all')}">${c.unread_notifications}</a>
524 <a class="menu_link_notifications ${'empty' if c.unread_notifications == 0 else ''}" href="${h.route_path('notifications_show_all')}">${c.unread_notifications}</a>
525 </div>
525 </div>
526 % endif
526 % endif
527 </li>
527 </li>
528 </%def>
528 </%def>
529
529
530 <%def name="menu_items(active=None)">
530 <%def name="menu_items(active=None)">
531 <%
531 <%
532 def is_active(selected):
532 def is_active(selected):
533 if selected == active:
533 if selected == active:
534 return "active"
534 return "active"
535 return ""
535 return ""
536 %>
536 %>
537
537
538 <ul id="quick" class="main_nav navigation horizontal-list">
538 <ul id="quick" class="main_nav navigation horizontal-list">
539 ## notice box for important system messages
539 ## notice box for important system messages
540 <li style="display: none">
540 <li style="display: none">
541 <a class="notice-box" href="#openNotice" onclick="showNoticeBox(); return false">
541 <a class="notice-box" href="#openNotice" onclick="showNoticeBox(); return false">
542 <div class="menulabel-notice" >
542 <div class="menulabel-notice" >
543 0
543 0
544 </div>
544 </div>
545 </a>
545 </a>
546 </li>
546 </li>
547
547
548 ## Main filter
548 ## Main filter
549 <li>
549 <li>
550 <div class="menulabel main_filter_box">
550 <div class="menulabel main_filter_box">
551 <div class="main_filter_input_box">
551 <div class="main_filter_input_box">
552 <ul class="searchItems">
552 <ul class="searchItems">
553
553
554 % if c.template_context['search_context']['repo_id']:
554 % if c.template_context['search_context']['repo_id']:
555 <li class="searchTag searchTagFilter searchTagHidable" >
555 <li class="searchTag searchTagFilter searchTagHidable" >
556 ##<a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">
556 ##<a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">
557 <span class="tag">
557 <span class="tag">
558 This repo
558 This repo
559 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
559 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
560 </span>
560 </span>
561 ##</a>
561 ##</a>
562 </li>
562 </li>
563 % elif c.template_context['search_context']['repo_group_id']:
563 % elif c.template_context['search_context']['repo_group_id']:
564 <li class="searchTag searchTagFilter searchTagHidable">
564 <li class="searchTag searchTagFilter searchTagHidable">
565 ##<a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">
565 ##<a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">
566 <span class="tag">
566 <span class="tag">
567 This group
567 This group
568 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
568 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
569 </span>
569 </span>
570 ##</a>
570 ##</a>
571 </li>
571 </li>
572 % endif
572 % endif
573
573
574 <li class="searchTagInput">
574 <li class="searchTagInput">
575 <input class="main_filter_input" id="main_filter" size="25" type="text" name="main_filter" placeholder="${_('search / go to...')}" value="" />
575 <input class="main_filter_input" id="main_filter" size="25" type="text" name="main_filter" placeholder="${_('search / go to...')}" value="" />
576 </li>
576 </li>
577 <li class="searchTag searchTagHelp">
577 <li class="searchTag searchTagHelp">
578 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
578 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
579 </li>
579 </li>
580 </ul>
580 </ul>
581 </div>
581 </div>
582 </div>
582 </div>
583
583
584 <div id="main_filter_help" style="display: none">
584 <div id="main_filter_help" style="display: none">
585 - Use '/' key to quickly access this field.
585 - Use '/' key to quickly access this field.
586
586
587 - Enter a name of repository, or repository group for quick search.
587 - Enter a name of repository, or repository group for quick search.
588
588
589 - Prefix query to allow special search:
589 - Prefix query to allow special search:
590
590
591 user:admin, to search for usernames, always global
591 user:admin, to search for usernames, always global
592
592
593 user_group:devops, to search for user groups, always global
593 user_group:devops, to search for user groups, always global
594
594
595 commit:efced4, to search for commits, scoped to repositories or groups
595 commit:efced4, to search for commits, scoped to repositories or groups
596
596
597 file:models.py, to search for file paths, scoped to repositories or groups
597 file:models.py, to search for file paths, scoped to repositories or groups
598
598
599 % if c.template_context['search_context']['repo_id']:
599 % if c.template_context['search_context']['repo_id']:
600 For advanced full text search visit: <a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">repository search</a>
600 For advanced full text search visit: <a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">repository search</a>
601 % elif c.template_context['search_context']['repo_group_id']:
601 % elif c.template_context['search_context']['repo_group_id']:
602 For advanced full text search visit: <a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">repository group search</a>
602 For advanced full text search visit: <a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">repository group search</a>
603 % else:
603 % else:
604 For advanced full text search visit: <a href="${h.route_path('search')}">global search</a>
604 For advanced full text search visit: <a href="${h.route_path('search')}">global search</a>
605 % endif
605 % endif
606 </div>
606 </div>
607 </li>
607 </li>
608
608
609 ## ROOT MENU
609 ## ROOT MENU
610 <li class="${is_active('home')}">
610 <li class="${is_active('home')}">
611 <a class="menulink" title="${_('Home')}" href="${h.route_path('home')}">
611 <a class="menulink" title="${_('Home')}" href="${h.route_path('home')}">
612 <div class="menulabel">${_('Home')}</div>
612 <div class="menulabel">${_('Home')}</div>
613 </a>
613 </a>
614 </li>
614 </li>
615
615
616 %if c.rhodecode_user.username != h.DEFAULT_USER:
616 %if c.rhodecode_user.username != h.DEFAULT_USER:
617 <li class="${is_active('journal')}">
617 <li class="${is_active('journal')}">
618 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
618 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
619 <div class="menulabel">${_('Journal')}</div>
619 <div class="menulabel">${_('Journal')}</div>
620 </a>
620 </a>
621 </li>
621 </li>
622 %else:
622 %else:
623 <li class="${is_active('journal')}">
623 <li class="${is_active('journal')}">
624 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
624 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
625 <div class="menulabel">${_('Public journal')}</div>
625 <div class="menulabel">${_('Public journal')}</div>
626 </a>
626 </a>
627 </li>
627 </li>
628 %endif
628 %endif
629
629
630 <li class="${is_active('gists')}">
630 <li class="${is_active('gists')}">
631 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
631 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
632 <div class="menulabel">${_('Gists')}</div>
632 <div class="menulabel">${_('Gists')}</div>
633 </a>
633 </a>
634 </li>
634 </li>
635
635
636 % if c.is_super_admin or c.is_delegated_admin:
636 % if c.is_super_admin or c.is_delegated_admin:
637 <li class="${is_active('admin')}">
637 <li class="${is_active('admin')}">
638 <a class="menulink childs" title="${_('Admin settings')}" href="${h.route_path('admin_home')}">
638 <a class="menulink childs" title="${_('Admin settings')}" href="${h.route_path('admin_home')}">
639 <div class="menulabel">${_('Admin')} </div>
639 <div class="menulabel">${_('Admin')} </div>
640 </a>
640 </a>
641 </li>
641 </li>
642 % endif
642 % endif
643
643
644 ## render extra user menu
644 ## render extra user menu
645 ${usermenu(active=(active=='my_account'))}
645 ${usermenu(active=(active=='my_account'))}
646
646
647 % if c.debug_style:
647 % if c.debug_style:
648 <li>
648 <li>
649 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
649 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
650 <div class="menulabel">${_('[Style]')}</div>
650 <div class="menulabel">${_('[Style]')}</div>
651 </a>
651 </a>
652 </li>
652 </li>
653 % endif
653 % endif
654 </ul>
654 </ul>
655
655
656 <script type="text/javascript">
656 <script type="text/javascript">
657 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
657 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
658
658
659 var formatRepoResult = function(result, container, query, escapeMarkup) {
659 var formatRepoResult = function(result, container, query, escapeMarkup) {
660 return function(data, escapeMarkup) {
660 return function(data, escapeMarkup) {
661 if (!data.repo_id){
661 if (!data.repo_id){
662 return data.text; // optgroup text Repositories
662 return data.text; // optgroup text Repositories
663 }
663 }
664
664
665 var tmpl = '';
665 var tmpl = '';
666 var repoType = data['repo_type'];
666 var repoType = data['repo_type'];
667 var repoName = data['text'];
667 var repoName = data['text'];
668
668
669 if(data && data.type == 'repo'){
669 if(data && data.type == 'repo'){
670 if(repoType === 'hg'){
670 if(repoType === 'hg'){
671 tmpl += '<i class="icon-hg"></i> ';
671 tmpl += '<i class="icon-hg"></i> ';
672 }
672 }
673 else if(repoType === 'git'){
673 else if(repoType === 'git'){
674 tmpl += '<i class="icon-git"></i> ';
674 tmpl += '<i class="icon-git"></i> ';
675 }
675 }
676 else if(repoType === 'svn'){
676 else if(repoType === 'svn'){
677 tmpl += '<i class="icon-svn"></i> ';
677 tmpl += '<i class="icon-svn"></i> ';
678 }
678 }
679 if(data['private']){
679 if(data['private']){
680 tmpl += '<i class="icon-lock" ></i> ';
680 tmpl += '<i class="icon-lock" ></i> ';
681 }
681 }
682 else if(visualShowPublicIcon){
682 else if(visualShowPublicIcon){
683 tmpl += '<i class="icon-unlock-alt"></i> ';
683 tmpl += '<i class="icon-unlock-alt"></i> ';
684 }
684 }
685 }
685 }
686 tmpl += escapeMarkup(repoName);
686 tmpl += escapeMarkup(repoName);
687 return tmpl;
687 return tmpl;
688
688
689 }(result, escapeMarkup);
689 }(result, escapeMarkup);
690 };
690 };
691
691
692 var formatRepoGroupResult = function(result, container, query, escapeMarkup) {
692 var formatRepoGroupResult = function(result, container, query, escapeMarkup) {
693 return function(data, escapeMarkup) {
693 return function(data, escapeMarkup) {
694 if (!data.repo_group_id){
694 if (!data.repo_group_id){
695 return data.text; // optgroup text Repositories
695 return data.text; // optgroup text Repositories
696 }
696 }
697
697
698 var tmpl = '';
698 var tmpl = '';
699 var repoGroupName = data['text'];
699 var repoGroupName = data['text'];
700
700
701 if(data){
701 if(data){
702
702
703 tmpl += '<i class="icon-repo-group"></i> ';
703 tmpl += '<i class="icon-repo-group"></i> ';
704
704
705 }
705 }
706 tmpl += escapeMarkup(repoGroupName);
706 tmpl += escapeMarkup(repoGroupName);
707 return tmpl;
707 return tmpl;
708
708
709 }(result, escapeMarkup);
709 }(result, escapeMarkup);
710 };
710 };
711
711
712 var escapeRegExChars = function (value) {
712 var escapeRegExChars = function (value) {
713 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
713 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
714 };
714 };
715
715
716 var getRepoIcon = function(repo_type) {
716 var getRepoIcon = function(repo_type) {
717 if (repo_type === 'hg') {
717 if (repo_type === 'hg') {
718 return '<i class="icon-hg"></i> ';
718 return '<i class="icon-hg"></i> ';
719 }
719 }
720 else if (repo_type === 'git') {
720 else if (repo_type === 'git') {
721 return '<i class="icon-git"></i> ';
721 return '<i class="icon-git"></i> ';
722 }
722 }
723 else if (repo_type === 'svn') {
723 else if (repo_type === 'svn') {
724 return '<i class="icon-svn"></i> ';
724 return '<i class="icon-svn"></i> ';
725 }
725 }
726 return ''
726 return ''
727 };
727 };
728
728
729 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
729 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
730
730
731 if (value.split(':').length === 2) {
731 if (value.split(':').length === 2) {
732 value = value.split(':')[1]
732 value = value.split(':')[1]
733 }
733 }
734
734
735 var searchType = data['type'];
735 var searchType = data['type'];
736 var searchSubType = data['subtype'];
736 var searchSubType = data['subtype'];
737 var valueDisplay = data['value_display'];
737 var valueDisplay = data['value_display'];
738
738
739 var pattern = '(' + escapeRegExChars(value) + ')';
739 var pattern = '(' + escapeRegExChars(value) + ')';
740
740
741 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
741 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
742
742
743 // highlight match
743 // highlight match
744 if (searchType != 'text') {
744 if (searchType != 'text') {
745 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
745 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
746 }
746 }
747
747
748 var icon = '';
748 var icon = '';
749
749
750 if (searchType === 'hint') {
750 if (searchType === 'hint') {
751 icon += '<i class="icon-repo-group"></i> ';
751 icon += '<i class="icon-repo-group"></i> ';
752 }
752 }
753 // full text search/hints
753 // full text search/hints
754 else if (searchType === 'search') {
754 else if (searchType === 'search') {
755 icon += '<i class="icon-more"></i> ';
755 icon += '<i class="icon-more"></i> ';
756 if (searchSubType !== undefined && searchSubType == 'repo') {
756 if (searchSubType !== undefined && searchSubType == 'repo') {
757 valueDisplay += '<div class="pull-right tag">repository</div>';
757 valueDisplay += '<div class="pull-right tag">repository</div>';
758 }
758 }
759 else if (searchSubType !== undefined && searchSubType == 'repo_group') {
759 else if (searchSubType !== undefined && searchSubType == 'repo_group') {
760 valueDisplay += '<div class="pull-right tag">repo group</div>';
760 valueDisplay += '<div class="pull-right tag">repo group</div>';
761 }
761 }
762 }
762 }
763 // repository
763 // repository
764 else if (searchType === 'repo') {
764 else if (searchType === 'repo') {
765
765
766 var repoIcon = getRepoIcon(data['repo_type']);
766 var repoIcon = getRepoIcon(data['repo_type']);
767 icon += repoIcon;
767 icon += repoIcon;
768
768
769 if (data['private']) {
769 if (data['private']) {
770 icon += '<i class="icon-lock" ></i> ';
770 icon += '<i class="icon-lock" ></i> ';
771 }
771 }
772 else if (visualShowPublicIcon) {
772 else if (visualShowPublicIcon) {
773 icon += '<i class="icon-unlock-alt"></i> ';
773 icon += '<i class="icon-unlock-alt"></i> ';
774 }
774 }
775 }
775 }
776 // repository groups
776 // repository groups
777 else if (searchType === 'repo_group') {
777 else if (searchType === 'repo_group') {
778 icon += '<i class="icon-repo-group"></i> ';
778 icon += '<i class="icon-repo-group"></i> ';
779 }
779 }
780 // user group
780 // user group
781 else if (searchType === 'user_group') {
781 else if (searchType === 'user_group') {
782 icon += '<i class="icon-group"></i> ';
782 icon += '<i class="icon-group"></i> ';
783 }
783 }
784 // user
784 // user
785 else if (searchType === 'user') {
785 else if (searchType === 'user') {
786 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
786 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
787 }
787 }
788 // commit
788 // commit
789 else if (searchType === 'commit') {
789 else if (searchType === 'commit') {
790 var repo_data = data['repo_data'];
790 var repo_data = data['repo_data'];
791 var repoIcon = getRepoIcon(repo_data['repository_type']);
791 var repoIcon = getRepoIcon(repo_data['repository_type']);
792 if (repoIcon) {
792 if (repoIcon) {
793 icon += repoIcon;
793 icon += repoIcon;
794 } else {
794 } else {
795 icon += '<i class="icon-tag"></i>';
795 icon += '<i class="icon-tag"></i>';
796 }
796 }
797 }
797 }
798 // file
798 // file
799 else if (searchType === 'file') {
799 else if (searchType === 'file') {
800 var repo_data = data['repo_data'];
800 var repo_data = data['repo_data'];
801 var repoIcon = getRepoIcon(repo_data['repository_type']);
801 var repoIcon = getRepoIcon(repo_data['repository_type']);
802 if (repoIcon) {
802 if (repoIcon) {
803 icon += repoIcon;
803 icon += repoIcon;
804 } else {
804 } else {
805 icon += '<i class="icon-tag"></i>';
805 icon += '<i class="icon-tag"></i>';
806 }
806 }
807 }
807 }
808 // generic text
808 // generic text
809 else if (searchType === 'text') {
809 else if (searchType === 'text') {
810 icon = '';
810 icon = '';
811 }
811 }
812
812
813 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
813 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
814 return tmpl.format(icon, valueDisplay);
814 return tmpl.format(icon, valueDisplay);
815 };
815 };
816
816
817 var handleSelect = function(element, suggestion) {
817 var handleSelect = function(element, suggestion) {
818 if (suggestion.type === "hint") {
818 if (suggestion.type === "hint") {
819 // we skip action
819 // we skip action
820 $('#main_filter').focus();
820 $('#main_filter').focus();
821 }
821 }
822 else if (suggestion.type === "text") {
822 else if (suggestion.type === "text") {
823 // we skip action
823 // we skip action
824 $('#main_filter').focus();
824 $('#main_filter').focus();
825
825
826 } else {
826 } else {
827 window.location = suggestion['url'];
827 window.location = suggestion['url'];
828 }
828 }
829 };
829 };
830
830
831 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
831 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
832 if (queryLowerCase.split(':').length === 2) {
832 if (queryLowerCase.split(':').length === 2) {
833 queryLowerCase = queryLowerCase.split(':')[1]
833 queryLowerCase = queryLowerCase.split(':')[1]
834 }
834 }
835 if (suggestion.type === "text") {
835 if (suggestion.type === "text") {
836 // special case we don't want to "skip" display for
836 // special case we don't want to "skip" display for
837 return true
837 return true
838 }
838 }
839 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
839 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
840 };
840 };
841
841
842 var cleanContext = {
842 var cleanContext = {
843 repo_view_type: null,
843 repo_view_type: null,
844
844
845 repo_id: null,
845 repo_id: null,
846 repo_name: "",
846 repo_name: "",
847
847
848 repo_group_id: null,
848 repo_group_id: null,
849 repo_group_name: null
849 repo_group_name: null
850 };
850 };
851 var removeGoToFilter = function () {
851 var removeGoToFilter = function () {
852 $('.searchTagHidable').hide();
852 $('.searchTagHidable').hide();
853 $('#main_filter').autocomplete(
853 $('#main_filter').autocomplete(
854 'setOptions', {params:{search_context: cleanContext}});
854 'setOptions', {params:{search_context: cleanContext}});
855 };
855 };
856
856
857 $('#main_filter').autocomplete({
857 $('#main_filter').autocomplete({
858 serviceUrl: pyroutes.url('goto_switcher_data'),
858 serviceUrl: pyroutes.url('goto_switcher_data'),
859 params: {
859 params: {
860 "search_context": templateContext.search_context
860 "search_context": templateContext.search_context
861 },
861 },
862 minChars:2,
862 minChars:2,
863 maxHeight:400,
863 maxHeight:400,
864 deferRequestBy: 300, //miliseconds
864 deferRequestBy: 300, //miliseconds
865 tabDisabled: true,
865 tabDisabled: true,
866 autoSelectFirst: false,
866 autoSelectFirst: false,
867 containerClass: 'autocomplete-qfilter-suggestions',
867 containerClass: 'autocomplete-qfilter-suggestions',
868 formatResult: autocompleteMainFilterFormatResult,
868 formatResult: autocompleteMainFilterFormatResult,
869 lookupFilter: autocompleteMainFilterResult,
869 lookupFilter: autocompleteMainFilterResult,
870 onSelect: function (element, suggestion) {
870 onSelect: function (element, suggestion) {
871 handleSelect(element, suggestion);
871 handleSelect(element, suggestion);
872 return false;
872 return false;
873 },
873 },
874 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
874 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
875 if (jqXHR !== 'abort') {
875 if (jqXHR !== 'abort') {
876 alert("Error during search.\nError code: {0}".format(textStatus));
876 alert("Error during search.\nError code: {0}".format(textStatus));
877 window.location = '';
877 window.location = '';
878 }
878 }
879 }
879 }
880 });
880 });
881
881
882 showMainFilterBox = function () {
882 showMainFilterBox = function () {
883 $('#main_filter_help').toggle();
883 $('#main_filter_help').toggle();
884 };
884 };
885
885
886 $('#main_filter').on('keydown.autocomplete', function (e) {
886 $('#main_filter').on('keydown.autocomplete', function (e) {
887
887
888 var BACKSPACE = 8;
888 var BACKSPACE = 8;
889 var el = $(e.currentTarget);
889 var el = $(e.currentTarget);
890 if(e.which === BACKSPACE){
890 if(e.which === BACKSPACE){
891 var inputVal = el.val();
891 var inputVal = el.val();
892 if (inputVal === ""){
892 if (inputVal === ""){
893 removeGoToFilter()
893 removeGoToFilter()
894 }
894 }
895 }
895 }
896 });
896 });
897
897
898 </script>
898 </script>
899 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
899 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
900 </%def>
900 </%def>
901
901
902 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
902 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
903 <div class="modal-dialog">
903 <div class="modal-dialog">
904 <div class="modal-content">
904 <div class="modal-content">
905 <div class="modal-header">
905 <div class="modal-header">
906 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
906 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
907 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
907 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
908 </div>
908 </div>
909 <div class="modal-body">
909 <div class="modal-body">
910 <div class="block-left">
910 <div class="block-left">
911 <table class="keyboard-mappings">
911 <table class="keyboard-mappings">
912 <tbody>
912 <tbody>
913 <tr>
913 <tr>
914 <th></th>
914 <th></th>
915 <th>${_('Site-wide shortcuts')}</th>
915 <th>${_('Site-wide shortcuts')}</th>
916 </tr>
916 </tr>
917 <%
917 <%
918 elems = [
918 elems = [
919 ('/', 'Use quick search box'),
919 ('/', 'Use quick search box'),
920 ('g h', 'Goto home page'),
920 ('g h', 'Goto home page'),
921 ('g g', 'Goto my private gists page'),
921 ('g g', 'Goto my private gists page'),
922 ('g G', 'Goto my public gists page'),
922 ('g G', 'Goto my public gists page'),
923 ('g 0-9', 'Goto bookmarked items from 0-9'),
923 ('g 0-9', 'Goto bookmarked items from 0-9'),
924 ('n r', 'New repository page'),
924 ('n r', 'New repository page'),
925 ('n g', 'New gist page'),
925 ('n g', 'New gist page'),
926 ]
926 ]
927 %>
927 %>
928 %for key, desc in elems:
928 %for key, desc in elems:
929 <tr>
929 <tr>
930 <td class="keys">
930 <td class="keys">
931 <span class="key tag">${key}</span>
931 <span class="key tag">${key}</span>
932 </td>
932 </td>
933 <td>${desc}</td>
933 <td>${desc}</td>
934 </tr>
934 </tr>
935 %endfor
935 %endfor
936 </tbody>
936 </tbody>
937 </table>
937 </table>
938 </div>
938 </div>
939 <div class="block-left">
939 <div class="block-left">
940 <table class="keyboard-mappings">
940 <table class="keyboard-mappings">
941 <tbody>
941 <tbody>
942 <tr>
942 <tr>
943 <th></th>
943 <th></th>
944 <th>${_('Repositories')}</th>
944 <th>${_('Repositories')}</th>
945 </tr>
945 </tr>
946 <%
946 <%
947 elems = [
947 elems = [
948 ('g s', 'Goto summary page'),
948 ('g s', 'Goto summary page'),
949 ('g c', 'Goto changelog page'),
949 ('g c', 'Goto changelog page'),
950 ('g f', 'Goto files page'),
950 ('g f', 'Goto files page'),
951 ('g F', 'Goto files page with file search activated'),
951 ('g F', 'Goto files page with file search activated'),
952 ('g p', 'Goto pull requests page'),
952 ('g p', 'Goto pull requests page'),
953 ('g o', 'Goto repository settings'),
953 ('g o', 'Goto repository settings'),
954 ('g O', 'Goto repository permissions settings'),
954 ('g O', 'Goto repository permissions settings'),
955 ]
955 ]
956 %>
956 %>
957 %for key, desc in elems:
957 %for key, desc in elems:
958 <tr>
958 <tr>
959 <td class="keys">
959 <td class="keys">
960 <span class="key tag">${key}</span>
960 <span class="key tag">${key}</span>
961 </td>
961 </td>
962 <td>${desc}</td>
962 <td>${desc}</td>
963 </tr>
963 </tr>
964 %endfor
964 %endfor
965 </tbody>
965 </tbody>
966 </table>
966 </table>
967 </div>
967 </div>
968 </div>
968 </div>
969 <div class="modal-footer">
969 <div class="modal-footer">
970 </div>
970 </div>
971 </div><!-- /.modal-content -->
971 </div><!-- /.modal-content -->
972 </div><!-- /.modal-dialog -->
972 </div><!-- /.modal-dialog -->
973 </div><!-- /.modal -->
973 </div><!-- /.modal -->
974
974
General Comments 0
You need to be logged in to leave comments. Login now