##// END OF EJS Templates
main-page: simplify footer, and expose docs link.
marcink -
r4375:ff491385 stable
parent child Browse files
Show More
@@ -1,179 +1,179 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2020 RhodeCode GmbH
3 # Copyright (C) 2010-2020 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 import pytest
22 import pytest
23
23
24 import rhodecode
24 import rhodecode
25 from rhodecode.model.db import Repository, RepoGroup, User
25 from rhodecode.model.db import Repository, RepoGroup, User
26 from rhodecode.model.meta import Session
26 from rhodecode.model.meta import Session
27 from rhodecode.model.repo import RepoModel
27 from rhodecode.model.repo import RepoModel
28 from rhodecode.model.repo_group import RepoGroupModel
28 from rhodecode.model.repo_group import RepoGroupModel
29 from rhodecode.model.settings import SettingsModel
29 from rhodecode.model.settings import SettingsModel
30 from rhodecode.tests import TestController
30 from rhodecode.tests import TestController
31 from rhodecode.tests.fixture import Fixture
31 from rhodecode.tests.fixture import Fixture
32 from rhodecode.lib import helpers as h
32 from rhodecode.lib import helpers as h
33
33
34 fixture = Fixture()
34 fixture = Fixture()
35
35
36
36
37 def route_path(name, **kwargs):
37 def route_path(name, **kwargs):
38 return {
38 return {
39 'home': '/',
39 'home': '/',
40 'main_page_repos_data': '/_home_repos',
40 'main_page_repos_data': '/_home_repos',
41 'main_page_repo_groups_data': '/_home_repo_groups',
41 'main_page_repo_groups_data': '/_home_repo_groups',
42 'repo_group_home': '/{repo_group_name}'
42 'repo_group_home': '/{repo_group_name}'
43 }[name].format(**kwargs)
43 }[name].format(**kwargs)
44
44
45
45
46 class TestHomeController(TestController):
46 class TestHomeController(TestController):
47
47
48 def test_index(self):
48 def test_index(self):
49 self.log_user()
49 self.log_user()
50 response = self.app.get(route_path('home'))
50 response = self.app.get(route_path('home'))
51 # if global permission is set
51 # if global permission is set
52 response.mustcontain('New Repository')
52 response.mustcontain('New Repository')
53
53
54 def test_index_grid_repos(self, xhr_header):
54 def test_index_grid_repos(self, xhr_header):
55 self.log_user()
55 self.log_user()
56 response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
56 response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
57 # search for objects inside the JavaScript JSON
57 # search for objects inside the JavaScript JSON
58 for obj in Repository.getAll():
58 for obj in Repository.getAll():
59 response.mustcontain('<a href=\\"/{}\\">'.format(obj.repo_name))
59 response.mustcontain('<a href=\\"/{}\\">'.format(obj.repo_name))
60
60
61 def test_index_grid_repo_groups(self, xhr_header):
61 def test_index_grid_repo_groups(self, xhr_header):
62 self.log_user()
62 self.log_user()
63 response = self.app.get(route_path('main_page_repo_groups_data'),
63 response = self.app.get(route_path('main_page_repo_groups_data'),
64 extra_environ=xhr_header,)
64 extra_environ=xhr_header,)
65
65
66 # search for objects inside the JavaScript JSON
66 # search for objects inside the JavaScript JSON
67 for obj in RepoGroup.getAll():
67 for obj in RepoGroup.getAll():
68 response.mustcontain('<a href=\\"/{}\\">'.format(obj.group_name))
68 response.mustcontain('<a href=\\"/{}\\">'.format(obj.group_name))
69
69
70 def test_index_grid_repo_groups_without_access(self, xhr_header, user_util):
70 def test_index_grid_repo_groups_without_access(self, xhr_header, user_util):
71 user = user_util.create_user(password='qweqwe')
71 user = user_util.create_user(password='qweqwe')
72 group_ok = user_util.create_repo_group(owner=user)
72 group_ok = user_util.create_repo_group(owner=user)
73 group_id_ok = group_ok.group_id
73 group_id_ok = group_ok.group_id
74
74
75 group_forbidden = user_util.create_repo_group(owner=User.get_first_super_admin())
75 group_forbidden = user_util.create_repo_group(owner=User.get_first_super_admin())
76 group_id_forbidden = group_forbidden.group_id
76 group_id_forbidden = group_forbidden.group_id
77
77
78 user_util.grant_user_permission_to_repo_group(group_forbidden, user, 'group.none')
78 user_util.grant_user_permission_to_repo_group(group_forbidden, user, 'group.none')
79 self.log_user(user.username, 'qweqwe')
79 self.log_user(user.username, 'qweqwe')
80
80
81 self.app.get(route_path('main_page_repo_groups_data'),
81 self.app.get(route_path('main_page_repo_groups_data'),
82 extra_environ=xhr_header,
82 extra_environ=xhr_header,
83 params={'repo_group_id': group_id_ok}, status=200)
83 params={'repo_group_id': group_id_ok}, status=200)
84
84
85 self.app.get(route_path('main_page_repo_groups_data'),
85 self.app.get(route_path('main_page_repo_groups_data'),
86 extra_environ=xhr_header,
86 extra_environ=xhr_header,
87 params={'repo_group_id': group_id_forbidden}, status=404)
87 params={'repo_group_id': group_id_forbidden}, status=404)
88
88
89 def test_index_contains_statics_with_ver(self):
89 def test_index_contains_statics_with_ver(self):
90 from rhodecode.lib.base import calculate_version_hash
90 from rhodecode.lib.base import calculate_version_hash
91
91
92 self.log_user()
92 self.log_user()
93 response = self.app.get(route_path('home'))
93 response = self.app.get(route_path('home'))
94
94
95 rhodecode_version_hash = calculate_version_hash(
95 rhodecode_version_hash = calculate_version_hash(
96 {'beaker.session.secret': 'test-rc-uytcxaz'})
96 {'beaker.session.secret': 'test-rc-uytcxaz'})
97 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
97 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
98 response.mustcontain('scripts.min.js?ver={0}'.format(rhodecode_version_hash))
98 response.mustcontain('scripts.min.js?ver={0}'.format(rhodecode_version_hash))
99
99
100 def test_index_contains_backend_specific_details(self, backend, xhr_header):
100 def test_index_contains_backend_specific_details(self, backend, xhr_header):
101 self.log_user()
101 self.log_user()
102 response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
102 response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
103 tip = backend.repo.get_commit().raw_id
103 tip = backend.repo.get_commit().raw_id
104
104
105 # html in javascript variable:
105 # html in javascript variable:
106 response.mustcontain(r'<i class=\"icon-%s\"' % (backend.alias, ))
106 response.mustcontain(r'<i class=\"icon-%s\"' % (backend.alias, ))
107 response.mustcontain(r'href=\"/%s\"' % (backend.repo_name, ))
107 response.mustcontain(r'href=\"/%s\"' % (backend.repo_name, ))
108
108
109 response.mustcontain("""/%s/changeset/%s""" % (backend.repo_name, tip))
109 response.mustcontain("""/%s/changeset/%s""" % (backend.repo_name, tip))
110 response.mustcontain("""Added a symlink""")
110 response.mustcontain("""Added a symlink""")
111
111
112 def test_index_with_anonymous_access_disabled(self):
112 def test_index_with_anonymous_access_disabled(self):
113 with fixture.anon_access(False):
113 with fixture.anon_access(False):
114 response = self.app.get(route_path('home'), status=302)
114 response = self.app.get(route_path('home'), status=302)
115 assert 'login' in response.location
115 assert 'login' in response.location
116
116
117 def test_index_page_on_groups_with_wrong_group_id(self, autologin_user, xhr_header):
117 def test_index_page_on_groups_with_wrong_group_id(self, autologin_user, xhr_header):
118 group_id = 918123
118 group_id = 918123
119 self.app.get(
119 self.app.get(
120 route_path('main_page_repo_groups_data'),
120 route_path('main_page_repo_groups_data'),
121 params={'repo_group_id': group_id},
121 params={'repo_group_id': group_id},
122 status=404, extra_environ=xhr_header)
122 status=404, extra_environ=xhr_header)
123
123
124 def test_index_page_on_groups(self, autologin_user, user_util, xhr_header):
124 def test_index_page_on_groups(self, autologin_user, user_util, xhr_header):
125 gr = user_util.create_repo_group()
125 gr = user_util.create_repo_group()
126 repo = user_util.create_repo(parent=gr)
126 repo = user_util.create_repo(parent=gr)
127 repo_name = repo.repo_name
127 repo_name = repo.repo_name
128 group_id = gr.group_id
128 group_id = gr.group_id
129
129
130 response = self.app.get(route_path(
130 response = self.app.get(route_path(
131 'repo_group_home', repo_group_name=gr.group_name))
131 'repo_group_home', repo_group_name=gr.group_name))
132 response.mustcontain('d.repo_group_id = {}'.format(group_id))
132 response.mustcontain('d.repo_group_id = {}'.format(group_id))
133
133
134 response = self.app.get(
134 response = self.app.get(
135 route_path('main_page_repos_data'),
135 route_path('main_page_repos_data'),
136 params={'repo_group_id': group_id},
136 params={'repo_group_id': group_id},
137 extra_environ=xhr_header,)
137 extra_environ=xhr_header,)
138 response.mustcontain(repo_name)
138 response.mustcontain(repo_name)
139
139
140 def test_index_page_on_group_with_trailing_slash(self, autologin_user, user_util, xhr_header):
140 def test_index_page_on_group_with_trailing_slash(self, autologin_user, user_util, xhr_header):
141 gr = user_util.create_repo_group()
141 gr = user_util.create_repo_group()
142 repo = user_util.create_repo(parent=gr)
142 repo = user_util.create_repo(parent=gr)
143 repo_name = repo.repo_name
143 repo_name = repo.repo_name
144 group_id = gr.group_id
144 group_id = gr.group_id
145
145
146 response = self.app.get(route_path(
146 response = self.app.get(route_path(
147 'repo_group_home', repo_group_name=gr.group_name+'/'))
147 'repo_group_home', repo_group_name=gr.group_name+'/'))
148 response.mustcontain('d.repo_group_id = {}'.format(group_id))
148 response.mustcontain('d.repo_group_id = {}'.format(group_id))
149
149
150 response = self.app.get(
150 response = self.app.get(
151 route_path('main_page_repos_data'),
151 route_path('main_page_repos_data'),
152 params={'repo_group_id': group_id},
152 params={'repo_group_id': group_id},
153 extra_environ=xhr_header, )
153 extra_environ=xhr_header, )
154 response.mustcontain(repo_name)
154 response.mustcontain(repo_name)
155
155
156 @pytest.mark.parametrize("name, state", [
156 @pytest.mark.parametrize("name, state", [
157 ('Disabled', False),
157 ('Disabled', False),
158 ('Enabled', True),
158 ('Enabled', True),
159 ])
159 ])
160 def test_index_show_version(self, autologin_user, name, state):
160 def test_index_show_version(self, autologin_user, name, state):
161 version_string = 'RhodeCode Enterprise %s' % rhodecode.__version__
161 version_string = 'RhodeCode %s' % rhodecode.__version__
162
162
163 sett = SettingsModel().create_or_update_setting(
163 sett = SettingsModel().create_or_update_setting(
164 'show_version', state, 'bool')
164 'show_version', state, 'bool')
165 Session().add(sett)
165 Session().add(sett)
166 Session().commit()
166 Session().commit()
167 SettingsModel().invalidate_settings_cache()
167 SettingsModel().invalidate_settings_cache()
168
168
169 response = self.app.get(route_path('home'))
169 response = self.app.get(route_path('home'))
170 if state is True:
170 if state is True:
171 response.mustcontain(version_string)
171 response.mustcontain(version_string)
172 if state is False:
172 if state is False:
173 response.mustcontain(no=[version_string])
173 response.mustcontain(no=[version_string])
174
174
175 def test_logout_form_contains_csrf(self, autologin_user, csrf_token):
175 def test_logout_form_contains_csrf(self, autologin_user, csrf_token):
176 response = self.app.get(route_path('home'))
176 response = self.app.get(route_path('home'))
177 assert_response = response.assert_response()
177 assert_response = response.assert_response()
178 element = assert_response.get_element('.logout [name=csrf_token]')
178 element = assert_response.get_element('.logout [name=csrf_token]')
179 assert element.value == csrf_token
179 assert element.value == csrf_token
@@ -1,3060 +1,3067 b''
1 //Primary CSS
1 //Primary CSS
2
2
3 //--- IMPORTS ------------------//
3 //--- IMPORTS ------------------//
4
4
5 @import 'helpers';
5 @import 'helpers';
6 @import 'mixins';
6 @import 'mixins';
7 @import 'rcicons';
7 @import 'rcicons';
8 @import 'variables';
8 @import 'variables';
9 @import 'bootstrap-variables';
9 @import 'bootstrap-variables';
10 @import 'form-bootstrap';
10 @import 'form-bootstrap';
11 @import 'codemirror';
11 @import 'codemirror';
12 @import 'legacy_code_styles';
12 @import 'legacy_code_styles';
13 @import 'readme-box';
13 @import 'readme-box';
14 @import 'progress-bar';
14 @import 'progress-bar';
15
15
16 @import 'type';
16 @import 'type';
17 @import 'alerts';
17 @import 'alerts';
18 @import 'buttons';
18 @import 'buttons';
19 @import 'tags';
19 @import 'tags';
20 @import 'code-block';
20 @import 'code-block';
21 @import 'examples';
21 @import 'examples';
22 @import 'login';
22 @import 'login';
23 @import 'main-content';
23 @import 'main-content';
24 @import 'select2';
24 @import 'select2';
25 @import 'comments';
25 @import 'comments';
26 @import 'panels-bootstrap';
26 @import 'panels-bootstrap';
27 @import 'panels';
27 @import 'panels';
28 @import 'deform';
28 @import 'deform';
29 @import 'tooltips';
29 @import 'tooltips';
30 @import 'sweetalert2';
30 @import 'sweetalert2';
31
31
32
32
33 //--- BASE ------------------//
33 //--- BASE ------------------//
34 .noscript-error {
34 .noscript-error {
35 top: 0;
35 top: 0;
36 left: 0;
36 left: 0;
37 width: 100%;
37 width: 100%;
38 z-index: 101;
38 z-index: 101;
39 text-align: center;
39 text-align: center;
40 font-size: 120%;
40 font-size: 120%;
41 color: white;
41 color: white;
42 background-color: @alert2;
42 background-color: @alert2;
43 padding: 5px 0 5px 0;
43 padding: 5px 0 5px 0;
44 font-weight: @text-semibold-weight;
44 font-weight: @text-semibold-weight;
45 font-family: @text-semibold;
45 font-family: @text-semibold;
46 }
46 }
47
47
48 html {
48 html {
49 display: table;
49 display: table;
50 height: 100%;
50 height: 100%;
51 width: 100%;
51 width: 100%;
52 }
52 }
53
53
54 body {
54 body {
55 display: table-cell;
55 display: table-cell;
56 width: 100%;
56 width: 100%;
57 }
57 }
58
58
59 //--- LAYOUT ------------------//
59 //--- LAYOUT ------------------//
60
60
61 .hidden{
61 .hidden{
62 display: none !important;
62 display: none !important;
63 }
63 }
64
64
65 .box{
65 .box{
66 float: left;
66 float: left;
67 width: 100%;
67 width: 100%;
68 }
68 }
69
69
70 .browser-header {
70 .browser-header {
71 clear: both;
71 clear: both;
72 }
72 }
73 .main {
73 .main {
74 clear: both;
74 clear: both;
75 padding:0 0 @pagepadding;
75 padding:0 0 @pagepadding;
76 height: auto;
76 height: auto;
77
77
78 &:after { //clearfix
78 &:after { //clearfix
79 content:"";
79 content:"";
80 clear:both;
80 clear:both;
81 width:100%;
81 width:100%;
82 display:block;
82 display:block;
83 }
83 }
84 }
84 }
85
85
86 .action-link{
86 .action-link{
87 margin-left: @padding;
87 margin-left: @padding;
88 padding-left: @padding;
88 padding-left: @padding;
89 border-left: @border-thickness solid @border-default-color;
89 border-left: @border-thickness solid @border-default-color;
90 }
90 }
91
91
92 .cursor-pointer {
92 .cursor-pointer {
93 cursor: pointer;
93 cursor: pointer;
94 }
94 }
95
95
96 input + .action-link, .action-link.first{
96 input + .action-link, .action-link.first{
97 border-left: none;
97 border-left: none;
98 }
98 }
99
99
100 .action-link.last{
100 .action-link.last{
101 margin-right: @padding;
101 margin-right: @padding;
102 padding-right: @padding;
102 padding-right: @padding;
103 }
103 }
104
104
105 .action-link.active,
105 .action-link.active,
106 .action-link.active a{
106 .action-link.active a{
107 color: @grey4;
107 color: @grey4;
108 }
108 }
109
109
110 .action-link.disabled {
110 .action-link.disabled {
111 color: @grey4;
111 color: @grey4;
112 cursor: inherit;
112 cursor: inherit;
113 }
113 }
114
114
115 .grey-link-action {
116 cursor: pointer;
117 &:hover {
118 color: @grey2;
119 }
120 color: @grey4;
121 }
115
122
116 .clipboard-action {
123 .clipboard-action {
117 cursor: pointer;
124 cursor: pointer;
118 margin-left: 5px;
125 margin-left: 5px;
119
126
120 &:not(.no-grey) {
127 &:not(.no-grey) {
121
128
122 &:hover {
129 &:hover {
123 color: @grey2;
130 color: @grey2;
124 }
131 }
125 color: @grey4;
132 color: @grey4;
126 }
133 }
127 }
134 }
128
135
129 ul.simple-list{
136 ul.simple-list{
130 list-style: none;
137 list-style: none;
131 margin: 0;
138 margin: 0;
132 padding: 0;
139 padding: 0;
133 }
140 }
134
141
135 .main-content {
142 .main-content {
136 padding-bottom: @pagepadding;
143 padding-bottom: @pagepadding;
137 }
144 }
138
145
139 .wide-mode-wrapper {
146 .wide-mode-wrapper {
140 max-width:4000px !important;
147 max-width:4000px !important;
141 }
148 }
142
149
143 .wrapper {
150 .wrapper {
144 position: relative;
151 position: relative;
145 max-width: @wrapper-maxwidth;
152 max-width: @wrapper-maxwidth;
146 margin: 0 auto;
153 margin: 0 auto;
147 }
154 }
148
155
149 #content {
156 #content {
150 clear: both;
157 clear: both;
151 padding: 0 @contentpadding;
158 padding: 0 @contentpadding;
152 }
159 }
153
160
154 .advanced-settings-fields{
161 .advanced-settings-fields{
155 input{
162 input{
156 margin-left: @textmargin;
163 margin-left: @textmargin;
157 margin-right: @padding/2;
164 margin-right: @padding/2;
158 }
165 }
159 }
166 }
160
167
161 .cs_files_title {
168 .cs_files_title {
162 margin: @pagepadding 0 0;
169 margin: @pagepadding 0 0;
163 }
170 }
164
171
165 input.inline[type="file"] {
172 input.inline[type="file"] {
166 display: inline;
173 display: inline;
167 }
174 }
168
175
169 .error_page {
176 .error_page {
170 margin: 10% auto;
177 margin: 10% auto;
171
178
172 h1 {
179 h1 {
173 color: @grey2;
180 color: @grey2;
174 }
181 }
175
182
176 .alert {
183 .alert {
177 margin: @padding 0;
184 margin: @padding 0;
178 }
185 }
179
186
180 .error-branding {
187 .error-branding {
181 color: @grey4;
188 color: @grey4;
182 font-weight: @text-semibold-weight;
189 font-weight: @text-semibold-weight;
183 font-family: @text-semibold;
190 font-family: @text-semibold;
184 }
191 }
185
192
186 .error_message {
193 .error_message {
187 font-family: @text-regular;
194 font-family: @text-regular;
188 }
195 }
189
196
190 .sidebar {
197 .sidebar {
191 min-height: 275px;
198 min-height: 275px;
192 margin: 0;
199 margin: 0;
193 padding: 0 0 @sidebarpadding @sidebarpadding;
200 padding: 0 0 @sidebarpadding @sidebarpadding;
194 border: none;
201 border: none;
195 }
202 }
196
203
197 .main-content {
204 .main-content {
198 position: relative;
205 position: relative;
199 margin: 0 @sidebarpadding @sidebarpadding;
206 margin: 0 @sidebarpadding @sidebarpadding;
200 padding: 0 0 0 @sidebarpadding;
207 padding: 0 0 0 @sidebarpadding;
201 border-left: @border-thickness solid @grey5;
208 border-left: @border-thickness solid @grey5;
202
209
203 @media (max-width:767px) {
210 @media (max-width:767px) {
204 clear: both;
211 clear: both;
205 width: 100%;
212 width: 100%;
206 margin: 0;
213 margin: 0;
207 border: none;
214 border: none;
208 }
215 }
209 }
216 }
210
217
211 .inner-column {
218 .inner-column {
212 float: left;
219 float: left;
213 width: 29.75%;
220 width: 29.75%;
214 min-height: 150px;
221 min-height: 150px;
215 margin: @sidebarpadding 2% 0 0;
222 margin: @sidebarpadding 2% 0 0;
216 padding: 0 2% 0 0;
223 padding: 0 2% 0 0;
217 border-right: @border-thickness solid @grey5;
224 border-right: @border-thickness solid @grey5;
218
225
219 @media (max-width:767px) {
226 @media (max-width:767px) {
220 clear: both;
227 clear: both;
221 width: 100%;
228 width: 100%;
222 border: none;
229 border: none;
223 }
230 }
224
231
225 ul {
232 ul {
226 padding-left: 1.25em;
233 padding-left: 1.25em;
227 }
234 }
228
235
229 &:last-child {
236 &:last-child {
230 margin: @sidebarpadding 0 0;
237 margin: @sidebarpadding 0 0;
231 border: none;
238 border: none;
232 }
239 }
233
240
234 h4 {
241 h4 {
235 margin: 0 0 @padding;
242 margin: 0 0 @padding;
236 font-weight: @text-semibold-weight;
243 font-weight: @text-semibold-weight;
237 font-family: @text-semibold;
244 font-family: @text-semibold;
238 }
245 }
239 }
246 }
240 }
247 }
241 .error-page-logo {
248 .error-page-logo {
242 width: 130px;
249 width: 130px;
243 height: 160px;
250 height: 160px;
244 }
251 }
245
252
246 // HEADER
253 // HEADER
247 .header {
254 .header {
248
255
249 // TODO: johbo: Fix login pages, so that they work without a min-height
256 // TODO: johbo: Fix login pages, so that they work without a min-height
250 // for the header and then remove the min-height. I chose a smaller value
257 // for the header and then remove the min-height. I chose a smaller value
251 // intentionally here to avoid rendering issues in the main navigation.
258 // intentionally here to avoid rendering issues in the main navigation.
252 min-height: 49px;
259 min-height: 49px;
253 min-width: 1024px;
260 min-width: 1024px;
254
261
255 position: relative;
262 position: relative;
256 vertical-align: bottom;
263 vertical-align: bottom;
257 padding: 0 @header-padding;
264 padding: 0 @header-padding;
258 background-color: @grey1;
265 background-color: @grey1;
259 color: @grey5;
266 color: @grey5;
260
267
261 .title {
268 .title {
262 overflow: visible;
269 overflow: visible;
263 }
270 }
264
271
265 &:before,
272 &:before,
266 &:after {
273 &:after {
267 content: "";
274 content: "";
268 clear: both;
275 clear: both;
269 width: 100%;
276 width: 100%;
270 }
277 }
271
278
272 // TODO: johbo: Avoids breaking "Repositories" chooser
279 // TODO: johbo: Avoids breaking "Repositories" chooser
273 .select2-container .select2-choice .select2-arrow {
280 .select2-container .select2-choice .select2-arrow {
274 display: none;
281 display: none;
275 }
282 }
276 }
283 }
277
284
278 #header-inner {
285 #header-inner {
279 &.title {
286 &.title {
280 margin: 0;
287 margin: 0;
281 }
288 }
282 &:before,
289 &:before,
283 &:after {
290 &:after {
284 content: "";
291 content: "";
285 clear: both;
292 clear: both;
286 }
293 }
287 }
294 }
288
295
289 // Gists
296 // Gists
290 #files_data {
297 #files_data {
291 clear: both; //for firefox
298 clear: both; //for firefox
292 padding-top: 10px;
299 padding-top: 10px;
293 }
300 }
294
301
295 #gistid {
302 #gistid {
296 margin-right: @padding;
303 margin-right: @padding;
297 }
304 }
298
305
299 // Global Settings Editor
306 // Global Settings Editor
300 .textarea.editor {
307 .textarea.editor {
301 float: left;
308 float: left;
302 position: relative;
309 position: relative;
303 max-width: @texteditor-width;
310 max-width: @texteditor-width;
304
311
305 select {
312 select {
306 position: absolute;
313 position: absolute;
307 top:10px;
314 top:10px;
308 right:0;
315 right:0;
309 }
316 }
310
317
311 .CodeMirror {
318 .CodeMirror {
312 margin: 0;
319 margin: 0;
313 }
320 }
314
321
315 .help-block {
322 .help-block {
316 margin: 0 0 @padding;
323 margin: 0 0 @padding;
317 padding:.5em;
324 padding:.5em;
318 background-color: @grey6;
325 background-color: @grey6;
319 &.pre-formatting {
326 &.pre-formatting {
320 white-space: pre;
327 white-space: pre;
321 }
328 }
322 }
329 }
323 }
330 }
324
331
325 ul.auth_plugins {
332 ul.auth_plugins {
326 margin: @padding 0 @padding @legend-width;
333 margin: @padding 0 @padding @legend-width;
327 padding: 0;
334 padding: 0;
328
335
329 li {
336 li {
330 margin-bottom: @padding;
337 margin-bottom: @padding;
331 line-height: 1em;
338 line-height: 1em;
332 list-style-type: none;
339 list-style-type: none;
333
340
334 .auth_buttons .btn {
341 .auth_buttons .btn {
335 margin-right: @padding;
342 margin-right: @padding;
336 }
343 }
337
344
338 }
345 }
339 }
346 }
340
347
341
348
342 // My Account PR list
349 // My Account PR list
343
350
344 #show_closed {
351 #show_closed {
345 margin: 0 1em 0 0;
352 margin: 0 1em 0 0;
346 }
353 }
347
354
348 #pull_request_list_table {
355 #pull_request_list_table {
349 .closed {
356 .closed {
350 background-color: @grey6;
357 background-color: @grey6;
351 }
358 }
352
359
353 .state-creating,
360 .state-creating,
354 .state-updating,
361 .state-updating,
355 .state-merging
362 .state-merging
356 {
363 {
357 background-color: @grey6;
364 background-color: @grey6;
358 }
365 }
359
366
360 .td-status {
367 .td-status {
361 padding-left: .5em;
368 padding-left: .5em;
362 }
369 }
363 .log-container .truncate {
370 .log-container .truncate {
364 height: 2.75em;
371 height: 2.75em;
365 white-space: pre-line;
372 white-space: pre-line;
366 }
373 }
367 table.rctable .user {
374 table.rctable .user {
368 padding-left: 0;
375 padding-left: 0;
369 }
376 }
370 table.rctable {
377 table.rctable {
371 td.td-description,
378 td.td-description,
372 .rc-user {
379 .rc-user {
373 min-width: auto;
380 min-width: auto;
374 }
381 }
375 }
382 }
376 }
383 }
377
384
378 // Pull Requests
385 // Pull Requests
379
386
380 .pullrequests_section_head {
387 .pullrequests_section_head {
381 display: block;
388 display: block;
382 clear: both;
389 clear: both;
383 margin: @padding 0;
390 margin: @padding 0;
384 font-weight: @text-bold-weight;
391 font-weight: @text-bold-weight;
385 font-family: @text-bold;
392 font-family: @text-bold;
386 }
393 }
387
394
388 .pr-commit-flow {
395 .pr-commit-flow {
389 position: relative;
396 position: relative;
390 font-weight: 600;
397 font-weight: 600;
391
398
392 .tag {
399 .tag {
393 display: inline-block;
400 display: inline-block;
394 margin: 0 1em .5em 0;
401 margin: 0 1em .5em 0;
395 }
402 }
396
403
397 .clone-url {
404 .clone-url {
398 display: inline-block;
405 display: inline-block;
399 margin: 0 0 .5em 0;
406 margin: 0 0 .5em 0;
400 padding: 0;
407 padding: 0;
401 line-height: 1.2em;
408 line-height: 1.2em;
402 }
409 }
403 }
410 }
404
411
405 .pr-mergeinfo {
412 .pr-mergeinfo {
406 min-width: 95% !important;
413 min-width: 95% !important;
407 padding: 0 !important;
414 padding: 0 !important;
408 border: 0;
415 border: 0;
409 }
416 }
410 .pr-mergeinfo-copy {
417 .pr-mergeinfo-copy {
411 padding: 0 0;
418 padding: 0 0;
412 }
419 }
413
420
414 .pr-pullinfo {
421 .pr-pullinfo {
415 min-width: 95% !important;
422 min-width: 95% !important;
416 padding: 0 !important;
423 padding: 0 !important;
417 border: 0;
424 border: 0;
418 }
425 }
419 .pr-pullinfo-copy {
426 .pr-pullinfo-copy {
420 padding: 0 0;
427 padding: 0 0;
421 }
428 }
422
429
423 .pr-title-input {
430 .pr-title-input {
424 width: 100%;
431 width: 100%;
425 font-size: 18px;
432 font-size: 18px;
426 margin: 0 0 4px 0;
433 margin: 0 0 4px 0;
427 padding: 0;
434 padding: 0;
428 line-height: 1.7em;
435 line-height: 1.7em;
429 color: @text-color;
436 color: @text-color;
430 letter-spacing: .02em;
437 letter-spacing: .02em;
431 font-weight: @text-bold-weight;
438 font-weight: @text-bold-weight;
432 font-family: @text-bold;
439 font-family: @text-bold;
433
440
434 &:hover {
441 &:hover {
435 box-shadow: none;
442 box-shadow: none;
436 }
443 }
437 }
444 }
438
445
439 #pr-title {
446 #pr-title {
440 input {
447 input {
441 border: 1px transparent;
448 border: 1px transparent;
442 color: black;
449 color: black;
443 opacity: 1;
450 opacity: 1;
444 background: #fff;
451 background: #fff;
445 font-size: 18px;
452 font-size: 18px;
446 }
453 }
447 }
454 }
448
455
449 .pr-title-closed-tag {
456 .pr-title-closed-tag {
450 font-size: 16px;
457 font-size: 16px;
451 }
458 }
452
459
453 #pr-desc {
460 #pr-desc {
454 padding: 10px 0;
461 padding: 10px 0;
455
462
456 .markdown-block {
463 .markdown-block {
457 padding: 0;
464 padding: 0;
458 margin-bottom: -30px;
465 margin-bottom: -30px;
459 }
466 }
460 }
467 }
461
468
462 #pullrequest_title {
469 #pullrequest_title {
463 width: 100%;
470 width: 100%;
464 box-sizing: border-box;
471 box-sizing: border-box;
465 }
472 }
466
473
467 #pr_open_message {
474 #pr_open_message {
468 border: @border-thickness solid #fff;
475 border: @border-thickness solid #fff;
469 border-radius: @border-radius;
476 border-radius: @border-radius;
470 text-align: left;
477 text-align: left;
471 overflow: hidden;
478 overflow: hidden;
472 white-space: pre-line;
479 white-space: pre-line;
473 }
480 }
474
481
475 .pr-details-title {
482 .pr-details-title {
476 height: 16px
483 height: 16px
477 }
484 }
478
485
479 .pr-details-title-author-pref {
486 .pr-details-title-author-pref {
480 padding-right: 10px
487 padding-right: 10px
481 }
488 }
482
489
483 .label-pr-detail {
490 .label-pr-detail {
484 display: table-cell;
491 display: table-cell;
485 width: 120px;
492 width: 120px;
486 padding-top: 7.5px;
493 padding-top: 7.5px;
487 padding-bottom: 7.5px;
494 padding-bottom: 7.5px;
488 padding-right: 7.5px;
495 padding-right: 7.5px;
489 }
496 }
490
497
491 .source-details ul {
498 .source-details ul {
492 padding: 10px 16px;
499 padding: 10px 16px;
493 }
500 }
494
501
495 .source-details-action {
502 .source-details-action {
496 color: @grey4;
503 color: @grey4;
497 font-size: 11px
504 font-size: 11px
498 }
505 }
499
506
500 .pr-submit-button {
507 .pr-submit-button {
501 float: right;
508 float: right;
502 margin: 0 0 0 5px;
509 margin: 0 0 0 5px;
503 }
510 }
504
511
505 .pr-spacing-container {
512 .pr-spacing-container {
506 padding: 20px;
513 padding: 20px;
507 clear: both
514 clear: both
508 }
515 }
509
516
510 #pr-description-input {
517 #pr-description-input {
511 margin-bottom: 0;
518 margin-bottom: 0;
512 }
519 }
513
520
514 .pr-description-label {
521 .pr-description-label {
515 vertical-align: top;
522 vertical-align: top;
516 }
523 }
517
524
518 #open_edit_pullrequest {
525 #open_edit_pullrequest {
519 padding: 0;
526 padding: 0;
520 }
527 }
521
528
522 #close_edit_pullrequest {
529 #close_edit_pullrequest {
523
530
524 }
531 }
525
532
526 #delete_pullrequest {
533 #delete_pullrequest {
527 clear: inherit;
534 clear: inherit;
528
535
529 form {
536 form {
530 display: inline;
537 display: inline;
531 }
538 }
532
539
533 }
540 }
534
541
535 .perms_section_head {
542 .perms_section_head {
536 min-width: 625px;
543 min-width: 625px;
537
544
538 h2 {
545 h2 {
539 margin-bottom: 0;
546 margin-bottom: 0;
540 }
547 }
541
548
542 .label-checkbox {
549 .label-checkbox {
543 float: left;
550 float: left;
544 }
551 }
545
552
546 &.field {
553 &.field {
547 margin: @space 0 @padding;
554 margin: @space 0 @padding;
548 }
555 }
549
556
550 &:first-child.field {
557 &:first-child.field {
551 margin-top: 0;
558 margin-top: 0;
552
559
553 .label {
560 .label {
554 margin-top: 0;
561 margin-top: 0;
555 padding-top: 0;
562 padding-top: 0;
556 }
563 }
557
564
558 .radios {
565 .radios {
559 padding-top: 0;
566 padding-top: 0;
560 }
567 }
561 }
568 }
562
569
563 .radios {
570 .radios {
564 position: relative;
571 position: relative;
565 width: 505px;
572 width: 505px;
566 }
573 }
567 }
574 }
568
575
569 //--- MODULES ------------------//
576 //--- MODULES ------------------//
570
577
571
578
572 // Server Announcement
579 // Server Announcement
573 #server-announcement {
580 #server-announcement {
574 width: 95%;
581 width: 95%;
575 margin: @padding auto;
582 margin: @padding auto;
576 padding: @padding;
583 padding: @padding;
577 border-width: 2px;
584 border-width: 2px;
578 border-style: solid;
585 border-style: solid;
579 .border-radius(2px);
586 .border-radius(2px);
580 font-weight: @text-bold-weight;
587 font-weight: @text-bold-weight;
581 font-family: @text-bold;
588 font-family: @text-bold;
582
589
583 &.info { border-color: @alert4; background-color: @alert4-inner; }
590 &.info { border-color: @alert4; background-color: @alert4-inner; }
584 &.warning { border-color: @alert3; background-color: @alert3-inner; }
591 &.warning { border-color: @alert3; background-color: @alert3-inner; }
585 &.error { border-color: @alert2; background-color: @alert2-inner; }
592 &.error { border-color: @alert2; background-color: @alert2-inner; }
586 &.success { border-color: @alert1; background-color: @alert1-inner; }
593 &.success { border-color: @alert1; background-color: @alert1-inner; }
587 &.neutral { border-color: @grey3; background-color: @grey6; }
594 &.neutral { border-color: @grey3; background-color: @grey6; }
588 }
595 }
589
596
590 // Fixed Sidebar Column
597 // Fixed Sidebar Column
591 .sidebar-col-wrapper {
598 .sidebar-col-wrapper {
592 padding-left: @sidebar-all-width;
599 padding-left: @sidebar-all-width;
593
600
594 .sidebar {
601 .sidebar {
595 width: @sidebar-width;
602 width: @sidebar-width;
596 margin-left: -@sidebar-all-width;
603 margin-left: -@sidebar-all-width;
597 }
604 }
598 }
605 }
599
606
600 .sidebar-col-wrapper.scw-small {
607 .sidebar-col-wrapper.scw-small {
601 padding-left: @sidebar-small-all-width;
608 padding-left: @sidebar-small-all-width;
602
609
603 .sidebar {
610 .sidebar {
604 width: @sidebar-small-width;
611 width: @sidebar-small-width;
605 margin-left: -@sidebar-small-all-width;
612 margin-left: -@sidebar-small-all-width;
606 }
613 }
607 }
614 }
608
615
609
616
610 // FOOTER
617 // FOOTER
611 #footer {
618 #footer {
612 padding: 0;
619 padding: 0;
613 text-align: center;
620 text-align: center;
614 vertical-align: middle;
621 vertical-align: middle;
615 color: @grey2;
622 color: @grey2;
616 font-size: 11px;
623 font-size: 11px;
617
624
618 p {
625 p {
619 margin: 0;
626 margin: 0;
620 padding: 1em;
627 padding: 1em;
621 line-height: 1em;
628 line-height: 1em;
622 }
629 }
623
630
624 .server-instance { //server instance
631 .server-instance { //server instance
625 display: none;
632 display: none;
626 }
633 }
627
634
628 .title {
635 .title {
629 float: none;
636 float: none;
630 margin: 0 auto;
637 margin: 0 auto;
631 }
638 }
632 }
639 }
633
640
634 button.close {
641 button.close {
635 padding: 0;
642 padding: 0;
636 cursor: pointer;
643 cursor: pointer;
637 background: transparent;
644 background: transparent;
638 border: 0;
645 border: 0;
639 .box-shadow(none);
646 .box-shadow(none);
640 -webkit-appearance: none;
647 -webkit-appearance: none;
641 }
648 }
642
649
643 .close {
650 .close {
644 float: right;
651 float: right;
645 font-size: 21px;
652 font-size: 21px;
646 font-family: @text-bootstrap;
653 font-family: @text-bootstrap;
647 line-height: 1em;
654 line-height: 1em;
648 font-weight: bold;
655 font-weight: bold;
649 color: @grey2;
656 color: @grey2;
650
657
651 &:hover,
658 &:hover,
652 &:focus {
659 &:focus {
653 color: @grey1;
660 color: @grey1;
654 text-decoration: none;
661 text-decoration: none;
655 cursor: pointer;
662 cursor: pointer;
656 }
663 }
657 }
664 }
658
665
659 // GRID
666 // GRID
660 .sorting,
667 .sorting,
661 .sorting_desc,
668 .sorting_desc,
662 .sorting_asc {
669 .sorting_asc {
663 cursor: pointer;
670 cursor: pointer;
664 }
671 }
665 .sorting_desc:after {
672 .sorting_desc:after {
666 content: "\00A0\25B2";
673 content: "\00A0\25B2";
667 font-size: .75em;
674 font-size: .75em;
668 }
675 }
669 .sorting_asc:after {
676 .sorting_asc:after {
670 content: "\00A0\25BC";
677 content: "\00A0\25BC";
671 font-size: .68em;
678 font-size: .68em;
672 }
679 }
673
680
674
681
675 .user_auth_tokens {
682 .user_auth_tokens {
676
683
677 &.truncate {
684 &.truncate {
678 white-space: nowrap;
685 white-space: nowrap;
679 overflow: hidden;
686 overflow: hidden;
680 text-overflow: ellipsis;
687 text-overflow: ellipsis;
681 }
688 }
682
689
683 .fields .field .input {
690 .fields .field .input {
684 margin: 0;
691 margin: 0;
685 }
692 }
686
693
687 input#description {
694 input#description {
688 width: 100px;
695 width: 100px;
689 margin: 0;
696 margin: 0;
690 }
697 }
691
698
692 .drop-menu {
699 .drop-menu {
693 // TODO: johbo: Remove this, should work out of the box when
700 // TODO: johbo: Remove this, should work out of the box when
694 // having multiple inputs inline
701 // having multiple inputs inline
695 margin: 0 0 0 5px;
702 margin: 0 0 0 5px;
696 }
703 }
697 }
704 }
698 #user_list_table {
705 #user_list_table {
699 .closed {
706 .closed {
700 background-color: @grey6;
707 background-color: @grey6;
701 }
708 }
702 }
709 }
703
710
704
711
705 input, textarea {
712 input, textarea {
706 &.disabled {
713 &.disabled {
707 opacity: .5;
714 opacity: .5;
708 }
715 }
709
716
710 &:hover {
717 &:hover {
711 border-color: @grey3;
718 border-color: @grey3;
712 box-shadow: @button-shadow;
719 box-shadow: @button-shadow;
713 }
720 }
714
721
715 &:focus {
722 &:focus {
716 border-color: @rcblue;
723 border-color: @rcblue;
717 box-shadow: @button-shadow;
724 box-shadow: @button-shadow;
718 }
725 }
719 }
726 }
720
727
721 // remove extra padding in firefox
728 // remove extra padding in firefox
722 input::-moz-focus-inner { border:0; padding:0 }
729 input::-moz-focus-inner { border:0; padding:0 }
723
730
724 .adjacent input {
731 .adjacent input {
725 margin-bottom: @padding;
732 margin-bottom: @padding;
726 }
733 }
727
734
728 .permissions_boxes {
735 .permissions_boxes {
729 display: block;
736 display: block;
730 }
737 }
731
738
732 //FORMS
739 //FORMS
733
740
734 .medium-inline,
741 .medium-inline,
735 input#description.medium-inline {
742 input#description.medium-inline {
736 display: inline;
743 display: inline;
737 width: @medium-inline-input-width;
744 width: @medium-inline-input-width;
738 min-width: 100px;
745 min-width: 100px;
739 }
746 }
740
747
741 select {
748 select {
742 //reset
749 //reset
743 -webkit-appearance: none;
750 -webkit-appearance: none;
744 -moz-appearance: none;
751 -moz-appearance: none;
745
752
746 display: inline-block;
753 display: inline-block;
747 height: 28px;
754 height: 28px;
748 width: auto;
755 width: auto;
749 margin: 0 @padding @padding 0;
756 margin: 0 @padding @padding 0;
750 padding: 0 18px 0 8px;
757 padding: 0 18px 0 8px;
751 line-height:1em;
758 line-height:1em;
752 font-size: @basefontsize;
759 font-size: @basefontsize;
753 border: @border-thickness solid @grey5;
760 border: @border-thickness solid @grey5;
754 border-radius: @border-radius;
761 border-radius: @border-radius;
755 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
762 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
756 color: @grey4;
763 color: @grey4;
757 box-shadow: @button-shadow;
764 box-shadow: @button-shadow;
758
765
759 &:after {
766 &:after {
760 content: "\00A0\25BE";
767 content: "\00A0\25BE";
761 }
768 }
762
769
763 &:focus, &:hover {
770 &:focus, &:hover {
764 outline: none;
771 outline: none;
765 border-color: @grey4;
772 border-color: @grey4;
766 color: @rcdarkblue;
773 color: @rcdarkblue;
767 }
774 }
768 }
775 }
769
776
770 option {
777 option {
771 &:focus {
778 &:focus {
772 outline: none;
779 outline: none;
773 }
780 }
774 }
781 }
775
782
776 input,
783 input,
777 textarea {
784 textarea {
778 padding: @input-padding;
785 padding: @input-padding;
779 border: @input-border-thickness solid @border-highlight-color;
786 border: @input-border-thickness solid @border-highlight-color;
780 .border-radius (@border-radius);
787 .border-radius (@border-radius);
781 font-family: @text-light;
788 font-family: @text-light;
782 font-size: @basefontsize;
789 font-size: @basefontsize;
783
790
784 &.input-sm {
791 &.input-sm {
785 padding: 5px;
792 padding: 5px;
786 }
793 }
787
794
788 &#description {
795 &#description {
789 min-width: @input-description-minwidth;
796 min-width: @input-description-minwidth;
790 min-height: 1em;
797 min-height: 1em;
791 padding: 10px;
798 padding: 10px;
792 }
799 }
793 }
800 }
794
801
795 .field-sm {
802 .field-sm {
796 input,
803 input,
797 textarea {
804 textarea {
798 padding: 5px;
805 padding: 5px;
799 }
806 }
800 }
807 }
801
808
802 textarea {
809 textarea {
803 display: block;
810 display: block;
804 clear: both;
811 clear: both;
805 width: 100%;
812 width: 100%;
806 min-height: 100px;
813 min-height: 100px;
807 margin-bottom: @padding;
814 margin-bottom: @padding;
808 .box-sizing(border-box);
815 .box-sizing(border-box);
809 overflow: auto;
816 overflow: auto;
810 }
817 }
811
818
812 label {
819 label {
813 font-family: @text-light;
820 font-family: @text-light;
814 }
821 }
815
822
816 // GRAVATARS
823 // GRAVATARS
817 // centers gravatar on username to the right
824 // centers gravatar on username to the right
818
825
819 .gravatar {
826 .gravatar {
820 display: inline;
827 display: inline;
821 min-width: 16px;
828 min-width: 16px;
822 min-height: 16px;
829 min-height: 16px;
823 margin: -5px 0;
830 margin: -5px 0;
824 padding: 0;
831 padding: 0;
825 line-height: 1em;
832 line-height: 1em;
826 box-sizing: content-box;
833 box-sizing: content-box;
827 border-radius: 50%;
834 border-radius: 50%;
828
835
829 &.gravatar-large {
836 &.gravatar-large {
830 margin: -0.5em .25em -0.5em 0;
837 margin: -0.5em .25em -0.5em 0;
831 }
838 }
832
839
833 & + .user {
840 & + .user {
834 display: inline;
841 display: inline;
835 margin: 0;
842 margin: 0;
836 padding: 0 0 0 .17em;
843 padding: 0 0 0 .17em;
837 line-height: 1em;
844 line-height: 1em;
838 }
845 }
839
846
840 & + .no-margin {
847 & + .no-margin {
841 margin: 0
848 margin: 0
842 }
849 }
843
850
844 }
851 }
845
852
846 .user-inline-data {
853 .user-inline-data {
847 display: inline-block;
854 display: inline-block;
848 float: left;
855 float: left;
849 padding-left: .5em;
856 padding-left: .5em;
850 line-height: 1.3em;
857 line-height: 1.3em;
851 }
858 }
852
859
853 .rc-user { // gravatar + user wrapper
860 .rc-user { // gravatar + user wrapper
854 float: left;
861 float: left;
855 position: relative;
862 position: relative;
856 min-width: 100px;
863 min-width: 100px;
857 max-width: 200px;
864 max-width: 200px;
858 min-height: (@gravatar-size + @border-thickness * 2); // account for border
865 min-height: (@gravatar-size + @border-thickness * 2); // account for border
859 display: block;
866 display: block;
860 padding: 0 0 0 (@gravatar-size + @basefontsize/4);
867 padding: 0 0 0 (@gravatar-size + @basefontsize/4);
861
868
862
869
863 .gravatar {
870 .gravatar {
864 display: block;
871 display: block;
865 position: absolute;
872 position: absolute;
866 top: 0;
873 top: 0;
867 left: 0;
874 left: 0;
868 min-width: @gravatar-size;
875 min-width: @gravatar-size;
869 min-height: @gravatar-size;
876 min-height: @gravatar-size;
870 margin: 0;
877 margin: 0;
871 }
878 }
872
879
873 .user {
880 .user {
874 display: block;
881 display: block;
875 max-width: 175px;
882 max-width: 175px;
876 padding-top: 2px;
883 padding-top: 2px;
877 overflow: hidden;
884 overflow: hidden;
878 text-overflow: ellipsis;
885 text-overflow: ellipsis;
879 }
886 }
880 }
887 }
881
888
882 .gist-gravatar,
889 .gist-gravatar,
883 .journal_container {
890 .journal_container {
884 .gravatar-large {
891 .gravatar-large {
885 margin: 0 .5em -10px 0;
892 margin: 0 .5em -10px 0;
886 }
893 }
887 }
894 }
888
895
889 .gist-type-fields {
896 .gist-type-fields {
890 line-height: 30px;
897 line-height: 30px;
891 height: 30px;
898 height: 30px;
892
899
893 .gist-type-fields-wrapper {
900 .gist-type-fields-wrapper {
894 vertical-align: middle;
901 vertical-align: middle;
895 display: inline-block;
902 display: inline-block;
896 line-height: 25px;
903 line-height: 25px;
897 }
904 }
898 }
905 }
899
906
900 // ADMIN SETTINGS
907 // ADMIN SETTINGS
901
908
902 // Tag Patterns
909 // Tag Patterns
903 .tag_patterns {
910 .tag_patterns {
904 .tag_input {
911 .tag_input {
905 margin-bottom: @padding;
912 margin-bottom: @padding;
906 }
913 }
907 }
914 }
908
915
909 .locked_input {
916 .locked_input {
910 position: relative;
917 position: relative;
911
918
912 input {
919 input {
913 display: inline;
920 display: inline;
914 margin: 3px 5px 0px 0px;
921 margin: 3px 5px 0px 0px;
915 }
922 }
916
923
917 br {
924 br {
918 display: none;
925 display: none;
919 }
926 }
920
927
921 .error-message {
928 .error-message {
922 float: left;
929 float: left;
923 width: 100%;
930 width: 100%;
924 }
931 }
925
932
926 .lock_input_button {
933 .lock_input_button {
927 display: inline;
934 display: inline;
928 }
935 }
929
936
930 .help-block {
937 .help-block {
931 clear: both;
938 clear: both;
932 }
939 }
933 }
940 }
934
941
935 // Notifications
942 // Notifications
936
943
937 .notifications_buttons {
944 .notifications_buttons {
938 margin: 0 0 @space 0;
945 margin: 0 0 @space 0;
939 padding: 0;
946 padding: 0;
940
947
941 .btn {
948 .btn {
942 display: inline-block;
949 display: inline-block;
943 }
950 }
944 }
951 }
945
952
946 .notification-list {
953 .notification-list {
947
954
948 div {
955 div {
949 vertical-align: middle;
956 vertical-align: middle;
950 }
957 }
951
958
952 .container {
959 .container {
953 display: block;
960 display: block;
954 margin: 0 0 @padding 0;
961 margin: 0 0 @padding 0;
955 }
962 }
956
963
957 .delete-notifications {
964 .delete-notifications {
958 margin-left: @padding;
965 margin-left: @padding;
959 text-align: right;
966 text-align: right;
960 cursor: pointer;
967 cursor: pointer;
961 }
968 }
962
969
963 .read-notifications {
970 .read-notifications {
964 margin-left: @padding/2;
971 margin-left: @padding/2;
965 text-align: right;
972 text-align: right;
966 width: 35px;
973 width: 35px;
967 cursor: pointer;
974 cursor: pointer;
968 }
975 }
969
976
970 .icon-minus-sign {
977 .icon-minus-sign {
971 color: @alert2;
978 color: @alert2;
972 }
979 }
973
980
974 .icon-ok-sign {
981 .icon-ok-sign {
975 color: @alert1;
982 color: @alert1;
976 }
983 }
977 }
984 }
978
985
979 .user_settings {
986 .user_settings {
980 float: left;
987 float: left;
981 clear: both;
988 clear: both;
982 display: block;
989 display: block;
983 width: 100%;
990 width: 100%;
984
991
985 .gravatar_box {
992 .gravatar_box {
986 margin-bottom: @padding;
993 margin-bottom: @padding;
987
994
988 &:after {
995 &:after {
989 content: " ";
996 content: " ";
990 clear: both;
997 clear: both;
991 width: 100%;
998 width: 100%;
992 }
999 }
993 }
1000 }
994
1001
995 .fields .field {
1002 .fields .field {
996 clear: both;
1003 clear: both;
997 }
1004 }
998 }
1005 }
999
1006
1000 .advanced_settings {
1007 .advanced_settings {
1001 margin-bottom: @space;
1008 margin-bottom: @space;
1002
1009
1003 .help-block {
1010 .help-block {
1004 margin-left: 0;
1011 margin-left: 0;
1005 }
1012 }
1006
1013
1007 button + .help-block {
1014 button + .help-block {
1008 margin-top: @padding;
1015 margin-top: @padding;
1009 }
1016 }
1010 }
1017 }
1011
1018
1012 // admin settings radio buttons and labels
1019 // admin settings radio buttons and labels
1013 .label-2 {
1020 .label-2 {
1014 float: left;
1021 float: left;
1015 width: @label2-width;
1022 width: @label2-width;
1016
1023
1017 label {
1024 label {
1018 color: @grey1;
1025 color: @grey1;
1019 }
1026 }
1020 }
1027 }
1021 .checkboxes {
1028 .checkboxes {
1022 float: left;
1029 float: left;
1023 width: @checkboxes-width;
1030 width: @checkboxes-width;
1024 margin-bottom: @padding;
1031 margin-bottom: @padding;
1025
1032
1026 .checkbox {
1033 .checkbox {
1027 width: 100%;
1034 width: 100%;
1028
1035
1029 label {
1036 label {
1030 margin: 0;
1037 margin: 0;
1031 padding: 0;
1038 padding: 0;
1032 }
1039 }
1033 }
1040 }
1034
1041
1035 .checkbox + .checkbox {
1042 .checkbox + .checkbox {
1036 display: inline-block;
1043 display: inline-block;
1037 }
1044 }
1038
1045
1039 label {
1046 label {
1040 margin-right: 1em;
1047 margin-right: 1em;
1041 }
1048 }
1042 }
1049 }
1043
1050
1044 // CHANGELOG
1051 // CHANGELOG
1045 .container_header {
1052 .container_header {
1046 float: left;
1053 float: left;
1047 display: block;
1054 display: block;
1048 width: 100%;
1055 width: 100%;
1049 margin: @padding 0 @padding;
1056 margin: @padding 0 @padding;
1050
1057
1051 #filter_changelog {
1058 #filter_changelog {
1052 float: left;
1059 float: left;
1053 margin-right: @padding;
1060 margin-right: @padding;
1054 }
1061 }
1055
1062
1056 .breadcrumbs_light {
1063 .breadcrumbs_light {
1057 display: inline-block;
1064 display: inline-block;
1058 }
1065 }
1059 }
1066 }
1060
1067
1061 .info_box {
1068 .info_box {
1062 float: right;
1069 float: right;
1063 }
1070 }
1064
1071
1065
1072
1066
1073
1067 #graph_content{
1074 #graph_content{
1068
1075
1069 // adjust for table headers so that graph renders properly
1076 // adjust for table headers so that graph renders properly
1070 // #graph_nodes padding - table cell padding
1077 // #graph_nodes padding - table cell padding
1071 padding-top: (@space - (@basefontsize * 2.4));
1078 padding-top: (@space - (@basefontsize * 2.4));
1072
1079
1073 &.graph_full_width {
1080 &.graph_full_width {
1074 width: 100%;
1081 width: 100%;
1075 max-width: 100%;
1082 max-width: 100%;
1076 }
1083 }
1077 }
1084 }
1078
1085
1079 #graph {
1086 #graph {
1080
1087
1081 .pagination-left {
1088 .pagination-left {
1082 float: left;
1089 float: left;
1083 clear: both;
1090 clear: both;
1084 }
1091 }
1085
1092
1086 .log-container {
1093 .log-container {
1087 max-width: 345px;
1094 max-width: 345px;
1088
1095
1089 .message{
1096 .message{
1090 max-width: 340px;
1097 max-width: 340px;
1091 }
1098 }
1092 }
1099 }
1093
1100
1094 .graph-col-wrapper {
1101 .graph-col-wrapper {
1095
1102
1096 #graph_nodes {
1103 #graph_nodes {
1097 width: 100px;
1104 width: 100px;
1098 position: absolute;
1105 position: absolute;
1099 left: 70px;
1106 left: 70px;
1100 z-index: -1;
1107 z-index: -1;
1101 }
1108 }
1102 }
1109 }
1103
1110
1104 .load-more-commits {
1111 .load-more-commits {
1105 text-align: center;
1112 text-align: center;
1106 }
1113 }
1107 .load-more-commits:hover {
1114 .load-more-commits:hover {
1108 background-color: @grey7;
1115 background-color: @grey7;
1109 }
1116 }
1110 .load-more-commits {
1117 .load-more-commits {
1111 a {
1118 a {
1112 display: block;
1119 display: block;
1113 }
1120 }
1114 }
1121 }
1115 }
1122 }
1116
1123
1117 .obsolete-toggle {
1124 .obsolete-toggle {
1118 line-height: 30px;
1125 line-height: 30px;
1119 margin-left: -15px;
1126 margin-left: -15px;
1120 }
1127 }
1121
1128
1122 #rev_range_container, #rev_range_clear, #rev_range_more {
1129 #rev_range_container, #rev_range_clear, #rev_range_more {
1123 margin-top: -5px;
1130 margin-top: -5px;
1124 margin-bottom: -5px;
1131 margin-bottom: -5px;
1125 }
1132 }
1126
1133
1127 #filter_changelog {
1134 #filter_changelog {
1128 float: left;
1135 float: left;
1129 }
1136 }
1130
1137
1131
1138
1132 //--- THEME ------------------//
1139 //--- THEME ------------------//
1133
1140
1134 #logo {
1141 #logo {
1135 float: left;
1142 float: left;
1136 margin: 9px 0 0 0;
1143 margin: 9px 0 0 0;
1137
1144
1138 .header {
1145 .header {
1139 background-color: transparent;
1146 background-color: transparent;
1140 }
1147 }
1141
1148
1142 a {
1149 a {
1143 display: inline-block;
1150 display: inline-block;
1144 }
1151 }
1145
1152
1146 img {
1153 img {
1147 height:30px;
1154 height:30px;
1148 }
1155 }
1149 }
1156 }
1150
1157
1151 .logo-wrapper {
1158 .logo-wrapper {
1152 float:left;
1159 float:left;
1153 }
1160 }
1154
1161
1155 .branding {
1162 .branding {
1156 float: left;
1163 float: left;
1157 padding: 9px 2px;
1164 padding: 9px 2px;
1158 line-height: 1em;
1165 line-height: 1em;
1159 font-size: @navigation-fontsize;
1166 font-size: @navigation-fontsize;
1160
1167
1161 a {
1168 a {
1162 color: @grey5
1169 color: @grey5
1163 }
1170 }
1164 @media screen and (max-width: 1200px) {
1171 @media screen and (max-width: 1200px) {
1165 display: none;
1172 display: none;
1166 }
1173 }
1167 }
1174 }
1168
1175
1169 img {
1176 img {
1170 border: none;
1177 border: none;
1171 outline: none;
1178 outline: none;
1172 }
1179 }
1173 user-profile-header
1180 user-profile-header
1174 label {
1181 label {
1175
1182
1176 input[type="checkbox"] {
1183 input[type="checkbox"] {
1177 margin-right: 1em;
1184 margin-right: 1em;
1178 }
1185 }
1179 input[type="radio"] {
1186 input[type="radio"] {
1180 margin-right: 1em;
1187 margin-right: 1em;
1181 }
1188 }
1182 }
1189 }
1183
1190
1184 .review-status {
1191 .review-status {
1185 &.under_review {
1192 &.under_review {
1186 color: @alert3;
1193 color: @alert3;
1187 }
1194 }
1188 &.approved {
1195 &.approved {
1189 color: @alert1;
1196 color: @alert1;
1190 }
1197 }
1191 &.rejected,
1198 &.rejected,
1192 &.forced_closed{
1199 &.forced_closed{
1193 color: @alert2;
1200 color: @alert2;
1194 }
1201 }
1195 &.not_reviewed {
1202 &.not_reviewed {
1196 color: @grey5;
1203 color: @grey5;
1197 }
1204 }
1198 }
1205 }
1199
1206
1200 .review-status-under_review {
1207 .review-status-under_review {
1201 color: @alert3;
1208 color: @alert3;
1202 }
1209 }
1203 .status-tag-under_review {
1210 .status-tag-under_review {
1204 border-color: @alert3;
1211 border-color: @alert3;
1205 }
1212 }
1206
1213
1207 .review-status-approved {
1214 .review-status-approved {
1208 color: @alert1;
1215 color: @alert1;
1209 }
1216 }
1210 .status-tag-approved {
1217 .status-tag-approved {
1211 border-color: @alert1;
1218 border-color: @alert1;
1212 }
1219 }
1213
1220
1214 .review-status-rejected,
1221 .review-status-rejected,
1215 .review-status-forced_closed {
1222 .review-status-forced_closed {
1216 color: @alert2;
1223 color: @alert2;
1217 }
1224 }
1218 .status-tag-rejected,
1225 .status-tag-rejected,
1219 .status-tag-forced_closed {
1226 .status-tag-forced_closed {
1220 border-color: @alert2;
1227 border-color: @alert2;
1221 }
1228 }
1222
1229
1223 .review-status-not_reviewed {
1230 .review-status-not_reviewed {
1224 color: @grey5;
1231 color: @grey5;
1225 }
1232 }
1226 .status-tag-not_reviewed {
1233 .status-tag-not_reviewed {
1227 border-color: @grey5;
1234 border-color: @grey5;
1228 }
1235 }
1229
1236
1230 .test_pattern_preview {
1237 .test_pattern_preview {
1231 margin: @space 0;
1238 margin: @space 0;
1232
1239
1233 p {
1240 p {
1234 margin-bottom: 0;
1241 margin-bottom: 0;
1235 border-bottom: @border-thickness solid @border-default-color;
1242 border-bottom: @border-thickness solid @border-default-color;
1236 color: @grey3;
1243 color: @grey3;
1237 }
1244 }
1238
1245
1239 .btn {
1246 .btn {
1240 margin-bottom: @padding;
1247 margin-bottom: @padding;
1241 }
1248 }
1242 }
1249 }
1243 #test_pattern_result {
1250 #test_pattern_result {
1244 display: none;
1251 display: none;
1245 &:extend(pre);
1252 &:extend(pre);
1246 padding: .9em;
1253 padding: .9em;
1247 color: @grey3;
1254 color: @grey3;
1248 background-color: @grey7;
1255 background-color: @grey7;
1249 border-right: @border-thickness solid @border-default-color;
1256 border-right: @border-thickness solid @border-default-color;
1250 border-bottom: @border-thickness solid @border-default-color;
1257 border-bottom: @border-thickness solid @border-default-color;
1251 border-left: @border-thickness solid @border-default-color;
1258 border-left: @border-thickness solid @border-default-color;
1252 }
1259 }
1253
1260
1254 #repo_vcs_settings {
1261 #repo_vcs_settings {
1255 #inherit_overlay_vcs_default {
1262 #inherit_overlay_vcs_default {
1256 display: none;
1263 display: none;
1257 }
1264 }
1258 #inherit_overlay_vcs_custom {
1265 #inherit_overlay_vcs_custom {
1259 display: custom;
1266 display: custom;
1260 }
1267 }
1261 &.inherited {
1268 &.inherited {
1262 #inherit_overlay_vcs_default {
1269 #inherit_overlay_vcs_default {
1263 display: block;
1270 display: block;
1264 }
1271 }
1265 #inherit_overlay_vcs_custom {
1272 #inherit_overlay_vcs_custom {
1266 display: none;
1273 display: none;
1267 }
1274 }
1268 }
1275 }
1269 }
1276 }
1270
1277
1271 .issue-tracker-link {
1278 .issue-tracker-link {
1272 color: @rcblue;
1279 color: @rcblue;
1273 }
1280 }
1274
1281
1275 // Issue Tracker Table Show/Hide
1282 // Issue Tracker Table Show/Hide
1276 #repo_issue_tracker {
1283 #repo_issue_tracker {
1277 #inherit_overlay {
1284 #inherit_overlay {
1278 display: none;
1285 display: none;
1279 }
1286 }
1280 #custom_overlay {
1287 #custom_overlay {
1281 display: custom;
1288 display: custom;
1282 }
1289 }
1283 &.inherited {
1290 &.inherited {
1284 #inherit_overlay {
1291 #inherit_overlay {
1285 display: block;
1292 display: block;
1286 }
1293 }
1287 #custom_overlay {
1294 #custom_overlay {
1288 display: none;
1295 display: none;
1289 }
1296 }
1290 }
1297 }
1291 }
1298 }
1292 table.issuetracker {
1299 table.issuetracker {
1293 &.readonly {
1300 &.readonly {
1294 tr, td {
1301 tr, td {
1295 color: @grey3;
1302 color: @grey3;
1296 }
1303 }
1297 }
1304 }
1298 .edit {
1305 .edit {
1299 display: none;
1306 display: none;
1300 }
1307 }
1301 .editopen {
1308 .editopen {
1302 .edit {
1309 .edit {
1303 display: inline;
1310 display: inline;
1304 }
1311 }
1305 .entry {
1312 .entry {
1306 display: none;
1313 display: none;
1307 }
1314 }
1308 }
1315 }
1309 tr td.td-action {
1316 tr td.td-action {
1310 min-width: 117px;
1317 min-width: 117px;
1311 }
1318 }
1312 td input {
1319 td input {
1313 max-width: none;
1320 max-width: none;
1314 min-width: 30px;
1321 min-width: 30px;
1315 width: 80%;
1322 width: 80%;
1316 }
1323 }
1317 .issuetracker_pref input {
1324 .issuetracker_pref input {
1318 width: 40%;
1325 width: 40%;
1319 }
1326 }
1320 input.edit_issuetracker_update {
1327 input.edit_issuetracker_update {
1321 margin-right: 0;
1328 margin-right: 0;
1322 width: auto;
1329 width: auto;
1323 }
1330 }
1324 }
1331 }
1325
1332
1326 table.integrations {
1333 table.integrations {
1327 .td-icon {
1334 .td-icon {
1328 width: 20px;
1335 width: 20px;
1329 .integration-icon {
1336 .integration-icon {
1330 height: 20px;
1337 height: 20px;
1331 width: 20px;
1338 width: 20px;
1332 }
1339 }
1333 }
1340 }
1334 }
1341 }
1335
1342
1336 .integrations {
1343 .integrations {
1337 a.integration-box {
1344 a.integration-box {
1338 color: @text-color;
1345 color: @text-color;
1339 &:hover {
1346 &:hover {
1340 .panel {
1347 .panel {
1341 background: #fbfbfb;
1348 background: #fbfbfb;
1342 }
1349 }
1343 }
1350 }
1344 .integration-icon {
1351 .integration-icon {
1345 width: 30px;
1352 width: 30px;
1346 height: 30px;
1353 height: 30px;
1347 margin-right: 20px;
1354 margin-right: 20px;
1348 float: left;
1355 float: left;
1349 }
1356 }
1350
1357
1351 .panel-body {
1358 .panel-body {
1352 padding: 10px;
1359 padding: 10px;
1353 }
1360 }
1354 .panel {
1361 .panel {
1355 margin-bottom: 10px;
1362 margin-bottom: 10px;
1356 }
1363 }
1357 h2 {
1364 h2 {
1358 display: inline-block;
1365 display: inline-block;
1359 margin: 0;
1366 margin: 0;
1360 min-width: 140px;
1367 min-width: 140px;
1361 }
1368 }
1362 }
1369 }
1363 a.integration-box.dummy-integration {
1370 a.integration-box.dummy-integration {
1364 color: @grey4
1371 color: @grey4
1365 }
1372 }
1366 }
1373 }
1367
1374
1368 //Permissions Settings
1375 //Permissions Settings
1369 #add_perm {
1376 #add_perm {
1370 margin: 0 0 @padding;
1377 margin: 0 0 @padding;
1371 cursor: pointer;
1378 cursor: pointer;
1372 }
1379 }
1373
1380
1374 .perm_ac {
1381 .perm_ac {
1375 input {
1382 input {
1376 width: 95%;
1383 width: 95%;
1377 }
1384 }
1378 }
1385 }
1379
1386
1380 .autocomplete-suggestions {
1387 .autocomplete-suggestions {
1381 width: auto !important; // overrides autocomplete.js
1388 width: auto !important; // overrides autocomplete.js
1382 min-width: 278px;
1389 min-width: 278px;
1383 margin: 0;
1390 margin: 0;
1384 border: @border-thickness solid @grey5;
1391 border: @border-thickness solid @grey5;
1385 border-radius: @border-radius;
1392 border-radius: @border-radius;
1386 color: @grey2;
1393 color: @grey2;
1387 background-color: white;
1394 background-color: white;
1388 }
1395 }
1389
1396
1390 .autocomplete-qfilter-suggestions {
1397 .autocomplete-qfilter-suggestions {
1391 width: auto !important; // overrides autocomplete.js
1398 width: auto !important; // overrides autocomplete.js
1392 max-height: 100% !important;
1399 max-height: 100% !important;
1393 min-width: 376px;
1400 min-width: 376px;
1394 margin: 0;
1401 margin: 0;
1395 border: @border-thickness solid @grey5;
1402 border: @border-thickness solid @grey5;
1396 color: @grey2;
1403 color: @grey2;
1397 background-color: white;
1404 background-color: white;
1398 }
1405 }
1399
1406
1400 .autocomplete-selected {
1407 .autocomplete-selected {
1401 background: #F0F0F0;
1408 background: #F0F0F0;
1402 }
1409 }
1403
1410
1404 .ac-container-wrap {
1411 .ac-container-wrap {
1405 margin: 0;
1412 margin: 0;
1406 padding: 8px;
1413 padding: 8px;
1407 border-bottom: @border-thickness solid @grey5;
1414 border-bottom: @border-thickness solid @grey5;
1408 list-style-type: none;
1415 list-style-type: none;
1409 cursor: pointer;
1416 cursor: pointer;
1410
1417
1411 &:hover {
1418 &:hover {
1412 background-color: @grey7;
1419 background-color: @grey7;
1413 }
1420 }
1414
1421
1415 img {
1422 img {
1416 height: @gravatar-size;
1423 height: @gravatar-size;
1417 width: @gravatar-size;
1424 width: @gravatar-size;
1418 margin-right: 1em;
1425 margin-right: 1em;
1419 }
1426 }
1420
1427
1421 strong {
1428 strong {
1422 font-weight: normal;
1429 font-weight: normal;
1423 }
1430 }
1424 }
1431 }
1425
1432
1426 // Settings Dropdown
1433 // Settings Dropdown
1427 .user-menu .container {
1434 .user-menu .container {
1428 padding: 0 4px;
1435 padding: 0 4px;
1429 margin: 0;
1436 margin: 0;
1430 }
1437 }
1431
1438
1432 .user-menu .gravatar {
1439 .user-menu .gravatar {
1433 cursor: pointer;
1440 cursor: pointer;
1434 }
1441 }
1435
1442
1436 .codeblock {
1443 .codeblock {
1437 margin-bottom: @padding;
1444 margin-bottom: @padding;
1438 clear: both;
1445 clear: both;
1439
1446
1440 .stats {
1447 .stats {
1441 overflow: hidden;
1448 overflow: hidden;
1442 }
1449 }
1443
1450
1444 .message{
1451 .message{
1445 textarea{
1452 textarea{
1446 margin: 0;
1453 margin: 0;
1447 }
1454 }
1448 }
1455 }
1449
1456
1450 .code-header {
1457 .code-header {
1451 .stats {
1458 .stats {
1452 line-height: 2em;
1459 line-height: 2em;
1453
1460
1454 .revision_id {
1461 .revision_id {
1455 margin-left: 0;
1462 margin-left: 0;
1456 }
1463 }
1457 .buttons {
1464 .buttons {
1458 padding-right: 0;
1465 padding-right: 0;
1459 }
1466 }
1460 }
1467 }
1461
1468
1462 .item{
1469 .item{
1463 margin-right: 0.5em;
1470 margin-right: 0.5em;
1464 }
1471 }
1465 }
1472 }
1466
1473
1467 #editor_container {
1474 #editor_container {
1468 position: relative;
1475 position: relative;
1469 margin: @padding 10px;
1476 margin: @padding 10px;
1470 }
1477 }
1471 }
1478 }
1472
1479
1473 #file_history_container {
1480 #file_history_container {
1474 display: none;
1481 display: none;
1475 }
1482 }
1476
1483
1477 .file-history-inner {
1484 .file-history-inner {
1478 margin-bottom: 10px;
1485 margin-bottom: 10px;
1479 }
1486 }
1480
1487
1481 // Pull Requests
1488 // Pull Requests
1482 .summary-details {
1489 .summary-details {
1483 width: 72%;
1490 width: 72%;
1484 }
1491 }
1485 .pr-summary {
1492 .pr-summary {
1486 border-bottom: @border-thickness solid @grey5;
1493 border-bottom: @border-thickness solid @grey5;
1487 margin-bottom: @space;
1494 margin-bottom: @space;
1488 }
1495 }
1489
1496
1490 .reviewers-title {
1497 .reviewers-title {
1491 width: 25%;
1498 width: 25%;
1492 min-width: 200px;
1499 min-width: 200px;
1493
1500
1494 &.first-panel {
1501 &.first-panel {
1495 margin-top: 34px;
1502 margin-top: 34px;
1496 }
1503 }
1497 }
1504 }
1498
1505
1499 .reviewers {
1506 .reviewers {
1500 width: 25%;
1507 width: 25%;
1501 min-width: 200px;
1508 min-width: 200px;
1502 }
1509 }
1503 .reviewers ul li {
1510 .reviewers ul li {
1504 position: relative;
1511 position: relative;
1505 width: 100%;
1512 width: 100%;
1506 padding-bottom: 8px;
1513 padding-bottom: 8px;
1507 list-style-type: none;
1514 list-style-type: none;
1508 }
1515 }
1509
1516
1510 .reviewer_entry {
1517 .reviewer_entry {
1511 min-height: 55px;
1518 min-height: 55px;
1512 }
1519 }
1513
1520
1514 .reviewers_member {
1521 .reviewers_member {
1515 width: 100%;
1522 width: 100%;
1516 overflow: auto;
1523 overflow: auto;
1517 }
1524 }
1518 .reviewer_reason {
1525 .reviewer_reason {
1519 padding-left: 20px;
1526 padding-left: 20px;
1520 line-height: 1.5em;
1527 line-height: 1.5em;
1521 }
1528 }
1522 .reviewer_status {
1529 .reviewer_status {
1523 display: inline-block;
1530 display: inline-block;
1524 width: 25px;
1531 width: 25px;
1525 min-width: 25px;
1532 min-width: 25px;
1526 height: 1.2em;
1533 height: 1.2em;
1527 line-height: 1em;
1534 line-height: 1em;
1528 }
1535 }
1529
1536
1530 .reviewer_name {
1537 .reviewer_name {
1531 display: inline-block;
1538 display: inline-block;
1532 max-width: 83%;
1539 max-width: 83%;
1533 padding-right: 20px;
1540 padding-right: 20px;
1534 vertical-align: middle;
1541 vertical-align: middle;
1535 line-height: 1;
1542 line-height: 1;
1536
1543
1537 .rc-user {
1544 .rc-user {
1538 min-width: 0;
1545 min-width: 0;
1539 margin: -2px 1em 0 0;
1546 margin: -2px 1em 0 0;
1540 }
1547 }
1541
1548
1542 .reviewer {
1549 .reviewer {
1543 float: left;
1550 float: left;
1544 }
1551 }
1545 }
1552 }
1546
1553
1547 .reviewer_member_mandatory {
1554 .reviewer_member_mandatory {
1548 position: absolute;
1555 position: absolute;
1549 left: 15px;
1556 left: 15px;
1550 top: 8px;
1557 top: 8px;
1551 width: 16px;
1558 width: 16px;
1552 font-size: 11px;
1559 font-size: 11px;
1553 margin: 0;
1560 margin: 0;
1554 padding: 0;
1561 padding: 0;
1555 color: black;
1562 color: black;
1556 }
1563 }
1557
1564
1558 .reviewer_member_mandatory_remove,
1565 .reviewer_member_mandatory_remove,
1559 .reviewer_member_remove {
1566 .reviewer_member_remove {
1560 position: absolute;
1567 position: absolute;
1561 right: 0;
1568 right: 0;
1562 top: 0;
1569 top: 0;
1563 width: 16px;
1570 width: 16px;
1564 margin-bottom: 10px;
1571 margin-bottom: 10px;
1565 padding: 0;
1572 padding: 0;
1566 color: black;
1573 color: black;
1567 }
1574 }
1568
1575
1569 .reviewer_member_mandatory_remove {
1576 .reviewer_member_mandatory_remove {
1570 color: @grey4;
1577 color: @grey4;
1571 }
1578 }
1572
1579
1573 .reviewer_member_status {
1580 .reviewer_member_status {
1574 margin-top: 5px;
1581 margin-top: 5px;
1575 }
1582 }
1576 .pr-summary #summary{
1583 .pr-summary #summary{
1577 width: 100%;
1584 width: 100%;
1578 }
1585 }
1579 .pr-summary .action_button:hover {
1586 .pr-summary .action_button:hover {
1580 border: 0;
1587 border: 0;
1581 cursor: pointer;
1588 cursor: pointer;
1582 }
1589 }
1583 .pr-details-title {
1590 .pr-details-title {
1584 padding-bottom: 8px;
1591 padding-bottom: 8px;
1585 border-bottom: @border-thickness solid @grey5;
1592 border-bottom: @border-thickness solid @grey5;
1586
1593
1587 .action_button.disabled {
1594 .action_button.disabled {
1588 color: @grey4;
1595 color: @grey4;
1589 cursor: inherit;
1596 cursor: inherit;
1590 }
1597 }
1591 .action_button {
1598 .action_button {
1592 color: @rcblue;
1599 color: @rcblue;
1593 }
1600 }
1594 }
1601 }
1595 .pr-details-content {
1602 .pr-details-content {
1596 margin-top: @textmargin - 5;
1603 margin-top: @textmargin - 5;
1597 margin-bottom: @textmargin - 5;
1604 margin-bottom: @textmargin - 5;
1598 }
1605 }
1599
1606
1600 .pr-reviewer-rules {
1607 .pr-reviewer-rules {
1601 padding: 10px 0px 20px 0px;
1608 padding: 10px 0px 20px 0px;
1602 }
1609 }
1603
1610
1604 .todo-resolved {
1611 .todo-resolved {
1605 text-decoration: line-through;
1612 text-decoration: line-through;
1606 }
1613 }
1607
1614
1608 .todo-table {
1615 .todo-table {
1609 width: 100%;
1616 width: 100%;
1610
1617
1611 td {
1618 td {
1612 padding: 5px 0px;
1619 padding: 5px 0px;
1613 }
1620 }
1614
1621
1615 .td-todo-number {
1622 .td-todo-number {
1616 text-align: left;
1623 text-align: left;
1617 white-space: nowrap;
1624 white-space: nowrap;
1618 width: 15%;
1625 width: 15%;
1619 }
1626 }
1620
1627
1621 .td-todo-gravatar {
1628 .td-todo-gravatar {
1622 width: 5%;
1629 width: 5%;
1623
1630
1624 img {
1631 img {
1625 margin: -3px 0;
1632 margin: -3px 0;
1626 }
1633 }
1627 }
1634 }
1628
1635
1629 }
1636 }
1630
1637
1631 .todo-comment-text-wrapper {
1638 .todo-comment-text-wrapper {
1632 display: inline-grid;
1639 display: inline-grid;
1633 }
1640 }
1634
1641
1635 .todo-comment-text {
1642 .todo-comment-text {
1636 margin-left: 5px;
1643 margin-left: 5px;
1637 white-space: nowrap;
1644 white-space: nowrap;
1638 overflow: hidden;
1645 overflow: hidden;
1639 text-overflow: ellipsis;
1646 text-overflow: ellipsis;
1640 }
1647 }
1641
1648
1642 .group_members {
1649 .group_members {
1643 margin-top: 0;
1650 margin-top: 0;
1644 padding: 0;
1651 padding: 0;
1645 list-style: outside none none;
1652 list-style: outside none none;
1646
1653
1647 img {
1654 img {
1648 height: @gravatar-size;
1655 height: @gravatar-size;
1649 width: @gravatar-size;
1656 width: @gravatar-size;
1650 margin-right: .5em;
1657 margin-right: .5em;
1651 margin-left: 3px;
1658 margin-left: 3px;
1652 }
1659 }
1653
1660
1654 .to-delete {
1661 .to-delete {
1655 .user {
1662 .user {
1656 text-decoration: line-through;
1663 text-decoration: line-through;
1657 }
1664 }
1658 }
1665 }
1659 }
1666 }
1660
1667
1661 .compare_view_commits_title {
1668 .compare_view_commits_title {
1662 .disabled {
1669 .disabled {
1663 cursor: inherit;
1670 cursor: inherit;
1664 &:hover{
1671 &:hover{
1665 background-color: inherit;
1672 background-color: inherit;
1666 color: inherit;
1673 color: inherit;
1667 }
1674 }
1668 }
1675 }
1669 }
1676 }
1670
1677
1671 .subtitle-compare {
1678 .subtitle-compare {
1672 margin: -15px 0px 0px 0px;
1679 margin: -15px 0px 0px 0px;
1673 }
1680 }
1674
1681
1675 // new entry in group_members
1682 // new entry in group_members
1676 .td-author-new-entry {
1683 .td-author-new-entry {
1677 background-color: rgba(red(@alert1), green(@alert1), blue(@alert1), 0.3);
1684 background-color: rgba(red(@alert1), green(@alert1), blue(@alert1), 0.3);
1678 }
1685 }
1679
1686
1680 .usergroup_member_remove {
1687 .usergroup_member_remove {
1681 width: 16px;
1688 width: 16px;
1682 margin-bottom: 10px;
1689 margin-bottom: 10px;
1683 padding: 0;
1690 padding: 0;
1684 color: black !important;
1691 color: black !important;
1685 cursor: pointer;
1692 cursor: pointer;
1686 }
1693 }
1687
1694
1688 .reviewer_ac .ac-input {
1695 .reviewer_ac .ac-input {
1689 width: 92%;
1696 width: 92%;
1690 margin-bottom: 1em;
1697 margin-bottom: 1em;
1691 }
1698 }
1692
1699
1693 .compare_view_commits tr{
1700 .compare_view_commits tr{
1694 height: 20px;
1701 height: 20px;
1695 }
1702 }
1696 .compare_view_commits td {
1703 .compare_view_commits td {
1697 vertical-align: top;
1704 vertical-align: top;
1698 padding-top: 10px;
1705 padding-top: 10px;
1699 }
1706 }
1700 .compare_view_commits .author {
1707 .compare_view_commits .author {
1701 margin-left: 5px;
1708 margin-left: 5px;
1702 }
1709 }
1703
1710
1704 .compare_view_commits {
1711 .compare_view_commits {
1705 .color-a {
1712 .color-a {
1706 color: @alert1;
1713 color: @alert1;
1707 }
1714 }
1708
1715
1709 .color-c {
1716 .color-c {
1710 color: @color3;
1717 color: @color3;
1711 }
1718 }
1712
1719
1713 .color-r {
1720 .color-r {
1714 color: @color5;
1721 color: @color5;
1715 }
1722 }
1716
1723
1717 .color-a-bg {
1724 .color-a-bg {
1718 background-color: @alert1;
1725 background-color: @alert1;
1719 }
1726 }
1720
1727
1721 .color-c-bg {
1728 .color-c-bg {
1722 background-color: @alert3;
1729 background-color: @alert3;
1723 }
1730 }
1724
1731
1725 .color-r-bg {
1732 .color-r-bg {
1726 background-color: @alert2;
1733 background-color: @alert2;
1727 }
1734 }
1728
1735
1729 .color-a-border {
1736 .color-a-border {
1730 border: 1px solid @alert1;
1737 border: 1px solid @alert1;
1731 }
1738 }
1732
1739
1733 .color-c-border {
1740 .color-c-border {
1734 border: 1px solid @alert3;
1741 border: 1px solid @alert3;
1735 }
1742 }
1736
1743
1737 .color-r-border {
1744 .color-r-border {
1738 border: 1px solid @alert2;
1745 border: 1px solid @alert2;
1739 }
1746 }
1740
1747
1741 .commit-change-indicator {
1748 .commit-change-indicator {
1742 width: 15px;
1749 width: 15px;
1743 height: 15px;
1750 height: 15px;
1744 position: relative;
1751 position: relative;
1745 left: 15px;
1752 left: 15px;
1746 }
1753 }
1747
1754
1748 .commit-change-content {
1755 .commit-change-content {
1749 text-align: center;
1756 text-align: center;
1750 vertical-align: middle;
1757 vertical-align: middle;
1751 line-height: 15px;
1758 line-height: 15px;
1752 }
1759 }
1753 }
1760 }
1754
1761
1755 .compare_view_filepath {
1762 .compare_view_filepath {
1756 color: @grey1;
1763 color: @grey1;
1757 }
1764 }
1758
1765
1759 .show_more {
1766 .show_more {
1760 display: inline-block;
1767 display: inline-block;
1761 width: 0;
1768 width: 0;
1762 height: 0;
1769 height: 0;
1763 vertical-align: middle;
1770 vertical-align: middle;
1764 content: "";
1771 content: "";
1765 border: 4px solid;
1772 border: 4px solid;
1766 border-right-color: transparent;
1773 border-right-color: transparent;
1767 border-bottom-color: transparent;
1774 border-bottom-color: transparent;
1768 border-left-color: transparent;
1775 border-left-color: transparent;
1769 font-size: 0;
1776 font-size: 0;
1770 }
1777 }
1771
1778
1772 .journal_more .show_more {
1779 .journal_more .show_more {
1773 display: inline;
1780 display: inline;
1774
1781
1775 &:after {
1782 &:after {
1776 content: none;
1783 content: none;
1777 }
1784 }
1778 }
1785 }
1779
1786
1780 .compare_view_commits .collapse_commit:after {
1787 .compare_view_commits .collapse_commit:after {
1781 cursor: pointer;
1788 cursor: pointer;
1782 content: "\00A0\25B4";
1789 content: "\00A0\25B4";
1783 margin-left: -3px;
1790 margin-left: -3px;
1784 font-size: 17px;
1791 font-size: 17px;
1785 color: @grey4;
1792 color: @grey4;
1786 }
1793 }
1787
1794
1788 .diff_links {
1795 .diff_links {
1789 margin-left: 8px;
1796 margin-left: 8px;
1790 }
1797 }
1791
1798
1792 #pull_request_overview {
1799 #pull_request_overview {
1793 div.ancestor {
1800 div.ancestor {
1794 margin: -33px 0;
1801 margin: -33px 0;
1795 }
1802 }
1796 }
1803 }
1797
1804
1798 div.ancestor {
1805 div.ancestor {
1799
1806
1800 }
1807 }
1801
1808
1802 .cs_icon_td input[type="checkbox"] {
1809 .cs_icon_td input[type="checkbox"] {
1803 display: none;
1810 display: none;
1804 }
1811 }
1805
1812
1806 .cs_icon_td .expand_file_icon:after {
1813 .cs_icon_td .expand_file_icon:after {
1807 cursor: pointer;
1814 cursor: pointer;
1808 content: "\00A0\25B6";
1815 content: "\00A0\25B6";
1809 font-size: 12px;
1816 font-size: 12px;
1810 color: @grey4;
1817 color: @grey4;
1811 }
1818 }
1812
1819
1813 .cs_icon_td .collapse_file_icon:after {
1820 .cs_icon_td .collapse_file_icon:after {
1814 cursor: pointer;
1821 cursor: pointer;
1815 content: "\00A0\25BC";
1822 content: "\00A0\25BC";
1816 font-size: 12px;
1823 font-size: 12px;
1817 color: @grey4;
1824 color: @grey4;
1818 }
1825 }
1819
1826
1820 /*new binary
1827 /*new binary
1821 NEW_FILENODE = 1
1828 NEW_FILENODE = 1
1822 DEL_FILENODE = 2
1829 DEL_FILENODE = 2
1823 MOD_FILENODE = 3
1830 MOD_FILENODE = 3
1824 RENAMED_FILENODE = 4
1831 RENAMED_FILENODE = 4
1825 COPIED_FILENODE = 5
1832 COPIED_FILENODE = 5
1826 CHMOD_FILENODE = 6
1833 CHMOD_FILENODE = 6
1827 BIN_FILENODE = 7
1834 BIN_FILENODE = 7
1828 */
1835 */
1829 .cs_files_expand {
1836 .cs_files_expand {
1830 font-size: @basefontsize + 5px;
1837 font-size: @basefontsize + 5px;
1831 line-height: 1.8em;
1838 line-height: 1.8em;
1832 float: right;
1839 float: right;
1833 }
1840 }
1834
1841
1835 .cs_files_expand span{
1842 .cs_files_expand span{
1836 color: @rcblue;
1843 color: @rcblue;
1837 cursor: pointer;
1844 cursor: pointer;
1838 }
1845 }
1839 .cs_files {
1846 .cs_files {
1840 clear: both;
1847 clear: both;
1841 padding-bottom: @padding;
1848 padding-bottom: @padding;
1842
1849
1843 .cur_cs {
1850 .cur_cs {
1844 margin: 10px 2px;
1851 margin: 10px 2px;
1845 font-weight: bold;
1852 font-weight: bold;
1846 }
1853 }
1847
1854
1848 .node {
1855 .node {
1849 float: left;
1856 float: left;
1850 }
1857 }
1851
1858
1852 .changes {
1859 .changes {
1853 float: right;
1860 float: right;
1854 color: white;
1861 color: white;
1855 font-size: @basefontsize - 4px;
1862 font-size: @basefontsize - 4px;
1856 margin-top: 4px;
1863 margin-top: 4px;
1857 opacity: 0.6;
1864 opacity: 0.6;
1858 filter: Alpha(opacity=60); /* IE8 and earlier */
1865 filter: Alpha(opacity=60); /* IE8 and earlier */
1859
1866
1860 .added {
1867 .added {
1861 background-color: @alert1;
1868 background-color: @alert1;
1862 float: left;
1869 float: left;
1863 text-align: center;
1870 text-align: center;
1864 }
1871 }
1865
1872
1866 .deleted {
1873 .deleted {
1867 background-color: @alert2;
1874 background-color: @alert2;
1868 float: left;
1875 float: left;
1869 text-align: center;
1876 text-align: center;
1870 }
1877 }
1871
1878
1872 .bin {
1879 .bin {
1873 background-color: @alert1;
1880 background-color: @alert1;
1874 text-align: center;
1881 text-align: center;
1875 }
1882 }
1876
1883
1877 /*new binary*/
1884 /*new binary*/
1878 .bin.bin1 {
1885 .bin.bin1 {
1879 background-color: @alert1;
1886 background-color: @alert1;
1880 text-align: center;
1887 text-align: center;
1881 }
1888 }
1882
1889
1883 /*deleted binary*/
1890 /*deleted binary*/
1884 .bin.bin2 {
1891 .bin.bin2 {
1885 background-color: @alert2;
1892 background-color: @alert2;
1886 text-align: center;
1893 text-align: center;
1887 }
1894 }
1888
1895
1889 /*mod binary*/
1896 /*mod binary*/
1890 .bin.bin3 {
1897 .bin.bin3 {
1891 background-color: @grey2;
1898 background-color: @grey2;
1892 text-align: center;
1899 text-align: center;
1893 }
1900 }
1894
1901
1895 /*rename file*/
1902 /*rename file*/
1896 .bin.bin4 {
1903 .bin.bin4 {
1897 background-color: @alert4;
1904 background-color: @alert4;
1898 text-align: center;
1905 text-align: center;
1899 }
1906 }
1900
1907
1901 /*copied file*/
1908 /*copied file*/
1902 .bin.bin5 {
1909 .bin.bin5 {
1903 background-color: @alert4;
1910 background-color: @alert4;
1904 text-align: center;
1911 text-align: center;
1905 }
1912 }
1906
1913
1907 /*chmod file*/
1914 /*chmod file*/
1908 .bin.bin6 {
1915 .bin.bin6 {
1909 background-color: @grey2;
1916 background-color: @grey2;
1910 text-align: center;
1917 text-align: center;
1911 }
1918 }
1912 }
1919 }
1913 }
1920 }
1914
1921
1915 .cs_files .cs_added, .cs_files .cs_A,
1922 .cs_files .cs_added, .cs_files .cs_A,
1916 .cs_files .cs_added, .cs_files .cs_M,
1923 .cs_files .cs_added, .cs_files .cs_M,
1917 .cs_files .cs_added, .cs_files .cs_D {
1924 .cs_files .cs_added, .cs_files .cs_D {
1918 height: 16px;
1925 height: 16px;
1919 padding-right: 10px;
1926 padding-right: 10px;
1920 margin-top: 7px;
1927 margin-top: 7px;
1921 text-align: left;
1928 text-align: left;
1922 }
1929 }
1923
1930
1924 .cs_icon_td {
1931 .cs_icon_td {
1925 min-width: 16px;
1932 min-width: 16px;
1926 width: 16px;
1933 width: 16px;
1927 }
1934 }
1928
1935
1929 .pull-request-merge {
1936 .pull-request-merge {
1930 border: 1px solid @grey5;
1937 border: 1px solid @grey5;
1931 padding: 10px 0px 20px;
1938 padding: 10px 0px 20px;
1932 margin-top: 10px;
1939 margin-top: 10px;
1933 margin-bottom: 20px;
1940 margin-bottom: 20px;
1934 }
1941 }
1935
1942
1936 .pull-request-merge-refresh {
1943 .pull-request-merge-refresh {
1937 margin: 2px 7px;
1944 margin: 2px 7px;
1938 a {
1945 a {
1939 color: @grey3;
1946 color: @grey3;
1940 }
1947 }
1941 }
1948 }
1942
1949
1943 .pull-request-merge ul {
1950 .pull-request-merge ul {
1944 padding: 0px 0px;
1951 padding: 0px 0px;
1945 }
1952 }
1946
1953
1947 .pull-request-merge li {
1954 .pull-request-merge li {
1948 list-style-type: none;
1955 list-style-type: none;
1949 }
1956 }
1950
1957
1951 .pull-request-merge .pull-request-wrap {
1958 .pull-request-merge .pull-request-wrap {
1952 height: auto;
1959 height: auto;
1953 padding: 0px 0px;
1960 padding: 0px 0px;
1954 text-align: right;
1961 text-align: right;
1955 }
1962 }
1956
1963
1957 .pull-request-merge span {
1964 .pull-request-merge span {
1958 margin-right: 5px;
1965 margin-right: 5px;
1959 }
1966 }
1960
1967
1961 .pull-request-merge-actions {
1968 .pull-request-merge-actions {
1962 min-height: 30px;
1969 min-height: 30px;
1963 padding: 0px 0px;
1970 padding: 0px 0px;
1964 }
1971 }
1965
1972
1966 .pull-request-merge-info {
1973 .pull-request-merge-info {
1967 padding: 0px 5px 5px 0px;
1974 padding: 0px 5px 5px 0px;
1968 }
1975 }
1969
1976
1970 .merge-status {
1977 .merge-status {
1971 margin-right: 5px;
1978 margin-right: 5px;
1972 }
1979 }
1973
1980
1974 .merge-message {
1981 .merge-message {
1975 font-size: 1.2em
1982 font-size: 1.2em
1976 }
1983 }
1977
1984
1978 .merge-message.success i,
1985 .merge-message.success i,
1979 .merge-icon.success i {
1986 .merge-icon.success i {
1980 color:@alert1;
1987 color:@alert1;
1981 }
1988 }
1982
1989
1983 .merge-message.warning i,
1990 .merge-message.warning i,
1984 .merge-icon.warning i {
1991 .merge-icon.warning i {
1985 color: @alert3;
1992 color: @alert3;
1986 }
1993 }
1987
1994
1988 .merge-message.error i,
1995 .merge-message.error i,
1989 .merge-icon.error i {
1996 .merge-icon.error i {
1990 color:@alert2;
1997 color:@alert2;
1991 }
1998 }
1992
1999
1993 .pr-versions {
2000 .pr-versions {
1994 font-size: 1.1em;
2001 font-size: 1.1em;
1995 padding: 7.5px;
2002 padding: 7.5px;
1996
2003
1997 table {
2004 table {
1998
2005
1999 }
2006 }
2000
2007
2001 td {
2008 td {
2002 line-height: 15px;
2009 line-height: 15px;
2003 }
2010 }
2004
2011
2005 .compare-radio-button {
2012 .compare-radio-button {
2006 position: relative;
2013 position: relative;
2007 top: -3px;
2014 top: -3px;
2008 }
2015 }
2009 }
2016 }
2010
2017
2011
2018
2012 #close_pull_request {
2019 #close_pull_request {
2013 margin-right: 0px;
2020 margin-right: 0px;
2014 }
2021 }
2015
2022
2016 .empty_data {
2023 .empty_data {
2017 color: @grey4;
2024 color: @grey4;
2018 }
2025 }
2019
2026
2020 #changeset_compare_view_content {
2027 #changeset_compare_view_content {
2021 clear: both;
2028 clear: both;
2022 width: 100%;
2029 width: 100%;
2023 box-sizing: border-box;
2030 box-sizing: border-box;
2024 .border-radius(@border-radius);
2031 .border-radius(@border-radius);
2025
2032
2026 .help-block {
2033 .help-block {
2027 margin: @padding 0;
2034 margin: @padding 0;
2028 color: @text-color;
2035 color: @text-color;
2029 &.pre-formatting {
2036 &.pre-formatting {
2030 white-space: pre;
2037 white-space: pre;
2031 }
2038 }
2032 }
2039 }
2033
2040
2034 .empty_data {
2041 .empty_data {
2035 margin: @padding 0;
2042 margin: @padding 0;
2036 }
2043 }
2037
2044
2038 .alert {
2045 .alert {
2039 margin-bottom: @space;
2046 margin-bottom: @space;
2040 }
2047 }
2041 }
2048 }
2042
2049
2043 .table_disp {
2050 .table_disp {
2044 .status {
2051 .status {
2045 width: auto;
2052 width: auto;
2046 }
2053 }
2047 }
2054 }
2048
2055
2049
2056
2050 .creation_in_progress {
2057 .creation_in_progress {
2051 color: @grey4
2058 color: @grey4
2052 }
2059 }
2053
2060
2054 .status_box_menu {
2061 .status_box_menu {
2055 margin: 0;
2062 margin: 0;
2056 }
2063 }
2057
2064
2058 .notification-table{
2065 .notification-table{
2059 margin-bottom: @space;
2066 margin-bottom: @space;
2060 display: table;
2067 display: table;
2061 width: 100%;
2068 width: 100%;
2062
2069
2063 .container{
2070 .container{
2064 display: table-row;
2071 display: table-row;
2065
2072
2066 .notification-header{
2073 .notification-header{
2067 border-bottom: @border-thickness solid @border-default-color;
2074 border-bottom: @border-thickness solid @border-default-color;
2068 }
2075 }
2069
2076
2070 .notification-subject{
2077 .notification-subject{
2071 display: table-cell;
2078 display: table-cell;
2072 }
2079 }
2073 }
2080 }
2074 }
2081 }
2075
2082
2076 // Notifications
2083 // Notifications
2077 .notification-header{
2084 .notification-header{
2078 display: table;
2085 display: table;
2079 width: 100%;
2086 width: 100%;
2080 padding: floor(@basefontsize/2) 0;
2087 padding: floor(@basefontsize/2) 0;
2081 line-height: 1em;
2088 line-height: 1em;
2082
2089
2083 .desc, .delete-notifications, .read-notifications{
2090 .desc, .delete-notifications, .read-notifications{
2084 display: table-cell;
2091 display: table-cell;
2085 text-align: left;
2092 text-align: left;
2086 }
2093 }
2087
2094
2088 .delete-notifications, .read-notifications{
2095 .delete-notifications, .read-notifications{
2089 width: 35px;
2096 width: 35px;
2090 min-width: 35px; //fixes when only one button is displayed
2097 min-width: 35px; //fixes when only one button is displayed
2091 }
2098 }
2092 }
2099 }
2093
2100
2094 .notification-body {
2101 .notification-body {
2095 .markdown-block,
2102 .markdown-block,
2096 .rst-block {
2103 .rst-block {
2097 padding: @padding 0;
2104 padding: @padding 0;
2098 }
2105 }
2099
2106
2100 .notification-subject {
2107 .notification-subject {
2101 padding: @textmargin 0;
2108 padding: @textmargin 0;
2102 border-bottom: @border-thickness solid @border-default-color;
2109 border-bottom: @border-thickness solid @border-default-color;
2103 }
2110 }
2104 }
2111 }
2105
2112
2106 .notice-messages {
2113 .notice-messages {
2107 .markdown-block,
2114 .markdown-block,
2108 .rst-block {
2115 .rst-block {
2109 padding: 0;
2116 padding: 0;
2110 }
2117 }
2111 }
2118 }
2112
2119
2113 .notifications_buttons{
2120 .notifications_buttons{
2114 float: right;
2121 float: right;
2115 }
2122 }
2116
2123
2117 #notification-status{
2124 #notification-status{
2118 display: inline;
2125 display: inline;
2119 }
2126 }
2120
2127
2121 // Repositories
2128 // Repositories
2122
2129
2123 #summary.fields{
2130 #summary.fields{
2124 display: table;
2131 display: table;
2125
2132
2126 .field{
2133 .field{
2127 display: table-row;
2134 display: table-row;
2128
2135
2129 .label-summary{
2136 .label-summary{
2130 display: table-cell;
2137 display: table-cell;
2131 min-width: @label-summary-minwidth;
2138 min-width: @label-summary-minwidth;
2132 padding-top: @padding/2;
2139 padding-top: @padding/2;
2133 padding-bottom: @padding/2;
2140 padding-bottom: @padding/2;
2134 padding-right: @padding/2;
2141 padding-right: @padding/2;
2135 }
2142 }
2136
2143
2137 .input{
2144 .input{
2138 display: table-cell;
2145 display: table-cell;
2139 padding: @padding/2;
2146 padding: @padding/2;
2140
2147
2141 input{
2148 input{
2142 min-width: 29em;
2149 min-width: 29em;
2143 padding: @padding/4;
2150 padding: @padding/4;
2144 }
2151 }
2145 }
2152 }
2146 .statistics, .downloads{
2153 .statistics, .downloads{
2147 .disabled{
2154 .disabled{
2148 color: @grey4;
2155 color: @grey4;
2149 }
2156 }
2150 }
2157 }
2151 }
2158 }
2152 }
2159 }
2153
2160
2154 #summary{
2161 #summary{
2155 width: 70%;
2162 width: 70%;
2156 }
2163 }
2157
2164
2158
2165
2159 // Journal
2166 // Journal
2160 .journal.title {
2167 .journal.title {
2161 h5 {
2168 h5 {
2162 float: left;
2169 float: left;
2163 margin: 0;
2170 margin: 0;
2164 width: 70%;
2171 width: 70%;
2165 }
2172 }
2166
2173
2167 ul {
2174 ul {
2168 float: right;
2175 float: right;
2169 display: inline-block;
2176 display: inline-block;
2170 margin: 0;
2177 margin: 0;
2171 width: 30%;
2178 width: 30%;
2172 text-align: right;
2179 text-align: right;
2173
2180
2174 li {
2181 li {
2175 display: inline;
2182 display: inline;
2176 font-size: @journal-fontsize;
2183 font-size: @journal-fontsize;
2177 line-height: 1em;
2184 line-height: 1em;
2178
2185
2179 list-style-type: none;
2186 list-style-type: none;
2180 }
2187 }
2181 }
2188 }
2182 }
2189 }
2183
2190
2184 .filterexample {
2191 .filterexample {
2185 position: absolute;
2192 position: absolute;
2186 top: 95px;
2193 top: 95px;
2187 left: @contentpadding;
2194 left: @contentpadding;
2188 color: @rcblue;
2195 color: @rcblue;
2189 font-size: 11px;
2196 font-size: 11px;
2190 font-family: @text-regular;
2197 font-family: @text-regular;
2191 cursor: help;
2198 cursor: help;
2192
2199
2193 &:hover {
2200 &:hover {
2194 color: @rcdarkblue;
2201 color: @rcdarkblue;
2195 }
2202 }
2196
2203
2197 @media (max-width:768px) {
2204 @media (max-width:768px) {
2198 position: relative;
2205 position: relative;
2199 top: auto;
2206 top: auto;
2200 left: auto;
2207 left: auto;
2201 display: block;
2208 display: block;
2202 }
2209 }
2203 }
2210 }
2204
2211
2205
2212
2206 #journal{
2213 #journal{
2207 margin-bottom: @space;
2214 margin-bottom: @space;
2208
2215
2209 .journal_day{
2216 .journal_day{
2210 margin-bottom: @textmargin/2;
2217 margin-bottom: @textmargin/2;
2211 padding-bottom: @textmargin/2;
2218 padding-bottom: @textmargin/2;
2212 font-size: @journal-fontsize;
2219 font-size: @journal-fontsize;
2213 border-bottom: @border-thickness solid @border-default-color;
2220 border-bottom: @border-thickness solid @border-default-color;
2214 }
2221 }
2215
2222
2216 .journal_container{
2223 .journal_container{
2217 margin-bottom: @space;
2224 margin-bottom: @space;
2218
2225
2219 .journal_user{
2226 .journal_user{
2220 display: inline-block;
2227 display: inline-block;
2221 }
2228 }
2222 .journal_action_container{
2229 .journal_action_container{
2223 display: block;
2230 display: block;
2224 margin-top: @textmargin;
2231 margin-top: @textmargin;
2225
2232
2226 div{
2233 div{
2227 display: inline;
2234 display: inline;
2228 }
2235 }
2229
2236
2230 div.journal_action_params{
2237 div.journal_action_params{
2231 display: block;
2238 display: block;
2232 }
2239 }
2233
2240
2234 div.journal_repo:after{
2241 div.journal_repo:after{
2235 content: "\A";
2242 content: "\A";
2236 white-space: pre;
2243 white-space: pre;
2237 }
2244 }
2238
2245
2239 div.date{
2246 div.date{
2240 display: block;
2247 display: block;
2241 margin-bottom: @textmargin;
2248 margin-bottom: @textmargin;
2242 }
2249 }
2243 }
2250 }
2244 }
2251 }
2245 }
2252 }
2246
2253
2247 // Files
2254 // Files
2248 .edit-file-title {
2255 .edit-file-title {
2249 font-size: 16px;
2256 font-size: 16px;
2250
2257
2251 .title-heading {
2258 .title-heading {
2252 padding: 2px;
2259 padding: 2px;
2253 }
2260 }
2254 }
2261 }
2255
2262
2256 .edit-file-fieldset {
2263 .edit-file-fieldset {
2257 margin: @sidebarpadding 0;
2264 margin: @sidebarpadding 0;
2258
2265
2259 .fieldset {
2266 .fieldset {
2260 .left-label {
2267 .left-label {
2261 width: 13%;
2268 width: 13%;
2262 }
2269 }
2263 .right-content {
2270 .right-content {
2264 width: 87%;
2271 width: 87%;
2265 max-width: 100%;
2272 max-width: 100%;
2266 }
2273 }
2267 .filename-label {
2274 .filename-label {
2268 margin-top: 13px;
2275 margin-top: 13px;
2269 }
2276 }
2270 .commit-message-label {
2277 .commit-message-label {
2271 margin-top: 4px;
2278 margin-top: 4px;
2272 }
2279 }
2273 .file-upload-input {
2280 .file-upload-input {
2274 input {
2281 input {
2275 display: none;
2282 display: none;
2276 }
2283 }
2277 margin-top: 10px;
2284 margin-top: 10px;
2278 }
2285 }
2279 .file-upload-label {
2286 .file-upload-label {
2280 margin-top: 10px;
2287 margin-top: 10px;
2281 }
2288 }
2282 p {
2289 p {
2283 margin-top: 5px;
2290 margin-top: 5px;
2284 }
2291 }
2285
2292
2286 }
2293 }
2287 .custom-path-link {
2294 .custom-path-link {
2288 margin-left: 5px;
2295 margin-left: 5px;
2289 }
2296 }
2290 #commit {
2297 #commit {
2291 resize: vertical;
2298 resize: vertical;
2292 }
2299 }
2293 }
2300 }
2294
2301
2295 .delete-file-preview {
2302 .delete-file-preview {
2296 max-height: 250px;
2303 max-height: 250px;
2297 }
2304 }
2298
2305
2299 .new-file,
2306 .new-file,
2300 #filter_activate,
2307 #filter_activate,
2301 #filter_deactivate {
2308 #filter_deactivate {
2302 float: right;
2309 float: right;
2303 margin: 0 0 0 10px;
2310 margin: 0 0 0 10px;
2304 }
2311 }
2305
2312
2306 .file-upload-transaction-wrapper {
2313 .file-upload-transaction-wrapper {
2307 margin-top: 57px;
2314 margin-top: 57px;
2308 clear: both;
2315 clear: both;
2309 }
2316 }
2310
2317
2311 .file-upload-transaction-wrapper .error {
2318 .file-upload-transaction-wrapper .error {
2312 color: @color5;
2319 color: @color5;
2313 }
2320 }
2314
2321
2315 .file-upload-transaction {
2322 .file-upload-transaction {
2316 min-height: 200px;
2323 min-height: 200px;
2317 padding: 54px;
2324 padding: 54px;
2318 border: 1px solid @grey5;
2325 border: 1px solid @grey5;
2319 text-align: center;
2326 text-align: center;
2320 clear: both;
2327 clear: both;
2321 }
2328 }
2322
2329
2323 .file-upload-transaction i {
2330 .file-upload-transaction i {
2324 font-size: 48px
2331 font-size: 48px
2325 }
2332 }
2326
2333
2327 h3.files_location{
2334 h3.files_location{
2328 line-height: 2.4em;
2335 line-height: 2.4em;
2329 }
2336 }
2330
2337
2331 .browser-nav {
2338 .browser-nav {
2332 width: 100%;
2339 width: 100%;
2333 display: table;
2340 display: table;
2334 margin-bottom: 20px;
2341 margin-bottom: 20px;
2335
2342
2336 .info_box {
2343 .info_box {
2337 float: left;
2344 float: left;
2338 display: inline-table;
2345 display: inline-table;
2339 height: 2.5em;
2346 height: 2.5em;
2340
2347
2341 .browser-cur-rev, .info_box_elem {
2348 .browser-cur-rev, .info_box_elem {
2342 display: table-cell;
2349 display: table-cell;
2343 vertical-align: middle;
2350 vertical-align: middle;
2344 }
2351 }
2345
2352
2346 .drop-menu {
2353 .drop-menu {
2347 margin: 0 10px;
2354 margin: 0 10px;
2348 }
2355 }
2349
2356
2350 .info_box_elem {
2357 .info_box_elem {
2351 border-top: @border-thickness solid @grey5;
2358 border-top: @border-thickness solid @grey5;
2352 border-bottom: @border-thickness solid @grey5;
2359 border-bottom: @border-thickness solid @grey5;
2353 box-shadow: @button-shadow;
2360 box-shadow: @button-shadow;
2354
2361
2355 #at_rev, a {
2362 #at_rev, a {
2356 padding: 0.6em 0.4em;
2363 padding: 0.6em 0.4em;
2357 margin: 0;
2364 margin: 0;
2358 .box-shadow(none);
2365 .box-shadow(none);
2359 border: 0;
2366 border: 0;
2360 height: 12px;
2367 height: 12px;
2361 color: @grey2;
2368 color: @grey2;
2362 }
2369 }
2363
2370
2364 input#at_rev {
2371 input#at_rev {
2365 max-width: 50px;
2372 max-width: 50px;
2366 text-align: center;
2373 text-align: center;
2367 }
2374 }
2368
2375
2369 &.previous {
2376 &.previous {
2370 border: @border-thickness solid @grey5;
2377 border: @border-thickness solid @grey5;
2371 border-top-left-radius: @border-radius;
2378 border-top-left-radius: @border-radius;
2372 border-bottom-left-radius: @border-radius;
2379 border-bottom-left-radius: @border-radius;
2373
2380
2374 &:hover {
2381 &:hover {
2375 border-color: @grey4;
2382 border-color: @grey4;
2376 }
2383 }
2377
2384
2378 .disabled {
2385 .disabled {
2379 color: @grey5;
2386 color: @grey5;
2380 cursor: not-allowed;
2387 cursor: not-allowed;
2381 opacity: 0.5;
2388 opacity: 0.5;
2382 }
2389 }
2383 }
2390 }
2384
2391
2385 &.next {
2392 &.next {
2386 border: @border-thickness solid @grey5;
2393 border: @border-thickness solid @grey5;
2387 border-top-right-radius: @border-radius;
2394 border-top-right-radius: @border-radius;
2388 border-bottom-right-radius: @border-radius;
2395 border-bottom-right-radius: @border-radius;
2389
2396
2390 &:hover {
2397 &:hover {
2391 border-color: @grey4;
2398 border-color: @grey4;
2392 }
2399 }
2393
2400
2394 .disabled {
2401 .disabled {
2395 color: @grey5;
2402 color: @grey5;
2396 cursor: not-allowed;
2403 cursor: not-allowed;
2397 opacity: 0.5;
2404 opacity: 0.5;
2398 }
2405 }
2399 }
2406 }
2400 }
2407 }
2401
2408
2402 .browser-cur-rev {
2409 .browser-cur-rev {
2403
2410
2404 span{
2411 span{
2405 margin: 0;
2412 margin: 0;
2406 color: @rcblue;
2413 color: @rcblue;
2407 height: 12px;
2414 height: 12px;
2408 display: inline-block;
2415 display: inline-block;
2409 padding: 0.7em 1em ;
2416 padding: 0.7em 1em ;
2410 border: @border-thickness solid @rcblue;
2417 border: @border-thickness solid @rcblue;
2411 margin-right: @padding;
2418 margin-right: @padding;
2412 }
2419 }
2413 }
2420 }
2414
2421
2415 }
2422 }
2416
2423
2417 .select-index-number {
2424 .select-index-number {
2418 margin: 0 0 0 20px;
2425 margin: 0 0 0 20px;
2419 color: @grey3;
2426 color: @grey3;
2420 }
2427 }
2421
2428
2422 .search_activate {
2429 .search_activate {
2423 display: table-cell;
2430 display: table-cell;
2424 vertical-align: middle;
2431 vertical-align: middle;
2425
2432
2426 input, label{
2433 input, label{
2427 margin: 0;
2434 margin: 0;
2428 padding: 0;
2435 padding: 0;
2429 }
2436 }
2430
2437
2431 input{
2438 input{
2432 margin-left: @textmargin;
2439 margin-left: @textmargin;
2433 }
2440 }
2434
2441
2435 }
2442 }
2436 }
2443 }
2437
2444
2438 .browser-cur-rev{
2445 .browser-cur-rev{
2439 margin-bottom: @textmargin;
2446 margin-bottom: @textmargin;
2440 }
2447 }
2441
2448
2442 #node_filter_box_loading{
2449 #node_filter_box_loading{
2443 .info_text;
2450 .info_text;
2444 }
2451 }
2445
2452
2446 .browser-search {
2453 .browser-search {
2447 margin: -25px 0px 5px 0px;
2454 margin: -25px 0px 5px 0px;
2448 }
2455 }
2449
2456
2450 .files-quick-filter {
2457 .files-quick-filter {
2451 float: right;
2458 float: right;
2452 width: 180px;
2459 width: 180px;
2453 position: relative;
2460 position: relative;
2454 }
2461 }
2455
2462
2456 .files-filter-box {
2463 .files-filter-box {
2457 display: flex;
2464 display: flex;
2458 padding: 0px;
2465 padding: 0px;
2459 border-radius: 3px;
2466 border-radius: 3px;
2460 margin-bottom: 0;
2467 margin-bottom: 0;
2461
2468
2462 a {
2469 a {
2463 border: none !important;
2470 border: none !important;
2464 }
2471 }
2465
2472
2466 li {
2473 li {
2467 list-style-type: none
2474 list-style-type: none
2468 }
2475 }
2469 }
2476 }
2470
2477
2471 .files-filter-box-path {
2478 .files-filter-box-path {
2472 line-height: 33px;
2479 line-height: 33px;
2473 padding: 0;
2480 padding: 0;
2474 width: 20px;
2481 width: 20px;
2475 position: absolute;
2482 position: absolute;
2476 z-index: 11;
2483 z-index: 11;
2477 left: 5px;
2484 left: 5px;
2478 }
2485 }
2479
2486
2480 .files-filter-box-input {
2487 .files-filter-box-input {
2481 margin-right: 0;
2488 margin-right: 0;
2482
2489
2483 input {
2490 input {
2484 border: 1px solid @white;
2491 border: 1px solid @white;
2485 padding-left: 25px;
2492 padding-left: 25px;
2486 width: 145px;
2493 width: 145px;
2487
2494
2488 &:hover {
2495 &:hover {
2489 border-color: @grey6;
2496 border-color: @grey6;
2490 }
2497 }
2491
2498
2492 &:focus {
2499 &:focus {
2493 border-color: @grey5;
2500 border-color: @grey5;
2494 }
2501 }
2495 }
2502 }
2496 }
2503 }
2497
2504
2498 .browser-result{
2505 .browser-result{
2499 td a{
2506 td a{
2500 margin-left: 0.5em;
2507 margin-left: 0.5em;
2501 display: inline-block;
2508 display: inline-block;
2502
2509
2503 em {
2510 em {
2504 font-weight: @text-bold-weight;
2511 font-weight: @text-bold-weight;
2505 font-family: @text-bold;
2512 font-family: @text-bold;
2506 }
2513 }
2507 }
2514 }
2508 }
2515 }
2509
2516
2510 .browser-highlight{
2517 .browser-highlight{
2511 background-color: @grey5-alpha;
2518 background-color: @grey5-alpha;
2512 }
2519 }
2513
2520
2514
2521
2515 .edit-file-fieldset #location,
2522 .edit-file-fieldset #location,
2516 .edit-file-fieldset #filename {
2523 .edit-file-fieldset #filename {
2517 display: flex;
2524 display: flex;
2518 width: -moz-available; /* WebKit-based browsers will ignore this. */
2525 width: -moz-available; /* WebKit-based browsers will ignore this. */
2519 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2526 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2520 width: fill-available;
2527 width: fill-available;
2521 border: 0;
2528 border: 0;
2522 }
2529 }
2523
2530
2524 .path-items {
2531 .path-items {
2525 display: flex;
2532 display: flex;
2526 padding: 0;
2533 padding: 0;
2527 border: 1px solid #eeeeee;
2534 border: 1px solid #eeeeee;
2528 width: 100%;
2535 width: 100%;
2529 float: left;
2536 float: left;
2530
2537
2531 .breadcrumb-path {
2538 .breadcrumb-path {
2532 line-height: 30px;
2539 line-height: 30px;
2533 padding: 0 4px;
2540 padding: 0 4px;
2534 white-space: nowrap;
2541 white-space: nowrap;
2535 }
2542 }
2536
2543
2537 .upload-form {
2544 .upload-form {
2538 margin-top: 46px;
2545 margin-top: 46px;
2539 }
2546 }
2540
2547
2541 .location-path {
2548 .location-path {
2542 width: -moz-available; /* WebKit-based browsers will ignore this. */
2549 width: -moz-available; /* WebKit-based browsers will ignore this. */
2543 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2550 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2544 width: fill-available;
2551 width: fill-available;
2545
2552
2546 .file-name-input {
2553 .file-name-input {
2547 padding: 0.5em 0;
2554 padding: 0.5em 0;
2548 }
2555 }
2549
2556
2550 }
2557 }
2551
2558
2552 ul {
2559 ul {
2553 display: flex;
2560 display: flex;
2554 margin: 0;
2561 margin: 0;
2555 padding: 0;
2562 padding: 0;
2556 width: 100%;
2563 width: 100%;
2557 }
2564 }
2558
2565
2559 li {
2566 li {
2560 list-style-type: none;
2567 list-style-type: none;
2561 }
2568 }
2562
2569
2563 }
2570 }
2564
2571
2565 .editor-items {
2572 .editor-items {
2566 height: 40px;
2573 height: 40px;
2567 margin: 10px 0 -17px 10px;
2574 margin: 10px 0 -17px 10px;
2568
2575
2569 .editor-action {
2576 .editor-action {
2570 cursor: pointer;
2577 cursor: pointer;
2571 }
2578 }
2572
2579
2573 .editor-action.active {
2580 .editor-action.active {
2574 border-bottom: 2px solid #5C5C5C;
2581 border-bottom: 2px solid #5C5C5C;
2575 }
2582 }
2576
2583
2577 li {
2584 li {
2578 list-style-type: none;
2585 list-style-type: none;
2579 }
2586 }
2580 }
2587 }
2581
2588
2582 .edit-file-fieldset .message textarea {
2589 .edit-file-fieldset .message textarea {
2583 border: 1px solid #eeeeee;
2590 border: 1px solid #eeeeee;
2584 }
2591 }
2585
2592
2586 #files_data .codeblock {
2593 #files_data .codeblock {
2587 background-color: #F5F5F5;
2594 background-color: #F5F5F5;
2588 }
2595 }
2589
2596
2590 #editor_preview {
2597 #editor_preview {
2591 background: white;
2598 background: white;
2592 }
2599 }
2593
2600
2594 .show-editor {
2601 .show-editor {
2595 padding: 10px;
2602 padding: 10px;
2596 background-color: white;
2603 background-color: white;
2597
2604
2598 }
2605 }
2599
2606
2600 .show-preview {
2607 .show-preview {
2601 padding: 10px;
2608 padding: 10px;
2602 background-color: white;
2609 background-color: white;
2603 border-left: 1px solid #eeeeee;
2610 border-left: 1px solid #eeeeee;
2604 }
2611 }
2605 // quick filter
2612 // quick filter
2606 .grid-quick-filter {
2613 .grid-quick-filter {
2607 float: right;
2614 float: right;
2608 position: relative;
2615 position: relative;
2609 }
2616 }
2610
2617
2611 .grid-filter-box {
2618 .grid-filter-box {
2612 display: flex;
2619 display: flex;
2613 padding: 0px;
2620 padding: 0px;
2614 border-radius: 3px;
2621 border-radius: 3px;
2615 margin-bottom: 0;
2622 margin-bottom: 0;
2616
2623
2617 a {
2624 a {
2618 border: none !important;
2625 border: none !important;
2619 }
2626 }
2620
2627
2621 li {
2628 li {
2622 list-style-type: none
2629 list-style-type: none
2623 }
2630 }
2624 }
2631 }
2625
2632
2626 .grid-filter-box-icon {
2633 .grid-filter-box-icon {
2627 line-height: 33px;
2634 line-height: 33px;
2628 padding: 0;
2635 padding: 0;
2629 width: 20px;
2636 width: 20px;
2630 position: absolute;
2637 position: absolute;
2631 z-index: 11;
2638 z-index: 11;
2632 left: 5px;
2639 left: 5px;
2633 }
2640 }
2634
2641
2635 .grid-filter-box-input {
2642 .grid-filter-box-input {
2636 margin-right: 0;
2643 margin-right: 0;
2637
2644
2638 input {
2645 input {
2639 border: 1px solid @white;
2646 border: 1px solid @white;
2640 padding-left: 25px;
2647 padding-left: 25px;
2641 width: 145px;
2648 width: 145px;
2642
2649
2643 &:hover {
2650 &:hover {
2644 border-color: @grey6;
2651 border-color: @grey6;
2645 }
2652 }
2646
2653
2647 &:focus {
2654 &:focus {
2648 border-color: @grey5;
2655 border-color: @grey5;
2649 }
2656 }
2650 }
2657 }
2651 }
2658 }
2652
2659
2653
2660
2654
2661
2655 // Search
2662 // Search
2656
2663
2657 .search-form{
2664 .search-form{
2658 #q {
2665 #q {
2659 width: @search-form-width;
2666 width: @search-form-width;
2660 }
2667 }
2661 .fields{
2668 .fields{
2662 margin: 0 0 @space;
2669 margin: 0 0 @space;
2663 }
2670 }
2664
2671
2665 label{
2672 label{
2666 display: inline-block;
2673 display: inline-block;
2667 margin-right: @textmargin;
2674 margin-right: @textmargin;
2668 padding-top: 0.25em;
2675 padding-top: 0.25em;
2669 }
2676 }
2670
2677
2671
2678
2672 .results{
2679 .results{
2673 clear: both;
2680 clear: both;
2674 margin: 0 0 @padding;
2681 margin: 0 0 @padding;
2675 }
2682 }
2676
2683
2677 .search-tags {
2684 .search-tags {
2678 padding: 5px 0;
2685 padding: 5px 0;
2679 }
2686 }
2680 }
2687 }
2681
2688
2682 div.search-feedback-items {
2689 div.search-feedback-items {
2683 display: inline-block;
2690 display: inline-block;
2684 }
2691 }
2685
2692
2686 div.search-code-body {
2693 div.search-code-body {
2687 background-color: #ffffff; padding: 5px 0 5px 10px;
2694 background-color: #ffffff; padding: 5px 0 5px 10px;
2688 pre {
2695 pre {
2689 .match { background-color: #faffa6;}
2696 .match { background-color: #faffa6;}
2690 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
2697 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
2691 }
2698 }
2692 }
2699 }
2693
2700
2694 .expand_commit.search {
2701 .expand_commit.search {
2695 .show_more.open {
2702 .show_more.open {
2696 height: auto;
2703 height: auto;
2697 max-height: none;
2704 max-height: none;
2698 }
2705 }
2699 }
2706 }
2700
2707
2701 .search-results {
2708 .search-results {
2702
2709
2703 h2 {
2710 h2 {
2704 margin-bottom: 0;
2711 margin-bottom: 0;
2705 }
2712 }
2706 .codeblock {
2713 .codeblock {
2707 border: none;
2714 border: none;
2708 background: transparent;
2715 background: transparent;
2709 }
2716 }
2710
2717
2711 .codeblock-header {
2718 .codeblock-header {
2712 border: none;
2719 border: none;
2713 background: transparent;
2720 background: transparent;
2714 }
2721 }
2715
2722
2716 .code-body {
2723 .code-body {
2717 border: @border-thickness solid @grey6;
2724 border: @border-thickness solid @grey6;
2718 .border-radius(@border-radius);
2725 .border-radius(@border-radius);
2719 }
2726 }
2720
2727
2721 .td-commit {
2728 .td-commit {
2722 &:extend(pre);
2729 &:extend(pre);
2723 border-bottom: @border-thickness solid @border-default-color;
2730 border-bottom: @border-thickness solid @border-default-color;
2724 }
2731 }
2725
2732
2726 .message {
2733 .message {
2727 height: auto;
2734 height: auto;
2728 max-width: 350px;
2735 max-width: 350px;
2729 white-space: normal;
2736 white-space: normal;
2730 text-overflow: initial;
2737 text-overflow: initial;
2731 overflow: visible;
2738 overflow: visible;
2732
2739
2733 .match { background-color: #faffa6;}
2740 .match { background-color: #faffa6;}
2734 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2741 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2735 }
2742 }
2736
2743
2737 .path {
2744 .path {
2738 border-bottom: none !important;
2745 border-bottom: none !important;
2739 border-left: 1px solid @grey6 !important;
2746 border-left: 1px solid @grey6 !important;
2740 border-right: 1px solid @grey6 !important;
2747 border-right: 1px solid @grey6 !important;
2741 }
2748 }
2742 }
2749 }
2743
2750
2744 table.rctable td.td-search-results div {
2751 table.rctable td.td-search-results div {
2745 max-width: 100%;
2752 max-width: 100%;
2746 }
2753 }
2747
2754
2748 #tip-box, .tip-box{
2755 #tip-box, .tip-box{
2749 padding: @menupadding/2;
2756 padding: @menupadding/2;
2750 display: block;
2757 display: block;
2751 border: @border-thickness solid @border-highlight-color;
2758 border: @border-thickness solid @border-highlight-color;
2752 .border-radius(@border-radius);
2759 .border-radius(@border-radius);
2753 background-color: white;
2760 background-color: white;
2754 z-index: 99;
2761 z-index: 99;
2755 white-space: pre-wrap;
2762 white-space: pre-wrap;
2756 }
2763 }
2757
2764
2758 #linktt {
2765 #linktt {
2759 width: 79px;
2766 width: 79px;
2760 }
2767 }
2761
2768
2762 #help_kb .modal-content{
2769 #help_kb .modal-content{
2763 max-width: 750px;
2770 max-width: 750px;
2764 margin: 10% auto;
2771 margin: 10% auto;
2765
2772
2766 table{
2773 table{
2767 td,th{
2774 td,th{
2768 border-bottom: none;
2775 border-bottom: none;
2769 line-height: 2.5em;
2776 line-height: 2.5em;
2770 }
2777 }
2771 th{
2778 th{
2772 padding-bottom: @textmargin/2;
2779 padding-bottom: @textmargin/2;
2773 }
2780 }
2774 td.keys{
2781 td.keys{
2775 text-align: center;
2782 text-align: center;
2776 }
2783 }
2777 }
2784 }
2778
2785
2779 .block-left{
2786 .block-left{
2780 width: 45%;
2787 width: 45%;
2781 margin-right: 5%;
2788 margin-right: 5%;
2782 }
2789 }
2783 .modal-footer{
2790 .modal-footer{
2784 clear: both;
2791 clear: both;
2785 }
2792 }
2786 .key.tag{
2793 .key.tag{
2787 padding: 0.5em;
2794 padding: 0.5em;
2788 background-color: @rcblue;
2795 background-color: @rcblue;
2789 color: white;
2796 color: white;
2790 border-color: @rcblue;
2797 border-color: @rcblue;
2791 .box-shadow(none);
2798 .box-shadow(none);
2792 }
2799 }
2793 }
2800 }
2794
2801
2795
2802
2796
2803
2797 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2804 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2798
2805
2799 @import 'statistics-graph';
2806 @import 'statistics-graph';
2800 @import 'tables';
2807 @import 'tables';
2801 @import 'forms';
2808 @import 'forms';
2802 @import 'diff';
2809 @import 'diff';
2803 @import 'summary';
2810 @import 'summary';
2804 @import 'navigation';
2811 @import 'navigation';
2805
2812
2806 //--- SHOW/HIDE SECTIONS --//
2813 //--- SHOW/HIDE SECTIONS --//
2807
2814
2808 .btn-collapse {
2815 .btn-collapse {
2809 float: right;
2816 float: right;
2810 text-align: right;
2817 text-align: right;
2811 font-family: @text-light;
2818 font-family: @text-light;
2812 font-size: @basefontsize;
2819 font-size: @basefontsize;
2813 cursor: pointer;
2820 cursor: pointer;
2814 border: none;
2821 border: none;
2815 color: @rcblue;
2822 color: @rcblue;
2816 }
2823 }
2817
2824
2818 table.rctable,
2825 table.rctable,
2819 table.dataTable {
2826 table.dataTable {
2820 .btn-collapse {
2827 .btn-collapse {
2821 float: right;
2828 float: right;
2822 text-align: right;
2829 text-align: right;
2823 }
2830 }
2824 }
2831 }
2825
2832
2826 table.rctable {
2833 table.rctable {
2827 &.permissions {
2834 &.permissions {
2828
2835
2829 th.td-owner {
2836 th.td-owner {
2830 padding: 0;
2837 padding: 0;
2831 }
2838 }
2832
2839
2833 th {
2840 th {
2834 font-weight: normal;
2841 font-weight: normal;
2835 padding: 0 5px;
2842 padding: 0 5px;
2836 }
2843 }
2837
2844
2838 }
2845 }
2839 }
2846 }
2840
2847
2841
2848
2842 // TODO: johbo: Fix for IE10, this avoids that we see a border
2849 // TODO: johbo: Fix for IE10, this avoids that we see a border
2843 // and padding around checkboxes and radio boxes. Move to the right place,
2850 // and padding around checkboxes and radio boxes. Move to the right place,
2844 // or better: Remove this once we did the form refactoring.
2851 // or better: Remove this once we did the form refactoring.
2845 input[type=checkbox],
2852 input[type=checkbox],
2846 input[type=radio] {
2853 input[type=radio] {
2847 padding: 0;
2854 padding: 0;
2848 border: none;
2855 border: none;
2849 }
2856 }
2850
2857
2851 .toggle-ajax-spinner{
2858 .toggle-ajax-spinner{
2852 height: 16px;
2859 height: 16px;
2853 width: 16px;
2860 width: 16px;
2854 }
2861 }
2855
2862
2856
2863
2857 .markup-form .clearfix {
2864 .markup-form .clearfix {
2858 .border-radius(@border-radius);
2865 .border-radius(@border-radius);
2859 margin: 0px;
2866 margin: 0px;
2860 }
2867 }
2861
2868
2862 .markup-form-area {
2869 .markup-form-area {
2863 padding: 8px 12px;
2870 padding: 8px 12px;
2864 border: 1px solid @grey4;
2871 border: 1px solid @grey4;
2865 .border-radius(@border-radius);
2872 .border-radius(@border-radius);
2866 }
2873 }
2867
2874
2868 .markup-form-area-header .nav-links {
2875 .markup-form-area-header .nav-links {
2869 display: flex;
2876 display: flex;
2870 flex-flow: row wrap;
2877 flex-flow: row wrap;
2871 -webkit-flex-flow: row wrap;
2878 -webkit-flex-flow: row wrap;
2872 width: 100%;
2879 width: 100%;
2873 }
2880 }
2874
2881
2875 .markup-form-area-footer {
2882 .markup-form-area-footer {
2876 display: flex;
2883 display: flex;
2877 }
2884 }
2878
2885
2879 .markup-form-area-footer .toolbar {
2886 .markup-form-area-footer .toolbar {
2880
2887
2881 }
2888 }
2882
2889
2883 // markup Form
2890 // markup Form
2884 div.markup-form {
2891 div.markup-form {
2885 margin-top: 20px;
2892 margin-top: 20px;
2886 }
2893 }
2887
2894
2888 .markup-form strong {
2895 .markup-form strong {
2889 display: block;
2896 display: block;
2890 margin-bottom: 15px;
2897 margin-bottom: 15px;
2891 }
2898 }
2892
2899
2893 .markup-form textarea {
2900 .markup-form textarea {
2894 width: 100%;
2901 width: 100%;
2895 height: 100px;
2902 height: 100px;
2896 font-family: @text-monospace;
2903 font-family: @text-monospace;
2897 }
2904 }
2898
2905
2899 form.markup-form {
2906 form.markup-form {
2900 margin-top: 10px;
2907 margin-top: 10px;
2901 margin-left: 10px;
2908 margin-left: 10px;
2902 }
2909 }
2903
2910
2904 .markup-form .comment-block-ta,
2911 .markup-form .comment-block-ta,
2905 .markup-form .preview-box {
2912 .markup-form .preview-box {
2906 .border-radius(@border-radius);
2913 .border-radius(@border-radius);
2907 .box-sizing(border-box);
2914 .box-sizing(border-box);
2908 background-color: white;
2915 background-color: white;
2909 }
2916 }
2910
2917
2911 .markup-form .preview-box.unloaded {
2918 .markup-form .preview-box.unloaded {
2912 height: 50px;
2919 height: 50px;
2913 text-align: center;
2920 text-align: center;
2914 padding: 20px;
2921 padding: 20px;
2915 background-color: white;
2922 background-color: white;
2916 }
2923 }
2917
2924
2918
2925
2919 .dropzone-wrapper {
2926 .dropzone-wrapper {
2920 border: 1px solid @grey5;
2927 border: 1px solid @grey5;
2921 padding: 20px;
2928 padding: 20px;
2922 }
2929 }
2923
2930
2924 .dropzone,
2931 .dropzone,
2925 .dropzone-pure {
2932 .dropzone-pure {
2926 border: 2px dashed @grey5;
2933 border: 2px dashed @grey5;
2927 border-radius: 5px;
2934 border-radius: 5px;
2928 background: white;
2935 background: white;
2929 min-height: 200px;
2936 min-height: 200px;
2930 padding: 54px;
2937 padding: 54px;
2931
2938
2932 .dz-message {
2939 .dz-message {
2933 font-weight: 700;
2940 font-weight: 700;
2934 text-align: center;
2941 text-align: center;
2935 margin: 2em 0;
2942 margin: 2em 0;
2936 }
2943 }
2937
2944
2938 }
2945 }
2939
2946
2940 .dz-preview {
2947 .dz-preview {
2941 margin: 10px 0 !important;
2948 margin: 10px 0 !important;
2942 position: relative;
2949 position: relative;
2943 vertical-align: top;
2950 vertical-align: top;
2944 padding: 10px;
2951 padding: 10px;
2945 border-bottom: 1px solid @grey5;
2952 border-bottom: 1px solid @grey5;
2946 }
2953 }
2947
2954
2948 .dz-filename {
2955 .dz-filename {
2949 font-weight: 700;
2956 font-weight: 700;
2950 float: left;
2957 float: left;
2951 }
2958 }
2952
2959
2953 .dz-sending {
2960 .dz-sending {
2954 float: right;
2961 float: right;
2955 }
2962 }
2956
2963
2957 .dz-response {
2964 .dz-response {
2958 clear: both
2965 clear: both
2959 }
2966 }
2960
2967
2961 .dz-filename-size {
2968 .dz-filename-size {
2962 float: right
2969 float: right
2963 }
2970 }
2964
2971
2965 .dz-error-message {
2972 .dz-error-message {
2966 color: @alert2;
2973 color: @alert2;
2967 padding-top: 10px;
2974 padding-top: 10px;
2968 clear: both;
2975 clear: both;
2969 }
2976 }
2970
2977
2971
2978
2972 .user-hovercard {
2979 .user-hovercard {
2973 padding: 5px;
2980 padding: 5px;
2974 }
2981 }
2975
2982
2976 .user-hovercard-icon {
2983 .user-hovercard-icon {
2977 display: inline;
2984 display: inline;
2978 padding: 0;
2985 padding: 0;
2979 box-sizing: content-box;
2986 box-sizing: content-box;
2980 border-radius: 50%;
2987 border-radius: 50%;
2981 float: left;
2988 float: left;
2982 }
2989 }
2983
2990
2984 .user-hovercard-name {
2991 .user-hovercard-name {
2985 float: right;
2992 float: right;
2986 vertical-align: top;
2993 vertical-align: top;
2987 padding-left: 10px;
2994 padding-left: 10px;
2988 min-width: 150px;
2995 min-width: 150px;
2989 }
2996 }
2990
2997
2991 .user-hovercard-bio {
2998 .user-hovercard-bio {
2992 clear: both;
2999 clear: both;
2993 padding-top: 10px;
3000 padding-top: 10px;
2994 }
3001 }
2995
3002
2996 .user-hovercard-header {
3003 .user-hovercard-header {
2997 clear: both;
3004 clear: both;
2998 min-height: 10px;
3005 min-height: 10px;
2999 }
3006 }
3000
3007
3001 .user-hovercard-footer {
3008 .user-hovercard-footer {
3002 clear: both;
3009 clear: both;
3003 min-height: 10px;
3010 min-height: 10px;
3004 }
3011 }
3005
3012
3006 .user-group-hovercard {
3013 .user-group-hovercard {
3007 padding: 5px;
3014 padding: 5px;
3008 }
3015 }
3009
3016
3010 .user-group-hovercard-icon {
3017 .user-group-hovercard-icon {
3011 display: inline;
3018 display: inline;
3012 padding: 0;
3019 padding: 0;
3013 box-sizing: content-box;
3020 box-sizing: content-box;
3014 border-radius: 50%;
3021 border-radius: 50%;
3015 float: left;
3022 float: left;
3016 }
3023 }
3017
3024
3018 .user-group-hovercard-name {
3025 .user-group-hovercard-name {
3019 float: left;
3026 float: left;
3020 vertical-align: top;
3027 vertical-align: top;
3021 padding-left: 10px;
3028 padding-left: 10px;
3022 min-width: 150px;
3029 min-width: 150px;
3023 }
3030 }
3024
3031
3025 .user-group-hovercard-icon i {
3032 .user-group-hovercard-icon i {
3026 border: 1px solid @grey4;
3033 border: 1px solid @grey4;
3027 border-radius: 4px;
3034 border-radius: 4px;
3028 }
3035 }
3029
3036
3030 .user-group-hovercard-bio {
3037 .user-group-hovercard-bio {
3031 clear: both;
3038 clear: both;
3032 padding-top: 10px;
3039 padding-top: 10px;
3033 line-height: 1.0em;
3040 line-height: 1.0em;
3034 }
3041 }
3035
3042
3036 .user-group-hovercard-header {
3043 .user-group-hovercard-header {
3037 clear: both;
3044 clear: both;
3038 min-height: 10px;
3045 min-height: 10px;
3039 }
3046 }
3040
3047
3041 .user-group-hovercard-footer {
3048 .user-group-hovercard-footer {
3042 clear: both;
3049 clear: both;
3043 min-height: 10px;
3050 min-height: 10px;
3044 }
3051 }
3045
3052
3046 .pr-hovercard-header {
3053 .pr-hovercard-header {
3047 clear: both;
3054 clear: both;
3048 display: block;
3055 display: block;
3049 line-height: 20px;
3056 line-height: 20px;
3050 }
3057 }
3051
3058
3052 .pr-hovercard-user {
3059 .pr-hovercard-user {
3053 display: flex;
3060 display: flex;
3054 align-items: center;
3061 align-items: center;
3055 padding-left: 5px;
3062 padding-left: 5px;
3056 }
3063 }
3057
3064
3058 .pr-hovercard-title {
3065 .pr-hovercard-title {
3059 padding-top: 5px;
3066 padding-top: 5px;
3060 } No newline at end of file
3067 }
@@ -1,1201 +1,1210 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2
2
3 <%!
3 <%!
4 ## base64 filter e.g ${ example | base64 }
4 ## base64 filter e.g ${ example | base64 }
5 def base64(text):
5 def base64(text):
6 import base64
6 import base64
7 from rhodecode.lib.helpers import safe_str
7 from rhodecode.lib.helpers import safe_str
8 return base64.encodestring(safe_str(text))
8 return base64.encodestring(safe_str(text))
9 %>
9 %>
10
10
11 <%inherit file="root.mako"/>
11 <%inherit file="root.mako"/>
12
12
13 <%include file="/ejs_templates/templates.html"/>
13 <%include file="/ejs_templates/templates.html"/>
14
14
15 <div class="outerwrapper">
15 <div class="outerwrapper">
16 <!-- HEADER -->
16 <!-- HEADER -->
17 <div class="header">
17 <div class="header">
18 <div id="header-inner" class="wrapper">
18 <div id="header-inner" class="wrapper">
19 <div id="logo">
19 <div id="logo">
20 <div class="logo-wrapper">
20 <div class="logo-wrapper">
21 <a href="${h.route_path('home')}"><img src="${h.asset('images/rhodecode-logo-white-60x60.png')}" alt="RhodeCode"/></a>
21 <a href="${h.route_path('home')}"><img src="${h.asset('images/rhodecode-logo-white-60x60.png')}" alt="RhodeCode"/></a>
22 </div>
22 </div>
23 % if c.rhodecode_name:
23 % if c.rhodecode_name:
24 <div class="branding">
24 <div class="branding">
25 <a href="${h.route_path('home')}">${h.branding(c.rhodecode_name)}</a>
25 <a href="${h.route_path('home')}">${h.branding(c.rhodecode_name)}</a>
26 </div>
26 </div>
27 % endif
27 % endif
28 </div>
28 </div>
29 <!-- MENU BAR NAV -->
29 <!-- MENU BAR NAV -->
30 ${self.menu_bar_nav()}
30 ${self.menu_bar_nav()}
31 <!-- END MENU BAR NAV -->
31 <!-- END MENU BAR NAV -->
32 </div>
32 </div>
33 </div>
33 </div>
34 ${self.menu_bar_subnav()}
34 ${self.menu_bar_subnav()}
35 <!-- END HEADER -->
35 <!-- END HEADER -->
36
36
37 <!-- CONTENT -->
37 <!-- CONTENT -->
38 <div id="content" class="wrapper">
38 <div id="content" class="wrapper">
39
39
40 <rhodecode-toast id="notifications"></rhodecode-toast>
40 <rhodecode-toast id="notifications"></rhodecode-toast>
41
41
42 <div class="main">
42 <div class="main">
43 ${next.main()}
43 ${next.main()}
44 </div>
44 </div>
45 </div>
45 </div>
46 <!-- END CONTENT -->
46 <!-- END CONTENT -->
47
47
48 </div>
48 </div>
49 <!-- FOOTER -->
49 <!-- FOOTER -->
50 <div id="footer">
50 <div id="footer">
51 <div id="footer-inner" class="title wrapper">
51 <div id="footer-inner" class="title wrapper">
52 <div>
52 <div>
53 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
54
53 <p class="footer-link-right">
55 <p class="footer-link-right">
56 <a class="grey-link-action" href="${h.route_path('home', _query={'showrcid': 1})}">
57 RhodeCode
54 % if c.visual.show_version:
58 % if c.visual.show_version:
55 RhodeCode Enterprise ${c.rhodecode_version} ${c.rhodecode_edition}
59 ${c.rhodecode_version}
56 % endif
60 % endif
57 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
61 ${c.rhodecode_edition}
62 </a> |
63
58 % if c.visual.rhodecode_support_url:
64 % if c.visual.rhodecode_support_url:
59 <a href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a>
65 <a class="grey-link-action" href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a> |
66 <a class="grey-link-action" href="https://docs.rhodecode.com" target="_blank">${_('Documentation')}</a>
60 % endif
67 % endif
68
61 </p>
69 </p>
62 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
70
63 <p class="server-instance" style="display:${sid}">
71 <p class="server-instance" style="display:${sid}">
64 ## display hidden instance ID if specially defined
72 ## display hidden instance ID if specially defined
73 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
65 % if c.rhodecode_instanceid:
74 % if c.rhodecode_instanceid:
66 ${_('RhodeCode instance id: {}').format(c.rhodecode_instanceid)}
75 ${_('RhodeCode instance id: {}').format(c.rhodecode_instanceid)}
67 % endif
76 % endif
68 </p>
77 </p>
69 </div>
78 </div>
70 </div>
79 </div>
71 </div>
80 </div>
72
81
73 <!-- END FOOTER -->
82 <!-- END FOOTER -->
74
83
75 ### MAKO DEFS ###
84 ### MAKO DEFS ###
76
85
77 <%def name="menu_bar_subnav()">
86 <%def name="menu_bar_subnav()">
78 </%def>
87 </%def>
79
88
80 <%def name="breadcrumbs(class_='breadcrumbs')">
89 <%def name="breadcrumbs(class_='breadcrumbs')">
81 <div class="${class_}">
90 <div class="${class_}">
82 ${self.breadcrumbs_links()}
91 ${self.breadcrumbs_links()}
83 </div>
92 </div>
84 </%def>
93 </%def>
85
94
86 <%def name="admin_menu(active=None)">
95 <%def name="admin_menu(active=None)">
87
96
88 <div id="context-bar">
97 <div id="context-bar">
89 <div class="wrapper">
98 <div class="wrapper">
90 <div class="title">
99 <div class="title">
91 <div class="title-content">
100 <div class="title-content">
92 <div class="title-main">
101 <div class="title-main">
93 % if c.is_super_admin:
102 % if c.is_super_admin:
94 ${_('Super-admin Panel')}
103 ${_('Super-admin Panel')}
95 % else:
104 % else:
96 ${_('Delegated Admin Panel')}
105 ${_('Delegated Admin Panel')}
97 % endif
106 % endif
98 </div>
107 </div>
99 </div>
108 </div>
100 </div>
109 </div>
101
110
102 <ul id="context-pages" class="navigation horizontal-list">
111 <ul id="context-pages" class="navigation horizontal-list">
103
112
104 ## super-admin case
113 ## super-admin case
105 % if c.is_super_admin:
114 % if c.is_super_admin:
106 <li class="${h.is_active('audit_logs', active)}"><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
115 <li class="${h.is_active('audit_logs', active)}"><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
107 <li class="${h.is_active('repositories', active)}"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
116 <li class="${h.is_active('repositories', active)}"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
108 <li class="${h.is_active('repository_groups', active)}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
117 <li class="${h.is_active('repository_groups', active)}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
109 <li class="${h.is_active('users', active)}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
118 <li class="${h.is_active('users', active)}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
110 <li class="${h.is_active('user_groups', active)}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
119 <li class="${h.is_active('user_groups', active)}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
111 <li class="${h.is_active('permissions', active)}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
120 <li class="${h.is_active('permissions', active)}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
112 <li class="${h.is_active('authentication', active)}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
121 <li class="${h.is_active('authentication', active)}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
113 <li class="${h.is_active('integrations', active)}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
122 <li class="${h.is_active('integrations', active)}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
114 <li class="${h.is_active('defaults', active)}"><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
123 <li class="${h.is_active('defaults', active)}"><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
115 <li class="${h.is_active('settings', active)}"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
124 <li class="${h.is_active('settings', active)}"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
116
125
117 ## delegated admin
126 ## delegated admin
118 % elif c.is_delegated_admin:
127 % elif c.is_delegated_admin:
119 <%
128 <%
120 repositories=c.auth_user.repositories_admin or c.can_create_repo
129 repositories=c.auth_user.repositories_admin or c.can_create_repo
121 repository_groups=c.auth_user.repository_groups_admin or c.can_create_repo_group
130 repository_groups=c.auth_user.repository_groups_admin or c.can_create_repo_group
122 user_groups=c.auth_user.user_groups_admin or c.can_create_user_group
131 user_groups=c.auth_user.user_groups_admin or c.can_create_user_group
123 %>
132 %>
124
133
125 %if repositories:
134 %if repositories:
126 <li class="${h.is_active('repositories', active)} local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
135 <li class="${h.is_active('repositories', active)} local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
127 %endif
136 %endif
128 %if repository_groups:
137 %if repository_groups:
129 <li class="${h.is_active('repository_groups', active)} local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
138 <li class="${h.is_active('repository_groups', active)} local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
130 %endif
139 %endif
131 %if user_groups:
140 %if user_groups:
132 <li class="${h.is_active('user_groups', active)} local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
141 <li class="${h.is_active('user_groups', active)} local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
133 %endif
142 %endif
134 % endif
143 % endif
135 </ul>
144 </ul>
136
145
137 </div>
146 </div>
138 <div class="clear"></div>
147 <div class="clear"></div>
139 </div>
148 </div>
140 </%def>
149 </%def>
141
150
142 <%def name="dt_info_panel(elements)">
151 <%def name="dt_info_panel(elements)">
143 <dl class="dl-horizontal">
152 <dl class="dl-horizontal">
144 %for dt, dd, title, show_items in elements:
153 %for dt, dd, title, show_items in elements:
145 <dt>${dt}:</dt>
154 <dt>${dt}:</dt>
146 <dd title="${h.tooltip(title)}">
155 <dd title="${h.tooltip(title)}">
147 %if callable(dd):
156 %if callable(dd):
148 ## allow lazy evaluation of elements
157 ## allow lazy evaluation of elements
149 ${dd()}
158 ${dd()}
150 %else:
159 %else:
151 ${dd}
160 ${dd}
152 %endif
161 %endif
153 %if show_items:
162 %if show_items:
154 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
163 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
155 %endif
164 %endif
156 </dd>
165 </dd>
157
166
158 %if show_items:
167 %if show_items:
159 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
168 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
160 %for item in show_items:
169 %for item in show_items:
161 <dt></dt>
170 <dt></dt>
162 <dd>${item}</dd>
171 <dd>${item}</dd>
163 %endfor
172 %endfor
164 </div>
173 </div>
165 %endif
174 %endif
166
175
167 %endfor
176 %endfor
168 </dl>
177 </dl>
169 </%def>
178 </%def>
170
179
171 <%def name="tr_info_entry(element)">
180 <%def name="tr_info_entry(element)">
172 <% key, val, title, show_items = element %>
181 <% key, val, title, show_items = element %>
173
182
174 <tr>
183 <tr>
175 <td style="vertical-align: top">${key}</td>
184 <td style="vertical-align: top">${key}</td>
176 <td title="${h.tooltip(title)}">
185 <td title="${h.tooltip(title)}">
177 %if callable(val):
186 %if callable(val):
178 ## allow lazy evaluation of elements
187 ## allow lazy evaluation of elements
179 ${val()}
188 ${val()}
180 %else:
189 %else:
181 ${val}
190 ${val}
182 %endif
191 %endif
183 %if show_items:
192 %if show_items:
184 <div class="collapsable-content" data-toggle="item-${h.md5_safe(val)[:6]}-details" style="display: none">
193 <div class="collapsable-content" data-toggle="item-${h.md5_safe(val)[:6]}-details" style="display: none">
185 % for item in show_items:
194 % for item in show_items:
186 <dt></dt>
195 <dt></dt>
187 <dd>${item}</dd>
196 <dd>${item}</dd>
188 % endfor
197 % endfor
189 </div>
198 </div>
190 %endif
199 %endif
191 </td>
200 </td>
192 <td style="vertical-align: top">
201 <td style="vertical-align: top">
193 %if show_items:
202 %if show_items:
194 <span class="btn-collapse" data-toggle="item-${h.md5_safe(val)[:6]}-details">${_('Show More')} </span>
203 <span class="btn-collapse" data-toggle="item-${h.md5_safe(val)[:6]}-details">${_('Show More')} </span>
195 %endif
204 %endif
196 </td>
205 </td>
197 </tr>
206 </tr>
198
207
199 </%def>
208 </%def>
200
209
201 <%def name="gravatar(email, size=16, tooltip=False, tooltip_alt=None, user=None, extra_class=None)">
210 <%def name="gravatar(email, size=16, tooltip=False, tooltip_alt=None, user=None, extra_class=None)">
202 <%
211 <%
203 if size > 16:
212 if size > 16:
204 gravatar_class = ['gravatar','gravatar-large']
213 gravatar_class = ['gravatar','gravatar-large']
205 else:
214 else:
206 gravatar_class = ['gravatar']
215 gravatar_class = ['gravatar']
207
216
208 data_hovercard_url = ''
217 data_hovercard_url = ''
209 data_hovercard_alt = tooltip_alt.replace('<', '&lt;').replace('>', '&gt;') if tooltip_alt else ''
218 data_hovercard_alt = tooltip_alt.replace('<', '&lt;').replace('>', '&gt;') if tooltip_alt else ''
210
219
211 if tooltip:
220 if tooltip:
212 gravatar_class += ['tooltip-hovercard']
221 gravatar_class += ['tooltip-hovercard']
213 if extra_class:
222 if extra_class:
214 gravatar_class += extra_class
223 gravatar_class += extra_class
215 if tooltip and user:
224 if tooltip and user:
216 if user.username == h.DEFAULT_USER:
225 if user.username == h.DEFAULT_USER:
217 gravatar_class.pop(-1)
226 gravatar_class.pop(-1)
218 else:
227 else:
219 data_hovercard_url = request.route_path('hovercard_user', user_id=getattr(user, 'user_id', ''))
228 data_hovercard_url = request.route_path('hovercard_user', user_id=getattr(user, 'user_id', ''))
220 gravatar_class = ' '.join(gravatar_class)
229 gravatar_class = ' '.join(gravatar_class)
221
230
222 %>
231 %>
223 <%doc>
232 <%doc>
224 TODO: johbo: For now we serve double size images to make it smooth
233 TODO: johbo: For now we serve double size images to make it smooth
225 for retina. This is how it worked until now. Should be replaced
234 for retina. This is how it worked until now. Should be replaced
226 with a better solution at some point.
235 with a better solution at some point.
227 </%doc>
236 </%doc>
228
237
229 <img class="${gravatar_class}" height="${size}" width="${size}" data-hovercard-url="${data_hovercard_url}" data-hovercard-alt="${data_hovercard_alt}" src="${h.gravatar_url(email, size * 2)}" />
238 <img class="${gravatar_class}" height="${size}" width="${size}" data-hovercard-url="${data_hovercard_url}" data-hovercard-alt="${data_hovercard_alt}" src="${h.gravatar_url(email, size * 2)}" />
230 </%def>
239 </%def>
231
240
232
241
233 <%def name="gravatar_with_user(contact, size=16, show_disabled=False, tooltip=False, _class='rc-user')">
242 <%def name="gravatar_with_user(contact, size=16, show_disabled=False, tooltip=False, _class='rc-user')">
234 <%
243 <%
235 email = h.email_or_none(contact)
244 email = h.email_or_none(contact)
236 rc_user = h.discover_user(contact)
245 rc_user = h.discover_user(contact)
237 %>
246 %>
238
247
239 <div class="${_class}">
248 <div class="${_class}">
240 ${self.gravatar(email, size, tooltip=tooltip, tooltip_alt=contact, user=rc_user)}
249 ${self.gravatar(email, size, tooltip=tooltip, tooltip_alt=contact, user=rc_user)}
241 <span class="${('user user-disabled' if show_disabled else 'user')}"> ${h.link_to_user(rc_user or contact)}</span>
250 <span class="${('user user-disabled' if show_disabled else 'user')}"> ${h.link_to_user(rc_user or contact)}</span>
242 </div>
251 </div>
243 </%def>
252 </%def>
244
253
245
254
246 <%def name="user_group_icon(user_group=None, size=16, tooltip=False)">
255 <%def name="user_group_icon(user_group=None, size=16, tooltip=False)">
247 <%
256 <%
248 if (size > 16):
257 if (size > 16):
249 gravatar_class = 'icon-user-group-alt'
258 gravatar_class = 'icon-user-group-alt'
250 else:
259 else:
251 gravatar_class = 'icon-user-group-alt'
260 gravatar_class = 'icon-user-group-alt'
252
261
253 if tooltip:
262 if tooltip:
254 gravatar_class += ' tooltip-hovercard'
263 gravatar_class += ' tooltip-hovercard'
255
264
256 data_hovercard_url = request.route_path('hovercard_user_group', user_group_id=user_group.users_group_id)
265 data_hovercard_url = request.route_path('hovercard_user_group', user_group_id=user_group.users_group_id)
257 %>
266 %>
258 <%doc>
267 <%doc>
259 TODO: johbo: For now we serve double size images to make it smooth
268 TODO: johbo: For now we serve double size images to make it smooth
260 for retina. This is how it worked until now. Should be replaced
269 for retina. This is how it worked until now. Should be replaced
261 with a better solution at some point.
270 with a better solution at some point.
262 </%doc>
271 </%doc>
263
272
264 <i style="font-size: ${size}px" class="${gravatar_class} x-icon-size-${size}" data-hovercard-url="${data_hovercard_url}"></i>
273 <i style="font-size: ${size}px" class="${gravatar_class} x-icon-size-${size}" data-hovercard-url="${data_hovercard_url}"></i>
265 </%def>
274 </%def>
266
275
267 <%def name="repo_page_title(repo_instance)">
276 <%def name="repo_page_title(repo_instance)">
268 <div class="title-content repo-title">
277 <div class="title-content repo-title">
269
278
270 <div class="title-main">
279 <div class="title-main">
271 ## SVN/HG/GIT icons
280 ## SVN/HG/GIT icons
272 %if h.is_hg(repo_instance):
281 %if h.is_hg(repo_instance):
273 <i class="icon-hg"></i>
282 <i class="icon-hg"></i>
274 %endif
283 %endif
275 %if h.is_git(repo_instance):
284 %if h.is_git(repo_instance):
276 <i class="icon-git"></i>
285 <i class="icon-git"></i>
277 %endif
286 %endif
278 %if h.is_svn(repo_instance):
287 %if h.is_svn(repo_instance):
279 <i class="icon-svn"></i>
288 <i class="icon-svn"></i>
280 %endif
289 %endif
281
290
282 ## public/private
291 ## public/private
283 %if repo_instance.private:
292 %if repo_instance.private:
284 <i class="icon-repo-private"></i>
293 <i class="icon-repo-private"></i>
285 %else:
294 %else:
286 <i class="icon-repo-public"></i>
295 <i class="icon-repo-public"></i>
287 %endif
296 %endif
288
297
289 ## repo name with group name
298 ## repo name with group name
290 ${h.breadcrumb_repo_link(repo_instance)}
299 ${h.breadcrumb_repo_link(repo_instance)}
291
300
292 ## Context Actions
301 ## Context Actions
293 <div class="pull-right">
302 <div class="pull-right">
294 %if c.rhodecode_user.username != h.DEFAULT_USER:
303 %if c.rhodecode_user.username != h.DEFAULT_USER:
295 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_uid, _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
304 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_uid, _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
296
305
297 <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 '')}">
306 <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 '')}">
298 % if c.repository_is_user_following:
307 % if c.repository_is_user_following:
299 <i class="icon-eye-off"></i>${_('Unwatch')}
308 <i class="icon-eye-off"></i>${_('Unwatch')}
300 % else:
309 % else:
301 <i class="icon-eye"></i>${_('Watch')}
310 <i class="icon-eye"></i>${_('Watch')}
302 % endif
311 % endif
303
312
304 </a>
313 </a>
305 %else:
314 %else:
306 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_uid)}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
315 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_uid)}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
307 %endif
316 %endif
308 </div>
317 </div>
309
318
310 </div>
319 </div>
311
320
312 ## FORKED
321 ## FORKED
313 %if repo_instance.fork:
322 %if repo_instance.fork:
314 <p class="discreet">
323 <p class="discreet">
315 <i class="icon-code-fork"></i> ${_('Fork of')}
324 <i class="icon-code-fork"></i> ${_('Fork of')}
316 ${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))}
325 ${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))}
317 </p>
326 </p>
318 %endif
327 %endif
319
328
320 ## IMPORTED FROM REMOTE
329 ## IMPORTED FROM REMOTE
321 %if repo_instance.clone_uri:
330 %if repo_instance.clone_uri:
322 <p class="discreet">
331 <p class="discreet">
323 <i class="icon-code-fork"></i> ${_('Clone from')}
332 <i class="icon-code-fork"></i> ${_('Clone from')}
324 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
333 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
325 </p>
334 </p>
326 %endif
335 %endif
327
336
328 ## LOCKING STATUS
337 ## LOCKING STATUS
329 %if repo_instance.locked[0]:
338 %if repo_instance.locked[0]:
330 <p class="locking_locked discreet">
339 <p class="locking_locked discreet">
331 <i class="icon-repo-lock"></i>
340 <i class="icon-repo-lock"></i>
332 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
341 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
333 </p>
342 </p>
334 %elif repo_instance.enable_locking:
343 %elif repo_instance.enable_locking:
335 <p class="locking_unlocked discreet">
344 <p class="locking_unlocked discreet">
336 <i class="icon-repo-unlock"></i>
345 <i class="icon-repo-unlock"></i>
337 ${_('Repository not locked. Pull repository to lock it.')}
346 ${_('Repository not locked. Pull repository to lock it.')}
338 </p>
347 </p>
339 %endif
348 %endif
340
349
341 </div>
350 </div>
342 </%def>
351 </%def>
343
352
344 <%def name="repo_menu(active=None)">
353 <%def name="repo_menu(active=None)">
345 <%
354 <%
346 ## determine if we have "any" option available
355 ## determine if we have "any" option available
347 can_lock = h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking
356 can_lock = h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking
348 has_actions = can_lock
357 has_actions = can_lock
349
358
350 %>
359 %>
351 % if c.rhodecode_db_repo.archived:
360 % if c.rhodecode_db_repo.archived:
352 <div class="alert alert-warning text-center">
361 <div class="alert alert-warning text-center">
353 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
362 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
354 </div>
363 </div>
355 % endif
364 % endif
356
365
357 <!--- REPO CONTEXT BAR -->
366 <!--- REPO CONTEXT BAR -->
358 <div id="context-bar">
367 <div id="context-bar">
359 <div class="wrapper">
368 <div class="wrapper">
360
369
361 <div class="title">
370 <div class="title">
362 ${self.repo_page_title(c.rhodecode_db_repo)}
371 ${self.repo_page_title(c.rhodecode_db_repo)}
363 </div>
372 </div>
364
373
365 <ul id="context-pages" class="navigation horizontal-list">
374 <ul id="context-pages" class="navigation horizontal-list">
366 <li class="${h.is_active('summary', active)}"><a class="menulink" href="${h.route_path('repo_summary', repo_name=c.repo_name)}"><div class="menulabel">${_('Summary')}</div></a></li>
375 <li class="${h.is_active('summary', active)}"><a class="menulink" href="${h.route_path('repo_summary', repo_name=c.repo_name)}"><div class="menulabel">${_('Summary')}</div></a></li>
367 <li class="${h.is_active('commits', active)}"><a class="menulink" href="${h.route_path('repo_commits', repo_name=c.repo_name)}"><div class="menulabel">${_('Commits')}</div></a></li>
376 <li class="${h.is_active('commits', active)}"><a class="menulink" href="${h.route_path('repo_commits', repo_name=c.repo_name)}"><div class="menulabel">${_('Commits')}</div></a></li>
368 <li class="${h.is_active('files', active)}"><a class="menulink" href="${h.repo_files_by_ref_url(c.repo_name, c.rhodecode_db_repo.repo_type, f_path='', ref_name=c.rhodecode_db_repo.landing_ref_name, commit_id='tip', query={'at':c.rhodecode_db_repo.landing_ref_name})}"><div class="menulabel">${_('Files')}</div></a></li>
377 <li class="${h.is_active('files', active)}"><a class="menulink" href="${h.repo_files_by_ref_url(c.repo_name, c.rhodecode_db_repo.repo_type, f_path='', ref_name=c.rhodecode_db_repo.landing_ref_name, commit_id='tip', query={'at':c.rhodecode_db_repo.landing_ref_name})}"><div class="menulabel">${_('Files')}</div></a></li>
369 <li class="${h.is_active('compare', active)}"><a class="menulink" href="${h.route_path('repo_compare_select',repo_name=c.repo_name)}"><div class="menulabel">${_('Compare')}</div></a></li>
378 <li class="${h.is_active('compare', active)}"><a class="menulink" href="${h.route_path('repo_compare_select',repo_name=c.repo_name)}"><div class="menulabel">${_('Compare')}</div></a></li>
370
379
371 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
380 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
372 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
381 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
373 <li class="${h.is_active('showpullrequest', active)}">
382 <li class="${h.is_active('showpullrequest', active)}">
374 <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)}">
383 <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)}">
375 <div class="menulabel">
384 <div class="menulabel">
376 ${_('Pull Requests')} <span class="menulink-counter">${c.repository_pull_requests}</span>
385 ${_('Pull Requests')} <span class="menulink-counter">${c.repository_pull_requests}</span>
377 </div>
386 </div>
378 </a>
387 </a>
379 </li>
388 </li>
380 %endif
389 %endif
381
390
382 <li class="${h.is_active('artifacts', active)}">
391 <li class="${h.is_active('artifacts', active)}">
383 <a class="menulink" href="${h.route_path('repo_artifacts_list',repo_name=c.repo_name)}">
392 <a class="menulink" href="${h.route_path('repo_artifacts_list',repo_name=c.repo_name)}">
384 <div class="menulabel">
393 <div class="menulabel">
385 ${_('Artifacts')} <span class="menulink-counter">${c.repository_artifacts}</span>
394 ${_('Artifacts')} <span class="menulink-counter">${c.repository_artifacts}</span>
386 </div>
395 </div>
387 </a>
396 </a>
388 </li>
397 </li>
389
398
390 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
399 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
391 <li class="${h.is_active('settings', active)}"><a class="menulink" href="${h.route_path('edit_repo',repo_name=c.repo_name)}"><div class="menulabel">${_('Repository Settings')}</div></a></li>
400 <li class="${h.is_active('settings', active)}"><a class="menulink" href="${h.route_path('edit_repo',repo_name=c.repo_name)}"><div class="menulabel">${_('Repository Settings')}</div></a></li>
392 %endif
401 %endif
393
402
394 <li class="${h.is_active('options', active)}">
403 <li class="${h.is_active('options', active)}">
395 % if has_actions:
404 % if has_actions:
396 <a class="menulink dropdown">
405 <a class="menulink dropdown">
397 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
406 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
398 </a>
407 </a>
399 <ul class="submenu">
408 <ul class="submenu">
400 %if can_lock:
409 %if can_lock:
401 %if c.rhodecode_db_repo.locked[0]:
410 %if c.rhodecode_db_repo.locked[0]:
402 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock Repository')}</a></li>
411 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock Repository')}</a></li>
403 %else:
412 %else:
404 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock Repository')}</a></li>
413 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock Repository')}</a></li>
405 %endif
414 %endif
406 %endif
415 %endif
407 </ul>
416 </ul>
408 % endif
417 % endif
409 </li>
418 </li>
410
419
411 </ul>
420 </ul>
412 </div>
421 </div>
413 <div class="clear"></div>
422 <div class="clear"></div>
414 </div>
423 </div>
415
424
416 <!--- REPO END CONTEXT BAR -->
425 <!--- REPO END CONTEXT BAR -->
417
426
418 </%def>
427 </%def>
419
428
420 <%def name="repo_group_page_title(repo_group_instance)">
429 <%def name="repo_group_page_title(repo_group_instance)">
421 <div class="title-content">
430 <div class="title-content">
422 <div class="title-main">
431 <div class="title-main">
423 ## Repository Group icon
432 ## Repository Group icon
424 <i class="icon-repo-group"></i>
433 <i class="icon-repo-group"></i>
425
434
426 ## repo name with group name
435 ## repo name with group name
427 ${h.breadcrumb_repo_group_link(repo_group_instance)}
436 ${h.breadcrumb_repo_group_link(repo_group_instance)}
428 </div>
437 </div>
429
438
430 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
439 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
431 <div class="repo-group-desc discreet">
440 <div class="repo-group-desc discreet">
432 ${dt.repo_group_desc(repo_group_instance.description_safe, repo_group_instance.personal, c.visual.stylify_metatags)}
441 ${dt.repo_group_desc(repo_group_instance.description_safe, repo_group_instance.personal, c.visual.stylify_metatags)}
433 </div>
442 </div>
434
443
435 </div>
444 </div>
436 </%def>
445 </%def>
437
446
438
447
439 <%def name="repo_group_menu(active=None)">
448 <%def name="repo_group_menu(active=None)">
440 <%
449 <%
441 gr_name = c.repo_group.group_name if c.repo_group else None
450 gr_name = c.repo_group.group_name if c.repo_group else None
442 # create repositories with write permission on group is set to true
451 # create repositories with write permission on group is set to true
443 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
452 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
444
453
445 %>
454 %>
446
455
447
456
448 <!--- REPO GROUP CONTEXT BAR -->
457 <!--- REPO GROUP CONTEXT BAR -->
449 <div id="context-bar">
458 <div id="context-bar">
450 <div class="wrapper">
459 <div class="wrapper">
451 <div class="title">
460 <div class="title">
452 ${self.repo_group_page_title(c.repo_group)}
461 ${self.repo_group_page_title(c.repo_group)}
453 </div>
462 </div>
454
463
455 <ul id="context-pages" class="navigation horizontal-list">
464 <ul id="context-pages" class="navigation horizontal-list">
456 <li class="${h.is_active('home', active)}">
465 <li class="${h.is_active('home', active)}">
457 <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>
466 <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>
458 </li>
467 </li>
459 % if c.is_super_admin or group_admin:
468 % if c.is_super_admin or group_admin:
460 <li class="${h.is_active('settings', active)}">
469 <li class="${h.is_active('settings', active)}">
461 <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>
470 <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>
462 </li>
471 </li>
463 % endif
472 % endif
464
473
465 </ul>
474 </ul>
466 </div>
475 </div>
467 <div class="clear"></div>
476 <div class="clear"></div>
468 </div>
477 </div>
469
478
470 <!--- REPO GROUP CONTEXT BAR -->
479 <!--- REPO GROUP CONTEXT BAR -->
471
480
472 </%def>
481 </%def>
473
482
474
483
475 <%def name="usermenu(active=False)">
484 <%def name="usermenu(active=False)">
476 <%
485 <%
477 not_anonymous = c.rhodecode_user.username != h.DEFAULT_USER
486 not_anonymous = c.rhodecode_user.username != h.DEFAULT_USER
478
487
479 gr_name = c.repo_group.group_name if (hasattr(c, 'repo_group') and c.repo_group) else None
488 gr_name = c.repo_group.group_name if (hasattr(c, 'repo_group') and c.repo_group) else None
480 # create repositories with write permission on group is set to true
489 # create repositories with write permission on group is set to true
481
490
482 can_fork = c.is_super_admin or h.HasPermissionAny('hg.fork.repository')()
491 can_fork = c.is_super_admin or h.HasPermissionAny('hg.fork.repository')()
483 create_on_write = h.HasPermissionAny('hg.create.write_on_repogroup.true')()
492 create_on_write = h.HasPermissionAny('hg.create.write_on_repogroup.true')()
484 group_write = h.HasRepoGroupPermissionAny('group.write')(gr_name, 'can write into group index page')
493 group_write = h.HasRepoGroupPermissionAny('group.write')(gr_name, 'can write into group index page')
485 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
494 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
486
495
487 can_create_repos = c.is_super_admin or c.can_create_repo
496 can_create_repos = c.is_super_admin or c.can_create_repo
488 can_create_repo_groups = c.is_super_admin or c.can_create_repo_group
497 can_create_repo_groups = c.is_super_admin or c.can_create_repo_group
489
498
490 can_create_repos_in_group = c.is_super_admin or group_admin or (group_write and create_on_write)
499 can_create_repos_in_group = c.is_super_admin or group_admin or (group_write and create_on_write)
491 can_create_repo_groups_in_group = c.is_super_admin or group_admin
500 can_create_repo_groups_in_group = c.is_super_admin or group_admin
492 %>
501 %>
493
502
494 % if not_anonymous:
503 % if not_anonymous:
495 <%
504 <%
496 default_target_group = dict()
505 default_target_group = dict()
497 if c.rhodecode_user.personal_repo_group:
506 if c.rhodecode_user.personal_repo_group:
498 default_target_group = dict(parent_group=c.rhodecode_user.personal_repo_group.group_id)
507 default_target_group = dict(parent_group=c.rhodecode_user.personal_repo_group.group_id)
499 %>
508 %>
500
509
501 ## create action
510 ## create action
502 <li>
511 <li>
503 <a href="#create-actions" onclick="return false;" class="menulink childs">
512 <a href="#create-actions" onclick="return false;" class="menulink childs">
504 <i class="tooltip icon-plus-circled" title="${_('Create')}"></i>
513 <i class="tooltip icon-plus-circled" title="${_('Create')}"></i>
505 </a>
514 </a>
506
515
507 <div class="action-menu submenu">
516 <div class="action-menu submenu">
508
517
509 <ol>
518 <ol>
510 ## scope of within a repository
519 ## scope of within a repository
511 % if hasattr(c, 'rhodecode_db_repo') and c.rhodecode_db_repo:
520 % if hasattr(c, 'rhodecode_db_repo') and c.rhodecode_db_repo:
512 <li class="submenu-title">${_('This Repository')}</li>
521 <li class="submenu-title">${_('This Repository')}</li>
513 <li>
522 <li>
514 <a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a>
523 <a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a>
515 </li>
524 </li>
516 % if can_fork:
525 % if can_fork:
517 <li>
526 <li>
518 <a href="${h.route_path('repo_fork_new',repo_name=c.repo_name,_query=default_target_group)}">${_('Fork this repository')}</a>
527 <a href="${h.route_path('repo_fork_new',repo_name=c.repo_name,_query=default_target_group)}">${_('Fork this repository')}</a>
519 </li>
528 </li>
520 % endif
529 % endif
521 % endif
530 % endif
522
531
523 ## scope of within repository groups
532 ## scope of within repository groups
524 % if hasattr(c, 'repo_group') and c.repo_group and (can_create_repos_in_group or can_create_repo_groups_in_group):
533 % if hasattr(c, 'repo_group') and c.repo_group and (can_create_repos_in_group or can_create_repo_groups_in_group):
525 <li class="submenu-title">${_('This Repository Group')}</li>
534 <li class="submenu-title">${_('This Repository Group')}</li>
526
535
527 % if can_create_repos_in_group:
536 % if can_create_repos_in_group:
528 <li>
537 <li>
529 <a href="${h.route_path('repo_new',_query=dict(parent_group=c.repo_group.group_id))}">${_('New Repository')}</a>
538 <a href="${h.route_path('repo_new',_query=dict(parent_group=c.repo_group.group_id))}">${_('New Repository')}</a>
530 </li>
539 </li>
531 % endif
540 % endif
532
541
533 % if can_create_repo_groups_in_group:
542 % if can_create_repo_groups_in_group:
534 <li>
543 <li>
535 <a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.repo_group.group_id))}">${_(u'New Repository Group')}</a>
544 <a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.repo_group.group_id))}">${_(u'New Repository Group')}</a>
536 </li>
545 </li>
537 % endif
546 % endif
538 % endif
547 % endif
539
548
540 ## personal group
549 ## personal group
541 % if c.rhodecode_user.personal_repo_group:
550 % if c.rhodecode_user.personal_repo_group:
542 <li class="submenu-title">Personal Group</li>
551 <li class="submenu-title">Personal Group</li>
543
552
544 <li>
553 <li>
545 <a href="${h.route_path('repo_new',_query=dict(parent_group=c.rhodecode_user.personal_repo_group.group_id))}" >${_('New Repository')} </a>
554 <a href="${h.route_path('repo_new',_query=dict(parent_group=c.rhodecode_user.personal_repo_group.group_id))}" >${_('New Repository')} </a>
546 </li>
555 </li>
547
556
548 <li>
557 <li>
549 <a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.rhodecode_user.personal_repo_group.group_id))}">${_('New Repository Group')} </a>
558 <a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.rhodecode_user.personal_repo_group.group_id))}">${_('New Repository Group')} </a>
550 </li>
559 </li>
551 % endif
560 % endif
552
561
553 ## Global actions
562 ## Global actions
554 <li class="submenu-title">RhodeCode</li>
563 <li class="submenu-title">RhodeCode</li>
555 % if can_create_repos:
564 % if can_create_repos:
556 <li>
565 <li>
557 <a href="${h.route_path('repo_new')}" >${_('New Repository')}</a>
566 <a href="${h.route_path('repo_new')}" >${_('New Repository')}</a>
558 </li>
567 </li>
559 % endif
568 % endif
560
569
561 % if can_create_repo_groups:
570 % if can_create_repo_groups:
562 <li>
571 <li>
563 <a href="${h.route_path('repo_group_new')}" >${_(u'New Repository Group')}</a>
572 <a href="${h.route_path('repo_group_new')}" >${_(u'New Repository Group')}</a>
564 </li>
573 </li>
565 % endif
574 % endif
566
575
567 <li>
576 <li>
568 <a href="${h.route_path('gists_new')}">${_(u'New Gist')}</a>
577 <a href="${h.route_path('gists_new')}">${_(u'New Gist')}</a>
569 </li>
578 </li>
570
579
571 </ol>
580 </ol>
572
581
573 </div>
582 </div>
574 </li>
583 </li>
575
584
576 ## notifications
585 ## notifications
577 <li>
586 <li>
578 <a class="${('empty' if c.unread_notifications == 0 else '')}" href="${h.route_path('notifications_show_all')}">
587 <a class="${('empty' if c.unread_notifications == 0 else '')}" href="${h.route_path('notifications_show_all')}">
579 ${c.unread_notifications}
588 ${c.unread_notifications}
580 </a>
589 </a>
581 </li>
590 </li>
582 % endif
591 % endif
583
592
584 ## USER MENU
593 ## USER MENU
585 <li id="quick_login_li" class="${'active' if active else ''}">
594 <li id="quick_login_li" class="${'active' if active else ''}">
586 % if c.rhodecode_user.username == h.DEFAULT_USER:
595 % if c.rhodecode_user.username == h.DEFAULT_USER:
587 <a id="quick_login_link" class="menulink childs" href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">
596 <a id="quick_login_link" class="menulink childs" href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">
588 ${gravatar(c.rhodecode_user.email, 20)}
597 ${gravatar(c.rhodecode_user.email, 20)}
589 <span class="user">
598 <span class="user">
590 <span>${_('Sign in')}</span>
599 <span>${_('Sign in')}</span>
591 </span>
600 </span>
592 </a>
601 </a>
593 % else:
602 % else:
594 ## logged in user
603 ## logged in user
595 <a id="quick_login_link" class="menulink childs">
604 <a id="quick_login_link" class="menulink childs">
596 ${gravatar(c.rhodecode_user.email, 20)}
605 ${gravatar(c.rhodecode_user.email, 20)}
597 <span class="user">
606 <span class="user">
598 <span class="menu_link_user">${c.rhodecode_user.username}</span>
607 <span class="menu_link_user">${c.rhodecode_user.username}</span>
599 <div class="show_more"></div>
608 <div class="show_more"></div>
600 </span>
609 </span>
601 </a>
610 </a>
602 ## subnav with menu for logged in user
611 ## subnav with menu for logged in user
603 <div class="user-menu submenu">
612 <div class="user-menu submenu">
604 <div id="quick_login">
613 <div id="quick_login">
605 %if c.rhodecode_user.username != h.DEFAULT_USER:
614 %if c.rhodecode_user.username != h.DEFAULT_USER:
606 <div class="">
615 <div class="">
607 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
616 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
608 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
617 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
609 <div class="email">${c.rhodecode_user.email}</div>
618 <div class="email">${c.rhodecode_user.email}</div>
610 </div>
619 </div>
611 <div class="">
620 <div class="">
612 <ol class="links">
621 <ol class="links">
613 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
622 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
614 % if c.rhodecode_user.personal_repo_group:
623 % if c.rhodecode_user.personal_repo_group:
615 <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>
624 <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>
616 % endif
625 % endif
617 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
626 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
618
627
619 % if c.debug_style:
628 % if c.debug_style:
620 <li>
629 <li>
621 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
630 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
622 <div class="menulabel">${_('[Style]')}</div>
631 <div class="menulabel">${_('[Style]')}</div>
623 </a>
632 </a>
624 </li>
633 </li>
625 % endif
634 % endif
626
635
627 ## bookmark-items
636 ## bookmark-items
628 <li class="bookmark-items">
637 <li class="bookmark-items">
629 ${_('Bookmarks')}
638 ${_('Bookmarks')}
630 <div class="pull-right">
639 <div class="pull-right">
631 <a href="${h.route_path('my_account_bookmarks')}">
640 <a href="${h.route_path('my_account_bookmarks')}">
632
641
633 <i class="icon-cog"></i>
642 <i class="icon-cog"></i>
634 </a>
643 </a>
635 </div>
644 </div>
636 </li>
645 </li>
637 % if not c.bookmark_items:
646 % if not c.bookmark_items:
638 <li>
647 <li>
639 <a href="${h.route_path('my_account_bookmarks')}">${_('No Bookmarks yet.')}</a>
648 <a href="${h.route_path('my_account_bookmarks')}">${_('No Bookmarks yet.')}</a>
640 </li>
649 </li>
641 % endif
650 % endif
642 % for item in c.bookmark_items:
651 % for item in c.bookmark_items:
643 <li>
652 <li>
644 % if item.repository:
653 % if item.repository:
645 <div>
654 <div>
646 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
655 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
647 <code>${item.position}</code>
656 <code>${item.position}</code>
648 % if item.repository.repo_type == 'hg':
657 % if item.repository.repo_type == 'hg':
649 <i class="icon-hg" title="${_('Repository')}" style="font-size: 16px"></i>
658 <i class="icon-hg" title="${_('Repository')}" style="font-size: 16px"></i>
650 % elif item.repository.repo_type == 'git':
659 % elif item.repository.repo_type == 'git':
651 <i class="icon-git" title="${_('Repository')}" style="font-size: 16px"></i>
660 <i class="icon-git" title="${_('Repository')}" style="font-size: 16px"></i>
652 % elif item.repository.repo_type == 'svn':
661 % elif item.repository.repo_type == 'svn':
653 <i class="icon-svn" title="${_('Repository')}" style="font-size: 16px"></i>
662 <i class="icon-svn" title="${_('Repository')}" style="font-size: 16px"></i>
654 % endif
663 % endif
655 ${(item.title or h.shorter(item.repository.repo_name, 30))}
664 ${(item.title or h.shorter(item.repository.repo_name, 30))}
656 </a>
665 </a>
657 </div>
666 </div>
658 % elif item.repository_group:
667 % elif item.repository_group:
659 <div>
668 <div>
660 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
669 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
661 <code>${item.position}</code>
670 <code>${item.position}</code>
662 <i class="icon-repo-group" title="${_('Repository group')}" style="font-size: 14px"></i>
671 <i class="icon-repo-group" title="${_('Repository group')}" style="font-size: 14px"></i>
663 ${(item.title or h.shorter(item.repository_group.group_name, 30))}
672 ${(item.title or h.shorter(item.repository_group.group_name, 30))}
664 </a>
673 </a>
665 </div>
674 </div>
666 % else:
675 % else:
667 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
676 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
668 <code>${item.position}</code>
677 <code>${item.position}</code>
669 ${item.title}
678 ${item.title}
670 </a>
679 </a>
671 % endif
680 % endif
672 </li>
681 </li>
673 % endfor
682 % endfor
674
683
675 <li class="logout">
684 <li class="logout">
676 ${h.secure_form(h.route_path('logout'), request=request)}
685 ${h.secure_form(h.route_path('logout'), request=request)}
677 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
686 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
678 ${h.end_form()}
687 ${h.end_form()}
679 </li>
688 </li>
680 </ol>
689 </ol>
681 </div>
690 </div>
682 %endif
691 %endif
683 </div>
692 </div>
684 </div>
693 </div>
685
694
686 % endif
695 % endif
687 </li>
696 </li>
688 </%def>
697 </%def>
689
698
690 <%def name="menu_items(active=None)">
699 <%def name="menu_items(active=None)">
691 <%
700 <%
692 notice_messages, notice_level = c.rhodecode_user.get_notice_messages()
701 notice_messages, notice_level = c.rhodecode_user.get_notice_messages()
693 notice_display = 'none' if len(notice_messages) == 0 else ''
702 notice_display = 'none' if len(notice_messages) == 0 else ''
694 %>
703 %>
695 <style>
704 <style>
696
705
697 </style>
706 </style>
698
707
699 <ul id="quick" class="main_nav navigation horizontal-list">
708 <ul id="quick" class="main_nav navigation horizontal-list">
700 ## notice box for important system messages
709 ## notice box for important system messages
701 <li style="display: ${notice_display}">
710 <li style="display: ${notice_display}">
702 <a class="notice-box" href="#openNotice" onclick="$('.notice-messages-container').toggle(); return false">
711 <a class="notice-box" href="#openNotice" onclick="$('.notice-messages-container').toggle(); return false">
703 <div class="menulabel-notice ${notice_level}" >
712 <div class="menulabel-notice ${notice_level}" >
704 ${len(notice_messages)}
713 ${len(notice_messages)}
705 </div>
714 </div>
706 </a>
715 </a>
707 </li>
716 </li>
708 <div class="notice-messages-container" style="display: none">
717 <div class="notice-messages-container" style="display: none">
709 <div class="notice-messages">
718 <div class="notice-messages">
710 <table class="rctable">
719 <table class="rctable">
711 % for notice in notice_messages:
720 % for notice in notice_messages:
712 <tr id="notice-message-${notice['msg_id']}" class="notice-message-${notice['level']}">
721 <tr id="notice-message-${notice['msg_id']}" class="notice-message-${notice['level']}">
713 <td style="vertical-align: text-top; width: 20px">
722 <td style="vertical-align: text-top; width: 20px">
714 <i class="tooltip icon-info notice-color-${notice['level']}" title="${notice['level']}"></i>
723 <i class="tooltip icon-info notice-color-${notice['level']}" title="${notice['level']}"></i>
715 </td>
724 </td>
716 <td>
725 <td>
717 <span><i class="icon-plus-squared cursor-pointer" onclick="$('#notice-${notice['msg_id']}').toggle()"></i> </span>
726 <span><i class="icon-plus-squared cursor-pointer" onclick="$('#notice-${notice['msg_id']}').toggle()"></i> </span>
718 ${notice['subject']}
727 ${notice['subject']}
719
728
720 <div id="notice-${notice['msg_id']}" style="display: none">
729 <div id="notice-${notice['msg_id']}" style="display: none">
721 ${h.render(notice['body'], renderer='markdown')}
730 ${h.render(notice['body'], renderer='markdown')}
722 </div>
731 </div>
723 </td>
732 </td>
724 <td style="vertical-align: text-top; width: 35px;">
733 <td style="vertical-align: text-top; width: 35px;">
725 <a class="tooltip" title="${_('dismiss')}" href="#dismiss" onclick="dismissNotice(${notice['msg_id']});return false">
734 <a class="tooltip" title="${_('dismiss')}" href="#dismiss" onclick="dismissNotice(${notice['msg_id']});return false">
726 <i class="icon-remove icon-filled-red"></i>
735 <i class="icon-remove icon-filled-red"></i>
727 </a>
736 </a>
728 </td>
737 </td>
729 </tr>
738 </tr>
730
739
731 % endfor
740 % endfor
732 </table>
741 </table>
733 </div>
742 </div>
734 </div>
743 </div>
735 ## Main filter
744 ## Main filter
736 <li>
745 <li>
737 <div class="menulabel main_filter_box">
746 <div class="menulabel main_filter_box">
738 <div class="main_filter_input_box">
747 <div class="main_filter_input_box">
739 <ul class="searchItems">
748 <ul class="searchItems">
740
749
741 <li class="searchTag searchTagIcon">
750 <li class="searchTag searchTagIcon">
742 <i class="icon-search"></i>
751 <i class="icon-search"></i>
743 </li>
752 </li>
744
753
745 % if c.template_context['search_context']['repo_id']:
754 % if c.template_context['search_context']['repo_id']:
746 <li class="searchTag searchTagFilter searchTagHidable" >
755 <li class="searchTag searchTagFilter searchTagHidable" >
747 ##<a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">
756 ##<a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">
748 <span class="tag">
757 <span class="tag">
749 This repo
758 This repo
750 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
759 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
751 </span>
760 </span>
752 ##</a>
761 ##</a>
753 </li>
762 </li>
754 % elif c.template_context['search_context']['repo_group_id']:
763 % elif c.template_context['search_context']['repo_group_id']:
755 <li class="searchTag searchTagFilter searchTagHidable">
764 <li class="searchTag searchTagFilter searchTagHidable">
756 ##<a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">
765 ##<a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">
757 <span class="tag">
766 <span class="tag">
758 This group
767 This group
759 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
768 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
760 </span>
769 </span>
761 ##</a>
770 ##</a>
762 </li>
771 </li>
763 % endif
772 % endif
764
773
765 <li class="searchTagInput">
774 <li class="searchTagInput">
766 <input class="main_filter_input" id="main_filter" size="25" type="text" name="main_filter" placeholder="${_('search / go to...')}" value="" />
775 <input class="main_filter_input" id="main_filter" size="25" type="text" name="main_filter" placeholder="${_('search / go to...')}" value="" />
767 </li>
776 </li>
768 <li class="searchTag searchTagHelp">
777 <li class="searchTag searchTagHelp">
769 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
778 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
770 </li>
779 </li>
771 </ul>
780 </ul>
772 </div>
781 </div>
773 </div>
782 </div>
774
783
775 <div id="main_filter_help" style="display: none">
784 <div id="main_filter_help" style="display: none">
776 - Use '/' key to quickly access this field.
785 - Use '/' key to quickly access this field.
777
786
778 - Enter a name of repository, or repository group for quick search.
787 - Enter a name of repository, or repository group for quick search.
779
788
780 - Prefix query to allow special search:
789 - Prefix query to allow special search:
781
790
782 user:admin, to search for usernames, always global
791 user:admin, to search for usernames, always global
783
792
784 user_group:devops, to search for user groups, always global
793 user_group:devops, to search for user groups, always global
785
794
786 pr:303, to search for pull request number, title, or description, always global
795 pr:303, to search for pull request number, title, or description, always global
787
796
788 commit:efced4, to search for commits, scoped to repositories or groups
797 commit:efced4, to search for commits, scoped to repositories or groups
789
798
790 file:models.py, to search for file paths, scoped to repositories or groups
799 file:models.py, to search for file paths, scoped to repositories or groups
791
800
792 % if c.template_context['search_context']['repo_id']:
801 % if c.template_context['search_context']['repo_id']:
793 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>
802 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>
794 % elif c.template_context['search_context']['repo_group_id']:
803 % elif c.template_context['search_context']['repo_group_id']:
795 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>
804 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>
796 % else:
805 % else:
797 For advanced full text search visit: <a href="${h.route_path('search')}">global search</a>
806 For advanced full text search visit: <a href="${h.route_path('search')}">global search</a>
798 % endif
807 % endif
799 </div>
808 </div>
800 </li>
809 </li>
801
810
802 ## ROOT MENU
811 ## ROOT MENU
803 <li class="${h.is_active('home', active)}">
812 <li class="${h.is_active('home', active)}">
804 <a class="menulink" title="${_('Home')}" href="${h.route_path('home')}">
813 <a class="menulink" title="${_('Home')}" href="${h.route_path('home')}">
805 <div class="menulabel">${_('Home')}</div>
814 <div class="menulabel">${_('Home')}</div>
806 </a>
815 </a>
807 </li>
816 </li>
808
817
809 %if c.rhodecode_user.username != h.DEFAULT_USER:
818 %if c.rhodecode_user.username != h.DEFAULT_USER:
810 <li class="${h.is_active('journal', active)}">
819 <li class="${h.is_active('journal', active)}">
811 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
820 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
812 <div class="menulabel">${_('Journal')}</div>
821 <div class="menulabel">${_('Journal')}</div>
813 </a>
822 </a>
814 </li>
823 </li>
815 %else:
824 %else:
816 <li class="${h.is_active('journal', active)}">
825 <li class="${h.is_active('journal', active)}">
817 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
826 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
818 <div class="menulabel">${_('Public journal')}</div>
827 <div class="menulabel">${_('Public journal')}</div>
819 </a>
828 </a>
820 </li>
829 </li>
821 %endif
830 %endif
822
831
823 <li class="${h.is_active('gists', active)}">
832 <li class="${h.is_active('gists', active)}">
824 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
833 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
825 <div class="menulabel">${_('Gists')}</div>
834 <div class="menulabel">${_('Gists')}</div>
826 </a>
835 </a>
827 </li>
836 </li>
828
837
829 % if c.is_super_admin or c.is_delegated_admin:
838 % if c.is_super_admin or c.is_delegated_admin:
830 <li class="${h.is_active('admin', active)}">
839 <li class="${h.is_active('admin', active)}">
831 <a class="menulink childs" title="${_('Admin settings')}" href="${h.route_path('admin_home')}">
840 <a class="menulink childs" title="${_('Admin settings')}" href="${h.route_path('admin_home')}">
832 <div class="menulabel">${_('Admin')} </div>
841 <div class="menulabel">${_('Admin')} </div>
833 </a>
842 </a>
834 </li>
843 </li>
835 % endif
844 % endif
836
845
837 ## render extra user menu
846 ## render extra user menu
838 ${usermenu(active=(active=='my_account'))}
847 ${usermenu(active=(active=='my_account'))}
839
848
840 </ul>
849 </ul>
841
850
842 <script type="text/javascript">
851 <script type="text/javascript">
843 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
852 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
844
853
845 var formatRepoResult = function(result, container, query, escapeMarkup) {
854 var formatRepoResult = function(result, container, query, escapeMarkup) {
846 return function(data, escapeMarkup) {
855 return function(data, escapeMarkup) {
847 if (!data.repo_id){
856 if (!data.repo_id){
848 return data.text; // optgroup text Repositories
857 return data.text; // optgroup text Repositories
849 }
858 }
850
859
851 var tmpl = '';
860 var tmpl = '';
852 var repoType = data['repo_type'];
861 var repoType = data['repo_type'];
853 var repoName = data['text'];
862 var repoName = data['text'];
854
863
855 if(data && data.type == 'repo'){
864 if(data && data.type == 'repo'){
856 if(repoType === 'hg'){
865 if(repoType === 'hg'){
857 tmpl += '<i class="icon-hg"></i> ';
866 tmpl += '<i class="icon-hg"></i> ';
858 }
867 }
859 else if(repoType === 'git'){
868 else if(repoType === 'git'){
860 tmpl += '<i class="icon-git"></i> ';
869 tmpl += '<i class="icon-git"></i> ';
861 }
870 }
862 else if(repoType === 'svn'){
871 else if(repoType === 'svn'){
863 tmpl += '<i class="icon-svn"></i> ';
872 tmpl += '<i class="icon-svn"></i> ';
864 }
873 }
865 if(data['private']){
874 if(data['private']){
866 tmpl += '<i class="icon-lock" ></i> ';
875 tmpl += '<i class="icon-lock" ></i> ';
867 }
876 }
868 else if(visualShowPublicIcon){
877 else if(visualShowPublicIcon){
869 tmpl += '<i class="icon-unlock-alt"></i> ';
878 tmpl += '<i class="icon-unlock-alt"></i> ';
870 }
879 }
871 }
880 }
872 tmpl += escapeMarkup(repoName);
881 tmpl += escapeMarkup(repoName);
873 return tmpl;
882 return tmpl;
874
883
875 }(result, escapeMarkup);
884 }(result, escapeMarkup);
876 };
885 };
877
886
878 var formatRepoGroupResult = function(result, container, query, escapeMarkup) {
887 var formatRepoGroupResult = function(result, container, query, escapeMarkup) {
879 return function(data, escapeMarkup) {
888 return function(data, escapeMarkup) {
880 if (!data.repo_group_id){
889 if (!data.repo_group_id){
881 return data.text; // optgroup text Repositories
890 return data.text; // optgroup text Repositories
882 }
891 }
883
892
884 var tmpl = '';
893 var tmpl = '';
885 var repoGroupName = data['text'];
894 var repoGroupName = data['text'];
886
895
887 if(data){
896 if(data){
888
897
889 tmpl += '<i class="icon-repo-group"></i> ';
898 tmpl += '<i class="icon-repo-group"></i> ';
890
899
891 }
900 }
892 tmpl += escapeMarkup(repoGroupName);
901 tmpl += escapeMarkup(repoGroupName);
893 return tmpl;
902 return tmpl;
894
903
895 }(result, escapeMarkup);
904 }(result, escapeMarkup);
896 };
905 };
897
906
898 var escapeRegExChars = function (value) {
907 var escapeRegExChars = function (value) {
899 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
908 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
900 };
909 };
901
910
902 var getRepoIcon = function(repo_type) {
911 var getRepoIcon = function(repo_type) {
903 if (repo_type === 'hg') {
912 if (repo_type === 'hg') {
904 return '<i class="icon-hg"></i> ';
913 return '<i class="icon-hg"></i> ';
905 }
914 }
906 else if (repo_type === 'git') {
915 else if (repo_type === 'git') {
907 return '<i class="icon-git"></i> ';
916 return '<i class="icon-git"></i> ';
908 }
917 }
909 else if (repo_type === 'svn') {
918 else if (repo_type === 'svn') {
910 return '<i class="icon-svn"></i> ';
919 return '<i class="icon-svn"></i> ';
911 }
920 }
912 return ''
921 return ''
913 };
922 };
914
923
915 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
924 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
916
925
917 if (value.split(':').length === 2) {
926 if (value.split(':').length === 2) {
918 value = value.split(':')[1]
927 value = value.split(':')[1]
919 }
928 }
920
929
921 var searchType = data['type'];
930 var searchType = data['type'];
922 var searchSubType = data['subtype'];
931 var searchSubType = data['subtype'];
923 var valueDisplay = data['value_display'];
932 var valueDisplay = data['value_display'];
924 var valueIcon = data['value_icon'];
933 var valueIcon = data['value_icon'];
925
934
926 var pattern = '(' + escapeRegExChars(value) + ')';
935 var pattern = '(' + escapeRegExChars(value) + ')';
927
936
928 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
937 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
929
938
930 // highlight match
939 // highlight match
931 if (searchType != 'text') {
940 if (searchType != 'text') {
932 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
941 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
933 }
942 }
934
943
935 var icon = '';
944 var icon = '';
936
945
937 if (searchType === 'hint') {
946 if (searchType === 'hint') {
938 icon += '<i class="icon-repo-group"></i> ';
947 icon += '<i class="icon-repo-group"></i> ';
939 }
948 }
940 // full text search/hints
949 // full text search/hints
941 else if (searchType === 'search') {
950 else if (searchType === 'search') {
942 if (valueIcon === undefined) {
951 if (valueIcon === undefined) {
943 icon += '<i class="icon-more"></i> ';
952 icon += '<i class="icon-more"></i> ';
944 } else {
953 } else {
945 icon += valueIcon + ' ';
954 icon += valueIcon + ' ';
946 }
955 }
947
956
948 if (searchSubType !== undefined && searchSubType == 'repo') {
957 if (searchSubType !== undefined && searchSubType == 'repo') {
949 valueDisplay += '<div class="pull-right tag">repository</div>';
958 valueDisplay += '<div class="pull-right tag">repository</div>';
950 }
959 }
951 else if (searchSubType !== undefined && searchSubType == 'repo_group') {
960 else if (searchSubType !== undefined && searchSubType == 'repo_group') {
952 valueDisplay += '<div class="pull-right tag">repo group</div>';
961 valueDisplay += '<div class="pull-right tag">repo group</div>';
953 }
962 }
954 }
963 }
955 // repository
964 // repository
956 else if (searchType === 'repo') {
965 else if (searchType === 'repo') {
957
966
958 var repoIcon = getRepoIcon(data['repo_type']);
967 var repoIcon = getRepoIcon(data['repo_type']);
959 icon += repoIcon;
968 icon += repoIcon;
960
969
961 if (data['private']) {
970 if (data['private']) {
962 icon += '<i class="icon-lock" ></i> ';
971 icon += '<i class="icon-lock" ></i> ';
963 }
972 }
964 else if (visualShowPublicIcon) {
973 else if (visualShowPublicIcon) {
965 icon += '<i class="icon-unlock-alt"></i> ';
974 icon += '<i class="icon-unlock-alt"></i> ';
966 }
975 }
967 }
976 }
968 // repository groups
977 // repository groups
969 else if (searchType === 'repo_group') {
978 else if (searchType === 'repo_group') {
970 icon += '<i class="icon-repo-group"></i> ';
979 icon += '<i class="icon-repo-group"></i> ';
971 }
980 }
972 // user group
981 // user group
973 else if (searchType === 'user_group') {
982 else if (searchType === 'user_group') {
974 icon += '<i class="icon-group"></i> ';
983 icon += '<i class="icon-group"></i> ';
975 }
984 }
976 // user
985 // user
977 else if (searchType === 'user') {
986 else if (searchType === 'user') {
978 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
987 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
979 }
988 }
980 // pull request
989 // pull request
981 else if (searchType === 'pull_request') {
990 else if (searchType === 'pull_request') {
982 icon += '<i class="icon-merge"></i> ';
991 icon += '<i class="icon-merge"></i> ';
983 }
992 }
984 // commit
993 // commit
985 else if (searchType === 'commit') {
994 else if (searchType === 'commit') {
986 var repo_data = data['repo_data'];
995 var repo_data = data['repo_data'];
987 var repoIcon = getRepoIcon(repo_data['repository_type']);
996 var repoIcon = getRepoIcon(repo_data['repository_type']);
988 if (repoIcon) {
997 if (repoIcon) {
989 icon += repoIcon;
998 icon += repoIcon;
990 } else {
999 } else {
991 icon += '<i class="icon-tag"></i>';
1000 icon += '<i class="icon-tag"></i>';
992 }
1001 }
993 }
1002 }
994 // file
1003 // file
995 else if (searchType === 'file') {
1004 else if (searchType === 'file') {
996 var repo_data = data['repo_data'];
1005 var repo_data = data['repo_data'];
997 var repoIcon = getRepoIcon(repo_data['repository_type']);
1006 var repoIcon = getRepoIcon(repo_data['repository_type']);
998 if (repoIcon) {
1007 if (repoIcon) {
999 icon += repoIcon;
1008 icon += repoIcon;
1000 } else {
1009 } else {
1001 icon += '<i class="icon-tag"></i>';
1010 icon += '<i class="icon-tag"></i>';
1002 }
1011 }
1003 }
1012 }
1004 // generic text
1013 // generic text
1005 else if (searchType === 'text') {
1014 else if (searchType === 'text') {
1006 icon = '';
1015 icon = '';
1007 }
1016 }
1008
1017
1009 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
1018 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
1010 return tmpl.format(icon, valueDisplay);
1019 return tmpl.format(icon, valueDisplay);
1011 };
1020 };
1012
1021
1013 var handleSelect = function(element, suggestion) {
1022 var handleSelect = function(element, suggestion) {
1014 if (suggestion.type === "hint") {
1023 if (suggestion.type === "hint") {
1015 // we skip action
1024 // we skip action
1016 $('#main_filter').focus();
1025 $('#main_filter').focus();
1017 }
1026 }
1018 else if (suggestion.type === "text") {
1027 else if (suggestion.type === "text") {
1019 // we skip action
1028 // we skip action
1020 $('#main_filter').focus();
1029 $('#main_filter').focus();
1021
1030
1022 } else {
1031 } else {
1023 window.location = suggestion['url'];
1032 window.location = suggestion['url'];
1024 }
1033 }
1025 };
1034 };
1026
1035
1027 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
1036 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
1028 if (queryLowerCase.split(':').length === 2) {
1037 if (queryLowerCase.split(':').length === 2) {
1029 queryLowerCase = queryLowerCase.split(':')[1]
1038 queryLowerCase = queryLowerCase.split(':')[1]
1030 }
1039 }
1031 if (suggestion.type === "text") {
1040 if (suggestion.type === "text") {
1032 // special case we don't want to "skip" display for
1041 // special case we don't want to "skip" display for
1033 return true
1042 return true
1034 }
1043 }
1035 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
1044 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
1036 };
1045 };
1037
1046
1038 var cleanContext = {
1047 var cleanContext = {
1039 repo_view_type: null,
1048 repo_view_type: null,
1040
1049
1041 repo_id: null,
1050 repo_id: null,
1042 repo_name: "",
1051 repo_name: "",
1043
1052
1044 repo_group_id: null,
1053 repo_group_id: null,
1045 repo_group_name: null
1054 repo_group_name: null
1046 };
1055 };
1047 var removeGoToFilter = function () {
1056 var removeGoToFilter = function () {
1048 $('.searchTagHidable').hide();
1057 $('.searchTagHidable').hide();
1049 $('#main_filter').autocomplete(
1058 $('#main_filter').autocomplete(
1050 'setOptions', {params:{search_context: cleanContext}});
1059 'setOptions', {params:{search_context: cleanContext}});
1051 };
1060 };
1052
1061
1053 $('#main_filter').autocomplete({
1062 $('#main_filter').autocomplete({
1054 serviceUrl: pyroutes.url('goto_switcher_data'),
1063 serviceUrl: pyroutes.url('goto_switcher_data'),
1055 params: {
1064 params: {
1056 "search_context": templateContext.search_context
1065 "search_context": templateContext.search_context
1057 },
1066 },
1058 minChars:2,
1067 minChars:2,
1059 maxHeight:400,
1068 maxHeight:400,
1060 deferRequestBy: 300, //miliseconds
1069 deferRequestBy: 300, //miliseconds
1061 tabDisabled: true,
1070 tabDisabled: true,
1062 autoSelectFirst: false,
1071 autoSelectFirst: false,
1063 containerClass: 'autocomplete-qfilter-suggestions',
1072 containerClass: 'autocomplete-qfilter-suggestions',
1064 formatResult: autocompleteMainFilterFormatResult,
1073 formatResult: autocompleteMainFilterFormatResult,
1065 lookupFilter: autocompleteMainFilterResult,
1074 lookupFilter: autocompleteMainFilterResult,
1066 onSelect: function (element, suggestion) {
1075 onSelect: function (element, suggestion) {
1067 handleSelect(element, suggestion);
1076 handleSelect(element, suggestion);
1068 return false;
1077 return false;
1069 },
1078 },
1070 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
1079 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
1071 if (jqXHR !== 'abort') {
1080 if (jqXHR !== 'abort') {
1072 var message = formatErrorMessage(jqXHR, textStatus, errorThrown);
1081 var message = formatErrorMessage(jqXHR, textStatus, errorThrown);
1073 SwalNoAnimation.fire({
1082 SwalNoAnimation.fire({
1074 icon: 'error',
1083 icon: 'error',
1075 title: _gettext('Error during search operation'),
1084 title: _gettext('Error during search operation'),
1076 html: '<span style="white-space: pre-line">{0}</span>'.format(message),
1085 html: '<span style="white-space: pre-line">{0}</span>'.format(message),
1077 }).then(function(result) {
1086 }).then(function(result) {
1078 window.location.reload();
1087 window.location.reload();
1079 })
1088 })
1080 }
1089 }
1081 },
1090 },
1082 onSearchStart: function (params) {
1091 onSearchStart: function (params) {
1083 $('.searchTag.searchTagIcon').html('<i class="icon-spin animate-spin"></i>')
1092 $('.searchTag.searchTagIcon').html('<i class="icon-spin animate-spin"></i>')
1084 },
1093 },
1085 onSearchComplete: function (query, suggestions) {
1094 onSearchComplete: function (query, suggestions) {
1086 $('.searchTag.searchTagIcon').html('<i class="icon-search"></i>')
1095 $('.searchTag.searchTagIcon').html('<i class="icon-search"></i>')
1087 },
1096 },
1088 });
1097 });
1089
1098
1090 showMainFilterBox = function () {
1099 showMainFilterBox = function () {
1091 $('#main_filter_help').toggle();
1100 $('#main_filter_help').toggle();
1092 };
1101 };
1093
1102
1094 $('#main_filter').on('keydown.autocomplete', function (e) {
1103 $('#main_filter').on('keydown.autocomplete', function (e) {
1095
1104
1096 var BACKSPACE = 8;
1105 var BACKSPACE = 8;
1097 var el = $(e.currentTarget);
1106 var el = $(e.currentTarget);
1098 if(e.which === BACKSPACE){
1107 if(e.which === BACKSPACE){
1099 var inputVal = el.val();
1108 var inputVal = el.val();
1100 if (inputVal === ""){
1109 if (inputVal === ""){
1101 removeGoToFilter()
1110 removeGoToFilter()
1102 }
1111 }
1103 }
1112 }
1104 });
1113 });
1105
1114
1106 var dismissNotice = function(noticeId) {
1115 var dismissNotice = function(noticeId) {
1107
1116
1108 var url = pyroutes.url('user_notice_dismiss',
1117 var url = pyroutes.url('user_notice_dismiss',
1109 {"user_id": templateContext.rhodecode_user.user_id});
1118 {"user_id": templateContext.rhodecode_user.user_id});
1110
1119
1111 var postData = {
1120 var postData = {
1112 'csrf_token': CSRF_TOKEN,
1121 'csrf_token': CSRF_TOKEN,
1113 'notice_id': noticeId,
1122 'notice_id': noticeId,
1114 };
1123 };
1115
1124
1116 var success = function(response) {
1125 var success = function(response) {
1117 $('#notice-message-' + noticeId).remove();
1126 $('#notice-message-' + noticeId).remove();
1118 return false;
1127 return false;
1119 };
1128 };
1120 var failure = function(data, textStatus, xhr) {
1129 var failure = function(data, textStatus, xhr) {
1121 alert("error processing request: " + textStatus);
1130 alert("error processing request: " + textStatus);
1122 return false;
1131 return false;
1123 };
1132 };
1124 ajaxPOST(url, postData, success, failure);
1133 ajaxPOST(url, postData, success, failure);
1125 }
1134 }
1126 </script>
1135 </script>
1127 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
1136 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
1128 </%def>
1137 </%def>
1129
1138
1130 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
1139 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
1131 <div class="modal-dialog">
1140 <div class="modal-dialog">
1132 <div class="modal-content">
1141 <div class="modal-content">
1133 <div class="modal-header">
1142 <div class="modal-header">
1134 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
1143 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
1135 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
1144 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
1136 </div>
1145 </div>
1137 <div class="modal-body">
1146 <div class="modal-body">
1138 <div class="block-left">
1147 <div class="block-left">
1139 <table class="keyboard-mappings">
1148 <table class="keyboard-mappings">
1140 <tbody>
1149 <tbody>
1141 <tr>
1150 <tr>
1142 <th></th>
1151 <th></th>
1143 <th>${_('Site-wide shortcuts')}</th>
1152 <th>${_('Site-wide shortcuts')}</th>
1144 </tr>
1153 </tr>
1145 <%
1154 <%
1146 elems = [
1155 elems = [
1147 ('/', 'Use quick search box'),
1156 ('/', 'Use quick search box'),
1148 ('g h', 'Goto home page'),
1157 ('g h', 'Goto home page'),
1149 ('g g', 'Goto my private gists page'),
1158 ('g g', 'Goto my private gists page'),
1150 ('g G', 'Goto my public gists page'),
1159 ('g G', 'Goto my public gists page'),
1151 ('g 0-9', 'Goto bookmarked items from 0-9'),
1160 ('g 0-9', 'Goto bookmarked items from 0-9'),
1152 ('n r', 'New repository page'),
1161 ('n r', 'New repository page'),
1153 ('n g', 'New gist page'),
1162 ('n g', 'New gist page'),
1154 ]
1163 ]
1155 %>
1164 %>
1156 %for key, desc in elems:
1165 %for key, desc in elems:
1157 <tr>
1166 <tr>
1158 <td class="keys">
1167 <td class="keys">
1159 <span class="key tag">${key}</span>
1168 <span class="key tag">${key}</span>
1160 </td>
1169 </td>
1161 <td>${desc}</td>
1170 <td>${desc}</td>
1162 </tr>
1171 </tr>
1163 %endfor
1172 %endfor
1164 </tbody>
1173 </tbody>
1165 </table>
1174 </table>
1166 </div>
1175 </div>
1167 <div class="block-left">
1176 <div class="block-left">
1168 <table class="keyboard-mappings">
1177 <table class="keyboard-mappings">
1169 <tbody>
1178 <tbody>
1170 <tr>
1179 <tr>
1171 <th></th>
1180 <th></th>
1172 <th>${_('Repositories')}</th>
1181 <th>${_('Repositories')}</th>
1173 </tr>
1182 </tr>
1174 <%
1183 <%
1175 elems = [
1184 elems = [
1176 ('g s', 'Goto summary page'),
1185 ('g s', 'Goto summary page'),
1177 ('g c', 'Goto changelog page'),
1186 ('g c', 'Goto changelog page'),
1178 ('g f', 'Goto files page'),
1187 ('g f', 'Goto files page'),
1179 ('g F', 'Goto files page with file search activated'),
1188 ('g F', 'Goto files page with file search activated'),
1180 ('g p', 'Goto pull requests page'),
1189 ('g p', 'Goto pull requests page'),
1181 ('g o', 'Goto repository settings'),
1190 ('g o', 'Goto repository settings'),
1182 ('g O', 'Goto repository access permissions settings'),
1191 ('g O', 'Goto repository access permissions settings'),
1183 ]
1192 ]
1184 %>
1193 %>
1185 %for key, desc in elems:
1194 %for key, desc in elems:
1186 <tr>
1195 <tr>
1187 <td class="keys">
1196 <td class="keys">
1188 <span class="key tag">${key}</span>
1197 <span class="key tag">${key}</span>
1189 </td>
1198 </td>
1190 <td>${desc}</td>
1199 <td>${desc}</td>
1191 </tr>
1200 </tr>
1192 %endfor
1201 %endfor
1193 </tbody>
1202 </tbody>
1194 </table>
1203 </table>
1195 </div>
1204 </div>
1196 </div>
1205 </div>
1197 <div class="modal-footer">
1206 <div class="modal-footer">
1198 </div>
1207 </div>
1199 </div><!-- /.modal-content -->
1208 </div><!-- /.modal-content -->
1200 </div><!-- /.modal-dialog -->
1209 </div><!-- /.modal-dialog -->
1201 </div><!-- /.modal -->
1210 </div><!-- /.modal -->
General Comments 0
You need to be logged in to leave comments. Login now