Commit b61f80ba authored by Javier Castro's avatar Javier Castro

Merge remote-tracking branch 'upstream/master' into fix-4305

parents 556ae5ae fbbd9897
...@@ -34,3 +34,4 @@ doc/code/* ...@@ -34,3 +34,4 @@ doc/code/*
.secret .secret
*.log *.log
public/uploads.* public/uploads.*
public/assets/
language: ruby language: ruby
env: env:
global: global:
- DB=mysql
- TRAVIS=true - TRAVIS=true
matrix: matrix:
- TASK=spinach - TASK=spinach DB=mysql
- TASK=spec - TASK=spec DB=mysql
- TASK=jasmine:ci - TASK=jasmine:ci DB=mysql
- TASK=spinach DB=postgresql
- TASK=spec DB=postgresql
- TASK=jasmine:ci DB=postgresql
before_install: before_install:
- sudo apt-get install libicu-dev -y - sudo apt-get install libicu-dev -y
branches: branches:
...@@ -15,7 +17,6 @@ branches: ...@@ -15,7 +17,6 @@ branches:
rvm: rvm:
- 2.0.0 - 2.0.0
services: services:
- mysql
- redis-server - redis-server
before_script: before_script:
- "cp config/database.yml.$DB config/database.yml" - "cp config/database.yml.$DB config/database.yml"
......
v 6.7.0
- Add support for Gemnasium as a Project Service (Olivier Gonzalez)
- Add edit file button to MergeRequest diff
- Public groups (Jason Hollingsworth)
- Cleaner headers in Notification Emails (Pierre de La Morinerie)
- Blob and tree gfm links to anchors work
- Piwik Integration (Sebastian Winkler)
- Show contribution guide link for new issue form (Jeroen van Baarsen)
- Fix CI status for merge requests from fork
- Added option to remove issue assignee on project issue page and issue edit page (Jason Blanchard)
v 6.6.2
- Fix 500 error on branch/tag create or remove via UI
v 6.6.1
- Fix 500 error on files tab if submodules presents
v 6.6.0
- Retrieving user ssh keys publically(github style): http://__HOST__/__USERNAME__.keys
- Permissions: Developer now can manage issue tracker (modify any issue)
- Improve Code Compare page performance
- Group avatar
- Pygments.rb replaced with highlight.js
- Improve Merge request diff store logic
- Improve render performnace for MR show page
- Fixed Assembla hardcoded project name
- Jira integration documentation
- Refactored app/services
- Remove snippet expiration
- Mobile UI improvements (Drew Blessing)
- Fix block/remove UI for admin::users#show page
- Show users' group membership on users' activity page (Robert Djurasaj)
- User pages are visible without login if user is authorized to a public project
- Markdown rendered headers have id derived from their name and link to their id
- Improve application to work faster with large groups (100+ members)
- Multiple emails per user
- Show last commit for file when view file source
- Restyle Issue#show page and MR#show page
- Ability to filter by multiple labels for Issues page
- Rails version to 4.0.3
- Fixed attachment identifier displaying underneath note text (Jason Blanchard)
v 6.5.1
- Fix branch selectbox when create merge request from fork
v 6.5.0 v 6.5.0
- Dropdown menus on issue#show page for assignee and milestone (Jason Blanchard) - Dropdown menus on issue#show page for assignee and milestone (Jason Blanchard)
- Add color custimization and previewing to broadcast messages - Add color custimization and previewing to broadcast messages
- Fixed notes anchors - Fixed notes anchors
- Load new comments in issues dynamically - Load new comments in issues dynamically
- Added sort options to Public page - Added sort options to Public page
- Added new filters(assigned/authored/all) to Dashboard#issues, Dashboard#merge_request pages - New filters (assigned/authored/all) for Dashboard#issues/merge_requests (sponsored by Say Media)
- Add project visibility icons to dashboard - Add project visibility icons to dashboard
- Enable secure cookies if https used - Enable secure cookies if https used
- Protect users/confirmation with rack_attack - Protect users/confirmation with rack_attack
...@@ -15,6 +60,11 @@ v 6.5.0 ...@@ -15,6 +60,11 @@ v 6.5.0
- SCSS refactored - SCSS refactored
- Use jquery timeago plugin - Use jquery timeago plugin
- Fix 500 error for rdoc files - Fix 500 error for rdoc files
- Ability to customize merge commit message (sponsored by Say Media)
- Search autocomplete via ajax
- Add website url to user profile
- Files API supports base64 encoded content (sponsored by O'Reilly Media)
- Added support for Go's repository retrieval (Bruno Albuquerque)
v6.4.3 v6.4.3
- Don't use unicorn worker killer if PhusionPassenger is defined - Don't use unicorn worker killer if PhusionPassenger is defined
...@@ -22,7 +72,7 @@ v6.4.3 ...@@ -22,7 +72,7 @@ v6.4.3
v6.4.2 v6.4.2
- Fixed wrong behaviour of script/upgrade.rb - Fixed wrong behaviour of script/upgrade.rb
v6.4.1 v6.4.1
- Fixed bug with repository rename - Fixed bug with repository rename
- Fixed bug with project transfer - Fixed bug with project transfer
...@@ -615,4 +665,4 @@ v 0.8.0 ...@@ -615,4 +665,4 @@ v 0.8.0
- stability - stability
- security fixes - security fixes
- increased test coverage - increased test coverage
- email notification - email notification
\ No newline at end of file
...@@ -48,7 +48,7 @@ Please send a merge request with a tested solution or a merge request with a fai ...@@ -48,7 +48,7 @@ Please send a merge request with a tested solution or a merge request with a fai
## Merge requests ## Merge requests
We welcome merge requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a merge request for are listed with the [status 'accepting merge/merge requests' on our feedback forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome. We welcome merge requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a merge request for are listed with the [status 'accepting merge requests' on our feedback forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome. If you want to add a new feature that is not marked it is best to first create a feedback issue (if there isn't one already) and leave a comment asking for it to be marked accepting merge requests. Please include screenshots or wireframes if the feature will also change the UI.
### Merge request guidelines ### Merge request guidelines
...@@ -66,19 +66,30 @@ If you can, please submit a merge request with the fix or improvements including ...@@ -66,19 +66,30 @@ If you can, please submit a merge request with the fix or improvements including
1. If the MR changes the UI it should include before and after screenshots 1. If the MR changes the UI it should include before and after screenshots
1. Link relevant [issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) and/or [feedback items](http://feedback.gitlab.com/) from the merge request description and leave a comment on them with a link back to the MR 1. Link relevant [issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) and/or [feedback items](http://feedback.gitlab.com/) from the merge request description and leave a comment on them with a link back to the MR
1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submittion 1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submittion
1. If your MR touches code that executes shell commands, make sure it adheres to the [shell command guidelines]( doc/development/shell_commands.md).
Please keep the change in a single MR as small as possible. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? The smaller a MR is the more likely it is it will be merged, after that you can send more MR's to enhance it. The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast. Before this time the GitLab.com team is still dealing with work that is created by the monthly release such as assisting subscribers with upgrade issues, the release of Enterprise Edition and the upgrade of GitLab Cloud. After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features.
We will accept a merge requests if it: Please keep the change in a single MR **as small as possible**. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? The smaller a MR is the more likely it is it will be merged, after that you can send more MR's to enhance it.
* Includes proper tests and all tests pass (unless it contains a test exposing a bug in existing code) For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). Please ensure that your merge request meets the following contribution acceptance criteria.
* Can be merged without problems (if not please use: `git rebase master`)
* Do not break any existing functionality
* Conforms to the [Ruby](https://github.com/bbatsov/ruby-style-guide) and [Rails](https://github.com/bbatsov/rails-style-guide) style guides and best practices
* Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
* Keeps the GitLab code base clean and well structured
* Contains functionality we think other users will benefit from too
* Doesn't add unnessecary configuration options since they complicate future changes
* Contains a single commit (please use `git rebase -i` to squash commits)
For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). ## Contribution acceptance criteria
1. The change is as small as possible (see the above paragraph for details)
1. Include proper tests and make all tests pass (unless it contains a test exposing a bug in existing code)
1. Can merge without problems (if not please use: `git rebase master`)
1. Does not break any existing functionality
1. Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
1. Keeps the GitLab code base clean and well structured
1. Contains functionality we think other users will benefit from too
1. Doesn't add configuration options since they complicate future changes
1. Contains a single commit (please use `git rebase -i` to squash commits)
1. It conforms to the following style guides
## Style guides
1. [Ruby style guide](https://github.com/bbatsov/ruby-style-guide)
1. [Rails style guide](https://github.com/bbatsov/rails-style-guide)
1. [CoffeeScript style guide](https://github.com/polarmobile/coffeescript-style-guide)
1. [Shell command guidelines](doc/development/shell_commands.md)
...@@ -14,7 +14,9 @@ gem "protected_attributes" ...@@ -14,7 +14,9 @@ gem "protected_attributes"
gem 'rails-observers' gem 'rails-observers'
gem 'actionpack-page_caching' gem 'actionpack-page_caching'
gem 'actionpack-action_caching' gem 'actionpack-action_caching'
gem 'activerecord-deprecated_finders'
# Default values for AR models
gem "default_value_for", "~> 3.0.0"
# Supported DBs # Supported DBs
gem "mysql2", group: :mysql gem "mysql2", group: :mysql
...@@ -30,28 +32,28 @@ gem 'omniauth-github' ...@@ -30,28 +32,28 @@ gem 'omniauth-github'
# 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", "~> 4.0.0" gem "gitlab_git", '~> 5.6.0'
# Ruby/Rack Git Smart-HTTP Server Handler # Ruby/Rack Git Smart-HTTP Server Handler
gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack' gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack'
# LDAP Auth # LDAP Auth
gem 'gitlab_omniauth-ldap', '1.0.3', require: "omniauth-ldap" gem 'gitlab_omniauth-ldap', '1.0.4', require: "omniauth-ldap"
# Syntax highlighter
gem "gitlab-pygments.rb", '~> 0.5.4', require: 'pygments.rb'
# Git Wiki # Git Wiki
gem "gitlab-gollum-lib", "~> 1.0.2", require: 'gollum-lib' gem "gitlab-gollum-lib", "~> 1.1.0", require: 'gollum-lib'
# Language detection # Language detection
gem "gitlab-linguist", "~> 2.9.6", require: "linguist" gem "gitlab-linguist", "~> 3.0.0", require: "linguist"
# API # API
gem "grape", "~> 0.6.1" gem "grape", "~> 0.6.1"
gem "grape-entity", "~> 0.3.0" gem "grape-entity", "~> 0.3.0"
gem 'rack-cors', require: 'rack/cors' gem 'rack-cors', require: 'rack/cors'
# Email validation
gem "email_validator", "~> 1.4.0", :require => 'email_validator/strict'
# Format dates and times # Format dates and times
# based on human-friendly examples # based on human-friendly examples
gem "stamp" gem "stamp"
...@@ -60,7 +62,7 @@ gem "stamp" ...@@ -60,7 +62,7 @@ gem "stamp"
gem 'enumerize' gem 'enumerize'
# Pagination # Pagination
gem "kaminari", "~> 0.14.1" gem "kaminari", "~> 0.15.1"
# HAML # HAML
gem "haml-rails" gem "haml-rails"
...@@ -125,6 +127,9 @@ gem "hipchat", "~> 0.14.0" ...@@ -125,6 +127,9 @@ gem "hipchat", "~> 0.14.0"
# Flowdock integration # Flowdock integration
gem "gitlab-flowdock-git-hook", "~> 0.4.2" gem "gitlab-flowdock-git-hook", "~> 0.4.2"
# Gemnasium integration
gem "gemnasium-gitlab-service", "~> 0.2"
# d3 # d3
gem "d3_rails", "~> 3.1.4" gem "d3_rails", "~> 3.1.4"
...@@ -137,6 +142,9 @@ gem "sanitize" ...@@ -137,6 +142,9 @@ gem "sanitize"
# Protect against bruteforcing # Protect against bruteforcing
gem "rack-attack" gem "rack-attack"
# Ace editor
gem 'ace-rails-ap'
gem "sass-rails" gem "sass-rails"
gem "coffee-rails" gem "coffee-rails"
gem "uglifier" gem "uglifier"
...@@ -159,7 +167,7 @@ group :development do ...@@ -159,7 +167,7 @@ group :development do
gem "annotate", "~> 2.6.0.beta2" gem "annotate", "~> 2.6.0.beta2"
gem "letter_opener" gem "letter_opener"
gem 'quiet_assets', '~> 1.0.1' gem 'quiet_assets', '~> 1.0.1'
gem 'rack-mini-profiler' gem 'rack-mini-profiler', require: false
# Better errors handler # Better errors handler
gem 'better_errors' gem 'better_errors'
...@@ -206,6 +214,10 @@ group :development, :test do ...@@ -206,6 +214,10 @@ group :development, :test do
gem 'spork', '~> 1.0rc' gem 'spork', '~> 1.0rc'
gem 'jasmine', '2.0.0.rc5' gem 'jasmine', '2.0.0.rc5'
gem "spring", '1.1.1'
gem "spring-commands-rspec", '1.0.1'
gem "spring-commands-spinach", '1.0.0'
end end
group :test do group :test do
......
...@@ -8,11 +8,12 @@ GIT ...@@ -8,11 +8,12 @@ GIT
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actionmailer (4.0.2) ace-rails-ap (2.0.1)
actionpack (= 4.0.2) actionmailer (4.0.3)
actionpack (= 4.0.3)
mail (~> 2.5.4) mail (~> 2.5.4)
actionpack (4.0.2) actionpack (4.0.3)
activesupport (= 4.0.2) activesupport (= 4.0.3)
builder (~> 3.1.0) builder (~> 3.1.0)
erubis (~> 2.7.0) erubis (~> 2.7.0)
rack (~> 1.5.2) rack (~> 1.5.2)
...@@ -21,16 +22,16 @@ GEM ...@@ -21,16 +22,16 @@ GEM
actionpack (>= 4.0.0, < 5.0) actionpack (>= 4.0.0, < 5.0)
actionpack-page_caching (1.0.2) actionpack-page_caching (1.0.2)
actionpack (>= 4.0.0, < 5) actionpack (>= 4.0.0, < 5)
activemodel (4.0.2) activemodel (4.0.3)
activesupport (= 4.0.2) activesupport (= 4.0.3)
builder (~> 3.1.0) builder (~> 3.1.0)
activerecord (4.0.2) activerecord (4.0.3)
activemodel (= 4.0.2) activemodel (= 4.0.3)
activerecord-deprecated_finders (~> 1.0.2) activerecord-deprecated_finders (~> 1.0.2)
activesupport (= 4.0.2) activesupport (= 4.0.3)
arel (~> 4.0.0) arel (~> 4.0.0)
activerecord-deprecated_finders (1.0.3) activerecord-deprecated_finders (1.0.3)
activesupport (4.0.2) activesupport (4.0.3)
i18n (~> 0.6, >= 0.6.4) i18n (~> 0.6, >= 0.6.4)
minitest (~> 4.2) minitest (~> 4.2)
multi_json (~> 1.3) multi_json (~> 1.3)
...@@ -42,7 +43,7 @@ GEM ...@@ -42,7 +43,7 @@ GEM
annotate (2.6.0) annotate (2.6.0)
activerecord (>= 2.3.0) activerecord (>= 2.3.0)
rake (>= 0.8.7) rake (>= 0.8.7)
arel (4.0.1) arel (4.0.2)
asciidoctor (0.1.4) asciidoctor (0.1.4)
atomic (1.1.14) atomic (1.1.14)
awesome_print (1.2.0) awesome_print (1.2.0)
...@@ -100,6 +101,8 @@ GEM ...@@ -100,6 +101,8 @@ GEM
daemons (1.1.9) daemons (1.1.9)
database_cleaner (1.2.0) database_cleaner (1.2.0)
debug_inspector (0.0.2) debug_inspector (0.0.2)
default_value_for (3.0.0)
activerecord (>= 3.2.0, < 5.0)
descendants_tracker (0.0.3) descendants_tracker (0.0.3)
devise (3.0.4) devise (3.0.4)
bcrypt-ruby (~> 3.0) bcrypt-ruby (~> 3.0)
...@@ -114,6 +117,8 @@ GEM ...@@ -114,6 +117,8 @@ GEM
email_spec (1.5.0) email_spec (1.5.0)
launchy (~> 2.1) launchy (~> 2.1)
mail (~> 2.2) mail (~> 2.2)
email_validator (1.4.0)
activemodel
enumerize (0.7.0) enumerize (0.7.0)
activesupport (>= 3.2) activesupport (>= 3.2)
equalizer (0.0.8) equalizer (0.0.8)
...@@ -149,6 +154,8 @@ GEM ...@@ -149,6 +154,8 @@ GEM
dotenv (>= 0.7) dotenv (>= 0.7)
thor (>= 0.13.6) thor (>= 0.13.6)
formatador (0.2.4) formatador (0.2.4)
gemnasium-gitlab-service (0.2.1)
rugged (~> 0.19)
gemoji (1.3.1) gemoji (1.3.1)
gherkin-ruby (0.3.1) gherkin-ruby (0.3.1)
racc racc
...@@ -156,36 +163,32 @@ GEM ...@@ -156,36 +163,32 @@ GEM
gitlab-flowdock-git-hook (0.4.2.2) gitlab-flowdock-git-hook (0.4.2.2)
gitlab-grit (>= 2.4.1) gitlab-grit (>= 2.4.1)
multi_json multi_json
gitlab-gollum-lib (1.0.2) gitlab-gollum-lib (1.1.0)
github-markdown (~> 0.5.3) github-markdown (~> 0.5.3)
github-markup (>= 0.7.5, < 1.0.0) github-markup (>= 0.7.5, < 1.0.0)
gitlab-grit (~> 2.6.1) gitlab-grit (~> 2.6.1)
gitlab-pygments.rb (~> 0.5.4)
nokogiri (~> 1.5.9) nokogiri (~> 1.5.9)
sanitize (~> 2.0.3) sanitize (~> 2.0.3)
stringex (~> 1.5.1) stringex (~> 1.5.1)
gitlab-grack (2.0.0.pre) gitlab-grack (2.0.0.pre)
rack (~> 1.5.1) rack (~> 1.5.1)
gitlab-grit (2.6.3) gitlab-grit (2.6.4)
charlock_holmes (~> 0.6.9) charlock_holmes (~> 0.6.9)
diff-lcs (~> 1.1) diff-lcs (~> 1.1)
mime-types (~> 1.15) mime-types (~> 1.15)
posix-spawn (~> 0.3.6) posix-spawn (~> 0.3.6)
gitlab-linguist (2.9.6) gitlab-linguist (3.0.0)
charlock_holmes (~> 0.6.6) charlock_holmes (~> 0.6.6)
escape_utils (~> 0.2.4) escape_utils (~> 0.2.4)
gitlab-pygments.rb (~> 0.5.4)
mime-types (~> 1.19) mime-types (~> 1.19)
gitlab-pygments.rb (0.5.4) gitlab_git (5.6.0)
posix-spawn (~> 0.3.6)
yajl-ruby (~> 1.1.0)
gitlab_git (4.0.0)
activesupport (~> 4.0.0) activesupport (~> 4.0.0)
charlock_holmes (~> 0.6.9)
gitlab-grit (~> 2.6.1) gitlab-grit (~> 2.6.1)
gitlab-linguist (~> 2.9.5) gitlab-linguist (~> 3.0.0)
gitlab-pygments.rb (~> 0.5.4) rugged (~> 0.19.0)
gitlab_meta (6.0) gitlab_meta (6.0)
gitlab_omniauth-ldap (1.0.3) gitlab_omniauth-ldap (1.0.4)
net-ldap (~> 0.3.1) net-ldap (~> 0.3.1)
omniauth (~> 1.0) omniauth (~> 1.0)
pyu-ruby-sasl (~> 0.0.3.1) pyu-ruby-sasl (~> 0.0.3.1)
...@@ -257,7 +260,7 @@ GEM ...@@ -257,7 +260,7 @@ GEM
json (1.8.1) json (1.8.1)
jwt (0.1.8) jwt (0.1.8)
multi_json (>= 1.5) multi_json (>= 1.5)
kaminari (0.14.1) kaminari (0.15.1)
actionpack (>= 3.0.0) actionpack (>= 3.0.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
kgio (2.8.1) kgio (2.8.1)
...@@ -279,7 +282,7 @@ GEM ...@@ -279,7 +282,7 @@ GEM
minitest (4.7.5) minitest (4.7.5)
modernizr (2.6.2) modernizr (2.6.2)
sprockets (~> 2.0) sprockets (~> 2.0)
multi_json (1.8.2) multi_json (1.8.4)
multi_xml (0.5.5) multi_xml (0.5.5)
multipart-post (1.2.0) multipart-post (1.2.0)
mysql2 (0.3.11) mysql2 (0.3.11)
...@@ -321,8 +324,8 @@ GEM ...@@ -321,8 +324,8 @@ GEM
cliver (~> 0.2.1) cliver (~> 0.2.1)
multi_json (~> 1.0) multi_json (~> 1.0)
websocket-driver (>= 0.2.0) websocket-driver (>= 0.2.0)
polyglot (0.3.3) polyglot (0.3.4)
posix-spawn (0.3.6) posix-spawn (0.3.8)
protected_attributes (1.0.5) protected_attributes (1.0.5)
activemodel (>= 4.0.1, < 5.0) activemodel (>= 4.0.1, < 5.0)
pry (0.9.12.4) pry (0.9.12.4)
...@@ -339,7 +342,7 @@ GEM ...@@ -339,7 +342,7 @@ GEM
rack-attack (2.3.0) rack-attack (2.3.0)
rack rack
rack-cors (0.2.9) rack-cors (0.2.9)
rack-mini-profiler (0.1.31) rack-mini-profiler (0.9.0)
rack (>= 1.1.3) rack (>= 1.1.3)
rack-mount (0.8.3) rack-mount (0.8.3)
rack (>= 1.0.0) rack (>= 1.0.0)
...@@ -347,13 +350,13 @@ GEM ...@@ -347,13 +350,13 @@ GEM
rack rack
rack-test (0.6.2) rack-test (0.6.2)
rack (>= 1.0) rack (>= 1.0)
rails (4.0.2) rails (4.0.3)
actionmailer (= 4.0.2) actionmailer (= 4.0.3)
actionpack (= 4.0.2) actionpack (= 4.0.3)
activerecord (= 4.0.2) activerecord (= 4.0.3)
activesupport (= 4.0.2) activesupport (= 4.0.3)
bundler (>= 1.3.0, < 2.0) bundler (>= 1.3.0, < 2.0)
railties (= 4.0.2) railties (= 4.0.3)
sprockets-rails (~> 2.0.0) sprockets-rails (~> 2.0.0)
rails-observers (0.1.2) rails-observers (0.1.2)
activemodel (~> 4.0) activemodel (~> 4.0)
...@@ -366,13 +369,13 @@ GEM ...@@ -366,13 +369,13 @@ GEM
i18n i18n
require_all require_all
ruby-progressbar ruby-progressbar
railties (4.0.2) railties (4.0.3)
actionpack (= 4.0.2) actionpack (= 4.0.3)
activesupport (= 4.0.2) activesupport (= 4.0.3)
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0) thor (>= 0.18.1, < 2.0)
raindrops (0.12.0) raindrops (0.12.0)
rake (10.1.0) rake (10.1.1)
raphael-rails (2.1.2) raphael-rails (2.1.2)
rb-fsevent (0.9.3) rb-fsevent (0.9.3)
rb-inotify (0.9.2) rb-inotify (0.9.2)
...@@ -421,6 +424,7 @@ GEM ...@@ -421,6 +424,7 @@ GEM
ruby-hmac (0.4.0) ruby-hmac (0.4.0)
ruby-progressbar (1.2.0) ruby-progressbar (1.2.0)
rubyntlm (0.1.1) rubyntlm (0.1.1)
rugged (0.19.0)
safe_yaml (0.9.7) safe_yaml (0.9.7)
sanitize (2.0.6) sanitize (2.0.6)
nokogiri (>= 1.4.4) nokogiri (>= 1.4.4)
...@@ -470,6 +474,11 @@ GEM ...@@ -470,6 +474,11 @@ GEM
railties (>= 3) railties (>= 3)
spinach (>= 0.4) spinach (>= 0.4)
spork (1.0.0rc4) spork (1.0.0rc4)
spring (1.1.1)
spring-commands-rspec (1.0.1)
spring (>= 0.9.1)
spring-commands-spinach (1.0.0)
spring (>= 0.9.1)
sprockets (2.10.1) sprockets (2.10.1)
hike (~> 1.2) hike (~> 1.2)
multi_json (~> 1.0) multi_json (~> 1.0)
...@@ -541,15 +550,14 @@ GEM ...@@ -541,15 +550,14 @@ GEM
websocket-driver (0.3.1) websocket-driver (0.3.1)
xpath (2.0.0) xpath (2.0.0)
nokogiri (~> 1.3) nokogiri (~> 1.3)
yajl-ruby (1.1.0)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
ace-rails-ap
actionpack-action_caching actionpack-action_caching
actionpack-page_caching actionpack-page_caching
activerecord-deprecated_finders
acts-as-taggable-on acts-as-taggable-on
annotate (~> 2.6.0.beta2) annotate (~> 2.6.0.beta2)
asciidoctor asciidoctor
...@@ -564,25 +572,27 @@ DEPENDENCIES ...@@ -564,25 +572,27 @@ DEPENDENCIES
coveralls coveralls
d3_rails (~> 3.1.4) d3_rails (~> 3.1.4)
database_cleaner database_cleaner
default_value_for (~> 3.0.0)
devise (= 3.0.4) devise (= 3.0.4)
devise-async (= 0.8.0) devise-async (= 0.8.0)
email_spec email_spec
email_validator (~> 1.4.0)
enumerize enumerize
factory_girl_rails factory_girl_rails
ffaker ffaker
fog (~> 1.3.1) fog (~> 1.3.1)
font-awesome-rails (~> 3.2) font-awesome-rails (~> 3.2)
foreman foreman
gemnasium-gitlab-service (~> 0.2)
gemoji (~> 1.3.0) gemoji (~> 1.3.0)
github-markup (~> 0.7.4)! github-markup (~> 0.7.4)!
gitlab-flowdock-git-hook (~> 0.4.2) gitlab-flowdock-git-hook (~> 0.4.2)
gitlab-gollum-lib (~> 1.0.2) gitlab-gollum-lib (~> 1.1.0)
gitlab-grack (~> 2.0.0.pre) gitlab-grack (~> 2.0.0.pre)
gitlab-linguist (~> 2.9.6) gitlab-linguist (~> 3.0.0)
gitlab-pygments.rb (~> 0.5.4) gitlab_git (~> 5.6.0)
gitlab_git (~> 4.0.0)
gitlab_meta (= 6.0) gitlab_meta (= 6.0)
gitlab_omniauth-ldap (= 1.0.3) gitlab_omniauth-ldap (= 1.0.4)
gon (~> 5.0.0) gon (~> 5.0.0)
grape (~> 0.6.1) grape (~> 0.6.1)
grape-entity (~> 0.3.0) grape-entity (~> 0.3.0)
...@@ -597,7 +607,7 @@ DEPENDENCIES ...@@ -597,7 +607,7 @@ DEPENDENCIES
jquery-rails (= 2.1.3) jquery-rails (= 2.1.3)
jquery-turbolinks jquery-turbolinks
jquery-ui-rails (= 2.0.2) jquery-ui-rails (= 2.0.2)
kaminari (~> 0.14.1) kaminari (~> 0.15.1)
launchy launchy
letter_opener letter_opener
minitest (~> 4.7.0) minitest (~> 4.7.0)
...@@ -638,6 +648,9 @@ DEPENDENCIES ...@@ -638,6 +648,9 @@ DEPENDENCIES
slim slim
spinach-rails spinach-rails
spork (~> 1.0rc) spork (~> 1.0rc)
spring (= 1.1.1)
spring-commands-rspec (= 1.0.1)
spring-commands-spinach (= 1.0.0)
stamp stamp
state_machine state_machine
test_after_commit test_after_commit
......
Copyright (c) 2011 Dmitriy Zaporozhets Copyright (c) 2011-2014 Dmitriy Zaporozhets
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
......
...@@ -21,3 +21,5 @@ release where the minor version is increased numerically by increments of one ...@@ -21,3 +21,5 @@ release where the minor version is increased numerically by increments of one
(eg. `5.0 -> 5.1`). (eg. `5.0 -> 5.1`).
We encourage everyone to run the latest stable release to ensure that you can easily upgrade to the most secure and feature rich GitLab experience. In order to make sure you can easily run the most recent stable release, we are working hard to keep the update process simple and reliable. We encourage everyone to run the latest stable release to ensure that you can easily upgrade to the most secure and feature rich GitLab experience. In order to make sure you can easily run the most recent stable release, we are working hard to keep the update process simple and reliable.
More information about the release procedures can be found in the doc/release directory.
...@@ -73,7 +73,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue ...@@ -73,7 +73,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue
### Feature requests ### Feature requests
Thanks for your interest in GitLab. We don't use the GitHub issue tracker for feature requests. Please use http://feedback.gitlab.com/ for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information. Thanks for your interest in GitLab. We don't use the issue tracker for feature requests. Please use http://feedback.gitlab.com/ for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
### Issue report for old version ### Issue report for old version
...@@ -81,7 +81,7 @@ Thanks for the issue report but we only support issues for the latest stable ver ...@@ -81,7 +81,7 @@ Thanks for the issue report but we only support issues for the latest stable ver
### Support requests and configuration questions ### Support requests and configuration questions
Thanks for your interest in GitLab. We don't use the GitHub issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the unofficial #gitlab IRC channel on Freenode or the http://www.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information. Thanks for your interest in GitLab. We don't use the issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the unofficial #gitlab IRC channel on Freenode or the http://www.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
### Code format ### Code format
......
...@@ -4,26 +4,21 @@ ...@@ -4,26 +4,21 @@
![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif) ![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif)
### GitLab allows you to ### Gitlab is open source software to collaborate on code
* keep your code secure on your own server
* manage repositories, users and access permissions
* communicate through issues, line-comments and wiki pages
* perform code review with merge requests
### GitLab is * Manage git repositories with fine grained access controls that keep your code secure
* Perform code reviews and enhance collaboration with merge requests
* powered by Ruby on Rails * Each project can also have an issue tracker and a wiki
* completely free and open source (MIT license) * Used by more than 50,000 organizations, GitLab is the most popular solution to manage git repositories on-premises
* used by more than 25.000 organizations to keep their code secure * Completely free and open source (MIT Expat license)
* Powered by Ruby on Rails
### Code status ### Code status
* [![build status](http://ci.gitlab.org/projects/1/status.png?ref=master)](http://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch) * [![build status](https://ci.gitlab.org/projects/1/status.png?ref=master)](https://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch)
* [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.png)](https://codeclimate.com/github/gitlabhq/gitlabhq) * [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.png)](https://codeclimate.com/github/gitlabhq/gitlabhq)
* [![Dependency Status](https://gemnasium.com/gitlabhq/gitlabhq.png)](https://gemnasium.com/gitlabhq/gitlabhq) this button can be yellow (small updates are available) but must not be red (a security fix or an important update is available), gems are updated in major releases of GitLab.
* [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq) * [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq)
### Resources ### Resources
...@@ -36,6 +31,8 @@ ...@@ -36,6 +31,8 @@
* [GitLab CI](https://gitlab.com/gitlab-org/gitlab-ci/blob/master/README.md) is a continuous integration (CI) server that is easy to integrate with GitLab. * [GitLab CI](https://gitlab.com/gitlab-org/gitlab-ci/blob/master/README.md) is a continuous integration (CI) server that is easy to integrate with GitLab.
* Unofficial third-party [iPhone app](http://gitlabcontrol.com/) and [Android app](https://play.google.com/store/apps/details?id=com.bd.gitlab&hl=en) for GitLab
### Requirements ### Requirements
* Ubuntu/Debian** * Ubuntu/Debian**
...@@ -50,13 +47,17 @@ ...@@ -50,13 +47,17 @@
#### Official installation methods #### Official installation methods
* [Manual installation guide for a production server](doc/install/installation.md) * [GitLab packages (beta)](https://www.gitlab.com/downloads/) These packages contain GitLab and all its depencies (PostgreSQL, Redis, Nginx, Unicorn, etc.). They are made with [omnibus-gitlab](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md) that also contains the installation instructions. These packages currently support a reduced selection of GitLab's normal features. For instance, it is not yet possible to create/restore application backups or to use HTTPS.
* [GitLab virtual machine images](https://www.gitlab.com/downloads/) contain an operating system and a preinstalled GitLab. They are made with [GitLab Packer](https://gitlab.com/gitlab-org/gitlab-packer/blob/master/README.md) that also contains the installation instructions.
* [GitLab Chef Cookbook](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/README.md) This cookbook can be used both for development installations and production installations. If you want to [contribute](CONTRIBUTE.md) to GitLab we suggest you follow the [development installation on a virtual machine with Vagrant](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/doc/development.md) instructions to install all testing dependencies. * [GitLab Chef Cookbook](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/README.md) This cookbook can be used both for development installations and production installations. If you want to [contribute](CONTRIBUTE.md) to GitLab we suggest you follow the [development installation on a virtual machine with Vagrant](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/doc/development.md) instructions to install all testing dependencies.
* [Manual installation guide](doc/install/installation.md) This guide to set up a production server offers detailed and complete step-by-step instructions.
#### Third party one-click installers #### Third party one-click installers
* [Digital Ocean 1-Click Application Install](https://www.digitalocean.com/blog_posts/host-your-git-repositories-in-55-seconds-with-gitlab) Have a new server up in 55 seconds. Digital Ocean uses SSD disks which is great for an IO intensive app such as GitLab. * [Digital Ocean 1-Click Application Install](https://www.digitalocean.com/blog_posts/host-your-git-repositories-in-55-seconds-with-gitlab) Have a new server up in 55 seconds. Digital Ocean uses SSD disks which is great for an IO intensive app such as GitLab. We recommend selecting a droplet with [1GB of memory](https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/requirements.md).
* [BitNami one-click installers](http://bitnami.com/stack/gitlab) This package contains both GitLab and GitLab CI. It is available as installer, virtual machine or for cloud hosting providers (Amazon Web Services/Azure/etc.). * [BitNami one-click installers](http://bitnami.com/stack/gitlab) This package contains both GitLab and GitLab CI. It is available as installer, virtual machine or for cloud hosting providers (Amazon Web Services/Azure/etc.).
...@@ -68,11 +69,9 @@ ...@@ -68,11 +69,9 @@
### New versions and upgrading ### New versions and upgrading
Since 2011 GitLab is released on the 22nd of every month. Every new release includes an upgrade guide. Since 2011 GitLab is released on the 22nd of every month. Every new release includes an [upgrade guide](doc/update) and new features are detailed in the [Changelog](CHANGELOG).
* [Upgrade guides](doc/update)
* [Changelog](CHANGELOG) It is recommended to follow a monthly upgrade schedule. Security releases come out when needed. For more information about the release process see the documentation for [monthly](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/release/monthly.md) and [security](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/release/security.md) releases.
* Features that will be in the next releases are listed on [the feedback and suggestions forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457). * Features that will be in the next releases are listed on [the feedback and suggestions forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457).
...@@ -145,16 +144,18 @@ or start each component separately ...@@ -145,16 +144,18 @@ or start each component separately
* [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab. * [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab.
* [Contributing guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md) describes how to submit merge requests and issues. Pull requests and issues not in line with the guidelines in this document will be closed. * [Contributing guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) describes how to submit merge requests and issues. Pull requests and issues not in line with the guidelines in this document will be closed.
* [Support subscription](http://www.gitlab.com/subscription/) connects you to the knowledge of GitLab experts that will resolve your issues and answer your questions. * [Support subscription](http://www.gitlab.com/subscription/) connects you to the knowledge of GitLab experts that will resolve your issues and answer your questions.
* [Consultancy](http://www.gitlab.com/consultancy/) from the GitLab experts for installations, upgrades and customizations. * [Consultancy](http://www.gitlab.com/consultancy/) from the GitLab experts for installations, upgrades and customizations.
* [#gitlab IRC channel](http://www.freenode.net/) on Freenode to get in touch with other GitLab users and get help, it's managed by James Newton, Drew Blessing and Sam Gleske * [#gitlab IRC channel](http://www.freenode.net/) on Freenode to get in touch with other GitLab users and get help, it's managed by James Newton (newton), Drew Blessing (dblessing), and Sam Gleske (sag47).
* [Book](http://www.packtpub.com/gitlab-repository-management/book) written by GitLab enthusiast Jonathan M. Hethey is unofficial but it offers a good overview. * [Book](http://www.packtpub.com/gitlab-repository-management/book) written by GitLab enthusiast Jonathan M. Hethey is unofficial but it offers a good overview.
* [Gitter chat room](https://gitter.im/gitlabhq/gitlabhq#) here you can ask questions when you need help.
### Getting in touch ### Getting in touch
......
6.5.0.pre 6.7.0.pre
app/assets/images/bg-header.png

212 Bytes | W: | H:

app/assets/images/bg-header.png

210 Bytes | W: | H:

app/assets/images/bg-header.png
app/assets/images/bg-header.png
app/assets/images/bg-header.png
app/assets/images/bg-header.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/file_txt.png

290 Bytes | W: | H:

app/assets/images/file_txt.png

463 Bytes | W: | H:

app/assets/images/file_txt.png
app/assets/images/file_txt.png
app/assets/images/file_txt.png
app/assets/images/file_txt.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/icon-search.png

422 Bytes | W: | H:

app/assets/images/icon-search.png

331 Bytes | W: | H:

app/assets/images/icon-search.png
app/assets/images/icon-search.png
app/assets/images/icon-search.png
app/assets/images/icon-search.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/images.png

8.49 KB | W: | H:

app/assets/images/images.png

6.49 KB | W: | H:

app/assets/images/images.png
app/assets/images/images.png
app/assets/images/images.png
app/assets/images/images.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/logo-black.png

2.95 KB | W: | H:

app/assets/images/logo-black.png

2.73 KB | W: | H:

app/assets/images/logo-black.png
app/assets/images/logo-black.png
app/assets/images/logo-black.png
app/assets/images/logo-black.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/logo-white.png

8.14 KB | W: | H:

app/assets/images/logo-white.png

7.33 KB | W: | H:

app/assets/images/logo-white.png
app/assets/images/logo-white.png
app/assets/images/logo-white.png
app/assets/images/logo-white.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/no_avatar.png

1.31 KB | W: | H:

app/assets/images/no_avatar.png

704 Bytes | W: | H:

app/assets/images/no_avatar.png
app/assets/images/no_avatar.png
app/assets/images/no_avatar.png
app/assets/images/no_avatar.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/onion_skin_sprites.gif

1.55 KB | W: | H:

app/assets/images/onion_skin_sprites.gif

548 Bytes | W: | H:

app/assets/images/onion_skin_sprites.gif
app/assets/images/onion_skin_sprites.gif
app/assets/images/onion_skin_sprites.gif
app/assets/images/onion_skin_sprites.gif
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/swipemode_sprites.gif

1.5 KB | W: | H:

app/assets/images/swipemode_sprites.gif

505 Bytes | W: | H:

app/assets/images/swipemode_sprites.gif
app/assets/images/swipemode_sprites.gif
app/assets/images/swipemode_sprites.gif
app/assets/images/swipemode_sprites.gif
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/switch_icon.png

1.17 KB | W: | H:

app/assets/images/switch_icon.png

1.17 KB | W: | H:

app/assets/images/switch_icon.png
app/assets/images/switch_icon.png
app/assets/images/switch_icon.png
app/assets/images/switch_icon.png
  • 2-up
  • Swipe
  • Onion skin
app/assets/images/trans_bg.gif

58 Bytes | W: | H:

app/assets/images/trans_bg.gif

50 Bytes | W: | H:

app/assets/images/trans_bg.gif
app/assets/images/trans_bg.gif
app/assets/images/trans_bg.gif
app/assets/images/trans_bg.gif
  • 2-up
  • Swipe
  • Onion skin
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
user_path: "/api/:version/users/:id.json" user_path: "/api/:version/users/:id.json"
notes_path: "/api/:version/projects/:id/notes.json" notes_path: "/api/:version/projects/:id/notes.json"
namespaces_path: "/api/:version/namespaces.json" namespaces_path: "/api/:version/namespaces.json"
project_users_path: "/api/:version/projects/:id/users.json"
# Get 20 (depends on api) recent notes # Get 20 (depends on api) recent notes
# and sort the ascending from oldest to newest # and sort the ascending from oldest to newest
...@@ -50,6 +51,23 @@ ...@@ -50,6 +51,23 @@
).done (users) -> ).done (users) ->
callback(users) callback(users)
# Return project users list. Filtered by query
# Only active users retrieved
projectUsers: (project_id, query, callback) ->
url = Api.buildUrl(Api.project_users_path)
url = url.replace(':id', project_id)
$.ajax(
url: url
data:
private_token: gon.api_token
search: query
per_page: 20
active: true
dataType: "json"
).done (users) ->
callback(users)
# Return namespaces list. Filtered by query # Return namespaces list. Filtered by query
namespaces: (query, callback) -> namespaces: (query, callback) ->
url = Api.buildUrl(Api.namespaces_path) url = Api.buildUrl(Api.namespaces_path)
......
...@@ -24,7 +24,8 @@ ...@@ -24,7 +24,8 @@
//= require g.raphael-min //= require g.raphael-min
//= require g.bar-min //= require g.bar-min
//= require branch-graph //= require branch-graph
//= require ace-src-noconflict/ace //= require highlightjs.min
//= require ace/ace
//= require_tree . //= require_tree .
//= require d3 //= require d3
//= require underscore //= require underscore
...@@ -17,7 +17,7 @@ class BlobView ...@@ -17,7 +17,7 @@ class BlobView
setHash(hash) setHash(hash)
e.preventDefault() e.preventDefault()
# See if there are lines selected # See if there are lines selected
# "#L12" and "#L34-56" supported # "#L12" and "#L34-56" supported
highlightBlobLines = (e) -> highlightBlobLines = (e) ->
...@@ -64,7 +64,7 @@ class BlobView ...@@ -64,7 +64,7 @@ class BlobView
nodes.attr("id", hash) nodes.attr("id", hash)
# initialize multi-line select # initialize multi-line select
$("#tree-content-holder .line_numbers a[id^=L]").on("click", handleMultiSelect) $("#tree-content-holder .line-numbers a[id^=L]").on("click", handleMultiSelect)
# Highlight the correct lines on load # Highlight the correct lines on load
highlightBlobLines() highlightBlobLines()
......
class Commit class Commit
constructor: -> constructor: ->
$('.files .file').each -> $('.files .diff-file').each ->
new CommitFile(this) new CommitFile(this)
@Commit = Commit @Commit = Commit
...@@ -4,6 +4,7 @@ $ -> ...@@ -4,6 +4,7 @@ $ ->
class Dispatcher class Dispatcher
constructor: () -> constructor: () ->
@initSearch() @initSearch()
@initHighlight()
@initPageScripts() @initPageScripts()
initPageScripts: -> initPageScripts: ->
...@@ -18,6 +19,8 @@ class Dispatcher ...@@ -18,6 +19,8 @@ class Dispatcher
switch page switch page
when 'projects:issues:index' when 'projects:issues:index'
Issues.init() Issues.init()
when 'projects:issues:show'
new Issue()
when 'projects:issues:new', 'projects:merge_requests:new' when 'projects:issues:new', 'projects:merge_requests:new'
GitLab.GfmAutoComplete.setup() GitLab.GfmAutoComplete.setup()
when 'dashboard:show' when 'dashboard:show'
...@@ -47,5 +50,16 @@ class Dispatcher ...@@ -47,5 +50,16 @@ class Dispatcher
initSearch: -> initSearch: ->
autocomplete_json = $('.search-autocomplete-json').data('autocomplete-opts') opts = $('.search-autocomplete-opts')
new SearchAutocomplete(autocomplete_json) path = opts.data('autocomplete-path')
project_id = opts.data('autocomplete-project-id')
project_ref = opts.data('autocomplete-project-ref')
new SearchAutocomplete(path, project_id, project_ref)
initHighlight: ->
$('.highlight pre code').each (i, e) ->
hljs.highlightBlock(e)
$(e).html($.map($(e).html().split("\n"), (line, i) ->
"<div class='line' id='LC" + (i + 1) + "'>" + line + "</div>"
).join("\n"))
...@@ -4,3 +4,14 @@ class GroupMembers ...@@ -4,3 +4,14 @@ class GroupMembers
$(this).fadeOut() $(this).fadeOut()
@GroupMembers = GroupMembers @GroupMembers = GroupMembers
$ ->
# avatar
$('.js-choose-group-avatar-button').bind "click", ->
form = $(this).closest("form")
form.find(".js-group-avatar-input").click()
$('.js-group-avatar-input').bind "change", ->
form = $(this).closest("form")
filename = $(this).val().replace(/^.*[\\\/]/, '')
form.find(".js-avatar-filename").text(filename)
\ No newline at end of file
class Issue
constructor: ->
$('.edit-issue.inline-update input[type="submit"]').hide()
$(".issue-box .inline-update").on "change", "select", ->
$(this).submit()
$(".issue-box .inline-update").on "change", "#issue_assignee_id", ->
$(this).submit()
@Issue = Issue
...@@ -29,10 +29,10 @@ ...@@ -29,10 +29,10 @@
$('#filter_issue_search').val($('#issue_search').val()) $('#filter_issue_search').val($('#issue_search').val())
initSelects: -> initSelects: ->
$("select#update_status").select2() $("select#update_status").select2(width: 'resolve', dropdownAutoWidth: true)
$("select#update_assignee_id").select2() $("select#update_assignee_id").select2(width: 'resolve', dropdownAutoWidth: true)
$("select#update_milestone_id").select2() $("select#update_milestone_id").select2(width: 'resolve', dropdownAutoWidth: true)
$("select#label_name").select2() $("select#label_name").select2(width: 'resolve', dropdownAutoWidth: true)
$("#milestone_id, #assignee_id, #label_name").on "change", -> $("#milestone_id, #assignee_id, #label_name").on "change", ->
$(this).closest("form").submit() $(this).closest("form").submit()
...@@ -77,9 +77,3 @@ ...@@ -77,9 +77,3 @@
$("#update_issues_ids").val [] $("#update_issues_ids").val []
$(".issues_bulk_update").hide() $(".issues_bulk_update").hide()
$(".issues-filters").show() $(".issues-filters").show()
$ ->
$('.edit-issue.inline-update input[type="submit"]').hide();
$("body").on "change", ".edit-issue.inline-update select", ->
$(this).submit()
...@@ -117,11 +117,11 @@ $ -> ...@@ -117,11 +117,11 @@ $ ->
# Commit show suppressed diff # Commit show suppressed diff
$(".content").on "click", ".supp_diff_link", -> $(".diff-content").on "click", ".supp_diff_link", ->
$(@).next('table').show() $(@).next('table').show()
$(@).remove() $(@).remove()
$(".content").on "click", ".js-details-expand", -> $(".diff-content").on "click", ".js-details-expand", ->
$(@).next('.js-details-contain').removeClass("hide") $(@).next('.js-details-contain').removeClass("hide")
$(@).remove() $(@).remove()
......
class MergeRequest
constructor: (@opts) ->
@initContextWidget()
this.$el = $('.merge-request')
@diffs_loaded = if @opts.action == 'diffs' then true else false
@commits_loaded = false
this.activateTab(@opts.action)
this.bindEvents()
this.initMergeWidget()
this.$('.show-all-commits').on 'click', =>
this.showAllCommits()
modal = $('#modal_merge_info').modal(show: false)
disableButtonIfEmptyField '#merge_commit_message', '.accept_merge_request'
# Local jQuery finder
$: (selector) ->
this.$el.find(selector)
initContextWidget: ->
$('.edit-merge_request.inline-update input[type="submit"]').hide()
$(".issue-box .inline-update").on "change", "select", ->
$(this).submit()
$(".issue-box .inline-update").on "change", "#merge_request_assignee_id", ->
$(this).submit()
initMergeWidget: ->
this.showState( @opts.current_status )
if this.$('.automerge_widget').length and @opts.check_enable
$.get @opts.url_to_automerge_check, (data) =>
this.showState( data.merge_status )
, 'json'
if @opts.ci_enable
$.get @opts.url_to_ci_check, (data) =>
this.showCiState data.status
, 'json'
bindEvents: ->
this.$('.nav-tabs').on 'click', 'a', (event) =>
a = $(event.currentTarget)
href = a.attr('href')
History.replaceState {path: href}, document.title, href
event.preventDefault()
this.$('.nav-tabs').on 'click', 'li', (event) =>
this.activateTab($(event.currentTarget).data('action'))
this.$('.accept_merge_request').on 'click', ->
$('.automerge_widget.can_be_merged').hide()
$('.merge-in-progress').show()
activateTab: (action) ->
this.$('.nav-tabs li').removeClass 'active'
this.$('.tab-content').hide()
switch action
when 'diffs'
this.$('.nav-tabs .diffs-tab').addClass 'active'
this.loadDiff() unless @diffs_loaded
this.$('.diffs').show()
else
this.$('.nav-tabs .notes-tab').addClass 'active'
this.$('.notes').show()
showState: (state) ->
$('.automerge_widget').hide()
$('.automerge_widget.' + state).show()
showCiState: (state) ->
$('.ci_widget').hide()
$('.ci_widget.ci-' + state).show()
loadDiff: (event) ->
$.ajax
type: 'GET'
url: this.$('.nav-tabs .diffs-tab a').attr('href')
beforeSend: =>
this.$('.status').addClass 'loading'
complete: =>
@diffs_loaded = true
this.$('.status').removeClass 'loading'
success: (data) =>
this.$(".diffs").html(data.html)
dataType: 'json'
showAllCommits: ->
this.$('.first-commits').remove()
this.$('.all-commits').removeClass 'hide'
alreadyOrCannotBeMerged: ->
this.$('.automerge_widget').hide()
this.$('.merge-in-progress').hide()
this.$('.automerge_widget.already_cannot_be_merged').show()
this.MergeRequest = MergeRequest
...@@ -6,97 +6,3 @@ ...@@ -6,97 +6,3 @@
$('#milestone_id').select2() $('#milestone_id').select2()
$('#milestone_id, #assignee_id').on 'change', -> $('#milestone_id, #assignee_id').on 'change', ->
$(this).closest('form').submit() $(this).closest('form').submit()
class MergeRequest
constructor: (@opts) ->
this.$el = $('.merge-request')
@diffs_loaded = if @opts.action == 'diffs' then true else false
@commits_loaded = false
this.activateTab(@opts.action)
this.bindEvents()
this.initMergeWidget()
this.$('.show-all-commits').on 'click', =>
this.showAllCommits()
modal = $('#modal_merge_info').modal(show: false)
# Local jQuery finder
$: (selector) ->
this.$el.find(selector)
initMergeWidget: ->
this.showState( @opts.current_status )
if this.$('.automerge_widget').length and @opts.check_enable
$.get @opts.url_to_automerge_check, (data) =>
this.showState( data.merge_status )
, 'json'
if @opts.ci_enable
$.get @opts.url_to_ci_check, (data) =>
this.showCiState data.status
, 'json'
bindEvents: ->
this.$('.nav-tabs').on 'click', 'a', (event) =>
a = $(event.currentTarget)
href = a.attr('href')
History.replaceState {path: href}, document.title, href
event.preventDefault()
this.$('.nav-tabs').on 'click', 'li', (event) =>
this.activateTab($(event.currentTarget).data('action'))
this.$('.accept_merge_request').on 'click', ->
$('.automerge_widget.can_be_merged').hide()
$('.merge-in-progress').show()
activateTab: (action) ->
this.$('.nav-tabs li').removeClass 'active'
this.$('.tab-content').hide()
switch action
when 'diffs'
this.$('.nav-tabs .diffs-tab').addClass 'active'
this.loadDiff() unless @diffs_loaded
this.$('.diffs').show()
else
this.$('.nav-tabs .notes-tab').addClass 'active'
this.$('.notes').show()
showState: (state) ->
$('.automerge_widget').hide()
$('.automerge_widget.' + state).show()
showCiState: (state) ->
$('.ci_widget').hide()
$('.ci_widget.ci-' + state).show()
loadDiff: (event) ->
$.ajax
type: 'GET'
url: this.$('.nav-tabs .diffs-tab a').attr('href')
beforeSend: =>
this.$('.status').addClass 'loading'
complete: =>
@diffs_loaded = true
this.$('.status').removeClass 'loading'
success: (data) =>
this.$(".diffs").html(data.html)
dataType: 'json'
showAllCommits: ->
this.$('.first-commits').remove()
this.$('.all-commits').removeClass 'hide'
alreadyOrCannotBeMerged: ->
this.$('.automerge_widget').hide()
this.$('.merge-in-progress').hide()
this.$('.automerge_widget.already_cannot_be_merged').show()
this.MergeRequest = MergeRequest
...@@ -94,6 +94,9 @@ class Notes ...@@ -94,6 +94,9 @@ class Notes
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)
code = "#note_" + note.id + " .highlight pre code"
$(code).each (i, e) ->
hljs.highlightBlock(e)
### ###
...@@ -253,6 +256,9 @@ class Notes ...@@ -253,6 +256,9 @@ class Notes
updateNote: (xhr, note, status) => updateNote: (xhr, note, status) =>
note_li = $("#note_" + note.id) note_li = $("#note_" + note.id)
note_li.replaceWith(note.html) note_li.replaceWith(note.html)
code = "#note_" + note.id + " .highlight pre code"
$(code).each (i, e) ->
hljs.highlightBlock(e)
### ###
Called in response to clicking the edit note link Called in response to clicking the edit note link
......
...@@ -26,3 +26,5 @@ $ -> ...@@ -26,3 +26,5 @@ $ ->
form = $(this).closest("form") form = $(this).closest("form")
filename = $(this).val().replace(/^.*[\\\/]/, '') filename = $(this).val().replace(/^.*[\\\/]/, '')
form.find(".js-avatar-filename").text(filename) form.find(".js-avatar-filename").text(filename)
$('.profile-groups-avatars').tooltip("placement": "top")
\ No newline at end of file
@projectUsersSelect =
init: ->
$('.ajax-project-users-select').each (i, select) ->
project_id = $('body').data('project-id')
$(select).select2
placeholder: $(select).data('placeholder') || "Search for a user"
multiple: $(select).hasClass('multiselect')
minimumInputLength: 0
query: (query) ->
Api.projectUsers project_id, query.term, (users) ->
data = { results: users }
nullUser = {
name: 'Unassigned',
avatar: null,
username: 'none',
id: ''
}
data.results.unshift(nullUser)
query.callback(data)
initSelection: (element, callback) ->
id = $(element).val()
if id isnt ""
Api.user(id, callback)
formatResult: projectUsersSelect.projectUserFormatResult
formatSelection: projectUsersSelect.projectUserFormatSelection
dropdownCssClass: "ajax-project-users-dropdown"
dropdownAutoWidth: true
escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
m
projectUserFormatResult: (user) ->
if user.avatar_url
avatar = user.avatar_url
else if gon.gravatar_enabled
avatar = gon.gravatar_url
avatar = avatar.replace('%{hash}', md5(user.email))
avatar = avatar.replace('%{size}', '24')
else
avatar = gon.relative_url_root + "/assets/no_avatar.png"
if user.id == ''
avatarMarkup = ''
else
avatarMarkup = "<div class='user-image'><img class='avatar s24' src='#{avatar}'></div>"
"<div class='user-result'>
#{avatarMarkup}
<div class='user-name'>#{user.name}</div>
<div class='user-username'>#{user.username}</div>
</div>"
projectUserFormatSelection: (user) ->
user.name
$ ->
projectUsersSelect.init()
class SearchAutocomplete class SearchAutocomplete
constructor: (json) -> constructor: (search_autocomplete_path, project_id, project_ref) ->
project_id = '' unless project_id
project_ref = '' unless project_ref
query = "?project_id=" + project_id + "&project_ref=" + project_ref
$("#search").autocomplete $("#search").autocomplete
source: json source: search_autocomplete_path + query
minLength: 1
select: (event, ui) -> select: (event, ui) ->
location.href = ui.item.url location.href = ui.item.url
......
$ -> $ ->
userFormatResult = (user) -> userFormatResult = (user) ->
if user.avatar if user.avatar_url
avatar = user.avatar.url avatar = user.avatar_url
else else if gon.gravatar_enabled
avatar = gon.gravatar_url avatar = gon.gravatar_url
avatar = avatar.replace('%{hash}', md5(user.email)) avatar = avatar.replace('%{hash}', md5(user.email))
avatar = avatar.replace('%{size}', '24') avatar = avatar.replace('%{size}', '24')
else
avatar = gon.relative_url_root + "/assets/no_avatar.png"
"<div class='user-result'> "<div class='user-result'>
<div class='user-image'><img class='avatar s24' src='#{avatar}'></div> <div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*= require jquery.ui.gitlab *= require jquery.ui.gitlab
*= require jquery.atwho *= require jquery.atwho
*= require select2 *= require select2
*= require highlightjs.min
*= require_self *= require_self
*/ */
...@@ -36,8 +37,10 @@ ...@@ -36,8 +37,10 @@
@import "generic/issue_box.scss"; @import "generic/issue_box.scss";
@import "generic/files.scss"; @import "generic/files.scss";
@import "generic/lists.scss"; @import "generic/lists.scss";
@import "generic/flash.scss";
@import "generic/forms.scss"; @import "generic/forms.scss";
@import "generic/selects.scss"; @import "generic/selects.scss";
@import "generic/highlight.scss";
/** /**
* Page specific styles (issues, projects etc): * Page specific styles (issues, projects etc):
...@@ -45,6 +48,7 @@ ...@@ -45,6 +48,7 @@
@import "sections/header.scss"; @import "sections/header.scss";
@import "sections/nav.scss"; @import "sections/nav.scss";
@import "sections/commits.scss"; @import "sections/commits.scss";
@import "sections/diff.scss";
@import "sections/issues.scss"; @import "sections/issues.scss";
@import "sections/projects.scss"; @import "sections/projects.scss";
@import "sections/snippets.scss"; @import "sections/snippets.scss";
...@@ -63,9 +67,10 @@ ...@@ -63,9 +67,10 @@
@import "sections/wall.scss"; @import "sections/wall.scss";
@import "sections/dashboard.scss"; @import "sections/dashboard.scss";
@import "sections/stat_graph.scss"; @import "sections/stat_graph.scss";
@import "sections/groups.scss";
/** /**
* Code ighlight * Code highlight
*/ */
@import "highlight/white.scss"; @import "highlight/white.scss";
@import "highlight/dark.scss"; @import "highlight/dark.scss";
......
...@@ -2,3 +2,18 @@ ...@@ -2,3 +2,18 @@
background: #f9f9f9; background: #f9f9f9;
padding: 15px; padding: 15px;
} }
.centered-light-block {
text-align: center;
color: #888;
margin: 20px;
}
.nothing-here-block {
text-align: center;
padding: 20px;
color: #666;
font-weight: normal;
font-size: 16px;
line-height: 36px;
}
...@@ -118,7 +118,6 @@ ...@@ -118,7 +118,6 @@
@extend .btn-primary; @extend .btn-primary;
} }
&.btn-close,
&.btn-remove { &.btn-remove {
@extend .btn-danger; @extend .btn-danger;
} }
...@@ -143,6 +142,30 @@ ...@@ -143,6 +142,30 @@
line-height: 16px; line-height: 16px;
margin: 2px; margin: 2px;
} }
&.btn-close {
color: #B94A48;
font-weight: bold;
&:hover {
color: #B94A48;
}
}
&.btn-reopen {
color: #468847;
font-weight: bold;
&:hover {
color: #468847;
}
}
&.btn-grouped {
margin-right: 7px;
float: left;
&:last-child {
margin-right: 0px;
}
}
} }
.btn-block { .btn-block {
...@@ -154,9 +177,8 @@ ...@@ -154,9 +177,8 @@
} }
} }
.btn,
.btn-group { .btn-group {
&.grouped { &.btn-grouped {
margin-right: 7px; margin-right: 7px;
float: left; float: left;
&:last-child { &:last-child {
......
...@@ -11,8 +11,6 @@ ...@@ -11,8 +11,6 @@
.bgred { background: #F2DEDE!important } .bgred { background: #F2DEDE!important }
/** COMMON CLASSES **/ /** COMMON CLASSES **/
.left { float:left }
.prepend-top-10 { margin-top:10px } .prepend-top-10 { margin-top:10px }
.prepend-top-20 { margin-top:20px } .prepend-top-20 { margin-top:20px }
.prepend-left-10 { margin-left:10px } .prepend-left-10 { margin-left:10px }
...@@ -24,32 +22,9 @@ ...@@ -24,32 +22,9 @@
.append-bottom-20 { margin-bottom:20px } .append-bottom-20 { margin-bottom:20px }
.inline { display: inline-block } .inline { display: inline-block }
.padded { padding:20px } .underlined-link { text-decoration: underline; }
.ipadded { padding:20px!important }
.lborder { border-left:1px solid #eee }
.underlined_link { text-decoration: underline; }
.hint { font-style: italic; color: #999; } .hint { font-style: italic; color: #999; }
.light { color: #888 } .light { color: #888 }
.tiny { font-weight: normal }
.vtop { vertical-align: top !important; }
/** ALERT MESSAGES **/
.alert.alert-disabled {
background: #EEE;
color: #777;
border-color: #DDD;
}
/** HELPERS **/
.nothing_here_message {
text-align: center;
padding: 20px;
color: #666;
font-weight: normal;
font-size: 16px;
line-height: 36px;
}
.slead { .slead {
color: #666; color: #666;
...@@ -59,49 +34,23 @@ ...@@ -59,49 +34,23 @@
line-height: 24px; line-height: 24px;
} }
.tab-content { .tab-content {
overflow: visible; overflow: visible;
} }
@media (max-width: 1200px) { pre {
.only-wide { &.clean {
display: none; background: none;
} border: none;
} margin: 0;
padding: 0;
pre.well-pre {
border: 1px solid #EEE;
background: #f9f9f9;
border-radius: 0;
color: #555;
}
.input-append .btn.active, .input-prepend .btn.active {
background: #CCC;
border-color: #BBB;
text-shadow: 0 1px 1px #fff;
font-weight: bold;
@include box-shadow(inset 0 2px 4px rgba(0,0,0,.15));
}
/** Big Labels **/
.state-label {
font-size: 14px;
padding: 6px 25px;
text-align: center;
@include border-radius(4px);
text-shadow: none;
margin-left: 10px;
&.state-label-green {
background: #4A4;
color: #FFF;
} }
&.state-label-red { &.well-pre {
background: #DA4E49; border: 1px solid #EEE;
color: #FFF; background: #f9f9f9;
border-radius: 0;
color: #555;
} }
} }
...@@ -112,6 +61,7 @@ pre.well-pre { ...@@ -112,6 +61,7 @@ pre.well-pre {
.dropdown-menu > li > a:hover, .dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus { .dropdown-menu > li > a:focus {
background: #29b; background: #29b;
color: #FFF
} }
.breadcrumb > li + li:before { .breadcrumb > li + li:before {
...@@ -130,31 +80,6 @@ pre.well-pre { ...@@ -130,31 +80,6 @@ pre.well-pre {
} }
/** FLASH message **/ /** FLASH message **/
.flash-container {
display: none;
cursor: pointer;
margin: 0;
text-align: center;
color: #fff;
font-size: 14px;
position: fixed;
bottom: 0;
width: 100%;
opacity: 0.8;
z-index: 100;
.flash-notice {
background: #49C;
padding: 10px;
text-shadow: 0 1px 1px #178;
}
.flash-alert {
background: #C67;
text-shadow: 0 1px 1px #945;
padding: 10px;
}
}
.author_link { .author_link {
color: $link_color; color: $link_color;
} }
...@@ -173,12 +98,10 @@ table a code { ...@@ -173,12 +98,10 @@ table a code {
.loading { .loading {
margin: 20px auto; margin: 20px auto;
background: url(ajax_loader.gif) no-repeat center center;
width: 40px;
height: 40px; height: 40px;
&.loading-gray { color: #555;
background: url(ajax_loader_gray.gif) no-repeat center center; font-size: 32px;
} text-align: center;
} }
span.update-author { span.update-author {
...@@ -276,22 +199,6 @@ li.note { ...@@ -276,22 +199,6 @@ li.note {
cursor: pointer; cursor: pointer;
} }
.merge-request,
.issue {
&.today{
background: #EFE;
border-color: #CEC;
}
&.closed {
background: #F5f5f5;
border-color: #E5E5E5;
}
&.merged {
background: #F5f5f5;
border-color: #E5E5E5;
}
}
.git_error_tips { .git_error_tips {
@extend .col-md-6; @extend .col-md-6;
text-align: left; text-align: left;
...@@ -327,6 +234,12 @@ li.note { ...@@ -327,6 +234,12 @@ li.note {
color: #fff; color: #fff;
text-decoration: underline; text-decoration: underline;
} }
.links-xs {
text-align: center;
font-size: 16px;
padding: 5px;
}
} }
.warning_message { .warning_message {
...@@ -349,15 +262,6 @@ li.note { ...@@ -349,15 +262,6 @@ li.note {
} }
} }
pre {
&.clean {
background: none;
border: none;
margin: 0;
padding: 0;
}
}
.milestone { .milestone {
&.milestone-closed { &.milestone-closed {
background: #eee; background: #eee;
...@@ -441,40 +345,6 @@ table { ...@@ -441,40 +345,6 @@ table {
margin-bottom: 20px; margin-bottom: 20px;
} }
.ajax-users-select {
width: 400px;
&.input-large {
width: 210px;
}
&.input-clamp {
max-width: 100%;
}
}
.user-result {
.user-image {
float: left;
}
.user-name {
}
.user-username {
color: #999;
}
}
.namespace-result {
.namespace-kind {
color: #AAA;
font-weight: normal;
}
.namespace-path {
margin-left: 10px;
font-weight: bolder;
}
}
.btn-sign-in { .btn-sign-in {
margin-top: 7px; margin-top: 7px;
text-shadow: none; text-shadow: none;
...@@ -485,3 +355,7 @@ table { ...@@ -485,3 +355,7 @@ table {
margin-bottom: 15px; margin-bottom: 15px;
} }
} }
@media (max-width: $screen-xs-max) {
.container .content { margin-top: 20px; }
}
...@@ -45,14 +45,14 @@ ...@@ -45,14 +45,14 @@
text-align: center; text-align: center;
img { img {
padding: 100px; padding: 100px;
max-width: 300px; max-width: 50%;
} }
} }
&.wiki { &.wiki {
padding: 20px;
font-size: 14px; font-size: 14px;
line-height: 1.6; line-height: 1.6;
padding: 25px;
.highlight { .highlight {
margin-bottom: 9px; margin-bottom: 9px;
...@@ -143,75 +143,6 @@ ...@@ -143,75 +143,6 @@
*/ */
&.code { &.code {
padding: 0; padding: 0;
table.lines {
border: none;
box-shadow: none;
margin: 0px;
padding: 0px;
table-layout: fixed;
pre {
border: none;
border-radius: 0;
font-family: $monospace_font;
font-size: 12px !important;
line-height: 16px !important;
margin: 0;
padding: 10px 0;
}
td {
border: none;
margin: 0;
padding: 0;
vertical-align: top;
&:first-child {
background: #eee;
width: 50px;
}
&:last-child {
}
}
tr:hover {
background: none;
}
pre.line_numbers {
color: #666;
padding: 10px 6px 10px 0;
text-align: right;
background: #EEE;
a {
color: #666;
i {
display: none;
font-size: 14px;
line-height: 14px;
}
&:hover i {
display: inherit;
}
}
}
.highlight {
border-left: 1px solid #DEE2E3;
overflow: auto;
overflow-y: hidden;
pre {
white-space: pre;
word-wrap: normal;
.line {
padding: 0 10px;
}
}
}
}
} }
} }
} }
......
.flash-container {
display: none;
cursor: pointer;
margin: 0;
text-align: center;
color: #fff;
font-size: 14px;
position: fixed;
bottom: 0;
width: 100%;
opacity: 0.8;
z-index: 100;
.flash-notice {
background: #49C;
padding: 10px;
text-shadow: 0 1px 1px #178;
}
.flash-alert {
background: #C67;
text-shadow: 0 1px 1px #945;
padding: 10px;
}
}
...@@ -51,3 +51,27 @@ label { ...@@ -51,3 +51,27 @@ label {
.input-mn-300 { .input-mn-300 {
min-width: 300px; min-width: 300px;
} }
.custom-form-control {
width: 150px;
}
@media (min-width: $screen-sm-min) {
.custom-form-control {
width: 150px;
}
}
/* Medium devices (desktops, 992px and up) */
@media (min-width: $screen-md-min) {
.custom-form-control {
width: 170px;
}
}
/* Large devices (large desktops, 1200px and up) */
@media (min-width: $screen-lg-min) {
.custom-form-control {
width: 200px;
}
}
.highlighted-data {
border: none;
box-shadow: none;
margin: 0px;
padding: 0px;
table-layout: fixed;
pre {
padding: 10px;
border: none;
border-radius: 0;
font-family: $monospace_font;
font-size: 12px !important;
line-height: 16px !important;
margin: 0;
code {
white-space: pre;
word-wrap: normal;
padding: 0;
.line {
display: inline;
}
}
}
.hljs {
padding: 0;
}
.line-numbers {
padding: 10px;
text-align: right;
float: left;
a {
font-family: $monospace_font;
display: block;
font-size: 12px !important;
line-height: 16px !important;
white-space: nowrap;
i {
visibility: hidden;
@extend .pull-left;
}
&:hover i {
visibility: visible;
}
}
}
.highlight {
overflow: auto;
overflow-y: hidden;
pre {
white-space: pre;
word-wrap: normal;
}
}
}
...@@ -10,37 +10,103 @@ ...@@ -10,37 +10,103 @@
.issue-box { .issue-box {
color: #666; color: #666;
margin:20px 0; margin:20px 0;
background: #FAFAFA; background: #FFF;
border: 1px solid #DDD; border: 1px solid #EEE;
&.issue-box-closed {
border-color: #DA4E49;
.state {
background-color: #f2dede;
border-color: #ebccd1;
color: #a94442;
.state-label {
background: #DA4E49;
color: #FFF;
}
}
}
&.issue-box-merged {
border-color: #31708f;
.state {
background-color: #d9edf7;
border-color: #bce8f1;
color: #31708f;
.state-label {
background: #31708f;
color: #FFF;
}
}
}
&.issue-box-open {
border-color: #4A4;
.state {
background-color: #dff0d8;
border-color: #d6e9c6;
color: #3c763d;
.state-label {
background: #4A4;
color: #FFF;
}
}
}
&.issue-box-expired {
border-color: #cea61b;
.state {
background-color: #fcf8e3;
border-color: #faebcc;
color: #8a6d3b;
.state-label {
background: #cea61b;
color: #FFF;
}
}
}
.control-group { .control-group {
margin-bottom: 0; margin-bottom: 0;
} }
.state {
height: 34px;
border-bottom: 1px solid #DDD;
line-height: 32px;
}
.title { .title {
font-size: 20px; font-size: 22px;
font-weight: 500; font-weight: 500;
line-height: 28px; line-height: 1.5;
margin: 0; margin: 0;
color: #444; color: #333;
padding-bottom: 0;
padding: 15px 25px;
} }
.context { .context {
border: none;
background-color: #f5f5f5;
border: none; border: none;
border-top: 1px solid #eee; border-top: 1px solid #eee;
padding: 15px 25px;
} }
.description { .description {
border-top: 1px solid #eee; padding: 0 25px 15px 25px;
} }
.title, .context, .description { .title, .context, .description {
padding: 15px;
.clearfix { .clearfix {
margin: 0; margin: 0;
} }
} }
.state-label {
font-size: 14px;
padding: 1px 25px;
text-align: center;
text-shadow: none;
margin-right: 20px;
display: inline-block;
}
} }
...@@ -23,6 +23,12 @@ ...@@ -23,6 +23,12 @@
} }
} }
&.warning-row {
background-color: #fcf8e3;
border-color: #faebcc;
color: #8a6d3b;
}
&.smoke { background-color: #f5f5f5; } &.smoke { background-color: #f5f5f5; }
&:hover { &:hover {
......
/** Select2 selectbox style override **/ /** Select2 selectbox style override **/
.select2-container, .select2-container.select2-drop-above {
.select2-container {
.select2-choice { .select2-choice {
background: #FFF; background: #FFF;
border-color: #BBB; border-color: #BBB;
...@@ -12,8 +11,24 @@ ...@@ -12,8 +11,24 @@
} }
.select2-drop-active { .select2-drop-active {
border: 1px solid #BBB; border: 1px solid #BBB !important;
margin-top: 4px; margin-top: 4px;
&.select2-drop-above {
margin-bottom: 8px;
}
.select2-search input {
background: #fafafa;
border-color: #DDD;
}
.select2-results {
max-height: 350px;
.select2-highlighted {
background: $bg_style_color;
}
}
} }
select { select {
...@@ -66,3 +81,43 @@ select { ...@@ -66,3 +81,43 @@ select {
.project-refs-form .select2-container { .project-refs-form .select2-container {
margin-right: 10px; margin-right: 10px;
} }
.ajax-users-dropdown, .ajax-project-users-dropdown {
.select2-search {
padding-top: 4px;
}
}
.ajax-users-select {
width: 400px;
&.input-large {
width: 210px;
}
&.input-clamp {
max-width: 100%;
}
}
.user-result {
.user-image {
float: left;
}
.user-name {
}
.user-username {
color: #999;
}
}
.namespace-result {
.namespace-kind {
color: #AAA;
font-weight: normal;
}
.namespace-path {
margin-left: 10px;
font-weight: bolder;
}
}
...@@ -90,9 +90,27 @@ a:focus { ...@@ -90,9 +90,27 @@ a:focus {
font-size: 14px; font-size: 14px;
line-height: 1.6; line-height: 1.6;
.white .highlight pre {
background: #f5f5f5; /* Link to current header. */
h1, h2, h3, h4, h5, h6 {
position: relative;
&:hover > :last-child {
$size: 16px;
position: absolute;
right: 100%;
top: 50%;
margin-top: -$size/2;
margin-right: 0px;
padding-right: 20px;
display: inline-block;
width: $size;
height: $size;
background-image: url("icon-link.png");
background-size: contain;
background-repeat: no-repeat;
}
} }
ul { ul {
padding: 0; padding: 0;
margin: 0 0 9px 25px !important; margin: 0 0 9px 25px !important;
......
...@@ -108,6 +108,8 @@ $pagination-active-bg: $bg_style_color; ...@@ -108,6 +108,8 @@ $pagination-active-bg: $bg_style_color;
// Nav tabs // Nav tabs
.nav.nav-tabs { .nav.nav-tabs {
margin-bottom: 15px;
li { li {
> a { > a {
padding: 8px 20px; padding: 8px 20px;
......
.dark .highlight { .dark {
background-color: #232323;
background-color: #333; .line.hll {
background: #558;
}
.highlight{
border-left: 1px solid #444;
}
.no-highlight {
color: #DDD;
}
.line-numbers a {
color: #666;
}
pre { pre {
background-color: #333; background-color: #232323;
color: #eee; }
}
.hljs {
.hll { display: block; background-color: darken($hover, 65%) } display: block;
.c { color: #888888; font-style: italic } /* Comment */ background: #232323;
.err { color: #a61717; background-color: #e3d2d2 } /* Error */ color: #E6E1DC;
.k { color: #CDA869; font-weight: bold } /* Keyword */ }
.kp { color: #CDA869; font-weight: bold } /* Keyword */
.cm { color: #888888 } /* Comment.Multiline */ .hljs-comment,
.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .hljs-template_comment,
.c1 { color: #888888 } /* Comment.Single */ .hljs-javadoc,
.cs { color: #cc0000; font-weight: bold; background-color: transparent } /* Comment.Special */ .hljs-shebang {
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ color: #BC9458;
.ge { font-style: italic } /* Generic.Emph */ font-style: italic;
.gr { color: #aa0000 } /* Generic.Error */ }
.gh { color: #303030 } /* Generic.Heading */
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .hljs-keyword,
.go { color: #888888 } /* Generic.Output */ .ruby .hljs-function .hljs-keyword,
.gp { color: #555555 } /* Generic.Prompt */ .hljs-request,
.gs { font-weight: bold } /* Generic.Strong */ .hljs-status,
.gu { color: #606060 } /* Generic.Subheading */ .nginx .hljs-title,
.gt { color: #aa0000 } /* Generic.Traceback */ .method,
.kc{font-weight: bold;} /* Keyword.Constant */ .hljs-list .hljs-title {
.kd{font-weight: bold;} /* Keyword.Declaration */ color: #C26230;
.kn{font-weight: bold;} /* Keyword.Namespace */ }
.kp{font-weight: bold;} /* Keyword.Pseudo */
.kr{font-weight: bold;} /* Keyword.Reserved */ .hljs-string,
.kt{color: #458;font-weight: bold;} /* Keyword.Type */ .hljs-number,
.m { color: #0000DD; font-weight: bold } /* Literal.Number */ .hljs-regexp,
.p { color: #eee; } .hljs-tag .hljs-value,
.s { color: #0AD; background-color: transparent } /* Literal.String */ .hljs-cdata,
.na{color: #008080;} /* Name.Attribute */ .hljs-filter .hljs-argument,
.nb{color: #0086B3;} /* Name.Builtin */ .hljs-attr_selector,
.nc{color: #ccc;font-weight: bold;} /* Name.Class */ .apache .hljs-cbracket,
.no{color: turquoise;} /* Name.Constant */ .hljs-date,
.ni{color: #800080;} .tex .hljs-command,
.ne{color: #900;font-weight: bold;} /* Name.Exception */ .markdown .hljs-link_label {
.nf{color: #ccc;font-weight: bold;} /* Name.Function */ color: #A5C261;
.nn{color: #79C3E0;font-weight: bold;} /* Name.Namespace */ }
.nt{color: #fc5;} /* Name.Tag */
.nv{color: #FA4;} /* Name.Variable */ .hljs-subst {
.py { color: #336699; font-weight: bold } /* Name.Property */ color: #519F50;
.ow { color: #008800 } /* Operator.Word */ }
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #7AC; font-weight: bold } /* Literal.Number.Float */ .hljs-tag,
.mh { color: #7AC; font-weight: bold } /* Literal.Number.Hex */ .hljs-tag .hljs-keyword,
.mi {color: #099;} /* Literal.Number.Integer */ .hljs-tag .hljs-title,
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .hljs-doctype,
.sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */ .hljs-sub .hljs-identifier,
.sc{color: #d14;} /* Literal.String.Char */ .hljs-pi,
.sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */ .input_number {
.s2{color: orange;} /* Literal.String.Double */ color: #E8BF6A;
.se{color: orange;} /* Literal.String.Escape */ }
.sh{color: orange;} /* Literal.String.Heredoc */
.si{color: orange;} /* Literal.String.Interpol */ .hljs-identifier {
.sx{color: orange;} /* Literal.String.Other */ color: #D0D0FF;
.sr{color: orange;} /* Literal.String.Regex */ }
.s1{color: orange;} /* Literal.String.Single */
.ss{color: orange;} /* Literal.String.Symbol */ .hljs-class .hljs-title,
.bp { color: #D58 } /* Name.Builtin.Pseudo */ .haskell .hljs-type,
.vc { color: #336699 } /* Name.Variable.Class */ .smalltalk .hljs-class,
.vg { color: #dd7700 } /* Name.Variable.Global */ .hljs-javadoctag,
.vi { color: cyan } .hljs-yardoctag,
} .hljs-phpdoc {
text-decoration: none;
}
.hljs-constant {
color: #DA4939;
}
.hljs-symbol,
.hljs-built_in,
.ruby .hljs-symbol .hljs-string,
.ruby .hljs-symbol .hljs-identifier,
.markdown .hljs-link_url,
.hljs-attribute {
color: #6D9CBE;
}
.markdown .hljs-link_url {
text-decoration: underline;
}
.hljs-params,
.hljs-variable,
.clojure .hljs-attribute {
color: #D0D0FF;
}
.css .hljs-tag,
.hljs-rules .hljs-property,
.hljs-pseudo,
.tex .hljs-special {
color: #CDA869;
}
.css .hljs-class {
color: #9B703F;
}
.hljs-rules .hljs-keyword {
color: #C5AF75;
}
.hljs-rules .hljs-value {
color: #CF6A4C;
}
.css .hljs-id {
color: #8B98AB;
}
.hljs-annotation,
.apache .hljs-sqbracket,
.nginx .hljs-built_in {
color: #9B859D;
}
.hljs-preprocessor,
.hljs-preprocessor *,
.hljs-pragma {
color: #8996A8 !important;
}
.hljs-hexcolor,
.css .hljs-value .hljs-number {
color: #A5C261;
}
.hljs-title,
.hljs-decorator,
.css .hljs-function {
color: #FFC66D;
}
.diff .hljs-header,
.hljs-chunk {
background-color: #2F33AB;
color: #E6E1DC;
display: inline-block;
width: 100%;
}
.diff .hljs-change {
background-color: #4A410D;
color: #F8F8F8;
display: inline-block;
width: 100%;
}
.hljs-addition {
background-color: #144212;
color: #E6E1DC;
display: inline-block;
width: 100%;
}
.hljs-deletion {
background-color: #600;
color: #E6E1DC;
display: inline-block;
width: 100%;
}
.coffeescript .javascript,
.javascript .xml,
.tex .hljs-formula,
.xml .javascript,
.xml .vbscript,
.xml .css,
.xml .hljs-cdata {
opacity: 0.7;
}
}
$monokai-fg: #f8f8f2; .monokai {
$monokai-comment: #75715e; background-color: #272822;
$monokai-pink: #f92672;
$monokai-blue: #66d9ef;
$monokai-green: #a6e22e;
$monokai-gold: #e6db74;
$monokai-dark: #3b3a32;
$monokai-purple: #ae81ff;
.monokai .highlight { .highlight{
border-left: 1px solid #444;
}
background-color: #272822; .line.hll {
background: #558;
}
.no-highlight {
color: #DDD;
}
.line-numbers a {
color: #666;
}
pre { pre {
background-color: #272822; background-color: #272822;
color: $monokai-fg; color: #f8f8f2;
} }
.hll { background-color: darken($hover, 65%) } .hljs {
.c { color: $monokai-comment } /* Comment */ display: block;
.err { color: $monokai-fg } /* Error */ background: #272822;
.g { color: $monokai-fg } /* Generic */ }
.k { color: $monokai-pink } /* Keyword */
.l { color: $monokai-fg } /* Literal */ .hljs-tag,
.n { color: $monokai-blue } /* Name */ .hljs-tag .hljs-title,
.o { color: $monokai-fg } /* Operator */ .hljs-keyword,
.x { color: $monokai-fg } /* Other */ .hljs-literal,
.p { color: $monokai-fg } /* Punctuation */ .hljs-strong,
.cm { color: $monokai-comment } /* Comment.Multiline */ .hljs-change,
.cp { color: $monokai-comment } /* Comment.Preproc */ .hljs-winutils,
.c1 { color: $monokai-comment } /* Comment.Single */ .hljs-flow,
.cs { color: $monokai-comment } /* Comment.Special */ .lisp .hljs-title,
.gd { color: #8b0807 } /* Generic.Deleted */ .clojure .hljs-built_in,
.ge { color: $monokai-fg; text-decoration: underline } /* Generic.Emph */ .nginx .hljs-title,
.gr { color: $monokai-fg } /* Generic.Error */ .tex .hljs-special {
.gh { color: $monokai-fg; font-weight: bold } /* Generic.Heading */ color: #F92672;
.gi { color: $monokai-fg; font-weight: bold; background-color: #46830c } /* Generic.Inserted */ }
.go { color: $monokai-dark; background-color: #31322c } /* Generic.Output */
.gp { color: $monokai-fg } /* Generic.Prompt */ .hljs {
.gs { color: $monokai-fg } /* Generic.Strong */ color: #DDD;
.gu { color: $monokai-fg; font-weight: bold } /* Generic.Subheading */ }
.gt { color: #f8f8f0; background-color: $monokai-pink } /* Generic.Traceback */
.kc { color: $monokai-purple } /* Keyword.Constant */
.kd { color: $monokai-pink } /* Keyword.Declaration */
.kn { color: $monokai-pink } /* Keyword.Namespace */
.kp { color: $monokai-pink } /* Keyword.Pseudo */
.kr { color: $monokai-pink } /* Keyword.Reserved */
.kt { color: $monokai-fg } /* Keyword.Type */
.ld { color: $monokai-fg } /* Literal.Date */
.m { color: $monokai-purple } /* Literal.Number */
.s { color: $monokai-gold } /* Literal.String */
.na { color: $monokai-purple } /* Name.Attribute */
.nb { color: $monokai-blue } /* Name.Builtin */
.nc { color: $monokai-fg } /* Name.Class */
.no { color: $monokai-fg } /* Name.Constant */
.nd { color: $monokai-fg } /* Name.Decorator */
.ni { color: $monokai-fg } /* Name.Entity */
.ne { color: $monokai-fg } /* Name.Exception */
.nf { color: $monokai-green } /* Name.Function */
.nl { color: $monokai-gold } /* Name.Label */
.nn { color: $monokai-fg } /* Name.Namespace */
.nx { color: $monokai-fg } /* Name.Other */
.nt { color: $monokai-pink } /* Name.Tag */
.nv { color: $monokai-blue; font-style: italic } /* Name.Variable */
.py { color: $monokai-fg } /* Name.Property */
.ow { color: $monokai-pink } /* Operator.Word */
.w { color: $monokai-fg } /* Text.Whitespace */
.mf { color: $monokai-purple } /* Literal.Number.Float */
.mh { color: $monokai-purple } /* Literal.Number.Hex */
.mi { color: $monokai-purple } /* Literal.Number.Integer */
.mo { color: $monokai-purple } /* Literal.Number.Oct */
.sb { color: $monokai-gold } /* Literal.String.Backtick */
.sc { color: $monokai-gold } /* Literal.String.Char */
.sd { color: $monokai-gold } /* Literal.String.Doc */
.s2 { color: $monokai-gold } /* Literal.String.Double */
.se { color: $monokai-gold } /* Literal.String.Escape */
.sh { color: $monokai-gold } /* Literal.String.Heredoc */
.si { color: $monokai-gold } /* Literal.String.Interpol */
.sx { color: $monokai-gold } /* Literal.String.Other */
.sr { color: $monokai-gold } /* Literal.String.Regex */
.s1 { color: $monokai-gold } /* Literal.String.Single */
.ss { color: $monokai-gold } /* Literal.String.Symbol */
.bp { color: $monokai-fg } /* Name.Builtin.Pseudo */
.vc { color: $monokai-blue; font-style: italic } /* Name.Variable.Class */
.vg { color: $monokai-blue; font-style: italic } /* Name.Variable.Global */
.vi { color: $monokai-blue; font-style: italic } /* Name.Variable.Instance */
.il { color: $monokai-purple } /* Literal.Number.Integer.Long */
}
.hljs .hljs-constant,
.asciidoc .hljs-code {
color: #66D9EF;
}
.hljs-code,
.hljs-class .hljs-title,
.hljs-header {
color: white;
}
.hljs-link_label,
.hljs-attribute,
.hljs-symbol,
.hljs-symbol .hljs-string,
.hljs-value,
.hljs-regexp {
color: #BF79DB;
}
.hljs-link_url,
.hljs-tag .hljs-value,
.hljs-string,
.hljs-bullet,
.hljs-subst,
.hljs-title,
.hljs-emphasis,
.haskell .hljs-type,
.hljs-preprocessor,
.hljs-pragma,
.ruby .hljs-class .hljs-parent,
.hljs-built_in,
.sql .hljs-aggregate,
.django .hljs-template_tag,
.django .hljs-variable,
.smalltalk .hljs-class,
.hljs-javadoc,
.django .hljs-filter .hljs-argument,
.smalltalk .hljs-localvars,
.smalltalk .hljs-array,
.hljs-attr_selector,
.hljs-pseudo,
.hljs-addition,
.hljs-stream,
.hljs-envvar,
.apache .hljs-tag,
.apache .hljs-cbracket,
.tex .hljs-command,
.hljs-prompt {
color: #A6E22E;
}
.hljs-comment,
.java .hljs-annotation,
.smartquote,
.hljs-blockquote,
.hljs-horizontal_rule,
.python .hljs-decorator,
.hljs-template_comment,
.hljs-pi,
.hljs-doctype,
.hljs-deletion,
.hljs-shebang,
.apache .hljs-sqbracket,
.tex .hljs-formula {
color: #75715E;
}
.hljs-keyword,
.hljs-literal,
.css .hljs-id,
.hljs-phpdoc,
.hljs-title,
.hljs-header,
.haskell .hljs-type,
.vbscript .hljs-built_in,
.sql .hljs-aggregate,
.rsl .hljs-built_in,
.smalltalk .hljs-class,
.diff .hljs-header,
.hljs-chunk,
.hljs-winutils,
.bash .hljs-variable,
.apache .hljs-tag,
.tex .hljs-special,
.hljs-request,
.hljs-status {
font-weight: bold;
}
.coffeescript .javascript,
.javascript .xml,
.tex .hljs-formula,
.xml .javascript,
.xml .vbscript,
.xml .css,
.xml .hljs-cdata {
opacity: 0.5;
}
}
.solarized-dark .highlight { .solarized-dark {
background-color: #002B36; background-color: #002B36;
.highlight{
border-left: 1px solid #113b46;
}
.line.hll {
background: #000;
}
.no-highlight {
color: #DDD;
}
pre { pre {
background-color: #002B36; background-color: #002B36;
color: #eee; color: #eee;
} }
.hll { background-color: #073642 } .line-numbers a {
.c { color: #586E75 } /* Comment */ color: #666;
.err { color: #93A1A1 } /* Error */ }
.g { color: #93A1A1 } /* Generic */
.k { color: #859900 } /* Keyword */ .hljs {
.l { color: #93A1A1 } /* Literal */ display: block;
.n { color: #93A1A1 } /* Name */ background: #002b36;
.o { color: #859900 } /* Operator */ color: #839496;
.x { color: #CB4B16 } /* Other */ }
.p { color: #93A1A1 } /* Punctuation */
.cm { color: #586E75 } /* Comment.Multiline */ .hljs-comment,
.cp { color: #859900 } /* Comment.Preproc */ .hljs-template_comment,
.c1 { color: #586E75 } /* Comment.Single */ .diff .hljs-header,
.cs { color: #859900 } /* Comment.Special */ .hljs-doctype,
.gd { color: #2AA198 } /* Generic.Deleted */ .hljs-pi,
.ge { color: #93A1A1; font-style: italic } /* Generic.Emph */ .lisp .hljs-string,
.gr { color: #DC322F } /* Generic.Error */ .hljs-javadoc {
.gh { color: #CB4B16 } /* Generic.Heading */ color: #586e75;
.gi { color: #859900 } /* Generic.Inserted */ }
.go { color: #93A1A1 } /* Generic.Output */
.gp { color: #93A1A1 } /* Generic.Prompt */ /* Solarized Green */
.gs { color: #93A1A1; font-weight: bold } /* Generic.Strong */ .hljs-keyword,
.gu { color: #CB4B16 } /* Generic.Subheading */ .hljs-winutils,
.gt { color: #93A1A1 } /* Generic.Traceback */ .method,
.kc { color: #CB4B16 } /* Keyword.Constant */ .hljs-addition,
.kd { color: #268BD2 } /* Keyword.Declaration */ .css .hljs-tag,
.kn { color: #859900 } /* Keyword.Namespace */ .hljs-request,
.kp { color: #859900 } /* Keyword.Pseudo */ .hljs-status,
.kr { color: #268BD2 } /* Keyword.Reserved */ .nginx .hljs-title {
.kt { color: #DC322F } /* Keyword.Type */ color: #859900;
.ld { color: #93A1A1 } /* Literal.Date */ }
.m { color: #2AA198 } /* Literal.Number */
.s { color: #2AA198 } /* Literal.String */
.na { color: #93A1A1 } /* Name.Attribute */
.nb { color: #B58900 } /* Name.Builtin */
.nc { color: #268BD2 } /* Name.Class */
.no { color: #CB4B16 } /* Name.Constant */
.nd { color: #268BD2 } /* Name.Decorator */
.ni { color: #CB4B16 } /* Name.Entity */
.ne { color: #CB4B16 } /* Name.Exception */
.nf { color: #268BD2 } /* Name.Function */
.nl { color: #93A1A1 } /* Name.Label */
.nn { color: #93A1A1 } /* Name.Namespace */
.nx { color: #93A1A1 } /* Name.Other */
.py { color: #93A1A1 } /* Name.Property */
.nt { color: #268BD2 } /* Name.Tag */
.nv { color: #268BD2 } /* Name.Variable */
.ow { color: #859900 } /* Operator.Word */
.w { color: #93A1A1 } /* Text.Whitespace */
.mf { color: #2AA198 } /* Literal.Number.Float */
.mh { color: #2AA198 } /* Literal.Number.Hex */
.mi { color: #2AA198 } /* Literal.Number.Integer */
.mo { color: #2AA198 } /* Literal.Number.Oct */
.sb { color: #586E75 } /* Literal.String.Backtick */
.sc { color: #2AA198 } /* Literal.String.Char */
.sd { color: #93A1A1 } /* Literal.String.Doc */
.s2 { color: #2AA198 } /* Literal.String.Double */
.se { color: #CB4B16 } /* Literal.String.Escape */
.sh { color: #93A1A1 } /* Literal.String.Heredoc */
.si { color: #2AA198 } /* Literal.String.Interpol */
.sx { color: #2AA198 } /* Literal.String.Other */
.sr { color: #DC322F } /* Literal.String.Regex */
.s1 { color: #2AA198 } /* Literal.String.Single */
.ss { color: #2AA198 } /* Literal.String.Symbol */
.bp { color: #268BD2 } /* Name.Builtin.Pseudo */
.vc { color: #268BD2 } /* Name.Variable.Class */
.vg { color: #268BD2 } /* Name.Variable.Global */
.vi { color: #268BD2 } /* Name.Variable.Instance */
.il { color: #2AA198 } /* Literal.Number.Integer.Long */
}
/* Solarized Cyan */
.hljs-number,
.hljs-command,
.hljs-string,
.hljs-tag .hljs-value,
.hljs-rules .hljs-value,
.hljs-phpdoc,
.tex .hljs-formula,
.hljs-regexp,
.hljs-hexcolor,
.hljs-link_url {
color: #2aa198;
}
/* Solarized Blue */
.hljs-title,
.hljs-localvars,
.hljs-chunk,
.hljs-decorator,
.hljs-built_in,
.hljs-identifier,
.vhdl .hljs-literal,
.hljs-id,
.css .hljs-function {
color: #268bd2;
}
/* Solarized Yellow */
.hljs-attribute,
.hljs-variable,
.lisp .hljs-body,
.smalltalk .hljs-number,
.hljs-constant,
.hljs-class .hljs-title,
.hljs-parent,
.haskell .hljs-type,
.hljs-link_reference {
color: #b58900;
}
/* Solarized Orange */
.hljs-preprocessor,
.hljs-preprocessor .hljs-keyword,
.hljs-pragma,
.hljs-shebang,
.hljs-symbol,
.hljs-symbol .hljs-string,
.diff .hljs-change,
.hljs-special,
.hljs-attr_selector,
.hljs-subst,
.hljs-cdata,
.clojure .hljs-title,
.css .hljs-pseudo,
.hljs-header {
color: #cb4b16;
}
/* Solarized Red */
.hljs-deletion,
.hljs-important {
color: #dc322f;
}
/* Solarized Violet */
.hljs-link_label {
color: #6c71c4;
}
.tex .hljs-formula {
background: #073642;
}
}
.white .highlight { .white {
background-color: #fff; background-color: #fff;
.line.hll {
background: #FFA;
}
.highlight{
border-left: 1px solid #eee;
}
pre { pre {
background-color: #fff; background-color: #fff;
color: #333; color: #333;
} }
.hll { display: block; background-color: $hover } .hljs {
.c { color: #888888; font-style: italic } /* Comment */ background: #FFF;
.err { color: #a61717; background-color: #e3d2d2 } /* Error */ }
.k { color: #000000; font-weight: bold } /* Keyword */
.cm { color: #888888 } /* Comment.Multiline */ .line-numbers a {
.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ color: #999;
.c1 { color: #888888 } /* Comment.Single */ }
.cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .hljs {
.ge { font-style: italic } /* Generic.Emph */ display: block;
.gr { color: #aa0000 } /* Generic.Error */ background: #fff; color: black;
.gh { color: #303030 } /* Generic.Heading */ }
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.go { color: #888888 } /* Generic.Output */ .hljs-comment,
.gp { color: #555555 } /* Generic.Prompt */ .hljs-template_comment,
.gs { font-weight: bold } /* Generic.Strong */ .hljs-javadoc,
.gu { color: #606060 } /* Generic.Subheading */ .hljs-comment * {
.gt { color: #aa0000 } /* Generic.Traceback */ color: #006a00;
.kc{font-weight: bold;} /* Keyword.Constant */ }
.kd{font-weight: bold;} /* Keyword.Declaration */
.kn{font-weight: bold;} /* Keyword.Namespace */ .hljs-keyword,
.kp{font-weight: bold;} /* Keyword.Pseudo */ .hljs-literal,
.kr{font-weight: bold;} /* Keyword.Reserved */ .nginx .hljs-title {
.kt{color: #458;font-weight: bold;} /* Keyword.Type */ color: #aa0d91;
.m { color: #0000DD; font-weight: bold } /* Literal.Number */ }
.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .method,
.na{color: #008080;} /* Name.Attribute */ .hljs-list .hljs-title,
.nb{color: #0086B3;} /* Name.Builtin */ .hljs-tag .hljs-title,
.nc{color: #458;font-weight: bold;} /* Name.Class */ .setting .hljs-value,
.no{color: #008080;} /* Name.Constant */ .hljs-winutils,
.ni{color: #800080;} .tex .hljs-command,
.ne{color: #900;font-weight: bold;} /* Name.Exception */ .http .hljs-title,
.nf{color: #900;font-weight: bold;} /* Name.Function */ .hljs-request,
.nn{color: #005;font-weight: bold;} /* Name.Namespace */ .hljs-status {
.nt{color: #000080;} /* Name.Tag */ color: #008;
.nv{color: #008080;} /* Name.Variable */ }
.py { color: #336699; font-weight: bold } /* Name.Property */
.ow { color: #008800 } /* Operator.Word */ .hljs-envvar,
.w { color: #bbbbbb } /* Text.Whitespace */ .tex .hljs-special {
.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ color: #660;
.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ }
.mi {color: #099;} /* Literal.Number.Integer */
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .hljs-string {
.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ color: #c41a16;
.sc{color: #d14;} /* Literal.String.Char */ }
.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .hljs-tag .hljs-value,
.s2{color: #d14;} /* Literal.String.Double */ .hljs-cdata,
.se{color: #d14;} /* Literal.String.Escape */ .hljs-filter .hljs-argument,
.sh{color: #d14;} /* Literal.String.Heredoc */ .hljs-attr_selector,
.si{color: #d14;} /* Literal.String.Interpol */ .apache .hljs-cbracket,
.sx{color: #d14;} /* Literal.String.Other */ .hljs-date,
.sr{color: #d14;} /* Literal.String.Regex */ .hljs-regexp {
.s1{color: #d14;} /* Literal.String.Single */ color: #080;
.ss{color: #d14;} /* Literal.String.Symbol */ }
.bp { color: #003388 } /* Name.Builtin.Pseudo */
.vc { color: #336699 } /* Name.Variable.Class */ .hljs-sub .hljs-identifier,
.vg { color: #dd7700 } /* Name.Variable.Global */ .hljs-pi,
.vi { color: #3333bb } .hljs-tag,
.hljs-tag .hljs-keyword,
.hljs-decorator,
.ini .hljs-title,
.hljs-shebang,
.hljs-prompt,
.hljs-hexcolor,
.hljs-rules .hljs-value,
.hljs-symbol,
.hljs-symbol .hljs-string,
.hljs-number,
.css .hljs-function,
.clojure .hljs-title,
.clojure .hljs-built_in,
.hljs-function .hljs-title,
.coffeescript .hljs-attribute {
color: #1c00cf;
}
.hljs-class .hljs-title,
.haskell .hljs-type,
.smalltalk .hljs-class,
.hljs-javadoctag,
.hljs-yardoctag,
.hljs-phpdoc,
.hljs-typename,
.hljs-tag .hljs-attribute,
.hljs-doctype,
.hljs-class .hljs-id,
.hljs-built_in,
.setting,
.hljs-params,
.clojure .hljs-attribute {
color: #5c2699;
}
.hljs-variable {
color: #3f6e74;
}
.css .hljs-tag,
.hljs-rules .hljs-property,
.hljs-pseudo,
.hljs-subst {
color: #000;
}
.css .hljs-class,
.css .hljs-id {
color: #9B703F;
}
.hljs-value .hljs-important {
color: #ff7700;
font-weight: bold;
}
.hljs-rules .hljs-keyword {
color: #C5AF75;
}
.hljs-annotation,
.apache .hljs-sqbracket,
.nginx .hljs-built_in {
color: #9B859D;
}
.hljs-preprocessor,
.hljs-preprocessor *,
.hljs-pragma {
color: #643820;
}
.tex .hljs-formula {
background-color: #EEE;
font-style: italic;
}
.diff .hljs-header,
.hljs-chunk {
color: #808080;
font-weight: bold;
}
.diff .hljs-change {
background-color: #BCCFF9;
}
.hljs-addition {
background-color: #BAEEBA;
}
.hljs-deletion {
background-color: #FFC8BD;
}
.hljs-comment .hljs-yardoctag {
font-weight: bold;
}
.method .hljs-id {
color: #000;
}
} }
.shadow { .shadow {
@include box-shadow(0 5px 15px #000); @include box-shadow(0 5px 15px #000);
} }
.wiki, .note-body {
.highlight {
border: 1px solid #DDD;
}
}
html { html {
overflow-y: scroll; overflow-y: scroll;
&.touch .tooltip { display: none !important; }
} }
body { body {
-webkit-font-smoothing: antialiased; padding-bottom: 20px;
-moz-osx-font-smoothing: grayscale;
margin-bottom: 20px;
} }
.container { .container {
......
...@@ -106,12 +106,12 @@ ...@@ -106,12 +106,12 @@
h3 { h3 {
margin-top: 35px; margin-top: 35px;
font-size: 2em; font-size: 1.5em;
} }
h4 { h4 {
margin-top: 30px; margin-top: 30px;
font-size: 1.5em; font-size: 1.2em;
} }
blockquote p { blockquote p {
...@@ -128,7 +128,7 @@ ...@@ -128,7 +128,7 @@
} }
} }
code { p > code {
font-size: inherit; font-size: inherit;
font-weight: inherit; font-weight: inherit;
color: #555; color: #555;
......
...@@ -5,6 +5,7 @@ $primary_color: #2FA0BB; ...@@ -5,6 +5,7 @@ $primary_color: #2FA0BB;
$link_color: #3A89A3; $link_color: #3A89A3;
$style_color: #474D57; $style_color: #474D57;
$bg_style_color: #2299BB; $bg_style_color: #2299BB;
$list-group-active-bg: $bg_style_color;
$hover: #D9EDF7; $hover: #D9EDF7;
/** /**
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* Admin area * Admin area
* *
*/ */
.admin_dash { .admin-dashboard {
.data { .data {
a { a {
h1 { h1 {
...@@ -14,6 +14,10 @@ ...@@ -14,6 +14,10 @@
} }
} }
} }
.str-truncated {
max-width: 60%;
}
} }
.admin-filter form { .admin-filter form {
......
...@@ -10,331 +10,6 @@ ...@@ -10,331 +10,6 @@
} }
} }
.file {
border: 1px solid #CCC;
margin-bottom: 1em;
.header {
@extend .clearfix;
background: #DDD;
border-bottom: 1px solid #CCC;
padding: 5px 5px 5px 10px;
color: #555;
> span {
font-family: $monospace_font;
font-size: 14px;
line-height: 2;
}
.view-file {
font-weight: bold;
float: right;
background-color: #EEE;
}
.commit-short-id {
font-family: $monospace_font;
font-size: smaller;
}
.file-mode {
font-family: $monospace_font;
}
}
.content {
overflow: auto;
overflow-y: hidden;
background: #FFF;
color: #333;
font-size: 12px;
.old {
span.idiff {
background-color: #FAA;
}
}
.new {
span.idiff {
background-color: #AFA;
}
}
table {
width: 100%;
font-family: $monospace_font;
border: none;
margin: 0px;
padding: 0px;
td {
line-height: 18px;
font-size: 12px;
}
}
.old_line, .new_line, .diff_line {
margin: 0px;
padding: 0px;
border: none;
background: #EEE;
color: #666;
padding: 0px 5px;
border-right: 1px solid #ccc;
text-align: right;
min-width: 35px;
max-width: 50px;
width: 35px;
@include user-select(none);
a {
float: left;
width: 35px;
font-weight: normal;
color: #666;
&:hover {
text-decoration: underline;
}
}
&.new {
background: #CFD;
}
&.old {
background: #FDD;
}
}
.diff_line {
padding: 0;
}
.line_holder {
&.old .old_line,
&.old .new_line {
background: #FCC;
border-color: #E7BABA;
}
&.new .old_line,
&.new .new_line {
background: #CFC;
border-color: #B9ECB9;
}
}
.line_content {
display: block;
white-space: pre;
height: 18px;
margin: 0px;
padding: 0px 0.5em;
border: none;
&.new {
background: #CFD;
}
&.old {
background: #FDD;
}
&.matched {
color: #ccc;
background: #fafafa;
}
&.parallel {
display: table-cell;
overflow: hidden;
width: 50%;
}
}
}
.image {
background: #ddd;
text-align: center;
padding: 30px;
.wrap{
display: inline-block;
}
.frame {
display: inline-block;
background-color: #fff;
line-height: 0;
img{
border: 1px solid #FFF;
background: url('trans_bg.gif');
}
&.deleted {
border: 1px solid $deleted;
}
&.added {
border: 1px solid $added;
}
}
.image-info{
font-size: 12px;
margin: 5px 0 0 0;
color: grey;
}
.view.swipe{
position: relative;
.swipe-frame{
display: block;
margin: auto;
position: relative;
}
.swipe-wrap{
overflow: hidden;
border-left: 1px solid #999;
position: absolute;
display: block;
top: 13px;
right: 7px;
}
.frame{
top: 0;
right: 0;
position: absolute;
&.deleted{
margin: 0;
display: block;
top: 13px;
right: 7px;
}
}
.swipe-bar{
display: block;
height: 100%;
width: 15px;
z-index: 100;
position: absolute;
cursor: pointer;
&:hover{
.top-handle{
background-position: -15px 3px;
}
.bottom-handle{
background-position: -15px -11px;
}
};
.top-handle{
display: block;
height: 14px;
width: 15px;
position: absolute;
top: 0px;
background: url('swipemode_sprites.gif') 0 3px no-repeat;
}
.bottom-handle{
display: block;
height: 14px;
width: 15px;
position: absolute;
bottom: 0px;
background: url('swipemode_sprites.gif') 0 -11px no-repeat;
}
}
} //.view.swipe
.view.onion-skin{
.onion-skin-frame{
display: block;
margin: auto;
position: relative;
}
.frame.added, .frame.deleted {
position: absolute;
display: block;
top: 0px;
left: 0px;
}
.controls{
display: block;
height: 14px;
width: 300px;
z-index: 100;
position: absolute;
bottom: 0px;
left: 50%;
margin-left: -150px;
.drag-track{
display: block;
position: absolute;
left: 12px;
height: 10px;
width: 276px;
background: url('onion_skin_sprites.gif') -4px -20px repeat-x;
}
.dragger {
display: block;
position: absolute;
left: 0px;
top: 0px;
height: 14px;
width: 14px;
background: url('onion_skin_sprites.gif') 0px -34px repeat-x;
cursor: pointer;
}
.transparent {
display: block;
position: absolute;
top: 2px;
right: 0px;
height: 10px;
width: 10px;
background: url('onion_skin_sprites.gif') -2px 0px no-repeat;
}
.opaque {
display: block;
position: absolute;
top: 2px;
left: 0px;
height: 10px;
width: 10px;
background: url('onion_skin_sprites.gif') -2px -10px no-repeat;
}
}
} //.view.onion-skin
}
.view-modes{
padding: 10px;
text-align: center;
background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
ul, li{
list-style: none;
margin: 0;
padding: 0;
display: inline-block;
}
li{
color: grey;
border-left: 1px solid #c1c1c1;
padding: 0 12px 0 16px;
cursor: pointer;
&:first-child{
border-left: none;
}
&:hover{
text-decoration: underline;
}
&.active{
&:hover{
text-decoration: none;
}
cursor: default;
color: #333;
}
&.disabled{
display: none;
}
}
}
}
/** COMMIT BLOCK **/ /** COMMIT BLOCK **/
.commit-title{ .commit-title{
display: block; display: block;
...@@ -493,6 +168,25 @@ li.commit { ...@@ -493,6 +168,25 @@ li.commit {
text-decoration: underline; text-decoration: underline;
} }
} }
.text-expander {
background: #eee;
color: #555;
padding: 0 5px;
cursor: pointer;
margin-left: 4px;
&:hover {
background-color: #ddd;
}
}
}
.commit-row-description {
font-size: 14px;
border-left: 1px solid #e5e5e5;
padding: 0 15px 0 7px;
margin: 5px 0 10px 5px;
display: none;
} }
.commit-row-info { .commit-row-info {
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
.dash-sidebar-tabs { .dash-sidebar-tabs {
margin-bottom: 2px; margin-bottom: 2px;
border: none; border: none;
margin: 0; margin: 0 !important;
li { li {
&.active { &.active {
......
.diff-file {
border: 1px solid #CCC;
margin-bottom: 1em;
.diff-header {
@extend .clearfix;
background: #DDD;
border-bottom: 1px solid #CCC;
padding: 5px 5px 5px 10px;
color: #555;
> span {
font-family: $monospace_font;
font-size: 14px;
line-height: 2;
}
.diff-btn-group {
float: right;
.btn {
background-color: #EEE;
color: #666;
font-weight: bolder;
}
}
.commit-short-id {
font-family: $monospace_font;
font-size: smaller;
}
.file-mode {
font-family: $monospace_font;
}
}
.diff-content {
overflow: auto;
overflow-y: hidden;
background: #FFF;
color: #333;
font-size: 12px;
.old {
span.idiff {
background-color: #FAA;
}
}
.new {
span.idiff {
background-color: #AFA;
}
}
table {
width: 100%;
font-family: $monospace_font;
border: none;
margin: 0px;
padding: 0px;
td {
line-height: 18px;
font-size: 12px;
}
}
.old_line, .new_line, .diff_line {
margin: 0px;
padding: 0px;
border: none;
background: #EEE;
color: #666;
padding: 0px 5px;
border-right: 1px solid #ccc;
text-align: right;
min-width: 35px;
max-width: 50px;
width: 35px;
@include user-select(none);
a {
float: left;
width: 35px;
font-weight: normal;
color: #666;
&:hover {
text-decoration: underline;
}
}
&.new {
background: #CFD;
}
&.old {
background: #FDD;
}
}
.diff_line {
padding: 0;
}
.line_holder {
&.old .old_line,
&.old .new_line {
background: #FCC;
border-color: #E7BABA;
}
&.new .old_line,
&.new .new_line {
background: #CFC;
border-color: #B9ECB9;
}
}
.line_content {
display: block;
white-space: pre;
height: 18px;
margin: 0px;
padding: 0px 0.5em;
border: none;
&.new {
background: #CFD;
}
&.old {
background: #FDD;
}
&.matched {
color: #ccc;
background: #fafafa;
}
&.parallel {
display: table-cell;
overflow: hidden;
width: 50%;
}
}
}
.image {
background: #ddd;
text-align: center;
padding: 30px;
.wrap{
display: inline-block;
}
.frame {
display: inline-block;
background-color: #fff;
line-height: 0;
img{
border: 1px solid #FFF;
background: url('trans_bg.gif');
max-width: 100%;
}
&.deleted {
border: 1px solid $deleted;
}
&.added {
border: 1px solid $added;
}
}
.image-info{
font-size: 12px;
margin: 5px 0 0 0;
color: grey;
}
.view.swipe{
position: relative;
.swipe-frame{
display: block;
margin: auto;
position: relative;
}
.swipe-wrap{
overflow: hidden;
border-left: 1px solid #999;
position: absolute;
display: block;
top: 13px;
right: 7px;
}
.frame{
top: 0;
right: 0;
position: absolute;
&.deleted{
margin: 0;
display: block;
top: 13px;
right: 7px;
}
}
.swipe-bar{
display: block;
height: 100%;
width: 15px;
z-index: 100;
position: absolute;
cursor: pointer;
&:hover{
.top-handle{
background-position: -15px 3px;
}
.bottom-handle{
background-position: -15px -11px;
}
};
.top-handle{
display: block;
height: 14px;
width: 15px;
position: absolute;
top: 0px;
background: url('swipemode_sprites.gif') 0 3px no-repeat;
}
.bottom-handle{
display: block;
height: 14px;
width: 15px;
position: absolute;
bottom: 0px;
background: url('swipemode_sprites.gif') 0 -11px no-repeat;
}
}
} //.view.swipe
.view.onion-skin{
.onion-skin-frame{
display: block;
margin: auto;
position: relative;
}
.frame.added, .frame.deleted {
position: absolute;
display: block;
top: 0px;
left: 0px;
}
.controls{
display: block;
height: 14px;
width: 300px;
z-index: 100;
position: absolute;
bottom: 0px;
left: 50%;
margin-left: -150px;
.drag-track{
display: block;
position: absolute;
left: 12px;
height: 10px;
width: 276px;
background: url('onion_skin_sprites.gif') -4px -20px repeat-x;
}
.dragger {
display: block;
position: absolute;
left: 0px;
top: 0px;
height: 14px;
width: 14px;
background: url('onion_skin_sprites.gif') 0px -34px repeat-x;
cursor: pointer;
}
.transparent {
display: block;
position: absolute;
top: 2px;
right: 0px;
height: 10px;
width: 10px;
background: url('onion_skin_sprites.gif') -2px 0px no-repeat;
}
.opaque {
display: block;
position: absolute;
top: 2px;
left: 0px;
height: 10px;
width: 10px;
background: url('onion_skin_sprites.gif') -2px -10px no-repeat;
}
}
} //.view.onion-skin
}
.view-modes{
padding: 10px;
text-align: center;
background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
ul, li{
list-style: none;
margin: 0;
padding: 0;
display: inline-block;
}
li{
color: grey;
border-left: 1px solid #c1c1c1;
padding: 0 12px 0 16px;
cursor: pointer;
&:first-child{
border-left: none;
}
&:hover{
text-decoration: underline;
}
&.active{
&:hover{
text-decoration: none;
}
cursor: default;
color: #333;
}
&.disabled{
display: none;
}
}
}
}
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
&.event-inline { &.event-inline {
.avatar { .avatar {
width: 16px; position: relative;
height: 16px; top: -2px;
} }
} }
...@@ -113,6 +113,7 @@ ...@@ -113,6 +113,7 @@
&.commit { &.commit {
background: transparent; background: transparent;
padding: 3px; padding: 3px;
padding-left: 0;
border: none; border: none;
color: #666; color: #666;
.commit-row-title { .commit-row-title {
...@@ -122,6 +123,7 @@ ...@@ -122,6 +123,7 @@
&.commits-stat { &.commits-stat {
display: block; display: block;
padding: 3px; padding: 3px;
padding-left: 0;
&:hover { &:hover {
background: none; background: none;
......
.new-group-member-holder {
margin-top: 50px;
background: #f9f9f9;
padding-top: 20px;
}
.member-search-form {
float: left;
}
...@@ -19,7 +19,7 @@ header { ...@@ -19,7 +19,7 @@ header {
line-height: 32px; line-height: 32px;
padding: 6px 10px; padding: 6px 10px;
&:hover { &:hover, &:focus, &:active {
background: none; background: none;
} }
} }
...@@ -29,6 +29,64 @@ header { ...@@ -29,6 +29,64 @@ header {
float: right; float: right;
margin-right: 0; margin-right: 0;
} }
.navbar-toggle {
color: $style_color;
margin: 0 -15px 0 0;
padding: 10px;
border-radius: 0;
button i { font-size: 22px; }
&.collapsed { background-color: transparent !important;}
&:hover {
background-color: #EEE;
}
}
}
.turbolink-spinner {
font-size: 20px;
margin-right: 10px;
}
@media (max-width: $screen-xs-max) {
border-width: 0;
font-size: 18px;
.app_logo { margin-left: -15px; }
.title {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: top;
white-space: nowrap;
max-width: 70%;
}
.navbar-collapse {
padding-right: 0;
padding-left: 0;
}
.navbar-nav {
margin: 5px 0;
.visible-xs, .visable-sm {
display: table-cell !important;
}
}
li {
display: table-cell;
width: 1%;
a {
text-align: center;
font-size: 18px !important;
}
}
} }
} }
...@@ -50,7 +108,7 @@ header { ...@@ -50,7 +108,7 @@ header {
h1 { h1 {
margin: 0; margin: 0;
background: url('logo-black.png') no-repeat center center; background: image-url('logo-black.png') no-repeat center center;
background-size: 32px; background-size: 32px;
float: left; float: left;
height: 46px; height: 46px;
...@@ -69,7 +127,7 @@ header { ...@@ -69,7 +127,7 @@ header {
* Project / Area name * Project / Area name
* *
*/ */
.project_name { .title {
position: relative; position: relative;
float: left; float: left;
margin: 0; margin: 0;
...@@ -128,11 +186,14 @@ header { ...@@ -128,11 +186,14 @@ header {
background: #708090; background: #708090;
border-bottom: 1px solid #AAA; border-bottom: 1px solid #AAA;
.navbar-toggle { color: #fff; }
.nav > li > a { .nav > li > a {
color: #AAA; color: #AAA;
text-shadow: 0 1px 0 #444; text-shadow: 0 1px 0 #444;
&:hover { &:hover, &:focus, &:active {
background: none;
color: #FFF; color: #FFF;
} }
} }
...@@ -160,18 +221,18 @@ header { ...@@ -160,18 +221,18 @@ header {
.app_logo { .app_logo {
a { a {
h1 { h1 {
background: url('logo-white.png') no-repeat center center; background: image-url('logo-white.png') no-repeat center center;
background-size: 32px; background-size: 32px;
color: #fff; color: #fff;
text-shadow: 0 1px 1px #444; text-shadow: 0 1px 1px #444;
} }
} }
} }
.project_name { .title {
a { a {
color: #BBB; color: #FFF;
&:hover { &:hover {
color: #FFF; text-decoration: underline;
} }
} }
color: #fff; color: #fff;
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
.issue-check { .issue-check {
float: left; float: left;
padding: 8px 0;
padding-right: 8px; padding-right: 8px;
margin-bottom: 10px;
min-width: 15px; min-width: 15px;
} }
...@@ -38,13 +38,21 @@ ...@@ -38,13 +38,21 @@
} }
} }
input.check_all_issues { .check-all-holder {
height: 32px;
float: left; float: left;
padding: 0; margin-right: 12px;
margin: 0; padding: 6px 10px;
margin-right: 10px; border: 1px solid #ccc;
position: relative; @include border-radius(4px);
top: 13px;
input.check_all_issues {
padding: 0;
margin: 0;
position: relative;
top: 3px;
}
} }
.issues_content { .issues_content {
...@@ -57,23 +65,6 @@ input.check_all_issues { ...@@ -57,23 +65,6 @@ input.check_all_issues {
} }
} }
.btn.close_issue {
color: #B94A48;
font-weight: bold;
@include shade;
&:hover {
color: #B94A48;
}
}
.btn.reopen_issue {
color: #468847;
font-weight: bold;
@include shade;
&:hover {
color: #468847;
}
}
@media (min-width: 800px) { .issues_filters select { width: 160px; } } @media (min-width: 800px) { .issues_filters select { width: 160px; } }
@media (min-width: 1200px) { .issues_filters select { width: 220px; } } @media (min-width: 1200px) { .issues_filters select { width: 220px; } }
...@@ -93,6 +84,13 @@ input.check_all_issues { ...@@ -93,6 +84,13 @@ input.check_all_issues {
.update_selected_issues { .update_selected_issues {
margin-left: 4px; margin-left: 4px;
} }
.select2-container .select2-choice {
height: 32px;
line-height: 28px;
color: #444 !important;
font-weight: 500;
}
} }
} }
...@@ -127,3 +125,21 @@ input.check_all_issues { ...@@ -127,3 +125,21 @@ input.check_all_issues {
form.edit-issue { form.edit-issue {
margin: 0; margin: 0;
} }
.merge-request,
.issue {
&.today {
background: #EFE;
border-color: #CEC;
}
&.closed {
background: #F5f5f5;
border-color: #E5E5E5;
}
&.merged {
background: #F5f5f5;
border-color: #E5E5E5;
}
}
...@@ -6,11 +6,10 @@ ...@@ -6,11 +6,10 @@
} }
.login-box{ .login-box{
width: 304px; max-width: 304px;
position: relative; position: relative;
@include border-radius(5px); @include border-radius(5px);
margin: auto; margin: auto;
padding: 20px;
background: white; background: white;
} }
...@@ -23,7 +22,7 @@ ...@@ -23,7 +22,7 @@
background-color: #f1f1f1; background-color: #f1f1f1;
font-size: 16px; font-size: 16px;
padding: 14px 10px; padding: 14px 10px;
width: 280px; width: 100%;
height: auto; height: auto;
&.top { &.top {
......
...@@ -31,10 +31,10 @@ ...@@ -31,10 +31,10 @@
.mr_source_commit, .mr_source_commit,
.mr_target_commit { .mr_target_commit {
margin-top: 10px;
.commit { .commit {
margin: 0; margin: 0;
padding: 0; padding: 2px 0;
padding: 5px 0;
list-style: none; list-style: none;
&:hover { &:hover {
background: none; background: none;
...@@ -90,15 +90,8 @@ ...@@ -90,15 +90,8 @@
padding-top: 15px; padding-top: 15px;
} }
.merge-request-branches { // hide mr close link for inline diff comment form
.commit-row-message { .diff-file .close-mr-link,
font-weight: normal !important; .diff-file .reopen-mr-link {
} display: none;
.select2-container .select2-single {
span {
font-weight: bold;
color: #555;
}
}
} }
...@@ -35,9 +35,8 @@ ...@@ -35,9 +35,8 @@
width: 1%; width: 1%;
&.active { &.active {
a { a {
color: $style_color; color: #333;
font-weight: bolder; font-weight: bold;
&:after { &:after {
content: ''; content: '';
display: block; display: block;
...@@ -46,7 +45,7 @@ ...@@ -46,7 +45,7 @@
left: 50%; left: 50%;
width: 0; width: 0;
height: 0; height: 0;
border-color: transparent transparent #777 transparent; border-color: transparent transparent #333 transparent;
border-style: solid; border-style: solid;
border-width: 6px; border-width: 6px;
margin-left: -6px; margin-left: -6px;
...@@ -56,7 +55,20 @@ ...@@ -56,7 +55,20 @@
&:hover { &:hover {
a { a {
color: $style_color; color: $link_color;
&:after {
content: '';
display: block;
position: relative;
bottom: 8px;
left: 50%;
width: 0;
height: 0;
border-color: transparent transparent #29b transparent;
border-style: solid;
border-width: 6px;
margin-left: -6px;
}
} }
} }
...@@ -73,7 +85,7 @@ ...@@ -73,7 +85,7 @@
a { a {
display: block; display: block;
text-align: center; text-align: center;
font-weight: normal; font-weight: 500;
height: 38px; height: 38px;
line-height: 34px; line-height: 34px;
color: #777; color: #777;
...@@ -83,4 +95,38 @@ ...@@ -83,4 +95,38 @@
padding-top: 2px; padding-top: 2px;
} }
} }
@media (max-width: $screen-xs-max) {
font-size: 18px;
margin: 0;
max-height: none;
&, .container {
padding: 0;
border-top: 0;
}
ul {
height: auto;
li {
display: list-item;
width: auto;
padding: 5px 0;
&.active {
background-color: $primary_color;
a {
color: #fff;
font-weight: normal;
text-shadow: none;
&:after { display: none; }
}
}
}
}
}
} }
...@@ -47,13 +47,13 @@ ul.notes { ...@@ -47,13 +47,13 @@ ul.notes {
.discussion-body { .discussion-body {
margin-left: 50px; margin-left: 50px;
.file, .diff-file,
.discussion-hidden, .discussion-hidden,
.notes { .notes {
@extend .borders; @extend .borders;
background-color: #F9F9F9; background-color: #F9F9F9;
} }
.file .notes { .diff-file .notes {
/* reset */ /* reset */
background: inherit; background: inherit;
border: none; border: none;
...@@ -87,15 +87,10 @@ ul.notes { ...@@ -87,15 +87,10 @@ ul.notes {
} }
.attachment { .attachment {
font-size: 14px; font-size: 14px;
margin-top: -20px;
} }
.note-body { .note-body {
@include md-typography; @include md-typography;
margin-left: 45px; margin-left: 45px;
.highlight {
@include border-radius(4px);
}
} }
.note-header { .note-header {
padding-bottom: 5px; padding-bottom: 5px;
...@@ -118,7 +113,7 @@ ul.notes { ...@@ -118,7 +113,7 @@ ul.notes {
} }
} }
.file .notes_holder { .diff-file .notes_holder {
font-size: 13px; font-size: 13px;
line-height: 18px; line-height: 18px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
...@@ -188,7 +183,7 @@ ul.notes { ...@@ -188,7 +183,7 @@ ul.notes {
} }
} }
} }
.file .note .note-actions { .diff-file .note .note-actions {
right: 0; right: 0;
top: 0; top: 0;
} }
...@@ -199,7 +194,7 @@ ul.notes { ...@@ -199,7 +194,7 @@ ul.notes {
* Line note button on the side of diffs * Line note button on the side of diffs
*/ */
.file tr.line_holder { .diff-file tr.line_holder {
.add-diff-note { .add-diff-note {
background: url("diff_note_add.png") no-repeat left 0; background: url("diff_note_add.png") no-repeat left 0;
height: 22px; height: 22px;
...@@ -239,22 +234,25 @@ ul.notes { ...@@ -239,22 +234,25 @@ ul.notes {
.reply-btn { .reply-btn {
@extend .btn-primary; @extend .btn-primary;
} }
.file .content tr.line_holder:hover { .diff-file .diff-content {
&> td.line_content { tr.line_holder:hover {
background: $hover !important; &> td.line_content {
border-color: darken($hover, 10%) !important; background: $hover !important;
border-color: darken($hover, 10%) !important;
}
&> td.new_line,
&> td.old_line {
background: darken($hover, 4%) !important;
border-color: darken($hover, 10%) !important;
}
} }
&> td.new_line,
&> td.old_line { tr.line_holder:hover > td .line_note_link {
background: darken($hover, 4%) !important; opacity: 1.0;
border-color: darken($hover, 10%) !important; filter: alpha(opacity=100);
} }
} }
.file .content tr.line_holder:hover > td .line_note_link { .diff-file,
opacity: 1.0;
filter: alpha(opacity=100);
}
.file,
.discussion { .discussion {
.new_note { .new_note {
margin: 0; margin: 0;
...@@ -292,7 +290,7 @@ ul.notes { ...@@ -292,7 +290,7 @@ ul.notes {
box-shadow: none; box-shadow: none;
font-size: 14px; font-size: 14px;
height: 80px; height: 80px;
width: 98.6%; width: 100%;
} }
} }
} }
...@@ -306,6 +304,7 @@ ul.notes { ...@@ -306,6 +304,7 @@ ul.notes {
@extend .col-md-4; @extend .col-md-4;
@extend .thumbnail; @extend .thumbnail;
margin-left: 45px; margin-left: 45px;
float: none;
} }
...@@ -341,7 +340,7 @@ ul.notes { ...@@ -341,7 +340,7 @@ ul.notes {
box-shadow: none; box-shadow: none;
font-size: 14px; font-size: 14px;
height: 80px; height: 80px;
width: 98.6%; width: 100%;
} }
.form-actions { .form-actions {
......
...@@ -105,3 +105,23 @@ ...@@ -105,3 +105,23 @@
} }
} }
} }
.profile-groups-avatars {
margin: 0 5px 10px 0;
img {
width: 50px;
height: 50px;
}
}
.global-notifications-form .level-title {
font-size: 15px;
color: #333;
font-weight: bold;
}
.notification-icon-holder {
width: 20px;
float: left;
}
...@@ -123,14 +123,9 @@ ...@@ -123,14 +123,9 @@
} }
.save-project-loader { .save-project-loader {
img { margin-top: 50px;
margin-top: 50px; margin-bottom: 50px;
margin-bottom: 50px; color: #555;
}
h3 {
@extend .page-title;
}
} }
ul.nav.nav-projects-tabs { ul.nav.nav-projects-tabs {
......
...@@ -127,9 +127,27 @@ ...@@ -127,9 +127,27 @@
border-top: 1px dashed #CCC; border-top: 1px dashed #CCC;
padding-top: 10px; padding-top: 10px;
h4 { .readme-file-title {
font-size: 14px; font-size: 14px;
margin-bottom: 20px; margin-bottom: 20px;
color: #777; color: #777;
} }
} }
.blob-commit-info {
list-style: none;
margin: 0;
padding: 0;
margin-bottom: 10px;
.commit {
.commit-row-title {
font-size: 13px;
.commit-row-message {
font-weight: normal;
color: #555;
}
}
}
}
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
.navbar-inner { .navbar-inner {
background: #547; background: #547;
border-bottom: 1px solid #435; border-bottom: 1px solid #435;
.app_logo { .app_logo, .navbar-toggle {
&:hover { &:hover {
background-color: #435; background-color: #435;
} }
...@@ -36,4 +36,8 @@ ...@@ -36,4 +36,8 @@
} }
} }
} }
.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
background: #769;
}
} }
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
.navbar-inner { .navbar-inner {
background: #373737; background: #373737;
border-bottom: 1px solid #272727; border-bottom: 1px solid #272727;
.app_logo { .app_logo, .navbar-toggle {
&:hover { &:hover {
background-color: #272727; background-color: #272727;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
.navbar-inner { .navbar-inner {
background: #474D57; background: #474D57;
border-bottom: 1px solid #373D47; border-bottom: 1px solid #373D47;
.app_logo { .app_logo, .navbar-toggle {
&:hover { &:hover {
background-color: #373D47; background-color: #373D47;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
.navbar-inner { .navbar-inner {
background: #345; background: #345;
border-bottom: 1px solid #234; border-bottom: 1px solid #234;
.app_logo { .app_logo, .navbar-toggle {
&:hover { &:hover {
background-color: #234; background-color: #234;
} }
......
class CommitLoadContext < BaseContext
def execute
result = {
commit: nil,
suppress_diff: false,
line_notes: [],
notes_count: 0,
note: nil,
status: :ok
}
commit = project.repository.commit(params[:id])
if commit
line_notes = project.notes.for_commit_id(commit.id).inline
result[:commit] = commit
result[:note] = project.build_commit_note(commit)
result[:line_notes] = line_notes
result[:notes_count] = project.notes.for_commit_id(commit.id).count
result[:branches] = project.repository.branch_names_contains(commit.id)
begin
result[:suppress_diff] = true if commit.diff_suppress? && !params[:force_show_diff]
result[:force_suppress_diff] = commit.diff_force_suppress?
rescue Grit::Git::GitTimeout
result[:suppress_diff] = true
result[:status] = :huge_commit
end
end
result
end
end
class FilterContext
attr_accessor :klass, :current_user, :params
def initialize(klass, current_user, params)
@klass = klass
@current_user = current_user
@params = params
end
def execute
items = by_scope
items = by_state(items)
items = by_project(items)
items = by_search(items)
end
private
def by_scope
table_name = klass.table_name
case params[:scope]
when 'authored' then
current_user.send(table_name)
when 'all' then
klass.of_projects(current_user.authorized_projects.pluck(:id))
else
current_user.send("assigned_#{table_name}")
end
end
def by_state(items)
case params[:status]
when 'closed'
items.closed
when 'all'
items
else
items.opened
end
end
def by_project(items)
if params[:project_id].present?
items = items.of_projects(params[:project_id])
end
items
end
def by_search(items)
if params[:search].present?
items = items.search(params[:search])
end
items
end
end
module Issues
class ListContext < BaseContext
attr_accessor :issues
def execute
@issues = @project.issues
@issues = case params[:state]
when 'all' then @issues
when 'closed' then @issues.closed
else @issues.opened
end
@issues = case params[:scope]
when 'assigned-to-me' then @issues.assigned_to(current_user)
when 'created-by-me' then @issues.authored(current_user)
else @issues
end
@issues = @issues.tagged_with(params[:label_name]) if params[:label_name].present?
@issues = @issues.includes(:author, :project)
# Filter by specific assignee_id (or lack thereof)?
if params[:assignee_id].present?
@issues = @issues.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
end
# Filter by specific milestone_id (or lack thereof)?
if params[:milestone_id].present?
@issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
end
# Sort by :sort param
@issues = sort(@issues, params[:sort])
@issues
end
private
def sort(issues, condition)
case condition
when 'newest' then issues.except(:order).order('created_at DESC')
when 'oldest' then issues.except(:order).order('created_at ASC')
when 'recently_updated' then issues.except(:order).order('updated_at DESC')
when 'last_updated' then issues.except(:order).order('updated_at ASC')
when 'milestone_due_soon' then issues.except(:order).joins(:milestone).order("milestones.due_date ASC")
when 'milestone_due_later' then issues.except(:order).joins(:milestone).order("milestones.due_date DESC")
else issues
end
end
end
end
# Build collection of Merge Requests
# based on filtering passed via params for @project
class MergeRequestsLoadContext < BaseContext
def execute
merge_requests = @project.merge_requests
merge_requests = case params[:state]
when 'all' then merge_requests
when 'closed' then merge_requests.closed
else merge_requests.opened
end
merge_requests = case params[:scope]
when 'assigned-to-me' then merge_requests.assigned_to(current_user)
when 'created-by-me' then merge_requests.authored(current_user)
else merge_requests
end
merge_requests = merge_requests.page(params[:page]).per(20)
merge_requests = merge_requests.includes(:author, :source_project, :target_project).order("created_at desc")
# Filter by specific assignee_id (or lack thereof)?
if params[:assignee_id].present?
merge_requests = merge_requests.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
end
# Filter by specific milestone_id (or lack thereof)?
if params[:milestone_id].present?
merge_requests = merge_requests.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
end
merge_requests
end
end
module Notes
class LoadContext < BaseContext
def execute
target_type = params[:target_type]
target_id = params[:target_id]
@notes = case target_type
when "commit"
project.notes.for_commit_id(target_id).not_inline.fresh
when "issue"
project.issues.find(target_id).notes.inc_author.fresh
when "merge_request"
project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh
when "snippet"
project.snippets.find(target_id).notes.fresh
end
end
end
end
class TestHookContext < BaseContext
def execute
hook = project.hooks.find(params[:id])
data = GitPushService.new.sample_data(project, current_user)
hook.execute(data)
end
end
...@@ -52,6 +52,6 @@ class Admin::GroupsController < Admin::ApplicationController ...@@ -52,6 +52,6 @@ class Admin::GroupsController < Admin::ApplicationController
private private
def group def group
@group = Group.find_by_path(params[:id]) @group = Group.find_by(path: params[:id])
end end
end end
...@@ -5,7 +5,7 @@ class Admin::ProjectsController < Admin::ApplicationController ...@@ -5,7 +5,7 @@ class Admin::ProjectsController < Admin::ApplicationController
def index def index
owner_id = params[:owner_id] owner_id = params[:owner_id]
user = User.find_by_id(owner_id) user = User.find_by(id: owner_id)
@projects = user ? user.owned_projects : Project.all @projects = user ? user.owned_projects : Project.all
@projects = @projects.where("visibility_level IN (?)", params[:visibility_levels]) if params[:visibility_levels].present? @projects = @projects.where("visibility_level IN (?)", params[:visibility_levels]) if params[:visibility_levels].present?
...@@ -19,7 +19,7 @@ class Admin::ProjectsController < Admin::ApplicationController ...@@ -19,7 +19,7 @@ class Admin::ProjectsController < Admin::ApplicationController
end end
def transfer def transfer
result = ::Projects::TransferContext.new(@project, current_user, project: params).execute(:admin) result = ::Projects::TransferService.new(@project, current_user, project: params).execute(:admin)
if result if result
redirect_to [:admin, @project] redirect_to [:admin, @project]
......
...@@ -68,7 +68,9 @@ class Admin::UsersController < Admin::ApplicationController ...@@ -68,7 +68,9 @@ class Admin::UsersController < Admin::ApplicationController
params[:user].delete(:password_confirmation) params[:user].delete(:password_confirmation)
end end
user.admin = (admin && admin.to_i > 0) if admin.present?
user.admin = !admin.to_i.zero?
end
respond_to do |format| respond_to do |format|
if user.update_attributes(params[:user], as: :admin) if user.update_attributes(params[:user], as: :admin)
...@@ -100,6 +102,6 @@ class Admin::UsersController < Admin::ApplicationController ...@@ -100,6 +102,6 @@ class Admin::UsersController < Admin::ApplicationController
protected protected
def user def user
@user ||= User.find_by_username!(params[:id]) @user ||= User.find_by!(username: params[:id])
end end
end end
...@@ -135,12 +135,12 @@ class ApplicationController < ActionController::Base ...@@ -135,12 +135,12 @@ class ApplicationController < ActionController::Base
end end
end end
def render_404 def render_403
render file: Rails.root.join("public", "404"), layout: false, status: "404" head :forbidden
end end
def render_403 def render_404
render file: Rails.root.join("public", "403"), layout: false, status: "403" render file: Rails.root.join("public", "404"), layout: false, status: "404"
end end
def require_non_empty_project def require_non_empty_project
...@@ -154,7 +154,6 @@ class ApplicationController < ActionController::Base ...@@ -154,7 +154,6 @@ class ApplicationController < ActionController::Base
end end
def dev_tools def dev_tools
Rack::MiniProfiler.authorize_request
end end
def default_headers def default_headers
...@@ -171,6 +170,7 @@ class ApplicationController < ActionController::Base ...@@ -171,6 +170,7 @@ class ApplicationController < ActionController::Base
gon.api_token = current_user.private_token if current_user gon.api_token = current_user.private_token if current_user
gon.gravatar_url = request.ssl? || Gitlab.config.gitlab.https ? Gitlab.config.gravatar.ssl_url : Gitlab.config.gravatar.plain_url gon.gravatar_url = request.ssl? || Gitlab.config.gitlab.https ? Gitlab.config.gravatar.ssl_url : Gitlab.config.gravatar.plain_url
gon.relative_url_root = Gitlab.config.gitlab.relative_url_root gon.relative_url_root = Gitlab.config.gitlab.relative_url_root
gon.gravatar_enabled = Gitlab.config.gravatar.enabled
end end
def check_password_expiration def check_password_expiration
...@@ -207,7 +207,11 @@ class ApplicationController < ActionController::Base ...@@ -207,7 +207,11 @@ class ApplicationController < ActionController::Base
end end
def configure_permitted_parameters def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email, :password) } devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email, :password, :login, :remember_me) }
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :name, :password, :password_confirmation) } devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :name, :password, :password_confirmation) }
end end
def hexdigest(string)
Digest::SHA1.hexdigest string
end
end end
...@@ -3,6 +3,8 @@ class DashboardController < ApplicationController ...@@ -3,6 +3,8 @@ class DashboardController < ApplicationController
before_filter :load_projects, except: [:projects] before_filter :load_projects, except: [:projects]
before_filter :event_filter, only: :show before_filter :event_filter, only: :show
before_filter :default_filter, only: [:issues, :merge_requests]
def show def show
# Fetch only 30 projects. # Fetch only 30 projects.
...@@ -39,7 +41,7 @@ class DashboardController < ApplicationController ...@@ -39,7 +41,7 @@ class DashboardController < ApplicationController
current_user.authorized_projects current_user.authorized_projects
end end
@projects = @projects.where(namespace_id: Group.find_by_name(params[:group])) if params[:group].present? @projects = @projects.where(namespace_id: Group.find_by(name: params[:group])) if params[:group].present?
@projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present? @projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present?
@projects = @projects.includes(:namespace) @projects = @projects.includes(:namespace)
@projects = @projects.tagged_with(params[:label]) if params[:label].present? @projects = @projects.tagged_with(params[:label]) if params[:label].present?
...@@ -51,14 +53,15 @@ class DashboardController < ApplicationController ...@@ -51,14 +53,15 @@ class DashboardController < ApplicationController
end end
def merge_requests def merge_requests
@merge_requests = FilterContext.new(MergeRequest, current_user, params).execute @merge_requests = MergeRequestsFinder.new.execute(current_user, params)
@merge_requests = @merge_requests.recent.page(params[:page]).per(20) @merge_requests = @merge_requests.page(params[:page]).per(20)
@merge_requests = @merge_requests.preload(:author, :target_project)
end end
def issues def issues
@issues = FilterContext.new(Issue, current_user, params).execute @issues = IssuesFinder.new.execute(current_user, params)
@issues = @issues.recent.page(params[:page]).per(20) @issues = @issues.page(params[:page]).per(20)
@issues = @issues.includes(:author, :project) @issues = @issues.preload(:author, :project)
respond_to do |format| respond_to do |format|
format.html format.html
...@@ -71,4 +74,10 @@ class DashboardController < ApplicationController ...@@ -71,4 +74,10 @@ class DashboardController < ApplicationController
def load_projects def load_projects
@projects = current_user.authorized_projects.sorted_by_activity.non_archived @projects = current_user.authorized_projects.sorted_by_activity.non_archived
end end
def default_filter
params[:scope] = 'assigned-to-me' if params[:scope].blank?
params[:state] = 'opened' if params[:state].blank?
params[:authorized_only] = true
end
end end
class ErrorsController < ApplicationController
end
class Groups::AvatarsController < ApplicationController
layout "profile"
def destroy
@group = Group.find_by(path: params[:group_id])
@group.remove_avatar!
@group.save
redirect_to edit_group_path(@group)
end
end
class GroupsController < ApplicationController class GroupsController < ApplicationController
skip_before_filter :authenticate_user!, only: [:show, :issues, :members, :merge_requests]
respond_to :html respond_to :html
before_filter :group, except: [:new, :create] before_filter :group, except: [:new, :create]
...@@ -10,6 +11,8 @@ class GroupsController < ApplicationController ...@@ -10,6 +11,8 @@ class GroupsController < ApplicationController
# Load group projects # Load group projects
before_filter :projects, except: [:new, :create] before_filter :projects, except: [:new, :create]
before_filter :default_filter, only: [:issues, :merge_requests]
layout :determine_layout layout :determine_layout
before_filter :set_title, only: [:new, :create] before_filter :set_title, only: [:new, :create]
...@@ -34,7 +37,7 @@ class GroupsController < ApplicationController ...@@ -34,7 +37,7 @@ class GroupsController < ApplicationController
@events = Event.in_projects(project_ids) @events = Event.in_projects(project_ids)
@events = event_filter.apply_filter(@events) @events = event_filter.apply_filter(@events)
@events = @events.limit(20).offset(params[:offset] || 0) @events = @events.limit(20).offset(params[:offset] || 0)
@last_push = current_user.recent_push @last_push = current_user.recent_push if current_user
respond_to do |format| respond_to do |format|
format.html format.html
...@@ -43,19 +46,16 @@ class GroupsController < ApplicationController ...@@ -43,19 +46,16 @@ class GroupsController < ApplicationController
end end
end end
# Get authored or assigned open merge requests
def merge_requests def merge_requests
@merge_requests = FilterContext.new(MergeRequest, current_user, params).execute @merge_requests = MergeRequestsFinder.new.execute(current_user, params)
@merge_requests = @merge_requests.of_group(@group) @merge_requests = @merge_requests.page(params[:page]).per(20)
@merge_requests = @merge_requests.recent.page(params[:page]).per(20) @merge_requests = @merge_requests.preload(:author, :target_project)
end end
# Get only assigned issues
def issues def issues
@issues = FilterContext.new(Issue, current_user, params).execute @issues = IssuesFinder.new.execute(current_user, params)
@issues = @issues.of_group(@group) @issues = @issues.page(params[:page]).per(20)
@issues = @issues.recent.page(params[:page]).per(20) @issues = @issues.preload(:author, :project)
@issues = @issues.includes(:author, :project)
respond_to do |format| respond_to do |format|
format.html format.html
...@@ -65,7 +65,14 @@ class GroupsController < ApplicationController ...@@ -65,7 +65,14 @@ class GroupsController < ApplicationController
def members def members
@project = group.projects.find(params[:project_id]) if params[:project_id] @project = group.projects.find(params[:project_id]) if params[:project_id]
@members = group.users_groups.order('group_access DESC') @members = group.users_groups
if params[:search].present?
users = group.users.search(params[:search])
@members = @members.where(user_id: users)
end
@members = @members.order('group_access DESC').page(params[:page]).per(50)
@users_group = UsersGroup.new @users_group = UsersGroup.new
end end
...@@ -89,21 +96,25 @@ class GroupsController < ApplicationController ...@@ -89,21 +96,25 @@ class GroupsController < ApplicationController
protected protected
def group def group
@group ||= Group.find_by_path(params[:id]) @group ||= Group.find_by(path: params[:id])
end end
def projects def projects
@projects ||= current_user.authorized_projects.where(namespace_id: group.id).sorted_by_activity @projects ||= ProjectsFinder.new.execute(current_user, group: group)
end end
def project_ids def project_ids
projects.map(&:id) projects.pluck(:id)
end end
# Dont allow unauthorized access to group # Dont allow unauthorized access to group
def authorize_read_group! def authorize_read_group!
unless @group and (projects.present? or can?(current_user, :read_group, @group)) unless @group and (projects.present? or can?(current_user, :read_group, @group))
return render_404 if current_user.nil?
return authenticate_user!
else
return render_404
end
end end
end end
...@@ -126,8 +137,22 @@ class GroupsController < ApplicationController ...@@ -126,8 +137,22 @@ class GroupsController < ApplicationController
def determine_layout def determine_layout
if [:new, :create].include?(action_name.to_sym) if [:new, :create].include?(action_name.to_sym)
'navless' 'navless'
else elsif current_user
'group' 'group'
else
'public_group'
end
end
def default_filter
if params[:scope].blank?
if current_user
params[:scope] = 'assigned-to-me'
else
params[:scope] = 'all'
end
end end
params[:state] = 'opened' if params[:state].blank?
params[:group_id] = @group.id
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.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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