##// END OF EJS Templates
users: add additional information why user with pending reviews shouldn't be deleted.
dan -
r1923:4a76cf6b default
parent child Browse files
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,493 +1,503 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 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 Users crud controller for pylons
22 Users crud controller for pylons
23 """
23 """
24
24
25 import logging
25 import logging
26 import formencode
26 import formencode
27
27
28 from formencode import htmlfill
28 from formencode import htmlfill
29 from pylons import request, tmpl_context as c, url, config
29 from pylons import request, tmpl_context as c, url, config
30 from pylons.controllers.util import redirect
30 from pylons.controllers.util import redirect
31 from pylons.i18n.translation import _
31 from pylons.i18n.translation import _
32
32
33 from rhodecode.authentication.plugins import auth_rhodecode
33 from rhodecode.authentication.plugins import auth_rhodecode
34
34
35 from rhodecode.lib import helpers as h
35 from rhodecode.lib import helpers as h
36 from rhodecode.lib import auth
36 from rhodecode.lib import auth
37 from rhodecode.lib import audit_logger
37 from rhodecode.lib import audit_logger
38 from rhodecode.lib.auth import (
38 from rhodecode.lib.auth import (
39 LoginRequired, HasPermissionAllDecorator, AuthUser)
39 LoginRequired, HasPermissionAllDecorator, AuthUser)
40 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseController, render
41 from rhodecode.lib.exceptions import (
41 from rhodecode.lib.exceptions import (
42 DefaultUserException, UserOwnsReposException, UserOwnsRepoGroupsException,
42 DefaultUserException, UserOwnsReposException, UserOwnsRepoGroupsException,
43 UserOwnsUserGroupsException, UserCreationError)
43 UserOwnsUserGroupsException, UserCreationError)
44 from rhodecode.lib.utils2 import safe_int, AttributeDict
44 from rhodecode.lib.utils2 import safe_int, AttributeDict
45
45
46 from rhodecode.model.db import (
46 from rhodecode.model.db import (
47 PullRequestReviewers, User, UserEmailMap, UserIpMap, RepoGroup)
47 PullRequestReviewers, User, UserEmailMap, UserIpMap, RepoGroup)
48 from rhodecode.model.forms import (
48 from rhodecode.model.forms import (
49 UserForm, UserPermissionsForm, UserIndividualPermissionsForm)
49 UserForm, UserPermissionsForm, UserIndividualPermissionsForm)
50 from rhodecode.model.repo_group import RepoGroupModel
50 from rhodecode.model.repo_group import RepoGroupModel
51 from rhodecode.model.user import UserModel
51 from rhodecode.model.user import UserModel
52 from rhodecode.model.meta import Session
52 from rhodecode.model.meta import Session
53 from rhodecode.model.permission import PermissionModel
53 from rhodecode.model.permission import PermissionModel
54
54
55 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
56
56
57
57
58 class UsersController(BaseController):
58 class UsersController(BaseController):
59 """REST Controller styled on the Atom Publishing Protocol"""
59 """REST Controller styled on the Atom Publishing Protocol"""
60
60
61 @LoginRequired()
61 @LoginRequired()
62 def __before__(self):
62 def __before__(self):
63 super(UsersController, self).__before__()
63 super(UsersController, self).__before__()
64 c.available_permissions = config['available_permissions']
64 c.available_permissions = config['available_permissions']
65 c.allowed_languages = [
65 c.allowed_languages = [
66 ('en', 'English (en)'),
66 ('en', 'English (en)'),
67 ('de', 'German (de)'),
67 ('de', 'German (de)'),
68 ('fr', 'French (fr)'),
68 ('fr', 'French (fr)'),
69 ('it', 'Italian (it)'),
69 ('it', 'Italian (it)'),
70 ('ja', 'Japanese (ja)'),
70 ('ja', 'Japanese (ja)'),
71 ('pl', 'Polish (pl)'),
71 ('pl', 'Polish (pl)'),
72 ('pt', 'Portuguese (pt)'),
72 ('pt', 'Portuguese (pt)'),
73 ('ru', 'Russian (ru)'),
73 ('ru', 'Russian (ru)'),
74 ('zh', 'Chinese (zh)'),
74 ('zh', 'Chinese (zh)'),
75 ]
75 ]
76 PermissionModel().set_global_permission_choices(c, gettext_translator=_)
76 PermissionModel().set_global_permission_choices(c, gettext_translator=_)
77
77
78 def _get_personal_repo_group_template_vars(self):
78 def _get_personal_repo_group_template_vars(self):
79 DummyUser = AttributeDict({
79 DummyUser = AttributeDict({
80 'username': '${username}',
80 'username': '${username}',
81 'user_id': '${user_id}',
81 'user_id': '${user_id}',
82 })
82 })
83 c.default_create_repo_group = RepoGroupModel() \
83 c.default_create_repo_group = RepoGroupModel() \
84 .get_default_create_personal_repo_group()
84 .get_default_create_personal_repo_group()
85 c.personal_repo_group_name = RepoGroupModel() \
85 c.personal_repo_group_name = RepoGroupModel() \
86 .get_personal_group_name(DummyUser)
86 .get_personal_group_name(DummyUser)
87
87
88 @HasPermissionAllDecorator('hg.admin')
88 @HasPermissionAllDecorator('hg.admin')
89 @auth.CSRFRequired()
89 @auth.CSRFRequired()
90 def create(self):
90 def create(self):
91 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
91 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
92 user_model = UserModel()
92 user_model = UserModel()
93 user_form = UserForm()()
93 user_form = UserForm()()
94 try:
94 try:
95 form_result = user_form.to_python(dict(request.POST))
95 form_result = user_form.to_python(dict(request.POST))
96 user = user_model.create(form_result)
96 user = user_model.create(form_result)
97 Session().flush()
97 Session().flush()
98 creation_data = user.get_api_data()
98 creation_data = user.get_api_data()
99 username = form_result['username']
99 username = form_result['username']
100
100
101 audit_logger.store_web(
101 audit_logger.store_web(
102 'user.create', action_data={'data': creation_data},
102 'user.create', action_data={'data': creation_data},
103 user=c.rhodecode_user)
103 user=c.rhodecode_user)
104
104
105 user_link = h.link_to(h.escape(username),
105 user_link = h.link_to(h.escape(username),
106 url('edit_user',
106 url('edit_user',
107 user_id=user.user_id))
107 user_id=user.user_id))
108 h.flash(h.literal(_('Created user %(user_link)s')
108 h.flash(h.literal(_('Created user %(user_link)s')
109 % {'user_link': user_link}), category='success')
109 % {'user_link': user_link}), category='success')
110 Session().commit()
110 Session().commit()
111 except formencode.Invalid as errors:
111 except formencode.Invalid as errors:
112 self._get_personal_repo_group_template_vars()
112 self._get_personal_repo_group_template_vars()
113 return htmlfill.render(
113 return htmlfill.render(
114 render('admin/users/user_add.mako'),
114 render('admin/users/user_add.mako'),
115 defaults=errors.value,
115 defaults=errors.value,
116 errors=errors.error_dict or {},
116 errors=errors.error_dict or {},
117 prefix_error=False,
117 prefix_error=False,
118 encoding="UTF-8",
118 encoding="UTF-8",
119 force_defaults=False)
119 force_defaults=False)
120 except UserCreationError as e:
120 except UserCreationError as e:
121 h.flash(e, 'error')
121 h.flash(e, 'error')
122 except Exception:
122 except Exception:
123 log.exception("Exception creation of user")
123 log.exception("Exception creation of user")
124 h.flash(_('Error occurred during creation of user %s')
124 h.flash(_('Error occurred during creation of user %s')
125 % request.POST.get('username'), category='error')
125 % request.POST.get('username'), category='error')
126 return redirect(h.route_path('users'))
126 return redirect(h.route_path('users'))
127
127
128 @HasPermissionAllDecorator('hg.admin')
128 @HasPermissionAllDecorator('hg.admin')
129 def new(self):
129 def new(self):
130 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
130 c.default_extern_type = auth_rhodecode.RhodeCodeAuthPlugin.name
131 self._get_personal_repo_group_template_vars()
131 self._get_personal_repo_group_template_vars()
132 return render('admin/users/user_add.mako')
132 return render('admin/users/user_add.mako')
133
133
134 @HasPermissionAllDecorator('hg.admin')
134 @HasPermissionAllDecorator('hg.admin')
135 @auth.CSRFRequired()
135 @auth.CSRFRequired()
136 def update(self, user_id):
136 def update(self, user_id):
137
137
138 user_id = safe_int(user_id)
138 user_id = safe_int(user_id)
139 c.user = User.get_or_404(user_id)
139 c.user = User.get_or_404(user_id)
140 c.active = 'profile'
140 c.active = 'profile'
141 c.extern_type = c.user.extern_type
141 c.extern_type = c.user.extern_type
142 c.extern_name = c.user.extern_name
142 c.extern_name = c.user.extern_name
143 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
143 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
144 available_languages = [x[0] for x in c.allowed_languages]
144 available_languages = [x[0] for x in c.allowed_languages]
145 _form = UserForm(edit=True, available_languages=available_languages,
145 _form = UserForm(edit=True, available_languages=available_languages,
146 old_data={'user_id': user_id,
146 old_data={'user_id': user_id,
147 'email': c.user.email})()
147 'email': c.user.email})()
148 form_result = {}
148 form_result = {}
149 old_values = c.user.get_api_data()
149 old_values = c.user.get_api_data()
150 try:
150 try:
151 form_result = _form.to_python(dict(request.POST))
151 form_result = _form.to_python(dict(request.POST))
152 skip_attrs = ['extern_type', 'extern_name']
152 skip_attrs = ['extern_type', 'extern_name']
153 # TODO: plugin should define if username can be updated
153 # TODO: plugin should define if username can be updated
154 if c.extern_type != "rhodecode":
154 if c.extern_type != "rhodecode":
155 # forbid updating username for external accounts
155 # forbid updating username for external accounts
156 skip_attrs.append('username')
156 skip_attrs.append('username')
157
157
158 UserModel().update_user(
158 UserModel().update_user(
159 user_id, skip_attrs=skip_attrs, **form_result)
159 user_id, skip_attrs=skip_attrs, **form_result)
160
160
161 audit_logger.store_web(
161 audit_logger.store_web(
162 'user.edit', action_data={'old_data': old_values},
162 'user.edit', action_data={'old_data': old_values},
163 user=c.rhodecode_user)
163 user=c.rhodecode_user)
164
164
165 Session().commit()
165 Session().commit()
166 h.flash(_('User updated successfully'), category='success')
166 h.flash(_('User updated successfully'), category='success')
167 except formencode.Invalid as errors:
167 except formencode.Invalid as errors:
168 defaults = errors.value
168 defaults = errors.value
169 e = errors.error_dict or {}
169 e = errors.error_dict or {}
170
170
171 return htmlfill.render(
171 return htmlfill.render(
172 render('admin/users/user_edit.mako'),
172 render('admin/users/user_edit.mako'),
173 defaults=defaults,
173 defaults=defaults,
174 errors=e,
174 errors=e,
175 prefix_error=False,
175 prefix_error=False,
176 encoding="UTF-8",
176 encoding="UTF-8",
177 force_defaults=False)
177 force_defaults=False)
178 except UserCreationError as e:
178 except UserCreationError as e:
179 h.flash(e, 'error')
179 h.flash(e, 'error')
180 except Exception:
180 except Exception:
181 log.exception("Exception updating user")
181 log.exception("Exception updating user")
182 h.flash(_('Error occurred during update of user %s')
182 h.flash(_('Error occurred during update of user %s')
183 % form_result.get('username'), category='error')
183 % form_result.get('username'), category='error')
184 return redirect(url('edit_user', user_id=user_id))
184 return redirect(url('edit_user', user_id=user_id))
185
185
186 @HasPermissionAllDecorator('hg.admin')
186 @HasPermissionAllDecorator('hg.admin')
187 @auth.CSRFRequired()
187 @auth.CSRFRequired()
188 def delete(self, user_id):
188 def delete(self, user_id):
189 user_id = safe_int(user_id)
189 user_id = safe_int(user_id)
190 c.user = User.get_or_404(user_id)
190 c.user = User.get_or_404(user_id)
191
191
192 _repos = c.user.repositories
192 _repos = c.user.repositories
193 _repo_groups = c.user.repository_groups
193 _repo_groups = c.user.repository_groups
194 _user_groups = c.user.user_groups
194 _user_groups = c.user.user_groups
195
195
196 handle_repos = None
196 handle_repos = None
197 handle_repo_groups = None
197 handle_repo_groups = None
198 handle_user_groups = None
198 handle_user_groups = None
199 # dummy call for flash of handle
199 # dummy call for flash of handle
200 set_handle_flash_repos = lambda: None
200 set_handle_flash_repos = lambda: None
201 set_handle_flash_repo_groups = lambda: None
201 set_handle_flash_repo_groups = lambda: None
202 set_handle_flash_user_groups = lambda: None
202 set_handle_flash_user_groups = lambda: None
203
203
204 if _repos and request.POST.get('user_repos'):
204 if _repos and request.POST.get('user_repos'):
205 do = request.POST['user_repos']
205 do = request.POST['user_repos']
206 if do == 'detach':
206 if do == 'detach':
207 handle_repos = 'detach'
207 handle_repos = 'detach'
208 set_handle_flash_repos = lambda: h.flash(
208 set_handle_flash_repos = lambda: h.flash(
209 _('Detached %s repositories') % len(_repos),
209 _('Detached %s repositories') % len(_repos),
210 category='success')
210 category='success')
211 elif do == 'delete':
211 elif do == 'delete':
212 handle_repos = 'delete'
212 handle_repos = 'delete'
213 set_handle_flash_repos = lambda: h.flash(
213 set_handle_flash_repos = lambda: h.flash(
214 _('Deleted %s repositories') % len(_repos),
214 _('Deleted %s repositories') % len(_repos),
215 category='success')
215 category='success')
216
216
217 if _repo_groups and request.POST.get('user_repo_groups'):
217 if _repo_groups and request.POST.get('user_repo_groups'):
218 do = request.POST['user_repo_groups']
218 do = request.POST['user_repo_groups']
219 if do == 'detach':
219 if do == 'detach':
220 handle_repo_groups = 'detach'
220 handle_repo_groups = 'detach'
221 set_handle_flash_repo_groups = lambda: h.flash(
221 set_handle_flash_repo_groups = lambda: h.flash(
222 _('Detached %s repository groups') % len(_repo_groups),
222 _('Detached %s repository groups') % len(_repo_groups),
223 category='success')
223 category='success')
224 elif do == 'delete':
224 elif do == 'delete':
225 handle_repo_groups = 'delete'
225 handle_repo_groups = 'delete'
226 set_handle_flash_repo_groups = lambda: h.flash(
226 set_handle_flash_repo_groups = lambda: h.flash(
227 _('Deleted %s repository groups') % len(_repo_groups),
227 _('Deleted %s repository groups') % len(_repo_groups),
228 category='success')
228 category='success')
229
229
230 if _user_groups and request.POST.get('user_user_groups'):
230 if _user_groups and request.POST.get('user_user_groups'):
231 do = request.POST['user_user_groups']
231 do = request.POST['user_user_groups']
232 if do == 'detach':
232 if do == 'detach':
233 handle_user_groups = 'detach'
233 handle_user_groups = 'detach'
234 set_handle_flash_user_groups = lambda: h.flash(
234 set_handle_flash_user_groups = lambda: h.flash(
235 _('Detached %s user groups') % len(_user_groups),
235 _('Detached %s user groups') % len(_user_groups),
236 category='success')
236 category='success')
237 elif do == 'delete':
237 elif do == 'delete':
238 handle_user_groups = 'delete'
238 handle_user_groups = 'delete'
239 set_handle_flash_user_groups = lambda: h.flash(
239 set_handle_flash_user_groups = lambda: h.flash(
240 _('Deleted %s user groups') % len(_user_groups),
240 _('Deleted %s user groups') % len(_user_groups),
241 category='success')
241 category='success')
242
242
243 old_values = c.user.get_api_data()
243 old_values = c.user.get_api_data()
244 try:
244 try:
245 UserModel().delete(c.user, handle_repos=handle_repos,
245 UserModel().delete(c.user, handle_repos=handle_repos,
246 handle_repo_groups=handle_repo_groups,
246 handle_repo_groups=handle_repo_groups,
247 handle_user_groups=handle_user_groups)
247 handle_user_groups=handle_user_groups)
248
248
249 audit_logger.store_web(
249 audit_logger.store_web(
250 'user.delete', action_data={'old_data': old_values},
250 'user.delete', action_data={'old_data': old_values},
251 user=c.rhodecode_user)
251 user=c.rhodecode_user)
252
252
253 Session().commit()
253 Session().commit()
254 set_handle_flash_repos()
254 set_handle_flash_repos()
255 set_handle_flash_repo_groups()
255 set_handle_flash_repo_groups()
256 set_handle_flash_user_groups()
256 set_handle_flash_user_groups()
257 h.flash(_('Successfully deleted user'), category='success')
257 h.flash(_('Successfully deleted user'), category='success')
258 except (UserOwnsReposException, UserOwnsRepoGroupsException,
258 except (UserOwnsReposException, UserOwnsRepoGroupsException,
259 UserOwnsUserGroupsException, DefaultUserException) as e:
259 UserOwnsUserGroupsException, DefaultUserException) as e:
260 h.flash(e, category='warning')
260 h.flash(e, category='warning')
261 except Exception:
261 except Exception:
262 log.exception("Exception during deletion of user")
262 log.exception("Exception during deletion of user")
263 h.flash(_('An error occurred during deletion of user'),
263 h.flash(_('An error occurred during deletion of user'),
264 category='error')
264 category='error')
265 return redirect(h.route_path('users'))
265 return redirect(h.route_path('users'))
266
266
267 @HasPermissionAllDecorator('hg.admin')
267 @HasPermissionAllDecorator('hg.admin')
268 @auth.CSRFRequired()
268 @auth.CSRFRequired()
269 def reset_password(self, user_id):
269 def reset_password(self, user_id):
270 """
270 """
271 toggle reset password flag for this user
271 toggle reset password flag for this user
272 """
272 """
273 user_id = safe_int(user_id)
273 user_id = safe_int(user_id)
274 c.user = User.get_or_404(user_id)
274 c.user = User.get_or_404(user_id)
275 try:
275 try:
276 old_value = c.user.user_data.get('force_password_change')
276 old_value = c.user.user_data.get('force_password_change')
277 c.user.update_userdata(force_password_change=not old_value)
277 c.user.update_userdata(force_password_change=not old_value)
278
278
279 if old_value:
279 if old_value:
280 msg = _('Force password change disabled for user')
280 msg = _('Force password change disabled for user')
281 audit_logger.store_web(
281 audit_logger.store_web(
282 'user.edit.password_reset.disabled',
282 'user.edit.password_reset.disabled',
283 user=c.rhodecode_user)
283 user=c.rhodecode_user)
284 else:
284 else:
285 msg = _('Force password change enabled for user')
285 msg = _('Force password change enabled for user')
286 audit_logger.store_web(
286 audit_logger.store_web(
287 'user.edit.password_reset.enabled',
287 'user.edit.password_reset.enabled',
288 user=c.rhodecode_user)
288 user=c.rhodecode_user)
289
289
290 Session().commit()
290 Session().commit()
291 h.flash(msg, category='success')
291 h.flash(msg, category='success')
292 except Exception:
292 except Exception:
293 log.exception("Exception during password reset for user")
293 log.exception("Exception during password reset for user")
294 h.flash(_('An error occurred during password reset for user'),
294 h.flash(_('An error occurred during password reset for user'),
295 category='error')
295 category='error')
296
296
297 return redirect(url('edit_user_advanced', user_id=user_id))
297 return redirect(url('edit_user_advanced', user_id=user_id))
298
298
299 @HasPermissionAllDecorator('hg.admin')
299 @HasPermissionAllDecorator('hg.admin')
300 @auth.CSRFRequired()
300 @auth.CSRFRequired()
301 def create_personal_repo_group(self, user_id):
301 def create_personal_repo_group(self, user_id):
302 """
302 """
303 Create personal repository group for this user
303 Create personal repository group for this user
304 """
304 """
305 from rhodecode.model.repo_group import RepoGroupModel
305 from rhodecode.model.repo_group import RepoGroupModel
306
306
307 user_id = safe_int(user_id)
307 user_id = safe_int(user_id)
308 c.user = User.get_or_404(user_id)
308 c.user = User.get_or_404(user_id)
309 personal_repo_group = RepoGroup.get_user_personal_repo_group(
309 personal_repo_group = RepoGroup.get_user_personal_repo_group(
310 c.user.user_id)
310 c.user.user_id)
311 if personal_repo_group:
311 if personal_repo_group:
312 return redirect(url('edit_user_advanced', user_id=user_id))
312 return redirect(url('edit_user_advanced', user_id=user_id))
313
313
314 personal_repo_group_name = RepoGroupModel().get_personal_group_name(
314 personal_repo_group_name = RepoGroupModel().get_personal_group_name(
315 c.user)
315 c.user)
316 named_personal_group = RepoGroup.get_by_group_name(
316 named_personal_group = RepoGroup.get_by_group_name(
317 personal_repo_group_name)
317 personal_repo_group_name)
318 try:
318 try:
319
319
320 if named_personal_group and named_personal_group.user_id == c.user.user_id:
320 if named_personal_group and named_personal_group.user_id == c.user.user_id:
321 # migrate the same named group, and mark it as personal
321 # migrate the same named group, and mark it as personal
322 named_personal_group.personal = True
322 named_personal_group.personal = True
323 Session().add(named_personal_group)
323 Session().add(named_personal_group)
324 Session().commit()
324 Session().commit()
325 msg = _('Linked repository group `%s` as personal' % (
325 msg = _('Linked repository group `%s` as personal' % (
326 personal_repo_group_name,))
326 personal_repo_group_name,))
327 h.flash(msg, category='success')
327 h.flash(msg, category='success')
328 elif not named_personal_group:
328 elif not named_personal_group:
329 RepoGroupModel().create_personal_repo_group(c.user)
329 RepoGroupModel().create_personal_repo_group(c.user)
330
330
331 msg = _('Created repository group `%s`' % (
331 msg = _('Created repository group `%s`' % (
332 personal_repo_group_name,))
332 personal_repo_group_name,))
333 h.flash(msg, category='success')
333 h.flash(msg, category='success')
334 else:
334 else:
335 msg = _('Repository group `%s` is already taken' % (
335 msg = _('Repository group `%s` is already taken' % (
336 personal_repo_group_name,))
336 personal_repo_group_name,))
337 h.flash(msg, category='warning')
337 h.flash(msg, category='warning')
338 except Exception:
338 except Exception:
339 log.exception("Exception during repository group creation")
339 log.exception("Exception during repository group creation")
340 msg = _(
340 msg = _(
341 'An error occurred during repository group creation for user')
341 'An error occurred during repository group creation for user')
342 h.flash(msg, category='error')
342 h.flash(msg, category='error')
343 Session().rollback()
343 Session().rollback()
344
344
345 return redirect(url('edit_user_advanced', user_id=user_id))
345 return redirect(url('edit_user_advanced', user_id=user_id))
346
346
347 @HasPermissionAllDecorator('hg.admin')
347 @HasPermissionAllDecorator('hg.admin')
348 def show(self, user_id):
348 def show(self, user_id):
349 """GET /users/user_id: Show a specific item"""
349 """GET /users/user_id: Show a specific item"""
350 # url('user', user_id=ID)
350 # url('user', user_id=ID)
351 User.get_or_404(-1)
351 User.get_or_404(-1)
352
352
353 @HasPermissionAllDecorator('hg.admin')
353 @HasPermissionAllDecorator('hg.admin')
354 def edit(self, user_id):
354 def edit(self, user_id):
355 """GET /users/user_id/edit: Form to edit an existing item"""
355 """GET /users/user_id/edit: Form to edit an existing item"""
356 # url('edit_user', user_id=ID)
356 # url('edit_user', user_id=ID)
357 user_id = safe_int(user_id)
357 user_id = safe_int(user_id)
358 c.user = User.get_or_404(user_id)
358 c.user = User.get_or_404(user_id)
359 if c.user.username == User.DEFAULT_USER:
359 if c.user.username == User.DEFAULT_USER:
360 h.flash(_("You can't edit this user"), category='warning')
360 h.flash(_("You can't edit this user"), category='warning')
361 return redirect(h.route_path('users'))
361 return redirect(h.route_path('users'))
362
362
363 c.active = 'profile'
363 c.active = 'profile'
364 c.extern_type = c.user.extern_type
364 c.extern_type = c.user.extern_type
365 c.extern_name = c.user.extern_name
365 c.extern_name = c.user.extern_name
366 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
366 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
367
367
368 defaults = c.user.get_dict()
368 defaults = c.user.get_dict()
369 defaults.update({'language': c.user.user_data.get('language')})
369 defaults.update({'language': c.user.user_data.get('language')})
370 return htmlfill.render(
370 return htmlfill.render(
371 render('admin/users/user_edit.mako'),
371 render('admin/users/user_edit.mako'),
372 defaults=defaults,
372 defaults=defaults,
373 encoding="UTF-8",
373 encoding="UTF-8",
374 force_defaults=False)
374 force_defaults=False)
375
375
376 @HasPermissionAllDecorator('hg.admin')
376 @HasPermissionAllDecorator('hg.admin')
377 def edit_advanced(self, user_id):
377 def edit_advanced(self, user_id):
378 user_id = safe_int(user_id)
378 user_id = safe_int(user_id)
379 user = c.user = User.get_or_404(user_id)
379 user = c.user = User.get_or_404(user_id)
380 if user.username == User.DEFAULT_USER:
380 if user.username == User.DEFAULT_USER:
381 h.flash(_("You can't edit this user"), category='warning')
381 h.flash(_("You can't edit this user"), category='warning')
382 return redirect(h.route_path('users'))
382 return redirect(h.route_path('users'))
383
383
384 c.active = 'advanced'
384 c.active = 'advanced'
385 c.personal_repo_group = RepoGroup.get_user_personal_repo_group(user_id)
385 c.personal_repo_group = RepoGroup.get_user_personal_repo_group(user_id)
386 c.personal_repo_group_name = RepoGroupModel()\
386 c.personal_repo_group_name = RepoGroupModel()\
387 .get_personal_group_name(user)
387 .get_personal_group_name(user)
388 c.first_admin = User.get_first_super_admin()
388 c.first_admin = User.get_first_super_admin()
389 defaults = user.get_dict()
389 defaults = user.get_dict()
390
390
391 # Interim workaround if the user participated on any pull requests as a
391 # Interim workaround if the user participated on any pull requests as a
392 # reviewer.
392 # reviewer.
393 has_review = bool(PullRequestReviewers.query().filter(
393 has_review = len(user.reviewer_pull_requests)
394 PullRequestReviewers.user_id == user_id).first())
395 c.can_delete_user = not has_review
394 c.can_delete_user = not has_review
396 c.can_delete_user_message = _(
395 c.can_delete_user_message = ''
397 'The user participates as reviewer in pull requests and '
396 inactive_link = h.link_to(
398 'cannot be deleted. You can set the user to '
397 'inactive', h.url('edit_user', user_id=user_id, anchor='active'))
399 '"inactive" instead of deleting it.') if has_review else ''
398 if has_review == 1:
399 c.can_delete_user_message = h.literal(_(
400 'The user participates as reviewer in {} pull request and '
401 'cannot be deleted. \nYou can set the user to '
402 '"{}" instead of deleting it.').format(
403 has_review, inactive_link))
404 elif has_review:
405 c.can_delete_user_message = h.literal(_(
406 'The user participates as reviewer in {} pull requests and '
407 'cannot be deleted. \nYou can set the user to '
408 '"{}" instead of deleting it.').format(
409 has_review, inactive_link))
400
410
401 return htmlfill.render(
411 return htmlfill.render(
402 render('admin/users/user_edit.mako'),
412 render('admin/users/user_edit.mako'),
403 defaults=defaults,
413 defaults=defaults,
404 encoding="UTF-8",
414 encoding="UTF-8",
405 force_defaults=False)
415 force_defaults=False)
406
416
407 @HasPermissionAllDecorator('hg.admin')
417 @HasPermissionAllDecorator('hg.admin')
408 def edit_global_perms(self, user_id):
418 def edit_global_perms(self, user_id):
409 user_id = safe_int(user_id)
419 user_id = safe_int(user_id)
410 c.user = User.get_or_404(user_id)
420 c.user = User.get_or_404(user_id)
411 if c.user.username == User.DEFAULT_USER:
421 if c.user.username == User.DEFAULT_USER:
412 h.flash(_("You can't edit this user"), category='warning')
422 h.flash(_("You can't edit this user"), category='warning')
413 return redirect(h.route_path('users'))
423 return redirect(h.route_path('users'))
414
424
415 c.active = 'global_perms'
425 c.active = 'global_perms'
416
426
417 c.default_user = User.get_default_user()
427 c.default_user = User.get_default_user()
418 defaults = c.user.get_dict()
428 defaults = c.user.get_dict()
419 defaults.update(c.default_user.get_default_perms(suffix='_inherited'))
429 defaults.update(c.default_user.get_default_perms(suffix='_inherited'))
420 defaults.update(c.default_user.get_default_perms())
430 defaults.update(c.default_user.get_default_perms())
421 defaults.update(c.user.get_default_perms())
431 defaults.update(c.user.get_default_perms())
422
432
423 return htmlfill.render(
433 return htmlfill.render(
424 render('admin/users/user_edit.mako'),
434 render('admin/users/user_edit.mako'),
425 defaults=defaults,
435 defaults=defaults,
426 encoding="UTF-8",
436 encoding="UTF-8",
427 force_defaults=False)
437 force_defaults=False)
428
438
429 @HasPermissionAllDecorator('hg.admin')
439 @HasPermissionAllDecorator('hg.admin')
430 @auth.CSRFRequired()
440 @auth.CSRFRequired()
431 def update_global_perms(self, user_id):
441 def update_global_perms(self, user_id):
432 user_id = safe_int(user_id)
442 user_id = safe_int(user_id)
433 user = User.get_or_404(user_id)
443 user = User.get_or_404(user_id)
434 c.active = 'global_perms'
444 c.active = 'global_perms'
435 try:
445 try:
436 # first stage that verifies the checkbox
446 # first stage that verifies the checkbox
437 _form = UserIndividualPermissionsForm()
447 _form = UserIndividualPermissionsForm()
438 form_result = _form.to_python(dict(request.POST))
448 form_result = _form.to_python(dict(request.POST))
439 inherit_perms = form_result['inherit_default_permissions']
449 inherit_perms = form_result['inherit_default_permissions']
440 user.inherit_default_permissions = inherit_perms
450 user.inherit_default_permissions = inherit_perms
441 Session().add(user)
451 Session().add(user)
442
452
443 if not inherit_perms:
453 if not inherit_perms:
444 # only update the individual ones if we un check the flag
454 # only update the individual ones if we un check the flag
445 _form = UserPermissionsForm(
455 _form = UserPermissionsForm(
446 [x[0] for x in c.repo_create_choices],
456 [x[0] for x in c.repo_create_choices],
447 [x[0] for x in c.repo_create_on_write_choices],
457 [x[0] for x in c.repo_create_on_write_choices],
448 [x[0] for x in c.repo_group_create_choices],
458 [x[0] for x in c.repo_group_create_choices],
449 [x[0] for x in c.user_group_create_choices],
459 [x[0] for x in c.user_group_create_choices],
450 [x[0] for x in c.fork_choices],
460 [x[0] for x in c.fork_choices],
451 [x[0] for x in c.inherit_default_permission_choices])()
461 [x[0] for x in c.inherit_default_permission_choices])()
452
462
453 form_result = _form.to_python(dict(request.POST))
463 form_result = _form.to_python(dict(request.POST))
454 form_result.update({'perm_user_id': user.user_id})
464 form_result.update({'perm_user_id': user.user_id})
455
465
456 PermissionModel().update_user_permissions(form_result)
466 PermissionModel().update_user_permissions(form_result)
457
467
458 # TODO(marcink): implement global permissions
468 # TODO(marcink): implement global permissions
459 # audit_log.store_web('user.edit.permissions')
469 # audit_log.store_web('user.edit.permissions')
460
470
461 Session().commit()
471 Session().commit()
462 h.flash(_('User global permissions updated successfully'),
472 h.flash(_('User global permissions updated successfully'),
463 category='success')
473 category='success')
464
474
465 except formencode.Invalid as errors:
475 except formencode.Invalid as errors:
466 defaults = errors.value
476 defaults = errors.value
467 c.user = user
477 c.user = user
468 return htmlfill.render(
478 return htmlfill.render(
469 render('admin/users/user_edit.mako'),
479 render('admin/users/user_edit.mako'),
470 defaults=defaults,
480 defaults=defaults,
471 errors=errors.error_dict or {},
481 errors=errors.error_dict or {},
472 prefix_error=False,
482 prefix_error=False,
473 encoding="UTF-8",
483 encoding="UTF-8",
474 force_defaults=False)
484 force_defaults=False)
475 except Exception:
485 except Exception:
476 log.exception("Exception during permissions saving")
486 log.exception("Exception during permissions saving")
477 h.flash(_('An error occurred during permissions saving'),
487 h.flash(_('An error occurred during permissions saving'),
478 category='error')
488 category='error')
479 return redirect(url('edit_user_global_perms', user_id=user_id))
489 return redirect(url('edit_user_global_perms', user_id=user_id))
480
490
481 @HasPermissionAllDecorator('hg.admin')
491 @HasPermissionAllDecorator('hg.admin')
482 def edit_perms_summary(self, user_id):
492 def edit_perms_summary(self, user_id):
483 user_id = safe_int(user_id)
493 user_id = safe_int(user_id)
484 c.user = User.get_or_404(user_id)
494 c.user = User.get_or_404(user_id)
485 if c.user.username == User.DEFAULT_USER:
495 if c.user.username == User.DEFAULT_USER:
486 h.flash(_("You can't edit this user"), category='warning')
496 h.flash(_("You can't edit this user"), category='warning')
487 return redirect(h.route_path('users'))
497 return redirect(h.route_path('users'))
488
498
489 c.active = 'perms_summary'
499 c.active = 'perms_summary'
490 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
500 c.perm_user = AuthUser(user_id=user_id, ip_addr=self.ip_addr)
491
501
492 return render('admin/users/user_edit.mako')
502 return render('admin/users/user_edit.mako')
493
503
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,2385 +1,2391 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 'fonts';
8 @import 'fonts';
9 @import 'variables';
9 @import 'variables';
10 @import 'bootstrap-variables';
10 @import 'bootstrap-variables';
11 @import 'form-bootstrap';
11 @import 'form-bootstrap';
12 @import 'codemirror';
12 @import 'codemirror';
13 @import 'legacy_code_styles';
13 @import 'legacy_code_styles';
14 @import 'readme-box';
14 @import 'readme-box';
15 @import 'progress-bar';
15 @import 'progress-bar';
16
16
17 @import 'type';
17 @import 'type';
18 @import 'alerts';
18 @import 'alerts';
19 @import 'buttons';
19 @import 'buttons';
20 @import 'tags';
20 @import 'tags';
21 @import 'code-block';
21 @import 'code-block';
22 @import 'examples';
22 @import 'examples';
23 @import 'login';
23 @import 'login';
24 @import 'main-content';
24 @import 'main-content';
25 @import 'select2';
25 @import 'select2';
26 @import 'comments';
26 @import 'comments';
27 @import 'panels-bootstrap';
27 @import 'panels-bootstrap';
28 @import 'panels';
28 @import 'panels';
29 @import 'deform';
29 @import 'deform';
30
30
31 //--- BASE ------------------//
31 //--- BASE ------------------//
32 .noscript-error {
32 .noscript-error {
33 top: 0;
33 top: 0;
34 left: 0;
34 left: 0;
35 width: 100%;
35 width: 100%;
36 z-index: 101;
36 z-index: 101;
37 text-align: center;
37 text-align: center;
38 font-family: @text-semibold;
38 font-family: @text-semibold;
39 font-size: 120%;
39 font-size: 120%;
40 color: white;
40 color: white;
41 background-color: @alert2;
41 background-color: @alert2;
42 padding: 5px 0 5px 0;
42 padding: 5px 0 5px 0;
43 }
43 }
44
44
45 html {
45 html {
46 display: table;
46 display: table;
47 height: 100%;
47 height: 100%;
48 width: 100%;
48 width: 100%;
49 }
49 }
50
50
51 body {
51 body {
52 display: table-cell;
52 display: table-cell;
53 width: 100%;
53 width: 100%;
54 }
54 }
55
55
56 //--- LAYOUT ------------------//
56 //--- LAYOUT ------------------//
57
57
58 .hidden{
58 .hidden{
59 display: none !important;
59 display: none !important;
60 }
60 }
61
61
62 .box{
62 .box{
63 float: left;
63 float: left;
64 width: 100%;
64 width: 100%;
65 }
65 }
66
66
67 .browser-header {
67 .browser-header {
68 clear: both;
68 clear: both;
69 }
69 }
70 .main {
70 .main {
71 clear: both;
71 clear: both;
72 padding:0 0 @pagepadding;
72 padding:0 0 @pagepadding;
73 height: auto;
73 height: auto;
74
74
75 &:after { //clearfix
75 &:after { //clearfix
76 content:"";
76 content:"";
77 clear:both;
77 clear:both;
78 width:100%;
78 width:100%;
79 display:block;
79 display:block;
80 }
80 }
81 }
81 }
82
82
83 .action-link{
83 .action-link{
84 margin-left: @padding;
84 margin-left: @padding;
85 padding-left: @padding;
85 padding-left: @padding;
86 border-left: @border-thickness solid @border-default-color;
86 border-left: @border-thickness solid @border-default-color;
87 }
87 }
88
88
89 input + .action-link, .action-link.first{
89 input + .action-link, .action-link.first{
90 border-left: none;
90 border-left: none;
91 }
91 }
92
92
93 .action-link.last{
93 .action-link.last{
94 margin-right: @padding;
94 margin-right: @padding;
95 padding-right: @padding;
95 padding-right: @padding;
96 }
96 }
97
97
98 .action-link.active,
98 .action-link.active,
99 .action-link.active a{
99 .action-link.active a{
100 color: @grey4;
100 color: @grey4;
101 }
101 }
102
102
103 ul.simple-list{
103 ul.simple-list{
104 list-style: none;
104 list-style: none;
105 margin: 0;
105 margin: 0;
106 padding: 0;
106 padding: 0;
107 }
107 }
108
108
109 .main-content {
109 .main-content {
110 padding-bottom: @pagepadding;
110 padding-bottom: @pagepadding;
111 }
111 }
112
112
113 .wide-mode-wrapper {
113 .wide-mode-wrapper {
114 max-width:4000px !important;
114 max-width:4000px !important;
115 }
115 }
116
116
117 .wrapper {
117 .wrapper {
118 position: relative;
118 position: relative;
119 max-width: @wrapper-maxwidth;
119 max-width: @wrapper-maxwidth;
120 margin: 0 auto;
120 margin: 0 auto;
121 }
121 }
122
122
123 #content {
123 #content {
124 clear: both;
124 clear: both;
125 padding: 0 @contentpadding;
125 padding: 0 @contentpadding;
126 }
126 }
127
127
128 .advanced-settings-fields{
128 .advanced-settings-fields{
129 input{
129 input{
130 margin-left: @textmargin;
130 margin-left: @textmargin;
131 margin-right: @padding/2;
131 margin-right: @padding/2;
132 }
132 }
133 }
133 }
134
134
135 .cs_files_title {
135 .cs_files_title {
136 margin: @pagepadding 0 0;
136 margin: @pagepadding 0 0;
137 }
137 }
138
138
139 input.inline[type="file"] {
139 input.inline[type="file"] {
140 display: inline;
140 display: inline;
141 }
141 }
142
142
143 .error_page {
143 .error_page {
144 margin: 10% auto;
144 margin: 10% auto;
145
145
146 h1 {
146 h1 {
147 color: @grey2;
147 color: @grey2;
148 }
148 }
149
149
150 .alert {
150 .alert {
151 margin: @padding 0;
151 margin: @padding 0;
152 }
152 }
153
153
154 .error-branding {
154 .error-branding {
155 font-family: @text-semibold;
155 font-family: @text-semibold;
156 color: @grey4;
156 color: @grey4;
157 }
157 }
158
158
159 .error_message {
159 .error_message {
160 font-family: @text-regular;
160 font-family: @text-regular;
161 }
161 }
162
162
163 .sidebar {
163 .sidebar {
164 min-height: 275px;
164 min-height: 275px;
165 margin: 0;
165 margin: 0;
166 padding: 0 0 @sidebarpadding @sidebarpadding;
166 padding: 0 0 @sidebarpadding @sidebarpadding;
167 border: none;
167 border: none;
168 }
168 }
169
169
170 .main-content {
170 .main-content {
171 position: relative;
171 position: relative;
172 margin: 0 @sidebarpadding @sidebarpadding;
172 margin: 0 @sidebarpadding @sidebarpadding;
173 padding: 0 0 0 @sidebarpadding;
173 padding: 0 0 0 @sidebarpadding;
174 border-left: @border-thickness solid @grey5;
174 border-left: @border-thickness solid @grey5;
175
175
176 @media (max-width:767px) {
176 @media (max-width:767px) {
177 clear: both;
177 clear: both;
178 width: 100%;
178 width: 100%;
179 margin: 0;
179 margin: 0;
180 border: none;
180 border: none;
181 }
181 }
182 }
182 }
183
183
184 .inner-column {
184 .inner-column {
185 float: left;
185 float: left;
186 width: 29.75%;
186 width: 29.75%;
187 min-height: 150px;
187 min-height: 150px;
188 margin: @sidebarpadding 2% 0 0;
188 margin: @sidebarpadding 2% 0 0;
189 padding: 0 2% 0 0;
189 padding: 0 2% 0 0;
190 border-right: @border-thickness solid @grey5;
190 border-right: @border-thickness solid @grey5;
191
191
192 @media (max-width:767px) {
192 @media (max-width:767px) {
193 clear: both;
193 clear: both;
194 width: 100%;
194 width: 100%;
195 border: none;
195 border: none;
196 }
196 }
197
197
198 ul {
198 ul {
199 padding-left: 1.25em;
199 padding-left: 1.25em;
200 }
200 }
201
201
202 &:last-child {
202 &:last-child {
203 margin: @sidebarpadding 0 0;
203 margin: @sidebarpadding 0 0;
204 border: none;
204 border: none;
205 }
205 }
206
206
207 h4 {
207 h4 {
208 margin: 0 0 @padding;
208 margin: 0 0 @padding;
209 font-family: @text-semibold;
209 font-family: @text-semibold;
210 }
210 }
211 }
211 }
212 }
212 }
213 .error-page-logo {
213 .error-page-logo {
214 width: 130px;
214 width: 130px;
215 height: 160px;
215 height: 160px;
216 }
216 }
217
217
218 // HEADER
218 // HEADER
219 .header {
219 .header {
220
220
221 // TODO: johbo: Fix login pages, so that they work without a min-height
221 // TODO: johbo: Fix login pages, so that they work without a min-height
222 // for the header and then remove the min-height. I chose a smaller value
222 // for the header and then remove the min-height. I chose a smaller value
223 // intentionally here to avoid rendering issues in the main navigation.
223 // intentionally here to avoid rendering issues in the main navigation.
224 min-height: 49px;
224 min-height: 49px;
225
225
226 position: relative;
226 position: relative;
227 vertical-align: bottom;
227 vertical-align: bottom;
228 padding: 0 @header-padding;
228 padding: 0 @header-padding;
229 background-color: @grey2;
229 background-color: @grey2;
230 color: @grey5;
230 color: @grey5;
231
231
232 .title {
232 .title {
233 overflow: visible;
233 overflow: visible;
234 }
234 }
235
235
236 &:before,
236 &:before,
237 &:after {
237 &:after {
238 content: "";
238 content: "";
239 clear: both;
239 clear: both;
240 width: 100%;
240 width: 100%;
241 }
241 }
242
242
243 // TODO: johbo: Avoids breaking "Repositories" chooser
243 // TODO: johbo: Avoids breaking "Repositories" chooser
244 .select2-container .select2-choice .select2-arrow {
244 .select2-container .select2-choice .select2-arrow {
245 display: none;
245 display: none;
246 }
246 }
247 }
247 }
248
248
249 #header-inner {
249 #header-inner {
250 &.title {
250 &.title {
251 margin: 0;
251 margin: 0;
252 }
252 }
253 &:before,
253 &:before,
254 &:after {
254 &:after {
255 content: "";
255 content: "";
256 clear: both;
256 clear: both;
257 }
257 }
258 }
258 }
259
259
260 // Gists
260 // Gists
261 #files_data {
261 #files_data {
262 clear: both; //for firefox
262 clear: both; //for firefox
263 }
263 }
264 #gistid {
264 #gistid {
265 margin-right: @padding;
265 margin-right: @padding;
266 }
266 }
267
267
268 // Global Settings Editor
268 // Global Settings Editor
269 .textarea.editor {
269 .textarea.editor {
270 float: left;
270 float: left;
271 position: relative;
271 position: relative;
272 max-width: @texteditor-width;
272 max-width: @texteditor-width;
273
273
274 select {
274 select {
275 position: absolute;
275 position: absolute;
276 top:10px;
276 top:10px;
277 right:0;
277 right:0;
278 }
278 }
279
279
280 .CodeMirror {
280 .CodeMirror {
281 margin: 0;
281 margin: 0;
282 }
282 }
283
283
284 .help-block {
284 .help-block {
285 margin: 0 0 @padding;
285 margin: 0 0 @padding;
286 padding:.5em;
286 padding:.5em;
287 background-color: @grey6;
287 background-color: @grey6;
288 &.pre-formatting {
289 white-space: pre;
290 }
288 }
291 }
289 }
292 }
290
293
291 ul.auth_plugins {
294 ul.auth_plugins {
292 margin: @padding 0 @padding @legend-width;
295 margin: @padding 0 @padding @legend-width;
293 padding: 0;
296 padding: 0;
294
297
295 li {
298 li {
296 margin-bottom: @padding;
299 margin-bottom: @padding;
297 line-height: 1em;
300 line-height: 1em;
298 list-style-type: none;
301 list-style-type: none;
299
302
300 .auth_buttons .btn {
303 .auth_buttons .btn {
301 margin-right: @padding;
304 margin-right: @padding;
302 }
305 }
303
306
304 &:before { content: none; }
307 &:before { content: none; }
305 }
308 }
306 }
309 }
307
310
308
311
309 // My Account PR list
312 // My Account PR list
310
313
311 #show_closed {
314 #show_closed {
312 margin: 0 1em 0 0;
315 margin: 0 1em 0 0;
313 }
316 }
314
317
315 .pullrequestlist {
318 .pullrequestlist {
316 .closed {
319 .closed {
317 background-color: @grey6;
320 background-color: @grey6;
318 }
321 }
319 .td-status {
322 .td-status {
320 padding-left: .5em;
323 padding-left: .5em;
321 }
324 }
322 .log-container .truncate {
325 .log-container .truncate {
323 height: 2.75em;
326 height: 2.75em;
324 white-space: pre-line;
327 white-space: pre-line;
325 }
328 }
326 table.rctable .user {
329 table.rctable .user {
327 padding-left: 0;
330 padding-left: 0;
328 }
331 }
329 table.rctable {
332 table.rctable {
330 td.td-description,
333 td.td-description,
331 .rc-user {
334 .rc-user {
332 min-width: auto;
335 min-width: auto;
333 }
336 }
334 }
337 }
335 }
338 }
336
339
337 // Pull Requests
340 // Pull Requests
338
341
339 .pullrequests_section_head {
342 .pullrequests_section_head {
340 display: block;
343 display: block;
341 clear: both;
344 clear: both;
342 margin: @padding 0;
345 margin: @padding 0;
343 font-family: @text-bold;
346 font-family: @text-bold;
344 }
347 }
345
348
346 .pr-origininfo, .pr-targetinfo {
349 .pr-origininfo, .pr-targetinfo {
347 position: relative;
350 position: relative;
348
351
349 .tag {
352 .tag {
350 display: inline-block;
353 display: inline-block;
351 margin: 0 1em .5em 0;
354 margin: 0 1em .5em 0;
352 }
355 }
353
356
354 .clone-url {
357 .clone-url {
355 display: inline-block;
358 display: inline-block;
356 margin: 0 0 .5em 0;
359 margin: 0 0 .5em 0;
357 padding: 0;
360 padding: 0;
358 line-height: 1.2em;
361 line-height: 1.2em;
359 }
362 }
360 }
363 }
361
364
362 .pr-mergeinfo {
365 .pr-mergeinfo {
363 clear: both;
366 clear: both;
364 margin: .5em 0;
367 margin: .5em 0;
365
368
366 input {
369 input {
367 min-width: 100% !important;
370 min-width: 100% !important;
368 padding: 0 !important;
371 padding: 0 !important;
369 border: 0;
372 border: 0;
370 }
373 }
371 }
374 }
372
375
373 .pr-pullinfo {
376 .pr-pullinfo {
374 clear: both;
377 clear: both;
375 margin: .5em 0;
378 margin: .5em 0;
376
379
377 input {
380 input {
378 min-width: 100% !important;
381 min-width: 100% !important;
379 padding: 0 !important;
382 padding: 0 !important;
380 border: 0;
383 border: 0;
381 }
384 }
382 }
385 }
383
386
384 #pr-title-input {
387 #pr-title-input {
385 width: 72%;
388 width: 72%;
386 font-size: 1em;
389 font-size: 1em;
387 font-family: @text-bold;
390 font-family: @text-bold;
388 margin: 0;
391 margin: 0;
389 padding: 0 0 0 @padding/4;
392 padding: 0 0 0 @padding/4;
390 line-height: 1.7em;
393 line-height: 1.7em;
391 color: @text-color;
394 color: @text-color;
392 letter-spacing: .02em;
395 letter-spacing: .02em;
393 }
396 }
394
397
395 #pullrequest_title {
398 #pullrequest_title {
396 width: 100%;
399 width: 100%;
397 box-sizing: border-box;
400 box-sizing: border-box;
398 }
401 }
399
402
400 #pr_open_message {
403 #pr_open_message {
401 border: @border-thickness solid #fff;
404 border: @border-thickness solid #fff;
402 border-radius: @border-radius;
405 border-radius: @border-radius;
403 padding: @padding-large-vertical @padding-large-vertical @padding-large-vertical 0;
406 padding: @padding-large-vertical @padding-large-vertical @padding-large-vertical 0;
404 text-align: left;
407 text-align: left;
405 overflow: hidden;
408 overflow: hidden;
406 }
409 }
407
410
408 .pr-submit-button {
411 .pr-submit-button {
409 float: right;
412 float: right;
410 margin: 0 0 0 5px;
413 margin: 0 0 0 5px;
411 }
414 }
412
415
413 .pr-spacing-container {
416 .pr-spacing-container {
414 padding: 20px;
417 padding: 20px;
415 clear: both
418 clear: both
416 }
419 }
417
420
418 #pr-description-input {
421 #pr-description-input {
419 margin-bottom: 0;
422 margin-bottom: 0;
420 }
423 }
421
424
422 .pr-description-label {
425 .pr-description-label {
423 vertical-align: top;
426 vertical-align: top;
424 }
427 }
425
428
426 .perms_section_head {
429 .perms_section_head {
427 min-width: 625px;
430 min-width: 625px;
428
431
429 h2 {
432 h2 {
430 margin-bottom: 0;
433 margin-bottom: 0;
431 }
434 }
432
435
433 .label-checkbox {
436 .label-checkbox {
434 float: left;
437 float: left;
435 }
438 }
436
439
437 &.field {
440 &.field {
438 margin: @space 0 @padding;
441 margin: @space 0 @padding;
439 }
442 }
440
443
441 &:first-child.field {
444 &:first-child.field {
442 margin-top: 0;
445 margin-top: 0;
443
446
444 .label {
447 .label {
445 margin-top: 0;
448 margin-top: 0;
446 padding-top: 0;
449 padding-top: 0;
447 }
450 }
448
451
449 .radios {
452 .radios {
450 padding-top: 0;
453 padding-top: 0;
451 }
454 }
452 }
455 }
453
456
454 .radios {
457 .radios {
455 float: right;
458 float: right;
456 position: relative;
459 position: relative;
457 width: 405px;
460 width: 405px;
458 }
461 }
459 }
462 }
460
463
461 //--- MODULES ------------------//
464 //--- MODULES ------------------//
462
465
463
466
464 // Server Announcement
467 // Server Announcement
465 #server-announcement {
468 #server-announcement {
466 width: 95%;
469 width: 95%;
467 margin: @padding auto;
470 margin: @padding auto;
468 padding: @padding;
471 padding: @padding;
469 border-width: 2px;
472 border-width: 2px;
470 border-style: solid;
473 border-style: solid;
471 .border-radius(2px);
474 .border-radius(2px);
472 font-family: @text-bold;
475 font-family: @text-bold;
473
476
474 &.info { border-color: @alert4; background-color: @alert4-inner; }
477 &.info { border-color: @alert4; background-color: @alert4-inner; }
475 &.warning { border-color: @alert3; background-color: @alert3-inner; }
478 &.warning { border-color: @alert3; background-color: @alert3-inner; }
476 &.error { border-color: @alert2; background-color: @alert2-inner; }
479 &.error { border-color: @alert2; background-color: @alert2-inner; }
477 &.success { border-color: @alert1; background-color: @alert1-inner; }
480 &.success { border-color: @alert1; background-color: @alert1-inner; }
478 &.neutral { border-color: @grey3; background-color: @grey6; }
481 &.neutral { border-color: @grey3; background-color: @grey6; }
479 }
482 }
480
483
481 // Fixed Sidebar Column
484 // Fixed Sidebar Column
482 .sidebar-col-wrapper {
485 .sidebar-col-wrapper {
483 padding-left: @sidebar-all-width;
486 padding-left: @sidebar-all-width;
484
487
485 .sidebar {
488 .sidebar {
486 width: @sidebar-width;
489 width: @sidebar-width;
487 margin-left: -@sidebar-all-width;
490 margin-left: -@sidebar-all-width;
488 }
491 }
489 }
492 }
490
493
491 .sidebar-col-wrapper.scw-small {
494 .sidebar-col-wrapper.scw-small {
492 padding-left: @sidebar-small-all-width;
495 padding-left: @sidebar-small-all-width;
493
496
494 .sidebar {
497 .sidebar {
495 width: @sidebar-small-width;
498 width: @sidebar-small-width;
496 margin-left: -@sidebar-small-all-width;
499 margin-left: -@sidebar-small-all-width;
497 }
500 }
498 }
501 }
499
502
500
503
501 // FOOTER
504 // FOOTER
502 #footer {
505 #footer {
503 padding: 0;
506 padding: 0;
504 text-align: center;
507 text-align: center;
505 vertical-align: middle;
508 vertical-align: middle;
506 color: @grey2;
509 color: @grey2;
507 background-color: @grey6;
510 background-color: @grey6;
508
511
509 p {
512 p {
510 margin: 0;
513 margin: 0;
511 padding: 1em;
514 padding: 1em;
512 line-height: 1em;
515 line-height: 1em;
513 }
516 }
514
517
515 .server-instance { //server instance
518 .server-instance { //server instance
516 display: none;
519 display: none;
517 }
520 }
518
521
519 .title {
522 .title {
520 float: none;
523 float: none;
521 margin: 0 auto;
524 margin: 0 auto;
522 }
525 }
523 }
526 }
524
527
525 button.close {
528 button.close {
526 padding: 0;
529 padding: 0;
527 cursor: pointer;
530 cursor: pointer;
528 background: transparent;
531 background: transparent;
529 border: 0;
532 border: 0;
530 .box-shadow(none);
533 .box-shadow(none);
531 -webkit-appearance: none;
534 -webkit-appearance: none;
532 }
535 }
533
536
534 .close {
537 .close {
535 float: right;
538 float: right;
536 font-size: 21px;
539 font-size: 21px;
537 font-family: @text-bootstrap;
540 font-family: @text-bootstrap;
538 line-height: 1em;
541 line-height: 1em;
539 font-weight: bold;
542 font-weight: bold;
540 color: @grey2;
543 color: @grey2;
541
544
542 &:hover,
545 &:hover,
543 &:focus {
546 &:focus {
544 color: @grey1;
547 color: @grey1;
545 text-decoration: none;
548 text-decoration: none;
546 cursor: pointer;
549 cursor: pointer;
547 }
550 }
548 }
551 }
549
552
550 // GRID
553 // GRID
551 .sorting,
554 .sorting,
552 .sorting_desc,
555 .sorting_desc,
553 .sorting_asc {
556 .sorting_asc {
554 cursor: pointer;
557 cursor: pointer;
555 }
558 }
556 .sorting_desc:after {
559 .sorting_desc:after {
557 content: "\00A0\25B2";
560 content: "\00A0\25B2";
558 font-size: .75em;
561 font-size: .75em;
559 }
562 }
560 .sorting_asc:after {
563 .sorting_asc:after {
561 content: "\00A0\25BC";
564 content: "\00A0\25BC";
562 font-size: .68em;
565 font-size: .68em;
563 }
566 }
564
567
565
568
566 .user_auth_tokens {
569 .user_auth_tokens {
567
570
568 &.truncate {
571 &.truncate {
569 white-space: nowrap;
572 white-space: nowrap;
570 overflow: hidden;
573 overflow: hidden;
571 text-overflow: ellipsis;
574 text-overflow: ellipsis;
572 }
575 }
573
576
574 .fields .field .input {
577 .fields .field .input {
575 margin: 0;
578 margin: 0;
576 }
579 }
577
580
578 input#description {
581 input#description {
579 width: 100px;
582 width: 100px;
580 margin: 0;
583 margin: 0;
581 }
584 }
582
585
583 .drop-menu {
586 .drop-menu {
584 // TODO: johbo: Remove this, should work out of the box when
587 // TODO: johbo: Remove this, should work out of the box when
585 // having multiple inputs inline
588 // having multiple inputs inline
586 margin: 0 0 0 5px;
589 margin: 0 0 0 5px;
587 }
590 }
588 }
591 }
589 #user_list_table {
592 #user_list_table {
590 .closed {
593 .closed {
591 background-color: @grey6;
594 background-color: @grey6;
592 }
595 }
593 }
596 }
594
597
595
598
596 input {
599 input {
597 &.disabled {
600 &.disabled {
598 opacity: .5;
601 opacity: .5;
599 }
602 }
600 }
603 }
601
604
602 // remove extra padding in firefox
605 // remove extra padding in firefox
603 input::-moz-focus-inner { border:0; padding:0 }
606 input::-moz-focus-inner { border:0; padding:0 }
604
607
605 .adjacent input {
608 .adjacent input {
606 margin-bottom: @padding;
609 margin-bottom: @padding;
607 }
610 }
608
611
609 .permissions_boxes {
612 .permissions_boxes {
610 display: block;
613 display: block;
611 }
614 }
612
615
613 //TODO: lisa: this should be in tables
616 //TODO: lisa: this should be in tables
614 .show_more_col {
617 .show_more_col {
615 width: 20px;
618 width: 20px;
616 }
619 }
617
620
618 //FORMS
621 //FORMS
619
622
620 .medium-inline,
623 .medium-inline,
621 input#description.medium-inline {
624 input#description.medium-inline {
622 display: inline;
625 display: inline;
623 width: @medium-inline-input-width;
626 width: @medium-inline-input-width;
624 min-width: 100px;
627 min-width: 100px;
625 }
628 }
626
629
627 select {
630 select {
628 //reset
631 //reset
629 -webkit-appearance: none;
632 -webkit-appearance: none;
630 -moz-appearance: none;
633 -moz-appearance: none;
631
634
632 display: inline-block;
635 display: inline-block;
633 height: 28px;
636 height: 28px;
634 width: auto;
637 width: auto;
635 margin: 0 @padding @padding 0;
638 margin: 0 @padding @padding 0;
636 padding: 0 18px 0 8px;
639 padding: 0 18px 0 8px;
637 line-height:1em;
640 line-height:1em;
638 font-size: @basefontsize;
641 font-size: @basefontsize;
639 border: @border-thickness solid @rcblue;
642 border: @border-thickness solid @rcblue;
640 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
643 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
641 color: @rcblue;
644 color: @rcblue;
642
645
643 &:after {
646 &:after {
644 content: "\00A0\25BE";
647 content: "\00A0\25BE";
645 }
648 }
646
649
647 &:focus {
650 &:focus {
648 outline: none;
651 outline: none;
649 }
652 }
650 }
653 }
651
654
652 option {
655 option {
653 &:focus {
656 &:focus {
654 outline: none;
657 outline: none;
655 }
658 }
656 }
659 }
657
660
658 input,
661 input,
659 textarea {
662 textarea {
660 padding: @input-padding;
663 padding: @input-padding;
661 border: @input-border-thickness solid @border-highlight-color;
664 border: @input-border-thickness solid @border-highlight-color;
662 .border-radius (@border-radius);
665 .border-radius (@border-radius);
663 font-family: @text-light;
666 font-family: @text-light;
664 font-size: @basefontsize;
667 font-size: @basefontsize;
665
668
666 &.input-sm {
669 &.input-sm {
667 padding: 5px;
670 padding: 5px;
668 }
671 }
669
672
670 &#description {
673 &#description {
671 min-width: @input-description-minwidth;
674 min-width: @input-description-minwidth;
672 min-height: 1em;
675 min-height: 1em;
673 padding: 10px;
676 padding: 10px;
674 }
677 }
675 }
678 }
676
679
677 .field-sm {
680 .field-sm {
678 input,
681 input,
679 textarea {
682 textarea {
680 padding: 5px;
683 padding: 5px;
681 }
684 }
682 }
685 }
683
686
684 textarea {
687 textarea {
685 display: block;
688 display: block;
686 clear: both;
689 clear: both;
687 width: 100%;
690 width: 100%;
688 min-height: 100px;
691 min-height: 100px;
689 margin-bottom: @padding;
692 margin-bottom: @padding;
690 .box-sizing(border-box);
693 .box-sizing(border-box);
691 overflow: auto;
694 overflow: auto;
692 }
695 }
693
696
694 label {
697 label {
695 font-family: @text-light;
698 font-family: @text-light;
696 }
699 }
697
700
698 // GRAVATARS
701 // GRAVATARS
699 // centers gravatar on username to the right
702 // centers gravatar on username to the right
700
703
701 .gravatar {
704 .gravatar {
702 display: inline;
705 display: inline;
703 min-width: 16px;
706 min-width: 16px;
704 min-height: 16px;
707 min-height: 16px;
705 margin: -5px 0;
708 margin: -5px 0;
706 padding: 0;
709 padding: 0;
707 line-height: 1em;
710 line-height: 1em;
708 border: 1px solid @grey4;
711 border: 1px solid @grey4;
709 box-sizing: content-box;
712 box-sizing: content-box;
710
713
711 &.gravatar-large {
714 &.gravatar-large {
712 margin: -0.5em .25em -0.5em 0;
715 margin: -0.5em .25em -0.5em 0;
713 }
716 }
714
717
715 & + .user {
718 & + .user {
716 display: inline;
719 display: inline;
717 margin: 0;
720 margin: 0;
718 padding: 0 0 0 .17em;
721 padding: 0 0 0 .17em;
719 line-height: 1em;
722 line-height: 1em;
720 }
723 }
721 }
724 }
722
725
723 .user-inline-data {
726 .user-inline-data {
724 display: inline-block;
727 display: inline-block;
725 float: left;
728 float: left;
726 padding-left: .5em;
729 padding-left: .5em;
727 line-height: 1.3em;
730 line-height: 1.3em;
728 }
731 }
729
732
730 .rc-user { // gravatar + user wrapper
733 .rc-user { // gravatar + user wrapper
731 float: left;
734 float: left;
732 position: relative;
735 position: relative;
733 min-width: 100px;
736 min-width: 100px;
734 max-width: 200px;
737 max-width: 200px;
735 min-height: (@gravatar-size + @border-thickness * 2); // account for border
738 min-height: (@gravatar-size + @border-thickness * 2); // account for border
736 display: block;
739 display: block;
737 padding: 0 0 0 (@gravatar-size + @basefontsize/2 + @border-thickness * 2);
740 padding: 0 0 0 (@gravatar-size + @basefontsize/2 + @border-thickness * 2);
738
741
739
742
740 .gravatar {
743 .gravatar {
741 display: block;
744 display: block;
742 position: absolute;
745 position: absolute;
743 top: 0;
746 top: 0;
744 left: 0;
747 left: 0;
745 min-width: @gravatar-size;
748 min-width: @gravatar-size;
746 min-height: @gravatar-size;
749 min-height: @gravatar-size;
747 margin: 0;
750 margin: 0;
748 }
751 }
749
752
750 .user {
753 .user {
751 display: block;
754 display: block;
752 max-width: 175px;
755 max-width: 175px;
753 padding-top: 2px;
756 padding-top: 2px;
754 overflow: hidden;
757 overflow: hidden;
755 text-overflow: ellipsis;
758 text-overflow: ellipsis;
756 }
759 }
757 }
760 }
758
761
759 .gist-gravatar,
762 .gist-gravatar,
760 .journal_container {
763 .journal_container {
761 .gravatar-large {
764 .gravatar-large {
762 margin: 0 .5em -10px 0;
765 margin: 0 .5em -10px 0;
763 }
766 }
764 }
767 }
765
768
766
769
767 // ADMIN SETTINGS
770 // ADMIN SETTINGS
768
771
769 // Tag Patterns
772 // Tag Patterns
770 .tag_patterns {
773 .tag_patterns {
771 .tag_input {
774 .tag_input {
772 margin-bottom: @padding;
775 margin-bottom: @padding;
773 }
776 }
774 }
777 }
775
778
776 .locked_input {
779 .locked_input {
777 position: relative;
780 position: relative;
778
781
779 input {
782 input {
780 display: inline;
783 display: inline;
781 margin: 3px 5px 0px 0px;
784 margin: 3px 5px 0px 0px;
782 }
785 }
783
786
784 br {
787 br {
785 display: none;
788 display: none;
786 }
789 }
787
790
788 .error-message {
791 .error-message {
789 float: left;
792 float: left;
790 width: 100%;
793 width: 100%;
791 }
794 }
792
795
793 .lock_input_button {
796 .lock_input_button {
794 display: inline;
797 display: inline;
795 }
798 }
796
799
797 .help-block {
800 .help-block {
798 clear: both;
801 clear: both;
799 }
802 }
800 }
803 }
801
804
802 // Notifications
805 // Notifications
803
806
804 .notifications_buttons {
807 .notifications_buttons {
805 margin: 0 0 @space 0;
808 margin: 0 0 @space 0;
806 padding: 0;
809 padding: 0;
807
810
808 .btn {
811 .btn {
809 display: inline-block;
812 display: inline-block;
810 }
813 }
811 }
814 }
812
815
813 .notification-list {
816 .notification-list {
814
817
815 div {
818 div {
816 display: inline-block;
819 display: inline-block;
817 vertical-align: middle;
820 vertical-align: middle;
818 }
821 }
819
822
820 .container {
823 .container {
821 display: block;
824 display: block;
822 margin: 0 0 @padding 0;
825 margin: 0 0 @padding 0;
823 }
826 }
824
827
825 .delete-notifications {
828 .delete-notifications {
826 margin-left: @padding;
829 margin-left: @padding;
827 text-align: right;
830 text-align: right;
828 cursor: pointer;
831 cursor: pointer;
829 }
832 }
830
833
831 .read-notifications {
834 .read-notifications {
832 margin-left: @padding/2;
835 margin-left: @padding/2;
833 text-align: right;
836 text-align: right;
834 width: 35px;
837 width: 35px;
835 cursor: pointer;
838 cursor: pointer;
836 }
839 }
837
840
838 .icon-minus-sign {
841 .icon-minus-sign {
839 color: @alert2;
842 color: @alert2;
840 }
843 }
841
844
842 .icon-ok-sign {
845 .icon-ok-sign {
843 color: @alert1;
846 color: @alert1;
844 }
847 }
845 }
848 }
846
849
847 .user_settings {
850 .user_settings {
848 float: left;
851 float: left;
849 clear: both;
852 clear: both;
850 display: block;
853 display: block;
851 width: 100%;
854 width: 100%;
852
855
853 .gravatar_box {
856 .gravatar_box {
854 margin-bottom: @padding;
857 margin-bottom: @padding;
855
858
856 &:after {
859 &:after {
857 content: " ";
860 content: " ";
858 clear: both;
861 clear: both;
859 width: 100%;
862 width: 100%;
860 }
863 }
861 }
864 }
862
865
863 .fields .field {
866 .fields .field {
864 clear: both;
867 clear: both;
865 }
868 }
866 }
869 }
867
870
868 .advanced_settings {
871 .advanced_settings {
869 margin-bottom: @space;
872 margin-bottom: @space;
870
873
871 .help-block {
874 .help-block {
872 margin-left: 0;
875 margin-left: 0;
873 }
876 }
874
877
875 button + .help-block {
878 button + .help-block {
876 margin-top: @padding;
879 margin-top: @padding;
877 }
880 }
878 }
881 }
879
882
880 // admin settings radio buttons and labels
883 // admin settings radio buttons and labels
881 .label-2 {
884 .label-2 {
882 float: left;
885 float: left;
883 width: @label2-width;
886 width: @label2-width;
884
887
885 label {
888 label {
886 color: @grey1;
889 color: @grey1;
887 }
890 }
888 }
891 }
889 .checkboxes {
892 .checkboxes {
890 float: left;
893 float: left;
891 width: @checkboxes-width;
894 width: @checkboxes-width;
892 margin-bottom: @padding;
895 margin-bottom: @padding;
893
896
894 .checkbox {
897 .checkbox {
895 width: 100%;
898 width: 100%;
896
899
897 label {
900 label {
898 margin: 0;
901 margin: 0;
899 padding: 0;
902 padding: 0;
900 }
903 }
901 }
904 }
902
905
903 .checkbox + .checkbox {
906 .checkbox + .checkbox {
904 display: inline-block;
907 display: inline-block;
905 }
908 }
906
909
907 label {
910 label {
908 margin-right: 1em;
911 margin-right: 1em;
909 }
912 }
910 }
913 }
911
914
912 // CHANGELOG
915 // CHANGELOG
913 .container_header {
916 .container_header {
914 float: left;
917 float: left;
915 display: block;
918 display: block;
916 width: 100%;
919 width: 100%;
917 margin: @padding 0 @padding;
920 margin: @padding 0 @padding;
918
921
919 #filter_changelog {
922 #filter_changelog {
920 float: left;
923 float: left;
921 margin-right: @padding;
924 margin-right: @padding;
922 }
925 }
923
926
924 .breadcrumbs_light {
927 .breadcrumbs_light {
925 display: inline-block;
928 display: inline-block;
926 }
929 }
927 }
930 }
928
931
929 .info_box {
932 .info_box {
930 float: right;
933 float: right;
931 }
934 }
932
935
933
936
934 #graph_nodes {
937 #graph_nodes {
935 padding-top: 43px;
938 padding-top: 43px;
936 }
939 }
937
940
938 #graph_content{
941 #graph_content{
939
942
940 // adjust for table headers so that graph renders properly
943 // adjust for table headers so that graph renders properly
941 // #graph_nodes padding - table cell padding
944 // #graph_nodes padding - table cell padding
942 padding-top: (@space - (@basefontsize * 2.4));
945 padding-top: (@space - (@basefontsize * 2.4));
943
946
944 &.graph_full_width {
947 &.graph_full_width {
945 width: 100%;
948 width: 100%;
946 max-width: 100%;
949 max-width: 100%;
947 }
950 }
948 }
951 }
949
952
950 #graph {
953 #graph {
951 .flag_status {
954 .flag_status {
952 margin: 0;
955 margin: 0;
953 }
956 }
954
957
955 .pagination-left {
958 .pagination-left {
956 float: left;
959 float: left;
957 clear: both;
960 clear: both;
958 }
961 }
959
962
960 .log-container {
963 .log-container {
961 max-width: 345px;
964 max-width: 345px;
962
965
963 .message{
966 .message{
964 max-width: 340px;
967 max-width: 340px;
965 }
968 }
966 }
969 }
967
970
968 .graph-col-wrapper {
971 .graph-col-wrapper {
969 padding-left: 110px;
972 padding-left: 110px;
970
973
971 #graph_nodes {
974 #graph_nodes {
972 width: 100px;
975 width: 100px;
973 margin-left: -110px;
976 margin-left: -110px;
974 float: left;
977 float: left;
975 clear: left;
978 clear: left;
976 }
979 }
977 }
980 }
978
981
979 .load-more-commits {
982 .load-more-commits {
980 text-align: center;
983 text-align: center;
981 }
984 }
982 .load-more-commits:hover {
985 .load-more-commits:hover {
983 background-color: @grey7;
986 background-color: @grey7;
984 }
987 }
985 .load-more-commits {
988 .load-more-commits {
986 a {
989 a {
987 display: block;
990 display: block;
988 }
991 }
989 }
992 }
990 }
993 }
991
994
992 #filter_changelog {
995 #filter_changelog {
993 float: left;
996 float: left;
994 }
997 }
995
998
996
999
997 //--- THEME ------------------//
1000 //--- THEME ------------------//
998
1001
999 #logo {
1002 #logo {
1000 float: left;
1003 float: left;
1001 margin: 9px 0 0 0;
1004 margin: 9px 0 0 0;
1002
1005
1003 .header {
1006 .header {
1004 background-color: transparent;
1007 background-color: transparent;
1005 }
1008 }
1006
1009
1007 a {
1010 a {
1008 display: inline-block;
1011 display: inline-block;
1009 }
1012 }
1010
1013
1011 img {
1014 img {
1012 height:30px;
1015 height:30px;
1013 }
1016 }
1014 }
1017 }
1015
1018
1016 .logo-wrapper {
1019 .logo-wrapper {
1017 float:left;
1020 float:left;
1018 }
1021 }
1019
1022
1020 .branding{
1023 .branding{
1021 float: left;
1024 float: left;
1022 padding: 9px 2px;
1025 padding: 9px 2px;
1023 line-height: 1em;
1026 line-height: 1em;
1024 font-size: @navigation-fontsize;
1027 font-size: @navigation-fontsize;
1025 }
1028 }
1026
1029
1027 img {
1030 img {
1028 border: none;
1031 border: none;
1029 outline: none;
1032 outline: none;
1030 }
1033 }
1031 user-profile-header
1034 user-profile-header
1032 label {
1035 label {
1033
1036
1034 input[type="checkbox"] {
1037 input[type="checkbox"] {
1035 margin-right: 1em;
1038 margin-right: 1em;
1036 }
1039 }
1037 input[type="radio"] {
1040 input[type="radio"] {
1038 margin-right: 1em;
1041 margin-right: 1em;
1039 }
1042 }
1040 }
1043 }
1041
1044
1042 .flag_status {
1045 .flag_status {
1043 margin: 2px 8px 6px 2px;
1046 margin: 2px 8px 6px 2px;
1044 &.under_review {
1047 &.under_review {
1045 .circle(5px, @alert3);
1048 .circle(5px, @alert3);
1046 }
1049 }
1047 &.approved {
1050 &.approved {
1048 .circle(5px, @alert1);
1051 .circle(5px, @alert1);
1049 }
1052 }
1050 &.rejected,
1053 &.rejected,
1051 &.forced_closed{
1054 &.forced_closed{
1052 .circle(5px, @alert2);
1055 .circle(5px, @alert2);
1053 }
1056 }
1054 &.not_reviewed {
1057 &.not_reviewed {
1055 .circle(5px, @grey5);
1058 .circle(5px, @grey5);
1056 }
1059 }
1057 }
1060 }
1058
1061
1059 .flag_status_comment_box {
1062 .flag_status_comment_box {
1060 margin: 5px 6px 0px 2px;
1063 margin: 5px 6px 0px 2px;
1061 }
1064 }
1062 .test_pattern_preview {
1065 .test_pattern_preview {
1063 margin: @space 0;
1066 margin: @space 0;
1064
1067
1065 p {
1068 p {
1066 margin-bottom: 0;
1069 margin-bottom: 0;
1067 border-bottom: @border-thickness solid @border-default-color;
1070 border-bottom: @border-thickness solid @border-default-color;
1068 color: @grey3;
1071 color: @grey3;
1069 }
1072 }
1070
1073
1071 .btn {
1074 .btn {
1072 margin-bottom: @padding;
1075 margin-bottom: @padding;
1073 }
1076 }
1074 }
1077 }
1075 #test_pattern_result {
1078 #test_pattern_result {
1076 display: none;
1079 display: none;
1077 &:extend(pre);
1080 &:extend(pre);
1078 padding: .9em;
1081 padding: .9em;
1079 color: @grey3;
1082 color: @grey3;
1080 background-color: @grey7;
1083 background-color: @grey7;
1081 border-right: @border-thickness solid @border-default-color;
1084 border-right: @border-thickness solid @border-default-color;
1082 border-bottom: @border-thickness solid @border-default-color;
1085 border-bottom: @border-thickness solid @border-default-color;
1083 border-left: @border-thickness solid @border-default-color;
1086 border-left: @border-thickness solid @border-default-color;
1084 }
1087 }
1085
1088
1086 #repo_vcs_settings {
1089 #repo_vcs_settings {
1087 #inherit_overlay_vcs_default {
1090 #inherit_overlay_vcs_default {
1088 display: none;
1091 display: none;
1089 }
1092 }
1090 #inherit_overlay_vcs_custom {
1093 #inherit_overlay_vcs_custom {
1091 display: custom;
1094 display: custom;
1092 }
1095 }
1093 &.inherited {
1096 &.inherited {
1094 #inherit_overlay_vcs_default {
1097 #inherit_overlay_vcs_default {
1095 display: block;
1098 display: block;
1096 }
1099 }
1097 #inherit_overlay_vcs_custom {
1100 #inherit_overlay_vcs_custom {
1098 display: none;
1101 display: none;
1099 }
1102 }
1100 }
1103 }
1101 }
1104 }
1102
1105
1103 .issue-tracker-link {
1106 .issue-tracker-link {
1104 color: @rcblue;
1107 color: @rcblue;
1105 }
1108 }
1106
1109
1107 // Issue Tracker Table Show/Hide
1110 // Issue Tracker Table Show/Hide
1108 #repo_issue_tracker {
1111 #repo_issue_tracker {
1109 #inherit_overlay {
1112 #inherit_overlay {
1110 display: none;
1113 display: none;
1111 }
1114 }
1112 #custom_overlay {
1115 #custom_overlay {
1113 display: custom;
1116 display: custom;
1114 }
1117 }
1115 &.inherited {
1118 &.inherited {
1116 #inherit_overlay {
1119 #inherit_overlay {
1117 display: block;
1120 display: block;
1118 }
1121 }
1119 #custom_overlay {
1122 #custom_overlay {
1120 display: none;
1123 display: none;
1121 }
1124 }
1122 }
1125 }
1123 }
1126 }
1124 table.issuetracker {
1127 table.issuetracker {
1125 &.readonly {
1128 &.readonly {
1126 tr, td {
1129 tr, td {
1127 color: @grey3;
1130 color: @grey3;
1128 }
1131 }
1129 }
1132 }
1130 .edit {
1133 .edit {
1131 display: none;
1134 display: none;
1132 }
1135 }
1133 .editopen {
1136 .editopen {
1134 .edit {
1137 .edit {
1135 display: inline;
1138 display: inline;
1136 }
1139 }
1137 .entry {
1140 .entry {
1138 display: none;
1141 display: none;
1139 }
1142 }
1140 }
1143 }
1141 tr td.td-action {
1144 tr td.td-action {
1142 min-width: 117px;
1145 min-width: 117px;
1143 }
1146 }
1144 td input {
1147 td input {
1145 max-width: none;
1148 max-width: none;
1146 min-width: 30px;
1149 min-width: 30px;
1147 width: 80%;
1150 width: 80%;
1148 }
1151 }
1149 .issuetracker_pref input {
1152 .issuetracker_pref input {
1150 width: 40%;
1153 width: 40%;
1151 }
1154 }
1152 input.edit_issuetracker_update {
1155 input.edit_issuetracker_update {
1153 margin-right: 0;
1156 margin-right: 0;
1154 width: auto;
1157 width: auto;
1155 }
1158 }
1156 }
1159 }
1157
1160
1158 table.integrations {
1161 table.integrations {
1159 .td-icon {
1162 .td-icon {
1160 width: 20px;
1163 width: 20px;
1161 .integration-icon {
1164 .integration-icon {
1162 height: 20px;
1165 height: 20px;
1163 width: 20px;
1166 width: 20px;
1164 }
1167 }
1165 }
1168 }
1166 }
1169 }
1167
1170
1168 .integrations {
1171 .integrations {
1169 a.integration-box {
1172 a.integration-box {
1170 color: @text-color;
1173 color: @text-color;
1171 &:hover {
1174 &:hover {
1172 .panel {
1175 .panel {
1173 background: #fbfbfb;
1176 background: #fbfbfb;
1174 }
1177 }
1175 }
1178 }
1176 .integration-icon {
1179 .integration-icon {
1177 width: 30px;
1180 width: 30px;
1178 height: 30px;
1181 height: 30px;
1179 margin-right: 20px;
1182 margin-right: 20px;
1180 float: left;
1183 float: left;
1181 }
1184 }
1182
1185
1183 .panel-body {
1186 .panel-body {
1184 padding: 10px;
1187 padding: 10px;
1185 }
1188 }
1186 .panel {
1189 .panel {
1187 margin-bottom: 10px;
1190 margin-bottom: 10px;
1188 }
1191 }
1189 h2 {
1192 h2 {
1190 display: inline-block;
1193 display: inline-block;
1191 margin: 0;
1194 margin: 0;
1192 min-width: 140px;
1195 min-width: 140px;
1193 }
1196 }
1194 }
1197 }
1195 }
1198 }
1196
1199
1197 //Permissions Settings
1200 //Permissions Settings
1198 #add_perm {
1201 #add_perm {
1199 margin: 0 0 @padding;
1202 margin: 0 0 @padding;
1200 cursor: pointer;
1203 cursor: pointer;
1201 }
1204 }
1202
1205
1203 .perm_ac {
1206 .perm_ac {
1204 input {
1207 input {
1205 width: 95%;
1208 width: 95%;
1206 }
1209 }
1207 }
1210 }
1208
1211
1209 .autocomplete-suggestions {
1212 .autocomplete-suggestions {
1210 width: auto !important; // overrides autocomplete.js
1213 width: auto !important; // overrides autocomplete.js
1211 margin: 0;
1214 margin: 0;
1212 border: @border-thickness solid @rcblue;
1215 border: @border-thickness solid @rcblue;
1213 border-radius: @border-radius;
1216 border-radius: @border-radius;
1214 color: @rcblue;
1217 color: @rcblue;
1215 background-color: white;
1218 background-color: white;
1216 }
1219 }
1217 .autocomplete-selected {
1220 .autocomplete-selected {
1218 background: #F0F0F0;
1221 background: #F0F0F0;
1219 }
1222 }
1220 .ac-container-wrap {
1223 .ac-container-wrap {
1221 margin: 0;
1224 margin: 0;
1222 padding: 8px;
1225 padding: 8px;
1223 border-bottom: @border-thickness solid @rclightblue;
1226 border-bottom: @border-thickness solid @rclightblue;
1224 list-style-type: none;
1227 list-style-type: none;
1225 cursor: pointer;
1228 cursor: pointer;
1226
1229
1227 &:hover {
1230 &:hover {
1228 background-color: @rclightblue;
1231 background-color: @rclightblue;
1229 }
1232 }
1230
1233
1231 img {
1234 img {
1232 height: @gravatar-size;
1235 height: @gravatar-size;
1233 width: @gravatar-size;
1236 width: @gravatar-size;
1234 margin-right: 1em;
1237 margin-right: 1em;
1235 }
1238 }
1236
1239
1237 strong {
1240 strong {
1238 font-weight: normal;
1241 font-weight: normal;
1239 }
1242 }
1240 }
1243 }
1241
1244
1242 // Settings Dropdown
1245 // Settings Dropdown
1243 .user-menu .container {
1246 .user-menu .container {
1244 padding: 0 4px;
1247 padding: 0 4px;
1245 margin: 0;
1248 margin: 0;
1246 }
1249 }
1247
1250
1248 .user-menu .gravatar {
1251 .user-menu .gravatar {
1249 cursor: pointer;
1252 cursor: pointer;
1250 }
1253 }
1251
1254
1252 .codeblock {
1255 .codeblock {
1253 margin-bottom: @padding;
1256 margin-bottom: @padding;
1254 clear: both;
1257 clear: both;
1255
1258
1256 .stats{
1259 .stats{
1257 overflow: hidden;
1260 overflow: hidden;
1258 }
1261 }
1259
1262
1260 .message{
1263 .message{
1261 textarea{
1264 textarea{
1262 margin: 0;
1265 margin: 0;
1263 }
1266 }
1264 }
1267 }
1265
1268
1266 .code-header {
1269 .code-header {
1267 .stats {
1270 .stats {
1268 line-height: 2em;
1271 line-height: 2em;
1269
1272
1270 .revision_id {
1273 .revision_id {
1271 margin-left: 0;
1274 margin-left: 0;
1272 }
1275 }
1273 .buttons {
1276 .buttons {
1274 padding-right: 0;
1277 padding-right: 0;
1275 }
1278 }
1276 }
1279 }
1277
1280
1278 .item{
1281 .item{
1279 margin-right: 0.5em;
1282 margin-right: 0.5em;
1280 }
1283 }
1281 }
1284 }
1282
1285
1283 #editor_container{
1286 #editor_container{
1284 position: relative;
1287 position: relative;
1285 margin: @padding;
1288 margin: @padding;
1286 }
1289 }
1287 }
1290 }
1288
1291
1289 #file_history_container {
1292 #file_history_container {
1290 display: none;
1293 display: none;
1291 }
1294 }
1292
1295
1293 .file-history-inner {
1296 .file-history-inner {
1294 margin-bottom: 10px;
1297 margin-bottom: 10px;
1295 }
1298 }
1296
1299
1297 // Pull Requests
1300 // Pull Requests
1298 .summary-details {
1301 .summary-details {
1299 width: 72%;
1302 width: 72%;
1300 }
1303 }
1301 .pr-summary {
1304 .pr-summary {
1302 border-bottom: @border-thickness solid @grey5;
1305 border-bottom: @border-thickness solid @grey5;
1303 margin-bottom: @space;
1306 margin-bottom: @space;
1304 }
1307 }
1305 .reviewers-title {
1308 .reviewers-title {
1306 width: 25%;
1309 width: 25%;
1307 min-width: 200px;
1310 min-width: 200px;
1308 }
1311 }
1309 .reviewers {
1312 .reviewers {
1310 width: 25%;
1313 width: 25%;
1311 min-width: 200px;
1314 min-width: 200px;
1312 }
1315 }
1313 .reviewers ul li {
1316 .reviewers ul li {
1314 position: relative;
1317 position: relative;
1315 width: 100%;
1318 width: 100%;
1316 margin-bottom: 8px;
1319 margin-bottom: 8px;
1317 }
1320 }
1318
1321
1319 .reviewer_entry {
1322 .reviewer_entry {
1320 min-height: 55px;
1323 min-height: 55px;
1321 }
1324 }
1322
1325
1323 .reviewers_member {
1326 .reviewers_member {
1324 width: 100%;
1327 width: 100%;
1325 overflow: auto;
1328 overflow: auto;
1326 }
1329 }
1327 .reviewer_reason {
1330 .reviewer_reason {
1328 padding-left: 20px;
1331 padding-left: 20px;
1329 }
1332 }
1330 .reviewer_status {
1333 .reviewer_status {
1331 display: inline-block;
1334 display: inline-block;
1332 vertical-align: top;
1335 vertical-align: top;
1333 width: 7%;
1336 width: 7%;
1334 min-width: 20px;
1337 min-width: 20px;
1335 height: 1.2em;
1338 height: 1.2em;
1336 margin-top: 3px;
1339 margin-top: 3px;
1337 line-height: 1em;
1340 line-height: 1em;
1338 }
1341 }
1339
1342
1340 .reviewer_name {
1343 .reviewer_name {
1341 display: inline-block;
1344 display: inline-block;
1342 max-width: 83%;
1345 max-width: 83%;
1343 padding-right: 20px;
1346 padding-right: 20px;
1344 vertical-align: middle;
1347 vertical-align: middle;
1345 line-height: 1;
1348 line-height: 1;
1346
1349
1347 .rc-user {
1350 .rc-user {
1348 min-width: 0;
1351 min-width: 0;
1349 margin: -2px 1em 0 0;
1352 margin: -2px 1em 0 0;
1350 }
1353 }
1351
1354
1352 .reviewer {
1355 .reviewer {
1353 float: left;
1356 float: left;
1354 }
1357 }
1355 }
1358 }
1356
1359
1357 .reviewer_member_mandatory,
1360 .reviewer_member_mandatory,
1358 .reviewer_member_mandatory_remove,
1361 .reviewer_member_mandatory_remove,
1359 .reviewer_member_remove {
1362 .reviewer_member_remove {
1360 position: absolute;
1363 position: absolute;
1361 right: 0;
1364 right: 0;
1362 top: 0;
1365 top: 0;
1363 width: 16px;
1366 width: 16px;
1364 margin-bottom: 10px;
1367 margin-bottom: 10px;
1365 padding: 0;
1368 padding: 0;
1366 color: black;
1369 color: black;
1367 }
1370 }
1368
1371
1369 .reviewer_member_mandatory_remove {
1372 .reviewer_member_mandatory_remove {
1370 color: @grey4;
1373 color: @grey4;
1371 }
1374 }
1372
1375
1373 .reviewer_member_mandatory {
1376 .reviewer_member_mandatory {
1374 padding-top:20px;
1377 padding-top:20px;
1375 }
1378 }
1376
1379
1377 .reviewer_member_status {
1380 .reviewer_member_status {
1378 margin-top: 5px;
1381 margin-top: 5px;
1379 }
1382 }
1380 .pr-summary #summary{
1383 .pr-summary #summary{
1381 width: 100%;
1384 width: 100%;
1382 }
1385 }
1383 .pr-summary .action_button:hover {
1386 .pr-summary .action_button:hover {
1384 border: 0;
1387 border: 0;
1385 cursor: pointer;
1388 cursor: pointer;
1386 }
1389 }
1387 .pr-details-title {
1390 .pr-details-title {
1388 padding-bottom: 8px;
1391 padding-bottom: 8px;
1389 border-bottom: @border-thickness solid @grey5;
1392 border-bottom: @border-thickness solid @grey5;
1390
1393
1391 .action_button.disabled {
1394 .action_button.disabled {
1392 color: @grey4;
1395 color: @grey4;
1393 cursor: inherit;
1396 cursor: inherit;
1394 }
1397 }
1395 .action_button {
1398 .action_button {
1396 color: @rcblue;
1399 color: @rcblue;
1397 }
1400 }
1398 }
1401 }
1399 .pr-details-content {
1402 .pr-details-content {
1400 margin-top: @textmargin;
1403 margin-top: @textmargin;
1401 margin-bottom: @textmargin;
1404 margin-bottom: @textmargin;
1402 }
1405 }
1403 .pr-description {
1406 .pr-description {
1404 white-space:pre-wrap;
1407 white-space:pre-wrap;
1405 }
1408 }
1406
1409
1407 .pr-reviewer-rules {
1410 .pr-reviewer-rules {
1408 padding: 10px 0px 20px 0px;
1411 padding: 10px 0px 20px 0px;
1409 }
1412 }
1410
1413
1411 .group_members {
1414 .group_members {
1412 margin-top: 0;
1415 margin-top: 0;
1413 padding: 0;
1416 padding: 0;
1414 list-style: outside none none;
1417 list-style: outside none none;
1415
1418
1416 img {
1419 img {
1417 height: @gravatar-size;
1420 height: @gravatar-size;
1418 width: @gravatar-size;
1421 width: @gravatar-size;
1419 margin-right: .5em;
1422 margin-right: .5em;
1420 margin-left: 3px;
1423 margin-left: 3px;
1421 }
1424 }
1422
1425
1423 .to-delete {
1426 .to-delete {
1424 .user {
1427 .user {
1425 text-decoration: line-through;
1428 text-decoration: line-through;
1426 }
1429 }
1427 }
1430 }
1428 }
1431 }
1429
1432
1430 .compare_view_commits_title {
1433 .compare_view_commits_title {
1431 .disabled {
1434 .disabled {
1432 cursor: inherit;
1435 cursor: inherit;
1433 &:hover{
1436 &:hover{
1434 background-color: inherit;
1437 background-color: inherit;
1435 color: inherit;
1438 color: inherit;
1436 }
1439 }
1437 }
1440 }
1438 }
1441 }
1439
1442
1440 .subtitle-compare {
1443 .subtitle-compare {
1441 margin: -15px 0px 0px 0px;
1444 margin: -15px 0px 0px 0px;
1442 }
1445 }
1443
1446
1444 .comments-summary-td {
1447 .comments-summary-td {
1445 border-top: 1px dashed @grey5;
1448 border-top: 1px dashed @grey5;
1446 }
1449 }
1447
1450
1448 // new entry in group_members
1451 // new entry in group_members
1449 .td-author-new-entry {
1452 .td-author-new-entry {
1450 background-color: rgba(red(@alert1), green(@alert1), blue(@alert1), 0.3);
1453 background-color: rgba(red(@alert1), green(@alert1), blue(@alert1), 0.3);
1451 }
1454 }
1452
1455
1453 .usergroup_member_remove {
1456 .usergroup_member_remove {
1454 width: 16px;
1457 width: 16px;
1455 margin-bottom: 10px;
1458 margin-bottom: 10px;
1456 padding: 0;
1459 padding: 0;
1457 color: black !important;
1460 color: black !important;
1458 cursor: pointer;
1461 cursor: pointer;
1459 }
1462 }
1460
1463
1461 .reviewer_ac .ac-input {
1464 .reviewer_ac .ac-input {
1462 width: 92%;
1465 width: 92%;
1463 margin-bottom: 1em;
1466 margin-bottom: 1em;
1464 }
1467 }
1465
1468
1466 .compare_view_commits tr{
1469 .compare_view_commits tr{
1467 height: 20px;
1470 height: 20px;
1468 }
1471 }
1469 .compare_view_commits td {
1472 .compare_view_commits td {
1470 vertical-align: top;
1473 vertical-align: top;
1471 padding-top: 10px;
1474 padding-top: 10px;
1472 }
1475 }
1473 .compare_view_commits .author {
1476 .compare_view_commits .author {
1474 margin-left: 5px;
1477 margin-left: 5px;
1475 }
1478 }
1476
1479
1477 .compare_view_commits {
1480 .compare_view_commits {
1478 .color-a {
1481 .color-a {
1479 color: @alert1;
1482 color: @alert1;
1480 }
1483 }
1481
1484
1482 .color-c {
1485 .color-c {
1483 color: @color3;
1486 color: @color3;
1484 }
1487 }
1485
1488
1486 .color-r {
1489 .color-r {
1487 color: @color5;
1490 color: @color5;
1488 }
1491 }
1489
1492
1490 .color-a-bg {
1493 .color-a-bg {
1491 background-color: @alert1;
1494 background-color: @alert1;
1492 }
1495 }
1493
1496
1494 .color-c-bg {
1497 .color-c-bg {
1495 background-color: @alert3;
1498 background-color: @alert3;
1496 }
1499 }
1497
1500
1498 .color-r-bg {
1501 .color-r-bg {
1499 background-color: @alert2;
1502 background-color: @alert2;
1500 }
1503 }
1501
1504
1502 .color-a-border {
1505 .color-a-border {
1503 border: 1px solid @alert1;
1506 border: 1px solid @alert1;
1504 }
1507 }
1505
1508
1506 .color-c-border {
1509 .color-c-border {
1507 border: 1px solid @alert3;
1510 border: 1px solid @alert3;
1508 }
1511 }
1509
1512
1510 .color-r-border {
1513 .color-r-border {
1511 border: 1px solid @alert2;
1514 border: 1px solid @alert2;
1512 }
1515 }
1513
1516
1514 .commit-change-indicator {
1517 .commit-change-indicator {
1515 width: 15px;
1518 width: 15px;
1516 height: 15px;
1519 height: 15px;
1517 position: relative;
1520 position: relative;
1518 left: 15px;
1521 left: 15px;
1519 }
1522 }
1520
1523
1521 .commit-change-content {
1524 .commit-change-content {
1522 text-align: center;
1525 text-align: center;
1523 vertical-align: middle;
1526 vertical-align: middle;
1524 line-height: 15px;
1527 line-height: 15px;
1525 }
1528 }
1526 }
1529 }
1527
1530
1528 .compare_view_files {
1531 .compare_view_files {
1529 width: 100%;
1532 width: 100%;
1530
1533
1531 td {
1534 td {
1532 vertical-align: middle;
1535 vertical-align: middle;
1533 }
1536 }
1534 }
1537 }
1535
1538
1536 .compare_view_filepath {
1539 .compare_view_filepath {
1537 color: @grey1;
1540 color: @grey1;
1538 }
1541 }
1539
1542
1540 .show_more {
1543 .show_more {
1541 display: inline-block;
1544 display: inline-block;
1542 position: relative;
1545 position: relative;
1543 vertical-align: middle;
1546 vertical-align: middle;
1544 width: 4px;
1547 width: 4px;
1545 height: @basefontsize;
1548 height: @basefontsize;
1546
1549
1547 &:after {
1550 &:after {
1548 content: "\00A0\25BE";
1551 content: "\00A0\25BE";
1549 display: inline-block;
1552 display: inline-block;
1550 width:10px;
1553 width:10px;
1551 line-height: 5px;
1554 line-height: 5px;
1552 font-size: 12px;
1555 font-size: 12px;
1553 cursor: pointer;
1556 cursor: pointer;
1554 }
1557 }
1555 }
1558 }
1556
1559
1557 .journal_more .show_more {
1560 .journal_more .show_more {
1558 display: inline;
1561 display: inline;
1559
1562
1560 &:after {
1563 &:after {
1561 content: none;
1564 content: none;
1562 }
1565 }
1563 }
1566 }
1564
1567
1565 .open .show_more:after,
1568 .open .show_more:after,
1566 .select2-dropdown-open .show_more:after {
1569 .select2-dropdown-open .show_more:after {
1567 .rotate(180deg);
1570 .rotate(180deg);
1568 margin-left: 4px;
1571 margin-left: 4px;
1569 }
1572 }
1570
1573
1571
1574
1572 .compare_view_commits .collapse_commit:after {
1575 .compare_view_commits .collapse_commit:after {
1573 cursor: pointer;
1576 cursor: pointer;
1574 content: "\00A0\25B4";
1577 content: "\00A0\25B4";
1575 margin-left: -3px;
1578 margin-left: -3px;
1576 font-size: 17px;
1579 font-size: 17px;
1577 color: @grey4;
1580 color: @grey4;
1578 }
1581 }
1579
1582
1580 .diff_links {
1583 .diff_links {
1581 margin-left: 8px;
1584 margin-left: 8px;
1582 }
1585 }
1583
1586
1584 div.ancestor {
1587 div.ancestor {
1585 margin: -30px 0px;
1588 margin: -30px 0px;
1586 }
1589 }
1587
1590
1588 .cs_icon_td input[type="checkbox"] {
1591 .cs_icon_td input[type="checkbox"] {
1589 display: none;
1592 display: none;
1590 }
1593 }
1591
1594
1592 .cs_icon_td .expand_file_icon:after {
1595 .cs_icon_td .expand_file_icon:after {
1593 cursor: pointer;
1596 cursor: pointer;
1594 content: "\00A0\25B6";
1597 content: "\00A0\25B6";
1595 font-size: 12px;
1598 font-size: 12px;
1596 color: @grey4;
1599 color: @grey4;
1597 }
1600 }
1598
1601
1599 .cs_icon_td .collapse_file_icon:after {
1602 .cs_icon_td .collapse_file_icon:after {
1600 cursor: pointer;
1603 cursor: pointer;
1601 content: "\00A0\25BC";
1604 content: "\00A0\25BC";
1602 font-size: 12px;
1605 font-size: 12px;
1603 color: @grey4;
1606 color: @grey4;
1604 }
1607 }
1605
1608
1606 /*new binary
1609 /*new binary
1607 NEW_FILENODE = 1
1610 NEW_FILENODE = 1
1608 DEL_FILENODE = 2
1611 DEL_FILENODE = 2
1609 MOD_FILENODE = 3
1612 MOD_FILENODE = 3
1610 RENAMED_FILENODE = 4
1613 RENAMED_FILENODE = 4
1611 COPIED_FILENODE = 5
1614 COPIED_FILENODE = 5
1612 CHMOD_FILENODE = 6
1615 CHMOD_FILENODE = 6
1613 BIN_FILENODE = 7
1616 BIN_FILENODE = 7
1614 */
1617 */
1615 .cs_files_expand {
1618 .cs_files_expand {
1616 font-size: @basefontsize + 5px;
1619 font-size: @basefontsize + 5px;
1617 line-height: 1.8em;
1620 line-height: 1.8em;
1618 float: right;
1621 float: right;
1619 }
1622 }
1620
1623
1621 .cs_files_expand span{
1624 .cs_files_expand span{
1622 color: @rcblue;
1625 color: @rcblue;
1623 cursor: pointer;
1626 cursor: pointer;
1624 }
1627 }
1625 .cs_files {
1628 .cs_files {
1626 clear: both;
1629 clear: both;
1627 padding-bottom: @padding;
1630 padding-bottom: @padding;
1628
1631
1629 .cur_cs {
1632 .cur_cs {
1630 margin: 10px 2px;
1633 margin: 10px 2px;
1631 font-weight: bold;
1634 font-weight: bold;
1632 }
1635 }
1633
1636
1634 .node {
1637 .node {
1635 float: left;
1638 float: left;
1636 }
1639 }
1637
1640
1638 .changes {
1641 .changes {
1639 float: right;
1642 float: right;
1640 color: white;
1643 color: white;
1641 font-size: @basefontsize - 4px;
1644 font-size: @basefontsize - 4px;
1642 margin-top: 4px;
1645 margin-top: 4px;
1643 opacity: 0.6;
1646 opacity: 0.6;
1644 filter: Alpha(opacity=60); /* IE8 and earlier */
1647 filter: Alpha(opacity=60); /* IE8 and earlier */
1645
1648
1646 .added {
1649 .added {
1647 background-color: @alert1;
1650 background-color: @alert1;
1648 float: left;
1651 float: left;
1649 text-align: center;
1652 text-align: center;
1650 }
1653 }
1651
1654
1652 .deleted {
1655 .deleted {
1653 background-color: @alert2;
1656 background-color: @alert2;
1654 float: left;
1657 float: left;
1655 text-align: center;
1658 text-align: center;
1656 }
1659 }
1657
1660
1658 .bin {
1661 .bin {
1659 background-color: @alert1;
1662 background-color: @alert1;
1660 text-align: center;
1663 text-align: center;
1661 }
1664 }
1662
1665
1663 /*new binary*/
1666 /*new binary*/
1664 .bin.bin1 {
1667 .bin.bin1 {
1665 background-color: @alert1;
1668 background-color: @alert1;
1666 text-align: center;
1669 text-align: center;
1667 }
1670 }
1668
1671
1669 /*deleted binary*/
1672 /*deleted binary*/
1670 .bin.bin2 {
1673 .bin.bin2 {
1671 background-color: @alert2;
1674 background-color: @alert2;
1672 text-align: center;
1675 text-align: center;
1673 }
1676 }
1674
1677
1675 /*mod binary*/
1678 /*mod binary*/
1676 .bin.bin3 {
1679 .bin.bin3 {
1677 background-color: @grey2;
1680 background-color: @grey2;
1678 text-align: center;
1681 text-align: center;
1679 }
1682 }
1680
1683
1681 /*rename file*/
1684 /*rename file*/
1682 .bin.bin4 {
1685 .bin.bin4 {
1683 background-color: @alert4;
1686 background-color: @alert4;
1684 text-align: center;
1687 text-align: center;
1685 }
1688 }
1686
1689
1687 /*copied file*/
1690 /*copied file*/
1688 .bin.bin5 {
1691 .bin.bin5 {
1689 background-color: @alert4;
1692 background-color: @alert4;
1690 text-align: center;
1693 text-align: center;
1691 }
1694 }
1692
1695
1693 /*chmod file*/
1696 /*chmod file*/
1694 .bin.bin6 {
1697 .bin.bin6 {
1695 background-color: @grey2;
1698 background-color: @grey2;
1696 text-align: center;
1699 text-align: center;
1697 }
1700 }
1698 }
1701 }
1699 }
1702 }
1700
1703
1701 .cs_files .cs_added, .cs_files .cs_A,
1704 .cs_files .cs_added, .cs_files .cs_A,
1702 .cs_files .cs_added, .cs_files .cs_M,
1705 .cs_files .cs_added, .cs_files .cs_M,
1703 .cs_files .cs_added, .cs_files .cs_D {
1706 .cs_files .cs_added, .cs_files .cs_D {
1704 height: 16px;
1707 height: 16px;
1705 padding-right: 10px;
1708 padding-right: 10px;
1706 margin-top: 7px;
1709 margin-top: 7px;
1707 text-align: left;
1710 text-align: left;
1708 }
1711 }
1709
1712
1710 .cs_icon_td {
1713 .cs_icon_td {
1711 min-width: 16px;
1714 min-width: 16px;
1712 width: 16px;
1715 width: 16px;
1713 }
1716 }
1714
1717
1715 .pull-request-merge {
1718 .pull-request-merge {
1716 border: 1px solid @grey5;
1719 border: 1px solid @grey5;
1717 padding: 10px 0px 20px;
1720 padding: 10px 0px 20px;
1718 margin-top: 10px;
1721 margin-top: 10px;
1719 margin-bottom: 20px;
1722 margin-bottom: 20px;
1720 }
1723 }
1721
1724
1722 .pull-request-merge ul {
1725 .pull-request-merge ul {
1723 padding: 0px 0px;
1726 padding: 0px 0px;
1724 }
1727 }
1725
1728
1726 .pull-request-merge li:before{
1729 .pull-request-merge li:before{
1727 content:none;
1730 content:none;
1728 }
1731 }
1729
1732
1730 .pull-request-merge .pull-request-wrap {
1733 .pull-request-merge .pull-request-wrap {
1731 height: auto;
1734 height: auto;
1732 padding: 0px 0px;
1735 padding: 0px 0px;
1733 text-align: right;
1736 text-align: right;
1734 }
1737 }
1735
1738
1736 .pull-request-merge span {
1739 .pull-request-merge span {
1737 margin-right: 5px;
1740 margin-right: 5px;
1738 }
1741 }
1739
1742
1740 .pull-request-merge-actions {
1743 .pull-request-merge-actions {
1741 height: 30px;
1744 height: 30px;
1742 padding: 0px 0px;
1745 padding: 0px 0px;
1743 }
1746 }
1744
1747
1745 .merge-status {
1748 .merge-status {
1746 margin-right: 5px;
1749 margin-right: 5px;
1747 }
1750 }
1748
1751
1749 .merge-message {
1752 .merge-message {
1750 font-size: 1.2em
1753 font-size: 1.2em
1751 }
1754 }
1752
1755
1753 .merge-message.success i,
1756 .merge-message.success i,
1754 .merge-icon.success i {
1757 .merge-icon.success i {
1755 color:@alert1;
1758 color:@alert1;
1756 }
1759 }
1757
1760
1758 .merge-message.warning i,
1761 .merge-message.warning i,
1759 .merge-icon.warning i {
1762 .merge-icon.warning i {
1760 color: @alert3;
1763 color: @alert3;
1761 }
1764 }
1762
1765
1763 .merge-message.error i,
1766 .merge-message.error i,
1764 .merge-icon.error i {
1767 .merge-icon.error i {
1765 color:@alert2;
1768 color:@alert2;
1766 }
1769 }
1767
1770
1768 .pr-versions {
1771 .pr-versions {
1769 font-size: 1.1em;
1772 font-size: 1.1em;
1770
1773
1771 table {
1774 table {
1772 padding: 0px 5px;
1775 padding: 0px 5px;
1773 }
1776 }
1774
1777
1775 td {
1778 td {
1776 line-height: 15px;
1779 line-height: 15px;
1777 }
1780 }
1778
1781
1779 .flag_status {
1782 .flag_status {
1780 margin: 0;
1783 margin: 0;
1781 }
1784 }
1782
1785
1783 .compare-radio-button {
1786 .compare-radio-button {
1784 position: relative;
1787 position: relative;
1785 top: -3px;
1788 top: -3px;
1786 }
1789 }
1787 }
1790 }
1788
1791
1789
1792
1790 #close_pull_request {
1793 #close_pull_request {
1791 margin-right: 0px;
1794 margin-right: 0px;
1792 }
1795 }
1793
1796
1794 .empty_data {
1797 .empty_data {
1795 color: @grey4;
1798 color: @grey4;
1796 }
1799 }
1797
1800
1798 #changeset_compare_view_content {
1801 #changeset_compare_view_content {
1799 margin-bottom: @space;
1802 margin-bottom: @space;
1800 clear: both;
1803 clear: both;
1801 width: 100%;
1804 width: 100%;
1802 box-sizing: border-box;
1805 box-sizing: border-box;
1803 .border-radius(@border-radius);
1806 .border-radius(@border-radius);
1804
1807
1805 .help-block {
1808 .help-block {
1806 margin: @padding 0;
1809 margin: @padding 0;
1807 color: @text-color;
1810 color: @text-color;
1811 &.pre-formatting {
1812 white-space: pre;
1813 }
1808 }
1814 }
1809
1815
1810 .empty_data {
1816 .empty_data {
1811 margin: @padding 0;
1817 margin: @padding 0;
1812 }
1818 }
1813
1819
1814 .alert {
1820 .alert {
1815 margin-bottom: @space;
1821 margin-bottom: @space;
1816 }
1822 }
1817 }
1823 }
1818
1824
1819 .table_disp {
1825 .table_disp {
1820 .status {
1826 .status {
1821 width: auto;
1827 width: auto;
1822
1828
1823 .flag_status {
1829 .flag_status {
1824 float: left;
1830 float: left;
1825 }
1831 }
1826 }
1832 }
1827 }
1833 }
1828
1834
1829 .status_box_menu {
1835 .status_box_menu {
1830 margin: 0;
1836 margin: 0;
1831 }
1837 }
1832
1838
1833 .notification-table{
1839 .notification-table{
1834 margin-bottom: @space;
1840 margin-bottom: @space;
1835 display: table;
1841 display: table;
1836 width: 100%;
1842 width: 100%;
1837
1843
1838 .container{
1844 .container{
1839 display: table-row;
1845 display: table-row;
1840
1846
1841 .notification-header{
1847 .notification-header{
1842 border-bottom: @border-thickness solid @border-default-color;
1848 border-bottom: @border-thickness solid @border-default-color;
1843 }
1849 }
1844
1850
1845 .notification-subject{
1851 .notification-subject{
1846 display: table-cell;
1852 display: table-cell;
1847 }
1853 }
1848 }
1854 }
1849 }
1855 }
1850
1856
1851 // Notifications
1857 // Notifications
1852 .notification-header{
1858 .notification-header{
1853 display: table;
1859 display: table;
1854 width: 100%;
1860 width: 100%;
1855 padding: floor(@basefontsize/2) 0;
1861 padding: floor(@basefontsize/2) 0;
1856 line-height: 1em;
1862 line-height: 1em;
1857
1863
1858 .desc, .delete-notifications, .read-notifications{
1864 .desc, .delete-notifications, .read-notifications{
1859 display: table-cell;
1865 display: table-cell;
1860 text-align: left;
1866 text-align: left;
1861 }
1867 }
1862
1868
1863 .desc{
1869 .desc{
1864 width: 1163px;
1870 width: 1163px;
1865 }
1871 }
1866
1872
1867 .delete-notifications, .read-notifications{
1873 .delete-notifications, .read-notifications{
1868 width: 35px;
1874 width: 35px;
1869 min-width: 35px; //fixes when only one button is displayed
1875 min-width: 35px; //fixes when only one button is displayed
1870 }
1876 }
1871 }
1877 }
1872
1878
1873 .notification-body {
1879 .notification-body {
1874 .markdown-block,
1880 .markdown-block,
1875 .rst-block {
1881 .rst-block {
1876 padding: @padding 0;
1882 padding: @padding 0;
1877 }
1883 }
1878
1884
1879 .notification-subject {
1885 .notification-subject {
1880 padding: @textmargin 0;
1886 padding: @textmargin 0;
1881 border-bottom: @border-thickness solid @border-default-color;
1887 border-bottom: @border-thickness solid @border-default-color;
1882 }
1888 }
1883 }
1889 }
1884
1890
1885
1891
1886 .notifications_buttons{
1892 .notifications_buttons{
1887 float: right;
1893 float: right;
1888 }
1894 }
1889
1895
1890 #notification-status{
1896 #notification-status{
1891 display: inline;
1897 display: inline;
1892 }
1898 }
1893
1899
1894 // Repositories
1900 // Repositories
1895
1901
1896 #summary.fields{
1902 #summary.fields{
1897 display: table;
1903 display: table;
1898
1904
1899 .field{
1905 .field{
1900 display: table-row;
1906 display: table-row;
1901
1907
1902 .label-summary{
1908 .label-summary{
1903 display: table-cell;
1909 display: table-cell;
1904 min-width: @label-summary-minwidth;
1910 min-width: @label-summary-minwidth;
1905 padding-top: @padding/2;
1911 padding-top: @padding/2;
1906 padding-bottom: @padding/2;
1912 padding-bottom: @padding/2;
1907 padding-right: @padding/2;
1913 padding-right: @padding/2;
1908 }
1914 }
1909
1915
1910 .input{
1916 .input{
1911 display: table-cell;
1917 display: table-cell;
1912 padding: @padding/2;
1918 padding: @padding/2;
1913
1919
1914 input{
1920 input{
1915 min-width: 29em;
1921 min-width: 29em;
1916 padding: @padding/4;
1922 padding: @padding/4;
1917 }
1923 }
1918 }
1924 }
1919 .statistics, .downloads{
1925 .statistics, .downloads{
1920 .disabled{
1926 .disabled{
1921 color: @grey4;
1927 color: @grey4;
1922 }
1928 }
1923 }
1929 }
1924 }
1930 }
1925 }
1931 }
1926
1932
1927 #summary{
1933 #summary{
1928 width: 70%;
1934 width: 70%;
1929 }
1935 }
1930
1936
1931
1937
1932 // Journal
1938 // Journal
1933 .journal.title {
1939 .journal.title {
1934 h5 {
1940 h5 {
1935 float: left;
1941 float: left;
1936 margin: 0;
1942 margin: 0;
1937 width: 70%;
1943 width: 70%;
1938 }
1944 }
1939
1945
1940 ul {
1946 ul {
1941 float: right;
1947 float: right;
1942 display: inline-block;
1948 display: inline-block;
1943 margin: 0;
1949 margin: 0;
1944 width: 30%;
1950 width: 30%;
1945 text-align: right;
1951 text-align: right;
1946
1952
1947 li {
1953 li {
1948 display: inline;
1954 display: inline;
1949 font-size: @journal-fontsize;
1955 font-size: @journal-fontsize;
1950 line-height: 1em;
1956 line-height: 1em;
1951
1957
1952 &:before { content: none; }
1958 &:before { content: none; }
1953 }
1959 }
1954 }
1960 }
1955 }
1961 }
1956
1962
1957 .filterexample {
1963 .filterexample {
1958 position: absolute;
1964 position: absolute;
1959 top: 95px;
1965 top: 95px;
1960 left: @contentpadding;
1966 left: @contentpadding;
1961 color: @rcblue;
1967 color: @rcblue;
1962 font-size: 11px;
1968 font-size: 11px;
1963 font-family: @text-regular;
1969 font-family: @text-regular;
1964 cursor: help;
1970 cursor: help;
1965
1971
1966 &:hover {
1972 &:hover {
1967 color: @rcdarkblue;
1973 color: @rcdarkblue;
1968 }
1974 }
1969
1975
1970 @media (max-width:768px) {
1976 @media (max-width:768px) {
1971 position: relative;
1977 position: relative;
1972 top: auto;
1978 top: auto;
1973 left: auto;
1979 left: auto;
1974 display: block;
1980 display: block;
1975 }
1981 }
1976 }
1982 }
1977
1983
1978
1984
1979 #journal{
1985 #journal{
1980 margin-bottom: @space;
1986 margin-bottom: @space;
1981
1987
1982 .journal_day{
1988 .journal_day{
1983 margin-bottom: @textmargin/2;
1989 margin-bottom: @textmargin/2;
1984 padding-bottom: @textmargin/2;
1990 padding-bottom: @textmargin/2;
1985 font-size: @journal-fontsize;
1991 font-size: @journal-fontsize;
1986 border-bottom: @border-thickness solid @border-default-color;
1992 border-bottom: @border-thickness solid @border-default-color;
1987 }
1993 }
1988
1994
1989 .journal_container{
1995 .journal_container{
1990 margin-bottom: @space;
1996 margin-bottom: @space;
1991
1997
1992 .journal_user{
1998 .journal_user{
1993 display: inline-block;
1999 display: inline-block;
1994 }
2000 }
1995 .journal_action_container{
2001 .journal_action_container{
1996 display: block;
2002 display: block;
1997 margin-top: @textmargin;
2003 margin-top: @textmargin;
1998
2004
1999 div{
2005 div{
2000 display: inline;
2006 display: inline;
2001 }
2007 }
2002
2008
2003 div.journal_action_params{
2009 div.journal_action_params{
2004 display: block;
2010 display: block;
2005 }
2011 }
2006
2012
2007 div.journal_repo:after{
2013 div.journal_repo:after{
2008 content: "\A";
2014 content: "\A";
2009 white-space: pre;
2015 white-space: pre;
2010 }
2016 }
2011
2017
2012 div.date{
2018 div.date{
2013 display: block;
2019 display: block;
2014 margin-bottom: @textmargin;
2020 margin-bottom: @textmargin;
2015 }
2021 }
2016 }
2022 }
2017 }
2023 }
2018 }
2024 }
2019
2025
2020 // Files
2026 // Files
2021 .edit-file-title {
2027 .edit-file-title {
2022 border-bottom: @border-thickness solid @border-default-color;
2028 border-bottom: @border-thickness solid @border-default-color;
2023
2029
2024 .breadcrumbs {
2030 .breadcrumbs {
2025 margin-bottom: 0;
2031 margin-bottom: 0;
2026 }
2032 }
2027 }
2033 }
2028
2034
2029 .edit-file-fieldset {
2035 .edit-file-fieldset {
2030 margin-top: @sidebarpadding;
2036 margin-top: @sidebarpadding;
2031
2037
2032 .fieldset {
2038 .fieldset {
2033 .left-label {
2039 .left-label {
2034 width: 13%;
2040 width: 13%;
2035 }
2041 }
2036 .right-content {
2042 .right-content {
2037 width: 87%;
2043 width: 87%;
2038 max-width: 100%;
2044 max-width: 100%;
2039 }
2045 }
2040 .filename-label {
2046 .filename-label {
2041 margin-top: 13px;
2047 margin-top: 13px;
2042 }
2048 }
2043 .commit-message-label {
2049 .commit-message-label {
2044 margin-top: 4px;
2050 margin-top: 4px;
2045 }
2051 }
2046 .file-upload-input {
2052 .file-upload-input {
2047 input {
2053 input {
2048 display: none;
2054 display: none;
2049 }
2055 }
2050 margin-top: 10px;
2056 margin-top: 10px;
2051 }
2057 }
2052 .file-upload-label {
2058 .file-upload-label {
2053 margin-top: 10px;
2059 margin-top: 10px;
2054 }
2060 }
2055 p {
2061 p {
2056 margin-top: 5px;
2062 margin-top: 5px;
2057 }
2063 }
2058
2064
2059 }
2065 }
2060 .custom-path-link {
2066 .custom-path-link {
2061 margin-left: 5px;
2067 margin-left: 5px;
2062 }
2068 }
2063 #commit {
2069 #commit {
2064 resize: vertical;
2070 resize: vertical;
2065 }
2071 }
2066 }
2072 }
2067
2073
2068 .delete-file-preview {
2074 .delete-file-preview {
2069 max-height: 250px;
2075 max-height: 250px;
2070 }
2076 }
2071
2077
2072 .new-file,
2078 .new-file,
2073 #filter_activate,
2079 #filter_activate,
2074 #filter_deactivate {
2080 #filter_deactivate {
2075 float: left;
2081 float: left;
2076 margin: 0 0 0 15px;
2082 margin: 0 0 0 15px;
2077 }
2083 }
2078
2084
2079 h3.files_location{
2085 h3.files_location{
2080 line-height: 2.4em;
2086 line-height: 2.4em;
2081 }
2087 }
2082
2088
2083 .browser-nav {
2089 .browser-nav {
2084 display: table;
2090 display: table;
2085 margin-bottom: @space;
2091 margin-bottom: @space;
2086
2092
2087
2093
2088 .info_box {
2094 .info_box {
2089 display: inline-table;
2095 display: inline-table;
2090 height: 2.5em;
2096 height: 2.5em;
2091
2097
2092 .browser-cur-rev, .info_box_elem {
2098 .browser-cur-rev, .info_box_elem {
2093 display: table-cell;
2099 display: table-cell;
2094 vertical-align: middle;
2100 vertical-align: middle;
2095 }
2101 }
2096
2102
2097 .info_box_elem {
2103 .info_box_elem {
2098 border-top: @border-thickness solid @rcblue;
2104 border-top: @border-thickness solid @rcblue;
2099 border-bottom: @border-thickness solid @rcblue;
2105 border-bottom: @border-thickness solid @rcblue;
2100
2106
2101 #at_rev, a {
2107 #at_rev, a {
2102 padding: 0.6em 0.9em;
2108 padding: 0.6em 0.9em;
2103 margin: 0;
2109 margin: 0;
2104 .box-shadow(none);
2110 .box-shadow(none);
2105 border: 0;
2111 border: 0;
2106 height: 12px;
2112 height: 12px;
2107 }
2113 }
2108
2114
2109 input#at_rev {
2115 input#at_rev {
2110 max-width: 50px;
2116 max-width: 50px;
2111 text-align: right;
2117 text-align: right;
2112 }
2118 }
2113
2119
2114 &.previous {
2120 &.previous {
2115 border: @border-thickness solid @rcblue;
2121 border: @border-thickness solid @rcblue;
2116 .disabled {
2122 .disabled {
2117 color: @grey4;
2123 color: @grey4;
2118 cursor: not-allowed;
2124 cursor: not-allowed;
2119 }
2125 }
2120 }
2126 }
2121
2127
2122 &.next {
2128 &.next {
2123 border: @border-thickness solid @rcblue;
2129 border: @border-thickness solid @rcblue;
2124 .disabled {
2130 .disabled {
2125 color: @grey4;
2131 color: @grey4;
2126 cursor: not-allowed;
2132 cursor: not-allowed;
2127 }
2133 }
2128 }
2134 }
2129 }
2135 }
2130
2136
2131 .browser-cur-rev {
2137 .browser-cur-rev {
2132
2138
2133 span{
2139 span{
2134 margin: 0;
2140 margin: 0;
2135 color: @rcblue;
2141 color: @rcblue;
2136 height: 12px;
2142 height: 12px;
2137 display: inline-block;
2143 display: inline-block;
2138 padding: 0.7em 1em ;
2144 padding: 0.7em 1em ;
2139 border: @border-thickness solid @rcblue;
2145 border: @border-thickness solid @rcblue;
2140 margin-right: @padding;
2146 margin-right: @padding;
2141 }
2147 }
2142 }
2148 }
2143 }
2149 }
2144
2150
2145 .search_activate {
2151 .search_activate {
2146 display: table-cell;
2152 display: table-cell;
2147 vertical-align: middle;
2153 vertical-align: middle;
2148
2154
2149 input, label{
2155 input, label{
2150 margin: 0;
2156 margin: 0;
2151 padding: 0;
2157 padding: 0;
2152 }
2158 }
2153
2159
2154 input{
2160 input{
2155 margin-left: @textmargin;
2161 margin-left: @textmargin;
2156 }
2162 }
2157
2163
2158 }
2164 }
2159 }
2165 }
2160
2166
2161 .browser-cur-rev{
2167 .browser-cur-rev{
2162 margin-bottom: @textmargin;
2168 margin-bottom: @textmargin;
2163 }
2169 }
2164
2170
2165 #node_filter_box_loading{
2171 #node_filter_box_loading{
2166 .info_text;
2172 .info_text;
2167 }
2173 }
2168
2174
2169 .browser-search {
2175 .browser-search {
2170 margin: -25px 0px 5px 0px;
2176 margin: -25px 0px 5px 0px;
2171 }
2177 }
2172
2178
2173 .node-filter {
2179 .node-filter {
2174 font-size: @repo-title-fontsize;
2180 font-size: @repo-title-fontsize;
2175 padding: 4px 0px 0px 0px;
2181 padding: 4px 0px 0px 0px;
2176
2182
2177 .node-filter-path {
2183 .node-filter-path {
2178 float: left;
2184 float: left;
2179 color: @grey4;
2185 color: @grey4;
2180 }
2186 }
2181 .node-filter-input {
2187 .node-filter-input {
2182 float: left;
2188 float: left;
2183 margin: -2px 0px 0px 2px;
2189 margin: -2px 0px 0px 2px;
2184 input {
2190 input {
2185 padding: 2px;
2191 padding: 2px;
2186 border: none;
2192 border: none;
2187 font-size: @repo-title-fontsize;
2193 font-size: @repo-title-fontsize;
2188 }
2194 }
2189 }
2195 }
2190 }
2196 }
2191
2197
2192
2198
2193 .browser-result{
2199 .browser-result{
2194 td a{
2200 td a{
2195 margin-left: 0.5em;
2201 margin-left: 0.5em;
2196 display: inline-block;
2202 display: inline-block;
2197
2203
2198 em{
2204 em{
2199 font-family: @text-bold;
2205 font-family: @text-bold;
2200 }
2206 }
2201 }
2207 }
2202 }
2208 }
2203
2209
2204 .browser-highlight{
2210 .browser-highlight{
2205 background-color: @grey5-alpha;
2211 background-color: @grey5-alpha;
2206 }
2212 }
2207
2213
2208
2214
2209 // Search
2215 // Search
2210
2216
2211 .search-form{
2217 .search-form{
2212 #q {
2218 #q {
2213 width: @search-form-width;
2219 width: @search-form-width;
2214 }
2220 }
2215 .fields{
2221 .fields{
2216 margin: 0 0 @space;
2222 margin: 0 0 @space;
2217 }
2223 }
2218
2224
2219 label{
2225 label{
2220 display: inline-block;
2226 display: inline-block;
2221 margin-right: @textmargin;
2227 margin-right: @textmargin;
2222 padding-top: 0.25em;
2228 padding-top: 0.25em;
2223 }
2229 }
2224
2230
2225
2231
2226 .results{
2232 .results{
2227 clear: both;
2233 clear: both;
2228 margin: 0 0 @padding;
2234 margin: 0 0 @padding;
2229 }
2235 }
2230 }
2236 }
2231
2237
2232 div.search-feedback-items {
2238 div.search-feedback-items {
2233 display: inline-block;
2239 display: inline-block;
2234 padding:0px 0px 0px 96px;
2240 padding:0px 0px 0px 96px;
2235 }
2241 }
2236
2242
2237 div.search-code-body {
2243 div.search-code-body {
2238 background-color: #ffffff; padding: 5px 0 5px 10px;
2244 background-color: #ffffff; padding: 5px 0 5px 10px;
2239 pre {
2245 pre {
2240 .match { background-color: #faffa6;}
2246 .match { background-color: #faffa6;}
2241 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
2247 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
2242 }
2248 }
2243 }
2249 }
2244
2250
2245 .expand_commit.search {
2251 .expand_commit.search {
2246 .show_more.open {
2252 .show_more.open {
2247 height: auto;
2253 height: auto;
2248 max-height: none;
2254 max-height: none;
2249 }
2255 }
2250 }
2256 }
2251
2257
2252 .search-results {
2258 .search-results {
2253
2259
2254 h2 {
2260 h2 {
2255 margin-bottom: 0;
2261 margin-bottom: 0;
2256 }
2262 }
2257 .codeblock {
2263 .codeblock {
2258 border: none;
2264 border: none;
2259 background: transparent;
2265 background: transparent;
2260 }
2266 }
2261
2267
2262 .codeblock-header {
2268 .codeblock-header {
2263 border: none;
2269 border: none;
2264 background: transparent;
2270 background: transparent;
2265 }
2271 }
2266
2272
2267 .code-body {
2273 .code-body {
2268 border: @border-thickness solid @border-default-color;
2274 border: @border-thickness solid @border-default-color;
2269 .border-radius(@border-radius);
2275 .border-radius(@border-radius);
2270 }
2276 }
2271
2277
2272 .td-commit {
2278 .td-commit {
2273 &:extend(pre);
2279 &:extend(pre);
2274 border-bottom: @border-thickness solid @border-default-color;
2280 border-bottom: @border-thickness solid @border-default-color;
2275 }
2281 }
2276
2282
2277 .message {
2283 .message {
2278 height: auto;
2284 height: auto;
2279 max-width: 350px;
2285 max-width: 350px;
2280 white-space: normal;
2286 white-space: normal;
2281 text-overflow: initial;
2287 text-overflow: initial;
2282 overflow: visible;
2288 overflow: visible;
2283
2289
2284 .match { background-color: #faffa6;}
2290 .match { background-color: #faffa6;}
2285 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2291 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2286 }
2292 }
2287
2293
2288 }
2294 }
2289
2295
2290 table.rctable td.td-search-results div {
2296 table.rctable td.td-search-results div {
2291 max-width: 100%;
2297 max-width: 100%;
2292 }
2298 }
2293
2299
2294 #tip-box, .tip-box{
2300 #tip-box, .tip-box{
2295 padding: @menupadding/2;
2301 padding: @menupadding/2;
2296 display: block;
2302 display: block;
2297 border: @border-thickness solid @border-highlight-color;
2303 border: @border-thickness solid @border-highlight-color;
2298 .border-radius(@border-radius);
2304 .border-radius(@border-radius);
2299 background-color: white;
2305 background-color: white;
2300 z-index: 99;
2306 z-index: 99;
2301 white-space: pre-wrap;
2307 white-space: pre-wrap;
2302 }
2308 }
2303
2309
2304 #linktt {
2310 #linktt {
2305 width: 79px;
2311 width: 79px;
2306 }
2312 }
2307
2313
2308 #help_kb .modal-content{
2314 #help_kb .modal-content{
2309 max-width: 750px;
2315 max-width: 750px;
2310 margin: 10% auto;
2316 margin: 10% auto;
2311
2317
2312 table{
2318 table{
2313 td,th{
2319 td,th{
2314 border-bottom: none;
2320 border-bottom: none;
2315 line-height: 2.5em;
2321 line-height: 2.5em;
2316 }
2322 }
2317 th{
2323 th{
2318 padding-bottom: @textmargin/2;
2324 padding-bottom: @textmargin/2;
2319 }
2325 }
2320 td.keys{
2326 td.keys{
2321 text-align: center;
2327 text-align: center;
2322 }
2328 }
2323 }
2329 }
2324
2330
2325 .block-left{
2331 .block-left{
2326 width: 45%;
2332 width: 45%;
2327 margin-right: 5%;
2333 margin-right: 5%;
2328 }
2334 }
2329 .modal-footer{
2335 .modal-footer{
2330 clear: both;
2336 clear: both;
2331 }
2337 }
2332 .key.tag{
2338 .key.tag{
2333 padding: 0.5em;
2339 padding: 0.5em;
2334 background-color: @rcblue;
2340 background-color: @rcblue;
2335 color: white;
2341 color: white;
2336 border-color: @rcblue;
2342 border-color: @rcblue;
2337 .box-shadow(none);
2343 .box-shadow(none);
2338 }
2344 }
2339 }
2345 }
2340
2346
2341
2347
2342
2348
2343 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2349 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2344
2350
2345 @import 'statistics-graph';
2351 @import 'statistics-graph';
2346 @import 'tables';
2352 @import 'tables';
2347 @import 'forms';
2353 @import 'forms';
2348 @import 'diff';
2354 @import 'diff';
2349 @import 'summary';
2355 @import 'summary';
2350 @import 'navigation';
2356 @import 'navigation';
2351
2357
2352 //--- SHOW/HIDE SECTIONS --//
2358 //--- SHOW/HIDE SECTIONS --//
2353
2359
2354 .btn-collapse {
2360 .btn-collapse {
2355 float: right;
2361 float: right;
2356 text-align: right;
2362 text-align: right;
2357 font-family: @text-light;
2363 font-family: @text-light;
2358 font-size: @basefontsize;
2364 font-size: @basefontsize;
2359 cursor: pointer;
2365 cursor: pointer;
2360 border: none;
2366 border: none;
2361 color: @rcblue;
2367 color: @rcblue;
2362 }
2368 }
2363
2369
2364 table.rctable,
2370 table.rctable,
2365 table.dataTable {
2371 table.dataTable {
2366 .btn-collapse {
2372 .btn-collapse {
2367 float: right;
2373 float: right;
2368 text-align: right;
2374 text-align: right;
2369 }
2375 }
2370 }
2376 }
2371
2377
2372
2378
2373 // TODO: johbo: Fix for IE10, this avoids that we see a border
2379 // TODO: johbo: Fix for IE10, this avoids that we see a border
2374 // and padding around checkboxes and radio boxes. Move to the right place,
2380 // and padding around checkboxes and radio boxes. Move to the right place,
2375 // or better: Remove this once we did the form refactoring.
2381 // or better: Remove this once we did the form refactoring.
2376 input[type=checkbox],
2382 input[type=checkbox],
2377 input[type=radio] {
2383 input[type=radio] {
2378 padding: 0;
2384 padding: 0;
2379 border: none;
2385 border: none;
2380 }
2386 }
2381
2387
2382 .toggle-ajax-spinner{
2388 .toggle-ajax-spinner{
2383 height: 16px;
2389 height: 16px;
2384 width: 16px;
2390 width: 16px;
2385 }
2391 }
@@ -1,542 +1,545 b''
1 //
1 //
2 // Typography
2 // Typography
3 // modified from Bootstrap
3 // modified from Bootstrap
4 // --------------------------------------------------
4 // --------------------------------------------------
5
5
6 // Base
6 // Base
7 body {
7 body {
8 font-size: @basefontsize;
8 font-size: @basefontsize;
9 font-family: @text-light;
9 font-family: @text-light;
10 letter-spacing: .02em;
10 letter-spacing: .02em;
11 color: @grey2;
11 color: @grey2;
12 }
12 }
13
13
14 #content, label{
14 #content, label{
15 font-size: @basefontsize;
15 font-size: @basefontsize;
16 }
16 }
17
17
18 label {
18 label {
19 color: @grey2;
19 color: @grey2;
20 }
20 }
21
21
22 ::selection { background: @rchighlightblue; }
22 ::selection { background: @rchighlightblue; }
23
23
24 // Headings
24 // Headings
25 // -------------------------
25 // -------------------------
26
26
27 h1, h2, h3, h4, h5, h6,
27 h1, h2, h3, h4, h5, h6,
28 .h1, .h2, .h3, .h4, .h5, .h6 {
28 .h1, .h2, .h3, .h4, .h5, .h6 {
29 margin: 0 0 @textmargin 0;
29 margin: 0 0 @textmargin 0;
30 padding: 0;
30 padding: 0;
31 line-height: 1.8em;
31 line-height: 1.8em;
32 color: @text-color;
32 color: @text-color;
33 a {
33 a {
34 color: @rcblue;
34 color: @rcblue;
35 }
35 }
36 }
36 }
37
37
38 h1, .h1 { font-size: 1.54em; font-family: @text-bold; }
38 h1, .h1 { font-size: 1.54em; font-family: @text-bold; }
39 h2, .h2 { font-size: 1.23em; font-family: @text-semibold; }
39 h2, .h2 { font-size: 1.23em; font-family: @text-semibold; }
40 h3, .h3 { font-size: 1.23em; font-family: @text-regular; }
40 h3, .h3 { font-size: 1.23em; font-family: @text-regular; }
41 h4, .h4 { font-size: 1em; font-family: @text-bold; }
41 h4, .h4 { font-size: 1em; font-family: @text-bold; }
42 h5, .h5 { font-size: 1em; font-family: @text-bold-italic; }
42 h5, .h5 { font-size: 1em; font-family: @text-bold-italic; }
43 h6, .h6 { font-size: 1em; font-family: @text-bold-italic; }
43 h6, .h6 { font-size: 1em; font-family: @text-bold-italic; }
44
44
45 // Breadcrumbs
45 // Breadcrumbs
46 .breadcrumbs {
46 .breadcrumbs {
47 &:extend(h1);
47 &:extend(h1);
48 margin: 0;
48 margin: 0;
49 }
49 }
50
50
51 .breadcrumbs_light {
51 .breadcrumbs_light {
52 float:left;
52 float:left;
53 font-size: 1.3em;
53 font-size: 1.3em;
54 line-height: 38px;
54 line-height: 38px;
55 }
55 }
56
56
57 // Body text
57 // Body text
58 // -------------------------
58 // -------------------------
59
59
60 p {
60 p {
61 margin: 0 0 @textmargin 0;
61 margin: 0 0 @textmargin 0;
62 padding: 0;
62 padding: 0;
63 line-height: 2em;
63 line-height: 2em;
64 }
64 }
65
65
66 .lead {
66 .lead {
67 margin-bottom: @textmargin;
67 margin-bottom: @textmargin;
68 font-weight: 300;
68 font-weight: 300;
69 line-height: 1.4;
69 line-height: 1.4;
70
70
71 @media (min-width: @screen-sm-min) {
71 @media (min-width: @screen-sm-min) {
72 font-size: (@basefontsize * 1.5);
72 font-size: (@basefontsize * 1.5);
73 }
73 }
74 }
74 }
75
75
76 a,
76 a,
77 .link {
77 .link {
78 color: @rcblue;
78 color: @rcblue;
79 text-decoration: none;
79 text-decoration: none;
80 outline: none;
80 outline: none;
81 cursor: pointer;
81 cursor: pointer;
82
82
83 &:focus {
83 &:focus {
84 outline: none;
84 outline: none;
85 }
85 }
86
86
87 &:hover {
87 &:hover {
88 color: @rcdarkblue;
88 color: @rcdarkblue;
89 }
89 }
90 }
90 }
91
91
92 img {
92 img {
93 border: none;
93 border: none;
94 outline: none;
94 outline: none;
95 }
95 }
96
96
97 strong {
97 strong {
98 font-family: @text-bold;
98 font-family: @text-bold;
99 }
99 }
100
100
101 em {
101 em {
102 font-family: @text-italic;
102 font-family: @text-italic;
103 }
103 }
104
104
105 strong em,
105 strong em,
106 em strong {
106 em strong {
107 font-family: @text-bold-italic;
107 font-family: @text-bold-italic;
108 }
108 }
109
109
110 //TODO: lisa: b and i are depreciated, but we are still using them in places.
110 //TODO: lisa: b and i are depreciated, but we are still using them in places.
111 // Should probably make some decision whether to keep or lose these.
111 // Should probably make some decision whether to keep or lose these.
112 b {
112 b {
113
113
114 }
114 }
115
115
116 i {
116 i {
117 font-style: normal;
117 font-style: normal;
118 }
118 }
119
119
120 label {
120 label {
121 color: @text-color;
121 color: @text-color;
122
122
123 input[type="checkbox"] {
123 input[type="checkbox"] {
124 margin-right: 1em;
124 margin-right: 1em;
125 }
125 }
126 input[type="radio"] {
126 input[type="radio"] {
127 margin-right: 1em;
127 margin-right: 1em;
128 }
128 }
129 }
129 }
130
130
131 code,
131 code,
132 .code {
132 .code {
133 font-size: .95em;
133 font-size: .95em;
134 font-family: "Lucida Console", Monaco, monospace;
134 font-family: "Lucida Console", Monaco, monospace;
135 color: @grey3;
135 color: @grey3;
136
136
137 a {
137 a {
138 color: lighten(@rcblue,10%)
138 color: lighten(@rcblue,10%)
139 }
139 }
140 }
140 }
141
141
142 pre {
142 pre {
143 margin: 0;
143 margin: 0;
144 padding: 0;
144 padding: 0;
145 border: 0;
145 border: 0;
146 outline: 0;
146 outline: 0;
147 font-size: @basefontsize*.95;
147 font-size: @basefontsize*.95;
148 line-height: 1.4em;
148 line-height: 1.4em;
149 font-family: "Lucida Console", Monaco, monospace;
149 font-family: "Lucida Console", Monaco, monospace;
150 color: @grey3;
150 color: @grey3;
151 }
151 }
152
152
153 // Emphasis & misc
153 // Emphasis & misc
154 // -------------------------
154 // -------------------------
155
155
156 small,
156 small,
157 .small {
157 .small {
158 font-size: 75%;
158 font-size: 75%;
159 font-weight: normal;
159 font-weight: normal;
160 line-height: 1em;
160 line-height: 1em;
161 }
161 }
162
162
163 mark,
163 mark,
164 .mark {
164 .mark {
165 background-color: @rclightblue;
165 background-color: @rclightblue;
166 padding: .2em;
166 padding: .2em;
167 }
167 }
168
168
169 // Alignment
169 // Alignment
170 .text-left { text-align: left; }
170 .text-left { text-align: left; }
171 .text-right { text-align: right; }
171 .text-right { text-align: right; }
172 .text-center { text-align: center; }
172 .text-center { text-align: center; }
173 .text-justify { text-align: justify; }
173 .text-justify { text-align: justify; }
174 .text-nowrap { white-space: nowrap; }
174 .text-nowrap { white-space: nowrap; }
175
175
176 // Transformation
176 // Transformation
177 .text-lowercase { text-transform: lowercase; }
177 .text-lowercase { text-transform: lowercase; }
178 .text-uppercase { text-transform: uppercase; }
178 .text-uppercase { text-transform: uppercase; }
179 .text-capitalize { text-transform: capitalize; }
179 .text-capitalize { text-transform: capitalize; }
180
180
181 // Contextual colors
181 // Contextual colors
182 .text-muted {
182 .text-muted {
183 color: @grey4;
183 color: @grey4;
184 }
184 }
185 .text-primary {
185 .text-primary {
186 color: @rcblue;
186 color: @rcblue;
187 }
187 }
188 .text-success {
188 .text-success {
189 color: @alert1;
189 color: @alert1;
190 }
190 }
191 .text-info {
191 .text-info {
192 color: @alert4;
192 color: @alert4;
193 }
193 }
194 .text-warning {
194 .text-warning {
195 color: @alert3;
195 color: @alert3;
196 }
196 }
197 .text-danger {
197 .text-danger {
198 color: @alert2;
198 color: @alert2;
199 }
199 }
200
200
201 // Contextual backgrounds
201 // Contextual backgrounds
202 .bg-primary {
202 .bg-primary {
203 background-color: white;
203 background-color: white;
204 }
204 }
205 .bg-success {
205 .bg-success {
206 background-color: @alert1;
206 background-color: @alert1;
207 }
207 }
208 .bg-info {
208 .bg-info {
209 background-color: @alert4;
209 background-color: @alert4;
210 }
210 }
211 .bg-warning {
211 .bg-warning {
212 background-color: @alert3;
212 background-color: @alert3;
213 }
213 }
214 .bg-danger {
214 .bg-danger {
215 background-color: @alert2;
215 background-color: @alert2;
216 }
216 }
217
217
218
218
219 // Page header
219 // Page header
220 // -------------------------
220 // -------------------------
221
221
222 .page-header {
222 .page-header {
223 margin: @pagepadding 0 @textmargin;
223 margin: @pagepadding 0 @textmargin;
224 border-bottom: @border-thickness solid @grey5;
224 border-bottom: @border-thickness solid @grey5;
225 }
225 }
226
226
227 .title {
227 .title {
228 clear: both;
228 clear: both;
229 float: left;
229 float: left;
230 width: 100%;
230 width: 100%;
231 margin: @pagepadding 0 @pagepadding;
231 margin: @pagepadding 0 @pagepadding;
232
232
233 .breadcrumbs{
233 .breadcrumbs{
234 float: left;
234 float: left;
235 clear: both;
235 clear: both;
236 width: 700px;
236 width: 700px;
237 margin: 0;
237 margin: 0;
238
238
239 .q_filter_box {
239 .q_filter_box {
240 margin-right: @padding;
240 margin-right: @padding;
241 }
241 }
242 }
242 }
243
243
244 h1 a {
244 h1 a {
245 color: @rcblue;
245 color: @rcblue;
246 }
246 }
247
247
248 input{
248 input{
249 margin-right: @padding;
249 margin-right: @padding;
250 }
250 }
251
251
252 h5, .h5 {
252 h5, .h5 {
253 color: @grey1;
253 color: @grey1;
254 margin-bottom: @space;
254 margin-bottom: @space;
255
255
256 span {
256 span {
257 display: inline-block;
257 display: inline-block;
258 }
258 }
259 }
259 }
260
260
261 p {
261 p {
262 margin-bottom: 0;
262 margin-bottom: 0;
263 }
263 }
264
264
265 .links {
265 .links {
266 float: right;
266 float: right;
267 display: inline;
267 display: inline;
268 margin: 0;
268 margin: 0;
269 padding-left: 0;
269 padding-left: 0;
270 list-style: none;
270 list-style: none;
271 text-align: right;
271 text-align: right;
272
272
273 li:before { content: none; }
273 li:before { content: none; }
274 li { float: right; }
274 li { float: right; }
275 a {
275 a {
276 display: inline-block;
276 display: inline-block;
277 margin-left: @textmargin/2;
277 margin-left: @textmargin/2;
278 }
278 }
279 }
279 }
280
280
281 .title-content {
281 .title-content {
282 float: left;
282 float: left;
283 margin: 0;
283 margin: 0;
284 padding: 0;
284 padding: 0;
285
285
286 & + .breadcrumbs {
286 & + .breadcrumbs {
287 margin-top: @padding;
287 margin-top: @padding;
288 }
288 }
289
289
290 & + .links {
290 & + .links {
291 margin-top: -@button-padding;
291 margin-top: -@button-padding;
292
292
293 & + .breadcrumbs {
293 & + .breadcrumbs {
294 margin-top: @padding;
294 margin-top: @padding;
295 }
295 }
296 }
296 }
297 }
297 }
298
298
299 .title-main {
299 .title-main {
300 font-size: @repo-title-fontsize;
300 font-size: @repo-title-fontsize;
301 }
301 }
302
302
303 .title-description {
303 .title-description {
304 margin-top: .5em;
304 margin-top: .5em;
305 }
305 }
306
306
307 .q_filter_box {
307 .q_filter_box {
308 width: 200px;
308 width: 200px;
309 }
309 }
310
310
311 }
311 }
312
312
313 #readme .title {
313 #readme .title {
314 text-transform: none;
314 text-transform: none;
315 }
315 }
316
316
317 // Lists
317 // Lists
318 // -------------------------
318 // -------------------------
319
319
320 // Unordered and Ordered lists
320 // Unordered and Ordered lists
321 ul,
321 ul,
322 ol {
322 ol {
323 margin-top: 0;
323 margin-top: 0;
324 margin-bottom: @textmargin;
324 margin-bottom: @textmargin;
325 ul,
325 ul,
326 ol {
326 ol {
327 margin-bottom: 0;
327 margin-bottom: 0;
328 }
328 }
329 }
329 }
330
330
331 li {
331 li {
332 line-height: 2em;
332 line-height: 2em;
333 }
333 }
334
334
335 ul li {
335 ul li {
336 position: relative;
336 position: relative;
337 display: block;
337 display: block;
338 list-style-type: none;
338 list-style-type: none;
339
339
340 &:before {
340 &:before {
341 content: "\2014\00A0";
341 content: "\2014\00A0";
342 position: absolute;
342 position: absolute;
343 top: 0;
343 top: 0;
344 left: -1.25em;
344 left: -1.25em;
345 }
345 }
346
346
347 p:first-child {
347 p:first-child {
348 display:inline;
348 display:inline;
349 }
349 }
350 }
350 }
351
351
352 // List options
352 // List options
353
353
354 // Unstyled keeps list items block level, just removes default browser padding and list-style
354 // Unstyled keeps list items block level, just removes default browser padding and list-style
355 .list-unstyled {
355 .list-unstyled {
356 padding-left: 0;
356 padding-left: 0;
357 list-style: none;
357 list-style: none;
358 li:before { content: none; }
358 li:before { content: none; }
359 }
359 }
360
360
361 // Inline turns list items into inline-block
361 // Inline turns list items into inline-block
362 .list-inline {
362 .list-inline {
363 .list-unstyled();
363 .list-unstyled();
364 margin-left: -5px;
364 margin-left: -5px;
365
365
366 > li {
366 > li {
367 display: inline-block;
367 display: inline-block;
368 padding-left: 5px;
368 padding-left: 5px;
369 padding-right: 5px;
369 padding-right: 5px;
370 }
370 }
371 }
371 }
372
372
373 // Description Lists
373 // Description Lists
374
374
375 dl {
375 dl {
376 margin-top: 0; // Remove browser default
376 margin-top: 0; // Remove browser default
377 margin-bottom: @textmargin;
377 margin-bottom: @textmargin;
378 }
378 }
379
379
380 dt,
380 dt,
381 dd {
381 dd {
382 line-height: 1.4em;
382 line-height: 1.4em;
383 }
383 }
384
384
385 dt {
385 dt {
386 margin: @textmargin 0 0 0;
386 margin: @textmargin 0 0 0;
387 font-family: @text-bold;
387 font-family: @text-bold;
388 }
388 }
389
389
390 dd {
390 dd {
391 margin-left: 0; // Undo browser default
391 margin-left: 0; // Undo browser default
392 }
392 }
393
393
394 // Horizontal description lists
394 // Horizontal description lists
395 // Defaults to being stacked without any of the below styles applied, until the
395 // Defaults to being stacked without any of the below styles applied, until the
396 // grid breakpoint is reached (default of ~768px).
396 // grid breakpoint is reached (default of ~768px).
397 // These are used in forms as well; see style guide.
397 // These are used in forms as well; see style guide.
398 // TODO: lisa: These should really not be used in forms.
398 // TODO: lisa: These should really not be used in forms.
399
399
400 .dl-horizontal {
400 .dl-horizontal {
401
401
402 overflow: hidden;
402 overflow: hidden;
403 margin-bottom: @space;
403 margin-bottom: @space;
404
404
405 dt, dd {
405 dt, dd {
406 float: left;
406 float: left;
407 margin: 5px 0 5px 0;
407 margin: 5px 0 5px 0;
408 }
408 }
409
409
410 dt {
410 dt {
411 clear: left;
411 clear: left;
412 width: @label-width - @form-vertical-margin;
412 width: @label-width - @form-vertical-margin;
413 }
413 }
414
414
415 dd {
415 dd {
416 &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
416 &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
417 margin-left: @form-vertical-margin;
417 margin-left: @form-vertical-margin;
418 max-width: @form-max-width - (@label-width - @form-vertical-margin) - @form-vertical-margin;
418 max-width: @form-max-width - (@label-width - @form-vertical-margin) - @form-vertical-margin;
419 }
419 }
420
420
421 pre {
421 pre {
422 margin: 0;
422 margin: 0;
423 }
423 }
424
424
425 &.settings {
425 &.settings {
426 dt {
426 dt {
427 text-align: left;
427 text-align: left;
428 }
428 }
429 }
429 }
430
430
431 @media (min-width: 768px) {
431 @media (min-width: 768px) {
432 dt {
432 dt {
433 float: left;
433 float: left;
434 width: 180px;
434 width: 180px;
435 clear: left;
435 clear: left;
436 text-align: right;
436 text-align: right;
437 }
437 }
438 dd {
438 dd {
439 margin-left: 20px;
439 margin-left: 20px;
440 }
440 }
441 }
441 }
442 }
442 }
443
443
444
444
445 // Misc
445 // Misc
446 // -------------------------
446 // -------------------------
447
447
448 // Abbreviations and acronyms
448 // Abbreviations and acronyms
449 abbr[title],
449 abbr[title],
450 abbr[data-original-title] {
450 abbr[data-original-title] {
451 cursor: help;
451 cursor: help;
452 border-bottom: @border-thickness dotted @grey4;
452 border-bottom: @border-thickness dotted @grey4;
453 }
453 }
454 .initialism {
454 .initialism {
455 font-size: 90%;
455 font-size: 90%;
456 text-transform: uppercase;
456 text-transform: uppercase;
457 }
457 }
458
458
459 // Blockquotes
459 // Blockquotes
460 blockquote {
460 blockquote {
461 padding: 1em 2em;
461 padding: 1em 2em;
462 margin: 0 0 2em;
462 margin: 0 0 2em;
463 font-size: @basefontsize;
463 font-size: @basefontsize;
464 border-left: 2px solid @grey6;
464 border-left: 2px solid @grey6;
465
465
466 p,
466 p,
467 ul,
467 ul,
468 ol {
468 ol {
469 &:last-child {
469 &:last-child {
470 margin-bottom: 0;
470 margin-bottom: 0;
471 }
471 }
472 }
472 }
473
473
474 footer,
474 footer,
475 small,
475 small,
476 .small {
476 .small {
477 display: block;
477 display: block;
478 font-size: 80%;
478 font-size: 80%;
479
479
480 &:before {
480 &:before {
481 content: '\2014 \00A0'; // em dash, nbsp
481 content: '\2014 \00A0'; // em dash, nbsp
482 }
482 }
483 }
483 }
484 }
484 }
485
485
486 // Opposite alignment of blockquote
486 // Opposite alignment of blockquote
487 //
487 //
488 .blockquote-reverse,
488 .blockquote-reverse,
489 blockquote.pull-right {
489 blockquote.pull-right {
490 padding-right: 15px;
490 padding-right: 15px;
491 padding-left: 0;
491 padding-left: 0;
492 border-right: 5px solid @grey6;
492 border-right: 5px solid @grey6;
493 border-left: 0;
493 border-left: 0;
494 text-align: right;
494 text-align: right;
495
495
496 // Account for citation
496 // Account for citation
497 footer,
497 footer,
498 small,
498 small,
499 .small {
499 .small {
500 &:before { content: ''; }
500 &:before { content: ''; }
501 &:after {
501 &:after {
502 content: '\00A0 \2014'; // nbsp, em dash
502 content: '\00A0 \2014'; // nbsp, em dash
503 }
503 }
504 }
504 }
505 }
505 }
506
506
507 // Addresses
507 // Addresses
508 address {
508 address {
509 margin-bottom: 2em;
509 margin-bottom: 2em;
510 font-style: normal;
510 font-style: normal;
511 line-height: 1.8em;
511 line-height: 1.8em;
512 }
512 }
513
513
514 .error-message {
514 .error-message {
515 display: block;
515 display: block;
516 margin: @padding/3 0;
516 margin: @padding/3 0;
517 color: @alert2;
517 color: @alert2;
518 }
518 }
519
519
520 .issue-tracker-link {
520 .issue-tracker-link {
521 color: @rcblue;
521 color: @rcblue;
522 }
522 }
523
523
524 .info_text{
524 .info_text{
525 font-size: @basefontsize;
525 font-size: @basefontsize;
526 color: @grey4;
526 color: @grey4;
527 font-family: @text-regular;
527 font-family: @text-regular;
528 }
528 }
529
529
530 // help block text
530 // help block text
531 .help-block {
531 .help-block {
532 display: block;
532 display: block;
533 margin: 0 0 @padding;
533 margin: 0 0 @padding;
534 color: @grey4;
534 color: @grey4;
535 font-family: @text-light;
535 font-family: @text-light;
536 &.pre-formatting {
537 white-space: pre;
538 }
536 }
539 }
537
540
538 .error-message {
541 .error-message {
539 display: block;
542 display: block;
540 margin: @padding/3 0;
543 margin: @padding/3 0;
541 color: @alert2;
544 color: @alert2;
542 }
545 }
@@ -1,158 +1,159 b''
1 <%namespace name="base" file="/base/base.mako"/>
1 <%namespace name="base" file="/base/base.mako"/>
2
2
3 <%
3 <%
4 elems = [
4 elems = [
5 (_('Created on'), h.format_date(c.user.created_on), '', ''),
5 (_('Created on'), h.format_date(c.user.created_on), '', ''),
6 (_('Source of Record'), c.user.extern_type, '', ''),
6 (_('Source of Record'), c.user.extern_type, '', ''),
7
7
8 (_('Last login'), c.user.last_login or '-', '', ''),
8 (_('Last login'), c.user.last_login or '-', '', ''),
9 (_('Last activity'), c.user.last_activity, '', ''),
9 (_('Last activity'), c.user.last_activity, '', ''),
10
10
11 (_('Repositories'), len(c.user.repositories), '', [x.repo_name for x in c.user.repositories]),
11 (_('Repositories'), len(c.user.repositories), '', [x.repo_name for x in c.user.repositories]),
12 (_('Repository groups'), len(c.user.repository_groups), '', [x.group_name for x in c.user.repository_groups]),
12 (_('Repository groups'), len(c.user.repository_groups), '', [x.group_name for x in c.user.repository_groups]),
13 (_('User groups'), len(c.user.user_groups), '', [x.users_group_name for x in c.user.user_groups]),
13 (_('User groups'), len(c.user.user_groups), '', [x.users_group_name for x in c.user.user_groups]),
14
14
15 (_('Reviewer of pull requests'), len(c.user.reviewer_pull_requests), '', ['Pull Request #{}'.format(x.pull_request.pull_request_id) for x in c.user.reviewer_pull_requests]),
15 (_('Member of User groups'), len(c.user.group_member), '', [x.users_group.users_group_name for x in c.user.group_member]),
16 (_('Member of User groups'), len(c.user.group_member), '', [x.users_group.users_group_name for x in c.user.group_member]),
16 (_('Force password change'), c.user.user_data.get('force_password_change', 'False'), '', ''),
17 (_('Force password change'), c.user.user_data.get('force_password_change', 'False'), '', ''),
17 ]
18 ]
18 %>
19 %>
19
20
20 <div class="panel panel-default">
21 <div class="panel panel-default">
21 <div class="panel-heading">
22 <div class="panel-heading">
22 <h3 class="panel-title">${_('User: %s') % c.user.username}</h3>
23 <h3 class="panel-title">${_('User: %s') % c.user.username}</h3>
23 </div>
24 </div>
24 <div class="panel-body">
25 <div class="panel-body">
25 ${base.dt_info_panel(elems)}
26 ${base.dt_info_panel(elems)}
26 </div>
27 </div>
27 </div>
28 </div>
28
29
29 <div class="panel panel-default">
30 <div class="panel panel-default">
30 <div class="panel-heading">
31 <div class="panel-heading">
31 <h3 class="panel-title">${_('Force Password Reset')}</h3>
32 <h3 class="panel-title">${_('Force Password Reset')}</h3>
32 </div>
33 </div>
33 <div class="panel-body">
34 <div class="panel-body">
34 ${h.secure_form(h.url('force_password_reset_user', user_id=c.user.user_id), method='post')}
35 ${h.secure_form(h.url('force_password_reset_user', user_id=c.user.user_id), method='post')}
35 <div class="field">
36 <div class="field">
36 <button class="btn btn-default" type="submit">
37 <button class="btn btn-default" type="submit">
37 <i class="icon-lock"></i>
38 <i class="icon-lock"></i>
38 %if c.user.user_data.get('force_password_change'):
39 %if c.user.user_data.get('force_password_change'):
39 ${_('Disable forced password reset')}
40 ${_('Disable forced password reset')}
40 %else:
41 %else:
41 ${_('Enable forced password reset')}
42 ${_('Enable forced password reset')}
42 %endif
43 %endif
43 </button>
44 </button>
44 </div>
45 </div>
45 <div class="field">
46 <div class="field">
46 <span class="help-block">
47 <span class="help-block">
47 ${_("When this is enabled user will have to change they password when they next use RhodeCode system. This will also forbid vcs operations until someone makes a password change in the web interface")}
48 ${_("When this is enabled user will have to change they password when they next use RhodeCode system. This will also forbid vcs operations until someone makes a password change in the web interface")}
48 </span>
49 </span>
49 </div>
50 </div>
50 ${h.end_form()}
51 ${h.end_form()}
51 </div>
52 </div>
52 </div>
53 </div>
53
54
54 <div class="panel panel-default">
55 <div class="panel panel-default">
55 <div class="panel-heading">
56 <div class="panel-heading">
56 <h3 class="panel-title">${_('Personal Repository Group')}</h3>
57 <h3 class="panel-title">${_('Personal Repository Group')}</h3>
57 </div>
58 </div>
58 <div class="panel-body">
59 <div class="panel-body">
59 ${h.secure_form(h.url('create_personal_repo_group', user_id=c.user.user_id), method='post')}
60 ${h.secure_form(h.url('create_personal_repo_group', user_id=c.user.user_id), method='post')}
60
61
61 %if c.personal_repo_group:
62 %if c.personal_repo_group:
62 <div class="panel-body-title-text">${_('Users personal repository group')} : ${h.link_to(c.personal_repo_group.group_name, h.route_path('repo_group_home', repo_group_name=c.personal_repo_group.group_name))}</div>
63 <div class="panel-body-title-text">${_('Users personal repository group')} : ${h.link_to(c.personal_repo_group.group_name, h.route_path('repo_group_home', repo_group_name=c.personal_repo_group.group_name))}</div>
63 %else:
64 %else:
64 <div class="panel-body-title-text">
65 <div class="panel-body-title-text">
65 ${_('This user currently does not have a personal repository group')}
66 ${_('This user currently does not have a personal repository group')}
66 <br/>
67 <br/>
67 ${_('New group will be created at: `/%(path)s`') % {'path': c.personal_repo_group_name}}
68 ${_('New group will be created at: `/%(path)s`') % {'path': c.personal_repo_group_name}}
68 </div>
69 </div>
69 %endif
70 %endif
70 <button class="btn btn-default" type="submit" ${'disabled="disabled"' if c.personal_repo_group else ''}>
71 <button class="btn btn-default" type="submit" ${'disabled="disabled"' if c.personal_repo_group else ''}>
71 <i class="icon-folder-close"></i>
72 <i class="icon-folder-close"></i>
72 ${_('Create personal repository group')}
73 ${_('Create personal repository group')}
73 </button>
74 </button>
74 ${h.end_form()}
75 ${h.end_form()}
75 </div>
76 </div>
76 </div>
77 </div>
77
78
78
79
79 <div class="panel panel-danger">
80 <div class="panel panel-danger">
80 <div class="panel-heading">
81 <div class="panel-heading">
81 <h3 class="panel-title">${_('Delete User')}</h3>
82 <h3 class="panel-title">${_('Delete User')}</h3>
82 </div>
83 </div>
83 <div class="panel-body">
84 <div class="panel-body">
84 ${h.secure_form(h.url('delete_user', user_id=c.user.user_id), method='delete')}
85 ${h.secure_form(h.url('delete_user', user_id=c.user.user_id), method='delete')}
85
86
86 <table class="display">
87 <table class="display">
87 <tr>
88 <tr>
88 <td>
89 <td>
89 ${ungettext('This user owns %s repository.', 'This user owns %s repositories.', len(c.user.repositories)) % len(c.user.repositories)}
90 ${ungettext('This user owns %s repository.', 'This user owns %s repositories.', len(c.user.repositories)) % len(c.user.repositories)}
90 </td>
91 </td>
91 <td>
92 <td>
92 %if len(c.user.repositories) > 0:
93 %if len(c.user.repositories) > 0:
93 <input type="radio" id="user_repos_1" name="user_repos" value="detach" checked="checked"/> <label for="user_repos_1">${_('Detach repositories')}</label>
94 <input type="radio" id="user_repos_1" name="user_repos" value="detach" checked="checked"/> <label for="user_repos_1">${_('Detach repositories')}</label>
94 %endif
95 %endif
95 </td>
96 </td>
96 <td>
97 <td>
97 %if len(c.user.repositories) > 0:
98 %if len(c.user.repositories) > 0:
98 <input type="radio" id="user_repos_2" name="user_repos" value="delete" /> <label for="user_repos_2">${_('Delete repositories')}</label>
99 <input type="radio" id="user_repos_2" name="user_repos" value="delete" /> <label for="user_repos_2">${_('Delete repositories')}</label>
99 %endif
100 %endif
100 </td>
101 </td>
101 </tr>
102 </tr>
102
103
103 <tr>
104 <tr>
104 <td>
105 <td>
105 ${ungettext('This user owns %s repository group.', 'This user owns %s repository groups.', len(c.user.repository_groups)) % len(c.user.repository_groups)}
106 ${ungettext('This user owns %s repository group.', 'This user owns %s repository groups.', len(c.user.repository_groups)) % len(c.user.repository_groups)}
106 </td>
107 </td>
107 <td>
108 <td>
108 %if len(c.user.repository_groups) > 0:
109 %if len(c.user.repository_groups) > 0:
109 <input type="radio" id="user_repo_groups_1" name="user_repo_groups" value="detach" checked="checked"/> <label for="user_repo_groups_1">${_('Detach repository groups')}</label>
110 <input type="radio" id="user_repo_groups_1" name="user_repo_groups" value="detach" checked="checked"/> <label for="user_repo_groups_1">${_('Detach repository groups')}</label>
110 %endif
111 %endif
111 </td>
112 </td>
112 <td>
113 <td>
113 %if len(c.user.repository_groups) > 0:
114 %if len(c.user.repository_groups) > 0:
114 <input type="radio" id="user_repo_groups_2" name="user_repo_groups" value="delete" /> <label for="user_repo_groups_2">${_('Delete repositories')}</label>
115 <input type="radio" id="user_repo_groups_2" name="user_repo_groups" value="delete" /> <label for="user_repo_groups_2">${_('Delete repositories')}</label>
115 %endif
116 %endif
116 </td>
117 </td>
117 </tr>
118 </tr>
118
119
119 <tr>
120 <tr>
120 <td>
121 <td>
121 ${ungettext('This user owns %s user group.', 'This user owns %s user groups.', len(c.user.user_groups)) % len(c.user.user_groups)}
122 ${ungettext('This user owns %s user group.', 'This user owns %s user groups.', len(c.user.user_groups)) % len(c.user.user_groups)}
122 </td>
123 </td>
123 <td>
124 <td>
124 %if len(c.user.user_groups) > 0:
125 %if len(c.user.user_groups) > 0:
125 <input type="radio" id="user_user_groups_1" name="user_user_groups" value="detach" checked="checked"/> <label for="user_user_groups_1">${_('Detach user groups')}</label>
126 <input type="radio" id="user_user_groups_1" name="user_user_groups" value="detach" checked="checked"/> <label for="user_user_groups_1">${_('Detach user groups')}</label>
126 %endif
127 %endif
127 </td>
128 </td>
128 <td>
129 <td>
129 %if len(c.user.user_groups) > 0:
130 %if len(c.user.user_groups) > 0:
130 <input type="radio" id="user_user_groups_2" name="user_user_groups" value="delete" /> <label for="user_user_groups_2">${_('Delete repositories')}</label>
131 <input type="radio" id="user_user_groups_2" name="user_user_groups" value="delete" /> <label for="user_user_groups_2">${_('Delete repositories')}</label>
131 %endif
132 %endif
132 </td>
133 </td>
133 </tr>
134 </tr>
134 </table>
135 </table>
135 <div style="margin: 0 0 20px 0" class="fake-space"></div>
136 <div style="margin: 0 0 20px 0" class="fake-space"></div>
136
137
137 <div class="field">
138 <div class="field">
138 <button class="btn btn-small btn-danger" type="submit"
139 <button class="btn btn-small btn-danger" type="submit"
139 onclick="return confirm('${_('Confirm to delete this user: %s') % c.user.username}');"
140 onclick="return confirm('${_('Confirm to delete this user: %s') % c.user.username}');"
140 ${"disabled" if not c.can_delete_user else ""}>
141 ${"disabled" if not c.can_delete_user else ""}>
141 ${_('Delete this user')}
142 ${_('Delete this user')}
142 </button>
143 </button>
143 </div>
144 </div>
144 % if c.can_delete_user_message:
145 % if c.can_delete_user_message:
145 <p class="help-block">${c.can_delete_user_message}</p>
146 <p class="help-block pre-formatting">${c.can_delete_user_message}</p>
146 % endif
147 % endif
147
148
148 <div class="field">
149 <div class="field">
149 <span class="help-block">
150 <span class="help-block">
150 %if len(c.user.repositories) > 0 or len(c.user.repository_groups) > 0 or len(c.user.user_groups) > 0:
151 %if len(c.user.repositories) > 0 or len(c.user.repository_groups) > 0 or len(c.user.user_groups) > 0:
151 <p class="help-block">${_("When selecting the detach option, the depending objects owned by this user will be assigned to the `%s` super admin in the system. The delete option will delete the user's repositories!") % (c.first_admin.full_name)}</p>
152 <p class="help-block">${_("When selecting the detach option, the depending objects owned by this user will be assigned to the `%s` super admin in the system. The delete option will delete the user's repositories!") % (c.first_admin.full_name)}</p>
152 %endif
153 %endif
153 </span>
154 </span>
154 </div>
155 </div>
155
156
156 ${h.end_form()}
157 ${h.end_form()}
157 </div>
158 </div>
158 </div>
159 </div>
General Comments 0
You need to be logged in to leave comments. Login now