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