Commit fa9d5a7c authored by Robert Speicher's avatar Robert Speicher

Merge branch 'ce-to-ee' into 'master'

CE to EE 8.0.rc1

See merge request !488
parents d02febd4 2180ea91
Please view this file on the master branch, on stable branches it's out of date. Please view this file on the master branch, on stable branches it's out of date.
v 8.0.0 (unreleased) v 8.0.0 (unreleased)
- Fix broken sort in merge request API (Stan Hu)
- Bump rouge to 1.10.1 to remove warning noise and fix other syntax highlighting bugs (Stan Hu)
- Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu)
- Add "replace" and "upload" functionalities to allow user replace existing file and upload new file into current repository
- Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu)
- Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu)
- Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU)
- Fix broken Wiki Page History (Stan Hu)
- Import forked repositories asynchronously to prevent large repositories from timing out (Stan Hu)
- Prevent anchors from being hidden by header (Stan Hu)
- Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu)
- Sort issues by creation date in Bitbucket importer (Stan Hu)
- Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu)
- Improve dropdown positioning on the project home page (Hannes Rosenögger) - Improve dropdown positioning on the project home page (Hannes Rosenögger)
- Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu) - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu)
- Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
- Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu)
- Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu)
- Remove satellites - Remove satellites
...@@ -18,14 +30,42 @@ v 7.14.0 ...@@ -18,14 +30,42 @@ v 7.14.0
- Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais) - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais)
- Ability to search milestones - Ability to search milestones
- Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu) - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu)
- Improve abuse reports management from admin area - Move dashboard activity to separate page (for your projects and starred projects)
- Move dashboard activity to separate page
- Improve performance of git blame - Improve performance of git blame
- Limit content width to 1200px for most of pages to improve readability on big screens - Limit content width to 1200px for most of pages to improve readability on big screens
- Fix 500 error when submit project snippet without body
- Improve search page usability
- Bring more UI consistency in way how projects, snippets and groups lists are rendered
- Make all profiles and group public
- Fixed login failure when extern_uid changes (Joel Koglin)
- Don't notify users without access to the project when they are (accidentally) mentioned in a note.
- Retrieving oauth token with LDAP credentials
- Load Application settings from running database unless env var USE_DB=false
- Added Drone CI integration (Kirill Zaitsev)
- Refactored service API and added automatically service docs generator (Kirill Zaitsev)
- Added web_url key project hook_attrs (Kirill Zaitsev)
- Add ability to get user information by ID of an SSH key via the API
- Fix bug which IE cannot show image at markdown when the image is raw file of gitlab
- Add support for Crowd
- Global Labels that are available to all projects
- Fix highlighting of deleted lines in diffs.
- Added service API endpoint to retrieve service parameters (Petheő Bence)
- Add FogBugz project import (Jared Szechy)
- Sort users autocomplete lists by user (Allister Antosik)
v 7.14.3
- No changes
v 7.14.1 (unreleased) v 7.14.2
- Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu)
v 7.14.1
- Improve abuse reports management from admin area
- Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
- Disabled DNS lookups for SSH in docker image (Rowan Wookey)
- Only include base URL in OmniAuth full_host parameter (Stan Hu) - Only include base URL in OmniAuth full_host parameter (Stan Hu)
- Fix Error 500 in API when accessing a group that has an avatar (Stan Hu) - Fix Error 500 in API when accessing a group that has an avatar (Stan Hu)
- Ability to enable SSL verification for Webhooks
v 7.14.0 v 7.14.0
- Fix bug where non-project members of the target project could set labels on new merge requests. - Fix bug where non-project members of the target project could set labels on new merge requests.
......
...@@ -25,6 +25,7 @@ gem 'omniauth-kerberos', group: :kerberos ...@@ -25,6 +25,7 @@ gem 'omniauth-kerberos', group: :kerberos
gem 'omniauth-gitlab' gem 'omniauth-gitlab'
gem 'omniauth-bitbucket' gem 'omniauth-bitbucket'
gem 'omniauth-saml', '~> 1.4.0' gem 'omniauth-saml', '~> 1.4.0'
gem 'omniauth_crowd'
gem 'doorkeeper', '2.1.3' gem 'doorkeeper', '2.1.3'
gem "rack-oauth2", "~> 1.0.5" gem "rack-oauth2", "~> 1.0.5"
gem 'gssapi', group: :kerberos gem 'gssapi', group: :kerberos
...@@ -39,12 +40,7 @@ gem "browser", '~> 1.0.0' ...@@ -39,12 +40,7 @@ gem "browser", '~> 1.0.0'
# Extracting information from a git repository # Extracting information from a git repository
# Provide access to Gitlab::Git library # Provide access to Gitlab::Git library
gem "gitlab_git", '~> 7.2.14' gem "gitlab_git", '~> 7.2.15'
# Ruby/Rack Git Smart-HTTP Server Handler
# GitLab fork with a lot of changes (improved thread-safety, better memory usage etc)
# For full list of changes see https://github.com/SaitoWu/grack/compare/master...gitlabhq:master
gem 'gitlab-grack', '~> 2.0.2', require: 'grack'
# LDAP Auth # LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes # GitLab fork with several improvements to original library. For full list of changes
...@@ -163,6 +159,9 @@ gem "slack-notifier", "~> 1.0.0" ...@@ -163,6 +159,9 @@ gem "slack-notifier", "~> 1.0.0"
# Asana integration # Asana integration
gem 'asana', '~> 0.0.6' gem 'asana', '~> 0.0.6'
# FogBugz integration
gem 'ruby-fogbugz', '~> 0.2.1'
# d3 # d3
gem 'd3_rails', '~> 3.5.5' gem 'd3_rails', '~> 3.5.5'
...@@ -267,6 +266,7 @@ group :test do ...@@ -267,6 +266,7 @@ group :test do
gem 'email_spec', '~> 1.6.0' gem 'email_spec', '~> 1.6.0'
gem 'webmock', '~> 1.21.0' gem 'webmock', '~> 1.21.0'
gem 'test_after_commit' gem 'test_after_commit'
gem 'sham_rack'
end end
group :production do group :production do
...@@ -277,6 +277,6 @@ gem "newrelic_rpm" ...@@ -277,6 +277,6 @@ gem "newrelic_rpm"
gem 'octokit', '3.7.0' gem 'octokit', '3.7.0'
gem "mail_room", "~> 0.4.0" gem "mail_room", "~> 0.4.2"
gem 'email_reply_parser' gem 'email_reply_parser'
...@@ -253,7 +253,7 @@ GEM ...@@ -253,7 +253,7 @@ GEM
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
gemnasium-gitlab-service (0.2.6) gemnasium-gitlab-service (0.2.6)
rugged (~> 0.21) rugged (~> 0.21)
gemojione (2.0.0) gemojione (2.0.1)
json json
gherkin-ruby (0.3.1) gherkin-ruby (0.3.1)
racc racc
...@@ -263,8 +263,6 @@ GEM ...@@ -263,8 +263,6 @@ GEM
flowdock (~> 0.7) flowdock (~> 0.7)
gitlab-grit (>= 2.4.1) gitlab-grit (>= 2.4.1)
multi_json multi_json
gitlab-grack (2.0.2)
rack (~> 1.5.1)
gitlab-grit (2.7.2) gitlab-grit (2.7.2)
charlock_holmes (~> 0.6) charlock_holmes (~> 0.6)
diff-lcs (~> 1.1) diff-lcs (~> 1.1)
...@@ -275,9 +273,9 @@ GEM ...@@ -275,9 +273,9 @@ GEM
charlock_holmes (~> 0.6.6) charlock_holmes (~> 0.6.6)
escape_utils (~> 0.2.4) escape_utils (~> 0.2.4)
mime-types (~> 1.19) mime-types (~> 1.19)
gitlab_emoji (0.1.0) gitlab_emoji (0.1.1)
gemojione (~> 2.0) gemojione (~> 2.0)
gitlab_git (7.2.14) gitlab_git (7.2.15)
activesupport (~> 4.0) activesupport (~> 4.0)
charlock_holmes (~> 0.6) charlock_holmes (~> 0.6)
gitlab-linguist (~> 3.0) gitlab-linguist (~> 3.0)
...@@ -294,7 +292,7 @@ GEM ...@@ -294,7 +292,7 @@ GEM
github-markup (~> 1.3.1) github-markup (~> 1.3.1)
gollum-grit_adapter (~> 0.1, >= 0.1.1) gollum-grit_adapter (~> 0.1, >= 0.1.1)
nokogiri (~> 1.6.4) nokogiri (~> 1.6.4)
rouge (~> 1.9) rouge (~> 1.10.1)
sanitize (~> 2.1.0) sanitize (~> 2.1.0)
stringex (~> 2.5.1) stringex (~> 2.5.1)
gon (5.0.1) gon (5.0.1)
...@@ -375,7 +373,7 @@ GEM ...@@ -375,7 +373,7 @@ GEM
systemu (~> 2.6.2) systemu (~> 2.6.2)
mail (2.6.3) mail (2.6.3)
mime-types (>= 1.16, < 3) mime-types (>= 1.16, < 3)
mail_room (0.4.0) mail_room (0.4.2)
method_source (0.8.2) method_source (0.8.2)
mime-types (1.25.1) mime-types (1.25.1)
mimemagic (0.3.0) mimemagic (0.3.0)
...@@ -439,6 +437,10 @@ GEM ...@@ -439,6 +437,10 @@ GEM
omniauth-twitter (1.0.1) omniauth-twitter (1.0.1)
multi_json (~> 1.3) multi_json (~> 1.3)
omniauth-oauth (~> 1.0) omniauth-oauth (~> 1.0)
omniauth_crowd (2.2.3)
activesupport
nokogiri (>= 1.4.4)
omniauth (~> 1.0)
opennebula (4.12.1) opennebula (4.12.1)
json json
nokogiri nokogiri
...@@ -465,7 +467,7 @@ GEM ...@@ -465,7 +467,7 @@ GEM
pyu-ruby-sasl (0.0.3.3) pyu-ruby-sasl (0.0.3.3)
quiet_assets (1.0.2) quiet_assets (1.0.2)
railties (>= 3.1, < 5.0) railties (>= 3.1, < 5.0)
racc (1.4.10) racc (1.4.12)
rack (1.5.5) rack (1.5.5)
rack-accept (0.4.5) rack-accept (0.4.5)
rack (>= 0.4) rack (>= 0.4)
...@@ -545,7 +547,7 @@ GEM ...@@ -545,7 +547,7 @@ GEM
netrc (~> 0.7) netrc (~> 0.7)
rinku (1.7.3) rinku (1.7.3)
rotp (1.6.1) rotp (1.6.1)
rouge (1.9.1) rouge (1.10.1)
rqrcode (0.4.2) rqrcode (0.4.2)
rqrcode-rails3 (0.1.7) rqrcode-rails3 (0.1.7)
rqrcode (>= 0.4.2) rqrcode (>= 0.4.2)
...@@ -576,6 +578,8 @@ GEM ...@@ -576,6 +578,8 @@ GEM
powerpack (~> 0.0.6) powerpack (~> 0.0.6)
rainbow (>= 1.99.1, < 3.0) rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
ruby-fogbugz (0.2.1)
crack (~> 0.4)
ruby-progressbar (1.7.1) ruby-progressbar (1.7.1)
ruby-saml (1.0.0) ruby-saml (1.0.0)
nokogiri (>= 1.5.10) nokogiri (>= 1.5.10)
...@@ -610,6 +614,8 @@ GEM ...@@ -610,6 +614,8 @@ GEM
thor (~> 0.14) thor (~> 0.14)
settingslogic (2.0.9) settingslogic (2.0.9)
sexp_processor (4.4.5) sexp_processor (4.4.5)
sham_rack (1.3.6)
rack
shoulda-matchers (2.8.0) shoulda-matchers (2.8.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
sidekiq (3.3.0) sidekiq (3.3.0)
...@@ -790,11 +796,10 @@ DEPENDENCIES ...@@ -790,11 +796,10 @@ DEPENDENCIES
gemnasium-gitlab-service (~> 0.2) gemnasium-gitlab-service (~> 0.2)
github-markup github-markup
gitlab-flowdock-git-hook (~> 1.0.1) gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-grack (~> 2.0.2)
gitlab-license (~> 0.0.2) gitlab-license (~> 0.0.2)
gitlab-linguist (~> 3.0.1) gitlab-linguist (~> 3.0.1)
gitlab_emoji (~> 0.1) gitlab_emoji (~> 0.1)
gitlab_git (~> 7.2.14) gitlab_git (~> 7.2.15)
gitlab_meta (= 7.0) gitlab_meta (= 7.0)
gitlab_omniauth-ldap (= 1.2.1) gitlab_omniauth-ldap (= 1.2.1)
gollum-lib (~> 4.0.2) gollum-lib (~> 4.0.2)
...@@ -813,7 +818,7 @@ DEPENDENCIES ...@@ -813,7 +818,7 @@ DEPENDENCIES
jquery-ui-rails jquery-ui-rails
kaminari (~> 0.15.1) kaminari (~> 0.15.1)
letter_opener letter_opener
mail_room (~> 0.4.0) mail_room (~> 0.4.2)
minitest (~> 5.3.0) minitest (~> 5.3.0)
mousetrap-rails mousetrap-rails
mysql2 mysql2
...@@ -830,6 +835,7 @@ DEPENDENCIES ...@@ -830,6 +835,7 @@ DEPENDENCIES
omniauth-saml (~> 1.4.0) omniauth-saml (~> 1.4.0)
omniauth-shibboleth omniauth-shibboleth
omniauth-twitter omniauth-twitter
omniauth_crowd
org-ruby (= 0.9.12) org-ruby (= 0.9.12)
pg pg
poltergeist (~> 1.6.0) poltergeist (~> 1.6.0)
...@@ -849,12 +855,14 @@ DEPENDENCIES ...@@ -849,12 +855,14 @@ DEPENDENCIES
rqrcode-rails3 rqrcode-rails3
rspec-rails (~> 3.3.0) rspec-rails (~> 3.3.0)
rubocop (= 0.28.0) rubocop (= 0.28.0)
ruby-fogbugz (~> 0.2.1)
sanitize (~> 2.0) sanitize (~> 2.0)
sass-rails (~> 4.0.5) sass-rails (~> 4.0.5)
sdoc sdoc
seed-fu seed-fu
select2-rails (~> 3.5.9) select2-rails (~> 3.5.9)
settingslogic settingslogic
sham_rack
shoulda-matchers (~> 2.8.0) shoulda-matchers (~> 2.8.0)
sidekiq (~> 3.3) sidekiq (~> 3.3)
sidetiq (= 0.6.3) sidetiq (= 0.6.3)
...@@ -887,6 +895,3 @@ DEPENDENCIES ...@@ -887,6 +895,3 @@ DEPENDENCIES
virtus virtus
webmock (~> 1.21.0) webmock (~> 1.21.0)
wikicloth (= 0.8.1) wikicloth (= 0.8.1)
BUNDLED WITH
1.10.6
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
[![build status](https://ci.gitlab.com/projects/1/status.png?ref=master)](https://ci.gitlab.com/projects/1?ref=master) [![build status](https://ci.gitlab.com/projects/1/status.png?ref=master)](https://ci.gitlab.com/projects/1?ref=master)
[![Build Status](https://semaphoreci.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/400484/shields_badge.svg)](https://semaphoreci.com/gitlabhq/gitlabhq) [![Build Status](https://semaphoreci.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/400484/shields_badge.svg)](https://semaphoreci.com/gitlabhq/gitlabhq)
[![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq) [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq)
[![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master) [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.svg?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master)
## Canonical source ## Canonical source
......
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
class @Activities class @Activities
constructor: -> constructor: ->
Pager.init 20, true Pager.init 20, true
$(".event_filter_link").bind "click", (event) => $(".event-filter .btn").bind "click", (event) =>
event.preventDefault() event.preventDefault()
@toggleFilter($(event.currentTarget)) @toggleFilter($(event.currentTarget))
@reloadActivities() @reloadActivities()
...@@ -12,7 +12,7 @@ class @Activities ...@@ -12,7 +12,7 @@ class @Activities
toggleFilter: (sender) -> toggleFilter: (sender) ->
sender.parent().toggleClass "active" sender.toggleClass "active"
event_filters = $.cookie("event_filter") event_filters = $.cookie("event_filter")
filter = sender.attr("id").split("_")[0] filter = sender.attr("id").split("_")[0]
if event_filters if event_filters
......
...@@ -94,18 +94,20 @@ window.unbindEvents = -> ...@@ -94,18 +94,20 @@ window.unbindEvents = ->
$(document).off('scroll') $(document).off('scroll')
window.shiftWindow = -> window.shiftWindow = ->
scrollBy 0, -50 scrollBy 0, -100
document.addEventListener("page:fetch", unbindEvents) document.addEventListener("page:fetch", unbindEvents)
# Scroll the window to avoid the topnav bar
# https://github.com/twitter/bootstrap/issues/1768
if location.hash
setTimeout shiftWindow, 1
window.addEventListener "hashchange", shiftWindow window.addEventListener "hashchange", shiftWindow
$.timeago.settings.allowFuture = true $.timeago.settings.allowFuture = true
window.onload = ->
# Scroll the window to avoid the topnav bar
# https://github.com/twitter/bootstrap/issues/1768
if location.hash
setTimeout shiftWindow, 100
$ -> $ ->
$(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF")
......
class @BlobFileDropzone
constructor: (form, method) ->
form_dropzone = form.find('.dropzone')
Dropzone.autoDiscover = false
dropzone = form_dropzone.dropzone(
autoDiscover: false
autoProcessQueue: false
url: form.attr('action')
# Rails uses a hidden input field for PUT
# http://stackoverflow.com/questions/21056482/how-to-set-method-put-in-form-tag-in-rails
method: method
clickable: true
uploadMultiple: false
paramName: "file"
maxFilesize: gon.max_file_size or 10
parallelUploads: 1
maxFiles: 1
addRemoveLinks: true
previewsContainer: '.dropzone-previews'
headers:
"X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
init: ->
this.on 'addedfile', (file) ->
$('.dropzone-alerts').html('').hide()
commit_message = form.find('#commit_message')[0]
if /^Upload/.test(commit_message.placeholder)
commit_message.placeholder = 'Upload ' + file.name
return
this.on 'removedfile', (file) ->
commit_message = form.find('#commit_message')[0]
if /^Upload/.test(commit_message.placeholder)
commit_message.placeholder = 'Upload new file'
return
this.on 'success', (header, response) ->
window.location.href = response.filePath
return
this.on 'maxfilesexceeded', (file) ->
@removeFile file
return
this.on 'sending', (file, xhr, formData) ->
formData.append('commit_message', form.find('#commit_message').val())
return
# Override behavior of adding error underneath preview
error: (file, errorMessage) ->
stripped = $("<div/>").html(errorMessage).text();
$('.dropzone-alerts').html('Error uploading file: \"' + stripped + '\"').show()
@removeFile file
return
)
submitButton = form.find('#submit-all')[0]
submitButton.addEventListener 'click', (e) ->
e.preventDefault()
e.stopPropagation()
alert "Please select a file" if dropzone[0].dropzone.getQueuedFiles().length == 0
dropzone[0].dropzone.processQueue()
return false
...@@ -55,7 +55,6 @@ class Dispatcher ...@@ -55,7 +55,6 @@ class Dispatcher
new Activities() new Activities()
when 'dashboard:projects:starred' when 'dashboard:projects:starred'
new Activities() new Activities()
new ProjectsList()
when 'projects:commit:show' when 'projects:commit:show'
new Commit() new Commit()
new Diff() new Diff()
...@@ -70,7 +69,6 @@ class Dispatcher ...@@ -70,7 +69,6 @@ class Dispatcher
when 'groups:show' when 'groups:show'
new Activities() new Activities()
shortcut_handler = new ShortcutsNavigation() shortcut_handler = new ShortcutsNavigation()
new ProjectsList()
when 'groups:group_members:index' when 'groups:group_members:index'
new GroupMembers() new GroupMembers()
new UsersSelect() new UsersSelect()
...@@ -100,8 +98,6 @@ class Dispatcher ...@@ -100,8 +98,6 @@ class Dispatcher
new GroupsSelect() new GroupsSelect()
when 'admin:emails:show' when 'admin:emails:show'
new AdminEmailSelect() new AdminEmailSelect()
when 'admin:users:show'
new ProjectsList()
switch path.first() switch path.first()
when 'admin' when 'admin'
......
...@@ -167,6 +167,7 @@ class @DropzoneInput ...@@ -167,6 +167,7 @@ class @DropzoneInput
dataType: "json" dataType: "json"
).success (data) -> ).success (data) ->
preview.html data.body preview.html data.body
preview.syntaxHighlight()
renderReferencedUsers data.references.users renderReferencedUsers data.references.users
......
...@@ -122,7 +122,9 @@ class @Notes ...@@ -122,7 +122,9 @@ class @Notes
# or skip if rendered # or skip if rendered
if @isNewNote(note) if @isNewNote(note)
@note_ids.push(note.id) @note_ids.push(note.id)
$('ul.main-notes-list').append(note.html) $('ul.main-notes-list').
append(note.html).
syntaxHighlight()
@initTaskList() @initTaskList()
### ###
......
# Syntax Highlighter
#
# Applies a syntax highlighting color scheme CSS class to any element with the
# `js-syntax-highlight` class
#
# ### Example Markup
#
# <div class="js-syntax-highlight"></div>
#
$.fn.syntaxHighlight = ->
if $(this).hasClass('js-syntax-highlight')
# Given the element itself, apply highlighting
$(this).addClass(gon.user_color_scheme)
else
# Given a parent element, recurse to any of its applicable children
$children = $(this).find('.js-syntax-highlight')
$children.syntaxHighlight() if $children.length
$(document).on 'ready page:load', ->
$('.js-syntax-highlight').syntaxHighlight()
...@@ -38,6 +38,8 @@ class @ZenMode ...@@ -38,6 +38,8 @@ class @ZenMode
@active_checkbox = $(checkbox) @active_checkbox = $(checkbox)
@active_checkbox.prop('checked', true) @active_checkbox.prop('checked', true)
@active_zen_area = @active_checkbox.parent().find('textarea') @active_zen_area = @active_checkbox.parent().find('textarea')
# Prevent a user-resized textarea from persisting to fullscreen
@active_zen_area.removeAttr('style')
@active_zen_area.focus() @active_zen_area.focus()
exitZenMode: => exitZenMode: =>
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
@import "base/fonts";
@import "base/variables"; @import "base/variables";
@import "base/mixins"; @import "base/mixins";
@import "base/layout"; @import "base/layout";
......
/* latin-ext */
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 300;
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), font-url('SourceSansPro-Light.ttf');
}
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 400;
src: local('Source Sans Pro'), local('SourceSansPro-Regular'), font-url('SourceSansPro-Regular.ttf');
}
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 600;
src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), font-url('SourceSansPro-Semibold.ttf');
}
@font-face {
font-family: 'Source Sans Pro';
font-style: normal;
font-weight: 700;
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), font-url('SourceSansPro-Bold.ttf');
}
...@@ -85,14 +85,14 @@ ...@@ -85,14 +85,14 @@
// Labels // Labels
.label { .label {
padding: 2px 4px; padding: 2px 4px;
font-size: 12px; font-size: 13px;
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
display: inline-block; display: inline-block;
&.label-gray { &.label-gray {
background-color: #eee; background-color: #f8fafc;
color: #999; color: $gl-gray;
text-shadow: none; text-shadow: none;
} }
...@@ -156,10 +156,16 @@ ...@@ -156,10 +156,16 @@
* Add some extra stuff to panels * Add some extra stuff to panels
* *
*/ */
.container-blank .panel .panel-heading {
font-size: 17px;
line-height: 38px;
}
.panel { .panel {
.panel-heading { box-shadow: none;
font-weight: bold;
.panel-heading {
.panel-head-actions { .panel-head-actions {
position: relative; position: relative;
top: -5px; top: -5px;
...@@ -182,6 +188,10 @@ ...@@ -182,6 +188,10 @@
.pagination { .pagination {
margin: 0; margin: 0;
} }
.btn {
min-width: 124px;
}
} }
&.panel-small { &.panel-small {
...@@ -209,6 +219,12 @@ ...@@ -209,6 +219,12 @@
} }
} }
.alert-help {
background-color: $background-color;
border: 1px solid $border-color;
color: $gl-gray;
}
// Typography ================================================================= // Typography =================================================================
.text-primary, .text-primary,
......
...@@ -22,6 +22,10 @@ $brand-info: $gl-info; ...@@ -22,6 +22,10 @@ $brand-info: $gl-info;
$brand-warning: $gl-warning; $brand-warning: $gl-warning;
$brand-danger: $gl-danger; $brand-danger: $gl-danger;
$border-radius-base: 3px !default;
$border-radius-large: 5px !default;
$border-radius-small: 2px !default;
//== Scaffolding //== Scaffolding
// //
...@@ -42,17 +46,18 @@ $font-size-base: $gl-font-size; ...@@ -42,17 +46,18 @@ $font-size-base: $gl-font-size;
// //
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). //## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
$padding-base-vertical: 6px; $padding-base-vertical: 9px;
$padding-base-horizontal: 14px; $padding-base-horizontal: $gl-padding;
$component-active-color: #fff;
$component-active-bg: $brand-info;
//== Forms //== Forms
// //
//## //##
$input-color: $text-color; $input-color: $text-color;
$input-border: #DDD; $input-border: #e7e9ed;
$input-border-focus: $brand-info; $input-border-focus: #7F8FA4;
$legend-color: $text-color; $legend-color: $text-color;
...@@ -109,11 +114,12 @@ $alert-border-radius: 0; ...@@ -109,11 +114,12 @@ $alert-border-radius: 0;
// //
//## //##
$panel-border-radius: 0; $panel-border-radius: 2px;
$panel-default-text: $text-color; $panel-default-text: $text-color;
$panel-default-border: $border-color; $panel-default-border: $border-color;
$panel-default-heading-bg: $background-color; $panel-default-heading-bg: $background-color;
$panel-footer-bg: $background-color;
$panel-inner-border: $border-color;
//== Wells //== Wells
// //
...@@ -131,3 +137,22 @@ $code-bg: #f9f2f4; ...@@ -131,3 +137,22 @@ $code-bg: #f9f2f4;
$kbd-color: #fff; $kbd-color: #fff;
$kbd-bg: #333; $kbd-bg: #333;
//== Buttons
//
//##
$btn-default-color: $gl-text-color;
$btn-default-bg: #fff;
$btn-default-border: #e7e9ed;
//== Nav
//
//##
$nav-link-padding: 13px $gl-padding;
//== Code
//
//##
$pre-bg: #f8fafc !default;
$pre-color: $gl-gray !default;
$pre-border-color: #e7e9ed;
...@@ -21,7 +21,6 @@ html { ...@@ -21,7 +21,6 @@ html {
margin-top: 30px; margin-top: 30px;
} }
.container-limited { .container-limited {
max-width: $fixed-layout-width; max-width: $fixed-layout-width;
} }
...@@ -55,8 +55,11 @@ ...@@ -55,8 +55,11 @@
} }
@mixin md-typography { @mixin md-typography {
font-size: 15px; color: $md-text-color;
line-height: 1.5;
a {
color: $md-link-color;
}
img { img {
max-width: 100%; max-width: 100%;
...@@ -157,3 +160,94 @@ ...@@ -157,3 +160,94 @@
white-space: nowrap; white-space: nowrap;
max-width: $max_width; max-width: $max_width;
} }
/*
* Base mixin for lists in GitLab
*/
@mixin basic-list {
margin: 5px 0px;
padding: 0px;
list-style: none;
> li {
padding: 10px 0;
border-bottom: 1px solid #EEE;
overflow: hidden;
display: block;
margin: 0px;
&:last-child {
border-bottom: none;
}
&.active {
background: #f9f9f9;
a {
font-weight: bold;
}
}
&.hide {
display: none;
}
&.light {
a {
color: $gl-gray;
}
}
}
}
@mixin input-big {
height: 36px;
padding: 5px 10px;
font-size: 16px;
line-height: 24px;
color: #7f8fa4;
background-color: #fff;
border-color: #e7e9ed;
}
@mixin btn-big {
height: 36px;
padding: 5px 10px;
font-size: 16px;
line-height: 24px;
}
@mixin nav-menu {
padding: 0;
margin: 0;
list-style: none;
margin-top: 5px;
height: 56px;
li {
display: inline-block;
a {
padding: 14px;
font-size: 17px;
line-height: 28px;
color: #7f8fa4;
border-bottom: 2px solid transparent;
&:hover, &:active, &:focus {
text-decoration: none;
}
}
&.active a {
color: #4c4e54;
border-bottom: 2px solid #1cacfc;
}
.badge {
font-weight: normal;
background-color: #fff;
background-color: #eee;
color: #78a;
}
}
}
$style_color: #474D57;
$hover: #FFFAF1; $hover: #FFFAF1;
$gl-text-color: #222222; $gl-text-color: #54565b;
$gl-link-color: #446e9b; $gl-header-color: #4c4e54;
$gl-link-color: #333c48;
$md-text-color: #444;
$md-link-color: #3084bb;
$nprogress-color: #c0392b; $nprogress-color: #c0392b;
$gl-font-size: 14px; $gl-font-size: 15px;
$list-font-size: 15px; $list-font-size: 15px;
$sidebar_collapsed_width: 52px; $sidebar_collapsed_width: 62px;
$sidebar_width: 230px; $sidebar_width: 230px;
$avatar_radius: 50%; $avatar_radius: 50%;
$code_font_size: 13px; $code_font_size: 13px;
$code_line_height: 1.5; $code_line_height: 1.5;
$border-color: #E5E5E5; $border-color: #E7E9ED;
$background-color: #f5f5f5; $background-color: #F8FAFC;
$header-height: 50px; $header-height: 58px;
$fixed-layout-width: 1200px; $fixed-layout-width: 1200px;
$gl-gray: #7f8fa4;
$gl-padding: 16px;
$gl-avatar-size: 46px;
/* /*
* State colors: * State colors:
*/ */
$gl-primary: #446e9b; $gl-primary: #446e9b;
$gl-success: #019875; $gl-success: #44c679;
$gl-info: #029ACF; $gl-info: #00aaff;
$gl-warning: #EB9532; $gl-warning: #EB9532;
$gl-danger: #d9534f; $gl-danger: #d9534f;
...@@ -35,4 +40,4 @@ $deleted: #f77; ...@@ -35,4 +40,4 @@ $deleted: #f77;
* Fonts * Fonts
*/ */
$monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace; $monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;
$regular_font: "Helvetica Neue", Helvetica, Arial, sans-serif; $regular_font: 'Source Sans Pro', "Helvetica Neue", Helvetica, Arial, sans-serif;
...@@ -23,8 +23,12 @@ ...@@ -23,8 +23,12 @@
&.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s24 { width: 24px; height: 24px; margin-right: 8px; }
&.s26 { width: 26px; height: 26px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; }
&.s32 { width: 32px; height: 32px; margin-right: 10px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; }
&.s36 { width: 36px; height: 36px; margin-right: 10px; }
&.s46 { width: 46px; height: 46px; margin-right: 15px; }
&.s48 { width: 48px; height: 48px; margin-right: 10px; }
&.s60 { width: 60px; height: 60px; margin-right: 12px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; }
&.s90 { width: 90px; height: 90px; margin-right: 15px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; }
&.s140 { width: 140px; height: 140px; margin-right: 20px; }
&.s160 { width: 160px; height: 160px; margin-right: 20px; } &.s160 { width: 160px; height: 160px; margin-right: 20px; }
} }
...@@ -38,5 +42,6 @@ ...@@ -38,5 +42,6 @@
&.s32 { font-size: 22px; line-height: 32px; } &.s32 { font-size: 22px; line-height: 32px; }
&.s60 { font-size: 32px; line-height: 60px; } &.s60 { font-size: 32px; line-height: 60px; }
&.s90 { font-size: 36px; line-height: 90px; } &.s90 { font-size: 36px; line-height: 90px; }
&.s160 { font-size: 96px; line-height: 1.33; } &.s140 { font-size: 72px; line-height: 140px; }
&.s160 { font-size: 96px; line-height: 160px; }
} }
.light-well { .light-well {
background: #f9f9f9; background-color: #f8fafc;
padding: 15px; padding: 15px;
} }
.centered-light-block { .centered-light-block {
text-align: center; text-align: center;
color: #888; color: $gl-gray;
margin: 20px; margin: 20px;
} }
.nothing-here-block { .nothing-here-block {
text-align: center; text-align: center;
padding: 20px; padding: 20px;
color: #666; color: $gl-gray;
font-weight: normal; font-weight: normal;
font-size: 16px; font-size: 16px;
line-height: 36px; line-height: 36px;
} }
.gray-content-block {
margin: -$gl-padding;
background-color: #f8fafc;
padding: $gl-padding;
margin-bottom: 0px;
border-top: 1px solid #e7e9ed;
border-bottom: 1px solid #e7e9ed;
color: $gl-gray;
&.top-block {
border-top: none;
}
&.middle-block {
margin-top: 0;
margin-bottom: 0;
}
&.clear-block {
margin-bottom: $gl-padding - 1px;
padding-bottom: $gl-padding;
}
&.second-block {
margin-top: -1px;
margin-bottom: 0;
}
&.footer-block {
margin-top: 0;
margin-bottom: -$gl-padding;
}
.title {
color: $gl-text-color;
}
.oneline {
line-height: 42px;
}
}
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
} }
&.btn-save { &.btn-save {
@extend .btn-primary; @extend .btn-success;
} }
&.btn-remove { &.btn-remove {
...@@ -72,3 +72,19 @@ ...@@ -72,3 +72,19 @@
} }
} }
} }
.btn-group-next {
.btn {
padding: 9px 0px;
font-size: 15px;
color: #7f8fa4;
border-color: #e7e9ed;
width: 140px;
&.active {
border-color: $gl-info;
background: $gl-info;
color: #fff;
}
}
}
/** COLORS **/ /** COLORS **/
.cgray { color: gray } .cgray { color: $gl-gray; }
.clgray { color: #BBB } .clgray { color: #BBB }
.cred { color: #D12F19 } .cred { color: #D12F19 }
.cgreen { color: #4a2 } .cgreen { color: #4a2 }
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
/** COMMON CLASSES **/ /** COMMON CLASSES **/
.prepend-top-10 { margin-top:10px } .prepend-top-10 { margin-top:10px }
.prepend-top-default { margin-top: $gl-padding; }
.prepend-top-20 { margin-top:20px } .prepend-top-20 { margin-top:20px }
.prepend-left-10 { margin-left:10px } .prepend-left-10 { margin-left:10px }
.prepend-left-20 { margin-left:20px } .prepend-left-20 { margin-left:20px }
...@@ -20,10 +21,10 @@ ...@@ -20,10 +21,10 @@
.underlined-link { text-decoration: underline; } .underlined-link { text-decoration: underline; }
.hint { font-style: italic; color: #999; } .hint { font-style: italic; color: #999; }
.light { color: #888 } .light { color: $gl-gray; }
.slead { .slead {
color: #666; color: $gl-gray;
font-size: 15px; font-size: 15px;
margin-bottom: 12px; margin-bottom: 12px;
font-weight: normal; font-weight: normal;
...@@ -74,8 +75,6 @@ pre { ...@@ -74,8 +75,6 @@ pre {
color: $gl-link-color; color: $gl-link-color;
} }
.help li { color:$style_color; }
.back-link { .back-link {
font-size: 14px; font-size: 14px;
} }
...@@ -132,10 +131,6 @@ p.time { ...@@ -132,10 +131,6 @@ p.time {
text-shadow: none; text-shadow: none;
} }
.highlight_word {
background: #fafe3d;
}
.thin_area{ .thin_area{
height: 150px; height: 150px;
} }
...@@ -316,7 +311,7 @@ table { ...@@ -316,7 +311,7 @@ table {
} }
.btn-sign-in { .btn-sign-in {
margin-top: 7px; margin-top: 15px;
text-shadow: none; text-shadow: none;
} }
...@@ -368,14 +363,14 @@ table { ...@@ -368,14 +363,14 @@ table {
} }
.description { .description {
font-size: 16px; font-size: $gl-font-size;
color: #666; color: #666;
margin-top: 8px; margin-top: 8px;
} }
} }
.profiler-results { .profiler-results {
top: 50px !important; top: 73px !important;
.profiler-button, .profiler-button,
.profiler-controls { .profiler-controls {
...@@ -384,21 +379,23 @@ table { ...@@ -384,21 +379,23 @@ table {
} }
.center-top-menu { .center-top-menu {
border-bottom: 1px solid #EEE; @include nav-menu;
list-style: none;
text-align: center; text-align: center;
padding-bottom: 15px; margin-top: 5px;
margin-bottom: 15px; margin-bottom: $gl-padding;
height: 56px;
margin-top: -$gl-padding;
padding-top: $gl-padding;
li { &.no-bottom {
display: inline-block; margin-bottom: 0;
a {
padding: 10px;
} }
}
&.active a { .dropzone .dz-preview .dz-progress {
color: #666; border-color: $border-color !important;
} }
}
.dropzone .dz-preview .dz-progress .dz-upload {
background: $gl-success !important;
} }
...@@ -3,7 +3,11 @@ ...@@ -3,7 +3,11 @@
* *
*/ */
.file-holder { .file-holder {
border: 1px solid $border-color; margin-left: -$gl-padding;
margin-right: -$gl-padding;
border: none;
border-top: 1px solid #E7E9EE;
border-bottom: 1px solid #E7E9EE;
margin-bottom: 1em; margin-bottom: 1em;
table { table {
...@@ -49,7 +53,7 @@ ...@@ -49,7 +53,7 @@
} }
&.wiki { &.wiki {
padding: 25px; padding: $gl-padding;
.highlight { .highlight {
margin-bottom: 9px; margin-bottom: 9px;
...@@ -90,7 +94,7 @@ ...@@ -90,7 +94,7 @@
border-right: none; border-right: none;
} }
background: #fff; background: #fff;
padding: 8px; padding: 10px $gl-padding;
} }
.lines { .lines {
pre { pre {
...@@ -100,6 +104,33 @@ ...@@ -100,6 +104,33 @@
border: none; border: none;
} }
} }
img.avatar {
border: 0 none;
float: none;
margin: 0;
padding: 0;
}
td.blame-commit {
background: #f9f9f9;
min-width: 350px;
.commit-author-link {
color: #888;
}
}
td.blame-numbers {
pre {
color: #AAA;
white-space: pre;
}
background: #f1f1f1;
border-left: 1px solid #DDD;
}
td.lines {
code {
font-family: $monospace_font;
}
}
} }
&.logs { &.logs {
......
...@@ -2,31 +2,6 @@ ...@@ -2,31 +2,6 @@
margin-right: 15px; margin-right: 15px;
} }
.issues-state-filters {
li.active a {
border-color: #DDD !important;
&, &:hover, &:active, &.active {
background: #f5f5f5 !important;
border-bottom: 1px solid #f5f5f5 !important;
}
}
}
.issues-details-filters {
font-size: 13px;
background: #f5f5f5;
margin: -10px 0;
padding: 10px 15px;
margin-top: -15px;
border-left: 1px solid #DDD;
border-right: 1px solid #DDD;
.btn {
font-size: 13px;
}
}
@media (min-width: 800px) { @media (min-width: 800px) {
.issues-filters, .issues-filters,
.issues_bulk_update { .issues_bulk_update {
......
...@@ -24,29 +24,28 @@ header { ...@@ -24,29 +24,28 @@ header {
z-index: 100; z-index: 100;
margin-bottom: 0; margin-bottom: 0;
min-height: $header-height; min-height: $header-height;
background-color: #fff;
border: none; border: none;
border-bottom: 1px solid #EEE; border-bottom: 1px solid #EEE;
.container-fluid { .container-fluid {
background: #FFF;
width: 100% !important; width: 100% !important;
filter: none; filter: none;
padding: 0;
.nav > li > a { .nav > li > a {
color: #888; color: #7f8fa4;
font-size: 14px; font-size: 18px;
padding: 0; padding: 0;
background-color: #f5f5f5;
margin: ($header-height - 28) / 2 0; margin: ($header-height - 28) / 2 0;
margin-left: 10px; margin-left: 10px;
border-radius: 40px;
height: 28px; height: 28px;
width: 28px; width: 28px;
line-height: 28px; line-height: 28px;
text-align: center; text-align: center;
&:hover, &:focus, &:active { &:hover, &:focus, &:active {
background-color: #EEE; background-color: #FFF;
} }
} }
...@@ -56,6 +55,7 @@ header { ...@@ -56,6 +55,7 @@ header {
border-radius: 0; border-radius: 0;
position: absolute; position: absolute;
right: 2px; right: 2px;
top: 15px;
&:hover { &:hover {
background-color: #EEE; background-color: #EEE;
...@@ -70,16 +70,16 @@ header { ...@@ -70,16 +70,16 @@ header {
.title { .title {
margin: 0; margin: 0;
overflow: hidden; overflow: hidden;
font-size: 18px; font-size: 19px;
line-height: $header-height; line-height: $header-height;
font-weight: bold; font-weight: normal;
color: #444; color: #4c4e54;
text-overflow: ellipsis; text-overflow: ellipsis;
vertical-align: top; vertical-align: top;
white-space: nowrap; white-space: nowrap;
a { a {
color: #444; color: #4c4e54;
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
} }
...@@ -94,7 +94,7 @@ header { ...@@ -94,7 +94,7 @@ header {
.search { .search {
margin-right: 10px; margin-right: 10px;
margin-left: 10px; margin-left: 10px;
margin-top: ($header-height - 28) / 2; margin-top: ($header-height - 36) / 2;
form { form {
margin: 0; margin: 0;
...@@ -105,13 +105,8 @@ header { ...@@ -105,13 +105,8 @@ header {
width: 220px; width: 220px;
background-image: image-url("icon-search.png"); background-image: image-url("icon-search.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 10px; background-position: 195px;
height: inherit; @include input-big;
padding: 4px 6px;
padding-left: 25px;
font-size: 13px;
background-color: #f5f5f5;
border-color: #f5f5f5;
&:focus { &:focus {
@include box-shadow(none); @include box-shadow(none);
......
...@@ -5,10 +5,13 @@ ...@@ -5,10 +5,13 @@
*/ */
.issue-box { .issue-box {
@include border-radius(3px);
display: inline-block; display: inline-block;
padding: 4px 13px; padding: 10px $gl-padding;
font-weight: normal; font-weight: normal;
margin-right: 5px; margin-right: 10px;
font-size: $gl-font-size;
&.issue-box-closed { &.issue-box-closed {
background-color: $gl-danger; background-color: $gl-danger;
...@@ -21,7 +24,7 @@ ...@@ -21,7 +24,7 @@
} }
&.issue-box-open { &.issue-box-open {
background-color: $gl-success; background-color: #019875;
color: #FFF; color: #FFF;
} }
......
...@@ -49,8 +49,6 @@ ...@@ -49,8 +49,6 @@
} }
} }
.author { color: #999; }
.list-item-name { .list-item-name {
float: left; float: left;
position: relative; position: relative;
...@@ -71,15 +69,6 @@ ...@@ -71,15 +69,6 @@
font-size: $list-font-size; font-size: $list-font-size;
line-height: 18px; line-height: 18px;
} }
.row_title {
color: $gray-dark;
&:hover {
color: $text-color;
text-decoration: underline;
}
}
} }
} }
...@@ -93,28 +82,12 @@ ol, ul { ...@@ -93,28 +82,12 @@ ol, ul {
/** light list with border-bottom between li **/ /** light list with border-bottom between li **/
ul.bordered-list { ul.bordered-list {
margin: 5px 0px; @include basic-list;
padding: 0px;
li {
padding: 5px 0;
border-bottom: 1px solid #EEE;
overflow: hidden;
display: block;
margin: 0px;
&:last-child { border:none }
&.active {
background: #f9f9f9;
a { font-weight: bold; }
}
&.light {
a { color: #777; }
}
}
&.top-list { &.top-list {
li:first-child { li:first-child {
padding-top: 0; padding-top: 0;
h4, h5 { h4, h5 {
margin-top: 0; margin-top: 0;
} }
...@@ -125,3 +98,28 @@ ul.bordered-list { ...@@ -125,3 +98,28 @@ ul.bordered-list {
li.task-list-item { li.task-list-item {
list-style-type: none; list-style-type: none;
} }
ul.content-list {
@include basic-list;
margin: 0;
padding: 0;
> li {
padding: $gl-padding;
border-color: #f1f2f4;
margin-left: -$gl-padding;
margin-right: -$gl-padding;
color: $gl-gray;
.avatar {
margin-right: 15px;
}
.controls {
padding-top: 10px;
float: right;
}
}
}
...@@ -65,8 +65,11 @@ ...@@ -65,8 +65,11 @@
position: relative; position: relative;
} }
.md-header ul { .md-header {
ul {
float: left; float: left;
margin-bottom: 1px;
}
} }
.referenced-users { .referenced-users {
...@@ -80,7 +83,7 @@ ...@@ -80,7 +83,7 @@
.md-preview-holder { .md-preview-holder {
background: #FFF; background: #FFF;
border: 1px solid #ddd; border: 1px solid #ddd;
min-height: 100px; min-height: 169px;
padding: 5px; padding: 5px;
box-shadow: none; box-shadow: none;
} }
...@@ -105,7 +108,7 @@ ...@@ -105,7 +108,7 @@
.markdown-area { .markdown-area {
background: #FFF; background: #FFF;
border: 1px solid #ddd; border: 1px solid #ddd;
min-height: 100px; min-height: 140px;
padding: 5px; padding: 5px;
box-shadow: none; box-shadow: none;
width: 100%; width: 100%;
......
...@@ -80,6 +80,23 @@ ...@@ -80,6 +80,23 @@
%ul.notes .note-role, .note-actions { %ul.notes .note-role, .note-actions {
display: none; display: none;
} }
.center-top-menu {
height: 45px;
li a {
font-size: 14px;
padding: 19px 10px;
}
}
.projects-search-form {
margin: 0 -5px !important;
.btn {
display: none;
}
}
} }
@media (max-width: $screen-sm-max) { @media (max-width: $screen-sm-max) {
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
.select2-choice { .select2-choice {
background: #FFF; background: #FFF;
border-color: #DDD; border-color: #DDD;
height: 34px; height: 42px;
padding: 6px 14px; padding: 8px $gl-padding;
font-size: 14px; font-size: $gl-font-size;
line-height: 1.42857143; line-height: 1.42857143;
@include border-radius(4px); @include border-radius(4px);
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
.select2-arrow { .select2-arrow {
background: #FFF; background: #FFF;
border-left: none; border-left: none;
padding-top: 3px; padding-top: 5px;
} }
} }
} }
......
...@@ -18,14 +18,28 @@ ...@@ -18,14 +18,28 @@
} }
.content-wrapper { .content-wrapper {
min-height: 100vh;
width: 100%; width: 100%;
padding: 20px; padding: 20px;
background: #f1f4f8;
.container-fluid {
background: #FFF; background: #FFF;
padding: $gl-padding;
border: 1px solid #e7e9ed;
min-height: 90vh;
&.container-blank {
background: none;
padding: 0;
border: none;
}
}
} }
.nav-sidebar { .nav-sidebar {
margin-top: 29 + $header-height; margin-top: 14 + $header-height;
margin-bottom: 50px; margin-bottom: 100px;
transition-duration: .3s; transition-duration: .3s;
list-style: none; list-style: none;
overflow: hidden; overflow: hidden;
...@@ -43,13 +57,14 @@ ...@@ -43,13 +57,14 @@
} }
a { a {
padding: 8px 15px; padding: 7px 15px;
font-size: 13px; font-size: $gl-font-size;
line-height: 18px; line-height: 24px;
color: $gray; color: $gray;
display: block; display: block;
text-decoration: none; text-decoration: none;
padding-left: 16px; padding-left: 22px;
font-weight: normal;
&:hover { &:hover {
text-decoration: none; text-decoration: none;
...@@ -60,9 +75,9 @@ ...@@ -60,9 +75,9 @@
} }
i { i {
width: 20px; width: 16px;
color: $gray-light; color: $gray-light;
margin-right: 23px; margin-right: 13px;
} }
.count { .count {
...@@ -108,41 +123,59 @@ ...@@ -108,41 +123,59 @@
} }
@mixin folded-sidebar { @mixin folded-sidebar {
padding-left: 50px; padding-left: 60px;
transition-duration: .3s; transition-duration: .3s;
.sidebar-wrapper { .sidebar-wrapper {
width: $sidebar_collapsed_width; width: $sidebar_collapsed_width;
.header-logo {
width: $sidebar_collapsed_width;
a {
padding-left: 12px;
.gitlab-text-container {
display: none;
}
}
}
.nav-sidebar { .nav-sidebar {
width: $sidebar_collapsed_width; width: $sidebar_collapsed_width;
li a { li a {
padding-left: 16px; span {
display: none;
}
} }
} }
.collapse-nav a { .collapse-nav a {
left: 0px;
width: $sidebar_collapsed_width; width: $sidebar_collapsed_width;
} }
.sidebar-user { .sidebar-user {
padding-left: 12px;
width: $sidebar_collapsed_width; width: $sidebar_collapsed_width;
.username {
display: none;
}
} }
} }
} }
.collapse-nav a { .collapse-nav a {
width: $sidebar_width;
position: fixed; position: fixed;
top: $header-height; bottom: 0;
left: 198px; left: 0;
font-size: 13px; font-size: 13px;
background: transparent; background: transparent;
width: 32px; height: 40px;
height: 28px;
text-align: center; text-align: center;
line-height: 28px; line-height: 40px;
transition-duration: .3s; transition-duration: .3s;
} }
...@@ -176,16 +209,18 @@ ...@@ -176,16 +209,18 @@
} }
.sidebar-user { .sidebar-user {
padding: 9px 22px;
position: fixed; position: fixed;
bottom: 0; bottom: 40px;
width: $sidebar_width; width: $sidebar_width;
padding: 10px;
overflow: hidden; overflow: hidden;
transition-duration: .3s; transition-duration: .3s;
.username { .username {
margin-top: 5px; margin-left: 10px;
width: $sidebar_width - 2 * 10px; width: $sidebar_width - 2 * 10px;
font-size: 16px;
line-height: 34px;
} }
} }
...@@ -202,7 +237,7 @@ ...@@ -202,7 +237,7 @@
float: left; float: left;
height: $header-height; height: $header-height;
width: 100%; width: 100%;
padding: ($header-height - 36 ) / 2 8px; padding: 10px 22px;
overflow: hidden; overflow: hidden;
img { img {
...@@ -219,8 +254,8 @@ ...@@ -219,8 +254,8 @@
float: left; float: left;
margin: 0; margin: 0;
margin-left: 14px; margin-left: 14px;
font-size: 18px; font-size: 19px;
line-height: $header-height - 14; line-height: 41px;
font-weight: normal; font-weight: normal;
} }
} }
......
.timeline { .timeline {
list-style: none; @include basic-list;
padding: 20px 0 20px;
position: relative;
&:before {
top: 0;
bottom: 0;
position: absolute;
content: " ";
width: 3px;
background-color: #eeeeee;
margin-left: 29px;
}
.timeline-entry {
position: relative;
margin-top: 5px;
margin-left: 30px;
margin-bottom: 10px;
clear: both;
&:target {
.timeline-entry-inner .timeline-content {
-webkit-animation:target-note 2s linear;
background: $hover;
}
}
.timeline-entry-inner {
position: relative;
margin-left: -20px;
&:before, &:after {
content: " ";
display: table;
}
.timeline-icon {
margin-top: 2px;
background: #fff;
color: #737881;
float: left;
@include border-radius($avatar_radius);
@include box-shadow(0 0 0 3px #EEE);
overflow: hidden;
.avatar {
margin: 0; margin: 0;
padding: 0; padding: 0;
}
}
.timeline-content { .timeline-entry {
position: relative; padding: $gl-padding;
background: $background-color; border-color: #f1f2f4;
padding: 10px 15px; margin-left: -$gl-padding;
margin-left: 60px; margin-right: -$gl-padding;
color: $gl-gray;
border-bottom: 1px solid #f1f2f4;
border-right: 1px solid #f1f2f4;
img { &:last-child {
max-width: 100%; border-bottom: none;
} }
&:after { .avatar {
content: ''; margin-right: 15px;
display: block;
position: absolute;
width: 0;
height: 0;
border-style: solid;
border-width: 9px 9px 9px 0;
border-color: transparent $background-color transparent transparent;
left: 0;
top: 10px;
margin-left: -9px;
}
}
}
} }
.system-note .timeline-entry-inner { .controls {
.timeline-icon { padding-top: 10px;
background: none; float: right;
margin-left: 12px;
margin-top: 0;
@include box-shadow(none);
span {
margin: 0 2px;
font-size: 16px;
color: #eeeeee;
} }
} }
.timeline-content { .note-text {
background: none; p:last-child {
margin-left: 45px; margin-bottom: 0;
padding: 0px 15px;
&:after { border: 0; }
.note-header {
span { font-size: 12px; }
.avatar {
margin-right: 5px;
} }
} }
.system-note {
.note-text { .note-text {
font-size: 12px; color: $gl-gray !important;
margin-left: 20px;
} }
} }
.diff-file {
border: 1px solid $border-color;
border-bottom: none;
margin-left: 0;
margin-right: 0;
} }
} }
...@@ -132,3 +63,8 @@ ...@@ -132,3 +63,8 @@
} }
} }
} }
.discussion .timeline-entry {
margin: 0;
border-right: none;
}
...@@ -9,6 +9,11 @@ ...@@ -9,6 +9,11 @@
margin-bottom: 5px; margin-bottom: 5px;
} }
h1, h2, h3, h4, h5, h6 {
color: $gl-header-color;
font-weight: 500;
}
/** CODE **/ /** CODE **/
pre { pre {
font-family: $monospace_font; font-family: $monospace_font;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
} }
.zen-enter-link { .zen-enter-link {
color: #888; color: $gl-gray;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 4px; right: 4px;
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
.zen-leave-link { .zen-leave-link {
display: none; display: none;
color: #888; color: $gl-text-color;
position: absolute; position: absolute;
top: 10px; top: 10px;
right: 10px; right: 10px;
......
...@@ -21,6 +21,12 @@ pre.code.highlight.dark, ...@@ -21,6 +21,12 @@ pre.code.highlight.dark,
background-color: #557 !important; background-color: #557 !important;
} }
// Search result highlight
span.highlight_word {
background: #ffe792;
color: #000000;
}
.hll { background-color: #373b41 } .hll { background-color: #373b41 }
.c { color: #969896 } /* Comment */ .c { color: #969896 } /* Comment */
.err { color: #cc6666 } /* Error */ .err { color: #cc6666 } /* Error */
......
...@@ -21,6 +21,12 @@ pre.code.monokai, ...@@ -21,6 +21,12 @@ pre.code.monokai,
background-color: #49483e !important; background-color: #49483e !important;
} }
// Search result highlight
span.highlight_word {
background: #ffe792;
color: #000000;
}
.hll { background-color: #49483e } .hll { background-color: #49483e }
.c { color: #75715e } /* Comment */ .c { color: #75715e } /* Comment */
.err { color: #960050; background-color: #1e0010 } /* Error */ .err { color: #960050; background-color: #1e0010 } /* Error */
......
...@@ -21,6 +21,11 @@ pre.code.highlight.solarized-dark, ...@@ -21,6 +21,11 @@ pre.code.highlight.solarized-dark,
background-color: #174652 !important; background-color: #174652 !important;
} }
// Search result highlight
span.highlight_word {
background: #094554;
}
/* Solarized Dark /* Solarized Dark
For use with Jekyll and Pygments For use with Jekyll and Pygments
......
...@@ -21,6 +21,11 @@ pre.code.highlight.solarized-light, ...@@ -21,6 +21,11 @@ pre.code.highlight.solarized-light,
background-color: #ddd8c5 !important; background-color: #ddd8c5 !important;
} }
// Search result highlight
span.highlight_word {
background: #eee8d5;
}
/* Solarized Light /* Solarized Light
For use with Jekyll and Pygments For use with Jekyll and Pygments
......
...@@ -5,15 +5,19 @@ pre.code.highlight.white, ...@@ -5,15 +5,19 @@ pre.code.highlight.white,
background-color: #fff; background-color: #fff;
color: #333; color: #333;
pre.highlight,
.line-numbers, .line-numbers,
.line-numbers a { .line-numbers a {
background-color: $background-color !important;
color: $gl-gray !important;
}
pre.highlight {
background-color: #fff !important; background-color: #fff !important;
color: #333 !important; color: #333 !important;
} }
pre.code { pre.code {
border-left: 1px solid #bbb; border-left: 1px solid $border-color;
} }
// highlight line via anchor // highlight line via anchor
...@@ -21,6 +25,11 @@ pre.code.highlight.white, ...@@ -21,6 +25,11 @@ pre.code.highlight.white,
background-color: #f8eec7 !important; background-color: #f8eec7 !important;
} }
// Search result highlight
span.highlight_word {
background: #fafe3d;
}
.hll { background-color: #f8f8f8 } .hll { background-color: #f8f8f8 }
.c { color: #999988; font-style: italic; } .c { color: #999988; font-style: italic; }
.err { color: #a61717; background-color: #e3d2d2; } .err { color: #a61717; background-color: #e3d2d2; }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
} }
.appearance-light-logo-preview { .appearance-light-logo-preview {
background-color: $style_color; background-color: $background-color;
max-width: 72px; max-width: 72px;
padding: 10px; padding: 10px;
margin-bottom: 10px; margin-bottom: 10px;
......
...@@ -26,14 +26,6 @@ ...@@ -26,14 +26,6 @@
margin-top: 10px; margin-top: 10px;
} }
.commit-stat-summary {
color: #666;
font-size: 14px;
font-weight: normal;
padding: 3px 0;
margin-bottom: 10px;
}
.commit-info-row { .commit-info-row {
margin-bottom: 10px; margin-bottom: 10px;
.avatar { .avatar {
...@@ -47,11 +39,6 @@ ...@@ -47,11 +39,6 @@
} }
.commit-box { .commit-box {
margin: 10px 0;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
padding: 20px 0;
.commit-title { .commit-title {
margin: 0; margin: 0;
} }
...@@ -61,10 +48,6 @@ ...@@ -61,10 +48,6 @@
} }
} }
.file-stats a {
color: $style_color;
}
.file-stats { .file-stats {
.new-file { .new-file {
a { a {
......
...@@ -52,7 +52,7 @@ li.commit { ...@@ -52,7 +52,7 @@ li.commit {
} }
.commit-row-message { .commit-row-message {
color: #444; color: $gl-link-color;
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
...@@ -88,12 +88,12 @@ li.commit { ...@@ -88,12 +88,12 @@ li.commit {
} }
.commit-row-info { .commit-row-info {
color: #777; color: $gl-gray;
line-height: 24px; line-height: 24px;
font-size: 13px; font-size: 13px;
a { a {
color: #777; color: $gl-gray;
} }
.committed_ago { .committed_ago {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
.side { .side {
.panel { .panel {
.panel-heading { .panel-heading {
background: #EEE; background: $background-color;
border-top-left-radius: 0; border-top-left-radius: 0;
} }
border-top-left-radius: 0; border-top-left-radius: 0;
...@@ -38,11 +38,11 @@ ...@@ -38,11 +38,11 @@
float: left; float: left;
.avatar { .avatar {
@include border-radius(0px); @include border-radius(50%);
} }
.identicon { .identicon {
line-height: 40px; line-height: 46px;
} }
} }
......
.diff-file { .diff-file {
border: 1px solid $border-color; margin-left: -$gl-padding;
margin-bottom: 1em; margin-right: -$gl-padding;
border: none;
border-bottom: 1px solid #E7E9EE;
.diff-header { .diff-header {
position: relative; position: relative;
background: $background-color; background: $background-color;
border-bottom: 1px solid $border-color; border-bottom: 1px solid $border-color;
padding: 10px 15px; padding: 10px 16px;
color: #555; color: #555;
z-index: 10; z-index: 10;
...@@ -45,7 +47,7 @@ ...@@ -45,7 +47,7 @@
overflow-y: hidden; overflow-y: hidden;
background: #FFF; background: #FFF;
color: #333; color: #333;
font-size: $code_font_size;
.old { .old {
span.idiff { span.idiff {
background-color: #f8cbcb; background-color: #f8cbcb;
...@@ -82,7 +84,7 @@ ...@@ -82,7 +84,7 @@
border: none; border: none;
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
td { .line_holder td {
line-height: $code_line_height; line-height: $code_line_height;
font-size: $code_font_size; font-size: $code_font_size;
} }
...@@ -367,3 +369,7 @@ ...@@ -367,3 +369,7 @@
white-space: pre-wrap; white-space: pre-wrap;
} }
.inline-parallel-buttons {
float: right;
margin-top: -5px;
}
...@@ -9,6 +9,10 @@ ...@@ -9,6 +9,10 @@
width: 100%; width: 100%;
} }
.ace_gutter-cell {
background-color: $background-color;
}
.cancel-btn { .cancel-btn {
color: #B94A48; color: #B94A48;
&:hover { &:hover {
...@@ -32,14 +36,12 @@ ...@@ -32,14 +36,12 @@
.file-title { .file-title {
@extend .monospace; @extend .monospace;
font-size: 14px;
padding: 5px;
} }
.editor-ref { .editor-ref {
background: $background-color; background: $background-color;
padding: 11px 15px; padding: 11px 15px;
border-right: 1px solid #CCC; border-right: 1px solid $border-color;
display: inline-block; display: inline-block;
margin: -5px -5px; margin: -5px -5px;
margin-right: 10px; margin-right: 10px;
...@@ -50,5 +52,15 @@ ...@@ -50,5 +52,15 @@
display: inline-block; display: inline-block;
width: 200px; width: 200px;
} }
.form-control {
margin-top: -3px;
}
}
.form-actions {
margin: -$gl-padding;
margin-top: 0;
padding: $gl-padding
} }
} }
/** /**
* Events labels * Dashboard events feed
* *
*/ */
.event_label { .event-item {
&.pushed { font-size: $gl-font-size;
padding: 0 2px; padding: $gl-padding;
} margin-left: -$gl-padding;
margin-right: -$gl-padding;
border-bottom: 1px solid #f1f2f4;
color: #7f8fa4;
&.opened { &.event-inline {
padding: 0 2px; .avatar {
position: relative;
top: -2px;
} }
&.closed { .event-title {
padding: 0 2px; line-height: 44px;
} }
&.merged { .event-item-timestamp {
padding: 0 2px; line-height: 44px;
} }
&.left,
&.joined {
padding: 0 2px;
float: none;
} }
}
/** a {
* Dashboard events feed color: #4c4e54;
*
*/
.event-item {
&:first-child {
padding-top: 0;
} }
&.event-inline {
.avatar { .avatar {
position: relative; margin-right: 15px;
top: -2px;
}
} }
padding: 12px 0px;
border-bottom: 1px solid #eee;
.event-title { .event-title {
max-width: 70%;
@include str-truncated(calc(100% - 174px)); @include str-truncated(calc(100% - 174px));
font-weight: 500; font-weight: 600;
font-size: 14px;
.author_name { .author_name {
color: #333; color: #333;
} }
} }
.event-body { .event-body {
font-size: 13px; margin-left: 63px;
margin-left: 35px;
margin-right: 80px; margin-right: 80px;
color: #777;
.event-note { .event-note {
margin-top: 5px; margin-top: 5px;
word-wrap: break-word; word-wrap: break-word;
.md { .md {
font-size: 13px; color: #7f8fa4;
font-size: $gl-font-size;
iframe.twitter-share-button { iframe.twitter-share-button {
vertical-align: bottom; vertical-align: bottom;
...@@ -94,7 +82,7 @@ ...@@ -94,7 +82,7 @@
.event-note-icon { .event-note-icon {
color: #777; color: #777;
float: left; float: left;
font-size: 16px; font-size: $gl-font-size;
line-height: 16px; line-height: 16px;
margin-right: 5px; margin-right: 5px;
} }
...@@ -116,7 +104,7 @@ ...@@ -116,7 +104,7 @@
&:last-child { border:none } &:last-child { border:none }
.event_commits { .event_commits {
margin-top: 5px; margin-top: 9px;
li { li {
&.commit { &.commit {
...@@ -125,10 +113,12 @@ ...@@ -125,10 +113,12 @@
padding-left: 0; padding-left: 0;
border: none; border: none;
.commit-row-title { .commit-row-title {
font-size: 12px; font-size: $gl-font-size;
} }
} }
&.commits-stat { &.commits-stat {
margin-top: 3px;
display: block; display: block;
padding: 3px; padding: 3px;
padding-left: 0; padding-left: 0;
...@@ -142,7 +132,6 @@ ...@@ -142,7 +132,6 @@
.event-item-timestamp { .event-item-timestamp {
float: right; float: right;
color: #999;
line-height: 22px; line-height: 22px;
} }
} }
...@@ -186,12 +175,3 @@ ...@@ -186,12 +175,3 @@
} }
} }
} }
.event_filter {
li a {
font-size: 13px;
padding: 5px 10px;
background: $background-color;
margin-left: 4px;
}
}
...@@ -25,8 +25,6 @@ ...@@ -25,8 +25,6 @@
} }
.issuable-context-title { .issuable-context-title {
font-size: 14px;
line-height: 1.4;
margin-bottom: 5px; margin-bottom: 5px;
.avatar { .avatar {
...@@ -34,14 +32,50 @@ ...@@ -34,14 +32,50 @@
} }
label { label {
color: #666; color: $gl-gray;
font-weight: normal; font-weight: normal;
margin-right: 4px; margin-right: 4px;
} }
} }
.issuable-affix .context { .project-issuable-filter {
font-size: 13px; .controls {
float: right;
margin-top: 7px;
}
.center-top-menu {
text-align: left;
}
}
.btn { font-size: 13px; } .issuable-details {
.page-title {
margin-top: -15px;
padding: 10px 0;
margin-bottom: 0;
color: $gl-gray;
font-size: 16px;
.author {
color: $gl-gray;
}
.issue-id {
font-size: 19px;
color: $gl-text-color;
}
}
.issue-title {
margin: 0;
}
.description {
margin-top: 6px;
p:last-child {
margin-bottom: 0;
}
}
} }
.issues-list { .issues-list {
.issue { .issue {
padding: 10px 15px; padding: 10px $gl-padding;
position: relative; position: relative;
.issue-title { .issue-title {
...@@ -10,8 +10,7 @@ ...@@ -10,8 +10,7 @@
} }
.issue-info { .issue-info {
color: #999; color: $gl-gray;
font-size: 13px;
} }
.issue-check { .issue-check {
...@@ -47,10 +46,6 @@ ...@@ -47,10 +46,6 @@
} }
} }
.participants {
margin-bottom: 20px;
}
.issue-search-form { .issue-search-form {
margin: 0; margin: 0;
height: 24px; height: 24px;
...@@ -137,11 +132,6 @@ form.edit-issue { ...@@ -137,11 +132,6 @@ form.edit-issue {
} }
} }
h2.issue-title {
margin-top: 0;
font-weight: bold;
}
.issue-form .select2-container { .issue-form .select2-container {
width: 250px !important; width: 250px !important;
} }
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
* *
*/ */
.mr-state-widget { .mr-state-widget {
background: #FAFAFA; background: #f8fafc;
margin-bottom: 20px; margin-bottom: 20px;
color: #666; color: $gl-gray;
border: 1px solid #e5e5e5; border: 1px solid #eef0f2;
@include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05)); @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05));
@include border-radius(3px); @include border-radius(3px);
...@@ -29,6 +29,14 @@ ...@@ -29,6 +29,14 @@
padding: 5px; padding: 5px;
line-height: 20px; line-height: 20px;
&.right {
float: right;
padding-top: 12px;
a {
color: $gl-gray;
}
}
.remove_source_checkbox { .remove_source_checkbox {
margin: 0; margin: 0;
} }
...@@ -36,7 +44,7 @@ ...@@ -36,7 +44,7 @@
} }
.ci_widget { .ci_widget {
border-bottom: 1px solid #EEE; border-bottom: 1px solid #eef0f2;
i { i {
margin-right: 4px; margin-right: 4px;
...@@ -89,20 +97,14 @@ ...@@ -89,20 +97,14 @@
} }
} }
@media(min-width: $screen-sm-max) {
.merge-request .merge-request-tabs{
li {
a {
padding: 15px 40px;
font-size: 14px;
}
}
}
}
.merge-request .merge-request-tabs{ .merge-request .merge-request-tabs{
margin-top: 30px; @include nav-menu;
margin-bottom: 20px; margin: -$gl-padding;
padding: $gl-padding;
text-align: center;
border-top: 1px solid #e7e9ed;
margin-top: 18px;
margin-bottom: 3px;
} }
.mr_source_commit, .mr_source_commit,
...@@ -136,8 +138,7 @@ ...@@ -136,8 +138,7 @@
} }
.merge-request-info { .merge-request-info {
color: #999; color: $gl-gray;
font-size: 13px;
} }
} }
......
...@@ -6,4 +6,8 @@ li.milestone { ...@@ -6,4 +6,8 @@ li.milestone {
h4 { h4 {
font-weight: bold; font-weight: bold;
} }
.progress {
height: 6px;
}
} }
...@@ -72,9 +72,13 @@ ...@@ -72,9 +72,13 @@
.common-note-form { .common-note-form {
margin: 0; margin: 0;
background: #F9F9F9; background: #f8fafc;
padding: 5px; padding: $gl-padding;
border: 1px solid #DDD; margin-left: -$gl-padding;
margin-right: -$gl-padding;
border-right: 1px solid #f1f2f4;
border-top: 1px solid #f1f2f4;
margin-bottom: -$gl-padding;
} }
.note-form-actions { .note-form-actions {
...@@ -142,9 +146,9 @@ ...@@ -142,9 +146,9 @@
} }
.discussion-reply-holder { .discussion-reply-holder {
background: #f9f9f9; background: $background-color;
padding: 10px 15px; padding: 10px 15px;
border-top: 1px solid #DDD; border-top: 1px solid $border-color;
} }
} }
...@@ -166,6 +170,6 @@ ...@@ -166,6 +170,6 @@
background: #FFF; background: #FFF;
padding: 5px; padding: 5px;
margin-top: -11px; margin-top: -11px;
border: 1px solid #DDD; border: 1px solid $border-color;
font-size: 13px; font-size: 13px;
} }
...@@ -14,6 +14,19 @@ ul.notes { ...@@ -14,6 +14,19 @@ ul.notes {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
.system-note {
font-size: 14px;
padding-top: 10px;
padding-bottom: 10px;
background: #f8fafc;
.timeline-icon {
.avatar {
visibility: hidden;
}
}
}
.discussion-header, .discussion-header,
.note-header { .note-header {
@extend .cgray; @extend .cgray;
...@@ -34,10 +47,8 @@ ul.notes { ...@@ -34,10 +47,8 @@ ul.notes {
content: "\00b7"; content: "\00b7";
} }
font-size: 13px;
a { a {
@extend .cgray; color: $gl-gray;
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
...@@ -45,8 +56,9 @@ ul.notes { ...@@ -45,8 +56,9 @@ ul.notes {
} }
} }
.author { .author {
color: #333; color: #4c4e54;
font-weight: bold; margin-right: 3px;
&:hover { &:hover {
color: $gl-link-color; color: $gl-link-color;
} }
...@@ -59,7 +71,7 @@ ul.notes { ...@@ -59,7 +71,7 @@ ul.notes {
margin-top: 1px; margin-top: 1px;
border: 1px solid #bbb; border: 1px solid #bbb;
background-color: transparent; background-color: transparent;
color: #999; color: $gl-gray;
} }
} }
...@@ -133,8 +145,6 @@ ul.notes { ...@@ -133,8 +145,6 @@ ul.notes {
} }
.diff-file .notes_holder { .diff-file .notes_holder {
font-size: 13px;
line-height: 18px;
font-family: $regular_font; font-family: $regular_font;
td { td {
...@@ -176,8 +186,7 @@ ul.notes { ...@@ -176,8 +186,7 @@ ul.notes {
a { a {
margin-left: 5px; margin-left: 5px;
color: $gl-gray;
color: #999;
i.fa { i.fa {
font-size: 16px; font-size: 16px;
...@@ -226,8 +235,6 @@ ul.notes { ...@@ -226,8 +235,6 @@ ul.notes {
filter: alpha(opacity=0); filter: alpha(opacity=0);
&:hover { &:hover {
width: 38px;
font-size: 20px;
background: $gl-info; background: $gl-info;
color: #FFF; color: #FFF;
@include show-add-diff-note; @include show-add-diff-note;
......
...@@ -16,6 +16,10 @@ ...@@ -16,6 +16,10 @@
.project-home-panel { .project-home-panel {
text-align: center; text-align: center;
background: #f7f8fa;
margin: -$gl-padding;
padding: $gl-padding;
padding-top: 40px;
.project-identicon-holder { .project-identicon-holder {
margin-bottom: 15px; margin-bottom: 15px;
...@@ -38,20 +42,22 @@ ...@@ -38,20 +42,22 @@
h1 { h1 {
margin: 0; margin: 0;
margin-bottom: 10px; margin-bottom: 10px;
font-size: 26px; font-size: 23px;
font-weight: bold; font-weight: normal;
} }
p { p {
font-size: 18px; color: #7f8fa4;
color: #666;
display: inline;
} }
} }
.git-clone-holder { .git-clone-holder {
max-width: 600px; max-width: 600px;
margin: 20px auto; margin: 20px auto;
.form-control {
background: #FFF;
}
} }
.visibility-level-label { .visibility-level-label {
...@@ -62,17 +68,18 @@ ...@@ -62,17 +68,18 @@
} }
.project-repo-buttons { .project-repo-buttons {
margin-top: 25px; margin-top: $gl-padding;
margin-bottom: 25px; margin-bottom: 25px;
.btn { .btn {
@extend .btn-info; @extend .btn-info;
text-transform: uppercase;
font-size: 15px;
line-height: 20px;
padding: 8px 14px;
border-radius: 3px;
margin-left: 10px; margin-left: 10px;
font-weight: bold;
font-size: 14px;
line-height: 16px;
padding: 8px 12px;
.count { .count {
padding-left: 7px; padding-left: 7px;
...@@ -162,78 +169,6 @@ ul.nav.nav-projects-tabs { ...@@ -162,78 +169,6 @@ ul.nav.nav-projects-tabs {
margin: 0px; margin: 0px;
} }
.my-projects,
.public-projects {
li {
.project-info {
margin-bottom: 10px;
overflow: hidden;
}
.access-icon {
color: #AAA;
margin-left: 10px;
i {
color: #AAA;
}
}
}
}
.public-clone {
background: #EEE;
color: #777;
padding: 6px 10px;
margin: 1px;
font-weight: normal;
}
.public-projects .repo-info {
color: #777;
a {
color: #777;
}
}
.project-side {
.project-fork-icon {
float: left;
font-size: 26px;
margin-right: 10px;
line-height: 1.5;
}
.panel {
@include border-radius(3px);
.panel-heading, .panel-footer {
font-weight: normal;
background-color: transparent;
color: #666;
border-color: #EEE;
}
.actions {
margin-top: 10px;
}
.nav-pills a {
padding: 10px;
font-weight: bold;
color: $gl-link-color;
}
.nav {
margin-bottom: 15px;
}
}
.ci-status-image {
max-height: 22px;
}
}
.transfer-project .select2-container { .transfer-project .select2-container {
min-width: 200px; min-width: 200px;
} }
...@@ -256,10 +191,10 @@ ul.nav.nav-projects-tabs { ...@@ -256,10 +191,10 @@ ul.nav.nav-projects-tabs {
.breadcrumb.repo-breadcrumb { .breadcrumb.repo-breadcrumb {
padding: 0; padding: 0;
line-height: 34px; line-height: 42px;
background: white; background: transparent;
border: none; border: none;
font-size: 16px; margin: 0;
> li + li:before { > li + li:before {
padding: 0 3px; padding: 0 3px;
...@@ -268,26 +203,18 @@ ul.nav.nav-projects-tabs { ...@@ -268,26 +203,18 @@ ul.nav.nav-projects-tabs {
} }
.fork-namespaces { .fork-namespaces {
.thumbnail { .fork-thumbnail {
text-align: center;
&.fork-exists-thumbnail { margin-bottom: $gl-padding;
border-color: #EEE;
.caption { .caption {
color: #999; padding: $gl-padding 0;
} min-height: 30px;
} }
&.fork-thumbnail { img {
border-color: #AAA; @include border-radius(50%);
max-width: 100px;
&:hover {
background-color: $hover;
}
}
a {
text-decoration: none;
} }
} }
} }
...@@ -305,10 +232,23 @@ table.table.protected-branches-list tr.no-border { ...@@ -305,10 +232,23 @@ table.table.protected-branches-list tr.no-border {
.project-stats { .project-stats {
text-align: center; text-align: center;
margin-top: 0;
margin-bottom: 0;
padding-top: 5px;
padding-bottom: 0;
ul.nav-pills {
display:inline-block;
}
li {
display:inline;
}
ul.nav-pills { display:inline-block; } a {
li { display:inline; } float:left;
a { float:left; } font-size: 17px;
}
li.missing a { li.missing a {
color: #bbb; color: #bbb;
...@@ -325,32 +265,67 @@ pre.light-well { ...@@ -325,32 +265,67 @@ pre.light-well {
} }
.projects-search-form { .projects-search-form {
max-width: 600px; margin: -$gl-padding;
margin: 0 auto; background-color: #f8fafc;
margin-bottom: 20px; padding: $gl-padding;
margin-bottom: 0px;
border-top: 1px solid #e7e9ed;
border-bottom: 1px solid #e7e9ed;
}
input { /*
border-color: #BBB; * Projects list rendered on dashboard and user page
*/
.projects-list {
@include basic-list;
.project-row {
padding: $gl-padding;
border-color: #f1f2f4;
margin-left: -$gl-padding;
margin-right: -$gl-padding;
&.no-description {
.project {
line-height: 44px;
}
} }
}
.project-row {
.project-full-name { .project-full-name {
font-weight: bold; @include str-truncated;
font-size: 15px; font-weight: 600;
color: #4c4e54;
}
.pull-right.light {
line-height: 45px;
color: #7f8fa4;
} }
.project-description { .project-description {
color: #888; color: #7f8fa4;
font-size: 13px;
p { p {
@include str-truncated;
margin-bottom: 0; margin-bottom: 0;
color: #888; color: #7f8fa4;
}
}
} }
.bottom {
padding-top: $gl-padding;
padding-bottom: 0;
} }
} }
.my-projects .project-row { .panel .projects-list li {
padding: 10px 0; padding: 10px 15px;
margin: 0;
}
.project-show-activity {
.activity-filter-block {
margin-top: -1px;
}
} }
.search-results { .search-results {
.search-result-row { .search-result-row {
border-bottom: 1px solid #EEE; border-bottom: 1px solid #DDD;
padding-bottom: 10px; padding-bottom: 15px;
margin-bottom: 10px; margin-bottom: 15px;
} }
} }
.search-holder {
max-width: 600px;
margin: 0 auto;
margin-bottom: 20px;
input {
border-color: #BBB;
font-weight: bold;
}
}
...@@ -6,3 +6,27 @@ ...@@ -6,3 +6,27 @@
.snippet-form-holder .file-holder .file-title { .snippet-form-holder .file-holder .file-title {
padding: 2px; padding: 2px;
} }
.snippet-row {
.snippet-title {
font-size: 15px;
font-weight: bold;
line-height: 20px;
margin-bottom: 2px;
.monospace {
font-weight: normal;
}
}
.snippet-info {
color: #888;
font-size: 13px;
line-height: 24px;
a {
color: #888;
}
}
}
...@@ -63,51 +63,21 @@ ...@@ -63,51 +63,21 @@
padding-right: 8px; padding-right: 8px;
.commit-author-name { .commit-author-name {
color: gray; color: $gl-gray;
} }
} }
.tree_commit { .tree_commit {
color: gray; color: $gl-gray;
.tree-commit-link { .tree-commit-link {
color: gray; color: $gl-gray;
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
} }
} }
} }
.blame {
img.avatar {
border: 0 none;
float: none;
margin: 0;
padding: 0;
}
td.blame-commit {
background: #f9f9f9;
min-width: 350px;
.commit-author-link {
color: #888;
}
}
td.blame-numbers {
pre {
color: #AAA;
white-space: pre;
}
background: #f1f1f1;
border-left: 1px solid #DDD;
}
td.lines {
code {
font-family: $monospace_font;
}
}
}
} }
.tree-ref-holder { .tree-ref-holder {
...@@ -132,20 +102,30 @@ ...@@ -132,20 +102,30 @@
list-style: none; list-style: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
margin-bottom: 10px; margin-bottom: 5px;
.commit { .commit {
padding: 10px 15px; padding: $gl-padding 0;
.commit-row-title { .commit-row-title {
font-size: 13px;
.commit-row-message { .commit-row-message {
font-weight: normal; font-weight: normal;
color: #555;
} }
} }
} }
} }
#modal-remove-blob > .modal-dialog { width: 850px; } #modal-remove-blob > .modal-dialog { width: 850px; }
.blob-upload-dropzone-previews {
text-align: center;
border: 2px;
border-style: dashed;
border-color: $border-color;
min-height: 200px;
}
.upload-link {
font-weight: normal;
color: $md-link-color;
}
...@@ -9,15 +9,19 @@ ...@@ -9,15 +9,19 @@
@mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) { @mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) {
.page-with-sidebar { .page-with-sidebar {
.header-logo { .header-logo {
background-color: $color-darker; background-color: $color;
border-color: $color-darker; border-color: $color;
a { a {
color: $color-light; color: $color-light;
h3 {
color: $color-light;
}
} }
&:hover { &:hover {
background-color: $color-dark; background-color: $color-darker;
a { a {
color: #FFF; color: #FFF;
} }
...@@ -83,7 +87,7 @@ ...@@ -83,7 +87,7 @@
} }
$theme-blue: #2980B9; $theme-blue: #2980B9;
$theme-charcoal: #474D57; $theme-charcoal: #333c47;
$theme-graphite: #888888; $theme-graphite: #888888;
$theme-gray: #373737; $theme-gray: #373737;
$theme-green: #019875; $theme-green: #019875;
...@@ -95,7 +99,7 @@ body { ...@@ -95,7 +99,7 @@ body {
} }
&.ui_charcoal { &.ui_charcoal {
@include gitlab-theme(#979DA7, $theme-charcoal, #373D47, #24272D); @include gitlab-theme(#c5d0de, $theme-charcoal, #2b333d, #24272D);
} }
&.ui_graphite { &.ui_graphite {
......
...@@ -39,6 +39,6 @@ class Admin::HooksController < Admin::ApplicationController ...@@ -39,6 +39,6 @@ class Admin::HooksController < Admin::ApplicationController
end end
def hook_params def hook_params
params.require(:hook).permit(:url) params.require(:hook).permit(:url, :enable_ssl_verification)
end end
end end
class Admin::LabelsController < Admin::ApplicationController
before_action :set_label, only: [:show, :edit, :update, :destroy]
def index
@labels = Label.templates.page(params[:page]).per(PER_PAGE)
end
def show
end
def new
@label = Label.new
end
def edit
end
def create
@label = Label.new(label_params)
@label.template = true
if @label.save
redirect_to admin_labels_url, notice: "Label was created"
else
render :new
end
end
def update
if @label.update(label_params)
redirect_to admin_labels_path, notice: 'label was successfully updated.'
else
render :edit
end
end
def destroy
@label.destroy
@labels = Label.templates
respond_to do |format|
format.html do
redirect_to(admin_labels_path, notice: 'Label was removed')
end
format.js
end
end
private
def set_label
@label = Label.find(params[:id])
end
def label_params
params[:label].permit(:title, :color)
end
end
require 'gon' require 'gon'
require 'fogbugz'
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
include Gitlab::CurrentSettings include Gitlab::CurrentSettings
...@@ -20,7 +21,7 @@ class ApplicationController < ActionController::Base ...@@ -20,7 +21,7 @@ class ApplicationController < ActionController::Base
protect_from_forgery with: :exception protect_from_forgery with: :exception
helper_method :abilities, :can?, :current_application_settings helper_method :abilities, :can?, :current_application_settings
helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :git_import_enabled? helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled?
rescue_from Encoding::CompatibilityError do |exception| rescue_from Encoding::CompatibilityError do |exception|
log_exception(exception) log_exception(exception)
...@@ -55,7 +56,9 @@ class ApplicationController < ActionController::Base ...@@ -55,7 +56,9 @@ class ApplicationController < ActionController::Base
def authenticate_user!(*args) def authenticate_user!(*args)
# If user is not signed-in and tries to access root_path - redirect him to landing page # If user is not signed-in and tries to access root_path - redirect him to landing page
if current_application_settings.home_page_url.present? # Don't redirect to the default URL to prevent endless redirections
if current_application_settings.home_page_url.present? &&
current_application_settings.home_page_url.chomp('/') != Gitlab.config.gitlab['url'].chomp('/')
if current_user.nil? && root_path == request.path if current_user.nil? && root_path == request.path
redirect_to current_application_settings.home_page_url and return redirect_to current_application_settings.home_page_url and return
end end
...@@ -190,11 +193,12 @@ class ApplicationController < ActionController::Base ...@@ -190,11 +193,12 @@ class ApplicationController < ActionController::Base
end end
def add_gon_variables def add_gon_variables
gon.default_issues_tracker = Project.new.default_issue_tracker.to_param
gon.api_version = API::API.version gon.api_version = API::API.version
gon.relative_url_root = Gitlab.config.gitlab.relative_url_root
gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s
gon.max_file_size = current_application_settings.max_attachment_size; gon.default_issues_tracker = Project.new.default_issue_tracker.to_param
gon.max_file_size = current_application_settings.max_attachment_size
gon.relative_url_root = Gitlab.config.gitlab.relative_url_root
gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class
if current_user if current_user
gon.current_user_id = current_user.id gon.current_user_id = current_user.id
...@@ -340,6 +344,10 @@ class ApplicationController < ActionController::Base ...@@ -340,6 +344,10 @@ class ApplicationController < ActionController::Base
current_application_settings.import_sources.include?('google_code') current_application_settings.import_sources.include?('google_code')
end end
def fogbugz_import_enabled?
current_application_settings.import_sources.include?('fogbugz')
end
def git_import_enabled? def git_import_enabled?
current_application_settings.import_sources.include?('git') current_application_settings.import_sources.include?('git')
end end
......
...@@ -33,6 +33,7 @@ class AutocompleteController < ApplicationController ...@@ -33,6 +33,7 @@ class AutocompleteController < ApplicationController
@users = @users.non_ldap if params[:skip_ldap] == 'true' @users = @users.non_ldap if params[:skip_ldap] == 'true'
@users = @users.search(params[:search]) if params[:search].present? @users = @users.search(params[:search]) if params[:search].present?
@users = @users.active @users = @users.active
@users = @users.reorder(:name)
@users = @users.page(params[:page]).per(PER_PAGE) @users = @users.page(params[:page]).per(PER_PAGE)
unless params[:search].present? unless params[:search].present?
......
class Dashboard::ProjectsController < Dashboard::ApplicationController class Dashboard::ProjectsController < Dashboard::ApplicationController
before_action :event_filter before_action :event_filter
def index
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
@projects = @projects.includes(:namespace)
@last_push = current_user.recent_push
respond_to do |format|
format.html
format.atom do
event_filter
load_events
render layout: false
end
end
end
def starred def starred
@projects = current_user.starred_projects @projects = current_user.starred_projects
@projects = @projects.includes(:namespace, :forked_from_project, :tags) @projects = @projects.includes(:namespace, :forked_from_project, :tags)
......
class Dashboard::SnippetsController < Dashboard::ApplicationController
def index
@snippets = SnippetsFinder.new.execute(current_user,
filter: :by_user,
user: current_user,
scope: params[:scope]
)
@snippets = @snippets.page(params[:page]).per(PER_PAGE)
end
end
class DashboardController < Dashboard::ApplicationController class DashboardController < Dashboard::ApplicationController
before_action :load_projects
before_action :event_filter, only: :activity before_action :event_filter, only: :activity
respond_to :html respond_to :html
def show
@projects = @projects.includes(:namespace)
@last_push = current_user.recent_push
respond_to do |format|
format.html
format.atom do
event_filter
load_events
render layout: false
end
end
end
def merge_requests def merge_requests
@merge_requests = get_merge_requests_collection @merge_requests = get_merge_requests_collection
@merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE) @merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE)
...@@ -50,12 +35,15 @@ class DashboardController < Dashboard::ApplicationController ...@@ -50,12 +35,15 @@ class DashboardController < Dashboard::ApplicationController
protected protected
def load_projects
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
end
def load_events def load_events
@events = Event.in_projects(current_user.authorized_projects.pluck(:id)) project_ids =
if params[:filter] == "starred"
current_user.starred_projects
else
current_user.authorized_projects
end.pluck(:id)
@events = Event.in_projects(project_ids)
@events = @event_filter.apply_filter(@events).with_associations @events = @event_filter.apply_filter(@events).with_associations
@events = @events.limit(20).offset(params[:offset] || 0) @events = @events.limit(20).offset(params[:offset] || 0)
end end
......
class Explore::ApplicationController < ApplicationController class Explore::ApplicationController < ApplicationController
skip_before_action :authenticate_user!, :reject_blocked
layout 'explore' layout 'explore'
end end
class Explore::GroupsController < Explore::ApplicationController class Explore::GroupsController < Explore::ApplicationController
skip_before_action :authenticate_user!,
:reject_blocked, :set_current_user_for_observers
def index def index
@groups = GroupsFinder.new.execute(current_user) @groups = GroupsFinder.new.execute(current_user)
@groups = @groups.search(params[:search]) if params[:search].present? @groups = @groups.search(params[:search]) if params[:search].present?
......
class Explore::ProjectsController < Explore::ApplicationController class Explore::ProjectsController < Explore::ApplicationController
skip_before_action :authenticate_user!,
:reject_blocked
def index def index
@projects = ProjectsFinder.new.execute(current_user) @projects = ProjectsFinder.new.execute(current_user)
@tags = @projects.tags_on(:tags) @tags = @projects.tags_on(:tags)
......
class Explore::SnippetsController < Explore::ApplicationController
def index
@snippets = SnippetsFinder.new.execute(current_user, filter: :all)
@snippets = @snippets.page(params[:page]).per(PER_PAGE)
end
end
...@@ -4,7 +4,7 @@ class GroupsController < Groups::ApplicationController ...@@ -4,7 +4,7 @@ class GroupsController < Groups::ApplicationController
before_action :group, except: [:new, :create] before_action :group, except: [:new, :create]
# Authorize # Authorize
before_action :authorize_read_group!, except: [:new, :create] before_action :authorize_read_group!, except: [:show, :new, :create]
before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects] before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects]
before_action :authorize_create_group!, only: [:new, :create] before_action :authorize_create_group!, only: [:new, :create]
...@@ -14,6 +14,10 @@ class GroupsController < Groups::ApplicationController ...@@ -14,6 +14,10 @@ class GroupsController < Groups::ApplicationController
layout :determine_layout layout :determine_layout
def index
redirect_to(current_user ? dashboard_groups_path : explore_groups_path)
end
def new def new
@group = Group.new @group = Group.new
end end
......
class HelpController < ApplicationController class HelpController < ApplicationController
skip_before_action :authenticate_user!, :reject_blocked
layout 'help' layout 'help'
def index def index
......
class Import::FogbugzController < Import::BaseController
before_action :verify_fogbugz_import_enabled
before_action :user_map, only: [:new_user_map, :create_user_map]
rescue_from Fogbugz::AuthenticationException, with: :fogbugz_unauthorized
def new
end
def callback
begin
res = Gitlab::FogbugzImport::Client.new(import_params.symbolize_keys)
rescue
# If the URI is invalid various errors can occur
return redirect_to new_import_fogbugz_path, alert: 'Could not connect to FogBugz, check your URL'
end
session[:fogbugz_token] = res.get_token
session[:fogbugz_uri] = params[:uri]
redirect_to new_user_map_import_fogbugz_path
end
def new_user_map
end
def create_user_map
user_map = params[:users]
unless user_map.is_a?(Hash) && user_map.all? { |k, v| !v[:name].blank? }
flash.now[:alert] = 'All users must have a name.'
render 'new_user_map' and return
end
session[:fogbugz_user_map] = user_map
flash[:notice] = 'The user map has been saved. Continue by selecting the projects you want to import.'
redirect_to status_import_fogbugz_path
end
def status
unless client.valid?
return redirect_to new_import_fogbugz_path
end
@repos = client.repos
@already_added_projects = current_user.created_projects.where(import_type: 'fogbugz')
already_added_projects_names = @already_added_projects.pluck(:import_source)
@repos.reject! { |repo| already_added_projects_names.include? repo.name }
end
def jobs
jobs = current_user.created_projects.where(import_type: 'fogbugz').to_json(only: [:id, :import_status])
render json: jobs
end
def create
@repo_id = params[:repo_id]
repo = client.repo(@repo_id)
fb_session = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] }
@target_namespace = current_user.namespace
@project_name = repo.name
namespace = @target_namespace
umap = session[:fogbugz_user_map] || client.user_map
@project = Gitlab::FogbugzImport::ProjectCreator.new(repo, fb_session, namespace, current_user, umap).execute
end
private
def client
@client ||= Gitlab::FogbugzImport::Client.new(token: session[:fogbugz_token], uri: session[:fogbugz_uri])
end
def user_map
@user_map ||= begin
user_map = client.user_map
stored_user_map = session[:fogbugz_user_map]
user_map.update(stored_user_map) if stored_user_map
user_map
end
end
def fogbugz_unauthorized(exception)
redirect_to new_import_fogbugz_path, alert: exception.message
end
def import_params
params.permit(:uri, :email, :password)
end
def verify_fogbugz_import_enabled
not_found! unless fogbugz_import_enabled?
end
end
...@@ -24,7 +24,7 @@ class InvitesController < ApplicationController ...@@ -24,7 +24,7 @@ class InvitesController < ApplicationController
path = path =
if current_user if current_user
dashboard_path dashboard_projects_path
else else
new_user_session_path new_user_session_path
end end
...@@ -73,7 +73,7 @@ class InvitesController < ApplicationController ...@@ -73,7 +73,7 @@ class InvitesController < ApplicationController
path = group_path(group) path = group_path(group)
else else
label = "who knows what" label = "who knows what"
path = dashboard_path path = dashboard_projects_path
end end
[label, path] [label, path]
......
...@@ -14,7 +14,7 @@ class NamespacesController < ApplicationController ...@@ -14,7 +14,7 @@ class NamespacesController < ApplicationController
if user if user
redirect_to user_path(user) redirect_to user_path(user)
elsif group && can?(current_user, :read_group, group) elsif group
redirect_to group_path(group) redirect_to group_path(group)
elsif current_user.nil? elsif current_user.nil?
authenticate_user! authenticate_user!
......
...@@ -18,6 +18,12 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -18,6 +18,12 @@ class Projects::BlobController < Projects::ApplicationController
before_action :after_edit_path, only: [:edit, :update] before_action :after_edit_path, only: [:edit, :update]
def new def new
@title = 'Upload'
@placeholder = 'Upload new file'
@button_title = 'Upload file'
@form_path = namespace_project_create_blob_path(@project.namespace, @project, @id)
@method = :post
commit unless @repository.empty? commit unless @repository.empty?
end end
...@@ -26,14 +32,25 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -26,14 +32,25 @@ class Projects::BlobController < Projects::ApplicationController
if result[:status] == :success if result[:status] == :success
flash[:notice] = "Your changes have been successfully committed" flash[:notice] = "Your changes have been successfully committed"
redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) respond_to do |format|
format.html { redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) }
format.json { render json: { message: "success", filePath: namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) } }
end
else else
flash[:alert] = result[:message] flash[:alert] = result[:message]
render :new respond_to do |format|
format.html { render :new }
format.json { render json: { message: "failed", filePath: namespace_project_new_blob_path(@project.namespace, @project, @id) } }
end
end end
end end
def show def show
@title = "Replace #{@blob.name}"
@placeholder = @title
@button_title = 'Replace file'
@form_path = namespace_project_update_blob_path(@project.namespace, @project, @id)
@method = :put
end end
def edit def edit
...@@ -45,10 +62,16 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -45,10 +62,16 @@ class Projects::BlobController < Projects::ApplicationController
if result[:status] == :success if result[:status] == :success
flash[:notice] = "Your changes have been successfully committed" flash[:notice] = "Your changes have been successfully committed"
redirect_to after_edit_path respond_to do |format|
format.html { redirect_to after_edit_path }
format.json { render json: { message: "success", filePath: after_edit_path } }
end
else else
flash[:alert] = result[:message] flash[:alert] = result[:message]
render :edit respond_to do |format|
format.html { render :edit }
format.json { render json: { message: "failed", filePath: namespace_project_new_blob_path(@project.namespace, @project, @id) } }
end
end end
end end
...@@ -146,11 +169,19 @@ class Projects::BlobController < Projects::ApplicationController ...@@ -146,11 +169,19 @@ class Projects::BlobController < Projects::ApplicationController
@file_path = @file_path =
if action_name.to_s == 'create' if action_name.to_s == 'create'
if params[:file].present?
params[:file_name] = params[:file].original_filename
end
File.join(@path, File.basename(params[:file_name])) File.join(@path, File.basename(params[:file_name]))
else else
@path @path
end end
if params[:file].present?
params[:content] = Base64.encode64(params[:file].read)
params[:encoding] = 'base64'
end
@commit_params = { @commit_params = {
file_path: @file_path, file_path: @file_path,
current_branch: @current_branch, current_branch: @current_branch,
......
...@@ -13,10 +13,14 @@ class Projects::ForksController < Projects::ApplicationController ...@@ -13,10 +13,14 @@ class Projects::ForksController < Projects::ApplicationController
@forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute @forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute
if @forked_project.saved? && @forked_project.forked? if @forked_project.saved? && @forked_project.forked?
if @forked_project.import_in_progress?
redirect_to namespace_project_import_path(@forked_project.namespace, @forked_project)
else
redirect_to( redirect_to(
namespace_project_path(@forked_project.namespace, @forked_project), namespace_project_path(@forked_project.namespace, @forked_project),
notice: 'Project was successfully forked.' notice: 'Project was successfully forked.'
) )
end
else else
render :error render :error
end end
......
...@@ -53,6 +53,7 @@ class Projects::HooksController < Projects::ApplicationController ...@@ -53,6 +53,7 @@ class Projects::HooksController < Projects::ApplicationController
end end
def hook_params def hook_params
params.require(:hook).permit(:url, :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events) params.require(:hook).permit(:url, :push_events, :issues_events,
:merge_requests_events, :tag_push_events, :note_events, :enable_ssl_verification)
end end
end end
...@@ -91,7 +91,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController ...@@ -91,7 +91,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
log_audit_event(@project_member, action: :destroy) log_audit_event(@project_member, action: :destroy)
respond_to do |format| respond_to do |format|
format.html { redirect_to dashboard_path } format.html { redirect_to dashboard_projects_path }
format.js { render nothing: true } format.js { render nothing: true }
end end
end end
......
...@@ -17,8 +17,7 @@ class Projects::RawController < Projects::ApplicationController ...@@ -17,8 +17,7 @@ class Projects::RawController < Projects::ApplicationController
send_data( send_data(
@blob.data, @blob.data,
type: type, type: type,
disposition: 'inline', disposition: 'inline'
filename: @blob.name
) )
else else
not_found! not_found!
...@@ -30,6 +29,8 @@ class Projects::RawController < Projects::ApplicationController ...@@ -30,6 +29,8 @@ class Projects::RawController < Projects::ApplicationController
def get_blob_type def get_blob_type
if @blob.text? if @blob.text?
'text/plain; charset=utf-8' 'text/plain; charset=utf-8'
elsif @blob.image?
@blob.content_type
else else
'application/octet-stream' 'application/octet-stream'
end end
......
...@@ -2,15 +2,14 @@ class Projects::ServicesController < Projects::ApplicationController ...@@ -2,15 +2,14 @@ class Projects::ServicesController < Projects::ApplicationController
ALLOWED_PARAMS = [:title, :token, :type, :active, :api_key, :api_version, :subdomain, ALLOWED_PARAMS = [:title, :token, :type, :active, :api_key, :api_version, :subdomain,
:room, :recipients, :project_url, :webhook, :room, :recipients, :project_url, :webhook,
:user_key, :device, :priority, :sound, :bamboo_url, :username, :password, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password,
:build_key, :server, :teamcity_url, :build_type, :build_key, :server, :teamcity_url, :drone_url, :build_type,
:description, :issues_url, :new_issue_url, :restrict_to_branch, :channel, :description, :issues_url, :new_issue_url, :restrict_to_branch, :channel,
:colorize_messages, :channels, :colorize_messages, :channels,
:push_events, :issues_events, :merge_requests_events, :tag_push_events, :push_events, :issues_events, :merge_requests_events, :tag_push_events,
:note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url, :note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url,
:jira_issue_transition_id, :jira_issue_transition_id,
:notify, :color, :notify, :color,
:server_host, :server_port, :default_irc_uri] :server_host, :server_port, :default_irc_uri, :enable_ssl_verification]
# Authorize # Authorize
before_action :authorize_admin_project! before_action :authorize_admin_project!
before_action :service, only: [:edit, :update, :test] before_action :service, only: [:edit, :update, :test]
......
...@@ -30,9 +30,14 @@ class Projects::SnippetsController < Projects::ApplicationController ...@@ -30,9 +30,14 @@ class Projects::SnippetsController < Projects::ApplicationController
def create def create
@snippet = CreateSnippetService.new(@project, current_user, @snippet = CreateSnippetService.new(@project, current_user,
snippet_params).execute snippet_params).execute
if @snippet.valid?
respond_with(@snippet, respond_with(@snippet,
location: namespace_project_snippet_path(@project.namespace, location: namespace_project_snippet_path(@project.namespace,
@project, @snippet)) @project, @snippet))
else
render :new
end
end end
def edit def edit
......
...@@ -5,7 +5,6 @@ class Projects::WikisController < Projects::ApplicationController ...@@ -5,7 +5,6 @@ class Projects::WikisController < Projects::ApplicationController
before_action :authorize_create_wiki!, only: [:edit, :create, :history] before_action :authorize_create_wiki!, only: [:edit, :create, :history]
before_action :authorize_admin_wiki!, only: :destroy before_action :authorize_admin_wiki!, only: :destroy
before_action :load_project_wiki before_action :load_project_wiki
include WikiHelper
def pages def pages
@wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]).per(PER_PAGE) @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]).per(PER_PAGE)
......
...@@ -10,6 +10,10 @@ class ProjectsController < ApplicationController ...@@ -10,6 +10,10 @@ class ProjectsController < ApplicationController
layout :determine_layout layout :determine_layout
def index
redirect_to(current_user ? root_path : explore_root_path)
end
def new def new
@project = Project.new @project = Project.new
end end
...@@ -105,7 +109,7 @@ class ProjectsController < ApplicationController ...@@ -105,7 +109,7 @@ class ProjectsController < ApplicationController
if request.referer.include?('/admin') if request.referer.include?('/admin')
redirect_to admin_namespaces_projects_path redirect_to admin_namespaces_projects_path
else else
redirect_to dashboard_path redirect_to dashboard_projects_path
end end
rescue Projects::DestroyService::DestroyError => ex rescue Projects::DestroyService::DestroyError => ex
redirect_to edit_project_path(@project), alert: ex.message redirect_to edit_project_path(@project), alert: ex.message
......
...@@ -6,10 +6,10 @@ ...@@ -6,10 +6,10 @@
# #
# For users who haven't customized the setting, we simply delegate to # For users who haven't customized the setting, we simply delegate to
# `DashboardController#show`, which is the default. # `DashboardController#show`, which is the default.
class RootController < DashboardController class RootController < Dashboard::ProjectsController
before_action :redirect_to_custom_dashboard, only: [:show] before_action :redirect_to_custom_dashboard, only: [:index]
def show def index
super super
end end
...@@ -20,6 +20,7 @@ class RootController < DashboardController ...@@ -20,6 +20,7 @@ class RootController < DashboardController
case current_user.dashboard case current_user.dashboard
when 'stars' when 'stars'
flash.keep
redirect_to starred_dashboard_projects_path redirect_to starred_dashboard_projects_path
else else
return return
......
...@@ -8,6 +8,8 @@ class SessionsController < Devise::SessionsController ...@@ -8,6 +8,8 @@ class SessionsController < Devise::SessionsController
def new def new
if Gitlab.config.ldap.enabled if Gitlab.config.ldap.enabled
@ldap_servers = Gitlab::LDAP::Config.servers @ldap_servers = Gitlab::LDAP::Config.servers
else
@ldap_servers = []
end end
super super
......
...@@ -24,13 +24,9 @@ class SnippetsController < ApplicationController ...@@ -24,13 +24,9 @@ class SnippetsController < ApplicationController
scope: params[:scope] }). scope: params[:scope] }).
page(params[:page]).per(PER_PAGE) page(params[:page]).per(PER_PAGE)
if @user == current_user render 'index'
render 'current_user_index'
else else
render 'user_index' redirect_to(current_user ? dashboard_snippets_path : explore_snippets_path)
end
else
@snippets = SnippetsFinder.new.execute(current_user, filter: :all).page(params[:page]).per(PER_PAGE)
end end
end end
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment