##// END OF EJS Templates
Added gravatars into permissions view and permissions autocomplete
marcink -
r2142:a21eab6f beta
parent child Browse files
Show More
@@ -1,597 +1,598
1 1 .. _changelog:
2 2
3 3 =========
4 4 Changelog
5 5 =========
6 6
7 7
8 8 1.3.4 (**2012-XX-XX**)
9 9 ----------------------
10 10
11 11 :status: in-progress
12 12 :branch: beta
13 13
14 14 news
15 15 ++++
16 16
17 17 - Whoosh logging is now controlled by the .ini files logging setup
18 18 - added clone-url into edit form on /settings page
19 19 - added help text into repo add/edit forms
20 20 - created rcextensions module with additional mappings (ref #322) and
21 21 post push/pull/create repo hooks callbacks
22 22 - implemented #377 Users view for his own permissions on account page
23 23 - #399 added inheritance of permissions for users group on repos groups
24 24 - #401 repository group is automatically pre-selected when adding repos
25 25 inside a repository group
26 26 - added alternative HTTP 403 response when client failed to authenticate. Helps
27 27 solving issues with Mercurial and LDAP
28 28 - #402 removed group prefix from repository name when listing repositories
29 29 inside a group
30 - added gravatars into permission view and permissions autocomplete
30 31
31 32 fixes
32 33 +++++
33 34
34 35 - fixed #390 cache invalidation problems on repos inside group
35 36 - fixed #385 clone by ID url was loosing proxy prefix in URL
36 37 - fixed some unicode problems with waitress
37 38 - fixed issue with escaping < and > in changeset commits
38 39 - fixed error occurring during recursive group creation in API
39 40 create_repo function
40 41 - fixed #393 py2.5 fixes for routes url generator
41 42 - fixed #397 Private repository groups shows up before login
42 43 - fixed #396 fixed problems with revoking users in nested groups
43 44
44 45 1.3.3 (**2012-03-02**)
45 46 ----------------------
46 47
47 48 news
48 49 ++++
49 50
50 51
51 52 fixes
52 53 +++++
53 54
54 55 - fixed some python2.5 compatibility issues
55 56 - fixed issues with removed repos was accidentally added as groups, after
56 57 full rescan of paths
57 58 - fixes #376 Cannot edit user (using container auth)
58 59 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
59 60 configuration
60 61 - fixed initial sorting of repos inside repo group
61 62 - fixes issue when user tried to resubmit same permission into user/user_groups
62 63 - bumped beaker version that fixes #375 leap error bug
63 64 - fixed raw_changeset for git. It was generated with hg patch headers
64 65 - fixed vcs issue with last_changeset for filenodes
65 66 - fixed missing commit after hook delete
66 67 - fixed #372 issues with git operation detection that caused a security issue
67 68 for git repos
68 69
69 70 1.3.2 (**2012-02-28**)
70 71 ----------------------
71 72
72 73 news
73 74 ++++
74 75
75 76
76 77 fixes
77 78 +++++
78 79
79 80 - fixed git protocol issues with repos-groups
80 81 - fixed git remote repos validator that prevented from cloning remote git repos
81 82 - fixes #370 ending slashes fixes for repo and groups
82 83 - fixes #368 improved git-protocol detection to handle other clients
83 84 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
84 85 Moved To Root
85 86 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
86 87 - fixed #373 missing cascade drop on user_group_to_perm table
87 88
88 89 1.3.1 (**2012-02-27**)
89 90 ----------------------
90 91
91 92 news
92 93 ++++
93 94
94 95
95 96 fixes
96 97 +++++
97 98
98 99 - redirection loop occurs when remember-me wasn't checked during login
99 100 - fixes issues with git blob history generation
100 101 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
101 102
102 103 1.3.0 (**2012-02-26**)
103 104 ----------------------
104 105
105 106 news
106 107 ++++
107 108
108 109 - code review, inspired by github code-comments
109 110 - #215 rst and markdown README files support
110 111 - #252 Container-based and proxy pass-through authentication support
111 112 - #44 branch browser. Filtering of changelog by branches
112 113 - mercurial bookmarks support
113 114 - new hover top menu, optimized to add maximum size for important views
114 115 - configurable clone url template with possibility to specify protocol like
115 116 ssh:// or http:// and also manually alter other parts of clone_url.
116 117 - enabled largefiles extension by default
117 118 - optimized summary file pages and saved a lot of unused space in them
118 119 - #239 option to manually mark repository as fork
119 120 - #320 mapping of commit authors to RhodeCode users
120 121 - #304 hashes are displayed using monospace font
121 122 - diff configuration, toggle white lines and context lines
122 123 - #307 configurable diffs, whitespace toggle, increasing context lines
123 124 - sorting on branches, tags and bookmarks using YUI datatable
124 125 - improved file filter on files page
125 126 - implements #330 api method for listing nodes ar particular revision
126 127 - #73 added linking issues in commit messages to chosen issue tracker url
127 128 based on user defined regular expression
128 129 - added linking of changesets in commit messages
129 130 - new compact changelog with expandable commit messages
130 131 - firstname and lastname are optional in user creation
131 132 - #348 added post-create repository hook
132 133 - #212 global encoding settings is now configurable from .ini files
133 134 - #227 added repository groups permissions
134 135 - markdown gets codehilite extensions
135 136 - new API methods, delete_repositories, grante/revoke permissions for groups
136 137 and repos
137 138
138 139
139 140 fixes
140 141 +++++
141 142
142 143 - rewrote dbsession management for atomic operations, and better error handling
143 144 - fixed sorting of repo tables
144 145 - #326 escape of special html entities in diffs
145 146 - normalized user_name => username in api attributes
146 147 - fixes #298 ldap created users with mixed case emails created conflicts
147 148 on saving a form
148 149 - fixes issue when owner of a repo couldn't revoke permissions for users
149 150 and groups
150 151 - fixes #271 rare JSON serialization problem with statistics
151 152 - fixes #337 missing validation check for conflicting names of a group with a
152 153 repositories group
153 154 - #340 fixed session problem for mysql and celery tasks
154 155 - fixed #331 RhodeCode mangles repository names if the a repository group
155 156 contains the "full path" to the repositories
156 157 - #355 RhodeCode doesn't store encrypted LDAP passwords
157 158
158 159 1.2.5 (**2012-01-28**)
159 160 ----------------------
160 161
161 162 news
162 163 ++++
163 164
164 165 fixes
165 166 +++++
166 167
167 168 - #340 Celery complains about MySQL server gone away, added session cleanup
168 169 for celery tasks
169 170 - #341 "scanning for repositories in None" log message during Rescan was missing
170 171 a parameter
171 172 - fixed creating archives with subrepos. Some hooks were triggered during that
172 173 operation leading to crash.
173 174 - fixed missing email in account page.
174 175 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
175 176 forking on windows impossible
176 177
177 178 1.2.4 (**2012-01-19**)
178 179 ----------------------
179 180
180 181 news
181 182 ++++
182 183
183 184 - RhodeCode is bundled with mercurial series 2.0.X by default, with
184 185 full support to largefiles extension. Enabled by default in new installations
185 186 - #329 Ability to Add/Remove Groups to/from a Repository via AP
186 187 - added requires.txt file with requirements
187 188
188 189 fixes
189 190 +++++
190 191
191 192 - fixes db session issues with celery when emailing admins
192 193 - #331 RhodeCode mangles repository names if the a repository group
193 194 contains the "full path" to the repositories
194 195 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
195 196 - DB session cleanup after hg protocol operations, fixes issues with
196 197 `mysql has gone away` errors
197 198 - #333 doc fixes for get_repo api function
198 199 - #271 rare JSON serialization problem with statistics enabled
199 200 - #337 Fixes issues with validation of repository name conflicting with
200 201 a group name. A proper message is now displayed.
201 202 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
202 203 doesn't work
203 204 - #316 fixes issues with web description in hgrc files
204 205
205 206 1.2.3 (**2011-11-02**)
206 207 ----------------------
207 208
208 209 news
209 210 ++++
210 211
211 212 - added option to manage repos group for non admin users
212 213 - added following API methods for get_users, create_user, get_users_groups,
213 214 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
214 215 get_repo, create_repo, add_user_to_repo
215 216 - implements #237 added password confirmation for my account
216 217 and admin edit user.
217 218 - implements #291 email notification for global events are now sent to all
218 219 administrator users, and global config email.
219 220
220 221 fixes
221 222 +++++
222 223
223 224 - added option for passing auth method for smtp mailer
224 225 - #276 issue with adding a single user with id>10 to usergroups
225 226 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
226 227 - #288 fixes managing of repos in a group for non admin user
227 228
228 229 1.2.2 (**2011-10-17**)
229 230 ----------------------
230 231
231 232 news
232 233 ++++
233 234
234 235 - #226 repo groups are available by path instead of numerical id
235 236
236 237 fixes
237 238 +++++
238 239
239 240 - #259 Groups with the same name but with different parent group
240 241 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
241 242 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
242 243 - #265 ldap save fails sometimes on converting attributes to booleans,
243 244 added getter and setter into model that will prevent from this on db model level
244 245 - fixed problems with timestamps issues #251 and #213
245 246 - fixes #266 RhodeCode allows to create repo with the same name and in
246 247 the same parent as group
247 248 - fixes #245 Rescan of the repositories on Windows
248 249 - fixes #248 cannot edit repos inside a group on windows
249 250 - fixes #219 forking problems on windows
250 251
251 252 1.2.1 (**2011-10-08**)
252 253 ----------------------
253 254
254 255 news
255 256 ++++
256 257
257 258
258 259 fixes
259 260 +++++
260 261
261 262 - fixed problems with basic auth and push problems
262 263 - gui fixes
263 264 - fixed logger
264 265
265 266 1.2.0 (**2011-10-07**)
266 267 ----------------------
267 268
268 269 news
269 270 ++++
270 271
271 272 - implemented #47 repository groups
272 273 - implemented #89 Can setup google analytics code from settings menu
273 274 - implemented #91 added nicer looking archive urls with more download options
274 275 like tags, branches
275 276 - implemented #44 into file browsing, and added follow branch option
276 277 - implemented #84 downloads can be enabled/disabled for each repository
277 278 - anonymous repository can be cloned without having to pass default:default
278 279 into clone url
279 280 - fixed #90 whoosh indexer can index chooses repositories passed in command
280 281 line
281 282 - extended journal with day aggregates and paging
282 283 - implemented #107 source code lines highlight ranges
283 284 - implemented #93 customizable changelog on combined revision ranges -
284 285 equivalent of githubs compare view
285 286 - implemented #108 extended and more powerful LDAP configuration
286 287 - implemented #56 users groups
287 288 - major code rewrites optimized codes for speed and memory usage
288 289 - raw and diff downloads are now in git format
289 290 - setup command checks for write access to given path
290 291 - fixed many issues with international characters and unicode. It uses utf8
291 292 decode with replace to provide less errors even with non utf8 encoded strings
292 293 - #125 added API KEY access to feeds
293 294 - #109 Repository can be created from external Mercurial link (aka. remote
294 295 repository, and manually updated (via pull) from admin panel
295 296 - beta git support - push/pull server + basic view for git repos
296 297 - added followers page and forks page
297 298 - server side file creation (with binary file upload interface)
298 299 and edition with commits powered by codemirror
299 300 - #111 file browser file finder, quick lookup files on whole file tree
300 301 - added quick login sliding menu into main page
301 302 - changelog uses lazy loading of affected files details, in some scenarios
302 303 this can improve speed of changelog page dramatically especially for
303 304 larger repositories.
304 305 - implements #214 added support for downloading subrepos in download menu.
305 306 - Added basic API for direct operations on rhodecode via JSON
306 307 - Implemented advanced hook management
307 308
308 309 fixes
309 310 +++++
310 311
311 312 - fixed file browser bug, when switching into given form revision the url was
312 313 not changing
313 314 - fixed propagation to error controller on simplehg and simplegit middlewares
314 315 - fixed error when trying to make a download on empty repository
315 316 - fixed problem with '[' chars in commit messages in journal
316 317 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
317 318 - journal fork fixes
318 319 - removed issue with space inside renamed repository after deletion
319 320 - fixed strange issue on formencode imports
320 321 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
321 322 - #150 fixes for errors on repositories mapped in db but corrupted in
322 323 filesystem
323 324 - fixed problem with ascendant characters in realm #181
324 325 - fixed problem with sqlite file based database connection pool
325 326 - whoosh indexer and code stats share the same dynamic extensions map
326 327 - fixes #188 - relationship delete of repo_to_perm entry on user removal
327 328 - fixes issue #189 Trending source files shows "show more" when no more exist
328 329 - fixes issue #197 Relative paths for pidlocks
329 330 - fixes issue #198 password will require only 3 chars now for login form
330 331 - fixes issue #199 wrong redirection for non admin users after creating a repository
331 332 - fixes issues #202, bad db constraint made impossible to attach same group
332 333 more than one time. Affects only mysql/postgres
333 334 - fixes #218 os.kill patch for windows was missing sig param
334 335 - improved rendering of dag (they are not trimmed anymore when number of
335 336 heads exceeds 5)
336 337
337 338 1.1.8 (**2011-04-12**)
338 339 ----------------------
339 340
340 341 news
341 342 ++++
342 343
343 344 - improved windows support
344 345
345 346 fixes
346 347 +++++
347 348
348 349 - fixed #140 freeze of python dateutil library, since new version is python2.x
349 350 incompatible
350 351 - setup-app will check for write permission in given path
351 352 - cleaned up license info issue #149
352 353 - fixes for issues #137,#116 and problems with unicode and accented characters.
353 354 - fixes crashes on gravatar, when passed in email as unicode
354 355 - fixed tooltip flickering problems
355 356 - fixed came_from redirection on windows
356 357 - fixed logging modules, and sql formatters
357 358 - windows fixes for os.kill issue #133
358 359 - fixes path splitting for windows issues #148
359 360 - fixed issue #143 wrong import on migration to 1.1.X
360 361 - fixed problems with displaying binary files, thanks to Thomas Waldmann
361 362 - removed name from archive files since it's breaking ui for long repo names
362 363 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
363 364 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
364 365 Thomas Waldmann
365 366 - fixed issue #166 summary pager was skipping 10 revisions on second page
366 367
367 368
368 369 1.1.7 (**2011-03-23**)
369 370 ----------------------
370 371
371 372 news
372 373 ++++
373 374
374 375 fixes
375 376 +++++
376 377
377 378 - fixed (again) #136 installation support for FreeBSD
378 379
379 380
380 381 1.1.6 (**2011-03-21**)
381 382 ----------------------
382 383
383 384 news
384 385 ++++
385 386
386 387 fixes
387 388 +++++
388 389
389 390 - fixed #136 installation support for FreeBSD
390 391 - RhodeCode will check for python version during installation
391 392
392 393 1.1.5 (**2011-03-17**)
393 394 ----------------------
394 395
395 396 news
396 397 ++++
397 398
398 399 - basic windows support, by exchanging pybcrypt into sha256 for windows only
399 400 highly inspired by idea of mantis406
400 401
401 402 fixes
402 403 +++++
403 404
404 405 - fixed sorting by author in main page
405 406 - fixed crashes with diffs on binary files
406 407 - fixed #131 problem with boolean values for LDAP
407 408 - fixed #122 mysql problems thanks to striker69
408 409 - fixed problem with errors on calling raw/raw_files/annotate functions
409 410 with unknown revisions
410 411 - fixed returned rawfiles attachment names with international character
411 412 - cleaned out docs, big thanks to Jason Harris
412 413
413 414 1.1.4 (**2011-02-19**)
414 415 ----------------------
415 416
416 417 news
417 418 ++++
418 419
419 420 fixes
420 421 +++++
421 422
422 423 - fixed formencode import problem on settings page, that caused server crash
423 424 when that page was accessed as first after server start
424 425 - journal fixes
425 426 - fixed option to access repository just by entering http://server/<repo_name>
426 427
427 428 1.1.3 (**2011-02-16**)
428 429 ----------------------
429 430
430 431 news
431 432 ++++
432 433
433 434 - implemented #102 allowing the '.' character in username
434 435 - added option to access repository just by entering http://server/<repo_name>
435 436 - celery task ignores result for better performance
436 437
437 438 fixes
438 439 +++++
439 440
440 441 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
441 442 apollo13 and Johan Walles
442 443 - small fixes in journal
443 444 - fixed problems with getting setting for celery from .ini files
444 445 - registration, password reset and login boxes share the same title as main
445 446 application now
446 447 - fixed #113: to high permissions to fork repository
447 448 - fixed problem with '[' chars in commit messages in journal
448 449 - removed issue with space inside renamed repository after deletion
449 450 - db transaction fixes when filesystem repository creation failed
450 451 - fixed #106 relation issues on databases different than sqlite
451 452 - fixed static files paths links to use of url() method
452 453
453 454 1.1.2 (**2011-01-12**)
454 455 ----------------------
455 456
456 457 news
457 458 ++++
458 459
459 460
460 461 fixes
461 462 +++++
462 463
463 464 - fixes #98 protection against float division of percentage stats
464 465 - fixed graph bug
465 466 - forced webhelpers version since it was making troubles during installation
466 467
467 468 1.1.1 (**2011-01-06**)
468 469 ----------------------
469 470
470 471 news
471 472 ++++
472 473
473 474 - added force https option into ini files for easier https usage (no need to
474 475 set server headers with this options)
475 476 - small css updates
476 477
477 478 fixes
478 479 +++++
479 480
480 481 - fixed #96 redirect loop on files view on repositories without changesets
481 482 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
482 483 and server crashed with errors
483 484 - fixed large tooltips problems on main page
484 485 - fixed #92 whoosh indexer is more error proof
485 486
486 487 1.1.0 (**2010-12-18**)
487 488 ----------------------
488 489
489 490 news
490 491 ++++
491 492
492 493 - rewrite of internals for vcs >=0.1.10
493 494 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
494 495 with older clients
495 496 - anonymous access, authentication via ldap
496 497 - performance upgrade for cached repos list - each repository has its own
497 498 cache that's invalidated when needed.
498 499 - performance upgrades on repositories with large amount of commits (20K+)
499 500 - main page quick filter for filtering repositories
500 501 - user dashboards with ability to follow chosen repositories actions
501 502 - sends email to admin on new user registration
502 503 - added cache/statistics reset options into repository settings
503 504 - more detailed action logger (based on hooks) with pushed changesets lists
504 505 and options to disable those hooks from admin panel
505 506 - introduced new enhanced changelog for merges that shows more accurate results
506 507 - new improved and faster code stats (based on pygments lexers mapping tables,
507 508 showing up to 10 trending sources for each repository. Additionally stats
508 509 can be disabled in repository settings.
509 510 - gui optimizations, fixed application width to 1024px
510 511 - added cut off (for large files/changesets) limit into config files
511 512 - whoosh, celeryd, upgrade moved to paster command
512 513 - other than sqlite database backends can be used
513 514
514 515 fixes
515 516 +++++
516 517
517 518 - fixes #61 forked repo was showing only after cache expired
518 519 - fixes #76 no confirmation on user deletes
519 520 - fixes #66 Name field misspelled
520 521 - fixes #72 block user removal when he owns repositories
521 522 - fixes #69 added password confirmation fields
522 523 - fixes #87 RhodeCode crashes occasionally on updating repository owner
523 524 - fixes #82 broken annotations on files with more than 1 blank line at the end
524 525 - a lot of fixes and tweaks for file browser
525 526 - fixed detached session issues
526 527 - fixed when user had no repos he would see all repos listed in my account
527 528 - fixed ui() instance bug when global hgrc settings was loaded for server
528 529 instance and all hgrc options were merged with our db ui() object
529 530 - numerous small bugfixes
530 531
531 532 (special thanks for TkSoh for detailed feedback)
532 533
533 534
534 535 1.0.2 (**2010-11-12**)
535 536 ----------------------
536 537
537 538 news
538 539 ++++
539 540
540 541 - tested under python2.7
541 542 - bumped sqlalchemy and celery versions
542 543
543 544 fixes
544 545 +++++
545 546
546 547 - fixed #59 missing graph.js
547 548 - fixed repo_size crash when repository had broken symlinks
548 549 - fixed python2.5 crashes.
549 550
550 551
551 552 1.0.1 (**2010-11-10**)
552 553 ----------------------
553 554
554 555 news
555 556 ++++
556 557
557 558 - small css updated
558 559
559 560 fixes
560 561 +++++
561 562
562 563 - fixed #53 python2.5 incompatible enumerate calls
563 564 - fixed #52 disable mercurial extension for web
564 565 - fixed #51 deleting repositories don't delete it's dependent objects
565 566
566 567
567 568 1.0.0 (**2010-11-02**)
568 569 ----------------------
569 570
570 571 - security bugfix simplehg wasn't checking for permissions on commands
571 572 other than pull or push.
572 573 - fixed doubled messages after push or pull in admin journal
573 574 - templating and css corrections, fixed repo switcher on chrome, updated titles
574 575 - admin menu accessible from options menu on repository view
575 576 - permissions cached queries
576 577
577 578 1.0.0rc4 (**2010-10-12**)
578 579 --------------------------
579 580
580 581 - fixed python2.5 missing simplejson imports (thanks to Jens BΓ€ckman)
581 582 - removed cache_manager settings from sqlalchemy meta
582 583 - added sqlalchemy cache settings to ini files
583 584 - validated password length and added second try of failure on paster setup-app
584 585 - fixed setup database destroy prompt even when there was no db
585 586
586 587
587 588 1.0.0rc3 (**2010-10-11**)
588 589 -------------------------
589 590
590 591 - fixed i18n during installation.
591 592
592 593 1.0.0rc2 (**2010-10-11**)
593 594 -------------------------
594 595
595 596 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
596 597 occure. After vcs is fixed it'll be put back again.
597 598 - templating/css rewrites, optimized css. No newline at end of file
@@ -1,433 +1,432
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.controllers.admin.repos
4 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Repositories controller for RhodeCode
7 7
8 8 :created_on: Apr 7, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25
26 26 import logging
27 27 import traceback
28 28 import formencode
29 29 from formencode import htmlfill
30 30
31 31 from paste.httpexceptions import HTTPInternalServerError
32 32 from pylons import request, session, tmpl_context as c, url
33 33 from pylons.controllers.util import redirect
34 34 from pylons.i18n.translation import _
35 35 from sqlalchemy.exc import IntegrityError
36 36
37 37 from rhodecode.lib import helpers as h
38 38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 39 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator
40 40 from rhodecode.lib.base import BaseController, render
41 41 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
42 42 from rhodecode.lib.helpers import get_token
43 43 from rhodecode.model.meta import Session
44 44 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup
45 45 from rhodecode.model.forms import RepoForm
46 46 from rhodecode.model.scm import ScmModel
47 47 from rhodecode.model.repo import RepoModel
48 48
49 49 log = logging.getLogger(__name__)
50 50
51 51
52 52 class ReposController(BaseController):
53 53 """
54 54 REST Controller styled on the Atom Publishing Protocol"""
55 55 # To properly map this controller, ensure your config/routing.py
56 56 # file has a resource setup:
57 57 # map.resource('repo', 'repos')
58 58
59 59 @LoginRequired()
60 60 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
61 61 def __before__(self):
62 62 c.admin_user = session.get('admin_user')
63 63 c.admin_username = session.get('admin_username')
64 64 super(ReposController, self).__before__()
65 65
66 66 def __load_defaults(self):
67 67 c.repo_groups = RepoGroup.groups_choices()
68 68 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
69 69
70 70 repo_model = RepoModel()
71 71 c.users_array = repo_model.get_users_js()
72 72 c.users_groups_array = repo_model.get_users_groups_js()
73 73
74 74 def __load_data(self, repo_name=None):
75 75 """
76 76 Load defaults settings for edit, and update
77 77
78 78 :param repo_name:
79 79 """
80 80 self.__load_defaults()
81 81
82 82 c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
83 83 repo = db_repo.scm_instance
84 84
85 85 if c.repo_info is None:
86 86 h.flash(_('%s repository is not mapped to db perhaps'
87 87 ' it was created or renamed from the filesystem'
88 88 ' please run the application again'
89 89 ' in order to rescan repositories') % repo_name,
90 90 category='error')
91 91
92 92 return redirect(url('repos'))
93 93
94 94 c.default_user_id = User.get_by_username('default').user_id
95 95 c.in_public_journal = UserFollowing.query()\
96 96 .filter(UserFollowing.user_id == c.default_user_id)\
97 97 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
98 98
99 99 if c.repo_info.stats:
100 100 # this is on what revision we ended up so we add +1 for count
101 101 last_rev = c.repo_info.stats.stat_on_revision + 1
102 102 else:
103 103 last_rev = 0
104 104 c.stats_revision = last_rev
105 105
106 106 c.repo_last_rev = repo.count() if repo.revisions else 0
107 107
108 108 if last_rev == 0 or c.repo_last_rev == 0:
109 109 c.stats_percentage = 0
110 110 else:
111 111 c.stats_percentage = '%.2f' % ((float((last_rev)) /
112 112 c.repo_last_rev) * 100)
113 113
114 114 defaults = RepoModel()._get_defaults(repo_name)
115 115
116 116 c.repos_list = [('', _('--REMOVE FORK--'))]
117 117 c.repos_list += [(x.repo_id, x.repo_name) for x in
118 118 Repository.query().order_by(Repository.repo_name).all()]
119 119 return defaults
120 120
121 121 @HasPermissionAllDecorator('hg.admin')
122 122 def index(self, format='html'):
123 123 """GET /repos: All items in the collection"""
124 124 # url('repos')
125 125
126 126 c.repos_list = ScmModel().get_repos(Repository.query()
127 127 .order_by(Repository.repo_name)
128 128 .all(), sort_key='name_sort')
129 129 return render('admin/repos/repos.html')
130 130
131 131 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
132 132 def create(self):
133 133 """
134 134 POST /repos: Create a new item"""
135 135 # url('repos')
136 136
137 137 self.__load_defaults()
138 138 form_result = {}
139 139 try:
140 140 form_result = RepoForm(repo_groups=c.repo_groups_choices)()\
141 141 .to_python(dict(request.POST))
142 142 RepoModel().create(form_result, self.rhodecode_user)
143 143 if form_result['clone_uri']:
144 144 h.flash(_('created repository %s from %s') \
145 145 % (form_result['repo_name'], form_result['clone_uri']),
146 146 category='success')
147 147 else:
148 148 h.flash(_('created repository %s') % form_result['repo_name'],
149 149 category='success')
150 150
151 151 if request.POST.get('user_created'):
152 152 # created by regular non admin user
153 153 action_logger(self.rhodecode_user, 'user_created_repo',
154 154 form_result['repo_name_full'], '', self.sa)
155 155 else:
156 156 action_logger(self.rhodecode_user, 'admin_created_repo',
157 157 form_result['repo_name_full'], '', self.sa)
158 158 Session.commit()
159 159 except formencode.Invalid, errors:
160 160
161 161 c.new_repo = errors.value['repo_name']
162 162
163 163 if request.POST.get('user_created'):
164 164 r = render('admin/repos/repo_add_create_repository.html')
165 165 else:
166 166 r = render('admin/repos/repo_add.html')
167 167
168 168 return htmlfill.render(
169 169 r,
170 170 defaults=errors.value,
171 171 errors=errors.error_dict or {},
172 172 prefix_error=False,
173 173 encoding="UTF-8")
174 174
175 175 except Exception:
176 176 log.error(traceback.format_exc())
177 177 msg = _('error occurred during creation of repository %s') \
178 178 % form_result.get('repo_name')
179 179 h.flash(msg, category='error')
180 180 if request.POST.get('user_created'):
181 181 return redirect(url('home'))
182 182 return redirect(url('repos'))
183 183
184 184 @HasPermissionAllDecorator('hg.admin')
185 185 def new(self, format='html'):
186 186 """GET /repos/new: Form to create a new item"""
187 187 new_repo = request.GET.get('repo', '')
188 188 c.new_repo = repo_name_slug(new_repo)
189 189 self.__load_defaults()
190 190 return render('admin/repos/repo_add.html')
191 191
192 192 @HasPermissionAllDecorator('hg.admin')
193 193 def update(self, repo_name):
194 194 """
195 195 PUT /repos/repo_name: Update an existing item"""
196 196 # Forms posted to this method should contain a hidden field:
197 197 # <input type="hidden" name="_method" value="PUT" />
198 198 # Or using helpers:
199 199 # h.form(url('repo', repo_name=ID),
200 200 # method='put')
201 201 # url('repo', repo_name=ID)
202 202 self.__load_defaults()
203 203 repo_model = RepoModel()
204 204 changed_name = repo_name
205 205 _form = RepoForm(edit=True, old_data={'repo_name': repo_name},
206 206 repo_groups=c.repo_groups_choices)()
207 207 try:
208 208 form_result = _form.to_python(dict(request.POST))
209 209 repo = repo_model.update(repo_name, form_result)
210 210 invalidate_cache('get_repo_cached_%s' % repo_name)
211 211 h.flash(_('Repository %s updated successfully' % repo_name),
212 212 category='success')
213 213 changed_name = repo.repo_name
214 214 action_logger(self.rhodecode_user, 'admin_updated_repo',
215 215 changed_name, '', self.sa)
216 216 Session.commit()
217 217 except formencode.Invalid, errors:
218 218 defaults = self.__load_data(repo_name)
219 219 defaults.update(errors.value)
220 220 return htmlfill.render(
221 221 render('admin/repos/repo_edit.html'),
222 222 defaults=defaults,
223 223 errors=errors.error_dict or {},
224 224 prefix_error=False,
225 225 encoding="UTF-8")
226 226
227 227 except Exception:
228 228 log.error(traceback.format_exc())
229 229 h.flash(_('error occurred during update of repository %s') \
230 230 % repo_name, category='error')
231 231 return redirect(url('edit_repo', repo_name=changed_name))
232 232
233 233 @HasPermissionAllDecorator('hg.admin')
234 234 def delete(self, repo_name):
235 235 """
236 236 DELETE /repos/repo_name: Delete an existing item"""
237 237 # Forms posted to this method should contain a hidden field:
238 238 # <input type="hidden" name="_method" value="DELETE" />
239 239 # Or using helpers:
240 240 # h.form(url('repo', repo_name=ID),
241 241 # method='delete')
242 242 # url('repo', repo_name=ID)
243 243
244 244 repo_model = RepoModel()
245 245 repo = repo_model.get_by_repo_name(repo_name)
246 246 if not repo:
247 247 h.flash(_('%s repository is not mapped to db perhaps'
248 248 ' it was moved or renamed from the filesystem'
249 249 ' please run the application again'
250 250 ' in order to rescan repositories') % repo_name,
251 251 category='error')
252 252
253 253 return redirect(url('repos'))
254 254 try:
255 255 action_logger(self.rhodecode_user, 'admin_deleted_repo',
256 256 repo_name, '', self.sa)
257 257 repo_model.delete(repo)
258 258 invalidate_cache('get_repo_cached_%s' % repo_name)
259 259 h.flash(_('deleted repository %s') % repo_name, category='success')
260 260 Session.commit()
261 261 except IntegrityError, e:
262 262 if e.message.find('repositories_fork_id_fkey') != -1:
263 263 log.error(traceback.format_exc())
264 264 h.flash(_('Cannot delete %s it still contains attached '
265 265 'forks') % repo_name,
266 266 category='warning')
267 267 else:
268 268 log.error(traceback.format_exc())
269 269 h.flash(_('An error occurred during '
270 270 'deletion of %s') % repo_name,
271 271 category='error')
272 272
273 273 except Exception, e:
274 274 log.error(traceback.format_exc())
275 275 h.flash(_('An error occurred during deletion of %s') % repo_name,
276 276 category='error')
277 277
278 278 return redirect(url('repos'))
279 279
280 280 @HasRepoPermissionAllDecorator('repository.admin')
281 281 def delete_perm_user(self, repo_name):
282 282 """
283 283 DELETE an existing repository permission user
284 284
285 285 :param repo_name:
286 286 """
287
288 287 try:
289 288 RepoModel().revoke_user_permission(repo=repo_name,
290 289 user=request.POST['user_id'])
291 290 Session.commit()
292 291 except Exception:
293 292 log.error(traceback.format_exc())
294 293 h.flash(_('An error occurred during deletion of repository user'),
295 294 category='error')
296 295 raise HTTPInternalServerError()
297 296
298 297 @HasRepoPermissionAllDecorator('repository.admin')
299 298 def delete_perm_users_group(self, repo_name):
300 299 """
301 300 DELETE an existing repository permission users group
302 301
303 302 :param repo_name:
304 303 """
305 304
306 305 try:
307 306 RepoModel().revoke_users_group_permission(
308 307 repo=repo_name, group_name=request.POST['users_group_id']
309 308 )
310 309 Session.commit()
311 310 except Exception:
312 311 log.error(traceback.format_exc())
313 312 h.flash(_('An error occurred during deletion of repository'
314 313 ' users groups'),
315 314 category='error')
316 315 raise HTTPInternalServerError()
317 316
318 317 @HasPermissionAllDecorator('hg.admin')
319 318 def repo_stats(self, repo_name):
320 319 """
321 320 DELETE an existing repository statistics
322 321
323 322 :param repo_name:
324 323 """
325 324
326 325 try:
327 326 RepoModel().delete_stats(repo_name)
328 327 Session.commit()
329 328 except Exception, e:
330 329 h.flash(_('An error occurred during deletion of repository stats'),
331 330 category='error')
332 331 return redirect(url('edit_repo', repo_name=repo_name))
333 332
334 333 @HasPermissionAllDecorator('hg.admin')
335 334 def repo_cache(self, repo_name):
336 335 """
337 336 INVALIDATE existing repository cache
338 337
339 338 :param repo_name:
340 339 """
341 340
342 341 try:
343 342 ScmModel().mark_for_invalidation(repo_name)
344 343 Session.commit()
345 344 except Exception, e:
346 345 h.flash(_('An error occurred during cache invalidation'),
347 346 category='error')
348 347 return redirect(url('edit_repo', repo_name=repo_name))
349 348
350 349 @HasPermissionAllDecorator('hg.admin')
351 350 def repo_public_journal(self, repo_name):
352 351 """
353 352 Set's this repository to be visible in public journal,
354 353 in other words assing default user to follow this repo
355 354
356 355 :param repo_name:
357 356 """
358 357
359 358 cur_token = request.POST.get('auth_token')
360 359 token = get_token()
361 360 if cur_token == token:
362 361 try:
363 362 repo_id = Repository.get_by_repo_name(repo_name).repo_id
364 363 user_id = User.get_by_username('default').user_id
365 364 self.scm_model.toggle_following_repo(repo_id, user_id)
366 365 h.flash(_('Updated repository visibility in public journal'),
367 366 category='success')
368 367 Session.commit()
369 368 except:
370 369 h.flash(_('An error occurred during setting this'
371 370 ' repository in public journal'),
372 371 category='error')
373 372
374 373 else:
375 374 h.flash(_('Token mismatch'), category='error')
376 375 return redirect(url('edit_repo', repo_name=repo_name))
377 376
378 377 @HasPermissionAllDecorator('hg.admin')
379 378 def repo_pull(self, repo_name):
380 379 """
381 380 Runs task to update given repository with remote changes,
382 381 ie. make pull on remote location
383 382
384 383 :param repo_name:
385 384 """
386 385 try:
387 386 ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
388 387 h.flash(_('Pulled from remote location'), category='success')
389 388 except Exception, e:
390 389 h.flash(_('An error occurred during pull from remote location'),
391 390 category='error')
392 391
393 392 return redirect(url('edit_repo', repo_name=repo_name))
394 393
395 394 @HasPermissionAllDecorator('hg.admin')
396 395 def repo_as_fork(self, repo_name):
397 396 """
398 397 Mark given repository as a fork of another
399 398
400 399 :param repo_name:
401 400 """
402 401 try:
403 402 fork_id = request.POST.get('id_fork_of')
404 403 repo = ScmModel().mark_as_fork(repo_name, fork_id,
405 404 self.rhodecode_user.username)
406 405 fork = repo.fork.repo_name if repo.fork else _('Nothing')
407 406 Session.commit()
408 407 h.flash(_('Marked repo %s as fork of %s' % (repo_name,fork)),
409 408 category='success')
410 409 except Exception, e:
411 410 raise
412 411 h.flash(_('An error occurred during this operation'),
413 412 category='error')
414 413
415 414 return redirect(url('edit_repo', repo_name=repo_name))
416 415
417 416 @HasPermissionAllDecorator('hg.admin')
418 417 def show(self, repo_name, format='html'):
419 418 """GET /repos/repo_name: Show a specific item"""
420 419 # url('repo', repo_name=ID)
421 420
422 421 @HasPermissionAllDecorator('hg.admin')
423 422 def edit(self, repo_name, format='html'):
424 423 """GET /repos/repo_name/edit: Form to edit an existing item"""
425 424 # url('edit_repo', repo_name=ID)
426 425 defaults = self.__load_data(repo_name)
427 426
428 427 return htmlfill.render(
429 428 render('admin/repos/repo_edit.html'),
430 429 defaults=defaults,
431 430 encoding="UTF-8",
432 431 force_defaults=False
433 432 )
@@ -1,494 +1,499
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.repo
4 4 ~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Repository model for rhodecode
7 7
8 8 :created_on: Jun 5, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25 import os
26 26 import shutil
27 27 import logging
28 28 import traceback
29 29 from datetime import datetime
30 30
31 31 from rhodecode.lib.vcs.backends import get_backend
32
32 from rhodecode.lib.compat import json
33 33 from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode
34 34 from rhodecode.lib.caching_query import FromCache
35 35 from rhodecode.lib.hooks import log_create_repository
36 36
37 37 from rhodecode.model import BaseModel
38 38 from rhodecode.model.db import Repository, UserRepoToPerm, User, Permission, \
39 39 Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup
40 from rhodecode.lib import helpers as h
40 41
41 42
42 43 log = logging.getLogger(__name__)
43 44
44 45
45 46 class RepoModel(BaseModel):
46 47
47 48 def __get_user(self, user):
48 49 return self._get_instance(User, user, callback=User.get_by_username)
49 50
50 51 def __get_users_group(self, users_group):
51 52 return self._get_instance(UsersGroup, users_group,
52 53 callback=UsersGroup.get_by_group_name)
53 54
54 55 def __get_repos_group(self, repos_group):
55 56 return self._get_instance(RepoGroup, repos_group,
56 57 callback=RepoGroup.get_by_group_name)
57 58
58 59 def __get_repo(self, repository):
59 60 return self._get_instance(Repository, repository,
60 61 callback=Repository.get_by_repo_name)
61 62
62 63 def __get_perm(self, permission):
63 64 return self._get_instance(Permission, permission,
64 65 callback=Permission.get_by_key)
65 66
66 67 @LazyProperty
67 68 def repos_path(self):
68 69 """
69 70 Get's the repositories root path from database
70 71 """
71 72
72 73 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
73 74 return q.ui_value
74 75
75 76 def get(self, repo_id, cache=False):
76 77 repo = self.sa.query(Repository)\
77 78 .filter(Repository.repo_id == repo_id)
78 79
79 80 if cache:
80 81 repo = repo.options(FromCache("sql_cache_short",
81 82 "get_repo_%s" % repo_id))
82 83 return repo.scalar()
83 84
84 85 def get_repo(self, repository):
85 86 return self.__get_repo(repository)
86 87
87 88 def get_by_repo_name(self, repo_name, cache=False):
88 89 repo = self.sa.query(Repository)\
89 90 .filter(Repository.repo_name == repo_name)
90 91
91 92 if cache:
92 93 repo = repo.options(FromCache("sql_cache_short",
93 94 "get_repo_%s" % repo_name))
94 95 return repo.scalar()
95 96
96 97 def get_users_js(self):
97
98 98 users = self.sa.query(User).filter(User.active == True).all()
99 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
100 users_array = '[%s]' % '\n'.join([u_tmpl % (u.user_id, u.name,
101 u.lastname, u.username)
102 for u in users])
103 return users_array
99 return json.dumps([
100 {
101 'id': u.user_id,
102 'fname': u.name,
103 'lname': u.lastname,
104 'nname': u.username,
105 'gravatar_lnk': h.gravatar_url(u.email, 14)
106 } for u in users]
107 )
104 108
105 109 def get_users_groups_js(self):
106 110 users_groups = self.sa.query(UsersGroup)\
107 111 .filter(UsersGroup.users_group_active == True).all()
108 112
109 g_tmpl = '''{id:%s, grname:"%s",grmembers:"%s"},'''
110
111 users_groups_array = '[%s]' % '\n'.join([g_tmpl % \
112 (gr.users_group_id, gr.users_group_name,
113 len(gr.members))
114 for gr in users_groups])
115 return users_groups_array
113 return json.dumps([
114 {
115 'id': gr.users_group_id,
116 'grname': gr.users_group_name,
117 'grmembers': len(gr.members),
118 } for gr in users_groups]
119 )
116 120
117 121 def _get_defaults(self, repo_name):
118 122 """
119 123 Get's information about repository, and returns a dict for
120 124 usage in forms
121 125
122 126 :param repo_name:
123 127 """
124 128
125 129 repo_info = Repository.get_by_repo_name(repo_name)
126 130
127 131 if repo_info is None:
128 132 return None
129 133
130 134 defaults = repo_info.get_dict()
131 135 group, repo_name = repo_info.groups_and_repo
132 136 defaults['repo_name'] = repo_name
133 137 defaults['repo_group'] = getattr(group[-1] if group else None,
134 138 'group_id', None)
135 139
136 140 # fill owner
137 141 if repo_info.user:
138 142 defaults.update({'user': repo_info.user.username})
139 143 else:
140 144 replacement_user = User.query().filter(User.admin ==
141 145 True).first().username
142 146 defaults.update({'user': replacement_user})
143 147
144 148 # fill repository users
145 149 for p in repo_info.repo_to_perm:
146 150 defaults.update({'u_perm_%s' % p.user.username:
147 151 p.permission.permission_name})
148 152
149 153 # fill repository groups
150 154 for p in repo_info.users_group_to_perm:
151 155 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
152 156 p.permission.permission_name})
153 157
154 158 return defaults
155 159
156 160 def update(self, repo_name, form_data):
157 161 try:
158 162 cur_repo = self.get_by_repo_name(repo_name, cache=False)
159 163
160 164 # update permissions
161 165 for member, perm, member_type in form_data['perms_updates']:
162 166 if member_type == 'user':
163 167 # this updates existing one
164 168 RepoModel().grant_user_permission(
165 169 repo=cur_repo, user=member, perm=perm
166 170 )
167 171 else:
168 172 RepoModel().grant_users_group_permission(
169 173 repo=cur_repo, group_name=member, perm=perm
170 174 )
171 175 # set new permissions
172 176 for member, perm, member_type in form_data['perms_new']:
173 177 if member_type == 'user':
174 178 RepoModel().grant_user_permission(
175 179 repo=cur_repo, user=member, perm=perm
176 180 )
177 181 else:
178 182 RepoModel().grant_users_group_permission(
179 183 repo=cur_repo, group_name=member, perm=perm
180 184 )
181 185
182 186 # update current repo
183 187 for k, v in form_data.items():
184 188 if k == 'user':
185 189 cur_repo.user = User.get_by_username(v)
186 190 elif k == 'repo_name':
187 191 pass
188 192 elif k == 'repo_group':
189 193 cur_repo.group = RepoGroup.get(v)
190 194
191 195 else:
192 196 setattr(cur_repo, k, v)
193 197
194 198 new_name = cur_repo.get_new_name(form_data['repo_name'])
195 199 cur_repo.repo_name = new_name
196 200
197 201 self.sa.add(cur_repo)
198 202
199 203 if repo_name != new_name:
200 204 # rename repository
201 205 self.__rename_repo(old=repo_name, new=new_name)
202 206
203 207 return cur_repo
204 208 except:
205 209 log.error(traceback.format_exc())
206 210 raise
207 211
208 212 def create(self, form_data, cur_user, just_db=False, fork=False):
209 213 from rhodecode.model.scm import ScmModel
210 214
211 215 try:
212 216 if fork:
213 217 fork_parent_id = form_data['fork_parent_id']
214 218
215 219 # repo name is just a name of repository
216 220 # while repo_name_full is a full qualified name that is combined
217 221 # with name and path of group
218 222 repo_name = form_data['repo_name']
219 223 repo_name_full = form_data['repo_name_full']
220 224
221 225 new_repo = Repository()
222 226 new_repo.enable_statistics = False
223 227
224 228 for k, v in form_data.items():
225 229 if k == 'repo_name':
226 230 v = repo_name_full
227 231 if k == 'repo_group':
228 232 k = 'group_id'
229 233 if k == 'description':
230 234 v = v or repo_name
231 235
232 236 setattr(new_repo, k, v)
233 237
234 238 if fork:
235 239 parent_repo = Repository.get(fork_parent_id)
236 240 new_repo.fork = parent_repo
237 241
238 242 new_repo.user_id = cur_user.user_id
239 243 self.sa.add(new_repo)
240 244
241 245 def _create_default_perms():
242 246 # create default permission
243 247 repo_to_perm = UserRepoToPerm()
244 248 default = 'repository.read'
245 249 for p in User.get_by_username('default').user_perms:
246 250 if p.permission.permission_name.startswith('repository.'):
247 251 default = p.permission.permission_name
248 252 break
249 253
250 254 default_perm = 'repository.none' if form_data['private'] else default
251 255
252 256 repo_to_perm.permission_id = self.sa.query(Permission)\
253 257 .filter(Permission.permission_name == default_perm)\
254 258 .one().permission_id
255 259
256 260 repo_to_perm.repository = new_repo
257 261 repo_to_perm.user_id = User.get_by_username('default').user_id
258 262
259 263 self.sa.add(repo_to_perm)
260 264
261 265 if fork:
262 266 if form_data.get('copy_permissions'):
263 267 repo = Repository.get(fork_parent_id)
264 268 user_perms = UserRepoToPerm.query()\
265 269 .filter(UserRepoToPerm.repository == repo).all()
266 270 group_perms = UsersGroupRepoToPerm.query()\
267 271 .filter(UsersGroupRepoToPerm.repository == repo).all()
268 272
269 273 for perm in user_perms:
270 274 UserRepoToPerm.create(perm.user, new_repo,
271 275 perm.permission)
272 276
273 277 for perm in group_perms:
274 278 UsersGroupRepoToPerm.create(perm.users_group, new_repo,
275 279 perm.permission)
276 280 else:
277 281 _create_default_perms()
278 282 else:
279 283 _create_default_perms()
280 284
281 285 if not just_db:
282 286 self.__create_repo(repo_name, form_data['repo_type'],
283 287 form_data['repo_group'],
284 288 form_data['clone_uri'])
285 289
286 290 # now automatically start following this repository as owner
287 291 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
288 292 cur_user.user_id)
289 293 log_create_repository(new_repo.get_dict(),
290 294 created_by=cur_user.username)
291 295 return new_repo
292 296 except:
293 297 log.error(traceback.format_exc())
294 298 raise
295 299
296 300 def create_fork(self, form_data, cur_user):
297 301 """
298 302 Simple wrapper into executing celery task for fork creation
299 303
300 304 :param form_data:
301 305 :param cur_user:
302 306 """
303 307 from rhodecode.lib.celerylib import tasks, run_task
304 308 run_task(tasks.create_repo_fork, form_data, cur_user)
305 309
306 310 def delete(self, repo):
307 311 repo = self.__get_repo(repo)
308 312 try:
309 313 self.sa.delete(repo)
310 314 self.__delete_repo(repo)
311 315 except:
312 316 log.error(traceback.format_exc())
313 317 raise
314 318
315 319 def grant_user_permission(self, repo, user, perm):
316 320 """
317 321 Grant permission for user on given repository, or update existing one
318 322 if found
319 323
320 324 :param repo: Instance of Repository, repository_id, or repository name
321 325 :param user: Instance of User, user_id or username
322 326 :param perm: Instance of Permission, or permission_name
323 327 """
324 328 user = self.__get_user(user)
325 329 repo = self.__get_repo(repo)
326 330 permission = self.__get_perm(perm)
327 331
328 332 # check if we have that permission already
329 333 obj = self.sa.query(UserRepoToPerm)\
330 334 .filter(UserRepoToPerm.user == user)\
331 335 .filter(UserRepoToPerm.repository == repo)\
332 336 .scalar()
333 337 if obj is None:
334 338 # create new !
335 339 obj = UserRepoToPerm()
336 340 obj.repository = repo
337 341 obj.user = user
338 342 obj.permission = permission
339 343 self.sa.add(obj)
340 344
341 345 def revoke_user_permission(self, repo, user):
342 346 """
343 347 Revoke permission for user on given repository
344 348
345 349 :param repo: Instance of Repository, repository_id, or repository name
346 350 :param user: Instance of User, user_id or username
347 351 """
352
348 353 user = self.__get_user(user)
349 354 repo = self.__get_repo(repo)
350 355
351 356 obj = self.sa.query(UserRepoToPerm)\
352 357 .filter(UserRepoToPerm.repository == repo)\
353 358 .filter(UserRepoToPerm.user == user)\
354 359 .one()
355 360 self.sa.delete(obj)
356 361
357 362 def grant_users_group_permission(self, repo, group_name, perm):
358 363 """
359 364 Grant permission for users group on given repository, or update
360 365 existing one if found
361 366
362 367 :param repo: Instance of Repository, repository_id, or repository name
363 368 :param group_name: Instance of UserGroup, users_group_id,
364 369 or users group name
365 370 :param perm: Instance of Permission, or permission_name
366 371 """
367 372 repo = self.__get_repo(repo)
368 373 group_name = self.__get_users_group(group_name)
369 374 permission = self.__get_perm(perm)
370 375
371 376 # check if we have that permission already
372 377 obj = self.sa.query(UsersGroupRepoToPerm)\
373 378 .filter(UsersGroupRepoToPerm.users_group == group_name)\
374 379 .filter(UsersGroupRepoToPerm.repository == repo)\
375 380 .scalar()
376 381
377 382 if obj is None:
378 383 # create new
379 384 obj = UsersGroupRepoToPerm()
380 385
381 386 obj.repository = repo
382 387 obj.users_group = group_name
383 388 obj.permission = permission
384 389 self.sa.add(obj)
385 390
386 391 def revoke_users_group_permission(self, repo, group_name):
387 392 """
388 393 Revoke permission for users group on given repository
389 394
390 395 :param repo: Instance of Repository, repository_id, or repository name
391 396 :param group_name: Instance of UserGroup, users_group_id,
392 397 or users group name
393 398 """
394 399 repo = self.__get_repo(repo)
395 400 group_name = self.__get_users_group(group_name)
396 401
397 402 obj = self.sa.query(UsersGroupRepoToPerm)\
398 403 .filter(UsersGroupRepoToPerm.repository == repo)\
399 404 .filter(UsersGroupRepoToPerm.users_group == group_name)\
400 405 .one()
401 406 self.sa.delete(obj)
402 407
403 408 def delete_stats(self, repo_name):
404 409 """
405 410 removes stats for given repo
406 411
407 412 :param repo_name:
408 413 """
409 414 try:
410 415 obj = self.sa.query(Statistics)\
411 416 .filter(Statistics.repository ==
412 417 self.get_by_repo_name(repo_name))\
413 418 .one()
414 419 self.sa.delete(obj)
415 420 except:
416 421 log.error(traceback.format_exc())
417 422 raise
418 423
419 424 def __create_repo(self, repo_name, alias, new_parent_id, clone_uri=False):
420 425 """
421 426 makes repository on filesystem. It's group aware means it'll create
422 427 a repository within a group, and alter the paths accordingly of
423 428 group location
424 429
425 430 :param repo_name:
426 431 :param alias:
427 432 :param parent_id:
428 433 :param clone_uri:
429 434 """
430 435 from rhodecode.lib.utils import is_valid_repo, is_valid_repos_group
431 436
432 437 if new_parent_id:
433 438 paths = RepoGroup.get(new_parent_id)\
434 439 .full_path.split(RepoGroup.url_sep())
435 440 new_parent_path = os.sep.join(paths)
436 441 else:
437 442 new_parent_path = ''
438 443
439 444 # we need to make it str for mercurial
440 445 repo_path = os.path.join(*map(lambda x: safe_str(x),
441 446 [self.repos_path, new_parent_path, repo_name]))
442 447
443 448 # check if this path is not a repository
444 449 if is_valid_repo(repo_path, self.repos_path):
445 450 raise Exception('This path %s is a valid repository' % repo_path)
446 451
447 452 # check if this path is a group
448 453 if is_valid_repos_group(repo_path, self.repos_path):
449 454 raise Exception('This path %s is a valid group' % repo_path)
450 455
451 456 log.info('creating repo %s in %s @ %s' % (
452 457 repo_name, safe_unicode(repo_path), clone_uri
453 458 )
454 459 )
455 460 backend = get_backend(alias)
456 461
457 462 backend(repo_path, create=True, src_url=clone_uri)
458 463
459 464 def __rename_repo(self, old, new):
460 465 """
461 466 renames repository on filesystem
462 467
463 468 :param old: old name
464 469 :param new: new name
465 470 """
466 471 log.info('renaming repo from %s to %s' % (old, new))
467 472
468 473 old_path = os.path.join(self.repos_path, old)
469 474 new_path = os.path.join(self.repos_path, new)
470 475 if os.path.isdir(new_path):
471 476 raise Exception(
472 477 'Was trying to rename to already existing dir %s' % new_path
473 478 )
474 479 shutil.move(old_path, new_path)
475 480
476 481 def __delete_repo(self, repo):
477 482 """
478 483 removes repo from filesystem, the removal is acctually made by
479 484 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
480 485 repository is no longer valid for rhodecode, can be undeleted later on
481 486 by reverting the renames on this repository
482 487
483 488 :param repo: repo object
484 489 """
485 490 rm_path = os.path.join(self.repos_path, repo.repo_name)
486 491 log.info("Removing %s" % (rm_path))
487 492 # disable hg/git
488 493 alias = repo.repo_type
489 494 shutil.move(os.path.join(rm_path, '.%s' % alias),
490 495 os.path.join(rm_path, 'rm__.%s' % alias))
491 496 # disable repo
492 497 _d = 'rm__%s__%s' % (datetime.now().strftime('%Y%m%d_%H%M%S_%f'),
493 498 repo.repo_name)
494 499 shutil.move(rm_path, os.path.join(self.repos_path, _d))
@@ -1,4353 +1,4360
1 1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td
2 2 {
3 3 border: 0;
4 4 outline: 0;
5 5 font-size: 100%;
6 6 vertical-align: baseline;
7 7 background: transparent;
8 8 margin: 0;
9 9 padding: 0;
10 10 }
11 11
12 12 body {
13 13 line-height: 1;
14 14 height: 100%;
15 15 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
16 16 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
17 17 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
18 18 color: #000;
19 19 margin: 0;
20 20 padding: 0;
21 21 font-size: 12px;
22 22 }
23 23
24 24 ol,ul {
25 25 list-style: none;
26 26 }
27 27
28 28 blockquote,q {
29 29 quotes: none;
30 30 }
31 31
32 32 blockquote:before,blockquote:after,q:before,q:after {
33 33 content: none;
34 34 }
35 35
36 36 :focus {
37 37 outline: 0;
38 38 }
39 39
40 40 del {
41 41 text-decoration: line-through;
42 42 }
43 43
44 44 table {
45 45 border-collapse: collapse;
46 46 border-spacing: 0;
47 47 }
48 48
49 49 html {
50 50 height: 100%;
51 51 }
52 52
53 53 a {
54 54 color: #003367;
55 55 text-decoration: none;
56 56 cursor: pointer;
57 57 }
58 58
59 59 a:hover {
60 60 color: #316293;
61 61 text-decoration: underline;
62 62 }
63 63
64 64 h1,h2,h3,h4,h5,h6 {
65 65 color: #292929;
66 66 font-weight: 700;
67 67 }
68 68
69 69 h1 {
70 70 font-size: 22px;
71 71 }
72 72
73 73 h2 {
74 74 font-size: 20px;
75 75 }
76 76
77 77 h3 {
78 78 font-size: 18px;
79 79 }
80 80
81 81 h4 {
82 82 font-size: 16px;
83 83 }
84 84
85 85 h5 {
86 86 font-size: 14px;
87 87 }
88 88
89 89 h6 {
90 90 font-size: 11px;
91 91 }
92 92
93 93 ul.circle {
94 94 list-style-type: circle;
95 95 }
96 96
97 97 ul.disc {
98 98 list-style-type: disc;
99 99 }
100 100
101 101 ul.square {
102 102 list-style-type: square;
103 103 }
104 104
105 105 ol.lower-roman {
106 106 list-style-type: lower-roman;
107 107 }
108 108
109 109 ol.upper-roman {
110 110 list-style-type: upper-roman;
111 111 }
112 112
113 113 ol.lower-alpha {
114 114 list-style-type: lower-alpha;
115 115 }
116 116
117 117 ol.upper-alpha {
118 118 list-style-type: upper-alpha;
119 119 }
120 120
121 121 ol.decimal {
122 122 list-style-type: decimal;
123 123 }
124 124
125 125 div.color {
126 126 clear: both;
127 127 overflow: hidden;
128 128 position: absolute;
129 129 background: #FFF;
130 130 margin: 7px 0 0 60px;
131 131 padding: 1px 1px 1px 0;
132 132 }
133 133
134 134 div.color a {
135 135 width: 15px;
136 136 height: 15px;
137 137 display: block;
138 138 float: left;
139 139 margin: 0 0 0 1px;
140 140 padding: 0;
141 141 }
142 142
143 143 div.options {
144 144 clear: both;
145 145 overflow: hidden;
146 146 position: absolute;
147 147 background: #FFF;
148 148 margin: 7px 0 0 162px;
149 149 padding: 0;
150 150 }
151 151
152 152 div.options a {
153 153 height: 1%;
154 154 display: block;
155 155 text-decoration: none;
156 156 margin: 0;
157 157 padding: 3px 8px;
158 158 }
159 159
160 160 .top-left-rounded-corner {
161 161 -webkit-border-top-left-radius: 8px;
162 162 -khtml-border-radius-topleft: 8px;
163 163 -moz-border-radius-topleft: 8px;
164 164 border-top-left-radius: 8px;
165 165 }
166 166
167 167 .top-right-rounded-corner {
168 168 -webkit-border-top-right-radius: 8px;
169 169 -khtml-border-radius-topright: 8px;
170 170 -moz-border-radius-topright: 8px;
171 171 border-top-right-radius: 8px;
172 172 }
173 173
174 174 .bottom-left-rounded-corner {
175 175 -webkit-border-bottom-left-radius: 8px;
176 176 -khtml-border-radius-bottomleft: 8px;
177 177 -moz-border-radius-bottomleft: 8px;
178 178 border-bottom-left-radius: 8px;
179 179 }
180 180
181 181 .bottom-right-rounded-corner {
182 182 -webkit-border-bottom-right-radius: 8px;
183 183 -khtml-border-radius-bottomright: 8px;
184 184 -moz-border-radius-bottomright: 8px;
185 185 border-bottom-right-radius: 8px;
186 186 }
187 187
188 188 .top-left-rounded-corner-mid {
189 189 -webkit-border-top-left-radius: 4px;
190 190 -khtml-border-radius-topleft: 4px;
191 191 -moz-border-radius-topleft: 4px;
192 192 border-top-left-radius: 4px;
193 193 }
194 194
195 195 .top-right-rounded-corner-mid {
196 196 -webkit-border-top-right-radius: 4px;
197 197 -khtml-border-radius-topright: 4px;
198 198 -moz-border-radius-topright: 4px;
199 199 border-top-right-radius: 4px;
200 200 }
201 201
202 202 .bottom-left-rounded-corner-mid {
203 203 -webkit-border-bottom-left-radius: 4px;
204 204 -khtml-border-radius-bottomleft: 4px;
205 205 -moz-border-radius-bottomleft: 4px;
206 206 border-bottom-left-radius: 4px;
207 207 }
208 208
209 209 .bottom-right-rounded-corner-mid {
210 210 -webkit-border-bottom-right-radius: 4px;
211 211 -khtml-border-radius-bottomright: 4px;
212 212 -moz-border-radius-bottomright: 4px;
213 213 border-bottom-right-radius: 4px;
214 214 }
215 215
216 216 .help-block {
217 217 color: #999999;
218 218 display: block;
219 219 margin-bottom: 0;
220 220 margin-top: 5px;
221 221 }
222 222
223 223 #header {
224 224 margin: 0;
225 225 padding: 0 10px;
226 226 }
227 227
228 228 #header ul#logged-user {
229 229 margin-bottom: 5px !important;
230 230 -webkit-border-radius: 0px 0px 8px 8px;
231 231 -khtml-border-radius: 0px 0px 8px 8px;
232 232 -moz-border-radius: 0px 0px 8px 8px;
233 233 border-radius: 0px 0px 8px 8px;
234 234 height: 37px;
235 235 background-color: #eedc94;
236 236 background-repeat: repeat-x;
237 237 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
238 238 to(#eedc94) );
239 239 background-image: -moz-linear-gradient(top, #003b76, #00376e);
240 240 background-image: -ms-linear-gradient(top, #003b76, #00376e);
241 241 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
242 242 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
243 243 background-image: -o-linear-gradient(top, #003b76, #00376e);
244 244 background-image: linear-gradient(top, #003b76, #00376e);
245 245 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
246 246 endColorstr='#00376e', GradientType=0 );
247 247 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
248 248 }
249 249
250 250 #header ul#logged-user li {
251 251 list-style: none;
252 252 float: left;
253 253 margin: 8px 0 0;
254 254 padding: 4px 12px;
255 255 border-left: 1px solid #316293;
256 256 }
257 257
258 258 #header ul#logged-user li.first {
259 259 border-left: none;
260 260 margin: 4px;
261 261 }
262 262
263 263 #header ul#logged-user li.first div.gravatar {
264 264 margin-top: -2px;
265 265 }
266 266
267 267 #header ul#logged-user li.first div.account {
268 268 padding-top: 4px;
269 269 float: left;
270 270 }
271 271
272 272 #header ul#logged-user li.last {
273 273 border-right: none;
274 274 }
275 275
276 276 #header ul#logged-user li a {
277 277 color: #fff;
278 278 font-weight: 700;
279 279 text-decoration: none;
280 280 }
281 281
282 282 #header ul#logged-user li a:hover {
283 283 text-decoration: underline;
284 284 }
285 285
286 286 #header ul#logged-user li.highlight a {
287 287 color: #fff;
288 288 }
289 289
290 290 #header ul#logged-user li.highlight a:hover {
291 291 color: #FFF;
292 292 }
293 293
294 294 #header #header-inner {
295 295 min-height: 44px;
296 296 clear: both;
297 297 position: relative;
298 298 background-color: #eedc94;
299 299 background-repeat: repeat-x;
300 300 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),to(#eedc94) );
301 301 background-image: -moz-linear-gradient(top, #003b76, #00376e);
302 302 background-image: -ms-linear-gradient(top, #003b76, #00376e);
303 303 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
304 304 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
305 305 background-image: -o-linear-gradient(top, #003b76, #00376e);
306 306 background-image: linear-gradient(top, #003b76, #00376e);
307 307 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
308 308 margin: 0;
309 309 padding: 0;
310 310 display: block;
311 311 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
312 312 -webkit-border-radius: 4px 4px 4px 4px;
313 313 -khtml-border-radius: 4px 4px 4px 4px;
314 314 -moz-border-radius: 4px 4px 4px 4px;
315 315 border-radius: 4px 4px 4px 4px;
316 316 }
317 317 #header #header-inner.hover{
318 318 position: fixed !important;
319 319 width: 100% !important;
320 320 margin-left: -10px !important;
321 321 z-index: 10000;
322 322 -webkit-border-radius: 0px 0px 0px 0px;
323 323 -khtml-border-radius: 0px 0px 0px 0px;
324 324 -moz-border-radius: 0px 0px 0px 0px;
325 325 border-radius: 0px 0px 0px 0px;
326 326 }
327 327 #header #header-inner #home a {
328 328 height: 40px;
329 329 width: 46px;
330 330 display: block;
331 331 background: url("../images/button_home.png");
332 332 background-position: 0 0;
333 333 margin: 0;
334 334 padding: 0;
335 335 }
336 336
337 337 #header #header-inner #home a:hover {
338 338 background-position: 0 -40px;
339 339 }
340 340
341 341 #header #header-inner #logo {
342 342 float: left;
343 343 position: absolute;
344 344 }
345 345
346 346 #header #header-inner #logo h1 {
347 347 color: #FFF;
348 348 font-size: 20px;
349 349 margin: 12px 0 0 13px;
350 350 padding: 0;
351 351 }
352 352
353 353 #header #header-inner #logo a {
354 354 color: #fff;
355 355 text-decoration: none;
356 356 }
357 357
358 358 #header #header-inner #logo a:hover {
359 359 color: #bfe3ff;
360 360 }
361 361
362 362 #header #header-inner #quick,#header #header-inner #quick ul {
363 363 position: relative;
364 364 float: right;
365 365 list-style-type: none;
366 366 list-style-position: outside;
367 367 margin: 8px 8px 0 0;
368 368 padding: 0;
369 369 }
370 370
371 371 #header #header-inner #quick li {
372 372 position: relative;
373 373 float: left;
374 374 margin: 0 5px 0 0;
375 375 padding: 0;
376 376 }
377 377
378 378 #header #header-inner #quick li a.menu_link {
379 379 top: 0;
380 380 left: 0;
381 381 height: 1%;
382 382 display: block;
383 383 clear: both;
384 384 overflow: hidden;
385 385 color: #FFF;
386 386 font-weight: 700;
387 387 text-decoration: none;
388 388 background: #369;
389 389 padding: 0;
390 390 -webkit-border-radius: 4px 4px 4px 4px;
391 391 -khtml-border-radius: 4px 4px 4px 4px;
392 392 -moz-border-radius: 4px 4px 4px 4px;
393 393 border-radius: 4px 4px 4px 4px;
394 394 }
395 395
396 396 #header #header-inner #quick li span.short {
397 397 padding: 9px 6px 8px 6px;
398 398 }
399 399
400 400 #header #header-inner #quick li span {
401 401 top: 0;
402 402 right: 0;
403 403 height: 1%;
404 404 display: block;
405 405 float: left;
406 406 border-left: 1px solid #3f6f9f;
407 407 margin: 0;
408 408 padding: 10px 12px 8px 10px;
409 409 }
410 410
411 411 #header #header-inner #quick li span.normal {
412 412 border: none;
413 413 padding: 10px 12px 8px;
414 414 }
415 415
416 416 #header #header-inner #quick li span.icon {
417 417 top: 0;
418 418 left: 0;
419 419 border-left: none;
420 420 border-right: 1px solid #2e5c89;
421 421 padding: 8px 6px 4px;
422 422 }
423 423
424 424 #header #header-inner #quick li span.icon_short {
425 425 top: 0;
426 426 left: 0;
427 427 border-left: none;
428 428 border-right: 1px solid #2e5c89;
429 429 padding: 8px 6px 4px;
430 430 }
431 431
432 432 #header #header-inner #quick li span.icon img,#header #header-inner #quick li span.icon_short img
433 433 {
434 434 margin: 0px -2px 0px 0px;
435 435 }
436 436
437 437 #header #header-inner #quick li a:hover {
438 438 background: #4e4e4e no-repeat top left;
439 439 }
440 440
441 441 #header #header-inner #quick li a:hover span {
442 442 border-left: 1px solid #545454;
443 443 }
444 444
445 445 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short
446 446 {
447 447 border-left: none;
448 448 border-right: 1px solid #464646;
449 449 }
450 450
451 451 #header #header-inner #quick ul {
452 452 top: 29px;
453 453 right: 0;
454 454 min-width: 200px;
455 455 display: none;
456 456 position: absolute;
457 457 background: #FFF;
458 458 border: 1px solid #666;
459 459 border-top: 1px solid #003367;
460 460 z-index: 100;
461 461 margin: 0px 0px 0px 0px;
462 462 padding: 0;
463 463 }
464 464
465 465 #header #header-inner #quick ul.repo_switcher {
466 466 max-height: 275px;
467 467 overflow-x: hidden;
468 468 overflow-y: auto;
469 469 }
470 470
471 471 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
472 472 float: none;
473 473 margin: 0;
474 474 border-bottom: 2px solid #003367;
475 475 }
476 476
477 477 #header #header-inner #quick .repo_switcher_type {
478 478 position: absolute;
479 479 left: 0;
480 480 top: 9px;
481 481 }
482 482
483 483 #header #header-inner #quick li ul li {
484 484 border-bottom: 1px solid #ddd;
485 485 }
486 486
487 487 #header #header-inner #quick li ul li a {
488 488 width: 182px;
489 489 height: auto;
490 490 display: block;
491 491 float: left;
492 492 background: #FFF;
493 493 color: #003367;
494 494 font-weight: 400;
495 495 margin: 0;
496 496 padding: 7px 9px;
497 497 }
498 498
499 499 #header #header-inner #quick li ul li a:hover {
500 500 color: #000;
501 501 background: #FFF;
502 502 }
503 503
504 504 #header #header-inner #quick ul ul {
505 505 top: auto;
506 506 }
507 507
508 508 #header #header-inner #quick li ul ul {
509 509 right: 200px;
510 510 max-height: 275px;
511 511 overflow: auto;
512 512 overflow-x: hidden;
513 513 white-space: normal;
514 514 }
515 515
516 516 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover
517 517 {
518 518 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
519 519 #FFF;
520 520 width: 167px;
521 521 margin: 0;
522 522 padding: 12px 9px 7px 24px;
523 523 }
524 524
525 525 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover
526 526 {
527 527 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
528 528 #FFF;
529 529 min-width: 167px;
530 530 margin: 0;
531 531 padding: 12px 9px 7px 24px;
532 532 }
533 533
534 534 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover
535 535 {
536 536 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
537 537 9px #FFF;
538 538 min-width: 167px;
539 539 margin: 0;
540 540 padding: 12px 9px 7px 24px;
541 541 }
542 542
543 543 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover
544 544 {
545 545 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
546 546 #FFF;
547 547 min-width: 167px;
548 548 margin: 0 0 0 14px;
549 549 padding: 12px 9px 7px 24px;
550 550 }
551 551
552 552 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover
553 553 {
554 554 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
555 555 #FFF;
556 556 min-width: 167px;
557 557 margin: 0 0 0 14px;
558 558 padding: 12px 9px 7px 24px;
559 559 }
560 560
561 561 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover
562 562 {
563 563 background: url("../images/icons/database_edit.png") no-repeat scroll
564 564 4px 9px #FFF;
565 565 width: 167px;
566 566 margin: 0;
567 567 padding: 12px 9px 7px 24px;
568 568 }
569 569
570 570 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover
571 571 {
572 572 background: url("../images/icons/database_link.png") no-repeat scroll
573 573 4px 9px #FFF;
574 574 width: 167px;
575 575 margin: 0;
576 576 padding: 12px 9px 7px 24px;
577 577 }
578 578
579 579 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover
580 580 {
581 581 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
582 582 width: 167px;
583 583 margin: 0;
584 584 padding: 12px 9px 7px 24px;
585 585 }
586 586
587 587 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover
588 588 {
589 589 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
590 590 width: 167px;
591 591 margin: 0;
592 592 padding: 12px 9px 7px 24px;
593 593 }
594 594
595 595 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
596 596 {
597 597 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
598 598 width: 167px;
599 599 margin: 0;
600 600 padding: 12px 9px 7px 24px;
601 601 }
602 602
603 603 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover
604 604 {
605 605 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
606 606 width: 167px;
607 607 margin: 0;
608 608 padding: 12px 9px 7px 24px;
609 609 }
610 610
611 611 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover
612 612 {
613 613 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
614 614 width: 167px;
615 615 margin: 0;
616 616 padding: 12px 9px 7px 24px;
617 617 }
618 618
619 619 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover
620 620 {
621 621 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
622 622 9px;
623 623 width: 167px;
624 624 margin: 0;
625 625 padding: 12px 9px 7px 24px;
626 626 }
627 627
628 628 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover
629 629 {
630 630 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
631 631 width: 167px;
632 632 margin: 0;
633 633 padding: 12px 9px 7px 24px;
634 634 }
635 635
636 636 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover
637 637 {
638 638 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
639 639 width: 167px;
640 640 margin: 0;
641 641 padding: 12px 9px 7px 24px;
642 642 }
643 643
644 644 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover
645 645 {
646 646 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
647 647 9px;
648 648 width: 167px;
649 649 margin: 0;
650 650 padding: 12px 9px 7px 24px;
651 651 }
652 652
653 653 #header #header-inner #quick li ul li a.tags,
654 654 #header #header-inner #quick li ul li a.tags:hover{
655 655 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
656 656 width: 167px;
657 657 margin: 0;
658 658 padding: 12px 9px 7px 24px;
659 659 }
660 660
661 661 #header #header-inner #quick li ul li a.bookmarks,
662 662 #header #header-inner #quick li ul li a.bookmarks:hover{
663 663 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
664 664 width: 167px;
665 665 margin: 0;
666 666 padding: 12px 9px 7px 24px;
667 667 }
668 668
669 669 #header #header-inner #quick li ul li a.admin,
670 670 #header #header-inner #quick li ul li a.admin:hover{
671 671 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
672 672 width: 167px;
673 673 margin: 0;
674 674 padding: 12px 9px 7px 24px;
675 675 }
676 676
677 677 .groups_breadcrumbs a {
678 678 color: #fff;
679 679 }
680 680
681 681 .groups_breadcrumbs a:hover {
682 682 color: #bfe3ff;
683 683 text-decoration: none;
684 684 }
685 685
686 686 td.quick_repo_menu {
687 687 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
688 688 cursor: pointer;
689 689 width: 8px;
690 690 border: 1px solid transparent;
691 691 }
692 692
693 693 td.quick_repo_menu.active {
694 694 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
695 695 border: 1px solid #003367;
696 696 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
697 697 cursor: pointer;
698 698 }
699 699
700 700 td.quick_repo_menu .menu_items {
701 701 margin-top: 10px;
702 702 margin-left:-6px;
703 703 width: 150px;
704 704 position: absolute;
705 705 background-color: #FFF;
706 706 background: none repeat scroll 0 0 #FFFFFF;
707 707 border-color: #003367 #666666 #666666;
708 708 border-right: 1px solid #666666;
709 709 border-style: solid;
710 710 border-width: 1px;
711 711 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
712 712 border-top-style: none;
713 713 }
714 714
715 715 td.quick_repo_menu .menu_items li {
716 716 padding: 0 !important;
717 717 }
718 718
719 719 td.quick_repo_menu .menu_items a {
720 720 display: block;
721 721 padding: 4px 12px 4px 8px;
722 722 }
723 723
724 724 td.quick_repo_menu .menu_items a:hover {
725 725 background-color: #EEE;
726 726 text-decoration: none;
727 727 }
728 728
729 729 td.quick_repo_menu .menu_items .icon img {
730 730 margin-bottom: -2px;
731 731 }
732 732
733 733 td.quick_repo_menu .menu_items.hidden {
734 734 display: none;
735 735 }
736 736
737 737 .yui-dt-first th {
738 738 text-align: left;
739 739 }
740 740
741 741 /*
742 742 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
743 743 Code licensed under the BSD License:
744 744 http://developer.yahoo.com/yui/license.html
745 745 version: 2.9.0
746 746 */
747 747 .yui-skin-sam .yui-dt-mask {
748 748 position: absolute;
749 749 z-index: 9500;
750 750 }
751 751 .yui-dt-tmp {
752 752 position: absolute;
753 753 left: -9000px;
754 754 }
755 755 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
756 756 .yui-dt-scrollable .yui-dt-hd {
757 757 overflow: hidden;
758 758 position: relative;
759 759 }
760 760 .yui-dt-scrollable .yui-dt-bd thead tr,
761 761 .yui-dt-scrollable .yui-dt-bd thead th {
762 762 position: absolute;
763 763 left: -1500px;
764 764 }
765 765 .yui-dt-scrollable tbody { -moz-outline: 0 }
766 766 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
767 767 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
768 768 .yui-dt-coltarget {
769 769 position: absolute;
770 770 z-index: 999;
771 771 }
772 772 .yui-dt-hd { zoom: 1 }
773 773 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
774 774 .yui-dt-resizer {
775 775 position: absolute;
776 776 right: 0;
777 777 bottom: 0;
778 778 height: 100%;
779 779 cursor: e-resize;
780 780 cursor: col-resize;
781 781 background-color: #CCC;
782 782 opacity: 0;
783 783 filter: alpha(opacity=0);
784 784 }
785 785 .yui-dt-resizerproxy {
786 786 visibility: hidden;
787 787 position: absolute;
788 788 z-index: 9000;
789 789 background-color: #CCC;
790 790 opacity: 0;
791 791 filter: alpha(opacity=0);
792 792 }
793 793 th.yui-dt-hidden .yui-dt-liner,
794 794 td.yui-dt-hidden .yui-dt-liner,
795 795 th.yui-dt-hidden .yui-dt-resizer { display: none }
796 796 .yui-dt-editor,
797 797 .yui-dt-editor-shim {
798 798 position: absolute;
799 799 z-index: 9000;
800 800 }
801 801 .yui-skin-sam .yui-dt table {
802 802 margin: 0;
803 803 padding: 0;
804 804 font-family: arial;
805 805 font-size: inherit;
806 806 border-collapse: separate;
807 807 *border-collapse: collapse;
808 808 border-spacing: 0;
809 809 border: 1px solid #7f7f7f;
810 810 }
811 811 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
812 812 .yui-skin-sam .yui-dt caption {
813 813 color: #000;
814 814 font-size: 85%;
815 815 font-weight: normal;
816 816 font-style: italic;
817 817 line-height: 1;
818 818 padding: 1em 0;
819 819 text-align: center;
820 820 }
821 821 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
822 822 .yui-skin-sam .yui-dt th,
823 823 .yui-skin-sam .yui-dt th a {
824 824 font-weight: normal;
825 825 text-decoration: none;
826 826 color: #000;
827 827 vertical-align: bottom;
828 828 }
829 829 .yui-skin-sam .yui-dt th {
830 830 margin: 0;
831 831 padding: 0;
832 832 border: 0;
833 833 border-right: 1px solid #cbcbcb;
834 834 }
835 835 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
836 836 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
837 837 .yui-skin-sam .yui-dt-liner {
838 838 margin: 0;
839 839 padding: 0;
840 840 }
841 841 .yui-skin-sam .yui-dt-coltarget {
842 842 width: 5px;
843 843 background-color: red;
844 844 }
845 845 .yui-skin-sam .yui-dt td {
846 846 margin: 0;
847 847 padding: 0;
848 848 border: 0;
849 849 border-right: 1px solid #cbcbcb;
850 850 text-align: left;
851 851 }
852 852 .yui-skin-sam .yui-dt-list td { border-right: 0 }
853 853 .yui-skin-sam .yui-dt-resizer { width: 6px }
854 854 .yui-skin-sam .yui-dt-mask {
855 855 background-color: #000;
856 856 opacity: .25;
857 857 filter: alpha(opacity=25);
858 858 }
859 859 .yui-skin-sam .yui-dt-message { background-color: #FFF }
860 860 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
861 861 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
862 862 border-left: 1px solid #7f7f7f;
863 863 border-top: 1px solid #7f7f7f;
864 864 border-right: 1px solid #7f7f7f;
865 865 }
866 866 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
867 867 border-left: 1px solid #7f7f7f;
868 868 border-bottom: 1px solid #7f7f7f;
869 869 border-right: 1px solid #7f7f7f;
870 870 background-color: #FFF;
871 871 }
872 872 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
873 873 .yui-skin-sam th.yui-dt-asc,
874 874 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
875 875 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
876 876 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
877 877 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
878 878 tbody .yui-dt-editable { cursor: pointer }
879 879 .yui-dt-editor {
880 880 text-align: left;
881 881 background-color: #f2f2f2;
882 882 border: 1px solid #808080;
883 883 padding: 6px;
884 884 }
885 885 .yui-dt-editor label {
886 886 padding-left: 4px;
887 887 padding-right: 6px;
888 888 }
889 889 .yui-dt-editor .yui-dt-button {
890 890 padding-top: 6px;
891 891 text-align: right;
892 892 }
893 893 .yui-dt-editor .yui-dt-button button {
894 894 background: url(../images/sprite.png) repeat-x 0 0;
895 895 border: 1px solid #999;
896 896 width: 4em;
897 897 height: 1.8em;
898 898 margin-left: 6px;
899 899 }
900 900 .yui-dt-editor .yui-dt-button button.yui-dt-default {
901 901 background: url(../images/sprite.png) repeat-x 0 -1400px;
902 902 background-color: #5584e0;
903 903 border: 1px solid #304369;
904 904 color: #FFF;
905 905 }
906 906 .yui-dt-editor .yui-dt-button button:hover {
907 907 background: url(../images/sprite.png) repeat-x 0 -1300px;
908 908 color: #000;
909 909 }
910 910 .yui-dt-editor .yui-dt-button button:active {
911 911 background: url(../images/sprite.png) repeat-x 0 -1700px;
912 912 color: #000;
913 913 }
914 914 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
915 915 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
916 916 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
917 917 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
918 918 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
919 919 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
920 920 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
921 921 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
922 922 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
923 923 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
924 924 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
925 925 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
926 926 .yui-skin-sam th.yui-dt-highlighted,
927 927 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
928 928 .yui-skin-sam tr.yui-dt-highlighted,
929 929 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
930 930 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
931 931 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
932 932 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
933 933 cursor: pointer;
934 934 background-color: #b2d2ff;
935 935 }
936 936 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
937 937 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
938 938 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
939 939 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
940 940 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
941 941 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
942 942 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
943 943 cursor: pointer;
944 944 background-color: #b2d2ff;
945 945 }
946 946 .yui-skin-sam th.yui-dt-selected,
947 947 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
948 948 .yui-skin-sam tr.yui-dt-selected td,
949 949 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
950 950 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
951 951 background-color: #426fd9;
952 952 color: #FFF;
953 953 }
954 954 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
955 955 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
956 956 background-color: #446cd7;
957 957 color: #FFF;
958 958 }
959 959 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
960 960 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
961 961 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
962 962 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
963 963 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
964 964 background-color: #426fd9;
965 965 color: #FFF;
966 966 }
967 967 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
968 968 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
969 969 background-color: #446cd7;
970 970 color: #FFF;
971 971 }
972 972 .yui-skin-sam .yui-dt-paginator {
973 973 display: block;
974 974 margin: 6px 0;
975 975 white-space: nowrap;
976 976 }
977 977 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
978 978 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
979 979 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
980 980 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
981 981 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
982 982 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
983 983 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
984 984 .yui-skin-sam a.yui-dt-page {
985 985 border: 1px solid #cbcbcb;
986 986 padding: 2px 6px;
987 987 text-decoration: none;
988 988 background-color: #fff;
989 989 }
990 990 .yui-skin-sam .yui-dt-selected {
991 991 border: 1px solid #fff;
992 992 background-color: #fff;
993 993 }
994 994
995 995 #content #left {
996 996 left: 0;
997 997 width: 280px;
998 998 position: absolute;
999 999 }
1000 1000
1001 1001 #content #right {
1002 1002 margin: 0 60px 10px 290px;
1003 1003 }
1004 1004
1005 1005 #content div.box {
1006 1006 clear: both;
1007 1007 overflow: hidden;
1008 1008 background: #fff;
1009 1009 margin: 0 0 10px;
1010 1010 padding: 0 0 10px;
1011 1011 -webkit-border-radius: 4px 4px 4px 4px;
1012 1012 -khtml-border-radius: 4px 4px 4px 4px;
1013 1013 -moz-border-radius: 4px 4px 4px 4px;
1014 1014 border-radius: 4px 4px 4px 4px;
1015 1015 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1016 1016 }
1017 1017
1018 1018 #content div.box-left {
1019 1019 width: 49%;
1020 1020 clear: none;
1021 1021 float: left;
1022 1022 margin: 0 0 10px;
1023 1023 }
1024 1024
1025 1025 #content div.box-right {
1026 1026 width: 49%;
1027 1027 clear: none;
1028 1028 float: right;
1029 1029 margin: 0 0 10px;
1030 1030 }
1031 1031
1032 1032 #content div.box div.title {
1033 1033 clear: both;
1034 1034 overflow: hidden;
1035 1035 background-color: #eedc94;
1036 1036 background-repeat: repeat-x;
1037 1037 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
1038 1038 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1039 1039 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1040 1040 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1041 1041 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1042 1042 background-image: -o-linear-gradient(top, #003b76, #00376e);
1043 1043 background-image: linear-gradient(top, #003b76, #00376e);
1044 1044 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1045 1045 margin: 0 0 20px;
1046 1046 padding: 0;
1047 1047 }
1048 1048
1049 1049 #content div.box div.title h5 {
1050 1050 float: left;
1051 1051 border: none;
1052 1052 color: #fff;
1053 1053 text-transform: uppercase;
1054 1054 margin: 0;
1055 1055 padding: 11px 0 11px 10px;
1056 1056 }
1057 1057
1058 1058 #content div.box div.title .link-white{
1059 1059 color: #FFFFFF;
1060 1060 }
1061 1061
1062 1062 #content div.box div.title ul.links li {
1063 1063 list-style: none;
1064 1064 float: left;
1065 1065 margin: 0;
1066 1066 padding: 0;
1067 1067 }
1068 1068
1069 1069 #content div.box div.title ul.links li a {
1070 1070 border-left: 1px solid #316293;
1071 1071 color: #FFFFFF;
1072 1072 display: block;
1073 1073 float: left;
1074 1074 font-size: 13px;
1075 1075 font-weight: 700;
1076 1076 height: 1%;
1077 1077 margin: 0;
1078 1078 padding: 11px 22px 12px;
1079 1079 text-decoration: none;
1080 1080 }
1081 1081
1082 1082 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6
1083 1083 {
1084 1084 clear: both;
1085 1085 overflow: hidden;
1086 1086 border-bottom: 1px solid #DDD;
1087 1087 margin: 10px 20px;
1088 1088 padding: 0 0 15px;
1089 1089 }
1090 1090
1091 1091 #content div.box p {
1092 1092 color: #5f5f5f;
1093 1093 font-size: 12px;
1094 1094 line-height: 150%;
1095 1095 margin: 0 24px 10px;
1096 1096 padding: 0;
1097 1097 }
1098 1098
1099 1099 #content div.box blockquote {
1100 1100 border-left: 4px solid #DDD;
1101 1101 color: #5f5f5f;
1102 1102 font-size: 11px;
1103 1103 line-height: 150%;
1104 1104 margin: 0 34px;
1105 1105 padding: 0 0 0 14px;
1106 1106 }
1107 1107
1108 1108 #content div.box blockquote p {
1109 1109 margin: 10px 0;
1110 1110 padding: 0;
1111 1111 }
1112 1112
1113 1113 #content div.box dl {
1114 1114 margin: 10px 0px;
1115 1115 }
1116 1116
1117 1117 #content div.box dt {
1118 1118 font-size: 12px;
1119 1119 margin: 0;
1120 1120 }
1121 1121
1122 1122 #content div.box dd {
1123 1123 font-size: 12px;
1124 1124 margin: 0;
1125 1125 padding: 8px 0 8px 15px;
1126 1126 }
1127 1127
1128 1128 #content div.box li {
1129 1129 font-size: 12px;
1130 1130 padding: 4px 0;
1131 1131 }
1132 1132
1133 1133 #content div.box ul.disc,#content div.box ul.circle {
1134 1134 margin: 10px 24px 10px 38px;
1135 1135 }
1136 1136
1137 1137 #content div.box ul.square {
1138 1138 margin: 10px 24px 10px 40px;
1139 1139 }
1140 1140
1141 1141 #content div.box img.left {
1142 1142 border: none;
1143 1143 float: left;
1144 1144 margin: 10px 10px 10px 0;
1145 1145 }
1146 1146
1147 1147 #content div.box img.right {
1148 1148 border: none;
1149 1149 float: right;
1150 1150 margin: 10px 0 10px 10px;
1151 1151 }
1152 1152
1153 1153 #content div.box div.messages {
1154 1154 clear: both;
1155 1155 overflow: hidden;
1156 1156 margin: 0 20px;
1157 1157 padding: 0;
1158 1158 }
1159 1159
1160 1160 #content div.box div.message {
1161 1161 clear: both;
1162 1162 overflow: hidden;
1163 1163 margin: 0;
1164 1164 padding: 5px 0;
1165 1165 white-space: pre-wrap;
1166 1166 }
1167 1167 #content div.box div.expand {
1168 1168 width: 110%;
1169 1169 height:14px;
1170 1170 font-size:10px;
1171 1171 text-align:center;
1172 1172 cursor: pointer;
1173 1173 color:#666;
1174 1174
1175 1175 background:-webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1176 1176 background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1177 1177 background:-moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1178 1178 background:-o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1179 1179 background:-ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1180 1180 background:linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1181 1181
1182 1182 display: none;
1183 1183 }
1184 1184 #content div.box div.expand .expandtext {
1185 1185 background-color: #ffffff;
1186 1186 padding: 2px;
1187 1187 border-radius: 2px;
1188 1188 }
1189 1189
1190 1190 #content div.box div.message a {
1191 1191 font-weight: 400 !important;
1192 1192 }
1193 1193
1194 1194 #content div.box div.message div.image {
1195 1195 float: left;
1196 1196 margin: 9px 0 0 5px;
1197 1197 padding: 6px;
1198 1198 }
1199 1199
1200 1200 #content div.box div.message div.image img {
1201 1201 vertical-align: middle;
1202 1202 margin: 0;
1203 1203 }
1204 1204
1205 1205 #content div.box div.message div.text {
1206 1206 float: left;
1207 1207 margin: 0;
1208 1208 padding: 9px 6px;
1209 1209 }
1210 1210
1211 1211 #content div.box div.message div.dismiss a {
1212 1212 height: 16px;
1213 1213 width: 16px;
1214 1214 display: block;
1215 1215 background: url("../images/icons/cross.png") no-repeat;
1216 1216 margin: 15px 14px 0 0;
1217 1217 padding: 0;
1218 1218 }
1219 1219
1220 1220 #content div.box div.message div.text h1,#content div.box div.message div.text h2,#content div.box div.message div.text h3,#content div.box div.message div.text h4,#content div.box div.message div.text h5,#content div.box div.message div.text h6
1221 1221 {
1222 1222 border: none;
1223 1223 margin: 0;
1224 1224 padding: 0;
1225 1225 }
1226 1226
1227 1227 #content div.box div.message div.text span {
1228 1228 height: 1%;
1229 1229 display: block;
1230 1230 margin: 0;
1231 1231 padding: 5px 0 0;
1232 1232 }
1233 1233
1234 1234 #content div.box div.message-error {
1235 1235 height: 1%;
1236 1236 clear: both;
1237 1237 overflow: hidden;
1238 1238 background: #FBE3E4;
1239 1239 border: 1px solid #FBC2C4;
1240 1240 color: #860006;
1241 1241 }
1242 1242
1243 1243 #content div.box div.message-error h6 {
1244 1244 color: #860006;
1245 1245 }
1246 1246
1247 1247 #content div.box div.message-warning {
1248 1248 height: 1%;
1249 1249 clear: both;
1250 1250 overflow: hidden;
1251 1251 background: #FFF6BF;
1252 1252 border: 1px solid #FFD324;
1253 1253 color: #5f5200;
1254 1254 }
1255 1255
1256 1256 #content div.box div.message-warning h6 {
1257 1257 color: #5f5200;
1258 1258 }
1259 1259
1260 1260 #content div.box div.message-notice {
1261 1261 height: 1%;
1262 1262 clear: both;
1263 1263 overflow: hidden;
1264 1264 background: #8FBDE0;
1265 1265 border: 1px solid #6BACDE;
1266 1266 color: #003863;
1267 1267 }
1268 1268
1269 1269 #content div.box div.message-notice h6 {
1270 1270 color: #003863;
1271 1271 }
1272 1272
1273 1273 #content div.box div.message-success {
1274 1274 height: 1%;
1275 1275 clear: both;
1276 1276 overflow: hidden;
1277 1277 background: #E6EFC2;
1278 1278 border: 1px solid #C6D880;
1279 1279 color: #4e6100;
1280 1280 }
1281 1281
1282 1282 #content div.box div.message-success h6 {
1283 1283 color: #4e6100;
1284 1284 }
1285 1285
1286 1286 #content div.box div.form div.fields div.field {
1287 1287 height: 1%;
1288 1288 border-bottom: 1px solid #DDD;
1289 1289 clear: both;
1290 1290 margin: 0;
1291 1291 padding: 10px 0;
1292 1292 }
1293 1293
1294 1294 #content div.box div.form div.fields div.field-first {
1295 1295 padding: 0 0 10px;
1296 1296 }
1297 1297
1298 1298 #content div.box div.form div.fields div.field-noborder {
1299 1299 border-bottom: 0 !important;
1300 1300 }
1301 1301
1302 1302 #content div.box div.form div.fields div.field span.error-message {
1303 1303 height: 1%;
1304 1304 display: inline-block;
1305 1305 color: red;
1306 1306 margin: 8px 0 0 4px;
1307 1307 padding: 0;
1308 1308 }
1309 1309
1310 1310 #content div.box div.form div.fields div.field span.success {
1311 1311 height: 1%;
1312 1312 display: block;
1313 1313 color: #316309;
1314 1314 margin: 8px 0 0;
1315 1315 padding: 0;
1316 1316 }
1317 1317
1318 1318 #content div.box div.form div.fields div.field div.label {
1319 1319 left: 70px;
1320 1320 width: 155px;
1321 1321 position: absolute;
1322 1322 margin: 0;
1323 1323 padding: 5px 0 0 0px;
1324 1324 }
1325 1325
1326 1326 #content div.box div.form div.fields div.field div.label-summary {
1327 1327 left: 30px;
1328 1328 width: 155px;
1329 1329 position: absolute;
1330 1330 margin: 0;
1331 1331 padding: 0px 0 0 0px;
1332 1332 }
1333 1333
1334 1334 #content div.box-left div.form div.fields div.field div.label,
1335 1335 #content div.box-right div.form div.fields div.field div.label,
1336 1336 #content div.box-left div.form div.fields div.field div.label,
1337 1337 #content div.box-left div.form div.fields div.field div.label-summary,
1338 1338 #content div.box-right div.form div.fields div.field div.label-summary,
1339 1339 #content div.box-left div.form div.fields div.field div.label-summary
1340 1340 {
1341 1341 clear: both;
1342 1342 overflow: hidden;
1343 1343 left: 0;
1344 1344 width: auto;
1345 1345 position: relative;
1346 1346 margin: 0;
1347 1347 padding: 0 0 8px;
1348 1348 }
1349 1349
1350 1350 #content div.box div.form div.fields div.field div.label-select {
1351 1351 padding: 5px 0 0 5px;
1352 1352 }
1353 1353
1354 1354 #content div.box-left div.form div.fields div.field div.label-select,
1355 1355 #content div.box-right div.form div.fields div.field div.label-select
1356 1356 {
1357 1357 padding: 0 0 8px;
1358 1358 }
1359 1359
1360 1360 #content div.box-left div.form div.fields div.field div.label-textarea,
1361 1361 #content div.box-right div.form div.fields div.field div.label-textarea
1362 1362 {
1363 1363 padding: 0 0 8px !important;
1364 1364 }
1365 1365
1366 1366 #content div.box div.form div.fields div.field div.label label,div.label label
1367 1367 {
1368 1368 color: #393939;
1369 1369 font-weight: 700;
1370 1370 }
1371 1371 #content div.box div.form div.fields div.field div.label label,div.label-summary label
1372 1372 {
1373 1373 color: #393939;
1374 1374 font-weight: 700;
1375 1375 }
1376 1376 #content div.box div.form div.fields div.field div.input {
1377 1377 margin: 0 0 0 200px;
1378 1378 }
1379 1379
1380 1380 #content div.box div.form div.fields div.field div.input.summary {
1381 1381 margin: 0 0 0 110px;
1382 1382 }
1383 1383 #content div.box div.form div.fields div.field div.input.summary-short {
1384 1384 margin: 0 0 0 110px;
1385 1385 }
1386 1386 #content div.box div.form div.fields div.field div.file {
1387 1387 margin: 0 0 0 200px;
1388 1388 }
1389 1389
1390 1390 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input
1391 1391 {
1392 1392 margin: 0 0 0 0px;
1393 1393 }
1394 1394
1395 1395 #content div.box div.form div.fields div.field div.input input {
1396 1396 background: #FFF;
1397 1397 border-top: 1px solid #b3b3b3;
1398 1398 border-left: 1px solid #b3b3b3;
1399 1399 border-right: 1px solid #eaeaea;
1400 1400 border-bottom: 1px solid #eaeaea;
1401 1401 color: #000;
1402 1402 font-size: 11px;
1403 1403 margin: 0;
1404 1404 padding: 7px 7px 6px;
1405 1405 }
1406 1406
1407 1407 #content div.box div.form div.fields div.field div.input input#clone_url,
1408 1408 #content div.box div.form div.fields div.field div.input input#clone_url_id
1409 1409 {
1410 1410 font-size: 16px;
1411 1411 padding: 2px;
1412 1412 }
1413 1413
1414 1414 #content div.box div.form div.fields div.field div.file input {
1415 1415 background: none repeat scroll 0 0 #FFFFFF;
1416 1416 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1417 1417 border-style: solid;
1418 1418 border-width: 1px;
1419 1419 color: #000000;
1420 1420 font-size: 11px;
1421 1421 margin: 0;
1422 1422 padding: 7px 7px 6px;
1423 1423 }
1424 1424
1425 1425 input.disabled {
1426 1426 background-color: #F5F5F5 !important;
1427 1427 }
1428 1428 #content div.box div.form div.fields div.field div.input input.small {
1429 1429 width: 30%;
1430 1430 }
1431 1431
1432 1432 #content div.box div.form div.fields div.field div.input input.medium {
1433 1433 width: 55%;
1434 1434 }
1435 1435
1436 1436 #content div.box div.form div.fields div.field div.input input.large {
1437 1437 width: 85%;
1438 1438 }
1439 1439
1440 1440 #content div.box div.form div.fields div.field div.input input.date {
1441 1441 width: 177px;
1442 1442 }
1443 1443
1444 1444 #content div.box div.form div.fields div.field div.input input.button {
1445 1445 background: #D4D0C8;
1446 1446 border-top: 1px solid #FFF;
1447 1447 border-left: 1px solid #FFF;
1448 1448 border-right: 1px solid #404040;
1449 1449 border-bottom: 1px solid #404040;
1450 1450 color: #000;
1451 1451 margin: 0;
1452 1452 padding: 4px 8px;
1453 1453 }
1454 1454
1455 1455 #content div.box div.form div.fields div.field div.textarea {
1456 1456 border-top: 1px solid #b3b3b3;
1457 1457 border-left: 1px solid #b3b3b3;
1458 1458 border-right: 1px solid #eaeaea;
1459 1459 border-bottom: 1px solid #eaeaea;
1460 1460 margin: 0 0 0 200px;
1461 1461 padding: 10px;
1462 1462 }
1463 1463
1464 1464 #content div.box div.form div.fields div.field div.textarea-editor {
1465 1465 border: 1px solid #ddd;
1466 1466 padding: 0;
1467 1467 }
1468 1468
1469 1469 #content div.box div.form div.fields div.field div.textarea textarea {
1470 1470 width: 100%;
1471 1471 height: 220px;
1472 1472 overflow: hidden;
1473 1473 background: #FFF;
1474 1474 color: #000;
1475 1475 font-size: 11px;
1476 1476 outline: none;
1477 1477 border-width: 0;
1478 1478 margin: 0;
1479 1479 padding: 0;
1480 1480 }
1481 1481
1482 1482 #content div.box-left div.form div.fields div.field div.textarea textarea,#content div.box-right div.form div.fields div.field div.textarea textarea
1483 1483 {
1484 1484 width: 100%;
1485 1485 height: 100px;
1486 1486 }
1487 1487
1488 1488 #content div.box div.form div.fields div.field div.textarea table {
1489 1489 width: 100%;
1490 1490 border: none;
1491 1491 margin: 0;
1492 1492 padding: 0;
1493 1493 }
1494 1494
1495 1495 #content div.box div.form div.fields div.field div.textarea table td {
1496 1496 background: #DDD;
1497 1497 border: none;
1498 1498 padding: 0;
1499 1499 }
1500 1500
1501 1501 #content div.box div.form div.fields div.field div.textarea table td table
1502 1502 {
1503 1503 width: auto;
1504 1504 border: none;
1505 1505 margin: 0;
1506 1506 padding: 0;
1507 1507 }
1508 1508
1509 1509 #content div.box div.form div.fields div.field div.textarea table td table td
1510 1510 {
1511 1511 font-size: 11px;
1512 1512 padding: 5px 5px 5px 0;
1513 1513 }
1514 1514
1515 1515 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus
1516 1516 {
1517 1517 background: #f6f6f6;
1518 1518 border-color: #666;
1519 1519 }
1520 1520
1521 1521 div.form div.fields div.field div.button {
1522 1522 margin: 0;
1523 1523 padding: 0 0 0 8px;
1524 1524 }
1525 1525 #content div.box table.noborder {
1526 1526 border: 1px solid transparent;
1527 1527 }
1528 1528
1529 1529 #content div.box table {
1530 1530 width: 100%;
1531 1531 border-collapse: separate;
1532 1532 margin: 0;
1533 1533 padding: 0;
1534 1534 border: 1px solid #eee;
1535 1535 -webkit-border-radius: 4px;
1536 1536 -moz-border-radius: 4px;
1537 1537 border-radius: 4px;
1538 1538 }
1539 1539
1540 1540 #content div.box table th {
1541 1541 background: #eee;
1542 1542 border-bottom: 1px solid #ddd;
1543 1543 padding: 5px 0px 5px 5px;
1544 1544 }
1545 1545
1546 1546 #content div.box table th.left {
1547 1547 text-align: left;
1548 1548 }
1549 1549
1550 1550 #content div.box table th.right {
1551 1551 text-align: right;
1552 1552 }
1553 1553
1554 1554 #content div.box table th.center {
1555 1555 text-align: center;
1556 1556 }
1557 1557
1558 1558 #content div.box table th.selected {
1559 1559 vertical-align: middle;
1560 1560 padding: 0;
1561 1561 }
1562 1562
1563 1563 #content div.box table td {
1564 1564 background: #fff;
1565 1565 border-bottom: 1px solid #cdcdcd;
1566 1566 vertical-align: middle;
1567 1567 padding: 5px;
1568 1568 }
1569 1569
1570 1570 #content div.box table tr.selected td {
1571 1571 background: #FFC;
1572 1572 }
1573 1573
1574 1574 #content div.box table td.selected {
1575 1575 width: 3%;
1576 1576 text-align: center;
1577 1577 vertical-align: middle;
1578 1578 padding: 0;
1579 1579 }
1580 1580
1581 1581 #content div.box table td.action {
1582 1582 width: 45%;
1583 1583 text-align: left;
1584 1584 }
1585 1585
1586 1586 #content div.box table td.date {
1587 1587 width: 33%;
1588 1588 text-align: center;
1589 1589 }
1590 1590
1591 1591 #content div.box div.action {
1592 1592 float: right;
1593 1593 background: #FFF;
1594 1594 text-align: right;
1595 1595 margin: 10px 0 0;
1596 1596 padding: 0;
1597 1597 }
1598 1598
1599 1599 #content div.box div.action select {
1600 1600 font-size: 11px;
1601 1601 margin: 0;
1602 1602 }
1603 1603
1604 1604 #content div.box div.action .ui-selectmenu {
1605 1605 margin: 0;
1606 1606 padding: 0;
1607 1607 }
1608 1608
1609 1609 #content div.box div.pagination {
1610 1610 height: 1%;
1611 1611 clear: both;
1612 1612 overflow: hidden;
1613 1613 margin: 10px 0 0;
1614 1614 padding: 0;
1615 1615 }
1616 1616
1617 1617 #content div.box div.pagination ul.pager {
1618 1618 float: right;
1619 1619 text-align: right;
1620 1620 margin: 0;
1621 1621 padding: 0;
1622 1622 }
1623 1623
1624 1624 #content div.box div.pagination ul.pager li {
1625 1625 height: 1%;
1626 1626 float: left;
1627 1627 list-style: none;
1628 1628 background: #ebebeb url("../images/pager.png") repeat-x;
1629 1629 border-top: 1px solid #dedede;
1630 1630 border-left: 1px solid #cfcfcf;
1631 1631 border-right: 1px solid #c4c4c4;
1632 1632 border-bottom: 1px solid #c4c4c4;
1633 1633 color: #4A4A4A;
1634 1634 font-weight: 700;
1635 1635 margin: 0 0 0 4px;
1636 1636 padding: 0;
1637 1637 }
1638 1638
1639 1639 #content div.box div.pagination ul.pager li.separator {
1640 1640 padding: 6px;
1641 1641 }
1642 1642
1643 1643 #content div.box div.pagination ul.pager li.current {
1644 1644 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1645 1645 border-top: 1px solid #ccc;
1646 1646 border-left: 1px solid #bebebe;
1647 1647 border-right: 1px solid #b1b1b1;
1648 1648 border-bottom: 1px solid #afafaf;
1649 1649 color: #515151;
1650 1650 padding: 6px;
1651 1651 }
1652 1652
1653 1653 #content div.box div.pagination ul.pager li a {
1654 1654 height: 1%;
1655 1655 display: block;
1656 1656 float: left;
1657 1657 color: #515151;
1658 1658 text-decoration: none;
1659 1659 margin: 0;
1660 1660 padding: 6px;
1661 1661 }
1662 1662
1663 1663 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active
1664 1664 {
1665 1665 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1666 1666 border-top: 1px solid #ccc;
1667 1667 border-left: 1px solid #bebebe;
1668 1668 border-right: 1px solid #b1b1b1;
1669 1669 border-bottom: 1px solid #afafaf;
1670 1670 margin: -1px;
1671 1671 }
1672 1672
1673 1673 #content div.box div.pagination-wh {
1674 1674 height: 1%;
1675 1675 clear: both;
1676 1676 overflow: hidden;
1677 1677 text-align: right;
1678 1678 margin: 10px 0 0;
1679 1679 padding: 0;
1680 1680 }
1681 1681
1682 1682 #content div.box div.pagination-right {
1683 1683 float: right;
1684 1684 }
1685 1685
1686 1686 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot
1687 1687 {
1688 1688 height: 1%;
1689 1689 float: left;
1690 1690 background: #ebebeb url("../images/pager.png") repeat-x;
1691 1691 border-top: 1px solid #dedede;
1692 1692 border-left: 1px solid #cfcfcf;
1693 1693 border-right: 1px solid #c4c4c4;
1694 1694 border-bottom: 1px solid #c4c4c4;
1695 1695 color: #4A4A4A;
1696 1696 font-weight: 700;
1697 1697 margin: 0 0 0 4px;
1698 1698 padding: 6px;
1699 1699 }
1700 1700
1701 1701 #content div.box div.pagination-wh span.pager_curpage {
1702 1702 height: 1%;
1703 1703 float: left;
1704 1704 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1705 1705 border-top: 1px solid #ccc;
1706 1706 border-left: 1px solid #bebebe;
1707 1707 border-right: 1px solid #b1b1b1;
1708 1708 border-bottom: 1px solid #afafaf;
1709 1709 color: #515151;
1710 1710 font-weight: 700;
1711 1711 margin: 0 0 0 4px;
1712 1712 padding: 6px;
1713 1713 }
1714 1714
1715 1715 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active
1716 1716 {
1717 1717 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1718 1718 border-top: 1px solid #ccc;
1719 1719 border-left: 1px solid #bebebe;
1720 1720 border-right: 1px solid #b1b1b1;
1721 1721 border-bottom: 1px solid #afafaf;
1722 1722 text-decoration: none;
1723 1723 }
1724 1724
1725 1725 #content div.box div.traffic div.legend {
1726 1726 clear: both;
1727 1727 overflow: hidden;
1728 1728 border-bottom: 1px solid #ddd;
1729 1729 margin: 0 0 10px;
1730 1730 padding: 0 0 10px;
1731 1731 }
1732 1732
1733 1733 #content div.box div.traffic div.legend h6 {
1734 1734 float: left;
1735 1735 border: none;
1736 1736 margin: 0;
1737 1737 padding: 0;
1738 1738 }
1739 1739
1740 1740 #content div.box div.traffic div.legend li {
1741 1741 list-style: none;
1742 1742 float: left;
1743 1743 font-size: 11px;
1744 1744 margin: 0;
1745 1745 padding: 0 8px 0 4px;
1746 1746 }
1747 1747
1748 1748 #content div.box div.traffic div.legend li.visits {
1749 1749 border-left: 12px solid #edc240;
1750 1750 }
1751 1751
1752 1752 #content div.box div.traffic div.legend li.pageviews {
1753 1753 border-left: 12px solid #afd8f8;
1754 1754 }
1755 1755
1756 1756 #content div.box div.traffic table {
1757 1757 width: auto;
1758 1758 }
1759 1759
1760 1760 #content div.box div.traffic table td {
1761 1761 background: transparent;
1762 1762 border: none;
1763 1763 padding: 2px 3px 3px;
1764 1764 }
1765 1765
1766 1766 #content div.box div.traffic table td.legendLabel {
1767 1767 padding: 0 3px 2px;
1768 1768 }
1769 1769
1770 1770 #summary {
1771 1771
1772 1772 }
1773 1773
1774 1774 #summary .desc {
1775 1775 white-space: pre;
1776 1776 width: 100%;
1777 1777 }
1778 1778
1779 1779 #summary .repo_name {
1780 1780 font-size: 1.6em;
1781 1781 font-weight: bold;
1782 1782 vertical-align: baseline;
1783 1783 clear: right
1784 1784 }
1785 1785
1786 1786 #footer {
1787 1787 clear: both;
1788 1788 overflow: hidden;
1789 1789 text-align: right;
1790 1790 margin: 0;
1791 1791 padding: 0 10px 4px;
1792 1792 margin: -10px 0 0;
1793 1793 }
1794 1794
1795 1795 #footer div#footer-inner {
1796 1796 background-color: #eedc94; background-repeat : repeat-x;
1797 1797 background-image : -khtml-gradient( linear, left top, left bottom,
1798 1798 from( #fceec1), to( #eedc94)); background-image : -moz-linear-gradient(
1799 1799 top, #003b76, #00376e); background-image : -ms-linear-gradient( top,
1800 1800 #003b76, #00376e); background-image : -webkit-gradient( linear, left
1801 1801 top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1802 1802 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1803 1803 background-image : -o-linear-gradient( top, #003b76, #00376e));
1804 1804 background-image : linear-gradient( top, #003b76, #00376e); filter :
1805 1805 progid : DXImageTransform.Microsoft.gradient ( startColorstr =
1806 1806 '#003b76', endColorstr = '#00376e', GradientType = 0);
1807 1807 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1808 1808 -webkit-border-radius: 4px 4px 4px 4px;
1809 1809 -khtml-border-radius: 4px 4px 4px 4px;
1810 1810 -moz-border-radius: 4px 4px 4px 4px;
1811 1811 border-radius: 4px 4px 4px 4px;
1812 1812 background-repeat: repeat-x;
1813 1813 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1814 1814 to(#eedc94) );
1815 1815 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1816 1816 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1817 1817 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1818 1818 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1819 1819 background-image: -o-linear-gradient(top, #003b76, #00376e);
1820 1820 background-image: linear-gradient(top, #003b76, #00376e);
1821 1821 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1822 1822 endColorstr='#00376e', GradientType=0 );
1823 1823 }
1824 1824
1825 1825 #footer div#footer-inner p {
1826 1826 padding: 15px 25px 15px 0;
1827 1827 color: #FFF;
1828 1828 font-weight: 700;
1829 1829 }
1830 1830
1831 1831 #footer div#footer-inner .footer-link {
1832 1832 float: left;
1833 1833 padding-left: 10px;
1834 1834 }
1835 1835
1836 1836 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a
1837 1837 {
1838 1838 color: #FFF;
1839 1839 }
1840 1840
1841 1841 #login div.title {
1842 1842 width: 420px;
1843 1843 clear: both;
1844 1844 overflow: hidden;
1845 1845 position: relative;
1846 1846 background-color: #eedc94; background-repeat : repeat-x;
1847 1847 background-image : -khtml-gradient( linear, left top, left bottom,
1848 1848 from( #fceec1), to( #eedc94)); background-image : -moz-linear-gradient(
1849 1849 top, #003b76, #00376e); background-image : -ms-linear-gradient( top,
1850 1850 #003b76, #00376e); background-image : -webkit-gradient( linear, left
1851 1851 top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1852 1852 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1853 1853 background-image : -o-linear-gradient( top, #003b76, #00376e));
1854 1854 background-image : linear-gradient( top, #003b76, #00376e); filter :
1855 1855 progid : DXImageTransform.Microsoft.gradient ( startColorstr =
1856 1856 '#003b76', endColorstr = '#00376e', GradientType = 0);
1857 1857 margin: 0 auto;
1858 1858 padding: 0;
1859 1859 background-repeat: repeat-x;
1860 1860 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1861 1861 to(#eedc94) );
1862 1862 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1863 1863 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1864 1864 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1865 1865 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1866 1866 background-image: -o-linear-gradient(top, #003b76, #00376e);
1867 1867 background-image: linear-gradient(top, #003b76, #00376e);
1868 1868 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1869 1869 endColorstr='#00376e', GradientType=0 );
1870 1870 }
1871 1871
1872 1872 #login div.inner {
1873 1873 width: 380px;
1874 1874 background: #FFF url("../images/login.png") no-repeat top left;
1875 1875 border-top: none;
1876 1876 border-bottom: none;
1877 1877 margin: 0 auto;
1878 1878 padding: 20px;
1879 1879 }
1880 1880
1881 1881 #login div.form div.fields div.field div.label {
1882 1882 width: 173px;
1883 1883 float: left;
1884 1884 text-align: right;
1885 1885 margin: 2px 10px 0 0;
1886 1886 padding: 5px 0 0 5px;
1887 1887 }
1888 1888
1889 1889 #login div.form div.fields div.field div.input input {
1890 1890 width: 176px;
1891 1891 background: #FFF;
1892 1892 border-top: 1px solid #b3b3b3;
1893 1893 border-left: 1px solid #b3b3b3;
1894 1894 border-right: 1px solid #eaeaea;
1895 1895 border-bottom: 1px solid #eaeaea;
1896 1896 color: #000;
1897 1897 font-size: 11px;
1898 1898 margin: 0;
1899 1899 padding: 7px 7px 6px;
1900 1900 }
1901 1901
1902 1902 #login div.form div.fields div.buttons {
1903 1903 clear: both;
1904 1904 overflow: hidden;
1905 1905 border-top: 1px solid #DDD;
1906 1906 text-align: right;
1907 1907 margin: 0;
1908 1908 padding: 10px 0 0;
1909 1909 }
1910 1910
1911 1911 #login div.form div.links {
1912 1912 clear: both;
1913 1913 overflow: hidden;
1914 1914 margin: 10px 0 0;
1915 1915 padding: 0 0 2px;
1916 1916 }
1917 1917
1918 1918 .user-menu{
1919 1919 margin: 0px !important;
1920 1920 float: left;
1921 1921 }
1922 1922
1923 1923 .user-menu .container{
1924 1924 padding:0px 4px 0px 4px;
1925 1925 margin: 0px 0px 0px 0px;
1926 1926 }
1927 1927
1928 1928 .user-menu .gravatar{
1929 1929 margin: 0px 0px 0px 0px;
1930 1930 cursor: pointer;
1931 1931 }
1932 1932 .user-menu .gravatar.enabled{
1933 1933 background-color: #FDF784 !important;
1934 1934 }
1935 1935 .user-menu .gravatar:hover{
1936 1936 background-color: #FDF784 !important;
1937 1937 }
1938 1938 #quick_login{
1939 1939 min-height: 80px;
1940 1940 margin: 37px 0 0 -251px;
1941 1941 padding: 4px;
1942 1942 position: absolute;
1943 1943 width: 278px;
1944 1944
1945 1945 background-repeat: repeat-x;
1946 1946 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1947 1947 to(#eedc94) );
1948 1948 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1949 1949 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1950 1950 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1951 1951 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1952 1952 background-image: -o-linear-gradient(top, #003b76, #00376e);
1953 1953 background-image: linear-gradient(top, #003b76, #00376e);
1954 1954 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1955 1955 endColorstr='#00376e', GradientType=0 );
1956 1956
1957 1957 z-index: 999;
1958 1958 -webkit-border-radius: 0px 0px 4px 4px;
1959 1959 -khtml-border-radius: 0px 0px 4px 4px;
1960 1960 -moz-border-radius: 0px 0px 4px 4px;
1961 1961 border-radius: 0px 0px 4px 4px;
1962 1962 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1963 1963 }
1964 1964 #quick_login h4{
1965 1965 color: #fff;
1966 1966 padding: 5px 0px 5px 14px;
1967 1967 }
1968 1968
1969 1969 #quick_login .password_forgoten {
1970 1970 padding-right: 10px;
1971 1971 padding-top: 0px;
1972 1972 text-align: left;
1973 1973 }
1974 1974
1975 1975 #quick_login .password_forgoten a {
1976 1976 font-size: 10px;
1977 1977 color: #fff;
1978 1978 }
1979 1979
1980 1980 #quick_login .register {
1981 1981 padding-right: 10px;
1982 1982 padding-top: 5px;
1983 1983 text-align: left;
1984 1984 }
1985 1985
1986 1986 #quick_login .register a {
1987 1987 font-size: 10px;
1988 1988 color: #fff;
1989 1989 }
1990 1990
1991 1991 #quick_login .submit {
1992 1992 margin: -20px 0 0 0px;
1993 1993 position: absolute;
1994 1994 right: 15px;
1995 1995 }
1996 1996
1997 1997 #quick_login .links_left{
1998 1998 float: left;
1999 1999 }
2000 2000 #quick_login .links_right{
2001 2001 float: right;
2002 2002 }
2003 2003 #quick_login .full_name{
2004 2004 color: #FFFFFF;
2005 2005 font-weight: bold;
2006 2006 padding: 3px;
2007 2007 }
2008 2008 #quick_login .big_gravatar{
2009 2009 padding:4px 0px 0px 6px;
2010 2010 }
2011 2011 #quick_login .inbox{
2012 2012 padding:4px 0px 0px 6px;
2013 2013 color: #FFFFFF;
2014 2014 font-weight: bold;
2015 2015 }
2016 2016 #quick_login .inbox a{
2017 2017 color: #FFFFFF;
2018 2018 }
2019 2019 #quick_login .email,#quick_login .email a{
2020 2020 color: #FFFFFF;
2021 2021 padding: 3px;
2022 2022
2023 2023 }
2024 2024 #quick_login .links .logout{
2025 2025
2026 2026 }
2027 2027
2028 2028 #quick_login div.form div.fields {
2029 2029 padding-top: 2px;
2030 2030 padding-left: 10px;
2031 2031 }
2032 2032
2033 2033 #quick_login div.form div.fields div.field {
2034 2034 padding: 5px;
2035 2035 }
2036 2036
2037 2037 #quick_login div.form div.fields div.field div.label label {
2038 2038 color: #fff;
2039 2039 padding-bottom: 3px;
2040 2040 }
2041 2041
2042 2042 #quick_login div.form div.fields div.field div.input input {
2043 2043 width: 236px;
2044 2044 background: #FFF;
2045 2045 border-top: 1px solid #b3b3b3;
2046 2046 border-left: 1px solid #b3b3b3;
2047 2047 border-right: 1px solid #eaeaea;
2048 2048 border-bottom: 1px solid #eaeaea;
2049 2049 color: #000;
2050 2050 font-size: 11px;
2051 2051 margin: 0;
2052 2052 padding: 5px 7px 4px;
2053 2053 }
2054 2054
2055 2055 #quick_login div.form div.fields div.buttons {
2056 2056 clear: both;
2057 2057 overflow: hidden;
2058 2058 text-align: right;
2059 2059 margin: 0;
2060 2060 padding: 5px 14px 0px 5px;
2061 2061 }
2062 2062
2063 2063 #quick_login div.form div.links {
2064 2064 clear: both;
2065 2065 overflow: hidden;
2066 2066 margin: 10px 0 0;
2067 2067 padding: 0 0 2px;
2068 2068 }
2069 2069
2070 2070 #quick_login ol.links{
2071 2071 display: block;
2072 2072 font-weight: bold;
2073 2073 list-style: none outside none;
2074 2074 text-align: right;
2075 2075 }
2076 2076 #quick_login ol.links li{
2077 2077 line-height: 27px;
2078 2078 margin: 0;
2079 2079 padding: 0;
2080 2080 color: #fff;
2081 2081 display: block;
2082 2082 float:none !important;
2083 2083 }
2084 2084
2085 2085 #quick_login ol.links li a{
2086 2086 color: #fff;
2087 2087 display: block;
2088 2088 padding: 2px;
2089 2089 }
2090 2090 #quick_login ol.links li a:HOVER{
2091 2091 background-color: inherit !important;
2092 2092 }
2093 2093
2094 2094 #register div.title {
2095 2095 clear: both;
2096 2096 overflow: hidden;
2097 2097 position: relative;
2098 2098 background-color: #eedc94;
2099 2099 background-repeat: repeat-x;
2100 2100 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
2101 2101 to(#eedc94) );
2102 2102 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2103 2103 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2104 2104 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2105 2105 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2106 2106 background-image: -o-linear-gradient(top, #003b76, #00376e);
2107 2107 background-image: linear-gradient(top, #003b76, #00376e);
2108 2108 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2109 2109 endColorstr='#00376e', GradientType=0 );
2110 2110 margin: 0 auto;
2111 2111 padding: 0;
2112 2112 }
2113 2113
2114 2114 #register div.inner {
2115 2115 background: #FFF;
2116 2116 border-top: none;
2117 2117 border-bottom: none;
2118 2118 margin: 0 auto;
2119 2119 padding: 20px;
2120 2120 }
2121 2121
2122 2122 #register div.form div.fields div.field div.label {
2123 2123 width: 135px;
2124 2124 float: left;
2125 2125 text-align: right;
2126 2126 margin: 2px 10px 0 0;
2127 2127 padding: 5px 0 0 5px;
2128 2128 }
2129 2129
2130 2130 #register div.form div.fields div.field div.input input {
2131 2131 width: 300px;
2132 2132 background: #FFF;
2133 2133 border-top: 1px solid #b3b3b3;
2134 2134 border-left: 1px solid #b3b3b3;
2135 2135 border-right: 1px solid #eaeaea;
2136 2136 border-bottom: 1px solid #eaeaea;
2137 2137 color: #000;
2138 2138 font-size: 11px;
2139 2139 margin: 0;
2140 2140 padding: 7px 7px 6px;
2141 2141 }
2142 2142
2143 2143 #register div.form div.fields div.buttons {
2144 2144 clear: both;
2145 2145 overflow: hidden;
2146 2146 border-top: 1px solid #DDD;
2147 2147 text-align: left;
2148 2148 margin: 0;
2149 2149 padding: 10px 0 0 150px;
2150 2150 }
2151 2151
2152 2152 #register div.form div.activation_msg {
2153 2153 padding-top: 4px;
2154 2154 padding-bottom: 4px;
2155 2155 }
2156 2156
2157 2157 #journal .journal_day {
2158 2158 font-size: 20px;
2159 2159 padding: 10px 0px;
2160 2160 border-bottom: 2px solid #DDD;
2161 2161 margin-left: 10px;
2162 2162 margin-right: 10px;
2163 2163 }
2164 2164
2165 2165 #journal .journal_container {
2166 2166 padding: 5px;
2167 2167 clear: both;
2168 2168 margin: 0px 5px 0px 10px;
2169 2169 }
2170 2170
2171 2171 #journal .journal_action_container {
2172 2172 padding-left: 38px;
2173 2173 }
2174 2174
2175 2175 #journal .journal_user {
2176 2176 color: #747474;
2177 2177 font-size: 14px;
2178 2178 font-weight: bold;
2179 2179 height: 30px;
2180 2180 }
2181 2181
2182 2182 #journal .journal_icon {
2183 2183 clear: both;
2184 2184 float: left;
2185 2185 padding-right: 4px;
2186 2186 padding-top: 3px;
2187 2187 }
2188 2188
2189 2189 #journal .journal_action {
2190 2190 padding-top: 4px;
2191 2191 min-height: 2px;
2192 2192 float: left
2193 2193 }
2194 2194
2195 2195 #journal .journal_action_params {
2196 2196 clear: left;
2197 2197 padding-left: 22px;
2198 2198 }
2199 2199
2200 2200 #journal .journal_repo {
2201 2201 float: left;
2202 2202 margin-left: 6px;
2203 2203 padding-top: 3px;
2204 2204 }
2205 2205
2206 2206 #journal .date {
2207 2207 clear: both;
2208 2208 color: #777777;
2209 2209 font-size: 11px;
2210 2210 padding-left: 22px;
2211 2211 }
2212 2212
2213 2213 #journal .journal_repo .journal_repo_name {
2214 2214 font-weight: bold;
2215 2215 font-size: 1.1em;
2216 2216 }
2217 2217
2218 2218 #journal .compare_view {
2219 2219 padding: 5px 0px 5px 0px;
2220 2220 width: 95px;
2221 2221 }
2222 2222
2223 2223 .journal_highlight {
2224 2224 font-weight: bold;
2225 2225 padding: 0 2px;
2226 2226 vertical-align: bottom;
2227 2227 }
2228 2228
2229 2229 .trending_language_tbl,.trending_language_tbl td {
2230 2230 border: 0 !important;
2231 2231 margin: 0 !important;
2232 2232 padding: 0 !important;
2233 2233 }
2234 2234
2235 2235 .trending_language_tbl,.trending_language_tbl tr {
2236 2236 border-spacing: 1px;
2237 2237 }
2238 2238
2239 2239 .trending_language {
2240 2240 background-color: #003367;
2241 2241 color: #FFF;
2242 2242 display: block;
2243 2243 min-width: 20px;
2244 2244 text-decoration: none;
2245 2245 height: 12px;
2246 2246 margin-bottom: 0px;
2247 2247 margin-left: 5px;
2248 2248 white-space: pre;
2249 2249 padding: 3px;
2250 2250 }
2251 2251
2252 2252 h3.files_location {
2253 2253 font-size: 1.8em;
2254 2254 font-weight: 700;
2255 2255 border-bottom: none !important;
2256 2256 margin: 10px 0 !important;
2257 2257 }
2258 2258
2259 2259 #files_data dl dt {
2260 2260 float: left;
2261 2261 width: 60px;
2262 2262 margin: 0 !important;
2263 2263 padding: 5px;
2264 2264 }
2265 2265
2266 2266 #files_data dl dd {
2267 2267 margin: 0 !important;
2268 2268 padding: 5px !important;
2269 2269 }
2270 2270
2271 2271 .tablerow0 {
2272 2272 background-color: #F8F8F8;
2273 2273 }
2274 2274
2275 2275 .tablerow1 {
2276 2276 background-color: #FFFFFF;
2277 2277 }
2278 2278
2279 2279 .changeset_id {
2280 2280 font-family: monospace;
2281 2281 color: #666666;
2282 2282 }
2283 2283
2284 2284 .changeset_hash {
2285 2285 color: #000000;
2286 2286 }
2287 2287
2288 2288 #changeset_content {
2289 2289 border-left: 1px solid #CCC;
2290 2290 border-right: 1px solid #CCC;
2291 2291 border-bottom: 1px solid #CCC;
2292 2292 padding: 5px;
2293 2293 }
2294 2294
2295 2295 #changeset_compare_view_content {
2296 2296 border: 1px solid #CCC;
2297 2297 padding: 5px;
2298 2298 }
2299 2299
2300 2300 #changeset_content .container {
2301 2301 min-height: 100px;
2302 2302 font-size: 1.2em;
2303 2303 overflow: hidden;
2304 2304 }
2305 2305
2306 2306 #changeset_compare_view_content .compare_view_commits {
2307 2307 width: auto !important;
2308 2308 }
2309 2309
2310 2310 #changeset_compare_view_content .compare_view_commits td {
2311 2311 padding: 0px 0px 0px 12px !important;
2312 2312 }
2313 2313
2314 2314 #changeset_content .container .right {
2315 2315 float: right;
2316 2316 width: 20%;
2317 2317 text-align: right;
2318 2318 }
2319 2319
2320 2320 #changeset_content .container .left .message {
2321 2321 white-space: pre-wrap;
2322 2322 }
2323 2323 #changeset_content .container .left .message a:hover {
2324 2324 text-decoration: none;
2325 2325 }
2326 2326 .cs_files .cur_cs {
2327 2327 margin: 10px 2px;
2328 2328 font-weight: bold;
2329 2329 }
2330 2330
2331 2331 .cs_files .node {
2332 2332 float: left;
2333 2333 }
2334 2334
2335 2335 .cs_files .changes {
2336 2336 float: right;
2337 2337 color:#003367;
2338 2338
2339 2339 }
2340 2340
2341 2341 .cs_files .changes .added {
2342 2342 background-color: #BBFFBB;
2343 2343 float: left;
2344 2344 text-align: center;
2345 2345 font-size: 9px;
2346 2346 padding: 2px 0px 2px 0px;
2347 2347 }
2348 2348
2349 2349 .cs_files .changes .deleted {
2350 2350 background-color: #FF8888;
2351 2351 float: left;
2352 2352 text-align: center;
2353 2353 font-size: 9px;
2354 2354 padding: 2px 0px 2px 0px;
2355 2355 }
2356 2356
2357 2357 .cs_files .cs_added {
2358 2358 background: url("../images/icons/page_white_add.png") no-repeat scroll
2359 2359 3px;
2360 2360 height: 16px;
2361 2361 padding-left: 20px;
2362 2362 margin-top: 7px;
2363 2363 text-align: left;
2364 2364 }
2365 2365
2366 2366 .cs_files .cs_changed {
2367 2367 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2368 2368 3px;
2369 2369 height: 16px;
2370 2370 padding-left: 20px;
2371 2371 margin-top: 7px;
2372 2372 text-align: left;
2373 2373 }
2374 2374
2375 2375 .cs_files .cs_removed {
2376 2376 background: url("../images/icons/page_white_delete.png") no-repeat
2377 2377 scroll 3px;
2378 2378 height: 16px;
2379 2379 padding-left: 20px;
2380 2380 margin-top: 7px;
2381 2381 text-align: left;
2382 2382 }
2383 2383
2384 2384 #graph {
2385 2385 overflow: hidden;
2386 2386 }
2387 2387
2388 2388 #graph_nodes {
2389 2389 float: left;
2390 2390 margin-right: -6px;
2391 2391 margin-top: 0px;
2392 2392 }
2393 2393
2394 2394 #graph_content {
2395 2395 width: 80%;
2396 2396 float: left;
2397 2397 }
2398 2398
2399 2399 #graph_content .container_header {
2400 2400 border-bottom: 1px solid #DDD;
2401 2401 padding: 10px;
2402 2402 height: 25px;
2403 2403 }
2404 2404
2405 2405 #graph_content #rev_range_container {
2406 2406 padding: 7px 20px;
2407 2407 float: left;
2408 2408 }
2409 2409
2410 2410 #graph_content .container {
2411 2411 border-bottom: 1px solid #DDD;
2412 2412 height: 56px;
2413 2413 overflow: hidden;
2414 2414 }
2415 2415
2416 2416 #graph_content .container .right {
2417 2417 float: right;
2418 2418 width: 23%;
2419 2419 text-align: right;
2420 2420 }
2421 2421
2422 2422 #graph_content .container .left {
2423 2423 float: left;
2424 2424 width: 25%;
2425 2425 padding-left: 5px;
2426 2426 }
2427 2427
2428 2428 #graph_content .container .mid {
2429 2429 float: left;
2430 2430 width: 49%;
2431 2431 }
2432 2432
2433 2433
2434 2434 #graph_content .container .left .date {
2435 2435 color: #666;
2436 2436 padding-left: 22px;
2437 2437 font-size: 10px;
2438 2438 }
2439 2439
2440 2440 #graph_content .container .left .author {
2441 2441 height: 22px;
2442 2442 }
2443 2443
2444 2444 #graph_content .container .left .author .user {
2445 2445 color: #444444;
2446 2446 float: left;
2447 2447 margin-left: -4px;
2448 2448 margin-top: 4px;
2449 2449 }
2450 2450
2451 2451 #graph_content .container .mid .message {
2452 2452 white-space: pre-wrap;
2453 2453 }
2454 2454
2455 2455 #graph_content .container .mid .message a:hover{
2456 2456 text-decoration: none;
2457 2457 }
2458 2458 #content #graph_content .message .revision-link,
2459 2459 #changeset_content .container .message .revision-link
2460 2460 {
2461 2461 color:#3F6F9F;
2462 2462 font-weight: bold !important;
2463 2463 }
2464 2464
2465 2465 #content #graph_content .message .issue-tracker-link,
2466 2466 #changeset_content .container .message .issue-tracker-link{
2467 2467 color:#3F6F9F;
2468 2468 font-weight: bold !important;
2469 2469 }
2470 2470
2471 2471 .right .comments-container{
2472 2472 padding-right: 5px;
2473 2473 margin-top:1px;
2474 2474 float:right;
2475 2475 height:14px;
2476 2476 }
2477 2477
2478 2478 .right .comments-cnt{
2479 2479 float: left;
2480 2480 color: rgb(136, 136, 136);
2481 2481 padding-right: 2px;
2482 2482 }
2483 2483
2484 2484 .right .changes{
2485 2485 clear: both;
2486 2486 }
2487 2487
2488 2488 .right .changes .changed_total {
2489 2489 display: block;
2490 2490 float: right;
2491 2491 text-align: center;
2492 2492 min-width: 45px;
2493 2493 cursor: pointer;
2494 2494 color: #444444;
2495 2495 background: #FEA;
2496 2496 -webkit-border-radius: 0px 0px 0px 6px;
2497 2497 -moz-border-radius: 0px 0px 0px 6px;
2498 2498 border-radius: 0px 0px 0px 6px;
2499 2499 padding: 1px;
2500 2500 }
2501 2501
2502 2502 .right .changes .added,.changed,.removed {
2503 2503 display: block;
2504 2504 padding: 1px;
2505 2505 color: #444444;
2506 2506 float: right;
2507 2507 text-align: center;
2508 2508 min-width: 15px;
2509 2509 }
2510 2510
2511 2511 .right .changes .added {
2512 2512 background: #CFC;
2513 2513 }
2514 2514
2515 2515 .right .changes .changed {
2516 2516 background: #FEA;
2517 2517 }
2518 2518
2519 2519 .right .changes .removed {
2520 2520 background: #FAA;
2521 2521 }
2522 2522
2523 2523 .right .merge {
2524 2524 padding: 1px 3px 1px 3px;
2525 2525 background-color: #fca062;
2526 2526 font-size: 10px;
2527 2527 font-weight: bold;
2528 2528 color: #ffffff;
2529 2529 text-transform: uppercase;
2530 2530 white-space: nowrap;
2531 2531 -webkit-border-radius: 3px;
2532 2532 -moz-border-radius: 3px;
2533 2533 border-radius: 3px;
2534 2534 margin-right: 2px;
2535 2535 }
2536 2536
2537 2537 .right .parent {
2538 2538 color: #666666;
2539 2539 clear:both;
2540 2540 }
2541 2541 .right .logtags{
2542 2542 padding: 2px 2px 2px 2px;
2543 2543 }
2544 2544 .right .logtags .branchtag,.logtags .branchtag {
2545 2545 padding: 1px 3px 1px 3px;
2546 2546 background-color: #bfbfbf;
2547 2547 font-size: 10px;
2548 2548 font-weight: bold;
2549 2549 color: #ffffff;
2550 2550 text-transform: uppercase;
2551 2551 white-space: nowrap;
2552 2552 -webkit-border-radius: 3px;
2553 2553 -moz-border-radius: 3px;
2554 2554 border-radius: 3px;
2555 2555 }
2556 2556 .right .logtags .branchtag a:hover,.logtags .branchtag a{
2557 2557 color: #ffffff;
2558 2558 }
2559 2559 .right .logtags .branchtag a:hover,.logtags .branchtag a:hover{
2560 2560 text-decoration: none;
2561 2561 color: #ffffff;
2562 2562 }
2563 2563 .right .logtags .tagtag,.logtags .tagtag {
2564 2564 padding: 1px 3px 1px 3px;
2565 2565 background-color: #62cffc;
2566 2566 font-size: 10px;
2567 2567 font-weight: bold;
2568 2568 color: #ffffff;
2569 2569 text-transform: uppercase;
2570 2570 white-space: nowrap;
2571 2571 -webkit-border-radius: 3px;
2572 2572 -moz-border-radius: 3px;
2573 2573 border-radius: 3px;
2574 2574 }
2575 2575 .right .logtags .tagtag a:hover,.logtags .tagtag a{
2576 2576 color: #ffffff;
2577 2577 }
2578 2578 .right .logtags .tagtag a:hover,.logtags .tagtag a:hover{
2579 2579 text-decoration: none;
2580 2580 color: #ffffff;
2581 2581 }
2582 2582 .right .logbooks .bookbook,.logbooks .bookbook {
2583 2583 padding: 1px 3px 2px;
2584 2584 background-color: #46A546;
2585 2585 font-size: 9.75px;
2586 2586 font-weight: bold;
2587 2587 color: #ffffff;
2588 2588 text-transform: uppercase;
2589 2589 white-space: nowrap;
2590 2590 -webkit-border-radius: 3px;
2591 2591 -moz-border-radius: 3px;
2592 2592 border-radius: 3px;
2593 2593 }
2594 2594 .right .logbooks .bookbook,.logbooks .bookbook a{
2595 2595 color: #ffffff;
2596 2596 }
2597 2597 .right .logbooks .bookbook,.logbooks .bookbook a:hover{
2598 2598 text-decoration: none;
2599 2599 color: #ffffff;
2600 2600 }
2601 2601 div.browserblock {
2602 2602 overflow: hidden;
2603 2603 border: 1px solid #ccc;
2604 2604 background: #f8f8f8;
2605 2605 font-size: 100%;
2606 2606 line-height: 125%;
2607 2607 padding: 0;
2608 2608 -webkit-border-radius: 6px 6px 0px 0px;
2609 2609 -moz-border-radius: 6px 6px 0px 0px;
2610 2610 border-radius: 6px 6px 0px 0px;
2611 2611 }
2612 2612
2613 2613 div.browserblock .browser-header {
2614 2614 background: #FFF;
2615 2615 padding: 10px 0px 15px 0px;
2616 2616 width: 100%;
2617 2617 }
2618 2618
2619 2619 div.browserblock .browser-nav {
2620 2620 float: left
2621 2621 }
2622 2622
2623 2623 div.browserblock .browser-branch {
2624 2624 float: left;
2625 2625 }
2626 2626
2627 2627 div.browserblock .browser-branch label {
2628 2628 color: #4A4A4A;
2629 2629 vertical-align: text-top;
2630 2630 }
2631 2631
2632 2632 div.browserblock .browser-header span {
2633 2633 margin-left: 5px;
2634 2634 font-weight: 700;
2635 2635 }
2636 2636
2637 2637 div.browserblock .browser-search {
2638 2638 clear: both;
2639 2639 padding: 8px 8px 0px 5px;
2640 2640 height: 20px;
2641 2641 }
2642 2642
2643 2643 div.browserblock #node_filter_box {
2644 2644
2645 2645 }
2646 2646
2647 2647 div.browserblock .search_activate {
2648 2648 float: left
2649 2649 }
2650 2650
2651 2651 div.browserblock .add_node {
2652 2652 float: left;
2653 2653 padding-left: 5px;
2654 2654 }
2655 2655
2656 2656 div.browserblock .search_activate a:hover,div.browserblock .add_node a:hover
2657 2657 {
2658 2658 text-decoration: none !important;
2659 2659 }
2660 2660
2661 2661 div.browserblock .browser-body {
2662 2662 background: #EEE;
2663 2663 border-top: 1px solid #CCC;
2664 2664 }
2665 2665
2666 2666 table.code-browser {
2667 2667 border-collapse: collapse;
2668 2668 width: 100%;
2669 2669 }
2670 2670
2671 2671 table.code-browser tr {
2672 2672 margin: 3px;
2673 2673 }
2674 2674
2675 2675 table.code-browser thead th {
2676 2676 background-color: #EEE;
2677 2677 height: 20px;
2678 2678 font-size: 1.1em;
2679 2679 font-weight: 700;
2680 2680 text-align: left;
2681 2681 padding-left: 10px;
2682 2682 }
2683 2683
2684 2684 table.code-browser tbody td {
2685 2685 padding-left: 10px;
2686 2686 height: 20px;
2687 2687 }
2688 2688
2689 2689 table.code-browser .browser-file {
2690 2690 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2691 2691 height: 16px;
2692 2692 padding-left: 20px;
2693 2693 text-align: left;
2694 2694 }
2695 2695 .diffblock .changeset_header {
2696 2696 height: 16px;
2697 2697 }
2698 2698 .diffblock .changeset_file {
2699 2699 background: url("../images/icons/file.png") no-repeat scroll 3px;
2700 2700 text-align: left;
2701 2701 float: left;
2702 2702 padding: 2px 0px 2px 22px;
2703 2703 }
2704 2704 .diffblock .diff-menu-wrapper{
2705 2705 float: left;
2706 2706 }
2707 2707
2708 2708 .diffblock .diff-menu{
2709 2709 position: absolute;
2710 2710 background: none repeat scroll 0 0 #FFFFFF;
2711 2711 border-color: #003367 #666666 #666666;
2712 2712 border-right: 1px solid #666666;
2713 2713 border-style: solid solid solid;
2714 2714 border-width: 1px;
2715 2715 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2716 2716 margin-top:5px;
2717 2717 margin-left:1px;
2718 2718
2719 2719 }
2720 2720 .diffblock .diff-actions {
2721 2721 padding: 2px 0px 0px 2px;
2722 2722 float: left;
2723 2723 }
2724 2724 .diffblock .diff-menu ul li {
2725 2725 padding: 0px 0px 0px 0px !important;
2726 2726 }
2727 2727 .diffblock .diff-menu ul li a{
2728 2728 display: block;
2729 2729 padding: 3px 8px 3px 8px !important;
2730 2730 }
2731 2731 .diffblock .diff-menu ul li a:hover{
2732 2732 text-decoration: none;
2733 2733 background-color: #EEEEEE;
2734 2734 }
2735 2735 table.code-browser .browser-dir {
2736 2736 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2737 2737 height: 16px;
2738 2738 padding-left: 20px;
2739 2739 text-align: left;
2740 2740 }
2741 2741
2742 2742 .box .search {
2743 2743 clear: both;
2744 2744 overflow: hidden;
2745 2745 margin: 0;
2746 2746 padding: 0 20px 10px;
2747 2747 }
2748 2748
2749 2749 .box .search div.search_path {
2750 2750 background: none repeat scroll 0 0 #EEE;
2751 2751 border: 1px solid #CCC;
2752 2752 color: blue;
2753 2753 margin-bottom: 10px;
2754 2754 padding: 10px 0;
2755 2755 }
2756 2756
2757 2757 .box .search div.search_path div.link {
2758 2758 font-weight: 700;
2759 2759 margin-left: 25px;
2760 2760 }
2761 2761
2762 2762 .box .search div.search_path div.link a {
2763 2763 color: #003367;
2764 2764 cursor: pointer;
2765 2765 text-decoration: none;
2766 2766 }
2767 2767
2768 2768 #path_unlock {
2769 2769 color: red;
2770 2770 font-size: 1.2em;
2771 2771 padding-left: 4px;
2772 2772 }
2773 2773
2774 2774 .info_box span {
2775 2775 margin-left: 3px;
2776 2776 margin-right: 3px;
2777 2777 }
2778 2778
2779 2779 .info_box .rev {
2780 2780 color: #003367;
2781 2781 font-size: 1.6em;
2782 2782 font-weight: bold;
2783 2783 vertical-align: sub;
2784 2784 }
2785 2785
2786 2786 .info_box input#at_rev,.info_box input#size {
2787 2787 background: #FFF;
2788 2788 border-top: 1px solid #b3b3b3;
2789 2789 border-left: 1px solid #b3b3b3;
2790 2790 border-right: 1px solid #eaeaea;
2791 2791 border-bottom: 1px solid #eaeaea;
2792 2792 color: #000;
2793 2793 font-size: 12px;
2794 2794 margin: 0;
2795 2795 padding: 1px 5px 1px;
2796 2796 }
2797 2797
2798 2798 .info_box input#view {
2799 2799 text-align: center;
2800 2800 padding: 4px 3px 2px 2px;
2801 2801 }
2802 2802
2803 2803 .yui-overlay,.yui-panel-container {
2804 2804 visibility: hidden;
2805 2805 position: absolute;
2806 2806 z-index: 2;
2807 2807 }
2808 2808
2809 2809 .yui-tt {
2810 2810 visibility: hidden;
2811 2811 position: absolute;
2812 2812 color: #666;
2813 2813 background-color: #FFF;
2814 2814 border: 2px solid #003367;
2815 2815 font: 100% sans-serif;
2816 2816 width: auto;
2817 2817 opacity: 1px;
2818 2818 padding: 8px;
2819 2819 white-space: pre-wrap;
2820 2820 -webkit-border-radius: 8px 8px 8px 8px;
2821 2821 -khtml-border-radius: 8px 8px 8px 8px;
2822 2822 -moz-border-radius: 8px 8px 8px 8px;
2823 2823 border-radius: 8px 8px 8px 8px;
2824 2824 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2825 2825 }
2826 2826
2827 2827 .ac {
2828 2828 vertical-align: top;
2829 2829 }
2830 2830
2831 2831 .ac .yui-ac {
2832 2832 position: relative;
2833 2833 font-size: 100%;
2834 2834 }
2835 2835
2836 2836 .ac .perm_ac {
2837 2837 width: 20em;
2838 2838 }
2839 2839
2840 2840 .ac .yui-ac-input {
2841 2841 width: 100%;
2842 2842 }
2843 2843
2844 2844 .ac .yui-ac-container {
2845 2845 position: absolute;
2846 2846 top: 1.6em;
2847 2847 width: 100%;
2848 2848 }
2849 2849
2850 2850 .ac .yui-ac-content {
2851 2851 position: absolute;
2852 2852 width: 100%;
2853 2853 border: 1px solid gray;
2854 2854 background: #fff;
2855 2855 overflow: hidden;
2856 2856 z-index: 9050;
2857 2857 }
2858 2858
2859 2859 .ac .yui-ac-shadow {
2860 2860 position: absolute;
2861 2861 width: 100%;
2862 2862 background: #000;
2863 2863 -moz-opacity: 0.1px;
2864 2864 opacity: .10;
2865 2865 filter: alpha(opacity = 10);
2866 2866 z-index: 9049;
2867 2867 margin: .3em;
2868 2868 }
2869 2869
2870 2870 .ac .yui-ac-content ul {
2871 2871 width: 100%;
2872 2872 margin: 0;
2873 2873 padding: 0;
2874 2874 }
2875 2875
2876 2876 .ac .yui-ac-content li {
2877 2877 cursor: default;
2878 2878 white-space: nowrap;
2879 2879 margin: 0;
2880 2880 padding: 2px 5px;
2881 2881 }
2882 2882
2883 2883 .ac .yui-ac-content li.yui-ac-prehighlight {
2884 2884 background: #B3D4FF;
2885 2885 }
2886 2886
2887 2887 .ac .yui-ac-content li.yui-ac-highlight {
2888 2888 background: #556CB5;
2889 2889 color: #FFF;
2890 2890 }
2891 2891
2892 2892 .follow {
2893 2893 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2894 2894 height: 16px;
2895 2895 width: 20px;
2896 2896 cursor: pointer;
2897 2897 display: block;
2898 2898 float: right;
2899 2899 margin-top: 2px;
2900 2900 }
2901 2901
2902 2902 .following {
2903 2903 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2904 2904 height: 16px;
2905 2905 width: 20px;
2906 2906 cursor: pointer;
2907 2907 display: block;
2908 2908 float: right;
2909 2909 margin-top: 2px;
2910 2910 }
2911 2911
2912 2912 .currently_following {
2913 2913 padding-left: 10px;
2914 2914 padding-bottom: 5px;
2915 2915 }
2916 2916
2917 2917 .add_icon {
2918 2918 background: url("../images/icons/add.png") no-repeat scroll 3px;
2919 2919 padding-left: 20px;
2920 2920 padding-top: 0px;
2921 2921 text-align: left;
2922 2922 }
2923 2923
2924 2924 .edit_icon {
2925 2925 background: url("../images/icons/folder_edit.png") no-repeat scroll 3px;
2926 2926 padding-left: 20px;
2927 2927 padding-top: 0px;
2928 2928 text-align: left;
2929 2929 }
2930 2930
2931 2931 .delete_icon {
2932 2932 background: url("../images/icons/delete.png") no-repeat scroll 3px;
2933 2933 padding-left: 20px;
2934 2934 padding-top: 0px;
2935 2935 text-align: left;
2936 2936 }
2937 2937
2938 2938 .refresh_icon {
2939 2939 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
2940 2940 3px;
2941 2941 padding-left: 20px;
2942 2942 padding-top: 0px;
2943 2943 text-align: left;
2944 2944 }
2945 2945
2946 2946 .pull_icon {
2947 2947 background: url("../images/icons/connect.png") no-repeat scroll 3px;
2948 2948 padding-left: 20px;
2949 2949 padding-top: 0px;
2950 2950 text-align: left;
2951 2951 }
2952 2952
2953 2953 .rss_icon {
2954 2954 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
2955 2955 padding-left: 20px;
2956 2956 padding-top: 4px;
2957 2957 text-align: left;
2958 2958 font-size: 8px
2959 2959 }
2960 2960
2961 2961 .atom_icon {
2962 2962 background: url("../images/icons/atom.png") no-repeat scroll 3px;
2963 2963 padding-left: 20px;
2964 2964 padding-top: 4px;
2965 2965 text-align: left;
2966 2966 font-size: 8px
2967 2967 }
2968 2968
2969 2969 .archive_icon {
2970 2970 background: url("../images/icons/compress.png") no-repeat scroll 3px;
2971 2971 padding-left: 20px;
2972 2972 text-align: left;
2973 2973 padding-top: 1px;
2974 2974 }
2975 2975
2976 2976 .start_following_icon {
2977 2977 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2978 2978 padding-left: 20px;
2979 2979 text-align: left;
2980 2980 padding-top: 0px;
2981 2981 }
2982 2982
2983 2983 .stop_following_icon {
2984 2984 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2985 2985 padding-left: 20px;
2986 2986 text-align: left;
2987 2987 padding-top: 0px;
2988 2988 }
2989 2989
2990 2990 .action_button {
2991 2991 border: 0;
2992 2992 display: inline;
2993 2993 }
2994 2994
2995 2995 .action_button:hover {
2996 2996 border: 0;
2997 2997 text-decoration: underline;
2998 2998 cursor: pointer;
2999 2999 }
3000 3000
3001 3001 #switch_repos {
3002 3002 position: absolute;
3003 3003 height: 25px;
3004 3004 z-index: 1;
3005 3005 }
3006 3006
3007 3007 #switch_repos select {
3008 3008 min-width: 150px;
3009 3009 max-height: 250px;
3010 3010 z-index: 1;
3011 3011 }
3012 3012
3013 3013 .breadcrumbs {
3014 3014 border: medium none;
3015 3015 color: #FFF;
3016 3016 float: left;
3017 3017 text-transform: uppercase;
3018 3018 font-weight: 700;
3019 3019 font-size: 14px;
3020 3020 margin: 0;
3021 3021 padding: 11px 0 11px 10px;
3022 3022 }
3023 3023
3024 3024 .breadcrumbs .hash {
3025 3025 text-transform: none;
3026 3026 color: #fff;
3027 3027 }
3028 3028
3029 3029 .breadcrumbs a {
3030 3030 color: #FFF;
3031 3031 }
3032 3032
3033 3033 .flash_msg {
3034 3034
3035 3035 }
3036 3036
3037 3037 .flash_msg ul {
3038 3038
3039 3039 }
3040 3040
3041 3041 .error_msg {
3042 3042 background-color: #c43c35;
3043 3043 background-repeat: repeat-x;
3044 3044 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b),
3045 3045 to(#c43c35) );
3046 3046 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3047 3047 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3048 3048 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b),
3049 3049 color-stop(100%, #c43c35) );
3050 3050 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3051 3051 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3052 3052 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3053 3053 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',
3054 3054 endColorstr='#c43c35', GradientType=0 );
3055 3055 border-color: #c43c35 #c43c35 #882a25;
3056 3056 }
3057 3057
3058 3058 .warning_msg {
3059 3059 color: #404040 !important;
3060 3060 background-color: #eedc94;
3061 3061 background-repeat: repeat-x;
3062 3062 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
3063 3063 to(#eedc94) );
3064 3064 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3065 3065 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3066 3066 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1),
3067 3067 color-stop(100%, #eedc94) );
3068 3068 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3069 3069 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3070 3070 background-image: linear-gradient(top, #fceec1, #eedc94);
3071 3071 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1',
3072 3072 endColorstr='#eedc94', GradientType=0 );
3073 3073 border-color: #eedc94 #eedc94 #e4c652;
3074 3074 }
3075 3075
3076 3076 .success_msg {
3077 3077 background-color: #57a957;
3078 3078 background-repeat: repeat-x !important;
3079 3079 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462),
3080 3080 to(#57a957) );
3081 3081 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3082 3082 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3083 3083 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462),
3084 3084 color-stop(100%, #57a957) );
3085 3085 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3086 3086 background-image: -o-linear-gradient(top, #62c462, #57a957);
3087 3087 background-image: linear-gradient(top, #62c462, #57a957);
3088 3088 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',
3089 3089 endColorstr='#57a957', GradientType=0 );
3090 3090 border-color: #57a957 #57a957 #3d773d;
3091 3091 }
3092 3092
3093 3093 .notice_msg {
3094 3094 background-color: #339bb9;
3095 3095 background-repeat: repeat-x;
3096 3096 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de),
3097 3097 to(#339bb9) );
3098 3098 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3099 3099 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3100 3100 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de),
3101 3101 color-stop(100%, #339bb9) );
3102 3102 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3103 3103 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3104 3104 background-image: linear-gradient(top, #5bc0de, #339bb9);
3105 3105 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',
3106 3106 endColorstr='#339bb9', GradientType=0 );
3107 3107 border-color: #339bb9 #339bb9 #22697d;
3108 3108 }
3109 3109
3110 3110 .success_msg,.error_msg,.notice_msg,.warning_msg {
3111 3111 font-size: 12px;
3112 3112 font-weight: 700;
3113 3113 min-height: 14px;
3114 3114 line-height: 14px;
3115 3115 margin-bottom: 10px;
3116 3116 margin-top: 0;
3117 3117 display: block;
3118 3118 overflow: auto;
3119 3119 padding: 6px 10px 6px 10px;
3120 3120 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3121 3121 position: relative;
3122 3122 color: #FFF;
3123 3123 border-width: 1px;
3124 3124 border-style: solid;
3125 3125 -webkit-border-radius: 4px;
3126 3126 -moz-border-radius: 4px;
3127 3127 border-radius: 4px;
3128 3128 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3129 3129 -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3130 3130 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3131 3131 }
3132 3132
3133 3133 #msg_close {
3134 3134 background: transparent url("../icons/cross_grey_small.png") no-repeat
3135 3135 scroll 0 0;
3136 3136 cursor: pointer;
3137 3137 height: 16px;
3138 3138 position: absolute;
3139 3139 right: 5px;
3140 3140 top: 5px;
3141 3141 width: 16px;
3142 3142 }
3143 3143 div#legend_data{
3144 3144 padding-left:10px;
3145 3145 }
3146 3146 div#legend_container table{
3147 3147 border: none !important;
3148 3148 }
3149 3149 div#legend_container table,div#legend_choices table {
3150 3150 width: auto !important;
3151 3151 }
3152 3152
3153 3153 table#permissions_manage {
3154 3154 width: 0 !important;
3155 3155 }
3156 3156
3157 3157 table#permissions_manage span.private_repo_msg {
3158 3158 font-size: 0.8em;
3159 3159 opacity: 0.6px;
3160 3160 }
3161 3161
3162 3162 table#permissions_manage td.private_repo_msg {
3163 3163 font-size: 0.8em;
3164 3164 }
3165 3165
3166 3166 table#permissions_manage tr#add_perm_input td {
3167 3167 vertical-align: middle;
3168 3168 }
3169 3169
3170 3170 div.gravatar {
3171 3171 background-color: #FFF;
3172 3172 float: left;
3173 3173 margin-right: 0.7em;
3174 3174 padding: 1px 1px 1px 1px;
3175 3175 line-height:0;
3176 3176 -webkit-border-radius: 3px;
3177 3177 -khtml-border-radius: 3px;
3178 3178 -moz-border-radius: 3px;
3179 3179 border-radius: 3px;
3180 3180 }
3181 3181
3182 3182 div.gravatar img {
3183 3183 -webkit-border-radius: 2px;
3184 3184 -khtml-border-radius: 2px;
3185 3185 -moz-border-radius: 2px;
3186 3186 border-radius: 2px;
3187 3187 }
3188 3188
3189 3189 #header,#content,#footer {
3190 3190 min-width: 978px;
3191 3191 }
3192 3192
3193 3193 #content {
3194 3194 clear: both;
3195 3195 overflow: hidden;
3196 3196 padding: 54px 10px 14px 10px;
3197 3197 }
3198 3198
3199 3199 #content div.box div.title div.search {
3200 3200
3201 3201 border-left: 1px solid #316293;
3202 3202 }
3203 3203
3204 3204 #content div.box div.title div.search div.input input {
3205 3205 border: 1px solid #316293;
3206 3206 }
3207 3207
3208 3208 .ui-btn{
3209 3209 color: #515151;
3210 3210 background-color: #DADADA;
3211 3211 background-repeat: repeat-x;
3212 3212 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3213 3213 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3214 3214 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3215 3215 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3216 3216 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3217 3217 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3218 3218 background-image: linear-gradient(top, #F4F4F4, #DADADA);
3219 3219 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3220 3220
3221 3221 border-top: 1px solid #DDD;
3222 3222 border-left: 1px solid #c6c6c6;
3223 3223 border-right: 1px solid #DDD;
3224 3224 border-bottom: 1px solid #c6c6c6;
3225 3225 color: #515151;
3226 3226 outline: none;
3227 3227 margin: 0px 3px 3px 0px;
3228 3228 -webkit-border-radius: 4px 4px 4px 4px !important;
3229 3229 -khtml-border-radius: 4px 4px 4px 4px !important;
3230 3230 -moz-border-radius: 4px 4px 4px 4px !important;
3231 3231 border-radius: 4px 4px 4px 4px !important;
3232 3232 cursor: pointer !important;
3233 3233 padding: 3px 3px 3px 3px;
3234 3234 background-position: 0 -15px;
3235 3235
3236 3236 }
3237 3237 .ui-btn.xsmall{
3238 3238 padding: 1px 2px 1px 1px;
3239 3239 }
3240 3240 .ui-btn.clone{
3241 3241 padding: 5px 2px 6px 1px;
3242 3242 margin: 0px -4px 3px 0px;
3243 3243 -webkit-border-radius: 4px 0px 0px 4px !important;
3244 3244 -khtml-border-radius: 4px 0px 0px 4px !important;
3245 3245 -moz-border-radius: 4px 0px 0px 4px !important;
3246 3246 border-radius: 4px 0px 0px 4px !important;
3247 3247 width: 100px;
3248 3248 text-align: center;
3249 3249 float: left;
3250 3250 position: absolute;
3251 3251 }
3252 3252 .ui-btn:focus {
3253 3253 outline: none;
3254 3254 }
3255 3255 .ui-btn:hover{
3256 3256 background-position: 0 0px;
3257 3257 text-decoration: none;
3258 3258 color: #515151;
3259 3259 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3260 3260 }
3261 3261
3262 3262 .ui-btn.red{
3263 3263 color:#fff;
3264 3264 background-color: #c43c35;
3265 3265 background-repeat: repeat-x;
3266 3266 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3267 3267 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3268 3268 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3269 3269 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3270 3270 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3271 3271 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3272 3272 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3273 3273 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3274 3274 border-color: #c43c35 #c43c35 #882a25;
3275 3275 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3276 3276 }
3277 3277
3278 3278
3279 3279 .ui-btn.blue{
3280 3280 background-color: #339bb9;
3281 3281 background-repeat: repeat-x;
3282 3282 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3283 3283 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3284 3284 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3285 3285 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3286 3286 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3287 3287 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3288 3288 background-image: linear-gradient(top, #5bc0de, #339bb9);
3289 3289 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3290 3290 border-color: #339bb9 #339bb9 #22697d;
3291 3291 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3292 3292 }
3293 3293
3294 3294 .ui-btn.green{
3295 3295 background-color: #57a957;
3296 3296 background-repeat: repeat-x;
3297 3297 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3298 3298 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3299 3299 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3300 3300 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3301 3301 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3302 3302 background-image: -o-linear-gradient(top, #62c462, #57a957);
3303 3303 background-image: linear-gradient(top, #62c462, #57a957);
3304 3304 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3305 3305 border-color: #57a957 #57a957 #3d773d;
3306 3306 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3307 3307 }
3308 3308
3309 3309 ins,div.options a:hover {
3310 3310 text-decoration: none;
3311 3311 }
3312 3312
3313 3313 img,
3314 3314 #header #header-inner #quick li a:hover span.normal,
3315 3315 #header #header-inner #quick li ul li.last,
3316 3316 #content div.box div.form div.fields div.field div.textarea table td table td a,
3317 3317 #clone_url,
3318 3318 #clone_url_id
3319 3319 {
3320 3320 border: none;
3321 3321 }
3322 3322
3323 3323 img.icon,.right .merge img {
3324 3324 vertical-align: bottom;
3325 3325 }
3326 3326
3327 3327 #header ul#logged-user,#content div.box div.title ul.links,
3328 3328 #content div.box div.message div.dismiss,
3329 3329 #content div.box div.traffic div.legend ul
3330 3330 {
3331 3331 float: right;
3332 3332 margin: 0;
3333 3333 padding: 0;
3334 3334 }
3335 3335
3336 3336 #header #header-inner #home,#header #header-inner #logo,
3337 3337 #content div.box ul.left,#content div.box ol.left,
3338 3338 #content div.box div.pagination-left,div#commit_history,
3339 3339 div#legend_data,div#legend_container,div#legend_choices
3340 3340 {
3341 3341 float: left;
3342 3342 }
3343 3343
3344 3344 #header #header-inner #quick li:hover ul ul,
3345 3345 #header #header-inner #quick li:hover ul ul ul,
3346 3346 #header #header-inner #quick li:hover ul ul ul ul,
3347 3347 #content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow
3348 3348 {
3349 3349 display: none;
3350 3350 }
3351 3351
3352 3352 #header #header-inner #quick li:hover ul,#header #header-inner #quick li li:hover ul,#header #header-inner #quick li li li:hover ul,#header #header-inner #quick li li li li:hover ul,#content #left #menu ul.opened,#content #left #menu li ul.expanded
3353 3353 {
3354 3354 display: block;
3355 3355 }
3356 3356
3357 3357 #content div.graph {
3358 3358 padding: 0 10px 10px;
3359 3359 }
3360 3360
3361 3361 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a
3362 3362 {
3363 3363 color: #bfe3ff;
3364 3364 }
3365 3365
3366 3366 #content div.box ol.lower-roman,#content div.box ol.upper-roman,#content div.box ol.lower-alpha,#content div.box ol.upper-alpha,#content div.box ol.decimal
3367 3367 {
3368 3368 margin: 10px 24px 10px 44px;
3369 3369 }
3370 3370
3371 3371 #content div.box div.form,#content div.box div.table,#content div.box div.traffic
3372 3372 {
3373 3373 clear: both;
3374 3374 overflow: hidden;
3375 3375 margin: 0;
3376 3376 padding: 0 20px 10px;
3377 3377 }
3378 3378
3379 3379 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields
3380 3380 {
3381 3381 clear: both;
3382 3382 overflow: hidden;
3383 3383 margin: 0;
3384 3384 padding: 0;
3385 3385 }
3386 3386
3387 3387 #content div.box div.form div.fields div.field div.label span,#login div.form div.fields div.field div.label span,#register div.form div.fields div.field div.label span
3388 3388 {
3389 3389 height: 1%;
3390 3390 display: block;
3391 3391 color: #363636;
3392 3392 margin: 0;
3393 3393 padding: 2px 0 0;
3394 3394 }
3395 3395
3396 3396 #content div.box div.form div.fields div.field div.input input.error,#login div.form div.fields div.field div.input input.error,#register div.form div.fields div.field div.input input.error
3397 3397 {
3398 3398 background: #FBE3E4;
3399 3399 border-top: 1px solid #e1b2b3;
3400 3400 border-left: 1px solid #e1b2b3;
3401 3401 border-right: 1px solid #FBC2C4;
3402 3402 border-bottom: 1px solid #FBC2C4;
3403 3403 }
3404 3404
3405 3405 #content div.box div.form div.fields div.field div.input input.success,#login div.form div.fields div.field div.input input.success,#register div.form div.fields div.field div.input input.success
3406 3406 {
3407 3407 background: #E6EFC2;
3408 3408 border-top: 1px solid #cebb98;
3409 3409 border-left: 1px solid #cebb98;
3410 3410 border-right: 1px solid #c6d880;
3411 3411 border-bottom: 1px solid #c6d880;
3412 3412 }
3413 3413
3414 3414 #content div.box-left div.form div.fields div.field div.textarea,#content div.box-right div.form div.fields div.field div.textarea,#content div.box div.form div.fields div.field div.select select,#content div.box table th.selected input,#content div.box table td.selected input
3415 3415 {
3416 3416 margin: 0;
3417 3417 }
3418 3418
3419 3419 #content div.box-left div.form div.fields div.field div.select,#content div.box-left div.form div.fields div.field div.checkboxes,#content div.box-left div.form div.fields div.field div.radios,#content div.box-right div.form div.fields div.field div.select,#content div.box-right div.form div.fields div.field div.checkboxes,#content div.box-right div.form div.fields div.field div.radios
3420 3420 {
3421 3421 margin: 0 0 0 0px !important;
3422 3422 padding: 0;
3423 3423 }
3424 3424
3425 3425 #content div.box div.form div.fields div.field div.select,#content div.box div.form div.fields div.field div.checkboxes,#content div.box div.form div.fields div.field div.radios
3426 3426 {
3427 3427 margin: 0 0 0 200px;
3428 3428 padding: 0;
3429 3429 }
3430 3430
3431 3431 #content div.box div.form div.fields div.field div.select a:hover,#content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover,#content div.box div.action a:hover
3432 3432 {
3433 3433 color: #000;
3434 3434 text-decoration: none;
3435 3435 }
3436 3436
3437 3437 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus
3438 3438 {
3439 3439 border: 1px solid #666;
3440 3440 }
3441 3441
3442 3442 #content div.box div.form div.fields div.field div.checkboxes div.checkbox,#content div.box div.form div.fields div.field div.radios div.radio
3443 3443 {
3444 3444 clear: both;
3445 3445 overflow: hidden;
3446 3446 margin: 0;
3447 3447 padding: 8px 0 2px;
3448 3448 }
3449 3449
3450 3450 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input,#content div.box div.form div.fields div.field div.radios div.radio input
3451 3451 {
3452 3452 float: left;
3453 3453 margin: 0;
3454 3454 }
3455 3455
3456 3456 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label,#content div.box div.form div.fields div.field div.radios div.radio label
3457 3457 {
3458 3458 height: 1%;
3459 3459 display: block;
3460 3460 float: left;
3461 3461 margin: 2px 0 0 4px;
3462 3462 }
3463 3463
3464 3464 div.form div.fields div.field div.button input,#content div.box div.form div.fields div.buttons input,div.form div.fields div.buttons input,#content div.box div.action div.button input
3465 3465 {
3466 3466 color: #000;
3467 3467 font-size: 11px;
3468 3468 font-weight: 700;
3469 3469 margin: 0;
3470 3470 }
3471 3471
3472 3472 input.ui-button {
3473 3473 background: #e5e3e3 url("../images/button.png") repeat-x;
3474 3474 border-top: 1px solid #DDD;
3475 3475 border-left: 1px solid #c6c6c6;
3476 3476 border-right: 1px solid #DDD;
3477 3477 border-bottom: 1px solid #c6c6c6;
3478 3478 color: #515151 !important;
3479 3479 outline: none;
3480 3480 margin: 0;
3481 3481 padding: 6px 12px;
3482 3482 -webkit-border-radius: 4px 4px 4px 4px;
3483 3483 -khtml-border-radius: 4px 4px 4px 4px;
3484 3484 -moz-border-radius: 4px 4px 4px 4px;
3485 3485 border-radius: 4px 4px 4px 4px;
3486 3486 box-shadow: 0 1px 0 #ececec;
3487 3487 cursor: pointer;
3488 3488 }
3489 3489
3490 3490 input.ui-button:hover {
3491 3491 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3492 3492 border-top: 1px solid #ccc;
3493 3493 border-left: 1px solid #bebebe;
3494 3494 border-right: 1px solid #b1b1b1;
3495 3495 border-bottom: 1px solid #afafaf;
3496 3496 }
3497 3497
3498 3498 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight
3499 3499 {
3500 3500 display: inline;
3501 3501 }
3502 3502
3503 3503 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons
3504 3504 {
3505 3505 margin: 10px 0 0 200px;
3506 3506 padding: 0;
3507 3507 }
3508 3508
3509 3509 #content div.box-left div.form div.fields div.buttons,#content div.box-right div.form div.fields div.buttons,div.box-left div.form div.fields div.buttons,div.box-right div.form div.fields div.buttons
3510 3510 {
3511 3511 margin: 10px 0 0;
3512 3512 }
3513 3513
3514 3514 #content div.box table td.user,#content div.box table td.address {
3515 3515 width: 10%;
3516 3516 text-align: center;
3517 3517 }
3518 3518
3519 3519 #content div.box div.action div.button,#login div.form div.fields div.field div.input div.link,#register div.form div.fields div.field div.input div.link
3520 3520 {
3521 3521 text-align: right;
3522 3522 margin: 6px 0 0;
3523 3523 padding: 0;
3524 3524 }
3525 3525
3526 3526 #content div.box div.action div.button input.ui-state-hover,#login div.form div.fields div.buttons input.ui-state-hover,#register div.form div.fields div.buttons input.ui-state-hover
3527 3527 {
3528 3528 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3529 3529 border-top: 1px solid #ccc;
3530 3530 border-left: 1px solid #bebebe;
3531 3531 border-right: 1px solid #b1b1b1;
3532 3532 border-bottom: 1px solid #afafaf;
3533 3533 color: #515151;
3534 3534 margin: 0;
3535 3535 padding: 6px 12px;
3536 3536 }
3537 3537
3538 3538 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results
3539 3539 {
3540 3540 text-align: left;
3541 3541 float: left;
3542 3542 margin: 0;
3543 3543 padding: 0;
3544 3544 }
3545 3545
3546 3546 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span
3547 3547 {
3548 3548 height: 1%;
3549 3549 display: block;
3550 3550 float: left;
3551 3551 background: #ebebeb url("../images/pager.png") repeat-x;
3552 3552 border-top: 1px solid #dedede;
3553 3553 border-left: 1px solid #cfcfcf;
3554 3554 border-right: 1px solid #c4c4c4;
3555 3555 border-bottom: 1px solid #c4c4c4;
3556 3556 color: #4A4A4A;
3557 3557 font-weight: 700;
3558 3558 margin: 0;
3559 3559 padding: 6px 8px;
3560 3560 }
3561 3561
3562 3562 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled
3563 3563 {
3564 3564 color: #B4B4B4;
3565 3565 padding: 6px;
3566 3566 }
3567 3567
3568 3568 #login,#register {
3569 3569 width: 520px;
3570 3570 margin: 10% auto 0;
3571 3571 padding: 0;
3572 3572 }
3573 3573
3574 3574 #login div.color,#register div.color {
3575 3575 clear: both;
3576 3576 overflow: hidden;
3577 3577 background: #FFF;
3578 3578 margin: 10px auto 0;
3579 3579 padding: 3px 3px 3px 0;
3580 3580 }
3581 3581
3582 3582 #login div.color a,#register div.color a {
3583 3583 width: 20px;
3584 3584 height: 20px;
3585 3585 display: block;
3586 3586 float: left;
3587 3587 margin: 0 0 0 3px;
3588 3588 padding: 0;
3589 3589 }
3590 3590
3591 3591 #login div.title h5,#register div.title h5 {
3592 3592 color: #fff;
3593 3593 margin: 10px;
3594 3594 padding: 0;
3595 3595 }
3596 3596
3597 3597 #login div.form div.fields div.field,#register div.form div.fields div.field
3598 3598 {
3599 3599 clear: both;
3600 3600 overflow: hidden;
3601 3601 margin: 0;
3602 3602 padding: 0 0 10px;
3603 3603 }
3604 3604
3605 3605 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message
3606 3606 {
3607 3607 height: 1%;
3608 3608 display: block;
3609 3609 color: red;
3610 3610 margin: 8px 0 0;
3611 3611 padding: 0;
3612 3612 max-width: 320px;
3613 3613 }
3614 3614
3615 3615 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label
3616 3616 {
3617 3617 color: #000;
3618 3618 font-weight: 700;
3619 3619 }
3620 3620
3621 3621 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input
3622 3622 {
3623 3623 float: left;
3624 3624 margin: 0;
3625 3625 padding: 0;
3626 3626 }
3627 3627
3628 3628 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox
3629 3629 {
3630 3630 margin: 0 0 0 184px;
3631 3631 padding: 0;
3632 3632 }
3633 3633
3634 3634 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label
3635 3635 {
3636 3636 color: #565656;
3637 3637 font-weight: 700;
3638 3638 }
3639 3639
3640 3640 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input
3641 3641 {
3642 3642 color: #000;
3643 3643 font-size: 1em;
3644 3644 font-weight: 700;
3645 3645 margin: 0;
3646 3646 }
3647 3647
3648 3648 #changeset_content .container .wrapper,#graph_content .container .wrapper
3649 3649 {
3650 3650 width: 600px;
3651 3651 }
3652 3652
3653 3653 #changeset_content .container .left {
3654 3654 float: left;
3655 3655 width: 75%;
3656 3656 padding-left: 5px;
3657 3657 }
3658 3658
3659 3659 #changeset_content .container .left .date,.ac .match {
3660 3660 font-weight: 700;
3661 3661 padding-top: 5px;
3662 3662 padding-bottom: 5px;
3663 3663 }
3664 3664
3665 3665 div#legend_container table td,div#legend_choices table td {
3666 3666 border: none !important;
3667 3667 height: 20px !important;
3668 3668 padding: 0 !important;
3669 3669 }
3670 3670
3671 3671 .q_filter_box {
3672 3672 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3673 3673 -webkit-border-radius: 4px;
3674 3674 -moz-border-radius: 4px;
3675 3675 border-radius: 4px;
3676 3676 border: 0 none;
3677 3677 color: #AAAAAA;
3678 3678 margin-bottom: -4px;
3679 3679 margin-top: -4px;
3680 3680 padding-left: 3px;
3681 3681 }
3682 3682
3683 3683 #node_filter {
3684 3684 border: 0px solid #545454;
3685 3685 color: #AAAAAA;
3686 3686 padding-left: 3px;
3687 3687 }
3688 3688
3689 3689
3690 3690 .group_members_wrap{
3691 3691
3692 3692 }
3693 3693
3694 3694 .group_members .group_member{
3695 3695 height: 30px;
3696 3696 padding:0px 0px 0px 10px;
3697 3697 }
3698 3698
3699 3699 /*README STYLE*/
3700 3700
3701 3701 div.readme {
3702 3702 padding:0px;
3703 3703 }
3704 3704
3705 3705 div.readme h2 {
3706 3706 font-weight: normal;
3707 3707 }
3708 3708
3709 3709 div.readme .readme_box {
3710 3710 background-color: #fafafa;
3711 3711 }
3712 3712
3713 3713 div.readme .readme_box {
3714 3714 clear:both;
3715 3715 overflow:hidden;
3716 3716 margin:0;
3717 3717 padding:0 20px 10px;
3718 3718 }
3719 3719
3720 3720 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
3721 3721 border-bottom: 0 !important;
3722 3722 margin: 0 !important;
3723 3723 padding: 0 !important;
3724 3724 line-height: 1.5em !important;
3725 3725 }
3726 3726
3727 3727
3728 3728 div.readme .readme_box h1:first-child {
3729 3729 padding-top: .25em !important;
3730 3730 }
3731 3731
3732 3732 div.readme .readme_box h2, div.readme .readme_box h3 {
3733 3733 margin: 1em 0 !important;
3734 3734 }
3735 3735
3736 3736 div.readme .readme_box h2 {
3737 3737 margin-top: 1.5em !important;
3738 3738 border-top: 4px solid #e0e0e0 !important;
3739 3739 padding-top: .5em !important;
3740 3740 }
3741 3741
3742 3742 div.readme .readme_box p {
3743 3743 color: black !important;
3744 3744 margin: 1em 0 !important;
3745 3745 line-height: 1.5em !important;
3746 3746 }
3747 3747
3748 3748 div.readme .readme_box ul {
3749 3749 list-style: disc !important;
3750 3750 margin: 1em 0 1em 2em !important;
3751 3751 }
3752 3752
3753 3753 div.readme .readme_box ol {
3754 3754 list-style: decimal;
3755 3755 margin: 1em 0 1em 2em !important;
3756 3756 }
3757 3757
3758 3758 div.readme .readme_box pre, code {
3759 3759 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3760 3760 }
3761 3761
3762 3762 div.readme .readme_box code {
3763 3763 font-size: 12px !important;
3764 3764 background-color: ghostWhite !important;
3765 3765 color: #444 !important;
3766 3766 padding: 0 .2em !important;
3767 3767 border: 1px solid #dedede !important;
3768 3768 }
3769 3769
3770 3770 div.readme .readme_box pre code {
3771 3771 padding: 0 !important;
3772 3772 font-size: 12px !important;
3773 3773 background-color: #eee !important;
3774 3774 border: none !important;
3775 3775 }
3776 3776
3777 3777 div.readme .readme_box pre {
3778 3778 margin: 1em 0;
3779 3779 font-size: 12px;
3780 3780 background-color: #eee;
3781 3781 border: 1px solid #ddd;
3782 3782 padding: 5px;
3783 3783 color: #444;
3784 3784 overflow: auto;
3785 3785 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3786 3786 -webkit-border-radius: 3px;
3787 3787 -moz-border-radius: 3px;
3788 3788 border-radius: 3px;
3789 3789 }
3790 3790
3791 3791
3792 3792 /** RST STYLE **/
3793 3793
3794 3794
3795 3795 div.rst-block {
3796 3796 padding:0px;
3797 3797 }
3798 3798
3799 3799 div.rst-block h2 {
3800 3800 font-weight: normal;
3801 3801 }
3802 3802
3803 3803 div.rst-block {
3804 3804 background-color: #fafafa;
3805 3805 }
3806 3806
3807 3807 div.rst-block {
3808 3808 clear:both;
3809 3809 overflow:hidden;
3810 3810 margin:0;
3811 3811 padding:0 20px 10px;
3812 3812 }
3813 3813
3814 3814 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
3815 3815 border-bottom: 0 !important;
3816 3816 margin: 0 !important;
3817 3817 padding: 0 !important;
3818 3818 line-height: 1.5em !important;
3819 3819 }
3820 3820
3821 3821
3822 3822 div.rst-block h1:first-child {
3823 3823 padding-top: .25em !important;
3824 3824 }
3825 3825
3826 3826 div.rst-block h2, div.rst-block h3 {
3827 3827 margin: 1em 0 !important;
3828 3828 }
3829 3829
3830 3830 div.rst-block h2 {
3831 3831 margin-top: 1.5em !important;
3832 3832 border-top: 4px solid #e0e0e0 !important;
3833 3833 padding-top: .5em !important;
3834 3834 }
3835 3835
3836 3836 div.rst-block p {
3837 3837 color: black !important;
3838 3838 margin: 1em 0 !important;
3839 3839 line-height: 1.5em !important;
3840 3840 }
3841 3841
3842 3842 div.rst-block ul {
3843 3843 list-style: disc !important;
3844 3844 margin: 1em 0 1em 2em !important;
3845 3845 }
3846 3846
3847 3847 div.rst-block ol {
3848 3848 list-style: decimal;
3849 3849 margin: 1em 0 1em 2em !important;
3850 3850 }
3851 3851
3852 3852 div.rst-block pre, code {
3853 3853 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3854 3854 }
3855 3855
3856 3856 div.rst-block code {
3857 3857 font-size: 12px !important;
3858 3858 background-color: ghostWhite !important;
3859 3859 color: #444 !important;
3860 3860 padding: 0 .2em !important;
3861 3861 border: 1px solid #dedede !important;
3862 3862 }
3863 3863
3864 3864 div.rst-block pre code {
3865 3865 padding: 0 !important;
3866 3866 font-size: 12px !important;
3867 3867 background-color: #eee !important;
3868 3868 border: none !important;
3869 3869 }
3870 3870
3871 3871 div.rst-block pre {
3872 3872 margin: 1em 0;
3873 3873 font-size: 12px;
3874 3874 background-color: #eee;
3875 3875 border: 1px solid #ddd;
3876 3876 padding: 5px;
3877 3877 color: #444;
3878 3878 overflow: auto;
3879 3879 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3880 3880 -webkit-border-radius: 3px;
3881 3881 -moz-border-radius: 3px;
3882 3882 border-radius: 3px;
3883 3883 }
3884 3884
3885 3885
3886 3886 /** comment main **/
3887 3887 .comments {
3888 3888 padding:10px 20px;
3889 3889 }
3890 3890
3891 3891 .comments .comment {
3892 3892 border: 1px solid #ddd;
3893 3893 margin-top: 10px;
3894 3894 -webkit-border-radius: 4px;
3895 3895 -moz-border-radius: 4px;
3896 3896 border-radius: 4px;
3897 3897 }
3898 3898
3899 3899 .comments .comment .meta {
3900 3900 background: #f8f8f8;
3901 3901 padding: 4px;
3902 3902 border-bottom: 1px solid #ddd;
3903 3903 }
3904 3904
3905 3905 .comments .comment .meta img {
3906 3906 vertical-align: middle;
3907 3907 }
3908 3908
3909 3909 .comments .comment .meta .user {
3910 3910 font-weight: bold;
3911 3911 }
3912 3912
3913 3913 .comments .comment .meta .date {
3914 3914 }
3915 3915
3916 3916 .comments .comment .text {
3917 3917 background-color: #FAFAFA;
3918 3918 }
3919 3919 .comment .text div.rst-block p {
3920 3920 margin: 0.5em 0px !important;
3921 3921 }
3922 3922
3923 3923 .comments .comments-number{
3924 3924 padding:0px 0px 10px 0px;
3925 3925 font-weight: bold;
3926 3926 color: #666;
3927 3927 font-size: 16px;
3928 3928 }
3929 3929
3930 3930 /** comment form **/
3931 3931
3932 3932 .comment-form .clearfix{
3933 3933 background: #EEE;
3934 3934 -webkit-border-radius: 4px;
3935 3935 -moz-border-radius: 4px;
3936 3936 border-radius: 4px;
3937 3937 padding: 10px;
3938 3938 }
3939 3939
3940 3940 div.comment-form {
3941 3941 margin-top: 20px;
3942 3942 }
3943 3943
3944 3944 .comment-form strong {
3945 3945 display: block;
3946 3946 margin-bottom: 15px;
3947 3947 }
3948 3948
3949 3949 .comment-form textarea {
3950 3950 width: 100%;
3951 3951 height: 100px;
3952 3952 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
3953 3953 }
3954 3954
3955 3955 form.comment-form {
3956 3956 margin-top: 10px;
3957 3957 margin-left: 10px;
3958 3958 }
3959 3959
3960 3960 .comment-form-submit {
3961 3961 margin-top: 5px;
3962 3962 margin-left: 525px;
3963 3963 }
3964 3964
3965 3965 .file-comments {
3966 3966 display: none;
3967 3967 }
3968 3968
3969 3969 .comment-form .comment {
3970 3970 margin-left: 10px;
3971 3971 }
3972 3972
3973 3973 .comment-form .comment-help{
3974 3974 padding: 0px 0px 5px 0px;
3975 3975 color: #666;
3976 3976 }
3977 3977
3978 3978 .comment-form .comment-button{
3979 3979 padding-top:5px;
3980 3980 }
3981 3981
3982 3982 .add-another-button {
3983 3983 margin-left: 10px;
3984 3984 margin-top: 10px;
3985 3985 margin-bottom: 10px;
3986 3986 }
3987 3987
3988 3988 .comment .buttons {
3989 3989 float: right;
3990 3990 }
3991 3991
3992 3992
3993 3993 .show-inline-comments{
3994 3994 position: relative;
3995 3995 top:1px
3996 3996 }
3997 3997
3998 3998 /** comment inline form **/
3999 3999
4000 4000 .comment-inline-form .clearfix{
4001 4001 background: #EEE;
4002 4002 -webkit-border-radius: 4px;
4003 4003 -moz-border-radius: 4px;
4004 4004 border-radius: 4px;
4005 4005 padding: 5px;
4006 4006 }
4007 4007
4008 4008 div.comment-inline-form {
4009 4009 margin-top: 5px;
4010 4010 padding:2px 6px 8px 6px;
4011 4011 }
4012 4012
4013 4013 .comment-inline-form strong {
4014 4014 display: block;
4015 4015 margin-bottom: 15px;
4016 4016 }
4017 4017
4018 4018 .comment-inline-form textarea {
4019 4019 width: 100%;
4020 4020 height: 100px;
4021 4021 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4022 4022 }
4023 4023
4024 4024 form.comment-inline-form {
4025 4025 margin-top: 10px;
4026 4026 margin-left: 10px;
4027 4027 }
4028 4028
4029 4029 .comment-inline-form-submit {
4030 4030 margin-top: 5px;
4031 4031 margin-left: 525px;
4032 4032 }
4033 4033
4034 4034 .file-comments {
4035 4035 display: none;
4036 4036 }
4037 4037
4038 4038 .comment-inline-form .comment {
4039 4039 margin-left: 10px;
4040 4040 }
4041 4041
4042 4042 .comment-inline-form .comment-help{
4043 4043 padding: 0px 0px 2px 0px;
4044 4044 color: #666666;
4045 4045 font-size: 10px;
4046 4046 }
4047 4047
4048 4048 .comment-inline-form .comment-button{
4049 4049 padding-top:5px;
4050 4050 }
4051 4051
4052 4052 /** comment inline **/
4053 4053 .inline-comments {
4054 4054 padding:10px 20px;
4055 4055 }
4056 4056
4057 4057 .inline-comments div.rst-block {
4058 4058 clear:both;
4059 4059 overflow:hidden;
4060 4060 margin:0;
4061 4061 padding:0 20px 0px;
4062 4062 }
4063 4063 .inline-comments .comment {
4064 4064 border: 1px solid #ddd;
4065 4065 -webkit-border-radius: 4px;
4066 4066 -moz-border-radius: 4px;
4067 4067 border-radius: 4px;
4068 4068 margin: 3px 3px 5px 5px;
4069 4069 background-color: #FAFAFA;
4070 4070 }
4071 4071 .inline-comments .comment-wrapp{
4072 4072 padding:1px;
4073 4073 }
4074 4074 .inline-comments .comment .meta {
4075 4075 background: #f8f8f8;
4076 4076 padding: 4px;
4077 4077 border-bottom: 1px solid #ddd;
4078 4078 }
4079 4079
4080 4080 .inline-comments .comment .meta img {
4081 4081 vertical-align: middle;
4082 4082 }
4083 4083
4084 4084 .inline-comments .comment .meta .user {
4085 4085 font-weight: bold;
4086 4086 }
4087 4087
4088 4088 .inline-comments .comment .meta .date {
4089 4089 }
4090 4090
4091 4091 .inline-comments .comment .text {
4092 4092 background-color: #FAFAFA;
4093 4093 }
4094 4094
4095 4095 .inline-comments .comments-number{
4096 4096 padding:0px 0px 10px 0px;
4097 4097 font-weight: bold;
4098 4098 color: #666;
4099 4099 font-size: 16px;
4100 4100 }
4101 4101 .inline-comments-button .add-comment{
4102 4102 margin:10px 5px !important;
4103 4103 }
4104 4104 .notifications{
4105 4105 border-radius: 4px 4px 4px 4px;
4106 4106 -webkit-border-radius: 4px;
4107 4107 -moz-border-radius: 4px;
4108 4108 float: right;
4109 4109 margin: 20px 0px 0px 0px;
4110 4110 position: absolute;
4111 4111 text-align: center;
4112 4112 width: 26px;
4113 4113 z-index: 1000;
4114 4114 }
4115 4115 .notifications a{
4116 4116 color:#888 !important;
4117 4117 display: block;
4118 4118 font-size: 10px;
4119 4119 background-color: #DEDEDE !important;
4120 4120 border-radius: 2px !important;
4121 4121 -webkit-border-radius: 2px !important;
4122 4122 -moz-border-radius: 2px !important;
4123 4123 }
4124 4124 .notifications a:hover{
4125 4125 text-decoration: none !important;
4126 4126 background-color: #EEEFFF !important;
4127 4127 }
4128 4128 .notification-header{
4129 4129 padding-top:6px;
4130 4130 }
4131 4131 .notification-header .desc{
4132 4132 font-size: 16px;
4133 4133 height: 24px;
4134 4134 float: left
4135 4135 }
4136 4136 .notification-list .container.unread{
4137 4137
4138 4138 }
4139 4139 .notification-header .gravatar{
4140 4140
4141 4141 }
4142 4142 .notification-header .desc.unread{
4143 4143 font-weight: bold;
4144 4144 font-size: 17px;
4145 4145 }
4146 4146
4147 4147 .notification-header .delete-notifications{
4148 4148 float: right;
4149 4149 padding-top: 8px;
4150 4150 cursor: pointer;
4151 4151 }
4152 4152 .notification-subject{
4153 4153 clear:both;
4154 4154 border-bottom: 1px solid #eee;
4155 4155 padding:5px 0px 5px 38px;
4156 4156 }
4157 4157
4158 4158 /****
4159 4159 PERMS
4160 4160 *****/
4161 4161 #perms .perms_section_head {
4162 4162 padding:10px 10px 10px 0px;
4163 4163 font-size:16px;
4164 4164 font-weight: bold;
4165 4165 }
4166 4166
4167 4167 #perms .perm_tag{
4168 4168 padding: 1px 3px 1px 3px;
4169 4169 font-size: 10px;
4170 4170 font-weight: bold;
4171 4171 text-transform: uppercase;
4172 4172 white-space: nowrap;
4173 4173 -webkit-border-radius: 3px;
4174 4174 -moz-border-radius: 3px;
4175 4175 border-radius: 3px;
4176 4176 }
4177 4177
4178 4178 #perms .perm_tag.admin{
4179 4179 background-color: #B94A48;
4180 4180 color: #ffffff;
4181 4181 }
4182 4182
4183 4183 #perms .perm_tag.write{
4184 4184 background-color: #B94A48;
4185 4185 color: #ffffff;
4186 4186 }
4187 4187
4188 4188 #perms .perm_tag.read{
4189 4189 background-color: #468847;
4190 4190 color: #ffffff;
4191 4191 }
4192 4192
4193 4193 #perms .perm_tag.none{
4194 4194 background-color: #bfbfbf;
4195 4195 color: #ffffff;
4196 4196 }
4197 4197
4198
4198 .perm-gravatar{
4199 vertical-align:middle;
4200 padding:2px;
4201 }
4202 .perm-gravatar-ac{
4203 vertical-align:middle;
4204 padding:2px;
4205 }
4199 4206
4200 4207 /*****************************************************************************
4201 4208 DIFFS CSS
4202 4209 ******************************************************************************/
4203 4210
4204 4211 div.diffblock {
4205 4212 overflow: auto;
4206 4213 padding: 0px;
4207 4214 border: 1px solid #ccc;
4208 4215 background: #f8f8f8;
4209 4216 font-size: 100%;
4210 4217 line-height: 100%;
4211 4218 /* new */
4212 4219 line-height: 125%;
4213 4220 -webkit-border-radius: 6px 6px 0px 0px;
4214 4221 -moz-border-radius: 6px 6px 0px 0px;
4215 4222 border-radius: 6px 6px 0px 0px;
4216 4223 }
4217 4224 div.diffblock.margined{
4218 4225 margin: 0px 20px 0px 20px;
4219 4226 }
4220 4227 div.diffblock .code-header{
4221 4228 border-bottom: 1px solid #CCCCCC;
4222 4229 background: #EEEEEE;
4223 4230 padding:10px 0 10px 0;
4224 4231 height: 14px;
4225 4232 }
4226 4233 div.diffblock .code-header.cv{
4227 4234 height: 34px;
4228 4235 }
4229 4236 div.diffblock .code-header-title{
4230 4237 padding: 0px 0px 10px 5px !important;
4231 4238 margin: 0 !important;
4232 4239 }
4233 4240 div.diffblock .code-header .hash{
4234 4241 float: left;
4235 4242 padding: 2px 0 0 2px;
4236 4243 }
4237 4244 div.diffblock .code-header .date{
4238 4245 float:left;
4239 4246 text-transform: uppercase;
4240 4247 padding: 2px 0px 0px 2px;
4241 4248 }
4242 4249 div.diffblock .code-header div{
4243 4250 margin-left:4px;
4244 4251 font-weight: bold;
4245 4252 font-size: 14px;
4246 4253 }
4247 4254 div.diffblock .code-body{
4248 4255 background: #FFFFFF;
4249 4256 }
4250 4257 div.diffblock pre.raw{
4251 4258 background: #FFFFFF;
4252 4259 color:#000000;
4253 4260 }
4254 4261 table.code-difftable{
4255 4262 border-collapse: collapse;
4256 4263 width: 99%;
4257 4264 }
4258 4265 table.code-difftable td {
4259 4266 padding: 0 !important;
4260 4267 background: none !important;
4261 4268 border:0 !important;
4262 4269 vertical-align: none !important;
4263 4270 }
4264 4271 table.code-difftable .context{
4265 4272 background:none repeat scroll 0 0 #DDE7EF;
4266 4273 }
4267 4274 table.code-difftable .add{
4268 4275 background:none repeat scroll 0 0 #DDFFDD;
4269 4276 }
4270 4277 table.code-difftable .add ins{
4271 4278 background:none repeat scroll 0 0 #AAFFAA;
4272 4279 text-decoration:none;
4273 4280 }
4274 4281 table.code-difftable .del{
4275 4282 background:none repeat scroll 0 0 #FFDDDD;
4276 4283 }
4277 4284 table.code-difftable .del del{
4278 4285 background:none repeat scroll 0 0 #FFAAAA;
4279 4286 text-decoration:none;
4280 4287 }
4281 4288
4282 4289 /** LINE NUMBERS **/
4283 4290 table.code-difftable .lineno{
4284 4291
4285 4292 padding-left:2px;
4286 4293 padding-right:2px;
4287 4294 text-align:right;
4288 4295 width:32px;
4289 4296 -moz-user-select:none;
4290 4297 -webkit-user-select: none;
4291 4298 border-right: 1px solid #CCC !important;
4292 4299 border-left: 0px solid #CCC !important;
4293 4300 border-top: 0px solid #CCC !important;
4294 4301 border-bottom: none !important;
4295 4302 vertical-align: middle !important;
4296 4303
4297 4304 }
4298 4305 table.code-difftable .lineno.new {
4299 4306 }
4300 4307 table.code-difftable .lineno.old {
4301 4308 }
4302 4309 table.code-difftable .lineno a{
4303 4310 color:#747474 !important;
4304 4311 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4305 4312 letter-spacing:-1px;
4306 4313 text-align:right;
4307 4314 padding-right: 2px;
4308 4315 cursor: pointer;
4309 4316 display: block;
4310 4317 width: 32px;
4311 4318 }
4312 4319
4313 4320 table.code-difftable .lineno-inline{
4314 4321 background:none repeat scroll 0 0 #FFF !important;
4315 4322 padding-left:2px;
4316 4323 padding-right:2px;
4317 4324 text-align:right;
4318 4325 width:30px;
4319 4326 -moz-user-select:none;
4320 4327 -webkit-user-select: none;
4321 4328 }
4322 4329
4323 4330 /** CODE **/
4324 4331 table.code-difftable .code {
4325 4332 display: block;
4326 4333 width: 100%;
4327 4334 }
4328 4335 table.code-difftable .code td{
4329 4336 margin:0;
4330 4337 padding:0;
4331 4338 }
4332 4339 table.code-difftable .code pre{
4333 4340 margin:0;
4334 4341 padding:0;
4335 4342 height: 17px;
4336 4343 line-height: 17px;
4337 4344 }
4338 4345
4339 4346
4340 4347 .diffblock.margined.comm .line .code:hover{
4341 4348 background-color:#FFFFCC !important;
4342 4349 cursor: pointer !important;
4343 4350 background-image:url("../images/icons/comment_add.png") !important;
4344 4351 background-repeat:no-repeat !important;
4345 4352 background-position: right !important;
4346 4353 background-position: 0% 50% !important;
4347 4354 }
4348 4355 .diffblock.margined.comm .line .code.no-comment:hover{
4349 4356 background-image: none !important;
4350 4357 cursor: auto !important;
4351 4358 background-color: inherit !important;
4352 4359
4353 4360 }
@@ -1,739 +1,911
1 1 /**
2 2 RhodeCode JS Files
3 3 **/
4 4
5 5 if (typeof console == "undefined" || typeof console.log == "undefined"){
6 6 console = { log: function() {} }
7 7 }
8 8
9 9
10 10 var str_repeat = function(i, m) {
11 11 for (var o = []; m > 0; o[--m] = i);
12 12 return o.join('');
13 13 };
14 14
15 15 /**
16 16 * INJECT .format function into String
17 17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
18 18 * Return "My name is Johny Bravo"
19 19 * Inspired by https://gist.github.com/1049426
20 20 */
21 21 String.prototype.format = function() {
22 22
23 23 function format() {
24 24 var str = this;
25 25 var len = arguments.length+1;
26 26 var safe = undefined;
27 27 var arg = undefined;
28 28
29 29 // For each {0} {1} {n...} replace with the argument in that position. If
30 30 // the argument is an object or an array it will be stringified to JSON.
31 31 for (var i=0; i < len; arg = arguments[i++]) {
32 32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
33 33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
34 34 }
35 35 return str;
36 36 }
37 37
38 38 // Save a reference of what may already exist under the property native.
39 39 // Allows for doing something like: if("".format.native) { /* use native */ }
40 40 format.native = String.prototype.format;
41 41
42 42 // Replace the prototype property
43 43 return format;
44 44
45 45 }();
46 46
47 47
48 48 /**
49 49 * SmartColorGenerator
50 50 *
51 51 *usage::
52 52 * var CG = new ColorGenerator();
53 53 * var col = CG.getColor(key); //returns array of RGB
54 54 * 'rgb({0})'.format(col.join(',')
55 55 *
56 56 * @returns {ColorGenerator}
57 57 */
58 58 var ColorGenerator = function(){
59 59 this.GOLDEN_RATIO = 0.618033988749895;
60 60 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
61 61 this.HSV_1 = 0.75;//saturation
62 62 this.HSV_2 = 0.95;
63 63 this.color;
64 64 this.cacheColorMap = {};
65 65 };
66 66
67 67 ColorGenerator.prototype = {
68 68 getColor:function(key){
69 69 if(this.cacheColorMap[key] !== undefined){
70 70 return this.cacheColorMap[key];
71 71 }
72 72 else{
73 73 this.cacheColorMap[key] = this.generateColor();
74 74 return this.cacheColorMap[key];
75 75 }
76 76 },
77 77 _hsvToRgb:function(h,s,v){
78 78 if (s == 0.0)
79 79 return [v, v, v];
80 80 i = parseInt(h * 6.0)
81 81 f = (h * 6.0) - i
82 82 p = v * (1.0 - s)
83 83 q = v * (1.0 - s * f)
84 84 t = v * (1.0 - s * (1.0 - f))
85 85 i = i % 6
86 86 if (i == 0)
87 87 return [v, t, p]
88 88 if (i == 1)
89 89 return [q, v, p]
90 90 if (i == 2)
91 91 return [p, v, t]
92 92 if (i == 3)
93 93 return [p, q, v]
94 94 if (i == 4)
95 95 return [t, p, v]
96 96 if (i == 5)
97 97 return [v, p, q]
98 98 },
99 99 generateColor:function(){
100 100 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
101 101 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
102 102 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
103 103 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
104 104 function toRgb(v){
105 105 return ""+parseInt(v*256)
106 106 }
107 107 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
108 108
109 109 }
110 110 }
111 111
112 112
113 113
114 114
115 115
116 116 /**
117 117 * GLOBAL YUI Shortcuts
118 118 */
119 119 var YUC = YAHOO.util.Connect;
120 120 var YUD = YAHOO.util.Dom;
121 121 var YUE = YAHOO.util.Event;
122 122 var YUQ = YAHOO.util.Selector.query;
123 123
124 124 // defines if push state is enabled for this browser ?
125 125 var push_state_enabled = Boolean(
126 126 window.history && window.history.pushState && window.history.replaceState
127 127 && !( /* disable for versions of iOS before version 4.3 (8F190) */
128 128 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
129 129 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
130 130 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
131 131 )
132 132 );
133 133
134 134 var _run_callbacks = function(callbacks){
135 135 if (callbacks !== undefined){
136 136 var _l = callbacks.length;
137 137 for (var i=0;i<_l;i++){
138 138 var func = callbacks[i];
139 139 if(typeof(func)=='function'){
140 140 try{
141 141 func();
142 142 }catch (err){};
143 143 }
144 144 }
145 145 }
146 146 }
147 147
148 148 /**
149 149 * Partial Ajax Implementation
150 150 *
151 151 * @param url: defines url to make partial request
152 152 * @param container: defines id of container to input partial result
153 153 * @param s_call: success callback function that takes o as arg
154 154 * o.tId
155 155 * o.status
156 156 * o.statusText
157 157 * o.getResponseHeader[ ]
158 158 * o.getAllResponseHeaders
159 159 * o.responseText
160 160 * o.responseXML
161 161 * o.argument
162 162 * @param f_call: failure callback
163 163 * @param args arguments
164 164 */
165 165 function ypjax(url,container,s_call,f_call,args){
166 166 var method='GET';
167 167 if(args===undefined){
168 168 args=null;
169 169 }
170 170
171 171 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
172 172 YUC.initHeader('X-PARTIAL-XHR',true);
173 173
174 174 // wrapper of passed callback
175 175 var s_wrapper = (function(o){
176 176 return function(o){
177 177 YUD.get(container).innerHTML=o.responseText;
178 178 YUD.setStyle(container,'opacity','1.0');
179 179 //execute the given original callback
180 180 if (s_call !== undefined){
181 181 s_call(o);
182 182 }
183 183 }
184 184 })()
185 185 YUD.setStyle(container,'opacity','0.3');
186 186 YUC.asyncRequest(method,url,{
187 187 success:s_wrapper,
188 188 failure:function(o){
189 189 console.log(o);
190 190 YUD.get(container).innerHTML='ERROR';
191 191 YUD.setStyle(container,'opacity','1.0');
192 192 YUD.setStyle(container,'color','red');
193 193 }
194 194 },args);
195 195
196 196 };
197 197
198 198 /**
199 199 * tooltip activate
200 200 */
201 201 var tooltip_activate = function(){
202 202 function toolTipsId(){
203 203 var ids = [];
204 204 var tts = YUQ('.tooltip');
205 205 for (var i = 0; i < tts.length; i++) {
206 206 // if element doesn't not have and id
207 207 // autogenerate one for tooltip
208 208 if (!tts[i].id){
209 209 tts[i].id='tt'+((i*100)+tts.length);
210 210 }
211 211 ids.push(tts[i].id);
212 212 }
213 213 return ids
214 214 };
215 215 var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
216 216 context: [[toolTipsId()],"tl","bl",null,[0,5]],
217 217 monitorresize:false,
218 218 xyoffset :[0,0],
219 219 autodismissdelay:300000,
220 220 hidedelay:5,
221 221 showdelay:20,
222 222 });
223 223 };
224 224
225 225 /**
226 226 * show more
227 227 */
228 228 var show_more_event = function(){
229 229 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
230 230 var el = e.target;
231 231 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
232 232 YUD.setStyle(el.parentNode,'display','none');
233 233 });
234 234 };
235 235
236 236
237 237 /**
238 238 * Quick filter widget
239 239 *
240 240 * @param target: filter input target
241 241 * @param nodes: list of nodes in html we want to filter.
242 242 * @param display_element function that takes current node from nodes and
243 243 * does hide or show based on the node
244 244 *
245 245 */
246 246 var q_filter = function(target,nodes,display_element){
247 247
248 248 var nodes = nodes;
249 249 var q_filter_field = YUD.get(target);
250 250 var F = YAHOO.namespace(target);
251 251
252 252 YUE.on(q_filter_field,'click',function(){
253 253 q_filter_field.value = '';
254 254 });
255 255
256 256 YUE.on(q_filter_field,'keyup',function(e){
257 257 clearTimeout(F.filterTimeout);
258 258 F.filterTimeout = setTimeout(F.updateFilter,600);
259 259 });
260 260
261 261 F.filterTimeout = null;
262 262
263 263 var show_node = function(node){
264 264 YUD.setStyle(node,'display','')
265 265 }
266 266 var hide_node = function(node){
267 267 YUD.setStyle(node,'display','none');
268 268 }
269 269
270 270 F.updateFilter = function() {
271 271 // Reset timeout
272 272 F.filterTimeout = null;
273 273
274 274 var obsolete = [];
275 275
276 276 var req = q_filter_field.value.toLowerCase();
277 277
278 278 var l = nodes.length;
279 279 var i;
280 280 var showing = 0;
281 281
282 282 for (i=0;i<l;i++ ){
283 283 var n = nodes[i];
284 284 var target_element = display_element(n)
285 285 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
286 286 hide_node(target_element);
287 287 }
288 288 else{
289 289 show_node(target_element);
290 290 showing+=1;
291 291 }
292 292 }
293 293
294 294 // if repo_count is set update the number
295 295 var cnt = YUD.get('repo_count');
296 296 if(cnt){
297 297 YUD.get('repo_count').innerHTML = showing;
298 298 }
299 299
300 300 }
301 301 };
302 302
303 303 var ajaxPOST = function(url,postData,success) {
304 304 var sUrl = url;
305 305 var callback = {
306 306 success: success,
307 307 failure: function (o) {
308 308 alert("error");
309 309 },
310 310 };
311 311 var postData = postData;
312 312 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
313 313 };
314 314
315 315
316 316 /** comments **/
317 317 var removeInlineForm = function(form) {
318 318 form.parentNode.removeChild(form);
319 319 };
320 320
321 321 var tableTr = function(cls,body){
322 322 var form = document.createElement('tr');
323 323 YUD.addClass(form, cls);
324 324 form.innerHTML = '<td class="lineno-inline new-inline"></td>'+
325 325 '<td class="lineno-inline old-inline"></td>'+
326 326 '<td>{0}</td>'.format(body);
327 327 return form;
328 328 };
329 329
330 330 var createInlineForm = function(parent_tr, f_path, line) {
331 331 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
332 332 tmpl = tmpl.format(f_path, line);
333 333 var form = tableTr('comment-form-inline',tmpl)
334 334
335 335 // create event for hide button
336 336 form = new YAHOO.util.Element(form);
337 337 var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]);
338 338 form_hide_button.on('click', function(e) {
339 339 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
340 340 removeInlineForm(newtr);
341 341 YUD.removeClass(parent_tr, 'form-open');
342 342 });
343 343 return form
344 344 };
345 345 var injectInlineForm = function(tr){
346 346 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(tr,'no-comment')){
347 347 return
348 348 }
349 349 YUD.addClass(tr,'form-open');
350 350 var node = tr.parentNode.parentNode.parentNode.getElementsByClassName('full_f_path')[0];
351 351 var f_path = YUD.getAttribute(node,'path');
352 352 var lineno = getLineNo(tr);
353 353 var form = createInlineForm(tr, f_path, lineno);
354 354 var target_tr = tr;
355 355 if(YUD.hasClass(YUD.getNextSibling(tr),'inline-comments')){
356 356 target_tr = YUD.getNextSibling(tr);
357 357 }
358 358 YUD.insertAfter(form,target_tr);
359 359 YUD.get('text_'+lineno).focus();
360 360 tooltip_activate();
361 361 };
362 362
363 363 var createInlineAddButton = function(tr,label){
364 364 var html = '<div class="add-comment"><span class="ui-btn">{0}</span></div>'.format(label);
365 365
366 366 var add = new YAHOO.util.Element(tableTr('inline-comments-button',html));
367 367 add.on('click', function(e) {
368 368 injectInlineForm(tr);
369 369 });
370 370 return add;
371 371 };
372 372
373 373 var getLineNo = function(tr) {
374 374 var line;
375 375 var o = tr.children[0].id.split('_');
376 376 var n = tr.children[1].id.split('_');
377 377
378 378 if (n.length >= 2) {
379 379 line = n[n.length-1];
380 380 } else if (o.length >= 2) {
381 381 line = o[o.length-1];
382 382 }
383 383
384 384 return line
385 385 };
386 386
387 387
388 388 var fileBrowserListeners = function(current_url, node_list_url, url_base,
389 389 truncated_lbl, nomatch_lbl){
390 390 var current_url_branch = +"?branch=__BRANCH__";
391 391 var url = url_base;
392 392 var node_url = node_list_url;
393 393
394 394 YUE.on('stay_at_branch','click',function(e){
395 395 if(e.target.checked){
396 396 var uri = current_url_branch;
397 397 uri = uri.replace('__BRANCH__',e.target.value);
398 398 window.location = uri;
399 399 }
400 400 else{
401 401 window.location = current_url;
402 402 }
403 403 })
404 404
405 405 var n_filter = YUD.get('node_filter');
406 406 var F = YAHOO.namespace('node_filter');
407 407
408 408 F.filterTimeout = null;
409 409 var nodes = null;
410 410
411 411 F.initFilter = function(){
412 412 YUD.setStyle('node_filter_box_loading','display','');
413 413 YUD.setStyle('search_activate_id','display','none');
414 414 YUD.setStyle('add_node_id','display','none');
415 415 YUC.initHeader('X-PARTIAL-XHR',true);
416 416 YUC.asyncRequest('GET',url,{
417 417 success:function(o){
418 418 nodes = JSON.parse(o.responseText);
419 419 YUD.setStyle('node_filter_box_loading','display','none');
420 420 YUD.setStyle('node_filter_box','display','');
421 421 n_filter.focus();
422 422 if(YUD.hasClass(n_filter,'init')){
423 423 n_filter.value = '';
424 424 YUD.removeClass(n_filter,'init');
425 425 }
426 426 },
427 427 failure:function(o){
428 428 console.log('failed to load');
429 429 }
430 430 },null);
431 431 }
432 432
433 433 F.updateFilter = function(e) {
434 434
435 435 return function(){
436 436 // Reset timeout
437 437 F.filterTimeout = null;
438 438 var query = e.target.value.toLowerCase();
439 439 var match = [];
440 440 var matches = 0;
441 441 var matches_max = 20;
442 442 if (query != ""){
443 443 for(var i=0;i<nodes.length;i++){
444 444
445 445 var pos = nodes[i].name.toLowerCase().indexOf(query)
446 446 if(query && pos != -1){
447 447
448 448 matches++
449 449 //show only certain amount to not kill browser
450 450 if (matches > matches_max){
451 451 break;
452 452 }
453 453
454 454 var n = nodes[i].name;
455 455 var t = nodes[i].type;
456 456 var n_hl = n.substring(0,pos)
457 457 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
458 458 +n.substring(pos+query.length)
459 459 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,node_url.replace('__FPATH__',n),n_hl));
460 460 }
461 461 if(match.length >= matches_max){
462 462 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(truncated_lbl));
463 463 }
464 464
465 465 }
466 466 }
467 467 if(query != ""){
468 468 YUD.setStyle('tbody','display','none');
469 469 YUD.setStyle('tbody_filtered','display','');
470 470
471 471 if (match.length==0){
472 472 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(nomatch_lbl));
473 473 }
474 474
475 475 YUD.get('tbody_filtered').innerHTML = match.join("");
476 476 }
477 477 else{
478 478 YUD.setStyle('tbody','display','');
479 479 YUD.setStyle('tbody_filtered','display','none');
480 480 }
481 481
482 482 }
483 483 };
484 484
485 485 YUE.on(YUD.get('filter_activate'),'click',function(){
486 486 F.initFilter();
487 487 })
488 488 YUE.on(n_filter,'click',function(){
489 489 if(YUD.hasClass(n_filter,'init')){
490 490 n_filter.value = '';
491 491 YUD.removeClass(n_filter,'init');
492 492 }
493 493 });
494 494 YUE.on(n_filter,'keyup',function(e){
495 495 clearTimeout(F.filterTimeout);
496 496 F.filterTimeout = setTimeout(F.updateFilter(e),600);
497 497 });
498 498 };
499 499
500 500
501 501 var initCodeMirror = function(textAreadId,resetUrl){
502 502 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
503 503 mode: "null",
504 504 lineNumbers:true
505 505 });
506 506 YUE.on('reset','click',function(e){
507 507 window.location=resetUrl
508 508 });
509 509
510 510 YUE.on('file_enable','click',function(){
511 511 YUD.setStyle('editor_container','display','');
512 512 YUD.setStyle('upload_file_container','display','none');
513 513 YUD.setStyle('filename_container','display','');
514 514 });
515 515
516 516 YUE.on('upload_file_enable','click',function(){
517 517 YUD.setStyle('editor_container','display','none');
518 518 YUD.setStyle('upload_file_container','display','');
519 519 YUD.setStyle('filename_container','display','none');
520 520 });
521 521 };
522 522
523 523
524 524
525 525 var getIdentNode = function(n){
526 526 //iterate thru nodes untill matched interesting node !
527 527
528 528 if (typeof n == 'undefined'){
529 529 return -1
530 530 }
531 531
532 532 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
533 533 return n
534 534 }
535 535 else{
536 536 return getIdentNode(n.parentNode);
537 537 }
538 538 };
539 539
540 540 var getSelectionLink = function(selection_link_label) {
541 541 return function(){
542 542 //get selection from start/to nodes
543 543 if (typeof window.getSelection != "undefined") {
544 544 s = window.getSelection();
545 545
546 546 from = getIdentNode(s.anchorNode);
547 547 till = getIdentNode(s.focusNode);
548 548
549 549 f_int = parseInt(from.id.replace('L',''));
550 550 t_int = parseInt(till.id.replace('L',''));
551 551
552 552 if (f_int > t_int){
553 553 //highlight from bottom
554 554 offset = -35;
555 555 ranges = [t_int,f_int];
556 556
557 557 }
558 558 else{
559 559 //highligth from top
560 560 offset = 35;
561 561 ranges = [f_int,t_int];
562 562 }
563 563
564 564 if (ranges[0] != ranges[1]){
565 565 if(YUD.get('linktt') == null){
566 566 hl_div = document.createElement('div');
567 567 hl_div.id = 'linktt';
568 568 }
569 569 anchor = '#L'+ranges[0]+'-'+ranges[1];
570 570 hl_div.innerHTML = '';
571 571 l = document.createElement('a');
572 572 l.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
573 573 l.innerHTML = selection_link_label;
574 574 hl_div.appendChild(l);
575 575
576 576 YUD.get('body').appendChild(hl_div);
577 577
578 578 xy = YUD.getXY(till.id);
579 579
580 580 YUD.addClass('linktt','yui-tt');
581 581 YUD.setStyle('linktt','top',xy[1]+offset+'px');
582 582 YUD.setStyle('linktt','left',xy[0]+'px');
583 583 YUD.setStyle('linktt','visibility','visible');
584 584 }
585 585 else{
586 586 YUD.setStyle('linktt','visibility','hidden');
587 587 }
588 588 }
589 589 }
590 590 };
591 591
592 592 var deleteNotification = function(url, notification_id,callbacks){
593 593 var callback = {
594 594 success:function(o){
595 595 var obj = YUD.get(String("notification_"+notification_id));
596 596 if(obj.parentNode !== undefined){
597 597 obj.parentNode.removeChild(obj);
598 598 }
599 599 _run_callbacks(callbacks);
600 600 },
601 601 failure:function(o){
602 602 alert("error");
603 603 },
604 604 };
605 605 var postData = '_method=delete';
606 606 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
607 607 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
608 608 callback, postData);
609 609 };
610 610
611 611
612 /** MEMBERS AUTOCOMPLETE WIDGET **/
613
614 var MembersAutoComplete = function (users_list, groups_list, group_lbl, members_lbl) {
615 var myUsers = users_list;
616 var myGroups = groups_list;
617
618 // Define a custom search function for the DataSource of users
619 var matchUsers = function (sQuery) {
620 // Case insensitive matching
621 var query = sQuery.toLowerCase();
622 var i = 0;
623 var l = myUsers.length;
624 var matches = [];
625
626 // Match against each name of each contact
627 for (; i < l; i++) {
628 contact = myUsers[i];
629 if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
630 matches[matches.length] = contact;
631 }
632 }
633 return matches;
634 };
635
636 // Define a custom search function for the DataSource of usersGroups
637 var matchGroups = function (sQuery) {
638 // Case insensitive matching
639 var query = sQuery.toLowerCase();
640 var i = 0;
641 var l = myGroups.length;
642 var matches = [];
643
644 // Match against each name of each contact
645 for (; i < l; i++) {
646 matched_group = myGroups[i];
647 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
648 matches[matches.length] = matched_group;
649 }
650 }
651 return matches;
652 };
653
654 //match all
655 var matchAll = function (sQuery) {
656 u = matchUsers(sQuery);
657 g = matchGroups(sQuery);
658 return u.concat(g);
659 };
660
661 // DataScheme for members
662 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
663 memberDS.responseSchema = {
664 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
665 };
666
667 // DataScheme for owner
668 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
669 ownerDS.responseSchema = {
670 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
671 };
672
673 // Instantiate AutoComplete for perms
674 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
675 membersAC.useShadow = false;
676 membersAC.resultTypeList = false;
677
678 // Instantiate AutoComplete for owner
679 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
680 ownerAC.useShadow = false;
681 ownerAC.resultTypeList = false;
682
683
684 // Helper highlight function for the formatter
685 var highlightMatch = function (full, snippet, matchindex) {
686 return full.substring(0, matchindex)
687 + "<span class='match'>"
688 + full.substr(matchindex, snippet.length)
689 + "</span>" + full.substring(matchindex + snippet.length);
690 };
691
692 // Custom formatter to highlight the matching letters
693 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
694 var query = sQuery.toLowerCase();
695 var _gravatar = function(res, em, group){
696 if (group !== undefined){
697 em = '/images/icons/group.png'
698 }
699 tmpl = '<img class="perm-gravatar-ac" src="{0}"/>{1}'
700 return tmpl.format(em,res)
701 }
702 // group
703 if (oResultData.grname != undefined) {
704 var grname = oResultData.grname;
705 var grmembers = oResultData.grmembers;
706 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
707 var grprefix = "{0}: ".format(group_lbl);
708 var grsuffix = " (" + grmembers + " )";
709 var grsuffix = " ({0} {1})".format(grmembers, members_lbl);
710
711 if (grnameMatchIndex > -1) {
712 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
713 }
714 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
715 // Users
716 } else if (oResultData.fname != undefined) {
717 var fname = oResultData.fname,
718 lname = oResultData.lname,
719 nname = oResultData.nname || "",
720 // Guard against null value
721 fnameMatchIndex = fname.toLowerCase().indexOf(query),
722 lnameMatchIndex = lname.toLowerCase().indexOf(query),
723 nnameMatchIndex = nname.toLowerCase().indexOf(query),
724 displayfname, displaylname, displaynname;
725
726 if (fnameMatchIndex > -1) {
727 displayfname = highlightMatch(fname, query, fnameMatchIndex);
728 } else {
729 displayfname = fname;
730 }
731
732 if (lnameMatchIndex > -1) {
733 displaylname = highlightMatch(lname, query, lnameMatchIndex);
734 } else {
735 displaylname = lname;
736 }
737
738 if (nnameMatchIndex > -1) {
739 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
740 } else {
741 displaynname = nname ? "(" + nname + ")" : "";
742 }
743
744 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
745 } else {
746 return '';
747 }
748 };
749 membersAC.formatResult = custom_formatter;
750 ownerAC.formatResult = custom_formatter;
751
752 var myHandler = function (sType, aArgs) {
753
754 var myAC = aArgs[0]; // reference back to the AC instance
755 var elLI = aArgs[1]; // reference to the selected LI element
756 var oData = aArgs[2]; // object literal of selected item's result data
757 //fill the autocomplete with value
758 if (oData.nname != undefined) {
759 //users
760 myAC.getInputEl().value = oData.nname;
761 YUD.get('perm_new_member_type').value = 'user';
762 } else {
763 //groups
764 myAC.getInputEl().value = oData.grname;
765 YUD.get('perm_new_member_type').value = 'users_group';
766 }
767 };
768
769 membersAC.itemSelectEvent.subscribe(myHandler);
770 if(ownerAC.itemSelectEvent){
771 ownerAC.itemSelectEvent.subscribe(myHandler);
772 }
773
774 return {
775 memberDS: memberDS,
776 ownerDS: ownerDS,
777 membersAC: membersAC,
778 ownerAC: ownerAC,
779 };
780 }
781
782
783
612 784 /**
613 785 * QUICK REPO MENU
614 786 */
615 787 var quick_repo_menu = function(){
616 788 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
617 789 var menu = e.currentTarget.firstElementChild.firstElementChild;
618 790 if(YUD.hasClass(menu,'hidden')){
619 791 YUD.replaceClass(e.currentTarget,'hidden', 'active');
620 792 YUD.replaceClass(menu, 'hidden', 'active');
621 793 }
622 794 })
623 795 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
624 796 var menu = e.currentTarget.firstElementChild.firstElementChild;
625 797 if(YUD.hasClass(menu,'active')){
626 798 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
627 799 YUD.replaceClass(menu, 'active', 'hidden');
628 800 }
629 801 })
630 802 };
631 803
632 804
633 805 /**
634 806 * TABLE SORTING
635 807 */
636 808
637 809 // returns a node from given html;
638 810 var fromHTML = function(html){
639 811 var _html = document.createElement('element');
640 812 _html.innerHTML = html;
641 813 return _html;
642 814 }
643 815 var get_rev = function(node){
644 816 var n = node.firstElementChild.firstElementChild;
645 817
646 818 if (n===null){
647 819 return -1
648 820 }
649 821 else{
650 822 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
651 823 return parseInt(out);
652 824 }
653 825 }
654 826
655 827 var get_name = function(node){
656 828 var name = node.firstElementChild.children[2].innerHTML;
657 829 return name
658 830 }
659 831 var get_group_name = function(node){
660 832 var name = node.firstElementChild.children[1].innerHTML;
661 833 return name
662 834 }
663 835 var get_date = function(node){
664 836 var date_ = node.firstElementChild.innerHTML;
665 837 return date_
666 838 }
667 839
668 840 var revisionSort = function(a, b, desc, field) {
669 841
670 842 var a_ = fromHTML(a.getData(field));
671 843 var b_ = fromHTML(b.getData(field));
672 844
673 845 // extract revisions from string nodes
674 846 a_ = get_rev(a_)
675 847 b_ = get_rev(b_)
676 848
677 849 var comp = YAHOO.util.Sort.compare;
678 850 var compState = comp(a_, b_, desc);
679 851 return compState;
680 852 };
681 853 var ageSort = function(a, b, desc, field) {
682 854 var a_ = a.getData(field);
683 855 var b_ = b.getData(field);
684 856
685 857 var comp = YAHOO.util.Sort.compare;
686 858 var compState = comp(a_, b_, desc);
687 859 return compState;
688 860 };
689 861
690 862 var nameSort = function(a, b, desc, field) {
691 863 var a_ = fromHTML(a.getData(field));
692 864 var b_ = fromHTML(b.getData(field));
693 865
694 866 // extract name from table
695 867 a_ = get_name(a_)
696 868 b_ = get_name(b_)
697 869
698 870 var comp = YAHOO.util.Sort.compare;
699 871 var compState = comp(a_, b_, desc);
700 872 return compState;
701 873 };
702 874
703 875 var permNameSort = function(a, b, desc, field) {
704 876 var a_ = fromHTML(a.getData(field));
705 877 var b_ = fromHTML(b.getData(field));
706 878 // extract name from table
707 879
708 880 a_ = a_.children[0].innerHTML;
709 881 b_ = b_.children[0].innerHTML;
710 882
711 883 var comp = YAHOO.util.Sort.compare;
712 884 var compState = comp(a_, b_, desc);
713 885 return compState;
714 886 };
715 887
716 888 var groupNameSort = function(a, b, desc, field) {
717 889 var a_ = fromHTML(a.getData(field));
718 890 var b_ = fromHTML(b.getData(field));
719 891
720 892 // extract name from table
721 893 a_ = get_group_name(a_)
722 894 b_ = get_group_name(b_)
723 895
724 896 var comp = YAHOO.util.Sort.compare;
725 897 var compState = comp(a_, b_, desc);
726 898 return compState;
727 899 };
728 900 var dateSort = function(a, b, desc, field) {
729 901 var a_ = fromHTML(a.getData(field));
730 902 var b_ = fromHTML(b.getData(field));
731 903
732 904 // extract name from table
733 905 a_ = get_date(a_)
734 906 b_ = get_date(b_)
735 907
736 908 var comp = YAHOO.util.Sort.compare;
737 909 var compState = comp(a_, b_, desc);
738 910 return compState;
739 911 }; No newline at end of file
@@ -1,281 +1,128
1 1 <table id="permissions_manage" class="noborder">
2 2 <tr>
3 3 <td>${_('none')}</td>
4 4 <td>${_('read')}</td>
5 5 <td>${_('write')}</td>
6 6 <td>${_('admin')}</td>
7 7 <td>${_('member')}</td>
8 8 <td></td>
9 9 </tr>
10 10 ## USERS
11 11 %for r2p in c.repo_info.repo_to_perm:
12 12 %if r2p.user.username =='default' and c.repo_info.private:
13 13 <tr>
14 14 <td colspan="4">
15 15 <span class="private_repo_msg">
16 16 ${_('private repository')}
17 17 </span>
18 18 </td>
19 19 <td class="private_repo_msg"><img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}</td>
20 20 </tr>
21 21 %else:
22 22 <tr id="id${id(r2p.user.username)}">
23 23 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.none')}</td>
24 24 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.read')}</td>
25 25 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}</td>
26 26 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}</td>
27 27 <td style="white-space: nowrap;">
28 <img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}
28 <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username}
29 29 </td>
30 30 <td>
31 31 %if r2p.user.username !='default':
32 32 <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
33 33 ${_('revoke')}
34 34 </span>
35 35 %endif
36 36 </td>
37 37 </tr>
38 38 %endif
39 39 %endfor
40 40
41 41 ## USERS GROUPS
42 42 %for g2p in c.repo_info.users_group_to_perm:
43 43 <tr id="id${id(g2p.users_group.users_group_name)}">
44 44 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.none')}</td>
45 45 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.read')}</td>
46 46 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.write')}</td>
47 47 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.admin')}</td>
48 48 <td style="white-space: nowrap;">
49 <img style="vertical-align:bottom" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
49 <img class="perm-gravatar" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
50 50 </td>
51 51 <td>
52 52 <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
53 53 ${_('revoke')}
54 54 </span>
55 55 </td>
56 56 </tr>
57 57 %endfor
58 58 <tr id="add_perm_input">
59 59 <td>${h.radio('perm_new_member','repository.none')}</td>
60 60 <td>${h.radio('perm_new_member','repository.read')}</td>
61 61 <td>${h.radio('perm_new_member','repository.write')}</td>
62 62 <td>${h.radio('perm_new_member','repository.admin')}</td>
63 63 <td class='ac'>
64 64 <div class="perm_ac" id="perm_ac">
65 65 ${h.text('perm_new_member_name',class_='yui-ac-input')}
66 66 ${h.hidden('perm_new_member_type')}
67 67 <div id="perm_container"></div>
68 68 </div>
69 69 </td>
70 70 <td></td>
71 71 </tr>
72 72 <tr>
73 73 <td colspan="6">
74 74 <span id="add_perm" class="add_icon" style="cursor: pointer;">
75 75 ${_('Add another member')}
76 76 </span>
77 77 </td>
78 78 </tr>
79 79 </table>
80 80 <script type="text/javascript">
81 81 function ajaxActionUser(user_id, field_id) {
82 82 var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
83 83 var callback = {
84 84 success: function (o) {
85 85 var tr = YUD.get(String(field_id));
86 86 tr.parentNode.removeChild(tr);
87 87 },
88 88 failure: function (o) {
89 89 alert("${_('Failed to remove user')}");
90 90 },
91 91 };
92 92 var postData = '_method=delete&user_id=' + user_id;
93 93 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
94 94 };
95 95
96 96 function ajaxActionUsersGroup(users_group_id,field_id){
97 97 var sUrl = "${h.url('delete_repo_users_group',repo_name=c.repo_name)}";
98 98 var callback = {
99 99 success:function(o){
100 100 var tr = YUD.get(String(field_id));
101 101 tr.parentNode.removeChild(tr);
102 102 },
103 103 failure:function(o){
104 104 alert("${_('Failed to remove users group')}");
105 105 },
106 106 };
107 107 var postData = '_method=delete&users_group_id='+users_group_id;
108 108 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
109 109 };
110 110
111 111 YUE.onDOMReady(function () {
112 112 if (!YUD.hasClass('perm_new_member_name', 'error')) {
113 113 YUD.setStyle('add_perm_input', 'display', 'none');
114 114 }
115 115 YAHOO.util.Event.addListener('add_perm', 'click', function () {
116 116 YUD.setStyle('add_perm_input', 'display', '');
117 117 YUD.setStyle('add_perm', 'opacity', '0.6');
118 118 YUD.setStyle('add_perm', 'cursor', 'default');
119 119 });
120 MembersAutoComplete(
121 ${c.users_array|n},
122 ${c.users_groups_array|n},
123 "${_('Group')}",
124 "${_('members')}"
125 );
120 126 });
121 127
122 YAHOO.example.FnMultipleFields = function () {
123 var myUsers = ${c.users_array|n};
124 var myGroups = ${c.users_groups_array|n};
125
126 // Define a custom search function for the DataSource of users
127 var matchUsers = function (sQuery) {
128 // Case insensitive matching
129 var query = sQuery.toLowerCase();
130 var i = 0;
131 var l = myUsers.length;
132 var matches = [];
133
134 // Match against each name of each contact
135 for (; i < l; i++) {
136 contact = myUsers[i];
137 if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
138 matches[matches.length] = contact;
139 }
140 }
141 return matches;
142 };
143
144 // Define a custom search function for the DataSource of usersGroups
145 var matchGroups = function (sQuery) {
146 // Case insensitive matching
147 var query = sQuery.toLowerCase();
148 var i = 0;
149 var l = myGroups.length;
150 var matches = [];
151
152 // Match against each name of each contact
153 for (; i < l; i++) {
154 matched_group = myGroups[i];
155 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
156 matches[matches.length] = matched_group;
157 }
158 }
159 return matches;
160 };
161
162 //match all
163 var matchAll = function (sQuery) {
164 u = matchUsers(sQuery);
165 g = matchGroups(sQuery);
166 return u.concat(g);
167 };
168
169 // DataScheme for members
170 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
171 memberDS.responseSchema = {
172 fields: ["id", "fname", "lname", "nname", "grname", "grmembers"]
173 };
174
175 // DataScheme for owner
176 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
177 ownerDS.responseSchema = {
178 fields: ["id", "fname", "lname", "nname"]
179 };
180
181 // Instantiate AutoComplete for perms
182 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
183 membersAC.useShadow = false;
184 membersAC.resultTypeList = false;
185
186 // Instantiate AutoComplete for owner
187 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
188 ownerAC.useShadow = false;
189 ownerAC.resultTypeList = false;
190
191
192 // Helper highlight function for the formatter
193 var highlightMatch = function (full, snippet, matchindex) {
194 return full.substring(0, matchindex) + "<span class='match'>" + full.substr(matchindex, snippet.length) + "</span>" + full.substring(matchindex + snippet.length);
195 };
196
197 // Custom formatter to highlight the matching letters
198 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
199 var query = sQuery.toLowerCase();
200
201 if (oResultData.grname != undefined) {
202 var grname = oResultData.grname;
203 var grmembers = oResultData.grmembers;
204 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
205 var grprefix = "${_('Group')}: ";
206 var grsuffix = " (" + grmembers + " ${_('members')})";
207
208 if (grnameMatchIndex > -1) {
209 return grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix;
210 }
211
212 return grprefix + oResultData.grname + grsuffix;
213 } else if (oResultData.fname != undefined) {
214
215 var fname = oResultData.fname,
216 lname = oResultData.lname,
217 nname = oResultData.nname || "",
218 // Guard against null value
219 fnameMatchIndex = fname.toLowerCase().indexOf(query),
220 lnameMatchIndex = lname.toLowerCase().indexOf(query),
221 nnameMatchIndex = nname.toLowerCase().indexOf(query),
222 displayfname, displaylname, displaynname;
223
224 if (fnameMatchIndex > -1) {
225 displayfname = highlightMatch(fname, query, fnameMatchIndex);
226 } else {
227 displayfname = fname;
228 }
229
230 if (lnameMatchIndex > -1) {
231 displaylname = highlightMatch(lname, query, lnameMatchIndex);
232 } else {
233 displaylname = lname;
234 }
235
236 if (nnameMatchIndex > -1) {
237 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
238 } else {
239 displaynname = nname ? "(" + nname + ")" : "";
240 }
241
242 return displayfname + " " + displaylname + " " + displaynname;
243 } else {
244 return '';
245 }
246 };
247 membersAC.formatResult = custom_formatter;
248 ownerAC.formatResult = custom_formatter;
249
250 var myHandler = function (sType, aArgs) {
251
252 var myAC = aArgs[0]; // reference back to the AC instance
253 var elLI = aArgs[1]; // reference to the selected LI element
254 var oData = aArgs[2]; // object literal of selected item's result data
255 //fill the autocomplete with value
256 if (oData.nname != undefined) {
257 //users
258 myAC.getInputEl().value = oData.nname;
259 YUD.get('perm_new_member_type').value = 'user';
260 } else {
261 //groups
262 myAC.getInputEl().value = oData.grname;
263 YUD.get('perm_new_member_type').value = 'users_group';
264 }
265
266 };
267
268 membersAC.itemSelectEvent.subscribe(myHandler);
269 if(ownerAC.itemSelectEvent){
270 ownerAC.itemSelectEvent.subscribe(myHandler);
271 }
272
273 return {
274 memberDS: memberDS,
275 ownerDS: ownerDS,
276 membersAC: membersAC,
277 ownerAC: ownerAC,
278 };
279 }();
280
281 128 </script>
@@ -1,270 +1,117
1 1 <table id="permissions_manage" class="noborder">
2 2 <tr>
3 3 <td>${_('none')}</td>
4 4 <td>${_('read')}</td>
5 5 <td>${_('write')}</td>
6 6 <td>${_('admin')}</td>
7 7 <td>${_('member')}</td>
8 8 <td></td>
9 9 </tr>
10 10 ## USERS
11 11 %for r2p in c.repos_group.repo_group_to_perm:
12 12 <tr id="id${id(r2p.user.username)}">
13 13 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none')}</td>
14 14 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read')}</td>
15 15 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write')}</td>
16 16 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin')}</td>
17 17 <td style="white-space: nowrap;">
18 <img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}
18 <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username}
19 19 </td>
20 20 <td>
21 21 %if r2p.user.username !='default':
22 22 <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
23 23 ${_('revoke')}
24 24 </span>
25 25 %endif
26 26 </td>
27 27 </tr>
28 28 %endfor
29 29
30 30 ## USERS GROUPS
31 31 %for g2p in c.repos_group.users_group_to_perm:
32 32 <tr id="id${id(g2p.users_group.users_group_name)}">
33 33 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.none')}</td>
34 34 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.read')}</td>
35 35 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.write')}</td>
36 36 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.admin')}</td>
37 37 <td style="white-space: nowrap;">
38 <img style="vertical-align:bottom" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
38 <img class="perm-gravatar" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
39 39 </td>
40 40 <td>
41 41 <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
42 42 ${_('revoke')}
43 43 </span>
44 44 </td>
45 45 </tr>
46 46 %endfor
47 47 <tr id="add_perm_input">
48 48 <td>${h.radio('perm_new_member','group.none')}</td>
49 49 <td>${h.radio('perm_new_member','group.read')}</td>
50 50 <td>${h.radio('perm_new_member','group.write')}</td>
51 51 <td>${h.radio('perm_new_member','group.admin')}</td>
52 52 <td class='ac'>
53 53 <div class="perm_ac" id="perm_ac">
54 54 ${h.text('perm_new_member_name',class_='yui-ac-input')}
55 55 ${h.hidden('perm_new_member_type')}
56 56 <div id="perm_container"></div>
57 57 </div>
58 58 </td>
59 59 <td></td>
60 60 </tr>
61 61 <tr>
62 62 <td colspan="6">
63 63 <span id="add_perm" class="add_icon" style="cursor: pointer;">
64 64 ${_('Add another member')}
65 65 </span>
66 66 </td>
67 67 </tr>
68 68 </table>
69 69 <script type="text/javascript">
70 70 function ajaxActionUser(user_id, field_id) {
71 71 var sUrl = "${h.url('delete_repos_group_user_perm',group_name=c.repos_group.group_name)}";
72 72 var callback = {
73 73 success: function (o) {
74 74 var tr = YUD.get(String(field_id));
75 75 tr.parentNode.removeChild(tr);
76 76 },
77 77 failure: function (o) {
78 78 alert("${_('Failed to remove user')}");
79 79 },
80 80 };
81 81 var postData = '_method=delete&user_id=' + user_id;
82 82 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
83 83 };
84 84
85 85 function ajaxActionUsersGroup(users_group_id,field_id){
86 86 var sUrl = "${h.url('delete_repos_group_users_group_perm',group_name=c.repos_group.group_name)}";
87 87 var callback = {
88 88 success:function(o){
89 89 var tr = YUD.get(String(field_id));
90 90 tr.parentNode.removeChild(tr);
91 91 },
92 92 failure:function(o){
93 93 alert("${_('Failed to remove users group')}");
94 94 },
95 95 };
96 96 var postData = '_method=delete&users_group_id='+users_group_id;
97 97 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
98 98 };
99 99
100 100 YUE.onDOMReady(function () {
101 101 if (!YUD.hasClass('perm_new_member_name', 'error')) {
102 102 YUD.setStyle('add_perm_input', 'display', 'none');
103 103 }
104 104 YAHOO.util.Event.addListener('add_perm', 'click', function () {
105 105 YUD.setStyle('add_perm_input', 'display', '');
106 106 YUD.setStyle('add_perm', 'opacity', '0.6');
107 107 YUD.setStyle('add_perm', 'cursor', 'default');
108 108 });
109 MembersAutoComplete(
110 ${c.users_array|n},
111 ${c.users_groups_array|n},
112 "${_('Group')}",
113 "${_('members')}"
114 );
109 115 });
110 116
111 YAHOO.example.FnMultipleFields = function () {
112 var myUsers = ${c.users_array|n};
113 var myGroups = ${c.users_groups_array|n};
114
115 // Define a custom search function for the DataSource of users
116 var matchUsers = function (sQuery) {
117 // Case insensitive matching
118 var query = sQuery.toLowerCase();
119 var i = 0;
120 var l = myUsers.length;
121 var matches = [];
122
123 // Match against each name of each contact
124 for (; i < l; i++) {
125 contact = myUsers[i];
126 if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
127 matches[matches.length] = contact;
128 }
129 }
130 return matches;
131 };
132
133 // Define a custom search function for the DataSource of usersGroups
134 var matchGroups = function (sQuery) {
135 // Case insensitive matching
136 var query = sQuery.toLowerCase();
137 var i = 0;
138 var l = myGroups.length;
139 var matches = [];
140
141 // Match against each name of each contact
142 for (; i < l; i++) {
143 matched_group = myGroups[i];
144 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
145 matches[matches.length] = matched_group;
146 }
147 }
148 return matches;
149 };
150
151 //match all
152 var matchAll = function (sQuery) {
153 u = matchUsers(sQuery);
154 g = matchGroups(sQuery);
155 return u.concat(g);
156 };
157
158 // DataScheme for members
159 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
160 memberDS.responseSchema = {
161 fields: ["id", "fname", "lname", "nname", "grname", "grmembers"]
162 };
163
164 // DataScheme for owner
165 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
166 ownerDS.responseSchema = {
167 fields: ["id", "fname", "lname", "nname"]
168 };
169
170 // Instantiate AutoComplete for perms
171 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
172 membersAC.useShadow = false;
173 membersAC.resultTypeList = false;
174
175 // Instantiate AutoComplete for owner
176 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
177 ownerAC.useShadow = false;
178 ownerAC.resultTypeList = false;
179
180
181 // Helper highlight function for the formatter
182 var highlightMatch = function (full, snippet, matchindex) {
183 return full.substring(0, matchindex) + "<span class='match'>" + full.substr(matchindex, snippet.length) + "</span>" + full.substring(matchindex + snippet.length);
184 };
185
186 // Custom formatter to highlight the matching letters
187 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
188 var query = sQuery.toLowerCase();
189
190 if (oResultData.grname != undefined) {
191 var grname = oResultData.grname;
192 var grmembers = oResultData.grmembers;
193 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
194 var grprefix = "${_('Group')}: ";
195 var grsuffix = " (" + grmembers + " ${_('members')})";
196
197 if (grnameMatchIndex > -1) {
198 return grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix;
199 }
200
201 return grprefix + oResultData.grname + grsuffix;
202 } else if (oResultData.fname != undefined) {
203
204 var fname = oResultData.fname,
205 lname = oResultData.lname,
206 nname = oResultData.nname || "",
207 // Guard against null value
208 fnameMatchIndex = fname.toLowerCase().indexOf(query),
209 lnameMatchIndex = lname.toLowerCase().indexOf(query),
210 nnameMatchIndex = nname.toLowerCase().indexOf(query),
211 displayfname, displaylname, displaynname;
212
213 if (fnameMatchIndex > -1) {
214 displayfname = highlightMatch(fname, query, fnameMatchIndex);
215 } else {
216 displayfname = fname;
217 }
218
219 if (lnameMatchIndex > -1) {
220 displaylname = highlightMatch(lname, query, lnameMatchIndex);
221 } else {
222 displaylname = lname;
223 }
224
225 if (nnameMatchIndex > -1) {
226 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
227 } else {
228 displaynname = nname ? "(" + nname + ")" : "";
229 }
230
231 return displayfname + " " + displaylname + " " + displaynname;
232 } else {
233 return '';
234 }
235 };
236 membersAC.formatResult = custom_formatter;
237 ownerAC.formatResult = custom_formatter;
238
239 var myHandler = function (sType, aArgs) {
240
241 var myAC = aArgs[0]; // reference back to the AC instance
242 var elLI = aArgs[1]; // reference to the selected LI element
243 var oData = aArgs[2]; // object literal of selected item's result data
244 //fill the autocomplete with value
245 if (oData.nname != undefined) {
246 //users
247 myAC.getInputEl().value = oData.nname;
248 YUD.get('perm_new_member_type').value = 'user';
249 } else {
250 //groups
251 myAC.getInputEl().value = oData.grname;
252 YUD.get('perm_new_member_type').value = 'users_group';
253 }
254
255 };
256
257 membersAC.itemSelectEvent.subscribe(myHandler);
258 if(ownerAC.itemSelectEvent){
259 ownerAC.itemSelectEvent.subscribe(myHandler);
260 }
261
262 return {
263 memberDS: memberDS,
264 ownerDS: ownerDS,
265 membersAC: membersAC,
266 ownerAC: ownerAC,
267 };
268 }();
269
270 117 </script>
General Comments 0
You need to be logged in to leave comments. Login now