Merge branch '4-0-stable' into stable
1
.gitignore
vendored
|
@ -23,3 +23,4 @@ db/data.yml
|
||||||
.idea
|
.idea
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.chef
|
.chef
|
||||||
|
vendor/bundle/*
|
||||||
|
|
|
@ -19,8 +19,7 @@ services:
|
||||||
before_script:
|
before_script:
|
||||||
- "cp config/database.yml.$DB config/database.yml"
|
- "cp config/database.yml.$DB config/database.yml"
|
||||||
- "cp config/gitlab.yml.example config/gitlab.yml"
|
- "cp config/gitlab.yml.example config/gitlab.yml"
|
||||||
- "bundle exec rake db:create RAILS_ENV=test"
|
- "bundle exec rake db:setup RAILS_ENV=test"
|
||||||
- "bundle exec rake db:migrate RAILS_ENV=test"
|
|
||||||
- "bundle exec rake db:seed_fu RAILS_ENV=test"
|
- "bundle exec rake db:seed_fu RAILS_ENV=test"
|
||||||
- "sh -e /etc/init.d/xvfb start"
|
- "sh -e /etc/init.d/xvfb start"
|
||||||
script: "bundle exec rake travis --trace"
|
script: "bundle exec rake travis --trace"
|
||||||
|
|
34
CHANGELOG
|
@ -1,3 +1,35 @@
|
||||||
|
v 4.0.0
|
||||||
|
- Remove project code and path from API. Use id instead
|
||||||
|
- Return valid clonable url to repo for web hook
|
||||||
|
- Fixed backup issue
|
||||||
|
- Reorganized settings
|
||||||
|
- Fixed commits compare
|
||||||
|
- Refactored scss
|
||||||
|
- Improve status checks
|
||||||
|
- Validates presence of User#name
|
||||||
|
- Fixed postgres support
|
||||||
|
- Removed sqlite support
|
||||||
|
- Modified post-receive hook
|
||||||
|
- Milestones can be closed now
|
||||||
|
- Show comment events on dashboard
|
||||||
|
- Quick add team members via group#people page
|
||||||
|
- [API] expose created date for hooks and SSH keys
|
||||||
|
- [API] list, create issue notes
|
||||||
|
- [API] list, create snippet notes
|
||||||
|
- [API] list, create wall notes
|
||||||
|
- Remove project code - use path instead
|
||||||
|
- added username field to user
|
||||||
|
- rake task to fill usernames based on emails create namespaces for users
|
||||||
|
- STI Group < Namespace
|
||||||
|
- Project has namespace_id
|
||||||
|
- Projects with namespaces also namespaced in gitolite and stored in subdir
|
||||||
|
- Moving project to group will move it under group namespace
|
||||||
|
- Ability to move project from namespaces to another
|
||||||
|
- Fixes commit patches getting escaped (see #2036)
|
||||||
|
- Support diff and patch generation for commits and merge request
|
||||||
|
- MergeReqest doesn't generate a temporary file for the patch any more
|
||||||
|
- Update the UI to allow downloading Patch or Diff
|
||||||
|
|
||||||
v 3.1.0
|
v 3.1.0
|
||||||
- Updated gems
|
- Updated gems
|
||||||
- Services: Gitlab CI integration
|
- Services: Gitlab CI integration
|
||||||
|
@ -34,7 +66,7 @@ v 3.0.0
|
||||||
- Fixed bug with gitolite keys
|
- Fixed bug with gitolite keys
|
||||||
- UI improved
|
- UI improved
|
||||||
- Increased perfomance of application
|
- Increased perfomance of application
|
||||||
- Show user avatar in last commit when browsing Files
|
- Show user avatar in last commit when browsing Files
|
||||||
- Refactored Gitlab::Merge
|
- Refactored Gitlab::Merge
|
||||||
- Use Font Awsome for icons
|
- Use Font Awsome for icons
|
||||||
- Separate observing of Note and MergeRequestsa
|
- Separate observing of Note and MergeRequestsa
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
## Contribute to GitLab
|
# Contact & support
|
||||||
|
|
||||||
If you want to contribute to GitLab, follow this process:
|
If you want quick help, head over to our [Support Forum](https://groups.google.com/forum/#!forum/gitlabhq).
|
||||||
|
Otherwise you can follow our [Issue Submission Guide](https://github.com/gitlabhq/gitlabhq/wiki/Issue-Submission-Guide) for a more systematic and thorough guide to solving your issues.
|
||||||
|
|
||||||
1. Fork the project
|
|
||||||
2. Create a feature branch
|
|
||||||
3. Code
|
|
||||||
4. Create a pull request
|
|
||||||
|
|
||||||
We will only accept pull requests if:
|
|
||||||
|
|
||||||
* Your code has proper tests and all tests pass
|
# Contribute to GitLab
|
||||||
* Your code can be merged w/o problems
|
|
||||||
* It won't break existing functionality
|
|
||||||
* It's quality code
|
|
||||||
* We like it :)
|
|
||||||
|
|
||||||
For examples of feedback on pull requests please look at the [closed pull requests](https://github.com/gitlabhq/gitlabhq/pulls?direction=desc&page=1&sort=created&state=closed).
|
## Recipes
|
||||||
|
|
||||||
## Installation
|
We collect user submitted installation scripts and config file templates for platforms we don't support officially.
|
||||||
|
We believe there is merit in allowing a certain amount of diversity.
|
||||||
|
You can get and submit your solution to running/configuring GitLab with your favorite OS/distro, database, web server, cloud hoster, configuration management tool, etc.
|
||||||
|
|
||||||
Install the Gitlab development in a virtual machine with the [Gitlab Vagrant virtual machine](https://github.com/gitlabhq/gitlab-vagrant-vm). Installing it in a virtual machine makes it much easier to set up all the dependencies for integration testing.
|
Help us improve the collection of [GitLab Recipes](https://github.com/gitlabhq/gitlab-recipes/)
|
||||||
|
|
||||||
## Running tests
|
|
||||||
|
|
||||||
For more information on running the tests please read the [development tips](https://github.com/gitlabhq/gitlabhq/blob/master/doc/development.md)
|
## Feature suggestions
|
||||||
|
|
||||||
|
Follow the [Issue Submission Guide](https://github.com/gitlabhq/gitlabhq/wiki/Issue-Submission-Guide) and support other peoples ideas or propose your own.
|
||||||
|
|
||||||
|
|
||||||
|
## Code
|
||||||
|
|
||||||
|
Follow our [Developer Guide](https://github.com/gitlabhq/gitlabhq/wiki/Developer-Guide) to set you up for hacking on GitLab.
|
||||||
|
|
15
Gemfile
|
@ -11,7 +11,6 @@ end
|
||||||
gem "rails", "3.2.9"
|
gem "rails", "3.2.9"
|
||||||
|
|
||||||
# Supported DBs
|
# Supported DBs
|
||||||
gem "sqlite3", group: :sqlite
|
|
||||||
gem "mysql2", group: :mysql
|
gem "mysql2", group: :mysql
|
||||||
gem "pg", group: :postgres
|
gem "pg", group: :postgres
|
||||||
|
|
||||||
|
@ -27,13 +26,13 @@ gem "grit", git: "https://github.com/gitlabhq/grit.git", ref:
|
||||||
gem "omniauth-ldap", git: "https://github.com/gitlabhq/omniauth-ldap.git", ref: 'f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e'
|
gem "omniauth-ldap", git: "https://github.com/gitlabhq/omniauth-ldap.git", ref: 'f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e'
|
||||||
gem 'yaml_db', git: "https://github.com/gitlabhq/yaml_db.git", ref: '98e9a5dca43e3fedd3268c76a73af40d1bdf1dfd'
|
gem 'yaml_db', git: "https://github.com/gitlabhq/yaml_db.git", ref: '98e9a5dca43e3fedd3268c76a73af40d1bdf1dfd'
|
||||||
gem 'grack', git: "https://github.com/gitlabhq/grack.git", ref: 'ba46f3b0845c6a09d488ae6abdce6ede37e227e8'
|
gem 'grack', git: "https://github.com/gitlabhq/grack.git", ref: 'ba46f3b0845c6a09d488ae6abdce6ede37e227e8'
|
||||||
gem 'grit_ext', git: "https://github.com/gitlabhq/grit_ext.git", ref: '212fd40bea61f3c6a167223768e7295dc32bbc10'
|
gem 'grit_ext', git: "https://github.com/gitlabhq/grit_ext.git", ref: '8e6afc2da821354774aa4d1ee8a1aa2082f84a3e'
|
||||||
|
|
||||||
# Gitolite client (for work with gitolite-admin repo)
|
# Gitolite client (for work with gitolite-admin repo)
|
||||||
gem "gitolite", '1.1.0'
|
gem "gitolite", '1.1.0'
|
||||||
|
|
||||||
# Syntax highlighter
|
# Syntax highlighter
|
||||||
gem "pygments.rb", git: "https://github.com/gitlabhq/pygments.rb.git", ref: '4db80c599067e2d5f23c5c243bf85b8ca0368ad4'
|
gem "pygments.rb", git: "https://github.com/gitlabhq/pygments.rb.git", branch: "master"
|
||||||
|
|
||||||
# Language detection
|
# Language detection
|
||||||
gem "github-linguist", "~> 2.3.4" , require: "linguist"
|
gem "github-linguist", "~> 2.3.4" , require: "linguist"
|
||||||
|
@ -101,11 +100,11 @@ group :assets do
|
||||||
gem "therubyracer"
|
gem "therubyracer"
|
||||||
|
|
||||||
gem 'chosen-rails', "0.9.8"
|
gem 'chosen-rails', "0.9.8"
|
||||||
gem 'jquery-atwho-rails', "0.1.6"
|
gem 'jquery-atwho-rails', "0.1.7"
|
||||||
gem "jquery-rails", "2.1.3"
|
gem "jquery-rails", "2.1.3"
|
||||||
gem "jquery-ui-rails", "2.0.2"
|
gem "jquery-ui-rails", "2.0.2"
|
||||||
gem "modernizr", "2.6.2"
|
gem "modernizr", "2.6.2"
|
||||||
gem "raphael-rails", "2.1.0"
|
gem "raphael-rails", "1.5.2"
|
||||||
gem 'bootstrap-sass', "2.2.1.1"
|
gem 'bootstrap-sass', "2.2.1.1"
|
||||||
gem "font-awesome-sass-rails", "~> 2.0.0"
|
gem "font-awesome-sass-rails", "~> 2.0.0"
|
||||||
gem "gemoji", "~> 1.2.1", require: 'emoji/railtie'
|
gem "gemoji", "~> 1.2.1", require: 'emoji/railtie'
|
||||||
|
@ -125,7 +124,7 @@ group :development, :test do
|
||||||
gem "capybara"
|
gem "capybara"
|
||||||
gem "pry"
|
gem "pry"
|
||||||
gem "awesome_print"
|
gem "awesome_print"
|
||||||
gem "database_cleaner"
|
gem "database_cleaner", ref: "f89c34300e114be99532f14c115b2799a3380ac6", git: "https://github.com/bmabey/database_cleaner.git"
|
||||||
gem "launchy"
|
gem "launchy"
|
||||||
gem 'factory_girl_rails'
|
gem 'factory_girl_rails'
|
||||||
|
|
||||||
|
@ -139,7 +138,7 @@ group :development, :test do
|
||||||
gem 'rb-inotify', require: linux_only('rb-inotify')
|
gem 'rb-inotify', require: linux_only('rb-inotify')
|
||||||
|
|
||||||
# PhantomJS driver for Capybara
|
# PhantomJS driver for Capybara
|
||||||
gem 'poltergeist'
|
gem 'poltergeist', git: 'https://github.com/jonleighton/poltergeist.git', ref: '5c2e092001074a8cf09f332d3714e9ba150bc8ca'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
|
@ -152,5 +151,5 @@ group :test do
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production do
|
group :production do
|
||||||
gem "gitlab_meta", '3.1'
|
gem "gitlab_meta", '4.0'
|
||||||
end
|
end
|
||||||
|
|
54
Gemfile.lock
|
@ -1,3 +1,10 @@
|
||||||
|
GIT
|
||||||
|
remote: https://github.com/bmabey/database_cleaner.git
|
||||||
|
revision: f89c34300e114be99532f14c115b2799a3380ac6
|
||||||
|
ref: f89c34300e114be99532f14c115b2799a3380ac6
|
||||||
|
specs:
|
||||||
|
database_cleaner (0.9.1)
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: https://github.com/ctran/annotate_models.git
|
remote: https://github.com/ctran/annotate_models.git
|
||||||
revision: be4e26825b521f0b2d86b181e2dff89901aa9b1e
|
revision: be4e26825b521f0b2d86b181e2dff89901aa9b1e
|
||||||
|
@ -26,10 +33,10 @@ GIT
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: https://github.com/gitlabhq/grit_ext.git
|
remote: https://github.com/gitlabhq/grit_ext.git
|
||||||
revision: 212fd40bea61f3c6a167223768e7295dc32bbc10
|
revision: 8e6afc2da821354774aa4d1ee8a1aa2082f84a3e
|
||||||
ref: 212fd40bea61f3c6a167223768e7295dc32bbc10
|
ref: 8e6afc2da821354774aa4d1ee8a1aa2082f84a3e
|
||||||
specs:
|
specs:
|
||||||
grit_ext (0.6.0)
|
grit_ext (0.6.1)
|
||||||
charlock_holmes (~> 0.6.9)
|
charlock_holmes (~> 0.6.9)
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
|
@ -45,8 +52,8 @@ GIT
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: https://github.com/gitlabhq/pygments.rb.git
|
remote: https://github.com/gitlabhq/pygments.rb.git
|
||||||
revision: 4db80c599067e2d5f23c5c243bf85b8ca0368ad4
|
revision: db1da0343adf86b49bdc3add04d02d2e80438d38
|
||||||
ref: 4db80c599067e2d5f23c5c243bf85b8ca0368ad4
|
branch: master
|
||||||
specs:
|
specs:
|
||||||
pygments.rb (0.3.2)
|
pygments.rb (0.3.2)
|
||||||
posix-spawn (~> 0.3.6)
|
posix-spawn (~> 0.3.6)
|
||||||
|
@ -59,6 +66,18 @@ GIT
|
||||||
specs:
|
specs:
|
||||||
yaml_db (0.2.2)
|
yaml_db (0.2.2)
|
||||||
|
|
||||||
|
GIT
|
||||||
|
remote: https://github.com/jonleighton/poltergeist.git
|
||||||
|
revision: 5c2e092001074a8cf09f332d3714e9ba150bc8ca
|
||||||
|
ref: 5c2e092001074a8cf09f332d3714e9ba150bc8ca
|
||||||
|
specs:
|
||||||
|
poltergeist (1.0.2)
|
||||||
|
capybara (~> 1.1)
|
||||||
|
childprocess (~> 0.3)
|
||||||
|
faye-websocket (~> 0.4, >= 0.4.4)
|
||||||
|
http_parser.rb (~> 0.5.3)
|
||||||
|
multi_json (~> 1.0)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: http://rubygems.org/
|
remote: http://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
|
@ -128,7 +147,6 @@ GEM
|
||||||
colorize (0.5.8)
|
colorize (0.5.8)
|
||||||
crack (0.3.1)
|
crack (0.3.1)
|
||||||
daemons (1.1.9)
|
daemons (1.1.9)
|
||||||
database_cleaner (0.9.1)
|
|
||||||
devise (2.1.2)
|
devise (2.1.2)
|
||||||
bcrypt-ruby (~> 3.0)
|
bcrypt-ruby (~> 3.0)
|
||||||
orm_adapter (~> 0.1)
|
orm_adapter (~> 0.1)
|
||||||
|
@ -171,7 +189,7 @@ GEM
|
||||||
mime-types (~> 1.19)
|
mime-types (~> 1.19)
|
||||||
pygments.rb (>= 0.2.13)
|
pygments.rb (>= 0.2.13)
|
||||||
github-markup (0.7.4)
|
github-markup (0.7.4)
|
||||||
gitlab_meta (3.1)
|
gitlab_meta (4.0)
|
||||||
gitolite (1.1.0)
|
gitolite (1.1.0)
|
||||||
gratr19 (~> 0.4.4.1)
|
gratr19 (~> 0.4.4.1)
|
||||||
grit (~> 2.5.0)
|
grit (~> 2.5.0)
|
||||||
|
@ -215,7 +233,7 @@ GEM
|
||||||
httpauth (0.2.0)
|
httpauth (0.2.0)
|
||||||
i18n (0.6.1)
|
i18n (0.6.1)
|
||||||
journey (1.0.4)
|
journey (1.0.4)
|
||||||
jquery-atwho-rails (0.1.6)
|
jquery-atwho-rails (0.1.7)
|
||||||
jquery-rails (2.1.3)
|
jquery-rails (2.1.3)
|
||||||
railties (>= 3.1.0, < 5.0)
|
railties (>= 3.1.0, < 5.0)
|
||||||
thor (~> 0.14)
|
thor (~> 0.14)
|
||||||
|
@ -279,12 +297,6 @@ GEM
|
||||||
omniauth-oauth (~> 1.0)
|
omniauth-oauth (~> 1.0)
|
||||||
orm_adapter (0.4.0)
|
orm_adapter (0.4.0)
|
||||||
pg (0.14.1)
|
pg (0.14.1)
|
||||||
poltergeist (1.0.2)
|
|
||||||
capybara (~> 1.1)
|
|
||||||
childprocess (~> 0.3)
|
|
||||||
faye-websocket (~> 0.4, >= 0.4.4)
|
|
||||||
http_parser.rb (~> 0.5.3)
|
|
||||||
multi_json (~> 1.0)
|
|
||||||
polyglot (0.3.3)
|
polyglot (0.3.3)
|
||||||
posix-spawn (0.3.6)
|
posix-spawn (0.3.6)
|
||||||
pry (0.9.10)
|
pry (0.9.10)
|
||||||
|
@ -329,7 +341,7 @@ GEM
|
||||||
thor (>= 0.14.6, < 2.0)
|
thor (>= 0.14.6, < 2.0)
|
||||||
raindrops (0.10.0)
|
raindrops (0.10.0)
|
||||||
rake (10.0.1)
|
rake (10.0.1)
|
||||||
raphael-rails (2.1.0)
|
raphael-rails (1.5.2)
|
||||||
rb-fsevent (0.9.2)
|
rb-fsevent (0.9.2)
|
||||||
rb-inotify (0.8.8)
|
rb-inotify (0.8.8)
|
||||||
ffi (>= 0.5.0)
|
ffi (>= 0.5.0)
|
||||||
|
@ -404,7 +416,6 @@ GEM
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
rack (~> 1.0)
|
rack (~> 1.0)
|
||||||
tilt (~> 1.1, != 1.3.0)
|
tilt (~> 1.1, != 1.3.0)
|
||||||
sqlite3 (1.3.6)
|
|
||||||
stamp (0.3.0)
|
stamp (0.3.0)
|
||||||
test_after_commit (0.0.1)
|
test_after_commit (0.0.1)
|
||||||
therubyracer (0.10.2)
|
therubyracer (0.10.2)
|
||||||
|
@ -453,7 +464,7 @@ DEPENDENCIES
|
||||||
chosen-rails (= 0.9.8)
|
chosen-rails (= 0.9.8)
|
||||||
coffee-rails (~> 3.2.2)
|
coffee-rails (~> 3.2.2)
|
||||||
colored
|
colored
|
||||||
database_cleaner
|
database_cleaner!
|
||||||
devise (~> 2.1.0)
|
devise (~> 2.1.0)
|
||||||
draper (~> 0.18.0)
|
draper (~> 0.18.0)
|
||||||
email_spec
|
email_spec
|
||||||
|
@ -465,7 +476,7 @@ DEPENDENCIES
|
||||||
git
|
git
|
||||||
github-linguist (~> 2.3.4)
|
github-linguist (~> 2.3.4)
|
||||||
github-markup (~> 0.7.4)
|
github-markup (~> 0.7.4)
|
||||||
gitlab_meta (= 3.1)
|
gitlab_meta (= 4.0)
|
||||||
gitolite (= 1.1.0)
|
gitolite (= 1.1.0)
|
||||||
grack!
|
grack!
|
||||||
grape (~> 0.2.1)
|
grape (~> 0.2.1)
|
||||||
|
@ -476,7 +487,7 @@ DEPENDENCIES
|
||||||
guard-spinach
|
guard-spinach
|
||||||
haml-rails (~> 0.3.5)
|
haml-rails (~> 0.3.5)
|
||||||
httparty
|
httparty
|
||||||
jquery-atwho-rails (= 0.1.6)
|
jquery-atwho-rails (= 0.1.7)
|
||||||
jquery-rails (= 2.1.3)
|
jquery-rails (= 2.1.3)
|
||||||
jquery-ui-rails (= 2.0.2)
|
jquery-ui-rails (= 2.0.2)
|
||||||
kaminari (~> 0.14.1)
|
kaminari (~> 0.14.1)
|
||||||
|
@ -490,14 +501,14 @@ DEPENDENCIES
|
||||||
omniauth-ldap!
|
omniauth-ldap!
|
||||||
omniauth-twitter
|
omniauth-twitter
|
||||||
pg
|
pg
|
||||||
poltergeist
|
poltergeist!
|
||||||
pry
|
pry
|
||||||
pygments.rb!
|
pygments.rb!
|
||||||
quiet_assets (~> 1.0.1)
|
quiet_assets (~> 1.0.1)
|
||||||
rack-mini-profiler
|
rack-mini-profiler
|
||||||
rails (= 3.2.9)
|
rails (= 3.2.9)
|
||||||
rails-dev-tweaks
|
rails-dev-tweaks
|
||||||
raphael-rails (= 2.1.0)
|
raphael-rails (= 1.5.2)
|
||||||
rb-fsevent
|
rb-fsevent
|
||||||
rb-inotify
|
rb-inotify
|
||||||
redcarpet (~> 2.2.2)
|
redcarpet (~> 2.2.2)
|
||||||
|
@ -512,7 +523,6 @@ DEPENDENCIES
|
||||||
simplecov
|
simplecov
|
||||||
six
|
six
|
||||||
spinach-rails
|
spinach-rails
|
||||||
sqlite3
|
|
||||||
stamp
|
stamp
|
||||||
test_after_commit
|
test_after_commit
|
||||||
therubyracer
|
therubyracer
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Welcome to GitLab [![build status](https://secure.travis-ci.org/gitlabhq/gitlabhq.png)](https://secure.travis-ci.org/gitlabhq/gitlabhq) [![build status](https://secure.travis-ci.org/gitlabhq/grit.png)](https://secure.travis-ci.org/gitlabhq/grit) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/gitlabhq/gitlabhq)
|
# Welcome to GitLab [![build status](https://secure.travis-ci.org/gitlabhq/gitlabhq.png)](https://travis-ci.org/gitlabhq/gitlabhq) [![build status](https://secure.travis-ci.org/gitlabhq/grit.png)](https://travis-ci.org/gitlabhq/grit) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/gitlabhq/gitlabhq) [![Dependency Status](https://gemnasium.com/gitlabhq/gitlabhq.png)](https://gemnasium.com/gitlabhq/gitlabhq)
|
||||||
|
|
||||||
GitLab is a free project and repository management application
|
GitLab is a free project and repository management application
|
||||||
|
|
||||||
|
|
2
VERSION
|
@ -1 +1 @@
|
||||||
3.1.0
|
4.0.0
|
||||||
|
|
BIN
app/assets/images/ajax_loader_gray.gif
Normal file
After Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.3 KiB |
BIN
app/assets/images/switch_icon.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
|
@ -10,3 +10,8 @@ $ ->
|
||||||
$('.log-tabs a').click (e) ->
|
$('.log-tabs a').click (e) ->
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
$(this).tab('show')
|
$(this).tab('show')
|
||||||
|
|
||||||
|
$('.log-bottom').click (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
visible_log = $(".file_content:visible")
|
||||||
|
visible_log.animate({ scrollTop: visible_log.find('ol').height() }, "fast")
|
||||||
|
|
|
@ -1,52 +1,38 @@
|
||||||
# Creates the variables for setting up GFM auto-completion
|
# Creates the variables for setting up GFM auto-completion
|
||||||
|
|
||||||
window.GitLab ?= {}
|
window.GitLab ?= {}
|
||||||
GitLab.GfmAutoComplete ?= {}
|
GitLab.GfmAutoComplete =
|
||||||
|
|
||||||
# Emoji
|
|
||||||
data = []
|
|
||||||
template = "<li data-value='${insert}'>${name} <img alt='${name}' height='20' src='${image}' width='20' /></li>"
|
|
||||||
GitLab.GfmAutoComplete.Emoji = {data, template}
|
|
||||||
|
|
||||||
# Team Members
|
|
||||||
data = []
|
|
||||||
url = '';
|
|
||||||
params = {private_token: '', page: 1}
|
|
||||||
GitLab.GfmAutoComplete.Members = {data, url, params}
|
|
||||||
|
|
||||||
# Add GFM auto-completion to all input fields, that accept GFM input.
|
|
||||||
GitLab.GfmAutoComplete.setup = ->
|
|
||||||
input = $('.js-gfm-input')
|
|
||||||
|
|
||||||
# Emoji
|
# Emoji
|
||||||
input.atWho ':',
|
Emoji:
|
||||||
data: GitLab.GfmAutoComplete.Emoji.data,
|
data: []
|
||||||
tpl: GitLab.GfmAutoComplete.Emoji.template
|
template: '<li data-value="${insert}">${name} <img alt="${name}" height="20" src="${image}" width="20" /></li>'
|
||||||
|
|
||||||
# Team Members
|
# Team Members
|
||||||
input.atWho '@', (query, callback) ->
|
Members:
|
||||||
(getMoreMembers = ->
|
data: []
|
||||||
$.getJSON(GitLab.GfmAutoComplete.Members.url, GitLab.GfmAutoComplete.Members.params)
|
url: ''
|
||||||
.success (members) ->
|
params:
|
||||||
# pick the data we need
|
private_token: ''
|
||||||
newMembersData = $.map(members, (m) -> m.name )
|
template: '<li data-value="${username}">${username} <small>${name}</small></li>'
|
||||||
|
|
||||||
# add the new page of data to the rest
|
# Add GFM auto-completion to all input fields, that accept GFM input.
|
||||||
$.merge(GitLab.GfmAutoComplete.Members.data, newMembersData)
|
setup: ->
|
||||||
|
input = $('.js-gfm-input')
|
||||||
|
|
||||||
# show the pop-up with a copy of the current data
|
# Emoji
|
||||||
callback(GitLab.GfmAutoComplete.Members.data[..])
|
input.atWho ':',
|
||||||
|
data: @Emoji.data
|
||||||
|
tpl: @Emoji.template
|
||||||
|
|
||||||
# are we past the last page?
|
# Team Members
|
||||||
if newMembersData.length is 0
|
input.atWho '@',
|
||||||
# set static data and stop callbacks
|
tpl: @Members.template
|
||||||
input.atWho '@',
|
callback: (query, callback) =>
|
||||||
data: GitLab.GfmAutoComplete.Members.data
|
request_params = $.extend({}, @Members.params, query: query)
|
||||||
callback: null
|
$.getJSON(@Members.url, request_params).done (members) =>
|
||||||
else
|
new_members_data = $.map(members, (m) ->
|
||||||
# get next page
|
username: m.username,
|
||||||
getMoreMembers()
|
name: m.name
|
||||||
|
)
|
||||||
|
callback(new_members_data)
|
||||||
|
|
||||||
# so the next request gets the next page
|
|
||||||
GitLab.GfmAutoComplete.Members.params.page += 1
|
|
||||||
).call()
|
|
||||||
|
|
|
@ -1,43 +1,3 @@
|
||||||
function switchToNewIssue(){
|
|
||||||
$(".issues_content").hide("fade", { direction: "left" }, 150, function(){
|
|
||||||
$('select#issue_assignee_id').chosen();
|
|
||||||
$('select#issue_milestone_id').chosen();
|
|
||||||
$("#new_issue_dialog").show("fade", { direction: "right" }, 150);
|
|
||||||
$('.top-tabs .add_new').hide();
|
|
||||||
disableButtonIfEmptyField("#issue_title", ".save-btn");
|
|
||||||
GitLab.GfmAutoComplete.setup();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function switchToEditIssue(){
|
|
||||||
$(".issues_content").hide("fade", { direction: "left" }, 150, function(){
|
|
||||||
$('select#issue_assignee_id').chosen();
|
|
||||||
$('select#issue_milestone_id').chosen();
|
|
||||||
$("#edit_issue_dialog").show("fade", { direction: "right" }, 150);
|
|
||||||
$('.add_new').hide();
|
|
||||||
disableButtonIfEmptyField("#issue_title", ".save-btn");
|
|
||||||
GitLab.GfmAutoComplete.setup();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function switchFromNewIssue(){
|
|
||||||
backToIssues();
|
|
||||||
}
|
|
||||||
|
|
||||||
function switchFromEditIssue(){
|
|
||||||
backToIssues();
|
|
||||||
}
|
|
||||||
|
|
||||||
function backToIssues(){
|
|
||||||
$("#edit_issue_dialog, #new_issue_dialog").hide("fade", { direction: "right" }, 150, function(){
|
|
||||||
$(".issues_content").show("fade", { direction: "left" }, 150, function() {
|
|
||||||
$("#edit_issue_dialog").html("");
|
|
||||||
$("#new_issue_dialog").html("");
|
|
||||||
$('.add_new').show();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function initIssuesSearch() {
|
function initIssuesSearch() {
|
||||||
var href = $('#issue_search_form').attr('action');
|
var href = $('#issue_search_form').attr('action');
|
||||||
var last_terms = '';
|
var last_terms = '';
|
||||||
|
@ -76,23 +36,15 @@ function issuesPage(){
|
||||||
$(this).closest("form").submit();
|
$(this).closest("form").submit();
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#new_issue_link").click(function(){
|
$('body').on('ajax:success', '.close_issue, .reopen_issue', function(){
|
||||||
updateNewIssueURL();
|
|
||||||
});
|
|
||||||
|
|
||||||
$('body').on('ajax:success', '.close_issue, .reopen_issue, #new_issue', function(){
|
|
||||||
var t = $(this),
|
var t = $(this),
|
||||||
totalIssues,
|
totalIssues,
|
||||||
reopen = t.hasClass('reopen_issue'),
|
reopen = t.hasClass('reopen_issue');
|
||||||
newIssue = false;
|
$('.issue_counter').each(function(){
|
||||||
if( this.id == 'new_issue' ){
|
|
||||||
newIssue = true;
|
|
||||||
}
|
|
||||||
$('.issue_counter, #new_issue').each(function(){
|
|
||||||
var issue = $(this);
|
var issue = $(this);
|
||||||
totalIssues = parseInt( $(this).html(), 10 );
|
totalIssues = parseInt( $(this).html(), 10 );
|
||||||
|
|
||||||
if( newIssue || ( reopen && issue.closest('.main_menu').length ) ){
|
if( reopen && issue.closest('.main_menu').length ){
|
||||||
$(this).html( totalIssues+1 );
|
$(this).html( totalIssues+1 );
|
||||||
}else {
|
}else {
|
||||||
$(this).html( totalIssues-1 );
|
$(this).html( totalIssues-1 );
|
||||||
|
@ -126,20 +78,3 @@ function issuesCheckChanged() {
|
||||||
$('.issues_filters').show();
|
$('.issues_filters').show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateNewIssueURL(){
|
|
||||||
var new_issue_link = $("#new_issue_link");
|
|
||||||
var milestone_id = $("#milestone_id").val();
|
|
||||||
var assignee_id = $("#assignee_id").val();
|
|
||||||
var new_href = "";
|
|
||||||
if(milestone_id){
|
|
||||||
new_href = "issue[milestone_id]=" + milestone_id + "&";
|
|
||||||
}
|
|
||||||
if(assignee_id){
|
|
||||||
new_href = new_href + "issue[assignee_id]=" + assignee_id;
|
|
||||||
}
|
|
||||||
if(new_href.length){
|
|
||||||
new_href = new_issue_link.attr("href") + "?" + new_href;
|
|
||||||
new_issue_link.attr("href", new_href);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
|
@ -7,6 +7,18 @@ window.slugify = (text) ->
|
||||||
window.ajaxGet = (url) ->
|
window.ajaxGet = (url) ->
|
||||||
$.ajax({type: "GET", url: url, dataType: "script"})
|
$.ajax({type: "GET", url: url, dataType: "script"})
|
||||||
|
|
||||||
|
window.errorMessage = (message) ->
|
||||||
|
ehtml = $("<p>")
|
||||||
|
ehtml.addClass("error_message")
|
||||||
|
ehtml.html(message)
|
||||||
|
ehtml
|
||||||
|
|
||||||
|
window.split = (val) ->
|
||||||
|
return val.split( /,\s*/ )
|
||||||
|
|
||||||
|
window.extractLast = (term) ->
|
||||||
|
return split( term ).pop()
|
||||||
|
|
||||||
# Disable button if text field is empty
|
# Disable button if text field is empty
|
||||||
window.disableButtonIfEmptyField = (field_selector, button_selector) ->
|
window.disableButtonIfEmptyField = (field_selector, button_selector) ->
|
||||||
field = $(field_selector)
|
field = $(field_selector)
|
||||||
|
@ -33,6 +45,11 @@ $ ->
|
||||||
# Bottom tooltip
|
# Bottom tooltip
|
||||||
$('.has_bottom_tooltip').tooltip(placement: 'bottom')
|
$('.has_bottom_tooltip').tooltip(placement: 'bottom')
|
||||||
|
|
||||||
|
# Flash
|
||||||
|
if (flash = $("#flash-container")).length > 0
|
||||||
|
flash.click -> $(@).slideUp("slow")
|
||||||
|
flash.slideDown "slow"
|
||||||
|
setTimeout (-> flash.slideUp("slow")), 3000
|
||||||
|
|
||||||
# Disable form buttons while a form is submitting
|
# Disable form buttons while a form is submitting
|
||||||
$('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) ->
|
$('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) ->
|
||||||
|
|
|
@ -14,14 +14,6 @@ var MergeRequest = {
|
||||||
$(".mr_show_all_commits").bind("click", function() {
|
$(".mr_show_all_commits").bind("click", function() {
|
||||||
self.showAllCommits();
|
self.showAllCommits();
|
||||||
});
|
});
|
||||||
|
|
||||||
$(".line_note_link, .line_note_reply_link").live("click", function(e) {
|
|
||||||
var form = $(".per_line_form");
|
|
||||||
$(this).parent().parent().after(form);
|
|
||||||
form.find("#note_line_code").val($(this).attr("line_code"));
|
|
||||||
form.show();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
initMergeWidget:
|
initMergeWidget:
|
||||||
|
@ -34,6 +26,12 @@ var MergeRequest = {
|
||||||
self.showState(data.state);
|
self.showState(data.state);
|
||||||
}, "json");
|
}, "json");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(self.opts.ci_enable){
|
||||||
|
$.get(self.opts.url_to_ci_check, function(data){
|
||||||
|
self.showCiState(data.status);
|
||||||
|
}, "json");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
initTabs:
|
initTabs:
|
||||||
|
@ -87,6 +85,11 @@ var MergeRequest = {
|
||||||
$(".automerge_widget." + state).show();
|
$(".automerge_widget." + state).show();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showCiState:
|
||||||
|
function(state){
|
||||||
|
$(".ci_widget").hide();
|
||||||
|
$(".ci_widget.ci-" + state).show();
|
||||||
|
},
|
||||||
|
|
||||||
loadDiff:
|
loadDiff:
|
||||||
function() {
|
function() {
|
||||||
|
|
|
@ -8,3 +8,13 @@ $ ->
|
||||||
|
|
||||||
# Go up the hierarchy and show the corresponding submission feedback element
|
# Go up the hierarchy and show the corresponding submission feedback element
|
||||||
$(@).closest('fieldset').find('.update-feedback').show('highlight', {color: '#DFF0D8'}, 500)
|
$(@).closest('fieldset').find('.update-feedback').show('highlight', {color: '#DFF0D8'}, 500)
|
||||||
|
|
||||||
|
$('.update-username form').on 'ajax:before', ->
|
||||||
|
$('.loading-gif').show()
|
||||||
|
$(this).find('.update-success').hide()
|
||||||
|
$(this).find('.update-failed').hide()
|
||||||
|
|
||||||
|
$('.update-username form').on 'ajax:complete', ->
|
||||||
|
$(this).find('.save-btn').removeAttr('disabled')
|
||||||
|
$(this).find('.save-btn').removeClass('disabled')
|
||||||
|
$(this).find('.loading-gif').hide()
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
window.Projects = ->
|
window.Projects = ->
|
||||||
$('#project_name').on 'change', ->
|
|
||||||
slug = slugify $(@).val()
|
|
||||||
$('#project_code, #project_path').val slug
|
|
||||||
|
|
||||||
$('.new_project, .edit_project').on 'ajax:before', ->
|
$('.new_project, .edit_project').on 'ajax:before', ->
|
||||||
$('.project_new_holder, .project_edit_holder').hide()
|
$('.project_new_holder, .project_edit_holder').hide()
|
||||||
$('.save-project-loader').show()
|
$('.save-project-loader').show()
|
||||||
|
@ -22,10 +18,3 @@ $ ->
|
||||||
# Ref switcher
|
# Ref switcher
|
||||||
$('.project-refs-select').on 'change', ->
|
$('.project-refs-select').on 'change', ->
|
||||||
$(@).parents('form').submit()
|
$(@).parents('form').submit()
|
||||||
|
|
||||||
class @GraphNav
|
|
||||||
@init: ->
|
|
||||||
$('.graph svg').css 'position', 'relative'
|
|
||||||
$('body').bind 'keyup', (e) ->
|
|
||||||
$('.graph svg').animate(left: '+=400') if e.keyCode is 37 # left
|
|
||||||
$('.graph svg').animate(left: '-=400') if e.keyCode is 39 # right
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ $ ->
|
||||||
return false
|
return false
|
||||||
|
|
||||||
$('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live 'click', (e) ->
|
$('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live 'click', (e) ->
|
||||||
History.pushState(null, null, $(@).attr('href'))
|
History.pushState(null, null, decodeURIComponent($(@).attr('href')))
|
||||||
return false
|
return false
|
||||||
|
|
||||||
History.Adapter.bind window, 'statechange', ->
|
History.Adapter.bind window, 'statechange', ->
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
/*
|
|
||||||
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
|
||||||
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
|
||||||
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
|
||||||
*= require jquery.ui.all
|
|
||||||
*= require jquery.ui.aristo
|
|
||||||
*= require jquery.atwho
|
|
||||||
*= require chosen
|
|
||||||
*= require_self
|
|
||||||
*= require main
|
|
||||||
*/
|
|
47
app/assets/stylesheets/application.scss
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
||||||
|
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
||||||
|
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
||||||
|
*= require jquery.ui.gitlab
|
||||||
|
*= require jquery.atwho
|
||||||
|
*= require chosen
|
||||||
|
*= require_self
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GitLab bootstrap:
|
||||||
|
*/
|
||||||
|
@import "gitlab_bootstrap.scss";
|
||||||
|
|
||||||
|
@import "common.scss";
|
||||||
|
@import "ref_select.scss";
|
||||||
|
|
||||||
|
@import "sections/header.scss";
|
||||||
|
@import "sections/nav.scss";
|
||||||
|
@import "sections/commits.scss";
|
||||||
|
@import "sections/issues.scss";
|
||||||
|
@import "sections/projects.scss";
|
||||||
|
@import "sections/snippets.scss";
|
||||||
|
@import "sections/votes.scss";
|
||||||
|
@import "sections/merge_requests.scss";
|
||||||
|
@import "sections/graph.scss";
|
||||||
|
@import "sections/events.scss";
|
||||||
|
@import "sections/themes.scss";
|
||||||
|
@import "sections/tree.scss";
|
||||||
|
@import "sections/notes.scss";
|
||||||
|
@import "sections/profile.scss";
|
||||||
|
@import "sections/login.scss";
|
||||||
|
@import "sections/editor.scss";
|
||||||
|
|
||||||
|
@import "highlight/white.scss";
|
||||||
|
@import "highlight/dark.scss";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UI themes:
|
||||||
|
*/
|
||||||
|
@import "themes/ui_basic.scss";
|
||||||
|
@import "themes/ui_mars.scss";
|
||||||
|
@import "themes/ui_modern.scss";
|
||||||
|
@import "themes/ui_gray.scss";
|
||||||
|
@import "themes/ui_color.scss";
|
||||||
|
|
|
@ -1,53 +1,45 @@
|
||||||
/** LAYOUT **/
|
/** LAYOUT **/
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin-bottom:20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
padding-top:0;
|
padding-top: 0;
|
||||||
z-index:5;
|
z-index: 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container .content {
|
.container .content {
|
||||||
margin:0 0;
|
margin: 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container .sidebar {
|
|
||||||
width: 200px;
|
|
||||||
height:100%;
|
|
||||||
min-height:450px;
|
|
||||||
float:right;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.visible_link,
|
.visible_link,
|
||||||
.author_link {
|
.author_link {
|
||||||
color: $link_color;
|
color: $link_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.help li { color:#111 }
|
.help li { color:$style_color; }
|
||||||
|
|
||||||
.back_link {
|
.back_link {
|
||||||
text-decoration:underline;
|
text-decoration: underline;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
padding:10px 0;
|
padding: 10px 0;
|
||||||
padding-bottom:0;
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info_link {
|
.info_link {
|
||||||
margin-right:5px;
|
margin-right: 5px;
|
||||||
float:left;
|
float: left;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width:20px;
|
width: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.download_repo_link {
|
.download_repo_link {
|
||||||
background: url("images.png") no-repeat 0 -48px;
|
background: url("images.png") no-repeat 0 -48px;
|
||||||
padding-left:20px;
|
padding-left: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
table a code {
|
table a code {
|
||||||
|
@ -61,32 +53,37 @@ table a code {
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading {
|
.loading {
|
||||||
margin:20px auto;
|
margin: 20px auto;
|
||||||
background: url(ajax_loader.gif) no-repeat center center;
|
background: url(ajax_loader.gif) no-repeat center center;
|
||||||
width:40px;
|
width: 40px;
|
||||||
height:40px;
|
height: 40px;
|
||||||
|
&.loading-gray {
|
||||||
|
background: url(ajax_loader_gray.gif) no-repeat center center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** FLASH message **/
|
/** FLASH message **/
|
||||||
#flash_container {
|
#flash-container {
|
||||||
height:50px;
|
height: 50px;
|
||||||
position:fixed;
|
position: fixed;
|
||||||
z-index:10001;
|
z-index: 10001;
|
||||||
top:0px;
|
top: 0px;
|
||||||
width:100%;
|
width: 100%;
|
||||||
margin-bottom:15px;
|
margin-bottom: 15px;
|
||||||
overflow:hidden;
|
overflow: hidden;
|
||||||
background:white;
|
background: white;
|
||||||
cursor:pointer;
|
cursor: pointer;
|
||||||
border-bottom:1px solid #ccc;
|
border-bottom: 1px solid #ccc;
|
||||||
|
text-align: center;
|
||||||
|
display: none;
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
color:#666;
|
color: #666;
|
||||||
font-size:18px;
|
font-size: 18px;
|
||||||
line-height:38px;
|
line-height: 38px;
|
||||||
padding-top:5px;
|
padding-top: 5px;
|
||||||
margin:2px;
|
margin: 2px;
|
||||||
font-weight:normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,40 +91,29 @@ table a code {
|
||||||
margin-right:50px
|
margin-right:50px
|
||||||
}
|
}
|
||||||
|
|
||||||
.handle:hover {
|
span.update-author {
|
||||||
cursor:move;
|
display: block;
|
||||||
|
color: #999;
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
strong {
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
span.update-author {
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
span.update-author {
|
|
||||||
color:#999;
|
|
||||||
font-weight:normal;
|
|
||||||
font-style:italic;
|
|
||||||
}
|
|
||||||
span.update-author strong {
|
|
||||||
font-weight:bold;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** UPDATE ITEM **/
|
|
||||||
span.update-author {
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
/** END UPDATE ITEM **/
|
|
||||||
.dashboard-loader {
|
.dashboard-loader {
|
||||||
float:left;
|
float: left;
|
||||||
margin:10px;
|
margin: 10px;
|
||||||
display:none;
|
display: none;
|
||||||
}
|
}
|
||||||
.user-mention {
|
.user-mention {
|
||||||
color:#2FA0BB;
|
color: #2FA0BB;
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.neib {
|
.neib {
|
||||||
margin-right:10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.label {
|
.label {
|
||||||
|
@ -136,9 +122,9 @@ span.update-author {
|
||||||
&.label-tag {
|
&.label-tag {
|
||||||
background: none;
|
background: none;
|
||||||
border: none;
|
border: none;
|
||||||
padding:4px 6px;
|
padding: 4px 6px;
|
||||||
color:#444;
|
color: #444;
|
||||||
text-shadow:0 0 1px #fff;
|
text-shadow: 0 0 1px #fff;
|
||||||
|
|
||||||
&.grouped {
|
&.grouped {
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -149,9 +135,9 @@ span.update-author {
|
||||||
&.label-issue {
|
&.label-issue {
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
padding:4px 6px;
|
padding: 4px 6px;
|
||||||
color:#444;
|
color: #444;
|
||||||
text-shadow:0 0 1px #fff;
|
text-shadow: 0 0 1px #fff;
|
||||||
|
|
||||||
&.grouped {
|
&.grouped {
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -201,21 +187,21 @@ form {
|
||||||
|
|
||||||
|
|
||||||
.field_with_errors {
|
.field_with_errors {
|
||||||
display:inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.breadcrumb {
|
ul.breadcrumb {
|
||||||
background:white;
|
background: white;
|
||||||
border:none;
|
border: none;
|
||||||
li {
|
li {
|
||||||
display: inline;
|
display: inline;
|
||||||
text-shadow: 0 1px 0 white
|
text-shadow: 0 1px 0 white
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color:#474D57;
|
color: #474D57;
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.arrow {
|
.arrow {
|
||||||
|
@ -225,31 +211,31 @@ ul.breadcrumb {
|
||||||
float: left;
|
float: left;
|
||||||
position: relative;
|
position: relative;
|
||||||
left: -10px;
|
left: -10px;
|
||||||
padding:0;
|
padding: 0;
|
||||||
margin:0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text] {
|
input[type=text] {
|
||||||
&.large_text {
|
&.large_text {
|
||||||
padding:6px;
|
padding: 6px;
|
||||||
font-size:16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input.git_clone_url {
|
input.git_clone_url {
|
||||||
width:325px;
|
width: 325px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.merge-request-form-holder {
|
.merge-request-form-holder {
|
||||||
select {
|
select {
|
||||||
width:300px;
|
width: 300px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Issues **/
|
/** Issues **/
|
||||||
#issue_assignee_id {
|
#issue_assignee_id {
|
||||||
width:300px;
|
width: 300px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#new_issue_dialog textarea{
|
#new_issue_dialog textarea{
|
||||||
|
@ -257,26 +243,11 @@ input.git_clone_url {
|
||||||
}
|
}
|
||||||
|
|
||||||
.project_list_url {
|
.project_list_url {
|
||||||
width:250px;
|
width: 250px;
|
||||||
background:#fff !important;
|
background:#fff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** bordered list **/
|
|
||||||
ul.bordered-list {
|
|
||||||
margin:5px 0px;
|
|
||||||
padding:0px;
|
|
||||||
li {
|
|
||||||
padding: 5px 0;
|
|
||||||
border-bottom: 1px solid #EEE;
|
|
||||||
overflow: hidden;
|
|
||||||
display: block;
|
|
||||||
margin:0px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.bordered-list li:last-child { border:none }
|
|
||||||
|
|
||||||
.line_holder {
|
.line_holder {
|
||||||
&:hover {
|
&:hover {
|
||||||
td {
|
td {
|
||||||
|
@ -287,10 +258,10 @@ ul.bordered-list li:last-child { border:none }
|
||||||
|
|
||||||
li.commit {
|
li.commit {
|
||||||
.avatar {
|
.avatar {
|
||||||
width:24px;
|
width: 24px;
|
||||||
top:-5px;
|
top:-5px;
|
||||||
margin-right:10px;
|
margin-right: 10px;
|
||||||
margin-left:10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
|
@ -310,102 +281,10 @@ p.time {
|
||||||
|
|
||||||
|
|
||||||
.styled_image {
|
.styled_image {
|
||||||
border:2px solid #ddd;
|
border: 2px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.ico {
|
|
||||||
background: url("images.png") no-repeat -85px -77px;
|
|
||||||
width: 19px;
|
|
||||||
height: 16px;
|
|
||||||
float: left;
|
|
||||||
position: relative;
|
|
||||||
margin-right: 10px;
|
|
||||||
top: 8px;
|
|
||||||
|
|
||||||
&.project {
|
|
||||||
background-position: -37px -77px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.activities {
|
|
||||||
background-position:-162px -22px;
|
|
||||||
}
|
|
||||||
&.projects {
|
|
||||||
background-position:-209px -21px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftbar {
|
|
||||||
h5, .title {
|
|
||||||
padding:5px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size:14px;
|
|
||||||
padding:2px 10px;
|
|
||||||
color:#666;
|
|
||||||
border-bottom:1px solid #f1f1f1;
|
|
||||||
}
|
|
||||||
a:last-child h4 { border:none; }
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
h4 {
|
|
||||||
color:#111;
|
|
||||||
background:$hover;
|
|
||||||
border-color:#CCC;
|
|
||||||
.ico.project {
|
|
||||||
background-position:-209px -21px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.bottom {
|
|
||||||
padding:10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.votes {
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 15px;
|
|
||||||
.progress {
|
|
||||||
height: 4px;
|
|
||||||
margin: 0;
|
|
||||||
.bar {
|
|
||||||
float: left;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.bar-success {
|
|
||||||
background-color: #468847;
|
|
||||||
@include bg-gradient(#62C462, #51A351);
|
|
||||||
}
|
|
||||||
.bar-danger {
|
|
||||||
background-color: #B94A48;
|
|
||||||
@include bg-gradient(#EE5F5B, #BD362F);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.upvotes {
|
|
||||||
display: inline-block;
|
|
||||||
color: #468847;
|
|
||||||
}
|
|
||||||
.downvotes {
|
|
||||||
display: inline-block;
|
|
||||||
color: #B94A48;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.votes-block {
|
|
||||||
margin: 14px 6px 6px 0;
|
|
||||||
.downvotes {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.votes-inline {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0 8px;
|
|
||||||
.progress {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 0 0 2px;
|
|
||||||
width: 45px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fix for readme code (stopped it from being yellow) */
|
/* Fix for readme code (stopped it from being yellow) */
|
||||||
.readme {
|
.readme {
|
||||||
|
@ -418,63 +297,45 @@ p.time {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.highlight_word {
|
.highlight_word {
|
||||||
background:#EEDC94;
|
background: #EEDC94;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status_info {
|
.status_info {
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
padding:5px 15px;
|
padding: 5px 15px;
|
||||||
line-height:24px;
|
line-height: 26px;
|
||||||
width:60px;
|
text-align: center;
|
||||||
text-align:center;
|
float: right;
|
||||||
float:left;
|
position: relative;
|
||||||
margin-right:20px;
|
top: -5px;
|
||||||
|
@include border-radius(4px);
|
||||||
|
|
||||||
&.success {
|
|
||||||
background: #5BB75B;
|
|
||||||
color: white;
|
|
||||||
text-shadow: 0 1px #111;
|
|
||||||
border-color: #9A9;
|
|
||||||
}
|
|
||||||
&.error {
|
&.error {
|
||||||
background: #DA4E49;
|
background: #DA4E49;
|
||||||
border-color: #BD362F;
|
color: #FFF;
|
||||||
color: white;
|
|
||||||
text-shadow: 0 1px #111;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.arrow{
|
.arrow{
|
||||||
background: #E3E5EA;
|
background: #E3E5EA;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
margin-top:5px;
|
margin-top: 5px;
|
||||||
border-radius: 5px;
|
@include border-radius(5px);
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
color: #999;
|
color: #999;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thin_area{
|
.thin_area{
|
||||||
height: 150px;
|
height: 150px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.gitlab_pagination {
|
|
||||||
span a { color:$link_color; }
|
|
||||||
.prev, .next, .current, .page a {
|
|
||||||
padding:10px;
|
|
||||||
}
|
|
||||||
.current {
|
|
||||||
border-bottom:2px solid $style_color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fixes alignment on notes.
|
// Fixes alignment on notes.
|
||||||
.new_note {
|
.new_note {
|
||||||
label {
|
label {
|
||||||
text-align:left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,7 +347,7 @@ li.note {
|
||||||
border-bottom:none !important;
|
border-bottom:none !important;
|
||||||
}
|
}
|
||||||
.file {
|
.file {
|
||||||
padding-left:20px;
|
padding-left: 20px;
|
||||||
background:url("icon-attachment.png") no-repeat left center;
|
background:url("icon-attachment.png") no-repeat left center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -494,7 +355,7 @@ li.note {
|
||||||
|
|
||||||
.markdown {
|
.markdown {
|
||||||
img {
|
img {
|
||||||
max-width:100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,19 +365,19 @@ li.note {
|
||||||
|
|
||||||
.team_member_show {
|
.team_member_show {
|
||||||
td:first-child {
|
td:first-child {
|
||||||
color:#aaa;
|
color: #aaa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.remember_me {
|
.remember_me {
|
||||||
text-align:left;
|
text-align: left;
|
||||||
|
|
||||||
input {
|
input {
|
||||||
margin:0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
span {
|
||||||
padding-left:5px;
|
padding-left: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,10 +391,10 @@ li.note {
|
||||||
.data {
|
.data {
|
||||||
a {
|
a {
|
||||||
h1 {
|
h1 {
|
||||||
line-height:48px;
|
line-height: 48px;
|
||||||
font-size:48px;
|
font-size: 48px;
|
||||||
padding:20px;
|
padding: 20px;
|
||||||
text-align:center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -541,12 +402,12 @@ li.note {
|
||||||
|
|
||||||
.rss-icon {
|
.rss-icon {
|
||||||
img {
|
img {
|
||||||
width:24px;
|
width: 24px;
|
||||||
vertical-align:top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
line-height:24px;
|
line-height: 24px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,43 +415,43 @@ li.note {
|
||||||
|
|
||||||
/* CHZN reset few styles */
|
/* CHZN reset few styles */
|
||||||
.chzn-container-single .chzn-single {
|
.chzn-container-single .chzn-single {
|
||||||
background:#FFF;
|
background: #FFF;
|
||||||
border: 1px solid #bbb;
|
border: 1px solid #bbb;
|
||||||
box-shadow:none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
.chzn-container-active .chzn-single {
|
.chzn-container-active .chzn-single {
|
||||||
background:#fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.supp_diff_link,
|
.supp_diff_link,
|
||||||
.mr_show_all_commits {
|
.mr_show_all_commits {
|
||||||
cursor:pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.merge_request,
|
.merge_request,
|
||||||
.issue {
|
.issue {
|
||||||
&.today{
|
&.today{
|
||||||
background: #EFE;
|
background: #EFE;
|
||||||
border-color:#CEC;
|
border-color: #CEC;
|
||||||
}
|
}
|
||||||
&.closed {
|
&.closed {
|
||||||
background: #F5f5f5;
|
background: #F5f5f5;
|
||||||
border-color:#E5E5E5;
|
border-color: #E5E5E5;
|
||||||
}
|
}
|
||||||
&.merged {
|
&.merged {
|
||||||
background: #F5f5f5;
|
background: #F5f5f5;
|
||||||
border-color:#E5E5E5;
|
border-color: #E5E5E5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.git_error_tips {
|
.git_error_tips {
|
||||||
@extend .span6;
|
@extend .span6;
|
||||||
text-align:left;
|
text-align: left;
|
||||||
margin-top:40px;
|
margin-top: 40px;
|
||||||
pre {
|
pre {
|
||||||
background:white;
|
background: white;
|
||||||
border:none;
|
border: none;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -602,18 +463,22 @@ li.note {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
background: #FEE;
|
background: #FEE;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
|
|
||||||
|
&.centered {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.oauth_select_holder {
|
.oauth_select_holder {
|
||||||
padding:20px;
|
padding: 20px;
|
||||||
img {
|
img {
|
||||||
padding:5px;
|
padding: 5px;
|
||||||
margin-right:10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.active {
|
.active {
|
||||||
img {
|
img {
|
||||||
border:1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
background:$hover;
|
background: $hover;
|
||||||
@include border-radius(5px);
|
@include border-radius(5px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -627,29 +492,67 @@ li.note {
|
||||||
|
|
||||||
.gitlab-promo {
|
.gitlab-promo {
|
||||||
a {
|
a {
|
||||||
color:#aaa;
|
color: #aaa;
|
||||||
margin-right: 30px;
|
margin-right: 30px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
&.clean {
|
&.clean {
|
||||||
background:none;
|
background: none;
|
||||||
border:none;
|
border: none;
|
||||||
margin:0;
|
margin: 0;
|
||||||
padding:0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.milestone .progress {
|
.milestone {
|
||||||
margin-bottom: 0;
|
&.milestone-closed {
|
||||||
margin-top:4px;
|
background: #eee;
|
||||||
|
}
|
||||||
|
.progress {
|
||||||
|
margin-bottom: 0;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.float-link {
|
.float-link {
|
||||||
float:left;
|
float: left;
|
||||||
margin-right:15px;
|
margin-right: 15px;
|
||||||
.s16 {
|
.s16 {
|
||||||
margin-right:5px;
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-search-filter {
|
||||||
|
padding:5px;
|
||||||
|
|
||||||
|
.search-text-input {
|
||||||
|
float:left;
|
||||||
|
@extend .span2;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
margin-left: 5px;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1.http_status_code {
|
||||||
|
font-size: 56px;
|
||||||
|
line-height: 100px;
|
||||||
|
font-weight: normal;
|
||||||
|
color: #456;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-group {
|
||||||
|
.controls {
|
||||||
|
span {
|
||||||
|
&.descr {
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
left: 5px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
26
app/assets/stylesheets/gitlab_bootstrap.scss
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/** Override bootstrap variables **/
|
||||||
|
$baseFontSize: 13px !default;
|
||||||
|
$baseLineHeight: 18px !default;
|
||||||
|
|
||||||
|
// BOOTSTRAP
|
||||||
|
@import "bootstrap";
|
||||||
|
@import "bootstrap/responsive-utilities";
|
||||||
|
@import "bootstrap/responsive-1200px-min";
|
||||||
|
|
||||||
|
@import "font-awesome";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GitLab bootstrap.
|
||||||
|
* Overrides some styles of twitter bootstrap.
|
||||||
|
* Also give some common classes for GitLab app
|
||||||
|
*/
|
||||||
|
@import "gitlab_bootstrap/variables.scss";
|
||||||
|
@import "gitlab_bootstrap/fonts.scss";
|
||||||
|
@import "gitlab_bootstrap/mixins.scss";
|
||||||
|
@import "gitlab_bootstrap/common.scss";
|
||||||
|
@import "gitlab_bootstrap/typography.scss";
|
||||||
|
@import "gitlab_bootstrap/buttons.scss";
|
||||||
|
@import "gitlab_bootstrap/blocks.scss";
|
||||||
|
@import "gitlab_bootstrap/files.scss";
|
||||||
|
@import "gitlab_bootstrap/tables.scss";
|
||||||
|
@import "gitlab_bootstrap/lists.scss";
|
|
@ -15,8 +15,8 @@
|
||||||
@extend .borders;
|
@extend .borders;
|
||||||
@extend .prepend-top-20;
|
@extend .prepend-top-20;
|
||||||
@extend .append-bottom-20;
|
@extend .append-bottom-20;
|
||||||
border-width:1px;
|
border-width: 1px;
|
||||||
@include solid_shade;
|
@include solid-shade;
|
||||||
|
|
||||||
|
|
||||||
img { max-width: 100%; }
|
img { max-width: 100%; }
|
||||||
|
@ -30,27 +30,37 @@
|
||||||
.top_box_content,
|
.top_box_content,
|
||||||
.middle_box_content,
|
.middle_box_content,
|
||||||
.bottom_box_content {
|
.bottom_box_content {
|
||||||
padding:15px;
|
padding: 15px;
|
||||||
|
word-wrap: break-word;
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
background: none !important;
|
background: none !important;
|
||||||
margin:0;
|
margin: 0;
|
||||||
border:none;
|
border: none;
|
||||||
padding:0;
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.top_box_content {
|
||||||
|
.box-title {
|
||||||
|
color: $style_color;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 28px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.middle_box_content {
|
.middle_box_content {
|
||||||
border-radius:0;
|
@include border-radius(0);
|
||||||
border:none;
|
border: none;
|
||||||
font-size:12px;
|
font-size: 12px;
|
||||||
background-color:#f5f5f5;
|
background-color: #f5f5f5;
|
||||||
border:none;
|
border: none;
|
||||||
border-top:1px solid #eee;
|
border-top: 1px solid #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom_box_content {
|
.bottom_box_content {
|
||||||
border-top:1px solid #eee;
|
border-top: 1px solid #eee;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,44 +69,52 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.ui-box {
|
.ui-box {
|
||||||
background:#F9F9F9;
|
background: #F9F9F9;
|
||||||
margin-bottom: 25px;
|
margin-bottom: 25px;
|
||||||
@include round-borders-all(4px);
|
|
||||||
|
border: 1px solid #eaeaea;
|
||||||
|
@include border-radius(4px);
|
||||||
|
|
||||||
border-color: #CCC;
|
border-color: #CCC;
|
||||||
@include solid_shade;
|
@include solid-shade;
|
||||||
|
|
||||||
&.white {
|
&.white {
|
||||||
background:#fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
margin:0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
h5, .title {
|
h5, .title {
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
@include round-borders-top(4px);
|
@include border-radius(4px 4px 0 0);
|
||||||
@include bg-gray-gradient;
|
@include bg-gray-gradient;
|
||||||
|
border-top: 1px solid #eaeaea;
|
||||||
border-bottom: 1px solid #bbb;
|
border-bottom: 1px solid #bbb;
|
||||||
|
|
||||||
|
> a {
|
||||||
|
text-shadow: 0 1px 1px #fff;
|
||||||
|
}
|
||||||
|
|
||||||
&.small {
|
&.small {
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height:28px;
|
line-height: 28px;
|
||||||
text-shadow: 0 1px 1px white;
|
text-shadow: 0 1px 1px white;
|
||||||
}
|
}
|
||||||
|
|
||||||
form {
|
form {
|
||||||
padding:9px 0;
|
padding: 9px 0;
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-pills {
|
.nav-pills {
|
||||||
li {
|
li {
|
||||||
padding:3px 0;
|
padding: 3px 0;
|
||||||
&.active a { background-color:$style_color; }
|
&.active a { background-color: $style_color; }
|
||||||
a {
|
a {
|
||||||
border-radius:7px;
|
@include border-radius(7px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,8 +122,8 @@
|
||||||
|
|
||||||
.bottom {
|
.bottom {
|
||||||
@include bg-gray-gradient;
|
@include bg-gray-gradient;
|
||||||
@include round-borders-bottom(4px);
|
@include border-radius(0 0 4px 4px);
|
||||||
border-bottom:none;
|
border-bottom: none;
|
||||||
border-top: 1px solid #bbb;
|
border-top: 1px solid #bbb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,38 +134,25 @@
|
||||||
padding: 5px 20px;
|
padding: 5px 20px;
|
||||||
}
|
}
|
||||||
.middle_title {
|
.middle_title {
|
||||||
background:#f5f5f5;
|
background: #f5f5f5;
|
||||||
margin:20px -20px;
|
margin:20px -20px;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
border-top:1px solid #eee;
|
border-top: 1px solid #eee;
|
||||||
border-bottom:1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
color:#777;
|
color: #777;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.row_title {
|
.row_title {
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
color:#444;
|
color: #444;
|
||||||
&:hover {
|
&:hover {
|
||||||
color:#444;
|
color: #444;
|
||||||
text-decoration:underline;
|
text-decoration: underline;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
li, .wll {
|
|
||||||
padding:10px;
|
|
||||||
&:first-child {
|
|
||||||
@include round-borders-top(4px);
|
|
||||||
border-top:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
@include round-borders-bottom(4px);
|
|
||||||
border:none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui-box-body {
|
.ui-box-body {
|
||||||
padding:10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,42 +1,42 @@
|
||||||
.btn {
|
.btn {
|
||||||
@include bg-gradient(#f7f7f7, #d5d5d5);
|
@include linear-gradient(#f7f7f7, #d5d5d5);
|
||||||
border-color:#aaa;
|
border-color: #aaa;
|
||||||
&:hover {
|
&:hover {
|
||||||
@include bg-gray-gradient;
|
@include bg-gray-gradient;
|
||||||
border-color:#bbb;
|
border-color: #bbb;
|
||||||
color:#333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.primary {
|
&.primary {
|
||||||
background:#2a79A3;
|
background: #2a79A3;
|
||||||
@include bg-gradient(#47A7b7, #2585b5);
|
@include linear-gradient(#47A7b7, #2585b5);
|
||||||
border-color: #2A79A3;
|
border-color: #2A79A3;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
text-shadow: 0 1px 1px #268;
|
text-shadow: 0 1px 1px #268;
|
||||||
&:hover {
|
&:hover {
|
||||||
background:$blue_link;
|
background: $primary_color;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.disabled {
|
&.disabled {
|
||||||
color:#fff;
|
color: #fff;
|
||||||
background:#29B;
|
background: #29B;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.btn-info {
|
&.btn-info {
|
||||||
background:#5aB9C3;
|
background: #5aB9C3;
|
||||||
border-color: $blue_link;
|
border-color: $primary_color;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
text-shadow: 0 1px 1px #268;
|
text-shadow: 0 1px 1px #268;
|
||||||
&:hover {
|
&:hover {
|
||||||
background:$blue_link;
|
background: $primary_color;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.disabled {
|
&.disabled {
|
||||||
color:#fff;
|
color: #fff;
|
||||||
background:#29B;
|
background: #29B;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,8 +49,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.disabled {
|
&.disabled {
|
||||||
color:#fff;
|
color: #fff;
|
||||||
background:#2b2;
|
background: #2b2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,12 +60,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.cancel-btn {
|
&.cancel-btn {
|
||||||
float:right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.wide {
|
&.wide {
|
||||||
padding-left:30px;
|
padding-left: 30px;
|
||||||
padding-right:30px;
|
padding-right: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.danger {
|
&.danger {
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
border-color: #BD362F;
|
border-color: #BD362F;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color:#fff;
|
color: #fff;
|
||||||
background: #EE4E49;
|
background: #EE4E49;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,24 +87,24 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
border-color:#aaa;
|
border-color: #aaa;
|
||||||
background-color:#ccc;
|
background-color: #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.very_small {
|
&.very_small {
|
||||||
font-size:11px;
|
font-size: 11px;
|
||||||
padding:2px 6px;
|
padding: 2px 6px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin:2px;
|
margin: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.grouped {
|
&.grouped {
|
||||||
margin-right:7px;
|
margin-right: 7px;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.padded {
|
&.padded {
|
||||||
margin-right:3px;
|
margin-right: 3px;
|
||||||
padding:4px 10px 4px;
|
padding: 4px 10px 4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,6 @@
|
||||||
/** COMMON CLASSES **/
|
/** COMMON CLASSES **/
|
||||||
.left { float:left }
|
.left { float:left }
|
||||||
.right { float:right!important }
|
.right { float:right!important }
|
||||||
.width-50p { width:50% }
|
|
||||||
.width-49p { width:49% }
|
|
||||||
.width-30p { width:30% }
|
|
||||||
.width-65p { width:65% }
|
|
||||||
.width-100p { width:100% }
|
|
||||||
.append-bottom-10 { margin-bottom:10px }
|
.append-bottom-10 { margin-bottom:10px }
|
||||||
.append-bottom-20 { margin-bottom:20px }
|
.append-bottom-20 { margin-bottom:20px }
|
||||||
.prepend-top-10 { margin-top:10px }
|
.prepend-top-10 { margin-top:10px }
|
||||||
|
@ -24,40 +19,42 @@
|
||||||
.lborder { border-left:1px solid #eee }
|
.lborder { border-left:1px solid #eee }
|
||||||
.no-padding { padding:0 !important; }
|
.no-padding { padding:0 !important; }
|
||||||
.underlined { border-bottom: 1px solid #CCC; }
|
.underlined { border-bottom: 1px solid #CCC; }
|
||||||
.no-borders { border:none; }
|
.no-borders { border: none; }
|
||||||
.vlink { color: $link_color !important; }
|
.vlink { color: $link_color !important; }
|
||||||
.underlined_link { text-decoration: underline; }
|
.underlined_link { text-decoration: underline; }
|
||||||
.borders { border: 1px solid #ccc; @include shade; }
|
.borders { border: 1px solid #ccc; @include shade; }
|
||||||
.hint { font-style: italic; color: #999; }
|
.hint { font-style: italic; color: #999; }
|
||||||
.light { color: #888 }
|
.light { color: #888 }
|
||||||
|
.tiny { font-weight: normal }
|
||||||
|
|
||||||
/** PILLS & TABS**/
|
/** PILLS & TABS**/
|
||||||
.nav-pills a:hover { background-color:#888; }
|
.nav-pills a:hover { background-color: #888; }
|
||||||
.nav-pills .active a { background-color: $style_color; }
|
.nav-pills .active a { background-color: $style_color; }
|
||||||
.nav-tabs > li > a, .nav-pills > li > a { color:$style_color; }
|
.nav-pills > .active > a > i[class^="icon-"] { background: inherit; }
|
||||||
|
.nav-tabs > li > a, .nav-pills > li > a { color: $style_color; }
|
||||||
.nav.nav-tabs {
|
.nav.nav-tabs {
|
||||||
li {
|
li {
|
||||||
> a {
|
> a {
|
||||||
padding:8px 20px;
|
padding: 8px 20px;
|
||||||
margin-right: 7px;
|
margin-right: 7px;
|
||||||
line-height: 19px;
|
line-height: 19px;
|
||||||
border-color: #EEE;
|
border-color: #EEE;
|
||||||
color:#888;
|
color: #888;
|
||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
.badge {
|
.badge {
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
color:#888;
|
color: #888;
|
||||||
text-shadow:0 1px 1px #fff;
|
text-shadow: 0 1px 1px #fff;
|
||||||
}
|
}
|
||||||
i[class^="icon-"] {
|
i[class^="icon-"] {
|
||||||
line-height:14px;
|
line-height: 14px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&.active {
|
&.active {
|
||||||
> a {
|
> a {
|
||||||
border-color: #CCC;
|
border-color: #CCC;
|
||||||
border-bottom: 1px solid #fff;
|
border-bottom: 1px solid #fff;
|
||||||
color:#333;
|
color: #333;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,25 +66,50 @@
|
||||||
.alert-message.error { @extend .alert-error; }
|
.alert-message.error { @extend .alert-error; }
|
||||||
|
|
||||||
/** AVATARS **/
|
/** AVATARS **/
|
||||||
img.avatar { float:left; margin-right:12px; width:40px; border:1px solid #ddd; padding:1px; }
|
img.avatar { float: left; margin-right: 12px; width: 40px; border: 1px solid #ddd; padding: 1px; }
|
||||||
img.avatar.s16 { width:16px; height:16px; margin-right:6px; }
|
img.avatar.s16 { width: 16px; height: 16px; margin-right: 6px; }
|
||||||
img.avatar.s24 { width:24px; height:24px; margin-right:8px; }
|
img.avatar.s24 { width: 24px; height: 24px; margin-right: 8px; }
|
||||||
img.avatar.s32 { width:32px; height:32px; margin-right:10px; }
|
img.avatar.s32 { width: 32px; height: 32px; margin-right: 10px; }
|
||||||
img.lil_av { padding-left: 4px; padding-right:3px; }
|
img.lil_av { padding-left: 4px; padding-right: 3px; }
|
||||||
img.small { width: 80px; }
|
img.small { width: 80px; }
|
||||||
|
|
||||||
/** HELPERS **/
|
/** HELPERS **/
|
||||||
.nothing_here_message { text-align:center; padding:20px; color:#777; }
|
.nothing_here_message {
|
||||||
p.slead { color:#456; font-size:16px; margin-bottom: 12px; font-weight: 200; line-height: 24px; }
|
text-align: center;
|
||||||
|
padding: 20px;
|
||||||
|
color: #666;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.slead { color: #456; font-size: 16px; margin-bottom: 12px; font-weight: 200; line-height: 24px; }
|
||||||
|
|
||||||
/** FORMS **/
|
/** FORMS **/
|
||||||
input[type='search'].search-text-input {
|
input[type='search'].search-text-input {
|
||||||
background-image: url("icon-search.png");
|
background-image: url("icon-search.png");
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: 10px;
|
background-position: 10px;
|
||||||
padding-left:25px;
|
padding-left: 25px;
|
||||||
@include border-radius(4px);
|
@include border-radius(4px);
|
||||||
border:1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type='text'].danger {
|
||||||
|
background: #F2DEDE!important;
|
||||||
|
border-color: #D66;
|
||||||
|
text-shadow: 0 1px 1px #fff
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldset legend { font-size: 17px; }
|
fieldset legend { font-size: 17px; }
|
||||||
|
|
||||||
|
/** PAGINATION **/
|
||||||
|
.gitlab_pagination {
|
||||||
|
span a { color: $link_color; }
|
||||||
|
.prev, .next, .current, .page a {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
.current {
|
||||||
|
border-bottom: 2px solid $style_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.file_holder {
|
.file_holder {
|
||||||
border:1px solid #BBB;
|
border: 1px solid #BBB;
|
||||||
margin-bottom:1em;
|
margin-bottom: 1em;
|
||||||
@include solid_shade;
|
@include solid-shade;
|
||||||
|
|
||||||
.file_title {
|
.file_title {
|
||||||
border-bottom: 1px solid #bbb;
|
border-bottom: 1px solid #bbb;
|
||||||
|
@ -16,47 +16,51 @@
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #666;
|
color: #666;
|
||||||
padding: 9px 10px;
|
padding: 9px 10px;
|
||||||
height:18px;
|
height: 18px;
|
||||||
|
|
||||||
.options {
|
.options {
|
||||||
float:right;
|
float: right;
|
||||||
margin-top: -5px;
|
margin-top: -5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.file_name {
|
.file_name {
|
||||||
color:$style_color;
|
color: $style_color;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
text-shadow: 0 1px 1px #fff;
|
text-shadow: 0 1px 1px #fff;
|
||||||
small {
|
small {
|
||||||
color:#999;
|
color: #999;
|
||||||
font-size:13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.file_content {
|
.file_content {
|
||||||
background:#fff;
|
background: #fff;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
|
|
||||||
&.wiki {
|
&.wiki {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
code {
|
code {
|
||||||
padding:0 4px;
|
padding: 0 4px;
|
||||||
}
|
}
|
||||||
padding:20px;
|
padding: 20px;
|
||||||
h1, h2 {
|
|
||||||
line-height: 46px;
|
h1 { font-size: 26px; line-height: 46px; }
|
||||||
}
|
h2 { font-size: 22px; line-height: 42px; }
|
||||||
h3, h4 {
|
h3 { font-size: 20px; line-height: 40px; }
|
||||||
line-height: 40px;
|
h4 { font-size: 18px; line-height: 32px; }
|
||||||
|
h5 { font-size: 16px; line-height: 26px; }
|
||||||
|
|
||||||
|
.white .highlight pre {
|
||||||
|
background: #f5f5f5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.image_file {
|
&.image_file {
|
||||||
background:#eee;
|
background: #eee;
|
||||||
text-align:center;
|
text-align: center;
|
||||||
img {
|
img {
|
||||||
padding:100px;
|
padding: 100px;
|
||||||
max-width:300px;
|
max-width: 300px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,60 +73,60 @@
|
||||||
*/
|
*/
|
||||||
&.blame {
|
&.blame {
|
||||||
table {
|
table {
|
||||||
border:none;
|
border: none;
|
||||||
box-shadow:none;
|
box-shadow: none;
|
||||||
margin:0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
tr {
|
tr {
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
}
|
}
|
||||||
td {
|
td {
|
||||||
&:first-child {
|
&:first-child {
|
||||||
border-left:none;
|
border-left: none;
|
||||||
}
|
}
|
||||||
&:last-child {
|
&:last-child {
|
||||||
border-right:none;
|
border-right: none;
|
||||||
}
|
}
|
||||||
background:#fff;
|
background: #fff;
|
||||||
padding:5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
.author,
|
.author,
|
||||||
.blame_commit {
|
.blame_commit {
|
||||||
background:#f5f5f5;
|
background: #f5f5f5;
|
||||||
vertical-align:top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
.lines {
|
.lines {
|
||||||
pre {
|
pre {
|
||||||
padding:0;
|
padding: 0;
|
||||||
margin:0;
|
margin: 0;
|
||||||
background:none;
|
background: none;
|
||||||
border:none;
|
border: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.logs {
|
&.logs {
|
||||||
background:#eee;
|
background: #eee;
|
||||||
max-height: 700px;
|
max-height: 700px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|
||||||
ol {
|
ol {
|
||||||
margin-left:40px;
|
margin-left: 40px;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
border-left: 1px solid #CCC;
|
border-left: 1px solid #CCC;
|
||||||
margin-bottom:0;
|
margin-bottom: 0;
|
||||||
background: white;
|
background: white;
|
||||||
li {
|
li {
|
||||||
color:#888;
|
color: #888;
|
||||||
p {
|
p {
|
||||||
margin:0;
|
margin: 0;
|
||||||
color:#333;
|
color: #333;
|
||||||
line-height:24px;
|
line-height: 24px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background:$hover;
|
background: $hover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,8 +146,8 @@
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
background: none;
|
|
||||||
border: none;
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
|
font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
|
||||||
font-size: 12px !important;
|
font-size: 12px !important;
|
||||||
line-height: 16px !important;
|
line-height: 16px !important;
|
||||||
|
|
7
app/assets/stylesheets/gitlab_bootstrap/fonts.scss
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
@font-face{
|
||||||
|
font-family: Korolev;
|
||||||
|
src: font-url('korolev-medium-compressed.otf');
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Typo **/
|
||||||
|
$monospace: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono', 'lucida console', monospace;
|
|
@ -1,41 +1,75 @@
|
||||||
/** LISTS **/
|
/**
|
||||||
|
* Well styled list
|
||||||
ul {
|
*
|
||||||
/**
|
*/
|
||||||
* List li block element #1
|
.well-list {
|
||||||
*
|
margin: 0;
|
||||||
*/
|
list-style: none;
|
||||||
.wll {
|
li {
|
||||||
background-color: #FFF;
|
background-color: #FFF;
|
||||||
padding: 10px 5px;
|
padding: 10px;
|
||||||
min-height: 20px;
|
min-height: 20px;
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
||||||
|
|
||||||
&.smoke { background-color:#f5f5f5; }
|
&.disabled {
|
||||||
&:hover {
|
color: #888;
|
||||||
background:$hover;
|
|
||||||
border-bottom:1px solid #ADF;
|
|
||||||
}
|
}
|
||||||
&:last-child { border:none }
|
|
||||||
|
&.smoke { background-color: #f5f5f5; }
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: $hover;
|
||||||
|
border-bottom: 1px solid #ADF;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
@include border-radius(4px 4px 0 0);
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
@include border-radius(0 0 4px 4px);
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
.author { color: #999; }
|
.author { color: #999; }
|
||||||
|
|
||||||
p {
|
p {
|
||||||
padding-top: 1px;
|
padding-top: 1px;
|
||||||
margin:0;
|
margin: 0;
|
||||||
color:#222;
|
color: #222;
|
||||||
img {
|
img {
|
||||||
position:relative;
|
position: relative;
|
||||||
top:3px;
|
top: 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.well-title {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ol, ul {
|
ol, ul {
|
||||||
&.styled {
|
&.styled {
|
||||||
li {
|
li {
|
||||||
padding:2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** light list with border-bottom between li **/
|
||||||
|
ul.bordered-list {
|
||||||
|
margin: 5px 0px;
|
||||||
|
padding: 0px;
|
||||||
|
li {
|
||||||
|
padding: 5px 0;
|
||||||
|
border-bottom: 1px solid #EEE;
|
||||||
|
overflow: hidden;
|
||||||
|
display: block;
|
||||||
|
margin: 0px;
|
||||||
|
&:last-child { border:none }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
69
app/assets/stylesheets/gitlab_bootstrap/mixins.scss
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/**
|
||||||
|
* Generic mixins
|
||||||
|
*/
|
||||||
|
@mixin box-shadow($shadow) {
|
||||||
|
-webkit-box-shadow: $shadow;
|
||||||
|
-moz-box-shadow: $shadow;
|
||||||
|
-ms-box-shadow: $shadow;
|
||||||
|
-o-box-shadow: $shadow;
|
||||||
|
box-shadow: $shadow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin border-radius($radius) {
|
||||||
|
-webkit-border-radius: $radius;
|
||||||
|
-moz-border-radius: $radius;
|
||||||
|
-ms-border-radius: $radius;
|
||||||
|
-o-border-radius: $radius;
|
||||||
|
border-radius: $radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin linear-gradient($from, $to) {
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to));
|
||||||
|
background-image: -webkit-linear-gradient($from, $to);
|
||||||
|
background-image: -moz-linear-gradient($from, $to);
|
||||||
|
background-image: -o-linear-gradient($from, $to);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefilled mixins
|
||||||
|
* Mixins with fixed values
|
||||||
|
*/
|
||||||
|
@mixin bg-light-gray-gradient {
|
||||||
|
background: #f1f1f1;
|
||||||
|
background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #f5f5f5), to(#e1e1e1));
|
||||||
|
background-image: -webkit-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
|
||||||
|
background-image: -moz-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
|
||||||
|
background-image: -o-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin bg-gray-gradient {
|
||||||
|
background: #eee;
|
||||||
|
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: -o-linear-gradient(#eee 6.6%, #dfdfdf);
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin bg-dark-gray-gradient {
|
||||||
|
background: #eee;
|
||||||
|
background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7);
|
||||||
|
background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7);
|
||||||
|
background-image: -o-linear-gradient(#e9e9e9, #d7d7d7);
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin shade {
|
||||||
|
@include box-shadow(0 0 3px #ddd);
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin solid-shade {
|
||||||
|
@include box-shadow(0 0 0 3px #f1f1f1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin header-font {
|
||||||
|
color: $style_color;
|
||||||
|
text-shadow: 0 1px 1px #FFF;
|
||||||
|
font-family: 'Korolev', sans-serif;
|
||||||
|
font-size: 28px;
|
||||||
|
line-height: 48px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
|
@ -1,13 +1,13 @@
|
||||||
table {
|
table {
|
||||||
@extend .table;
|
@extend .table;
|
||||||
@extend .table-striped;
|
@extend .table-striped;
|
||||||
@include solid_shade;
|
@include solid-shade;
|
||||||
border:1px solid #bbb;
|
border: 1px solid #bbb;
|
||||||
width:100%;
|
width: 100%;
|
||||||
|
|
||||||
&.low {
|
&.low {
|
||||||
td {
|
td {
|
||||||
line-height:18px;
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@ table {
|
||||||
}
|
}
|
||||||
|
|
||||||
td {
|
td {
|
||||||
border-color:#f1f1f1;
|
border-color: #f1f1f1;
|
||||||
line-height:28px;
|
line-height: 28px;
|
||||||
|
|
||||||
.s16 {
|
.s16 {
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
|
@ -40,11 +40,11 @@ table {
|
||||||
}
|
}
|
||||||
|
|
||||||
&:first-child {
|
&:first-child {
|
||||||
border-left:1px solid #bbb;
|
border-left: 1px solid #bbb;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
border-right:1px solid #bbb;
|
border-right: 1px solid #bbb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,10 +53,10 @@ table {
|
||||||
}
|
}
|
||||||
|
|
||||||
&.lite {
|
&.lite {
|
||||||
border:none;
|
border: none;
|
||||||
box-shadow:none;
|
box-shadow: none;
|
||||||
tr, td {
|
tr, td {
|
||||||
border:none;
|
border: none;
|
||||||
background:none !important;
|
background:none !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 { margin: 0; }
|
h1, h2, h3, h4, h5, h6 { margin: 0; }
|
||||||
h3, h4, h5, h6 { line-height: 36px; }
|
h3, h4, h5, h6 { line-height: 36px; }
|
||||||
h5 { font-size:14px; }
|
h5 { font-size: 14px; }
|
||||||
|
|
||||||
h3.page_title {
|
h3.page_title {
|
||||||
color:#456;
|
color: #456;
|
||||||
font-size:20px;
|
font-size: 20px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ pre {
|
||||||
|
|
||||||
&.dark {
|
&.dark {
|
||||||
background: #333;
|
background: #333;
|
||||||
color:#f5f5f5;
|
color: #f5f5f5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@ a {
|
||||||
outline: none;
|
outline: none;
|
||||||
color: $link_color;
|
color: $link_color;
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration:none;
|
text-decoration: none;
|
||||||
color: $blue_link;
|
color: $primary_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.btn {
|
&.btn {
|
||||||
|
@ -53,27 +53,31 @@ a {
|
||||||
}
|
}
|
||||||
|
|
||||||
&.lined {
|
&.lined {
|
||||||
text-decoration:underline;
|
text-decoration: underline;
|
||||||
&:hover { text-decoration:underline; }
|
&:hover { text-decoration: underline; }
|
||||||
}
|
}
|
||||||
|
|
||||||
&.gray {
|
&.gray {
|
||||||
color:gray;
|
color: gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.supp_diff_link {
|
&.supp_diff_link {
|
||||||
text-align:center;
|
text-align: center;
|
||||||
padding:20px 0;
|
padding: 20px 0;
|
||||||
background:#f1f1f1;
|
background: #f1f1f1;
|
||||||
width:100%;
|
width: 100%;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.neib {
|
&.neib {
|
||||||
margin-right:15px;
|
margin-right: 15px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a:focus {
|
a:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.monospace {
|
||||||
|
font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
|
||||||
|
}
|
||||||
|
|
5
app/assets/stylesheets/gitlab_bootstrap/variables.scss
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
/** Colors **/
|
||||||
|
$primary_color: #2FA0BB;
|
||||||
|
$link_color: #3A89A3;
|
||||||
|
$style_color: #474D57;
|
||||||
|
$hover: #D9EDF7;
|
|
@ -1,6 +1,9 @@
|
||||||
.black .lines .highlight {
|
.black .highlight {
|
||||||
background: #333;
|
background-color: #333;
|
||||||
pre { color: #eee; }
|
pre {
|
||||||
|
color: #eee;
|
||||||
|
background: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
.hll { display: block; background-color: darken($hover, 65%) }
|
.hll { display: block; background-color: darken($hover, 65%) }
|
||||||
.c { color: #888888; font-style: italic } /* Comment */
|
.c { color: #888888; font-style: italic } /* Comment */
|
||||||
|
@ -21,43 +24,43 @@
|
||||||
.gs { font-weight: bold } /* Generic.Strong */
|
.gs { font-weight: bold } /* Generic.Strong */
|
||||||
.gu { color: #606060 } /* Generic.Subheading */
|
.gu { color: #606060 } /* Generic.Subheading */
|
||||||
.gt { color: #aa0000 } /* Generic.Traceback */
|
.gt { color: #aa0000 } /* Generic.Traceback */
|
||||||
.kc{font-weight:bold;} /* Keyword.Constant */
|
.kc{font-weight: bold;} /* Keyword.Constant */
|
||||||
.kd{font-weight:bold;} /* Keyword.Declaration */
|
.kd{font-weight: bold;} /* Keyword.Declaration */
|
||||||
.kn{font-weight:bold;} /* Keyword.Namespace */
|
.kn{font-weight: bold;} /* Keyword.Namespace */
|
||||||
.kp{font-weight:bold;} /* Keyword.Pseudo */
|
.kp{font-weight: bold;} /* Keyword.Pseudo */
|
||||||
.kr{font-weight:bold;} /* Keyword.Reserved */
|
.kr{font-weight: bold;} /* Keyword.Reserved */
|
||||||
.kt{color:#458;font-weight:bold;} /* Keyword.Type */
|
.kt{color: #458;font-weight: bold;} /* Keyword.Type */
|
||||||
.m { color: #0000DD; font-weight: bold } /* Literal.Number */
|
.m { color: #0000DD; font-weight: bold } /* Literal.Number */
|
||||||
.p { color: #eee; }
|
.p { color: #eee; }
|
||||||
.s { color: #0AD; background-color: transparent } /* Literal.String */
|
.s { color: #0AD; background-color: transparent } /* Literal.String */
|
||||||
.na{color:#008080;} /* Name.Attribute */
|
.na{color: #008080;} /* Name.Attribute */
|
||||||
.nb{color:#0086B3;} /* Name.Builtin */
|
.nb{color: #0086B3;} /* Name.Builtin */
|
||||||
.nc{color:#ccc;font-weight:bold;} /* Name.Class */
|
.nc{color: #ccc;font-weight: bold;} /* Name.Class */
|
||||||
.no{color:turquoise;} /* Name.Constant */
|
.no{color: turquoise;} /* Name.Constant */
|
||||||
.ni{color:#800080;}
|
.ni{color: #800080;}
|
||||||
.ne{color:#900;font-weight:bold;} /* Name.Exception */
|
.ne{color: #900;font-weight: bold;} /* Name.Exception */
|
||||||
.nf{color:#ccc;font-weight:bold;} /* Name.Function */
|
.nf{color: #ccc;font-weight: bold;} /* Name.Function */
|
||||||
.nn{color:#79C3E0;font-weight:bold;} /* Name.Namespace */
|
.nn{color: #79C3E0;font-weight: bold;} /* Name.Namespace */
|
||||||
.nt{color:#fc5;} /* Name.Tag */
|
.nt{color: #fc5;} /* Name.Tag */
|
||||||
.nv{color:#FA4;} /* Name.Variable */
|
.nv{color: #FA4;} /* Name.Variable */
|
||||||
.py { color: #336699; font-weight: bold } /* Name.Property */
|
.py { color: #336699; font-weight: bold } /* Name.Property */
|
||||||
.ow { color: #008800 } /* Operator.Word */
|
.ow { color: #008800 } /* Operator.Word */
|
||||||
.w { color: #bbbbbb } /* Text.Whitespace */
|
.w { color: #bbbbbb } /* Text.Whitespace */
|
||||||
.mf { color: #7AC; font-weight: bold } /* Literal.Number.Float */
|
.mf { color: #7AC; font-weight: bold } /* Literal.Number.Float */
|
||||||
.mh { color: #7AC; font-weight: bold } /* Literal.Number.Hex */
|
.mh { color: #7AC; font-weight: bold } /* Literal.Number.Hex */
|
||||||
.mi {color:#099;} /* Literal.Number.Integer */
|
.mi {color: #099;} /* Literal.Number.Integer */
|
||||||
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
|
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
|
||||||
.sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
|
.sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
|
||||||
.sc{color:#d14;} /* Literal.String.Char */
|
.sc{color: #d14;} /* Literal.String.Char */
|
||||||
.sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
|
.sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
|
||||||
.s2{color:orange;} /* Literal.String.Double */
|
.s2{color: orange;} /* Literal.String.Double */
|
||||||
.se{color:orange;} /* Literal.String.Escape */
|
.se{color: orange;} /* Literal.String.Escape */
|
||||||
.sh{color:orange;} /* Literal.String.Heredoc */
|
.sh{color: orange;} /* Literal.String.Heredoc */
|
||||||
.si{color:orange;} /* Literal.String.Interpol */
|
.si{color: orange;} /* Literal.String.Interpol */
|
||||||
.sx{color:orange;} /* Literal.String.Other */
|
.sx{color: orange;} /* Literal.String.Other */
|
||||||
.sr{color:orange;} /* Literal.String.Regex */
|
.sr{color: orange;} /* Literal.String.Regex */
|
||||||
.s1{color:orange;} /* Literal.String.Single */
|
.s1{color: orange;} /* Literal.String.Single */
|
||||||
.ss{color:orange;} /* Literal.String.Symbol */
|
.ss{color: orange;} /* Literal.String.Symbol */
|
||||||
.bp { color: #D58 } /* Name.Builtin.Pseudo */
|
.bp { color: #D58 } /* Name.Builtin.Pseudo */
|
||||||
.vc { color: #336699 } /* Name.Variable.Class */
|
.vc { color: #336699 } /* Name.Variable.Class */
|
||||||
.vg { color: #dd7700 } /* Name.Variable.Global */
|
.vg { color: #dd7700 } /* Name.Variable.Global */
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
.white .lines .highlight {
|
.white .highlight {
|
||||||
background: white;
|
pre {
|
||||||
pre { color: #333; }
|
background-color: #fff;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
.hll { display: block; background-color: $hover }
|
.hll { display: block; background-color: $hover }
|
||||||
.c { color: #888888; font-style: italic } /* Comment */
|
.c { color: #888888; font-style: italic } /* Comment */
|
||||||
|
@ -20,42 +22,42 @@
|
||||||
.gs { font-weight: bold } /* Generic.Strong */
|
.gs { font-weight: bold } /* Generic.Strong */
|
||||||
.gu { color: #606060 } /* Generic.Subheading */
|
.gu { color: #606060 } /* Generic.Subheading */
|
||||||
.gt { color: #aa0000 } /* Generic.Traceback */
|
.gt { color: #aa0000 } /* Generic.Traceback */
|
||||||
.kc{font-weight:bold;} /* Keyword.Constant */
|
.kc{font-weight: bold;} /* Keyword.Constant */
|
||||||
.kd{font-weight:bold;} /* Keyword.Declaration */
|
.kd{font-weight: bold;} /* Keyword.Declaration */
|
||||||
.kn{font-weight:bold;} /* Keyword.Namespace */
|
.kn{font-weight: bold;} /* Keyword.Namespace */
|
||||||
.kp{font-weight:bold;} /* Keyword.Pseudo */
|
.kp{font-weight: bold;} /* Keyword.Pseudo */
|
||||||
.kr{font-weight:bold;} /* Keyword.Reserved */
|
.kr{font-weight: bold;} /* Keyword.Reserved */
|
||||||
.kt{color:#458;font-weight:bold;} /* Keyword.Type */
|
.kt{color: #458;font-weight: bold;} /* Keyword.Type */
|
||||||
.m { color: #0000DD; font-weight: bold } /* Literal.Number */
|
.m { color: #0000DD; font-weight: bold } /* Literal.Number */
|
||||||
.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
|
.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
|
||||||
.na{color:#008080;} /* Name.Attribute */
|
.na{color: #008080;} /* Name.Attribute */
|
||||||
.nb{color:#0086B3;} /* Name.Builtin */
|
.nb{color: #0086B3;} /* Name.Builtin */
|
||||||
.nc{color:#458;font-weight:bold;} /* Name.Class */
|
.nc{color: #458;font-weight: bold;} /* Name.Class */
|
||||||
.no{color:#008080;} /* Name.Constant */
|
.no{color: #008080;} /* Name.Constant */
|
||||||
.ni{color:#800080;}
|
.ni{color: #800080;}
|
||||||
.ne{color:#900;font-weight:bold;} /* Name.Exception */
|
.ne{color: #900;font-weight: bold;} /* Name.Exception */
|
||||||
.nf{color:#900;font-weight:bold;} /* Name.Function */
|
.nf{color: #900;font-weight: bold;} /* Name.Function */
|
||||||
.nn{color:#005;font-weight:bold;} /* Name.Namespace */
|
.nn{color: #005;font-weight: bold;} /* Name.Namespace */
|
||||||
.nt{color:#000080;} /* Name.Tag */
|
.nt{color: #000080;} /* Name.Tag */
|
||||||
.nv{color:#008080;} /* Name.Variable */
|
.nv{color: #008080;} /* Name.Variable */
|
||||||
.py { color: #336699; font-weight: bold } /* Name.Property */
|
.py { color: #336699; font-weight: bold } /* Name.Property */
|
||||||
.ow { color: #008800 } /* Operator.Word */
|
.ow { color: #008800 } /* Operator.Word */
|
||||||
.w { color: #bbbbbb } /* Text.Whitespace */
|
.w { color: #bbbbbb } /* Text.Whitespace */
|
||||||
.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
|
.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
|
||||||
.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
|
.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
|
||||||
.mi {color:#099;} /* Literal.Number.Integer */
|
.mi {color: #099;} /* Literal.Number.Integer */
|
||||||
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
|
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
|
||||||
.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
|
.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
|
||||||
.sc{color:#d14;} /* Literal.String.Char */
|
.sc{color: #d14;} /* Literal.String.Char */
|
||||||
.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
|
.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
|
||||||
.s2{color:#d14;} /* Literal.String.Double */
|
.s2{color: #d14;} /* Literal.String.Double */
|
||||||
.se{color:#d14;} /* Literal.String.Escape */
|
.se{color: #d14;} /* Literal.String.Escape */
|
||||||
.sh{color:#d14;} /* Literal.String.Heredoc */
|
.sh{color: #d14;} /* Literal.String.Heredoc */
|
||||||
.si{color:#d14;} /* Literal.String.Interpol */
|
.si{color: #d14;} /* Literal.String.Interpol */
|
||||||
.sx{color:#d14;} /* Literal.String.Other */
|
.sx{color: #d14;} /* Literal.String.Other */
|
||||||
.sr{color:#d14;} /* Literal.String.Regex */
|
.sr{color: #d14;} /* Literal.String.Regex */
|
||||||
.s1{color:#d14;} /* Literal.String.Single */
|
.s1{color: #d14;} /* Literal.String.Single */
|
||||||
.ss{color:#d14;} /* Literal.String.Symbol */
|
.ss{color: #d14;} /* Literal.String.Symbol */
|
||||||
.bp { color: #003388 } /* Name.Builtin.Pseudo */
|
.bp { color: #003388 } /* Name.Builtin.Pseudo */
|
||||||
.vc { color: #336699 } /* Name.Variable.Class */
|
.vc { color: #336699 } /* Name.Variable.Class */
|
||||||
.vg { color: #dd7700 } /* Name.Variable.Global */
|
.vg { color: #dd7700 } /* Name.Variable.Global */
|
||||||
|
@ -63,7 +65,5 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.shadow {
|
.shadow {
|
||||||
-webkit-box-shadow:0 5px 15px #000;
|
@include box-shadow(0 5px 15px #000);
|
||||||
-moz-box-shadow:0 5px 15px #000;
|
|
||||||
box-shadow:0 5px 15px #000;
|
|
||||||
}
|
}
|
||||||
|
|
257
app/assets/stylesheets/jquery.ui.gitlab.css
vendored
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-disabled { cursor: default !important; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jQuery UI CSS Framework 1.8.7
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Theming/API
|
||||||
|
*
|
||||||
|
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Component containers
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-widget { font-family: Arial,sans-serif; font-size: 1.1em; }
|
||||||
|
.ui-widget .ui-widget { font-size: 1em; }
|
||||||
|
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,sans-serif; font-size: 1em; }
|
||||||
|
.ui-widget-content { border: 1px solid #CCC; background: #ffffff; color: #4F4F4F; }
|
||||||
|
.ui-widget-content a { color: #4F4F4F; }
|
||||||
|
.ui-widget-header { border: 1px solid #B6B6B6; color: #4F4F4F; font-weight: bold; }
|
||||||
|
.ui-widget-header {
|
||||||
|
background: #ededed url(bg_fallback.png) 0 0 repeat-x; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #ededed 0%, #c4c4c4 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#c4c4c4)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */
|
||||||
|
}
|
||||||
|
.ui-widget-header a { color: #4F4F4F; }
|
||||||
|
|
||||||
|
/* Interaction states
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #B6B6B6; font-weight: normal; color: #4F4F4F; }
|
||||||
|
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
|
||||||
|
background: #ededed url(bg_fallback.png) 0 0 repeat-x; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #ededed 0%, #c4c4c4 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#c4c4c4)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */
|
||||||
|
-webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset;
|
||||||
|
-moz-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset;
|
||||||
|
box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset;
|
||||||
|
}
|
||||||
|
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #4F4F4F; text-decoration: none; }
|
||||||
|
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #9D9D9D; font-weight: normal; color: #313131; }
|
||||||
|
.ui-state-hover a, .ui-state-hover a:hover { color: #313131; text-decoration: none; }
|
||||||
|
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
|
||||||
|
outline: none;
|
||||||
|
color: #1c4257; border: 1px solid #7096ab;
|
||||||
|
background: #ededed url(bg_fallback.png) 0 -50px repeat-x; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #b9e0f5 0%, #92bdd6 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b9e0f5), color-stop(100%,#92bdd6)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Opera11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* W3C */
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
-moz-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #313131; text-decoration: none; }
|
||||||
|
.ui-widget :active { outline: none; }
|
||||||
|
|
||||||
|
/* Interaction Cues
|
||||||
|
----------------------------------*/
|
||||||
|
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #d2dbf4; background: #f4f8fd; color: #0d2054; -moz-border-radius: 0 !important; -webkit-border-radius: 0 !important; border-radius: 0 !important; }
|
||||||
|
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
|
||||||
|
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #e2d0d0; background: #fcf0f0; color: #280b0b; -moz-border-radius: 0 !important; -webkit-border-radius: 0 !important; border-radius: 0 !important; }
|
||||||
|
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
|
||||||
|
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
|
||||||
|
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
||||||
|
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
||||||
|
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
||||||
|
|
||||||
|
/* Icons
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* states and images */
|
||||||
|
.ui-icon { width: 16px; height: 16px; background-image: url(ui-icons_222222_256x240.png); }
|
||||||
|
.ui-widget-content .ui-icon {background-image: url(ui-icons_222222_256x240.png); }
|
||||||
|
.ui-widget-header .ui-icon {background-image: url(ui-icons_222222_256x240.png); }
|
||||||
|
.ui-state-default .ui-icon { background-image: url(ui-icons_454545_256x240.png); }
|
||||||
|
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(ui-icons_454545_256x240.png); }
|
||||||
|
.ui-state-active .ui-icon {background-image: url(ui-icons_454545_256x240.png); }
|
||||||
|
.ui-state-highlight .ui-icon {background-image: url(ui-icons_454545_256x240.png); }
|
||||||
|
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { background: url(icon_sprite.png) -16px 0 no-repeat !important; }
|
||||||
|
.ui-state-highlight .ui-icon, .ui-state-error .ui-icon { margin-top: -1px; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc visuals
|
||||||
|
----------------------------------*/
|
||||||
|
|
||||||
|
/* Overlays */
|
||||||
|
.ui-widget-overlay { background: #262b33; opacity: .70;filter:Alpha(Opacity=70); }
|
||||||
|
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #000000; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
|
||||||
|
/*
|
||||||
|
* jQuery UI Selectable 1.8.7
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Selectable#theming
|
||||||
|
*/
|
||||||
|
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
||||||
|
/*
|
||||||
|
* jQuery UI Autocomplete 1.8.7
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Autocomplete#theming
|
||||||
|
*/
|
||||||
|
.ui-autocomplete {
|
||||||
|
position: absolute; cursor: default; z-index: 3;
|
||||||
|
-moz-border-radius: 0;
|
||||||
|
-webkit-border-radius: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
-moz-box-shadow: 0 1px 5px rgba(0,0,0,0.3);
|
||||||
|
-webkit-box-shadow: 0 1px 5px rgba(0,0,0,0.3);
|
||||||
|
box-shadow: 0 1px 5px rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* workarounds */
|
||||||
|
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jQuery UI Menu 1.8.7
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Menu#theming
|
||||||
|
*/
|
||||||
|
.ui-menu {
|
||||||
|
list-style:none;
|
||||||
|
padding: 1px;
|
||||||
|
margin: 0;
|
||||||
|
display:block;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu {
|
||||||
|
margin-top: -3px;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item {
|
||||||
|
margin:0;
|
||||||
|
padding: 0;
|
||||||
|
zoom: 1;
|
||||||
|
float: left;
|
||||||
|
clear: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item a {
|
||||||
|
text-decoration:none;
|
||||||
|
display:block;
|
||||||
|
padding:.2em .4em;
|
||||||
|
line-height:1.5;
|
||||||
|
zoom:1;
|
||||||
|
color: #666;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.ui-menu .ui-menu-item a.ui-state-hover,
|
||||||
|
.ui-menu .ui-menu-item a.ui-state-active {
|
||||||
|
font-weight: normal;
|
||||||
|
margin: -1px;
|
||||||
|
background: #D9EDF7;
|
||||||
|
color: #3A89A3;
|
||||||
|
text-shadow: 0px 1px 1px #fff;
|
||||||
|
border: none;
|
||||||
|
border: 1px solid #ADE;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* jQuery UI Datepicker 1.8.7
|
||||||
|
*
|
||||||
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* http://docs.jquery.com/UI/Datepicker#theming
|
||||||
|
*/
|
||||||
|
.ui-datepicker {
|
||||||
|
width: 17em;
|
||||||
|
padding: 0;
|
||||||
|
display: none;
|
||||||
|
border-color: #DDDDDD;
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.ui-datepicker .ui-datepicker-header {
|
||||||
|
position:relative;
|
||||||
|
padding:.35em 0;
|
||||||
|
border: none;
|
||||||
|
border-bottom: 1px solid #B6B6B6;
|
||||||
|
-moz-border-radius: 0;
|
||||||
|
-webkit-border-radius: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border: 1px solid #bbb;
|
||||||
|
-webkit-box-shadow: 0 0 0 3px #F1F1F1;
|
||||||
|
-moz-box-shadow: 0 0 0 3px #f1f1f1;
|
||||||
|
-ms-box-shadow: 0 0 0 3px #f1f1f1;
|
||||||
|
-o-box-shadow: 0 0 0 3px #f1f1f1;
|
||||||
|
box-shadow: 0 0 0 3px #F1F1F1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 6px; width: 1.8em; height: 1.8em; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { border: 1px none; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
||||||
|
.ui-datepicker .ui-datepicker-next { right:2px; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev span { background-position: 0px -32px !important; }
|
||||||
|
.ui-datepicker .ui-datepicker-next span { background-position: -16px -32px !important; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev-hover span { background-position: 0px -48px !important; }
|
||||||
|
.ui-datepicker .ui-datepicker-next-hover span { background-position: -16px -48px !important; }
|
||||||
|
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; background: url(icon_sprite.png) no-repeat; }
|
||||||
|
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; font-size: 12px; text-shadow: 0 1px 0 rgba(255,255,255,0.6); }
|
||||||
|
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
|
||||||
|
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
||||||
|
.ui-datepicker select.ui-datepicker-month,
|
||||||
|
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
||||||
|
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
||||||
|
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
||||||
|
.ui-datepicker td { border: 0; padding: 1px; line-height: 24px; background-color: #FFF!important; }
|
||||||
|
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
||||||
|
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
||||||
|
.ui-datepicker table .ui-state-highlight { border-color: #ADE; }
|
||||||
|
.ui-datepicker-calendar .ui-state-default { background: transparent; border-color: #FFF; }
|
||||||
|
.ui-datepicker-calendar .ui-state-active { background: #D9EDF7; border-color: #ADE; color: #3A89A3; font-weight: bold; text-shadow: 0 1px 1px #fff; }
|
|
@ -1,204 +0,0 @@
|
||||||
/** Override bootstrap variables **/
|
|
||||||
$baseFontSize: 13px !default;
|
|
||||||
$baseLineHeight: 18px !default;
|
|
||||||
|
|
||||||
@import "bootstrap";
|
|
||||||
@import "bootstrap-responsive";
|
|
||||||
@import 'font-awesome';
|
|
||||||
|
|
||||||
/** GitLab colors **/
|
|
||||||
$link_color: #3A89A3;
|
|
||||||
$blue_link: #2FA0BB;
|
|
||||||
$style_color: #474D57;
|
|
||||||
$hover: #D9EDF7;
|
|
||||||
$hover_border: #ADF;
|
|
||||||
|
|
||||||
/** GitLab Fonts **/
|
|
||||||
@font-face { font-family: Korolev; src: font-url('korolev-medium-compressed.otf'); }
|
|
||||||
$monospace: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono', 'lucida console', monospace;
|
|
||||||
|
|
||||||
/** MIXINS **/
|
|
||||||
@mixin shade {
|
|
||||||
-moz-box-shadow: 0 0 3px #ddd;
|
|
||||||
-webkit-box-shadow: 0 0 3px #ddd;
|
|
||||||
box-shadow: 0 0 3px #ddd;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin solid_shade {
|
|
||||||
-moz-box-shadow: 0 0 0 3px #f1f1f1;
|
|
||||||
-webkit-box-shadow: 0 0 0 3px #f1f1f1;
|
|
||||||
box-shadow: 0 0 0 3px #f1f1f1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin border-radius($radius) {
|
|
||||||
-moz-border-radius: $radius;
|
|
||||||
-webkit-border-radius: $radius;
|
|
||||||
border-radius: $radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin round-borders-bottom($radius) {
|
|
||||||
border-top: 1px solid #eaeaea;
|
|
||||||
-moz-border-radius-bottomright: $radius;
|
|
||||||
-moz-border-radius-bottomleft: $radius;
|
|
||||||
border-bottom-right-radius: $radius;
|
|
||||||
border-bottom-left-radius: $radius;
|
|
||||||
-webkit-border-bottom-left-radius: $radius;
|
|
||||||
-webkit-border-bottom-right-radius: $radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin round-borders-top($radius) {
|
|
||||||
border-top: 1px solid #eaeaea;
|
|
||||||
-moz-border-radius-topright: $radius;
|
|
||||||
-moz-border-radius-topleft: $radius;
|
|
||||||
border-top-right-radius: $radius;
|
|
||||||
border-top-left-radius: $radius;
|
|
||||||
-webkit-border-top-left-radius: $radius;
|
|
||||||
-webkit-border-top-right-radius: $radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin round-borders-all($radius) {
|
|
||||||
border: 1px solid #eaeaea;
|
|
||||||
-moz-border-radius: $radius;
|
|
||||||
-webkit-border-radius: $radius;
|
|
||||||
border-radius: $radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin bg-gradient($from, $to) {
|
|
||||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to));
|
|
||||||
background-image: -webkit-linear-gradient($from, $to);
|
|
||||||
background-image: -moz-linear-gradient($from, $to);
|
|
||||||
background-image: -o-linear-gradient($from, $to);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin bg-light-gray-gradient {
|
|
||||||
background:#f1f1f1;
|
|
||||||
background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #f5f5f5), to(#e1e1e1));
|
|
||||||
background-image: -webkit-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
|
|
||||||
background-image: -moz-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
|
|
||||||
background-image: -o-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin bg-gray-gradient {
|
|
||||||
background:#eee;
|
|
||||||
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: -o-linear-gradient(#eee 6.6%, #dfdfdf);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin bg-dark-gray-gradient {
|
|
||||||
background:#eee;
|
|
||||||
background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7);
|
|
||||||
background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7);
|
|
||||||
background-image: -o-linear-gradient(#e9e9e9, #d7d7d7);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Header of application.
|
|
||||||
* Contain application logo, search panel, profile icon
|
|
||||||
*/
|
|
||||||
@import "sections/header.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Navigation menu of application.
|
|
||||||
* Panel with links to pages depends on project, profile or admin area
|
|
||||||
*/
|
|
||||||
@import "sections/nav.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file represent some UI that can be changed
|
|
||||||
* during web app restyle or theme select.
|
|
||||||
*
|
|
||||||
* Next items should be placed there
|
|
||||||
* - link, button colors
|
|
||||||
* - header restyles
|
|
||||||
* - main menu restyles
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@import "themes/ui_basic.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UI themes:
|
|
||||||
*/
|
|
||||||
@import "themes/ui_mars.scss";
|
|
||||||
@import "themes/ui_modern.scss";
|
|
||||||
@import "themes/ui_gray.scss";
|
|
||||||
@import "themes/ui_color.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GitLab bootstrap.
|
|
||||||
* Overrides some styles of twitter bootstrap.
|
|
||||||
* Also give some common classes for GitLab app
|
|
||||||
*/
|
|
||||||
@import "gitlab_bootstrap/common.scss";
|
|
||||||
@import "gitlab_bootstrap/typography.scss";
|
|
||||||
@import "gitlab_bootstrap/buttons.scss";
|
|
||||||
@import "gitlab_bootstrap/blocks.scss";
|
|
||||||
@import "gitlab_bootstrap/files.scss";
|
|
||||||
@import "gitlab_bootstrap/tables.scss";
|
|
||||||
@import "gitlab_bootstrap/lists.scss";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Most of application styles placed here.
|
|
||||||
* This file represent common UI that should not be changed between themes
|
|
||||||
* or project restyling like form width or user avatar class or commit title
|
|
||||||
*
|
|
||||||
* TODO: clean it
|
|
||||||
*/
|
|
||||||
@import "common.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styles related to specific part of app
|
|
||||||
*/
|
|
||||||
@import "sections/commits.scss";
|
|
||||||
@import "sections/issues.scss";
|
|
||||||
@import "sections/projects.scss";
|
|
||||||
@import "sections/merge_requests.scss";
|
|
||||||
@import "sections/graph.scss";
|
|
||||||
@import "sections/events.scss";
|
|
||||||
@import "sections/themes.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This scss file redefine chozen selectbox styles for
|
|
||||||
* project Branch/Tag select element
|
|
||||||
*/
|
|
||||||
@import "ref_select.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Code (files list) styles. Browsing project files there
|
|
||||||
*/
|
|
||||||
@import "sections/tree.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file represent notes(comments) styles
|
|
||||||
*/
|
|
||||||
@import "sections/notes.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file represent profile styles
|
|
||||||
*/
|
|
||||||
@import "sections/profile.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Devise styles
|
|
||||||
*/
|
|
||||||
@import "sections/login.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CODE HIGHTLIGHT BASE
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@import "highlight/white.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CODE HIGHTLIGHT DARK schema
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@import "highlight/dark.scss";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* File Editor styles
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@import "sections/editor.scss";
|
|
|
@ -1,6 +1,6 @@
|
||||||
/** Branch/tag selector **/
|
/** Branch/tag selector **/
|
||||||
.project-refs-form {
|
.project-refs-form {
|
||||||
margin:0;
|
margin: 0;
|
||||||
span {
|
span {
|
||||||
background:none !important;
|
background:none !important;
|
||||||
position:static !important;
|
position:static !important;
|
||||||
|
@ -9,7 +9,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.project-refs-select {
|
.project-refs-select {
|
||||||
width:120px;
|
width: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-refs-form .chzn-container {
|
.project-refs-form .chzn-container {
|
||||||
|
@ -21,10 +21,10 @@
|
||||||
.chzn-drop {
|
.chzn-drop {
|
||||||
min-width: 400px;
|
min-width: 400px;
|
||||||
.chzn-results {
|
.chzn-results {
|
||||||
max-height:300px;
|
max-height: 300px;
|
||||||
}
|
}
|
||||||
.chzn-search input {
|
.chzn-search input {
|
||||||
min-width:365px;
|
min-width: 365px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,21 +33,19 @@
|
||||||
.chzn-container {
|
.chzn-container {
|
||||||
.chzn-search {
|
.chzn-search {
|
||||||
input:focus {
|
input:focus {
|
||||||
-webkit-box-shadow: none;
|
@include box-shadow(none);
|
||||||
-moz-box-shadow: none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.chzn-drop {
|
.chzn-drop {
|
||||||
margin:7px 0;
|
margin: 7px 0;
|
||||||
min-width: 200px;
|
min-width: 200px;
|
||||||
border: 1px solid #bbb;
|
border: 1px solid #bbb;
|
||||||
border-radius:0;
|
@include border-radius(0);
|
||||||
|
|
||||||
.chzn-results {
|
.chzn-results {
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
max-height:300px;
|
max-height: 300px;
|
||||||
|
|
||||||
.group-result {
|
.group-result {
|
||||||
color: $style_color;
|
color: $style_color;
|
||||||
|
@ -55,7 +53,7 @@
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
.active-result {
|
.active-result {
|
||||||
border-radius: 0;
|
@include border-radius(0);
|
||||||
|
|
||||||
&.highlighted {
|
&.highlighted {
|
||||||
background: $hover;
|
background: $hover;
|
||||||
|
@ -71,7 +69,7 @@
|
||||||
.chzn-search {
|
.chzn-search {
|
||||||
@include bg-gray-gradient;
|
@include bg-gray-gradient;
|
||||||
input {
|
input {
|
||||||
min-width:165px;
|
min-width: 165px;
|
||||||
border-color: #CCC;
|
border-color: #CCC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,8 +79,8 @@
|
||||||
@include bg-light-gray-gradient;
|
@include bg-light-gray-gradient;
|
||||||
|
|
||||||
div {
|
div {
|
||||||
background:transparent;
|
background: transparent;
|
||||||
border-left:none;
|
border-left: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
span {
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
|
|
||||||
.commit-title {
|
.commit-title {
|
||||||
line-height: 26px;
|
line-height: 26px;
|
||||||
margin:0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.commit-description {
|
.commit-description {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
padding-top:10px;
|
padding-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.browse-button {
|
.browse-button {
|
||||||
|
@ -28,9 +28,9 @@
|
||||||
@extend .clearfix;
|
@extend .clearfix;
|
||||||
|
|
||||||
.sha-block {
|
.sha-block {
|
||||||
text-align:right;
|
text-align: right;
|
||||||
&:first-child {
|
&:first-child {
|
||||||
padding-bottom:6px;
|
padding-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
@ -49,10 +49,10 @@
|
||||||
|
|
||||||
.author a,
|
.author a,
|
||||||
.committer a {
|
.committer a {
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
line-height:22px;
|
line-height: 22px;
|
||||||
text-shadow:0 1px 1px #fff;
|
text-shadow: 0 1px 1px #fff;
|
||||||
color:#777;
|
color: #777;
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
@ -70,15 +70,16 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.diff_file {
|
.diff_file {
|
||||||
border:1px solid #CCC;
|
border: 1px solid #CCC;
|
||||||
margin-bottom:1em;
|
margin-bottom: 1em;
|
||||||
|
|
||||||
.diff_file_header {
|
.diff_file_header {
|
||||||
@extend .clearfix;
|
@extend .clearfix;
|
||||||
padding: 5px 5px 5px 10px;
|
padding: 5px 5px 5px 10px;
|
||||||
color: #555;
|
color: #555;
|
||||||
border-bottom:1px solid #CCC;
|
border-bottom: 1px solid #CCC;
|
||||||
background: #eee;
|
background: #eee;
|
||||||
|
// TODO Replace with linear-gradient mixin
|
||||||
background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
|
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: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
|
||||||
background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
|
background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
|
||||||
|
@ -86,7 +87,7 @@
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
font-family: $monospace;
|
font-family: $monospace;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,36 +105,36 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.diff_file_content {
|
.diff_file_content {
|
||||||
overflow:auto;
|
overflow: auto;
|
||||||
overflow-y:hidden;
|
overflow-y: hidden;
|
||||||
background:#fff;
|
background: #fff;
|
||||||
color:#333;
|
color: #333;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-family: $monospace;
|
font-family: $monospace;
|
||||||
.old{
|
.old{
|
||||||
span.idiff{
|
span.idiff{
|
||||||
background-color:#FAA;
|
background-color: #FAA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.new{
|
.new{
|
||||||
span.idiff{
|
span.idiff{
|
||||||
background-color:#AFA;
|
background-color: #AFA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
td {
|
td {
|
||||||
line-height:18px;
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.diff_file_content_image {
|
.diff_file_content_image {
|
||||||
background:#eee;
|
background: #eee;
|
||||||
text-align:center;
|
text-align: center;
|
||||||
.image {
|
.image {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin:50px;
|
margin: 50px;
|
||||||
max-width:400px;
|
max-width: 400px;
|
||||||
|
|
||||||
img{
|
img{
|
||||||
background: url('trans_bg.gif');
|
background: url('trans_bg.gif');
|
||||||
|
@ -158,7 +159,7 @@
|
||||||
|
|
||||||
&.img_compared {
|
&.img_compared {
|
||||||
.image {
|
.image {
|
||||||
max-width:300px;
|
max-width: 300px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -166,46 +167,46 @@
|
||||||
|
|
||||||
.diff_file_content{
|
.diff_file_content{
|
||||||
table {
|
table {
|
||||||
border:none;
|
border: none;
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
padding:0px;
|
padding: 0px;
|
||||||
tr {
|
tr {
|
||||||
td {
|
td {
|
||||||
font-size:12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.old_line, .new_line {
|
.old_line, .new_line {
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
padding:0px;
|
padding: 0px;
|
||||||
border:none;
|
border: none;
|
||||||
background:#EEE;
|
background: #EEE;
|
||||||
color:#666;
|
color: #666;
|
||||||
padding: 0px 5px;
|
padding: 0px 5px;
|
||||||
border-right: 1px solid #ccc;
|
border-right: 1px solid #ccc;
|
||||||
text-align:right;
|
text-align: right;
|
||||||
min-width:35px;
|
min-width: 35px;
|
||||||
max-width:35px;
|
max-width: 35px;
|
||||||
width:35px;
|
width: 35px;
|
||||||
moz-user-select: none;
|
moz-user-select: none;
|
||||||
-khtml-user-select: none;
|
-khtml-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
a {
|
a {
|
||||||
float:left;
|
float: left;
|
||||||
width:35px;
|
width: 35px;
|
||||||
font-weight:normal;
|
font-weight: normal;
|
||||||
color:#666;
|
color: #666;
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration:underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.line_content {
|
.line_content {
|
||||||
white-space:pre;
|
white-space: pre;
|
||||||
height:14px;
|
height: 14px;
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
padding:0px;
|
padding: 0px;
|
||||||
border:none;
|
border: none;
|
||||||
&.new {
|
&.new {
|
||||||
background: #CFD;
|
background: #CFD;
|
||||||
}
|
}
|
||||||
|
@ -213,8 +214,8 @@
|
||||||
background: #FDD;
|
background: #FDD;
|
||||||
}
|
}
|
||||||
&.matched {
|
&.matched {
|
||||||
color:#ccc;
|
color: #ccc;
|
||||||
background:#fafafa;
|
background: #fafafa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,32 +229,30 @@
|
||||||
|
|
||||||
/** COMMIT ROW **/
|
/** COMMIT ROW **/
|
||||||
.commit {
|
.commit {
|
||||||
@extend .wll;
|
|
||||||
|
|
||||||
.browse_code_link_holder {
|
.browse_code_link_holder {
|
||||||
@extend .span2;
|
@extend .span2;
|
||||||
float:right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.committed_ago {
|
.committed_ago {
|
||||||
float:right;
|
float: right;
|
||||||
@extend .cgray;
|
@extend .cgray;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notes_count {
|
.notes_count {
|
||||||
float:right;
|
float: right;
|
||||||
margin: -6px 8px 6px;
|
margin: -6px 8px 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
background:#FCEEC1;
|
background: #FCEEC1;
|
||||||
color:$style_color;
|
color: $style_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.commit_short_id {
|
.commit_short_id {
|
||||||
float:left;
|
float: left;
|
||||||
@extend .lined;
|
@extend .lined;
|
||||||
min-width:65px;
|
min-width: 65px;
|
||||||
font-family: $monospace;
|
font-family: $monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,11 +293,24 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.label_commit {
|
.label_commit {
|
||||||
@include round-borders-all(4px);
|
@include border-radius(4px);
|
||||||
padding:2px 4px;
|
padding: 2px 4px;
|
||||||
border:none;
|
font-size: 13px;
|
||||||
font-size:13px;
|
|
||||||
background: #474D57;
|
background: #474D57;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
font-family: $monospace;
|
font-family: $monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.commits-compare-switch{
|
||||||
|
background: url("switch_icon.png") no-repeat center center;
|
||||||
|
width: 16px;
|
||||||
|
height: 18px;
|
||||||
|
text-indent: -9999px;
|
||||||
|
float: left;
|
||||||
|
margin-right: 9px;
|
||||||
|
border: 1px solid #DDD;
|
||||||
|
@include border-radius(4px);
|
||||||
|
padding: 4px;
|
||||||
|
background-color: #EEE;
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.file-editor {
|
.file-editor {
|
||||||
#editor{
|
#editor{
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 0;
|
@include border-radius(0);
|
||||||
height: 500px;
|
height: 500px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
|
@ -4,25 +4,25 @@
|
||||||
*/
|
*/
|
||||||
.event_label {
|
.event_label {
|
||||||
&.pushed {
|
&.pushed {
|
||||||
padding:0 2px;
|
padding: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.opened {
|
&.opened {
|
||||||
padding:0 2px;
|
padding: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.closed {
|
&.closed {
|
||||||
padding:0 2px;
|
padding: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.merged {
|
&.merged {
|
||||||
padding:0 2px;
|
padding: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.left,
|
&.left,
|
||||||
&.joined {
|
&.joined {
|
||||||
padding:0 2px;
|
padding: 0 2px;
|
||||||
float:none;
|
float: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,49 +31,51 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.event-item {
|
.event-item {
|
||||||
min-height:40px;
|
border-bottom: 1px solid #eee;
|
||||||
border-bottom:1px solid #eee;
|
|
||||||
.event-title {
|
.event-title {
|
||||||
color:#333;
|
color: #333;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
.author_name {
|
.author_name {
|
||||||
color:#333;
|
color: #333;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.event-body {
|
.event-body {
|
||||||
p {
|
p {
|
||||||
color:#555;
|
color: #555;
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
}
|
}
|
||||||
.event-info {
|
.event-info {
|
||||||
color:#666;
|
color: #666;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.avatar {
|
.avatar {
|
||||||
width:32px;
|
position: relative;
|
||||||
|
top: -3px;
|
||||||
}
|
}
|
||||||
.event_icon {
|
.event_icon {
|
||||||
|
position: relative;
|
||||||
float: right;
|
float: right;
|
||||||
border: 1px solid #EEE;
|
border: 1px solid #EEE;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
@include border-radius(5px);
|
@include border-radius(5px);
|
||||||
background: #F9F9F9;
|
background: #F9F9F9;
|
||||||
|
margin-left: 10px;
|
||||||
|
top: -6px;
|
||||||
img {
|
img {
|
||||||
width:20px;
|
width: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ul {
|
ul {
|
||||||
margin-left:50px;
|
margin-left: 50px;
|
||||||
margin-bottom:5px;
|
margin-bottom: 5px;
|
||||||
.avatar {
|
.avatar {
|
||||||
width:18px;
|
width: 18px;
|
||||||
margin-top:3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
padding: 15px 5px;
|
padding: 16px 5px;
|
||||||
&:last-child { border:none }
|
&:last-child { border:none }
|
||||||
.wll:hover { background:none }
|
|
||||||
|
|
||||||
.event_commits {
|
.event_commits {
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
|
@ -81,9 +83,9 @@
|
||||||
li {
|
li {
|
||||||
&.commit {
|
&.commit {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
padding:3px;
|
padding: 3px;
|
||||||
border:none;
|
border: none;
|
||||||
font-size:12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
&.commits-stat {
|
&.commits-stat {
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -98,15 +100,15 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.event_lp {
|
.event_lp {
|
||||||
color:#777;
|
color: #777;
|
||||||
padding:10px;
|
padding: 10px;
|
||||||
min-height:22px;
|
min-height: 22px;
|
||||||
border-left: 5px solid #5AB9C3;
|
border-left: 5px solid #5AB9C3;
|
||||||
margin-bottom:20px;
|
margin-bottom: 20px;
|
||||||
background:#f9f9f9;
|
background: #f9f9f9;
|
||||||
|
|
||||||
.avatar {
|
.avatar {
|
||||||
width:24px;
|
width: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-new-mr {
|
.btn-new-mr {
|
||||||
|
@ -133,7 +135,7 @@
|
||||||
background: #f9f9f9;
|
background: #f9f9f9;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
img {
|
img {
|
||||||
width:20px;
|
width: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inactive {
|
&.inactive {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
.graph_holder {
|
.graph_holder {
|
||||||
border: 1px solid #aaa;
|
border: 1px solid #aaa;
|
||||||
padding:1px;
|
padding: 1px;
|
||||||
|
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
padding:0 10px;
|
padding: 0 10px;
|
||||||
border-bottom: 1px solid #bbb;
|
border-bottom: 1px solid #bbb;
|
||||||
@include bg-gray-gradient;
|
@include bg-gray-gradient;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
header {
|
header {
|
||||||
&.navbar-gitlab {
|
&.navbar-gitlab {
|
||||||
.navbar-inner {
|
.navbar-inner {
|
||||||
height:45px;
|
height: 45px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
background: #F1F1F1;
|
background: #F1F1F1;
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@ header {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
z-index:10;
|
z-index: 10;
|
||||||
/*height:60px;*/
|
/*height: 60px;*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -33,25 +33,20 @@ header {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.app_logo {
|
.app_logo {
|
||||||
width:170px;
|
width: 170px;
|
||||||
float:left;
|
float: left;
|
||||||
a {
|
a {
|
||||||
float:left;
|
float: left;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
width:90px;
|
width: 90px;
|
||||||
background: url('logo_dark.png') no-repeat 0px 2px;
|
background: url('logo_dark.png') no-repeat 0px 2px;
|
||||||
float:left;
|
float: left;
|
||||||
margin-left:2px;
|
margin-left: 2px;
|
||||||
font-size:30px;
|
padding-left: 45px;
|
||||||
line-height:48px;
|
height: 40px;
|
||||||
font-weight:normal;
|
@include header-font;
|
||||||
color:$style_color;
|
|
||||||
text-shadow: 0 1px 1px #FFF;
|
|
||||||
padding-left:45px;
|
|
||||||
height:40px;
|
|
||||||
font-family: 'Korolev', sans-serif;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,16 +57,11 @@ header {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.project_name {
|
.project_name {
|
||||||
position:relative;
|
position: relative;
|
||||||
float:left;
|
float: left;
|
||||||
margin:0;
|
margin: 0;
|
||||||
margin-right:30px;
|
margin-right: 30px;
|
||||||
font-size:30px;
|
@include header-font;
|
||||||
line-height:48px;
|
|
||||||
font-weight:normal;
|
|
||||||
color:$style_color;
|
|
||||||
text-shadow: 0 1px 1px #FFF;
|
|
||||||
font-family: 'Korolev', sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,7 +71,7 @@ header {
|
||||||
*/
|
*/
|
||||||
.search {
|
.search {
|
||||||
margin-right: 45px;
|
margin-right: 45px;
|
||||||
margin-left:10px;
|
margin-left: 10px;
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
|
|
||||||
.search-input {
|
.search-input {
|
||||||
|
@ -89,11 +79,11 @@ header {
|
||||||
background-image: url("icon-search.png");
|
background-image: url("icon-search.png");
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: 10px;
|
background-position: 10px;
|
||||||
padding-left:25px;
|
padding-left: 25px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
@include border-radius(3px);
|
@include border-radius(3px);
|
||||||
border:1px solid #c6c6c6;
|
border: 1px solid #c6c6c6;
|
||||||
box-shadow:none;
|
box-shadow: none;
|
||||||
&:focus {
|
&:focus {
|
||||||
@extend .span3;
|
@extend .span3;
|
||||||
}
|
}
|
||||||
|
@ -122,7 +112,7 @@ header {
|
||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
display: block;
|
display: block;
|
||||||
top:1px;
|
top: 1px;
|
||||||
&:after {
|
&:after {
|
||||||
content: " ";
|
content: " ";
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -132,12 +122,15 @@ header {
|
||||||
left: 0;
|
left: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
float: right;
|
float: right;
|
||||||
border-radius: 5px;
|
@include border-radius(5px);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.15)), to(rgba(0, 0, 0, 0.25))), -webkit-gradient(linear, left top, right bottom, color-stop(0, rgba(255, 255, 255, 0)), color-stop(0.5, rgba(255, 255, 255, 0.1)), color-stop(0.501, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0)));
|
background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.15)), to(rgba(0, 0, 0, 0.25))),
|
||||||
background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), -moz-linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
|
-webkit-gradient(linear, left top, right bottom, color-stop(0, rgba(255, 255, 255, 0)), color-stop(0.5, rgba(255, 255, 255, 0.1)), color-stop(0.501, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0)));
|
||||||
background: linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
|
background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)),
|
||||||
|
-moz-linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
|
||||||
|
background: linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)),
|
||||||
|
linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
|
||||||
-webkit-background-origin: border-box;
|
-webkit-background-origin: border-box;
|
||||||
-moz-background-origin: border;
|
-moz-background-origin: border;
|
||||||
background-origin: border-box; } } }
|
background-origin: border-box; } } }
|
||||||
|
@ -149,7 +142,7 @@ header {
|
||||||
display: block; } }
|
display: block; } }
|
||||||
|
|
||||||
.account-links {
|
.account-links {
|
||||||
border-radius: 5px;
|
@include border-radius(5px);
|
||||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
||||||
position: relative;
|
position: relative;
|
||||||
&:before {
|
&:before {
|
||||||
|
@ -169,7 +162,7 @@ header {
|
||||||
display: none;
|
display: none;
|
||||||
z-index: 100000;
|
z-index: 100000;
|
||||||
@include border-radius(4px);
|
@include border-radius(4px);
|
||||||
width: 100px;
|
width: 130px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 5px;
|
right: 5px;
|
||||||
top: 38px;
|
top: 38px;
|
||||||
|
@ -178,13 +171,13 @@ header {
|
||||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
|
||||||
a {
|
a {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 7px 10px;
|
padding: 12px 15px;
|
||||||
display: block;
|
display: block;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
border-bottom: 1px solid #666;
|
border-bottom: 1px solid #666;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
&:hover {
|
&:hover {
|
||||||
color:#fff;
|
color: #fff;
|
||||||
background: #333;
|
background: #333;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,20 +190,13 @@ header {
|
||||||
|
|
||||||
.account-links a {
|
.account-links a {
|
||||||
&:first-child {
|
&:first-child {
|
||||||
-webkit-border-top-left-radius: 5px;
|
@include border-radius(5px 5px 0 0);
|
||||||
-webkit-border-top-right-radius: 5px;
|
}
|
||||||
-moz-border-radius-topleft: 5px;
|
|
||||||
-moz-border-radius-topright: 5px;
|
|
||||||
border-top-left-radius: 5px;
|
|
||||||
border-top-right-radius: 5px; }
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
-webkit-border-bottom-right-radius: 5px;
|
@include border-radius(0 0 5px 5px);
|
||||||
-webkit-border-bottom-left-radius: 5px;
|
border-bottom: 0;
|
||||||
-moz-border-radius-bottomright: 5px;
|
}
|
||||||
-moz-border-radius-bottomleft: 5px;
|
}
|
||||||
border-bottom-right-radius: 5px;
|
|
||||||
border-bottom-left-radius: 5px;
|
|
||||||
border-bottom: 0; } }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -248,13 +234,13 @@ header {
|
||||||
a {
|
a {
|
||||||
h1 {
|
h1 {
|
||||||
background: url('logo_white.png') no-repeat 0px 2px;
|
background: url('logo_white.png') no-repeat 0px 2px;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
text-shadow: 0 1px 1px #111;
|
text-shadow: 0 1px 1px #111;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.project_name {
|
.project_name {
|
||||||
color:#fff;
|
color: #fff;
|
||||||
text-shadow: 0 1px 1px #111;
|
text-shadow: 0 1px 1px #111;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
.issue_title {
|
.issue_title {
|
||||||
@extend .top_box_content;
|
@extend .top_box_content;
|
||||||
.clearfix {
|
.clearfix {
|
||||||
margin-bottom:0px;
|
margin-bottom: 0px;
|
||||||
input {
|
input {
|
||||||
@extend .span8;
|
@extend .span8;
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,14 @@
|
||||||
}
|
}
|
||||||
.issue_middle_block {
|
.issue_middle_block {
|
||||||
@extend .middle_box_content;
|
@extend .middle_box_content;
|
||||||
height:30px;
|
height: 30px;
|
||||||
.issue_assignee {
|
.issue_assignee {
|
||||||
@extend .span6;
|
@extend .span6;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
.issue_milestone {
|
.issue_milestone {
|
||||||
@extend .span4;
|
@extend .span4;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.issue_description {
|
.issue_description {
|
||||||
|
@ -28,31 +28,31 @@
|
||||||
|
|
||||||
.issues_table {
|
.issues_table {
|
||||||
.issue {
|
.issue {
|
||||||
padding:7px 10px;
|
padding: 7px 10px;
|
||||||
|
|
||||||
.issue_check {
|
.issue_check {
|
||||||
float:left;
|
float: left;
|
||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
padding-right: 8px;
|
padding-right: 8px;
|
||||||
min-width: 15px;
|
min-width: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
padding-top:0;
|
padding-top: 0;
|
||||||
padding-bottom:2px;
|
padding-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
img.avatar {
|
img.avatar {
|
||||||
width:32px;
|
width: 32px;
|
||||||
margin-top:1px;
|
margin-top: 1px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input.check_all_issues {
|
input.check_all_issues {
|
||||||
float:left;
|
float: left;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin:0;
|
margin: 0;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 8px;
|
top: 8px;
|
||||||
|
@ -82,16 +82,16 @@ input.check_all_issues {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 800px) { .issues_filters select { width:160px; } }
|
@media (min-width: 800px) { .issues_filters select { width: 160px; } }
|
||||||
@media (min-width: 1000px) { .issues_filters select { width:200px; } }
|
@media (min-width: 1000px) { .issues_filters select { width: 200px; } }
|
||||||
@media (min-width: 1200px) { .issues_filters select { width:220px; } }
|
@media (min-width: 1200px) { .issues_filters select { width: 220px; } }
|
||||||
|
|
||||||
|
|
||||||
#issues-table-holder {
|
#issues-table-holder {
|
||||||
.issues_filters {
|
.issues_filters {
|
||||||
form {
|
form {
|
||||||
padding:0;
|
padding: 0;
|
||||||
margin:0;
|
margin: 0;
|
||||||
margin-top:7px
|
margin-top:7px
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,48 +99,25 @@ input.check_all_issues {
|
||||||
.issues_bulk_update {
|
.issues_bulk_update {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
form {
|
form {
|
||||||
padding:0;
|
padding: 0;
|
||||||
margin:0;
|
margin: 0;
|
||||||
margin-top:7px
|
margin-top:7px
|
||||||
}
|
}
|
||||||
.update_selected_issues {
|
.update_selected_issues {
|
||||||
position:relative;
|
position: relative;
|
||||||
top:-2px;
|
top:-2px;
|
||||||
margin-left:4px;
|
margin-left: 4px;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.update_issues_text {
|
.update_issues_text {
|
||||||
padding:3px;
|
padding: 3px;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#update_status {
|
#update_status {
|
||||||
width:100px;
|
width: 100px;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Milestones list
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
.milestone {
|
|
||||||
@extend .wll;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fix milestone calendar
|
|
||||||
*/
|
|
||||||
|
|
||||||
.ui-datepicker {
|
|
||||||
border:none;
|
|
||||||
box-shadow:none;
|
|
||||||
.ui-datepicker-header {
|
|
||||||
@include solid_shade;
|
|
||||||
margin-bottom:10px;
|
|
||||||
border:1px solid #bbb;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
/* Login Page */
|
/* Login Page */
|
||||||
body.login-page{
|
body.login-page{
|
||||||
padding-top: 10%;
|
padding-top: 10%;
|
||||||
background:#f1f1f1;
|
background: #f1f1f1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-box{
|
.login-box{
|
||||||
width: 304px;
|
width: 304px;
|
||||||
position: relative;
|
position: relative;
|
||||||
border-radius: 5px;
|
@include border-radius(5px);
|
||||||
margin: auto;
|
margin: auto;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
background: white;
|
background: white;
|
||||||
|
@ -18,25 +18,15 @@ body.login-page{
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-box input.text{background-color: #f1f1f1; font-size: 16px; border-radius: 0; padding: 14px 10px; width: 280px}
|
.login-box input.text{background-color: #f1f1f1; font-size: 16px; @include border-radius(0); padding: 14px 10px; width: 280px}
|
||||||
|
|
||||||
.login-box input.text.top{
|
.login-box input.text.top{
|
||||||
-webkit-border-top-left-radius: 5px;
|
@include border-radius(5px 5px 0 0);
|
||||||
-webkit-border-top-right-radius: 5px;
|
margin-bottom: 0px;
|
||||||
-moz-border-radius-topleft: 5px;
|
|
||||||
-moz-border-radius-topright: 5px;
|
|
||||||
border-top-left-radius: 5px;
|
|
||||||
border-top-right-radius: 5px;
|
|
||||||
margin-bottom:0px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-box input.text.bottom{
|
.login-box input.text.bottom{
|
||||||
-webkit-border-bottom-right-radius: 5px;
|
@include border-radius(0 0 5px 5px);
|
||||||
-webkit-border-bottom-left-radius: 5px;
|
|
||||||
-moz-border-radius-bottomright: 5px;
|
|
||||||
-moz-border-radius-bottomleft: 5px;
|
|
||||||
border-bottom-right-radius: 5px;
|
|
||||||
border-bottom-left-radius: 5px;
|
|
||||||
border-top: 0;
|
border-top: 0;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
|
|
||||||
.mr_branch_box {
|
.mr_branch_box {
|
||||||
@extend .ui-box;
|
@extend .ui-box;
|
||||||
margin-bottom:20px;
|
margin-bottom: 20px;
|
||||||
|
|
||||||
.body {
|
.body {
|
||||||
background:#f1f1f1;
|
background: #f1f1f1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,31 +23,30 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
form {
|
form {
|
||||||
margin-bottom:0;
|
margin-bottom: 0;
|
||||||
.clearfix {
|
.clearfix {
|
||||||
margin-bottom:0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.accept_group {
|
.accept_group {
|
||||||
float:left;
|
float: left;
|
||||||
border: 1px solid #ADA;
|
border: 1px solid #ADA;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
@include border-radius(5px);
|
@include border-radius(5px);
|
||||||
border-radius: 5px;
|
|
||||||
background: #CEB;
|
background: #CEB;
|
||||||
|
|
||||||
.accept_merge_request {
|
.accept_merge_request {
|
||||||
font-size:13px;
|
font-size: 13px;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
.remove_branch_holder {
|
.remove_branch_holder {
|
||||||
margin-left:20px;
|
margin-left: 20px;
|
||||||
margin-right:10px;
|
margin-right: 10px;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
label {
|
label {
|
||||||
color:#444;
|
color: #444;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,15 +59,15 @@
|
||||||
.mr_nav_tabs {
|
.mr_nav_tabs {
|
||||||
li {
|
li {
|
||||||
a {
|
a {
|
||||||
font-weight:bold;
|
font-weight: bold;
|
||||||
padding:8px 20px;
|
padding: 8px 20px;
|
||||||
text-align:center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
li.merge_request {
|
li.merge_request {
|
||||||
padding:7px 10px;
|
padding: 7px 10px;
|
||||||
img.avatar {
|
img.avatar {
|
||||||
width: 32px;
|
width: 32px;
|
||||||
margin-top: 1px;
|
margin-top: 1px;
|
||||||
|
@ -85,35 +84,35 @@ li.merge_request {
|
||||||
}
|
}
|
||||||
|
|
||||||
.label_branch {
|
.label_branch {
|
||||||
@include round-borders-all(4px);
|
@include border-radius(4px);
|
||||||
padding:2px 4px;
|
padding: 2px 4px;
|
||||||
border:none;
|
border: none;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
background: #474D57;
|
background: #474D57;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
|
font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mr_source_commit,
|
.mr_source_commit,
|
||||||
.mr_target_commit {
|
.mr_target_commit {
|
||||||
.commit {
|
.commit {
|
||||||
margin:0;
|
margin: 0;
|
||||||
padding:0;
|
padding: 0;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
.avatar { position:relative }
|
.avatar { position:relative }
|
||||||
.row_title {
|
.row_title {
|
||||||
color:#444;
|
color: #444;
|
||||||
}
|
}
|
||||||
.commit-author-name,
|
.commit-author-name,
|
||||||
.dash,
|
.dash,
|
||||||
.committed_ago,
|
.committed_ago,
|
||||||
.browse_code_link_holder {
|
.browse_code_link_holder {
|
||||||
display:none;
|
display: none;
|
||||||
}
|
}
|
||||||
list-style:none;
|
list-style: none;
|
||||||
&:hover {
|
&:hover {
|
||||||
background:none;
|
background: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,20 +125,14 @@ li.merge_request {
|
||||||
@extend .main_box;
|
@extend .main_box;
|
||||||
.merge_requests_middle_box {
|
.merge_requests_middle_box {
|
||||||
@extend .middle_box_content;
|
@extend .middle_box_content;
|
||||||
height:30px;
|
height: 30px;
|
||||||
.merge_requests_assignee {
|
.merge_requests_assignee {
|
||||||
@extend .span6;
|
@extend .span6;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
.merge_requests_milestone {
|
.merge_requests_milestone {
|
||||||
@extend .span4;
|
@extend .span4;
|
||||||
float:left;
|
float: left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-badge {
|
|
||||||
height: 32px;
|
|
||||||
width: 100%;
|
|
||||||
@include border-radius(5px);
|
|
||||||
}
|
|
||||||
|
|
|
@ -3,64 +3,40 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
ul.main_menu {
|
ul.main_menu {
|
||||||
border-radius: 4px;
|
|
||||||
margin: auto;
|
margin: auto;
|
||||||
margin:30px 0;
|
margin: 30px 0;
|
||||||
border:1px solid #BBB;
|
margin-top: 10px;
|
||||||
height:37px;
|
border-bottom: 1px solid #DDD;
|
||||||
@include bg-gray-gradient;
|
height: 37px;
|
||||||
position:relative;
|
position: relative;
|
||||||
overflow:hidden;
|
overflow: hidden;
|
||||||
@include shade;
|
|
||||||
.count {
|
.count {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -1px;
|
top: -1px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 15px;
|
height: 15px;
|
||||||
margin: 0 0 0 5px;
|
margin: 0 0 0 5px;
|
||||||
padding: 0 8px 1px 8px;
|
padding: 0 8px 1px 8px;
|
||||||
height: auto;
|
height: auto;
|
||||||
font-size: 0.82em;
|
font-size: 0.82em;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #777;
|
color: #777;
|
||||||
background: #f2f2f2;
|
|
||||||
border-top: 1px solid #CCC;
|
|
||||||
border-radius: 8px;
|
|
||||||
-moz-border-radius: 8px;
|
|
||||||
}
|
}
|
||||||
.label {
|
.label {
|
||||||
background:$hover;
|
background: $hover;
|
||||||
text-shadow:none;
|
text-shadow: none;
|
||||||
color:$style_color;
|
color: $style_color;
|
||||||
}
|
}
|
||||||
li {
|
li {
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
display: table-cell;
|
display: table-cell;
|
||||||
width: 1%;
|
width: 1%;
|
||||||
border-right: 1px solid #DDD;
|
|
||||||
border-left: 1px solid #EEE;
|
|
||||||
border-bottom:2px solid #CFCFCF;
|
|
||||||
|
|
||||||
&:first-child{
|
|
||||||
-webkit-border-top-left-radius: 4px;
|
|
||||||
-webkit-border-bottom-left-radius: 4px;
|
|
||||||
-moz-border-radius-topleft: 4px;
|
|
||||||
-moz-border-radius-bottomleft: 4px;
|
|
||||||
border-top-left-radius: 4px;
|
|
||||||
border-bottom-left-radius: 4px;
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background-color:#D5D5D5;
|
border-bottom: 2px solid #474D57;
|
||||||
border-right: 1px solid #BBB;
|
a {
|
||||||
border-left: 1px solid #BBB;
|
color: $style_color;
|
||||||
border-radius: 0 0 1px 1px;
|
|
||||||
&:first-child{
|
|
||||||
border-bottom:none;
|
|
||||||
border-left:none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,10 +44,10 @@ ul.main_menu {
|
||||||
a {
|
a {
|
||||||
background: url(home_icon.PNG) no-repeat center center;
|
background: url(home_icon.PNG) no-repeat center center;
|
||||||
text-indent:-9999px;
|
text-indent:-9999px;
|
||||||
min-width:20px;
|
min-width: 20px;
|
||||||
img {
|
img {
|
||||||
position:relative;
|
position: relative;
|
||||||
top:4px;
|
top: 4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,12 +55,12 @@ ul.main_menu {
|
||||||
a {
|
a {
|
||||||
display: block;
|
display: block;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight:bold;
|
font-weight: normal;
|
||||||
height:35px;
|
height: 35px;
|
||||||
line-height:36px;
|
line-height: 36px;
|
||||||
color: $style_color;
|
color: #777;
|
||||||
text-shadow:0 1px 1px white;
|
text-shadow: 0 1px 1px white;
|
||||||
padding:0 10px;
|
padding: 0 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4,30 +4,30 @@
|
||||||
*/
|
*/
|
||||||
#notes-list,
|
#notes-list,
|
||||||
#new-notes-list {
|
#new-notes-list {
|
||||||
display:block;
|
display: block;
|
||||||
list-style:none;
|
list-style: none;
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
padding:0px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.issue_notes,
|
.issue_notes,
|
||||||
.wiki_notes {
|
.wiki_notes {
|
||||||
.note_content {
|
.note_content {
|
||||||
float:left;
|
float: left;
|
||||||
width:400px;
|
width: 400px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note textare */
|
/* Note textare */
|
||||||
#note_note {
|
#note_note {
|
||||||
height:80px;
|
height: 80px;
|
||||||
width:99%;
|
width: 99%;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#new_note {
|
#new_note {
|
||||||
.attach_holder {
|
.attach_holder {
|
||||||
display:none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,34 +36,34 @@
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
min-height: 60px;
|
min-height: 60px;
|
||||||
background:#f5f5f5;
|
background: #f5f5f5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.note {
|
.note {
|
||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: block;
|
display: block;
|
||||||
position:relative;
|
position: relative;
|
||||||
img {float: left; margin-right: 10px;}
|
img {float: left; margin-right: 10px;}
|
||||||
img.emoji {float:none;margin:0;}
|
img.emoji {float: none;margin: 0;}
|
||||||
.note-author cite{font-style: italic;}
|
.note-author cite{font-style: italic;}
|
||||||
p { color:$style_color; }
|
p { color: $style_color; }
|
||||||
.note-author { color: $style_color;}
|
.note-author { color: $style_color;}
|
||||||
|
|
||||||
.note-title { margin-left:45px; padding-top: 5px;}
|
.note-title { margin-left: 45px; padding-top: 5px;}
|
||||||
.avatar {
|
.avatar {
|
||||||
margin-top:3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.delete-note {
|
.delete-note {
|
||||||
display:none;
|
display: none;
|
||||||
position:absolute;
|
position: absolute;
|
||||||
right:0;
|
right: 0;
|
||||||
top:0;
|
top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
.delete-note { display:block; }
|
.delete-note { display: block; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#notes-list:not(.reversed) .note,
|
#notes-list:not(.reversed) .note,
|
||||||
|
@ -94,30 +94,31 @@ p.notify_controls span{
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.line_notes_row {
|
tr.line_notes_row {
|
||||||
border-bottom:1px solid #DDD;
|
border-bottom: 1px solid #DDD;
|
||||||
border-left: 7px solid #2A79A3;
|
border-left: 7px solid #2A79A3;
|
||||||
|
|
||||||
&.reply {
|
&.reply {
|
||||||
background:#eee;
|
background: #eee;
|
||||||
border-left: 7px solid #2A79A3;
|
border-left: 7px solid #2A79A3;
|
||||||
border-top:1px solid #ddd;
|
border-top: 1px solid #ddd;
|
||||||
td {
|
td {
|
||||||
padding:7px 10px;
|
padding: 7px 10px;
|
||||||
}
|
}
|
||||||
a.line_note_reply_link {
|
a.line_note_reply_link {
|
||||||
@include round-borders-all(4px);
|
border: 1px solid #eaeaea;
|
||||||
|
@include border-radius(4px);
|
||||||
padding: 3px 10px;
|
padding: 3px 10px;
|
||||||
margin-left:5px;
|
margin-left: 5px;
|
||||||
color: white;
|
color: white;
|
||||||
background: #2A79A3;
|
background: #2A79A3;
|
||||||
border-color: #2A79A3;
|
border-color: #2A79A3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ul {
|
ul {
|
||||||
margin:0;
|
margin: 0;
|
||||||
li {
|
li {
|
||||||
padding:0;
|
padding: 0;
|
||||||
border:none;
|
border: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,28 +126,28 @@ tr.line_notes_row {
|
||||||
.line_notes_row, .per_line_form { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; }
|
.line_notes_row, .per_line_form { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; }
|
||||||
|
|
||||||
.per_line_form {
|
.per_line_form {
|
||||||
background:#f5f5f5;
|
background: #f5f5f5;
|
||||||
border-top:1px solid #eee;
|
border-top: 1px solid #eee;
|
||||||
form { margin: 0; }
|
form { margin: 0; }
|
||||||
td {
|
td {
|
||||||
border-bottom:1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
.note_actions {
|
.note_actions {
|
||||||
margin:0;
|
margin: 0;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
|
|
||||||
.buttons {
|
.buttons {
|
||||||
float:left;
|
float: left;
|
||||||
width:300px;
|
width: 300px;
|
||||||
}
|
}
|
||||||
.options {
|
.options {
|
||||||
.labels {
|
.labels {
|
||||||
float:left;
|
float: left;
|
||||||
padding-left:10px;
|
padding-left: 10px;
|
||||||
label {
|
label {
|
||||||
padding: 6px 0;
|
padding: 6px 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
width:120px;
|
width: 120px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,13 +155,13 @@ tr.line_notes_row {
|
||||||
}
|
}
|
||||||
|
|
||||||
td .line_note_link {
|
td .line_note_link {
|
||||||
position:absolute;
|
position: absolute;
|
||||||
margin-left:-70px;
|
margin-left:-70px;
|
||||||
margin-top:-10px;
|
margin-top:-10px;
|
||||||
z-index:10;
|
z-index: 10;
|
||||||
background: url("comment_add.png") no-repeat left 0;
|
background: url("comment_add.png") no-repeat left 0;
|
||||||
width:32px;
|
width: 32px;
|
||||||
height:32px;
|
height: 32px;
|
||||||
|
|
||||||
opacity: 0.0;
|
opacity: 0.0;
|
||||||
filter: alpha(opacity=0);
|
filter: alpha(opacity=0);
|
||||||
|
@ -180,13 +181,13 @@ td .line_note_link {
|
||||||
.new_note {
|
.new_note {
|
||||||
.input-file {
|
.input-file {
|
||||||
font: 500px monospace;
|
font: 500px monospace;
|
||||||
opacity:0;
|
opacity: 0;
|
||||||
filter: alpha(opacity=0);
|
filter: alpha(opacity=0);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
top:0;
|
top: 0;
|
||||||
right:0;
|
right: 0;
|
||||||
padding:0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,24 +199,24 @@ td .line_note_link {
|
||||||
}
|
}
|
||||||
|
|
||||||
.attachments {
|
.attachments {
|
||||||
position:relative;
|
position: relative;
|
||||||
width: 350px;
|
width: 350px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
overflow:hidden;
|
overflow: hidden;
|
||||||
margin:0 0 5px !important;
|
margin:0 0 5px !important;
|
||||||
|
|
||||||
.input_file {
|
.input_file {
|
||||||
.file_upload {
|
.file_upload {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right:14px;
|
right: 14px;
|
||||||
top:7px;
|
top: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.file_name {
|
.file_name {
|
||||||
line-height:30px;
|
line-height: 30px;
|
||||||
width:240px;
|
width: 240px;
|
||||||
height:28px;
|
height: 28px;
|
||||||
overflow:hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.input-file {
|
.input-file {
|
||||||
width: 260px;
|
width: 260px;
|
||||||
|
@ -228,5 +229,5 @@ td .line_note_link {
|
||||||
|
|
||||||
.note-text {
|
.note-text {
|
||||||
border: 1px solid #aaa;
|
border: 1px solid #aaa;
|
||||||
box-shadow:none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
.profile_history {
|
.profile_history {
|
||||||
.event_feed {
|
.event_feed {
|
||||||
min-height:20px;
|
min-height: 20px;
|
||||||
.avatar {
|
.avatar {
|
||||||
width:20px;
|
width: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile_avatar_holder {
|
.profile_avatar_holder {
|
||||||
float:left;
|
float: left;
|
||||||
width:60px;
|
width: 60px;
|
||||||
height:60px;
|
height: 60px;
|
||||||
margin-right:20px;
|
margin-right: 20px;
|
||||||
img {
|
img {
|
||||||
width:60px;
|
width: 60px;
|
||||||
height:60px;
|
height: 60px;
|
||||||
background:#fff;
|
background: #fff;
|
||||||
padding: 1px;
|
padding: 1px;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,50 +4,34 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.side {
|
.side {
|
||||||
@extend .span4;
|
|
||||||
@extend .right;
|
@extend .right;
|
||||||
|
|
||||||
.groups_box,
|
.groups_box,
|
||||||
.projects_box {
|
.projects_box {
|
||||||
h5 {
|
> h5 {
|
||||||
color:$style_color;
|
color: $style_color;
|
||||||
font-size:16px;
|
font-size: 16px;
|
||||||
text-shadow: 0 1px 1px #fff;
|
text-shadow: 0 1px 1px #fff;
|
||||||
padding: 2px 10px;
|
padding: 2px 10px;
|
||||||
line-height:32px;
|
line-height: 32px;
|
||||||
font-size:14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
ul {
|
.nav-projects-tabs li { padding: 0; }
|
||||||
li {
|
.well-list {
|
||||||
padding:0;
|
.arrow {
|
||||||
a {
|
float: right;
|
||||||
display:block;
|
padding: 10px;
|
||||||
.group_name {
|
margin: 0;
|
||||||
font-size:14px;
|
}
|
||||||
line-height:18px;
|
.last_activity {
|
||||||
}
|
padding-top: 5px;
|
||||||
.project_name {
|
display: block;
|
||||||
color:#4fa2bd;
|
span, strong {
|
||||||
font-size:14px;
|
font-size: 12px;
|
||||||
line-height:18px;
|
color: #666;
|
||||||
}
|
|
||||||
.arrow {
|
|
||||||
float:right;
|
|
||||||
padding:10px;
|
|
||||||
margin:0;
|
|
||||||
}
|
|
||||||
.last_activity {
|
|
||||||
padding-top:5px;
|
|
||||||
display:block;
|
|
||||||
span, strong {
|
|
||||||
font-size:12px;
|
|
||||||
color:#666;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@extend .leftbar;
|
|
||||||
@extend .ui-box;
|
@extend .ui-box;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,21 +42,27 @@
|
||||||
.project_name_holder {
|
.project_name_holder {
|
||||||
input,
|
input,
|
||||||
label {
|
label {
|
||||||
font-size:16px;
|
font-size: 16px;
|
||||||
line-height:20px;
|
line-height: 20px;
|
||||||
padding:8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
label {
|
label {
|
||||||
color:#888;
|
color: #888;
|
||||||
}
|
}
|
||||||
.btn {
|
.btn {
|
||||||
padding:6px 10px;
|
padding: 6px 10px;
|
||||||
margin-left:10px;
|
margin-left: 10px;
|
||||||
margin-bottom:8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.adv_settings {
|
.adv_settings {
|
||||||
h6 { margin-left:40px; }
|
h6 { margin-left: 40px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset.features {
|
||||||
|
.control-label {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,19 +71,20 @@
|
||||||
@include bg-gray-gradient;
|
@include bg-gray-gradient;
|
||||||
padding: 4px 7px;
|
padding: 4px 7px;
|
||||||
border: 1px solid #CCC;
|
border: 1px solid #CCC;
|
||||||
margin-bottom:20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project_clone_holder {
|
.project_clone_holder {
|
||||||
input[type="text"],
|
input[type="text"],
|
||||||
.btn {
|
.btn {
|
||||||
font-size:12px;
|
font-size: 12px;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 3px 10px;
|
padding: 3px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"] {
|
input[type="text"] {
|
||||||
|
@extend .monospace;
|
||||||
border: 1px solid #BBB;
|
border: 1px solid #BBB;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
margin-left: -1px;
|
margin-left: -1px;
|
||||||
|
@ -102,11 +93,33 @@
|
||||||
|
|
||||||
.save-project-loader {
|
.save-project-loader {
|
||||||
img {
|
img {
|
||||||
margin-top:50px;
|
margin-top: 50px;
|
||||||
margin-bottom:50px;
|
margin-bottom: 50px;
|
||||||
}
|
}
|
||||||
h3 {
|
h3 {
|
||||||
@extend .page_title;
|
@extend .page_title;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ul.nav.nav-projects-tabs {
|
||||||
|
@extend .nav-tabs;
|
||||||
|
|
||||||
|
padding-left: 8px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
a {
|
||||||
|
padding: 4px 20px;
|
||||||
|
margin-top: 2px;
|
||||||
|
border-color: #DDD;
|
||||||
|
background-color: #EEE;
|
||||||
|
text-shadow: 0 1px 1px white;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
&.active {
|
||||||
|
a {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
9
app/assets/stylesheets/sections/snippets.scss
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
.snippet.file_holder {
|
||||||
|
.file_title {
|
||||||
|
.snippet-file-name {
|
||||||
|
position: relative;
|
||||||
|
top: -4px;
|
||||||
|
left: -4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,17 +6,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.themes_opts {
|
.themes_opts {
|
||||||
padding-left:20px;
|
padding-left: 20px;
|
||||||
|
|
||||||
label {
|
label {
|
||||||
width:175px;
|
width: 175px;
|
||||||
margin-right:40px;
|
margin-right: 40px;
|
||||||
|
|
||||||
.prev {
|
.prev {
|
||||||
@extend .thumbnail;
|
@extend .thumbnail;
|
||||||
height:30px;
|
height: 30px;
|
||||||
width:175px;
|
width: 175px;
|
||||||
margin-bottom:10px;
|
margin-bottom: 10px;
|
||||||
|
|
||||||
&.classic {
|
&.classic {
|
||||||
background: #31363e;
|
background: #31363e;
|
||||||
|
@ -42,17 +42,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.code_highlight_opts {
|
.code_highlight_opts {
|
||||||
padding-left:20px;
|
padding-left: 20px;
|
||||||
|
|
||||||
label {
|
label {
|
||||||
width:220px;
|
width: 220px;
|
||||||
margin-right:40px;
|
margin-right: 40px;
|
||||||
|
|
||||||
.prev {
|
.prev {
|
||||||
@extend .thumbnail;
|
@extend .thumbnail;
|
||||||
height:151px;
|
height: 151px;
|
||||||
width:220px;
|
width: 220px;
|
||||||
margin-bottom:10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
.tree-holder {
|
.tree-holder {
|
||||||
.tree-content-holder {
|
.tree-content-holder {
|
||||||
float:left;
|
float: left;
|
||||||
width:100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tree_progress {
|
.tree_progress {
|
||||||
display:none;
|
display: none;
|
||||||
margin:20px;
|
margin: 20px;
|
||||||
&.loading {
|
&.loading {
|
||||||
display:block;
|
display: block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,20 +18,20 @@
|
||||||
&:hover {
|
&:hover {
|
||||||
td {
|
td {
|
||||||
background: $hover;
|
background: $hover;
|
||||||
border-top:1px solid #ADF;
|
border-top: 1px solid #ADF;
|
||||||
border-bottom:1px solid #ADF;
|
border-bottom: 1px solid #ADF;
|
||||||
}
|
}
|
||||||
cursor:pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tree-item {
|
.tree-item {
|
||||||
.tree-item-file-name {
|
.tree-item-file-name {
|
||||||
vertical-align:middle;
|
vertical-align: middle;
|
||||||
a {
|
a {
|
||||||
&:hover {
|
&:hover {
|
||||||
color:$blue_link;
|
color: $primary_color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@
|
||||||
padding: 2px 10px;
|
padding: 2px 10px;
|
||||||
}
|
}
|
||||||
td {
|
td {
|
||||||
line-height:20px;
|
line-height: 20px;
|
||||||
background:#fafafa;
|
background: #fafafa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@
|
||||||
.tree-btn-group {
|
.tree-btn-group {
|
||||||
.btn {
|
.btn {
|
||||||
margin-right:-3px;
|
margin-right:-3px;
|
||||||
padding:2px 10px;
|
padding: 2px 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
43
app/assets/stylesheets/sections/votes.scss
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
.votes {
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 15px;
|
||||||
|
.progress {
|
||||||
|
height: 4px;
|
||||||
|
margin: 0;
|
||||||
|
.bar {
|
||||||
|
float: left;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.bar-success {
|
||||||
|
@include linear-gradient(#62C462, #51A351);
|
||||||
|
background-color: #468847;
|
||||||
|
}
|
||||||
|
.bar-danger {
|
||||||
|
@include linear-gradient(#EE5F5B, #BD362F);
|
||||||
|
background-color: #B94A48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.upvotes {
|
||||||
|
display: inline-block;
|
||||||
|
color: #468847;
|
||||||
|
}
|
||||||
|
.downvotes {
|
||||||
|
display: inline-block;
|
||||||
|
color: #B94A48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.votes-block {
|
||||||
|
margin: 14px 6px 6px 0;
|
||||||
|
.downvotes {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.votes-inline {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 8px;
|
||||||
|
.progress {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 0 2px;
|
||||||
|
width: 45px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,18 +4,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
.ui_basic {
|
.ui_basic {
|
||||||
/*
|
|
||||||
* Common styles
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
a {
|
|
||||||
color: $link_color;
|
|
||||||
&:hover {
|
|
||||||
text-decoration:none;
|
|
||||||
color: $blue_link;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.app_logo {
|
.app_logo {
|
||||||
.separator {
|
.separator {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
|
|
|
@ -47,17 +47,17 @@
|
||||||
a {
|
a {
|
||||||
h1 {
|
h1 {
|
||||||
background: url('logo_white.png') no-repeat 0px 2px;
|
background: url('logo_white.png') no-repeat 0px 2px;
|
||||||
color:#eee;
|
color: #eee;
|
||||||
text-shadow: 0 1px 1px #111;
|
text-shadow: 0 1px 1px #111;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.separator {
|
.separator {
|
||||||
display:none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.project_name {
|
.project_name {
|
||||||
color:#eee;
|
color: #eee;
|
||||||
text-shadow: 0 1px 1px #111;
|
text-shadow: 0 1px 1px #111;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,6 @@ module Notes
|
||||||
when "wall"
|
when "wall"
|
||||||
# this is the only case, where the order is DESC
|
# this is the only case, where the order is DESC
|
||||||
project.common_notes.order("created_at DESC, id DESC").limit(50)
|
project.common_notes.order("created_at DESC, id DESC").limit(50)
|
||||||
when "wiki"
|
|
||||||
project.wiki_notes.limit(20)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@notes = if after_id
|
@notes = if after_id
|
||||||
|
|
23
app/contexts/project_update_context.rb
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
class ProjectUpdateContext < BaseContext
|
||||||
|
def execute(role = :default)
|
||||||
|
namespace_id = params[:project].delete(:namespace_id)
|
||||||
|
|
||||||
|
allowed_transfer = can?(current_user, :change_namespace, project) || role == :admin
|
||||||
|
|
||||||
|
if allowed_transfer && namespace_id.present?
|
||||||
|
if namespace_id == Namespace.global_id
|
||||||
|
if project.namespace.present?
|
||||||
|
# Transfer to global namespace from anyone
|
||||||
|
project.transfer(nil)
|
||||||
|
end
|
||||||
|
elsif namespace_id.to_i != project.namespace_id
|
||||||
|
# Transfer to someone namespace
|
||||||
|
namespace = Namespace.find(namespace_id)
|
||||||
|
project.transfer(namespace)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
project.update_attributes(params[:project], as: role)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@ class Admin::GroupsController < AdminController
|
||||||
before_filter :group, only: [:edit, :show, :update, :destroy, :project_update]
|
before_filter :group, only: [:edit, :show, :update, :destroy, :project_update]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@groups = Group.scoped
|
@groups = Group.order('name ASC')
|
||||||
@groups = @groups.search(params[:name]) if params[:name].present?
|
@groups = @groups.search(params[:name]) if params[:name].present?
|
||||||
@groups = @groups.page(params[:page]).per(20)
|
@groups = @groups.page(params[:page]).per(20)
|
||||||
end
|
end
|
||||||
|
@ -11,6 +11,7 @@ class Admin::GroupsController < AdminController
|
||||||
@projects = Project.scoped
|
@projects = Project.scoped
|
||||||
@projects = @projects.not_in_group(@group) if @group.projects.present?
|
@projects = @projects.not_in_group(@group) if @group.projects.present?
|
||||||
@projects = @projects.all
|
@projects = @projects.all
|
||||||
|
@projects.reject!(&:empty_repo?)
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@ -22,6 +23,7 @@ class Admin::GroupsController < AdminController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@group = Group.new(params[:group])
|
@group = Group.new(params[:group])
|
||||||
|
@group.path = @group.name.dup.parameterize if @group.name
|
||||||
@group.owner = current_user
|
@group.owner = current_user
|
||||||
|
|
||||||
if @group.save
|
if @group.save
|
||||||
|
@ -48,15 +50,17 @@ class Admin::GroupsController < AdminController
|
||||||
|
|
||||||
def project_update
|
def project_update
|
||||||
project_ids = params[:project_ids]
|
project_ids = params[:project_ids]
|
||||||
Project.where(id: project_ids).update_all(group_id: @group.id)
|
|
||||||
|
Project.where(id: project_ids).each do |project|
|
||||||
|
project.transfer(@group)
|
||||||
|
end
|
||||||
|
|
||||||
redirect_to :back, notice: 'Group was successfully updated.'
|
redirect_to :back, notice: 'Group was successfully updated.'
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_project
|
def remove_project
|
||||||
@project = Project.find(params[:project_id])
|
@project = Project.find(params[:project_id])
|
||||||
@project.group_id = nil
|
@project.transfer(nil)
|
||||||
@project.save
|
|
||||||
|
|
||||||
redirect_to :back, notice: 'Group was successfully updated.'
|
redirect_to :back, notice: 'Group was successfully updated.'
|
||||||
end
|
end
|
||||||
|
@ -70,6 +74,6 @@ class Admin::GroupsController < AdminController
|
||||||
private
|
private
|
||||||
|
|
||||||
def group
|
def group
|
||||||
@group = Group.find_by_code(params[:id])
|
@group = Group.find_by_path(params[:id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,65 +1,51 @@
|
||||||
class Admin::ProjectsController < AdminController
|
class Admin::ProjectsController < AdminController
|
||||||
before_filter :admin_project, only: [:edit, :show, :update, :destroy, :team_update]
|
before_filter :project, only: [:edit, :show, :update, :destroy, :team_update]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@admin_projects = Project.scoped
|
@projects = Project.scoped
|
||||||
@admin_projects = @admin_projects.search(params[:name]) if params[:name].present?
|
@projects = @projects.where(namespace_id: params[:namespace_id]) if params[:namespace_id].present?
|
||||||
@admin_projects = @admin_projects.order("name ASC").page(params[:page]).per(20)
|
@projects = @projects.where(namespace_id: nil) if params[:namespace_id] == Namespace.global_id
|
||||||
|
@projects = @projects.search(params[:name]) if params[:name].present?
|
||||||
|
@projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(20)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@users = User.scoped
|
@users = User.active
|
||||||
@users = @users.not_in_project(@admin_project) if @admin_project.users.present?
|
@users = @users.not_in_project(@project) if @project.users.present?
|
||||||
@users = @users.all
|
@users = @users.all
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
|
||||||
@admin_project = Project.new
|
|
||||||
end
|
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
end
|
end
|
||||||
|
|
||||||
def team_update
|
def team_update
|
||||||
@admin_project.add_users_ids_to_team(params[:user_ids], params[:project_access])
|
@project.add_users_ids_to_team(params[:user_ids], params[:project_access])
|
||||||
|
|
||||||
redirect_to [:admin, @admin_project], notice: 'Project was successfully updated.'
|
redirect_to [:admin, @project], notice: 'Project was successfully updated.'
|
||||||
end
|
|
||||||
|
|
||||||
def create
|
|
||||||
@admin_project = Project.new(params[:project])
|
|
||||||
@admin_project.owner = current_user
|
|
||||||
|
|
||||||
if @admin_project.save
|
|
||||||
redirect_to [:admin, @admin_project], notice: 'Project was successfully created.'
|
|
||||||
else
|
|
||||||
render action: "new"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
owner_id = params[:project].delete(:owner_id)
|
status = ProjectUpdateContext.new(project, current_user, params).execute(:admin)
|
||||||
|
|
||||||
if owner_id
|
if status
|
||||||
@admin_project.owner = User.find(owner_id)
|
redirect_to [:admin, @project], notice: 'Project was successfully updated.'
|
||||||
end
|
|
||||||
|
|
||||||
if @admin_project.update_attributes(params[:project])
|
|
||||||
redirect_to [:admin, @admin_project], notice: 'Project was successfully updated.'
|
|
||||||
else
|
else
|
||||||
render action: "edit"
|
render action: "edit"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@admin_project.destroy
|
@project.destroy
|
||||||
|
|
||||||
redirect_to admin_projects_url, notice: 'Project was successfully deleted.'
|
redirect_to admin_projects_path, notice: 'Project was successfully deleted.'
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
protected
|
||||||
|
|
||||||
def admin_project
|
def project
|
||||||
@admin_project = Project.find_by_code(params[:id])
|
id = params[:project_id] || params[:id]
|
||||||
|
|
||||||
|
@project = Project.find_with_namespace(id)
|
||||||
|
@project || render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ class Admin::UsersController < AdminController
|
||||||
@admin_users = User.scoped
|
@admin_users = User.scoped
|
||||||
@admin_users = @admin_users.filter(params[:filter])
|
@admin_users = @admin_users.filter(params[:filter])
|
||||||
@admin_users = @admin_users.search(params[:name]) if params[:name].present?
|
@admin_users = @admin_users.search(params[:name]) if params[:name].present?
|
||||||
@admin_users = @admin_users.order("updated_at DESC").page(params[:page])
|
@admin_users = @admin_users.order("name ASC").page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@ -30,7 +30,7 @@ class Admin::UsersController < AdminController
|
||||||
|
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@admin_user = User.new({ projects_limit: Gitlab.config.default_projects_limit }, as: :admin)
|
@admin_user = User.new({ projects_limit: Gitlab.config.gitlab.default_projects_limit }, as: :admin)
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
|
|
|
@ -2,6 +2,7 @@ class ApplicationController < ActionController::Base
|
||||||
before_filter :authenticate_user!
|
before_filter :authenticate_user!
|
||||||
before_filter :reject_blocked!
|
before_filter :reject_blocked!
|
||||||
before_filter :set_current_user_for_observers
|
before_filter :set_current_user_for_observers
|
||||||
|
before_filter :add_abilities
|
||||||
before_filter :dev_tools if Rails.env == 'development'
|
before_filter :dev_tools if Rails.env == 'development'
|
||||||
|
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
|
@ -34,7 +35,7 @@ class ApplicationController < ActionController::Base
|
||||||
def reject_blocked!
|
def reject_blocked!
|
||||||
if current_user && current_user.blocked
|
if current_user && current_user.blocked
|
||||||
sign_out current_user
|
sign_out current_user
|
||||||
flash[:alert] = "Your account was blocked"
|
flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
|
||||||
redirect_to new_user_session_path
|
redirect_to new_user_session_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -42,7 +43,7 @@ class ApplicationController < ActionController::Base
|
||||||
def after_sign_in_path_for resource
|
def after_sign_in_path_for resource
|
||||||
if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked
|
if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked
|
||||||
sign_out resource
|
sign_out resource
|
||||||
flash[:alert] = "Your account was blocked"
|
flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
|
||||||
new_user_session_path
|
new_user_session_path
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
|
@ -63,11 +64,19 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def project
|
def project
|
||||||
@project ||= current_user.projects.find_by_code(params[:project_id] || params[:id])
|
id = params[:project_id] || params[:id]
|
||||||
@project || render_404
|
|
||||||
|
@project = Project.find_with_namespace(id)
|
||||||
|
|
||||||
|
if @project and can?(current_user, :read_project, @project)
|
||||||
|
@project
|
||||||
|
else
|
||||||
|
@project = nil
|
||||||
|
render_404
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_project_abilities
|
def add_abilities
|
||||||
abilities << Ability
|
abilities << Ability
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -103,6 +112,10 @@ class ApplicationController < ActionController::Base
|
||||||
render file: Rails.root.join("public", "404"), layout: false, status: "404"
|
render file: Rails.root.join("public", "404"), layout: false, status: "404"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render_403
|
||||||
|
render file: Rails.root.join("public", "403"), layout: false, status: "403"
|
||||||
|
end
|
||||||
|
|
||||||
def require_non_empty_project
|
def require_non_empty_project
|
||||||
redirect_to @project if @project.empty_repo?
|
redirect_to @project if @project.empty_repo?
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,7 +26,8 @@ class CommitController < ProjectResourceController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
format.patch
|
format.diff { render text: @commit.to_diff }
|
||||||
|
format.patch { render text: @commit.to_patch }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,11 +1,23 @@
|
||||||
class DashboardController < ApplicationController
|
class DashboardController < ApplicationController
|
||||||
respond_to :html
|
respond_to :html
|
||||||
|
|
||||||
|
before_filter :projects
|
||||||
before_filter :event_filter, only: :index
|
before_filter :event_filter, only: :index
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@groups = Group.where(id: current_user.projects.pluck(:group_id))
|
@groups = current_user.authorized_groups
|
||||||
@projects = current_user.projects_sorted_by_activity
|
|
||||||
|
@has_authorized_projects = @projects.count > 0
|
||||||
|
|
||||||
|
@projects = case params[:scope]
|
||||||
|
when 'personal' then
|
||||||
|
@projects.personal(current_user)
|
||||||
|
when 'joined' then
|
||||||
|
@projects.joined(current_user)
|
||||||
|
else
|
||||||
|
@projects
|
||||||
|
end
|
||||||
|
|
||||||
@projects = @projects.page(params[:page]).per(30)
|
@projects = @projects.page(params[:page]).per(30)
|
||||||
|
|
||||||
@events = Event.in_projects(current_user.project_ids)
|
@events = Event.in_projects(current_user.project_ids)
|
||||||
|
@ -23,15 +35,16 @@ class DashboardController < ApplicationController
|
||||||
|
|
||||||
# Get authored or assigned open merge requests
|
# Get authored or assigned open merge requests
|
||||||
def merge_requests
|
def merge_requests
|
||||||
@projects = current_user.projects.all
|
@merge_requests = current_user.cared_merge_requests
|
||||||
@merge_requests = current_user.cared_merge_requests.recent.page(params[:page]).per(20)
|
@merge_requests = dashboard_filter(@merge_requests)
|
||||||
|
@merge_requests = @merge_requests.recent.page(params[:page]).per(20)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get only assigned issues
|
# Get only assigned issues
|
||||||
def issues
|
def issues
|
||||||
@projects = current_user.projects.all
|
@issues = current_user.assigned_issues
|
||||||
@user = current_user
|
@issues = dashboard_filter(@issues)
|
||||||
@issues = current_user.assigned_issues.opened.recent.page(params[:page]).per(20)
|
@issues = @issues.recent.page(params[:page]).per(20)
|
||||||
@issues = @issues.includes(:author, :project)
|
@issues = @issues.includes(:author, :project)
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
|
@ -40,7 +53,32 @@ class DashboardController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def projects
|
||||||
|
@projects = current_user.authorized_projects.sorted_by_activity
|
||||||
|
end
|
||||||
|
|
||||||
def event_filter
|
def event_filter
|
||||||
@event_filter ||= EventFilter.new(params[:event_filter])
|
@event_filter ||= EventFilter.new(params[:event_filter])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def dashboard_filter items
|
||||||
|
if params[:project_id]
|
||||||
|
items = items.where(project_id: params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
if params[:search].present?
|
||||||
|
items = items.search(params[:search])
|
||||||
|
end
|
||||||
|
|
||||||
|
case params[:status]
|
||||||
|
when 'closed'
|
||||||
|
items.closed
|
||||||
|
when 'all'
|
||||||
|
items
|
||||||
|
else
|
||||||
|
items.opened
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,9 @@ class GroupsController < ApplicationController
|
||||||
before_filter :group
|
before_filter :group
|
||||||
before_filter :projects
|
before_filter :projects
|
||||||
|
|
||||||
|
# Authorize
|
||||||
|
before_filter :authorize_read_group!
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0)
|
@events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0)
|
||||||
@last_push = current_user.recent_push
|
@last_push = current_user.recent_push
|
||||||
|
@ -18,7 +21,7 @@ class GroupsController < ApplicationController
|
||||||
|
|
||||||
# Get authored or assigned open merge requests
|
# Get authored or assigned open merge requests
|
||||||
def merge_requests
|
def merge_requests
|
||||||
@merge_requests = current_user.cared_merge_requests
|
@merge_requests = current_user.cared_merge_requests.opened
|
||||||
@merge_requests = @merge_requests.of_group(@group).recent.page(params[:page]).per(20)
|
@merge_requests = @merge_requests.of_group(@group).recent.page(params[:page]).per(20)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -44,20 +47,33 @@ class GroupsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def people
|
def people
|
||||||
@users = group.users.all
|
@project = group.projects.find(params[:project_id]) if params[:project_id]
|
||||||
|
@users = @project ? @project.users : group.users
|
||||||
|
@users.sort_by!(&:name)
|
||||||
|
|
||||||
|
if @project
|
||||||
|
@team_member = @project.users_projects.new
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def group
|
def group
|
||||||
@group ||= Group.find_by_code(params[:id])
|
@group ||= Group.find_by_path(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def projects
|
def projects
|
||||||
@projects ||= current_user.projects_sorted_by_activity.where(group_id: @group.id)
|
@projects ||= group.projects.authorized_for(current_user).sorted_by_activity
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_ids
|
def project_ids
|
||||||
projects.map(&:id)
|
projects.map(&:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Dont allow unauthorized access to group
|
||||||
|
def authorize_read_group!
|
||||||
|
unless projects.present? or can?(current_user, :manage_group, @group)
|
||||||
|
return render_404
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
class IssuesController < ProjectResourceController
|
class IssuesController < ProjectResourceController
|
||||||
before_filter :module_enabled
|
before_filter :module_enabled
|
||||||
before_filter :issue, only: [:edit, :update, :destroy, :show]
|
before_filter :issue, only: [:edit, :update, :show]
|
||||||
|
|
||||||
# Allow read any issue
|
# Allow read any issue
|
||||||
before_filter :authorize_read_issue!
|
before_filter :authorize_read_issue!
|
||||||
|
@ -11,9 +11,6 @@ class IssuesController < ProjectResourceController
|
||||||
# Allow modify issue
|
# Allow modify issue
|
||||||
before_filter :authorize_modify_issue!, only: [:edit, :update]
|
before_filter :authorize_modify_issue!, only: [:edit, :update]
|
||||||
|
|
||||||
# Allow destroy issue
|
|
||||||
before_filter :authorize_admin_issue!, only: [:destroy]
|
|
||||||
|
|
||||||
respond_to :js, :html
|
respond_to :js, :html
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@ -77,15 +74,6 @@ class IssuesController < ProjectResourceController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
|
||||||
@issue.destroy
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.html { redirect_to project_issues_path }
|
|
||||||
format.js { render nothing: true }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def sort
|
def sort
|
||||||
return render_404 unless can?(current_user, :admin_issue, @project)
|
return render_404 unless can?(current_user, :admin_issue, @project)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
class MergeRequestsController < ProjectResourceController
|
class MergeRequestsController < ProjectResourceController
|
||||||
before_filter :module_enabled
|
before_filter :module_enabled
|
||||||
before_filter :merge_request, only: [:edit, :update, :destroy, :show, :commits, :diffs, :automerge, :automerge_check, :raw]
|
before_filter :merge_request, only: [:edit, :update, :show, :commits, :diffs, :automerge, :automerge_check, :ci_status]
|
||||||
before_filter :validates_merge_request, only: [:show, :diffs, :raw]
|
before_filter :validates_merge_request, only: [:show, :diffs]
|
||||||
before_filter :define_show_vars, only: [:show, :diffs]
|
before_filter :define_show_vars, only: [:show, :diffs]
|
||||||
|
|
||||||
# Allow read any merge_request
|
# Allow read any merge_request
|
||||||
|
@ -13,10 +13,6 @@ class MergeRequestsController < ProjectResourceController
|
||||||
# Allow modify merge_request
|
# Allow modify merge_request
|
||||||
before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort]
|
before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort]
|
||||||
|
|
||||||
# Allow destroy merge_request
|
|
||||||
before_filter :authorize_admin_merge_request!, only: [:destroy]
|
|
||||||
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@merge_requests = MergeRequestsLoadContext.new(project, current_user, params).execute
|
@merge_requests = MergeRequestsLoadContext.new(project, current_user, params).execute
|
||||||
end
|
end
|
||||||
|
@ -25,11 +21,10 @@ class MergeRequestsController < ProjectResourceController
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html
|
format.html
|
||||||
format.js
|
format.js
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def raw
|
format.diff { render text: @merge_request.to_diff }
|
||||||
send_file @merge_request.to_raw
|
format.patch { render text: @merge_request.to_patch }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def diffs
|
def diffs
|
||||||
|
@ -87,14 +82,6 @@ class MergeRequestsController < ProjectResourceController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
|
||||||
@merge_request.destroy
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.html { redirect_to project_merge_requests_url(@project) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def branch_from
|
def branch_from
|
||||||
@commit = project.commit(params[:ref])
|
@commit = project.commit(params[:ref])
|
||||||
@commit = CommitDecorator.decorate(@commit)
|
@commit = CommitDecorator.decorate(@commit)
|
||||||
|
@ -105,6 +92,13 @@ class MergeRequestsController < ProjectResourceController
|
||||||
@commit = CommitDecorator.decorate(@commit)
|
@commit = CommitDecorator.decorate(@commit)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ci_status
|
||||||
|
status = project.gitlab_ci_service.commit_status(merge_request.last_commit.sha)
|
||||||
|
response = { status: status }
|
||||||
|
|
||||||
|
render json: response
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def merge_request
|
def merge_request
|
||||||
|
|
|
@ -12,11 +12,12 @@ class MilestonesController < ProjectResourceController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@milestones = case params[:f]
|
@milestones = case params[:f]
|
||||||
when 'all'; @project.milestones
|
when 'all'; @project.milestones.order("closed, due_date DESC")
|
||||||
else @project.milestones.active
|
when 'closed'; @project.milestones.closed.order("due_date DESC")
|
||||||
|
else @project.milestones.active.order("due_date ASC")
|
||||||
end
|
end
|
||||||
|
|
||||||
@milestones = @milestones.includes(:project).order("due_date")
|
@milestones = @milestones.includes(:project)
|
||||||
@milestones = @milestones.page(params[:page]).per(20)
|
@milestones = @milestones.page(params[:page]).per(20)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ class MilestonesController < ProjectResourceController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@milestone = @project.milestones.new(params[:milestone])
|
@milestone = @project.milestones.new(params[:milestone])
|
||||||
|
@milestone.author_id_of_changes = current_user.id
|
||||||
|
|
||||||
if @milestone.save
|
if @milestone.save
|
||||||
redirect_to project_milestone_path(@project, @milestone)
|
redirect_to project_milestone_path(@project, @milestone)
|
||||||
|
@ -51,7 +53,7 @@ class MilestonesController < ProjectResourceController
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@milestone.update_attributes(params[:milestone])
|
@milestone.update_attributes(params[:milestone].merge(author_id_of_changes: current_user.id))
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.js
|
format.js
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
||||||
Gitlab.config.omniauth_providers.each do |provider|
|
Gitlab.config.omniauth.providers.each do |provider|
|
||||||
define_method provider['name'] do
|
define_method provider['name'] do
|
||||||
handle_omniauth
|
handle_omniauth
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
class ProfileController < ApplicationController
|
class ProfilesController < ApplicationController
|
||||||
before_filter :user
|
before_filter :user
|
||||||
|
layout 'profile'
|
||||||
|
|
||||||
def show
|
def show
|
||||||
end
|
end
|
||||||
|
@ -7,8 +8,15 @@ class ProfileController < ApplicationController
|
||||||
def design
|
def design
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account
|
||||||
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@user.update_attributes(params[:user])
|
if @user.update_attributes(params[:user])
|
||||||
|
flash[:notice] = "Profile was successfully updated"
|
||||||
|
else
|
||||||
|
flash[:alert] = "Failed to update profile"
|
||||||
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :back }
|
format.html { redirect_to :back }
|
||||||
|
@ -19,7 +27,7 @@ class ProfileController < ApplicationController
|
||||||
def token
|
def token
|
||||||
end
|
end
|
||||||
|
|
||||||
def password_update
|
def update_password
|
||||||
params[:user].reject!{ |k, v| k != "password" && k != "password_confirmation"}
|
params[:user].reject!{ |k, v| k != "password" && k != "password_confirmation"}
|
||||||
|
|
||||||
if @user.update_attributes(params[:user])
|
if @user.update_attributes(params[:user])
|
||||||
|
@ -31,14 +39,25 @@ class ProfileController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def reset_private_token
|
def reset_private_token
|
||||||
current_user.reset_authentication_token!
|
if current_user.reset_authentication_token!
|
||||||
redirect_to profile_account_path
|
flash[:notice] = "Token was successfully updated"
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to account_profile_path
|
||||||
end
|
end
|
||||||
|
|
||||||
def history
|
def history
|
||||||
@events = current_user.recent_events.page(params[:page]).per(20)
|
@events = current_user.recent_events.page(params[:page]).per(20)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_username
|
||||||
|
@user.update_attributes(username: params[:user][:username])
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.js
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def user
|
def user
|
|
@ -1,5 +1,3 @@
|
||||||
class ProjectResourceController < ApplicationController
|
class ProjectResourceController < ApplicationController
|
||||||
before_filter :project
|
before_filter :project
|
||||||
# Authorize
|
|
||||||
before_filter :add_project_abilities
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -34,8 +34,11 @@ class ProjectsController < ProjectResourceController
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
status = ProjectUpdateContext.new(project, current_user, params).execute
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
if project.update_attributes(params[:project])
|
if status
|
||||||
|
flash[:notice] = 'Project was successfully updated.'
|
||||||
format.html { redirect_to edit_project_path(project), notice: 'Project was successfully updated.' }
|
format.html { redirect_to edit_project_path(project), notice: 'Project was successfully updated.' }
|
||||||
format.js
|
format.js
|
||||||
else
|
else
|
||||||
|
@ -43,6 +46,10 @@ class ProjectsController < ProjectResourceController
|
||||||
format.js
|
format.js
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
rescue Project::TransferError => ex
|
||||||
|
@error = ex
|
||||||
|
render :update_failed
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@ -51,12 +58,12 @@ class ProjectsController < ProjectResourceController
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html do
|
format.html do
|
||||||
unless @project.empty_repo?
|
unless @project.empty_repo?
|
||||||
@last_push = current_user.recent_push(@project.id)
|
@last_push = current_user.recent_push(@project.id)
|
||||||
render :show
|
render :show
|
||||||
else
|
else
|
||||||
render "projects/empty"
|
render "projects/empty"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
format.js
|
format.js
|
||||||
end
|
end
|
||||||
|
@ -80,12 +87,18 @@ class ProjectsController < ProjectResourceController
|
||||||
end
|
end
|
||||||
|
|
||||||
def graph
|
def graph
|
||||||
graph = Gitlab::Graph::JsonBuilder.new(project)
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
@days_json, @commits_json = graph.days_json, graph.commits_json
|
format.json do
|
||||||
|
graph = Gitlab::Graph::JsonBuilder.new(project)
|
||||||
|
render :json => graph.to_json
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
return access_denied! unless can?(current_user, :remove_project, project)
|
||||||
|
|
||||||
# Disable the UsersProject update_repository call, otherwise it will be
|
# Disable the UsersProject update_repository call, otherwise it will be
|
||||||
# called once for every person removed from the project
|
# called once for every person removed from the project
|
||||||
UsersProject.skip_callback(:destroy, :after, :update_repository)
|
UsersProject.skip_callback(:destroy, :after, :update_repository)
|
||||||
|
|
|
@ -16,7 +16,7 @@ class SnippetsController < ProjectResourceController
|
||||||
respond_to :html
|
respond_to :html
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@snippets = @project.snippets
|
@snippets = @project.snippets.fresh
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@ -60,7 +60,7 @@ class SnippetsController < ProjectResourceController
|
||||||
redirect_to project_snippets_path(@project)
|
redirect_to project_snippets_path(@project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def raw
|
def raw
|
||||||
send_data(
|
send_data(
|
||||||
@snippet.content,
|
@snippet.content,
|
||||||
type: "text/plain",
|
type: "text/plain",
|
||||||
|
|
|
@ -21,7 +21,11 @@ class TeamMembersController < ProjectResourceController
|
||||||
params[:project_access]
|
params[:project_access]
|
||||||
)
|
)
|
||||||
|
|
||||||
redirect_to project_team_index_path(@project)
|
if params[:redirect_to]
|
||||||
|
redirect_to params[:redirect_to]
|
||||||
|
else
|
||||||
|
redirect_to project_team_index_path(@project)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
|
|
@ -76,7 +76,7 @@ class CommitDecorator < ApplicationDecorator
|
||||||
source_name = send "#{options[:source]}_name".to_sym
|
source_name = send "#{options[:source]}_name".to_sym
|
||||||
source_email = send "#{options[:source]}_email".to_sym
|
source_email = send "#{options[:source]}_email".to_sym
|
||||||
text = if options[:avatar]
|
text = if options[:avatar]
|
||||||
avatar = h.image_tag h.gravatar_icon(source_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size]
|
avatar = h.image_tag h.gravatar_icon(source_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: ""
|
||||||
%Q{#{avatar} <span class="commit-#{options[:source]}-name">#{source_name}</span>}
|
%Q{#{avatar} <span class="commit-#{options[:source]}-name">#{source_name}</span>}
|
||||||
else
|
else
|
||||||
source_name
|
source_name
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
require 'digest/md5'
|
require 'digest/md5'
|
||||||
|
require 'uri'
|
||||||
|
|
||||||
module ApplicationHelper
|
module ApplicationHelper
|
||||||
|
|
||||||
|
@ -30,13 +31,15 @@ module ApplicationHelper
|
||||||
args.any? { |v| v.to_s.downcase == action_name }
|
args.any? { |v| v.to_s.downcase == action_name }
|
||||||
end
|
end
|
||||||
|
|
||||||
def gravatar_icon(user_email = '', size = 40)
|
def gravatar_icon(user_email = '', size = nil)
|
||||||
if Gitlab.config.disable_gravatar? || user_email.blank?
|
size = 40 if size.nil? || size <= 0
|
||||||
|
|
||||||
|
if !Gitlab.config.gravatar.enabled || user_email.blank?
|
||||||
'no_avatar.png'
|
'no_avatar.png'
|
||||||
else
|
else
|
||||||
gravatar_prefix = request.ssl? ? "https://secure" : "http://www"
|
gravatar_url = request.ssl? ? Gitlab.config.gravatar.ssl_url : Gitlab.config.gravatar.plain_url
|
||||||
user_email.strip!
|
user_email.strip!
|
||||||
"#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=mm"
|
sprintf(gravatar_url, {:hash => Digest::MD5.hexdigest(user_email.downcase), :email => URI.escape(user_email), :size => size})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -45,7 +48,7 @@ module ApplicationHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def web_app_url
|
def web_app_url
|
||||||
"#{request_protocol}://#{Gitlab.config.web_host}/"
|
"#{request_protocol}://#{Gitlab.config.gitlab.host}/"
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_commit(project)
|
def last_commit(project)
|
||||||
|
@ -75,7 +78,7 @@ module ApplicationHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def search_autocomplete_source
|
def search_autocomplete_source
|
||||||
projects = current_user.projects.map{ |p| { label: p.name, url: project_path(p) } }
|
projects = current_user.projects.map{ |p| { label: p.name_with_namespace, url: project_path(p) } }
|
||||||
|
|
||||||
default_nav = [
|
default_nav = [
|
||||||
{ label: "My Profile", url: profile_path },
|
{ label: "My Profile", url: profile_path },
|
||||||
|
@ -92,6 +95,7 @@ module ApplicationHelper
|
||||||
{ label: "API Help", url: help_api_path },
|
{ label: "API Help", url: help_api_path },
|
||||||
{ label: "Markdown Help", url: help_markdown_path },
|
{ label: "Markdown Help", url: help_markdown_path },
|
||||||
{ label: "SSH Keys Help", url: help_ssh_path },
|
{ label: "SSH Keys Help", url: help_ssh_path },
|
||||||
|
{ label: "Gitlab Rake Tasks Help", url: help_raketasks_path },
|
||||||
]
|
]
|
||||||
|
|
||||||
project_nav = []
|
project_nav = []
|
||||||
|
@ -126,6 +130,10 @@ module ApplicationHelper
|
||||||
Gitlab::Theme.css_class_by_id(current_user.try(:theme_id))
|
Gitlab::Theme.css_class_by_id(current_user.try(:theme_id))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_color_scheme_class
|
||||||
|
current_user.dark_scheme ? :black : :white
|
||||||
|
end
|
||||||
|
|
||||||
def show_last_push_widget?(event)
|
def show_last_push_widget?(event)
|
||||||
event &&
|
event &&
|
||||||
event.last_push_to_non_root? &&
|
event.last_push_to_non_root? &&
|
||||||
|
|
32
app/helpers/dashboard_helper.rb
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
module DashboardHelper
|
||||||
|
def dashboard_filter_path(entity, options={})
|
||||||
|
exist_opts = {
|
||||||
|
status: params[:status],
|
||||||
|
project_id: params[:project_id],
|
||||||
|
}
|
||||||
|
|
||||||
|
options = exist_opts.merge(options)
|
||||||
|
|
||||||
|
case entity
|
||||||
|
when 'issue' then
|
||||||
|
dashboard_issues_path(options)
|
||||||
|
when 'merge_request'
|
||||||
|
dashboard_merge_requests_path(options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def entities_per_project project, entity
|
||||||
|
items = project.items_for(entity)
|
||||||
|
|
||||||
|
items = case params[:status]
|
||||||
|
when 'closed'
|
||||||
|
items.closed
|
||||||
|
when 'all'
|
||||||
|
items
|
||||||
|
else
|
||||||
|
items.opened
|
||||||
|
end
|
||||||
|
|
||||||
|
items.where(assignee_id: current_user.id).count
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,28 +4,6 @@ module IssuesHelper
|
||||||
project_issues_path project, params
|
project_issues_path project, params
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_to_issue_assignee(issue)
|
|
||||||
project = issue.project
|
|
||||||
|
|
||||||
tm = project.team_member_by_id(issue.assignee_id)
|
|
||||||
if tm
|
|
||||||
link_to issue.assignee_name, project_team_member_path(project, tm), class: "author_link"
|
|
||||||
else
|
|
||||||
issue.assignee_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def link_to_issue_author(issue)
|
|
||||||
project = issue.project
|
|
||||||
|
|
||||||
tm = project.team_member_by_id(issue.author_id)
|
|
||||||
if tm
|
|
||||||
link_to issue.author_name, project_team_member_path(project, tm), class: "author_link"
|
|
||||||
else
|
|
||||||
issue.author_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def issue_css_classes issue
|
def issue_css_classes issue
|
||||||
classes = "issue"
|
classes = "issue"
|
||||||
classes << " closed" if issue.closed
|
classes << " closed" if issue.closed
|
||||||
|
@ -52,4 +30,14 @@ module IssuesHelper
|
||||||
open: "open"
|
open: "open"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def labels_autocomplete_source
|
||||||
|
labels = @project.issues_labels.order('count DESC')
|
||||||
|
labels = labels.map{ |l| { label: l.name, value: l.name } }
|
||||||
|
labels.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
def issues_active_milestones
|
||||||
|
@project.milestones.active.order("id desc").all
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,26 +1,4 @@
|
||||||
module MergeRequestsHelper
|
module MergeRequestsHelper
|
||||||
def link_to_merge_request_assignee(merge_request)
|
|
||||||
project = merge_request.project
|
|
||||||
|
|
||||||
tm = project.team_member_by_id(merge_request.assignee_id)
|
|
||||||
if tm
|
|
||||||
link_to merge_request.assignee_name, project_team_member_path(project, tm), class: "author_link"
|
|
||||||
else
|
|
||||||
merge_request.assignee_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def link_to_merge_request_author(merge_request)
|
|
||||||
project = merge_request.project
|
|
||||||
|
|
||||||
tm = project.team_member_by_id(merge_request.author_id)
|
|
||||||
if tm
|
|
||||||
link_to merge_request.author_name, project_team_member_path(project, tm), class: "author_link"
|
|
||||||
else
|
|
||||||
merge_request.author_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def new_mr_path_from_push_event(event)
|
def new_mr_path_from_push_event(event)
|
||||||
new_project_merge_request_path(
|
new_project_merge_request_path(
|
||||||
event.project,
|
event.project,
|
||||||
|
@ -39,7 +17,7 @@ module MergeRequestsHelper
|
||||||
classes
|
classes
|
||||||
end
|
end
|
||||||
|
|
||||||
def ci_status_path
|
def ci_build_details_path merge_request
|
||||||
@project.gitlab_ci_service.commit_badge_path(@merge_request.last_commit.sha)
|
merge_request.project.gitlab_ci_service.build_page(merge_request.last_commit.sha)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
26
app/helpers/namespaces_helper.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
module NamespacesHelper
|
||||||
|
def namespaces_options(selected = :current_user, scope = :default)
|
||||||
|
groups = current_user.namespaces.select {|n| n.type == 'Group'}
|
||||||
|
|
||||||
|
users = if scope == :all
|
||||||
|
Namespace.root
|
||||||
|
else
|
||||||
|
current_user.namespaces.reject {|n| n.type == 'Group'}
|
||||||
|
end
|
||||||
|
|
||||||
|
global_opts = ["Global", [['/', Namespace.global_id]] ]
|
||||||
|
group_opts = ["Groups", groups.map {|g| [g.human_name, g.id]} ]
|
||||||
|
users_opts = [ "Users", users.map {|u| [u.human_name, u.id]} ]
|
||||||
|
|
||||||
|
options = []
|
||||||
|
options << global_opts if current_user.admin
|
||||||
|
options << group_opts
|
||||||
|
options << users_opts
|
||||||
|
|
||||||
|
if selected == :current_user && current_user.namespace
|
||||||
|
selected = current_user.namespace.id
|
||||||
|
end
|
||||||
|
|
||||||
|
grouped_options_for_select(options, selected)
|
||||||
|
end
|
||||||
|
end
|
|
@ -8,11 +8,49 @@ module ProjectsHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_to_project project
|
def link_to_project project
|
||||||
link_to project.name, project
|
link_to project do
|
||||||
|
title = content_tag(:strong, project.name)
|
||||||
|
|
||||||
|
if project.namespace
|
||||||
|
namespace = content_tag(:span, "#{project.namespace.human_name} / ", class: 'tiny')
|
||||||
|
title = namespace + title
|
||||||
|
end
|
||||||
|
|
||||||
|
title
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def link_to_member(project, author)
|
||||||
|
return "(deleted)" unless author
|
||||||
|
|
||||||
|
# Build avatar image tag
|
||||||
|
avatar = image_tag(gravatar_icon(author.try(:email)), width: 16, class: "lil_av")
|
||||||
|
|
||||||
|
# Build name strong tag
|
||||||
|
name = content_tag :strong, author.name, class: 'author'
|
||||||
|
|
||||||
|
author_html = avatar + name
|
||||||
|
|
||||||
|
tm = project.team_member_by_id(author)
|
||||||
|
|
||||||
|
content_tag :span, class: 'member-link' do
|
||||||
|
if tm
|
||||||
|
link_to author_html, project_team_member_path(project, tm), class: "author_link"
|
||||||
|
else
|
||||||
|
author_html
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def tm_path team_member
|
def tm_path team_member
|
||||||
project_team_member_path(@project, team_member)
|
project_team_member_path(@project, team_member)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
|
def project_title project
|
||||||
|
if project.group
|
||||||
|
project.name_with_namespace
|
||||||
|
else
|
||||||
|
project.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -72,7 +72,7 @@ module TabHelper
|
||||||
return "active" if current_page?(controller: "projects", action: action, id: @project)
|
return "active" if current_page?(controller: "projects", action: action, id: @project)
|
||||||
end
|
end
|
||||||
|
|
||||||
if ['snippets', 'hooks', 'deploy_keys', 'team_members'].include? controller.controller_name
|
if ['snippets', 'services', 'hooks', 'deploy_keys', 'team_members'].include? controller.controller_name
|
||||||
"active"
|
"active"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -84,4 +84,17 @@ module TabHelper
|
||||||
'active'
|
'active'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Use nav_tab for save controller/action but different params
|
||||||
|
def nav_tab key, value, &block
|
||||||
|
o = {}
|
||||||
|
o[:class] = ""
|
||||||
|
o[:class] << " active" if params[key] == value
|
||||||
|
|
||||||
|
if block_given?
|
||||||
|
content_tag(:li, capture(&block), o)
|
||||||
|
else
|
||||||
|
content_tag(:li, nil, o)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,11 +3,11 @@ class Notify < ActionMailer::Base
|
||||||
add_template_helper ApplicationHelper
|
add_template_helper ApplicationHelper
|
||||||
add_template_helper GitlabMarkdownHelper
|
add_template_helper GitlabMarkdownHelper
|
||||||
|
|
||||||
default_url_options[:host] = Gitlab.config.web_host
|
default_url_options[:host] = Gitlab.config.gitlab.host
|
||||||
default_url_options[:protocol] = Gitlab.config.web_protocol
|
default_url_options[:protocol] = Gitlab.config.gitlab.protocol
|
||||||
default_url_options[:port] = Gitlab.config.web_port if Gitlab.config.web_custom_port?
|
default_url_options[:port] = Gitlab.config.gitlab.port if Gitlab.config.gitlab_on_non_standard_port?
|
||||||
|
|
||||||
default from: Gitlab.config.email_from
|
default from: Gitlab.config.gitlab.email_from
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ class Notify < ActionMailer::Base
|
||||||
def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
|
def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
|
||||||
@issue = Issue.find issue_id
|
@issue = Issue.find issue_id
|
||||||
@issue_status = status
|
@issue_status = status
|
||||||
|
@project = @issue.project
|
||||||
@updated_by = User.find updated_by_user_id
|
@updated_by = User.find updated_by_user_id
|
||||||
mail(to: recipient(recipient_id),
|
mail(to: recipient(recipient_id),
|
||||||
subject: subject("changed issue ##{@issue.id}", @issue.title))
|
subject: subject("changed issue ##{@issue.id}", @issue.title))
|
||||||
|
@ -89,14 +90,6 @@ class Notify < ActionMailer::Base
|
||||||
mail(to: recipient(recipient_id), subject: subject)
|
mail(to: recipient(recipient_id), subject: subject)
|
||||||
end
|
end
|
||||||
|
|
||||||
def note_wiki_email(recipient_id, note_id)
|
|
||||||
@note = Note.find(note_id)
|
|
||||||
@wiki = @note.noteable
|
|
||||||
@project = @note.project
|
|
||||||
mail(to: recipient(recipient_id), subject: subject("note for wiki"))
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Project
|
# Project
|
||||||
|
@ -105,11 +98,17 @@ class Notify < ActionMailer::Base
|
||||||
def project_access_granted_email(user_project_id)
|
def project_access_granted_email(user_project_id)
|
||||||
@users_project = UsersProject.find user_project_id
|
@users_project = UsersProject.find user_project_id
|
||||||
@project = @users_project.project
|
@project = @users_project.project
|
||||||
mail(to: @users_project.user.email,
|
mail(to: @users_project.user.email,
|
||||||
subject: subject("access to project was granted"))
|
subject: subject("access to project was granted"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def project_was_moved_email(user_project_id)
|
||||||
|
@users_project = UsersProject.find user_project_id
|
||||||
|
@project = @users_project.project
|
||||||
|
mail(to: @users_project.user.email,
|
||||||
|
subject: subject("project was moved"))
|
||||||
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# User
|
# User
|
||||||
|
|
|
@ -7,6 +7,7 @@ class Ability
|
||||||
when "Note" then note_abilities(object, subject)
|
when "Note" then note_abilities(object, subject)
|
||||||
when "Snippet" then snippet_abilities(object, subject)
|
when "Snippet" then snippet_abilities(object, subject)
|
||||||
when "MergeRequest" then merge_request_abilities(object, subject)
|
when "MergeRequest" then merge_request_abilities(object, subject)
|
||||||
|
when "Group" then group_abilities(object, subject)
|
||||||
else []
|
else []
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -14,7 +15,40 @@ class Ability
|
||||||
def project_abilities(user, project)
|
def project_abilities(user, project)
|
||||||
rules = []
|
rules = []
|
||||||
|
|
||||||
rules << [
|
# Rules based on role in project
|
||||||
|
if project.master_access_for?(user)
|
||||||
|
rules << project_master_rules
|
||||||
|
|
||||||
|
elsif project.dev_access_for?(user)
|
||||||
|
rules << project_dev_rules
|
||||||
|
|
||||||
|
elsif project.report_access_for?(user)
|
||||||
|
rules << project_report_rules
|
||||||
|
|
||||||
|
elsif project.guest_access_for?(user)
|
||||||
|
rules << project_guest_rules
|
||||||
|
end
|
||||||
|
|
||||||
|
if project.namespace
|
||||||
|
# If user own project namespace
|
||||||
|
# (Ex. group owner or account owner)
|
||||||
|
if project.namespace.owner == user
|
||||||
|
rules << project_admin_rules
|
||||||
|
end
|
||||||
|
else
|
||||||
|
# For compatibility with global projects
|
||||||
|
# use projects.owner_id
|
||||||
|
if project.owner == user
|
||||||
|
rules << project_admin_rules
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
rules.flatten
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_guest_rules
|
||||||
|
[
|
||||||
:read_project,
|
:read_project,
|
||||||
:read_wiki,
|
:read_wiki,
|
||||||
:read_issue,
|
:read_issue,
|
||||||
|
@ -26,28 +60,30 @@ class Ability
|
||||||
:write_project,
|
:write_project,
|
||||||
:write_issue,
|
:write_issue,
|
||||||
:write_note
|
:write_note
|
||||||
] if project.guest_access_for?(user)
|
]
|
||||||
|
end
|
||||||
|
|
||||||
rules << [
|
def project_report_rules
|
||||||
|
project_guest_rules + [
|
||||||
:download_code,
|
:download_code,
|
||||||
:write_merge_request,
|
:write_merge_request,
|
||||||
:write_snippet
|
:write_snippet
|
||||||
] if project.report_access_for?(user)
|
]
|
||||||
|
end
|
||||||
|
|
||||||
rules << [
|
def project_dev_rules
|
||||||
|
project_report_rules + [
|
||||||
:write_wiki,
|
:write_wiki,
|
||||||
:push_code
|
:push_code
|
||||||
] if project.dev_access_for?(user)
|
]
|
||||||
|
end
|
||||||
|
|
||||||
rules << [
|
def project_master_rules
|
||||||
:push_code_to_protected_branches
|
project_dev_rules + [
|
||||||
] if project.master_access_for?(user)
|
:push_code_to_protected_branches,
|
||||||
|
|
||||||
rules << [
|
|
||||||
:modify_issue,
|
:modify_issue,
|
||||||
:modify_snippet,
|
:modify_snippet,
|
||||||
:modify_merge_request,
|
:modify_merge_request,
|
||||||
:admin_project,
|
|
||||||
:admin_issue,
|
:admin_issue,
|
||||||
:admin_milestone,
|
:admin_milestone,
|
||||||
:admin_snippet,
|
:admin_snippet,
|
||||||
|
@ -55,8 +91,25 @@ class Ability
|
||||||
:admin_merge_request,
|
:admin_merge_request,
|
||||||
:admin_note,
|
:admin_note,
|
||||||
:accept_mr,
|
:accept_mr,
|
||||||
:admin_wiki
|
:admin_wiki,
|
||||||
] if project.master_access_for?(user) || project.owner == user
|
:admin_project
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_admin_rules
|
||||||
|
project_master_rules + [
|
||||||
|
:change_namespace,
|
||||||
|
:rename_project,
|
||||||
|
:remove_project
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def group_abilities user, group
|
||||||
|
rules = []
|
||||||
|
|
||||||
|
rules << [
|
||||||
|
:manage_group
|
||||||
|
] if group.owner == user
|
||||||
|
|
||||||
rules.flatten
|
rules.flatten
|
||||||
end
|
end
|
||||||
|
|
|
@ -87,14 +87,10 @@ class Commit
|
||||||
last = project.commit(from.try(:strip))
|
last = project.commit(from.try(:strip))
|
||||||
|
|
||||||
if first && last
|
if first && last
|
||||||
commits = [first, last].sort_by(&:created_at)
|
result[:same] = (first.id == last.id)
|
||||||
younger = commits.first
|
result[:commits] = project.repo.commits_between(last.id, first.id).map {|c| Commit.new(c)}
|
||||||
older = commits.last
|
result[:diffs] = project.repo.diff(last.id, first.id) rescue []
|
||||||
|
result[:commit] = Commit.new(first)
|
||||||
result[:same] = (younger.id == older.id)
|
|
||||||
result[:commits] = project.repo.commits_between(younger.id, older.id).map {|c| Commit.new(c)}
|
|
||||||
result[:diffs] = project.repo.diff(younger.id, older.id) rescue []
|
|
||||||
result[:commit] = Commit.new(older)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
result
|
result
|
||||||
|
@ -150,4 +146,21 @@ class Commit
|
||||||
def parents_count
|
def parents_count
|
||||||
parents && parents.count || 0
|
parents && parents.count || 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Shows the diff between the commit's parent and the commit.
|
||||||
|
#
|
||||||
|
# Cuts out the header and stats from #to_patch and returns only the diff.
|
||||||
|
def to_diff
|
||||||
|
# see Grit::Commit#show
|
||||||
|
patch = to_patch
|
||||||
|
|
||||||
|
# discard lines before the diff
|
||||||
|
lines = patch.split("\n")
|
||||||
|
while !lines.first.start_with?("diff --git") do
|
||||||
|
lines.shift
|
||||||
|
end
|
||||||
|
lines.pop if lines.last =~ /^[\d.]+$/ # Git version
|
||||||
|
lines.pop if lines.last == "-- " # end of diff
|
||||||
|
lines.join("\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
class Event < ActiveRecord::Base
|
class Event < ActiveRecord::Base
|
||||||
|
include NoteEvent
|
||||||
include PushEvent
|
include PushEvent
|
||||||
|
|
||||||
attr_accessible :project, :action, :data, :author_id, :project_id,
|
attr_accessible :project, :action, :data, :author_id, :project_id,
|
||||||
|
@ -58,12 +59,14 @@ class Event < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Next events currently enabled for system
|
def proper?
|
||||||
# - push
|
if push?
|
||||||
# - new issue
|
true
|
||||||
# - merge request
|
elsif membership_changed?
|
||||||
def allowed?
|
true
|
||||||
push? || issue? || merge_request? || membership_changed?
|
else
|
||||||
|
(issue? || merge_request? || note? || milestone?) && target
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_name
|
def project_name
|
||||||
|
@ -94,6 +97,14 @@ class Event < ActiveRecord::Base
|
||||||
action == self.class::Reopened
|
action == self.class::Reopened
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def milestone?
|
||||||
|
target_type == "Milestone"
|
||||||
|
end
|
||||||
|
|
||||||
|
def note?
|
||||||
|
target_type == "Note"
|
||||||
|
end
|
||||||
|
|
||||||
def issue?
|
def issue?
|
||||||
target_type == "Issue"
|
target_type == "Issue"
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,4 +36,22 @@ class GitlabCiService < Service
|
||||||
def commit_badge_path sha
|
def commit_badge_path sha
|
||||||
project_url + "/status?sha=#{sha}"
|
project_url + "/status?sha=#{sha}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def commit_status_path sha
|
||||||
|
project_url + "/builds/#{sha}/status.json?token=#{token}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def commit_status sha
|
||||||
|
response = HTTParty.get(commit_status_path(sha))
|
||||||
|
|
||||||
|
if response.code == 200 and response["status"]
|
||||||
|
response["status"]
|
||||||
|
else
|
||||||
|
:error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_page sha
|
||||||
|
project_url + "/builds/#{sha}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,36 +1,24 @@
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
#
|
#
|
||||||
# Table name: groups
|
# Table name: namespaces
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# name :string(255) not null
|
# name :string(255) not null
|
||||||
# code :string(255) not null
|
# path :string(255) not null
|
||||||
# owner_id :integer not null
|
# owner_id :integer not null
|
||||||
# created_at :datetime not null
|
# created_at :datetime not null
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
|
# type :string(255)
|
||||||
#
|
#
|
||||||
|
|
||||||
class Group < ActiveRecord::Base
|
class Group < Namespace
|
||||||
attr_accessible :code, :name, :owner_id
|
|
||||||
|
|
||||||
has_many :projects
|
|
||||||
belongs_to :owner, class_name: "User"
|
|
||||||
|
|
||||||
validates :name, presence: true, uniqueness: true
|
|
||||||
validates :code, presence: true, uniqueness: true
|
|
||||||
validates :owner, presence: true
|
|
||||||
|
|
||||||
delegate :name, to: :owner, allow_nil: true, prefix: true
|
|
||||||
|
|
||||||
def self.search query
|
|
||||||
where("name LIKE :query OR code LIKE :query", query: "%#{query}%")
|
|
||||||
end
|
|
||||||
|
|
||||||
def to_param
|
|
||||||
code
|
|
||||||
end
|
|
||||||
|
|
||||||
def users
|
def users
|
||||||
User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq
|
users = User.joins(:users_projects).where(users_projects: {project_id: project_ids})
|
||||||
|
users = users << owner
|
||||||
|
users.uniq
|
||||||
|
end
|
||||||
|
|
||||||
|
def human_name
|
||||||
|
name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -202,20 +202,26 @@ class MergeRequest < ActiveRecord::Base
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_raw
|
|
||||||
FileUtils.mkdir_p(Rails.root.join("tmp", "patches"))
|
|
||||||
patch_path = Rails.root.join("tmp", "patches", "merge_request_#{self.id}.patch")
|
|
||||||
|
|
||||||
from = commits.last.id
|
|
||||||
to = source_branch
|
|
||||||
|
|
||||||
project.repo.git.run('', "format-patch" , " > #{patch_path.to_s}", {}, ["#{from}..#{to}", "--stdout"])
|
|
||||||
|
|
||||||
patch_path
|
|
||||||
end
|
|
||||||
|
|
||||||
def mr_and_commit_notes
|
def mr_and_commit_notes
|
||||||
commit_ids = commits.map(&:id)
|
commit_ids = commits.map(&:id)
|
||||||
Note.where("(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND noteable_id IN (:commit_ids))", mr_id: id, commit_ids: commit_ids)
|
Note.where("(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))", mr_id: id, commit_ids: commit_ids)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the raw diff for this merge request
|
||||||
|
#
|
||||||
|
# see "git diff"
|
||||||
|
def to_diff
|
||||||
|
project.repo.git.native(:diff, {timeout: 30, raise: true}, "#{target_branch}...#{source_branch}")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the commit as a series of email patches.
|
||||||
|
#
|
||||||
|
# see "git format-patch"
|
||||||
|
def to_patch
|
||||||
|
project.repo.git.format_patch({timeout: 30, raise: true, stdout: true}, "#{target_branch}..#{source_branch}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def last_commit_short_sha
|
||||||
|
@last_commit_short_sha ||= last_commit.sha[0..10]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,18 +13,26 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
class Milestone < ActiveRecord::Base
|
class Milestone < ActiveRecord::Base
|
||||||
attr_accessible :title, :description, :due_date, :closed
|
attr_accessible :title, :description, :due_date, :closed, :author_id_of_changes
|
||||||
|
attr_accessor :author_id_of_changes
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
has_many :issues
|
has_many :issues
|
||||||
has_many :merge_requests
|
has_many :merge_requests
|
||||||
|
|
||||||
|
scope :active, where(closed: false)
|
||||||
|
scope :closed, where(closed: true)
|
||||||
|
|
||||||
validates :title, presence: true
|
validates :title, presence: true
|
||||||
validates :project, presence: true
|
validates :project, presence: true
|
||||||
validates :closed, inclusion: { in: [true, false] }
|
validates :closed, inclusion: { in: [true, false] }
|
||||||
|
|
||||||
def self.active
|
def expired?
|
||||||
where("due_date > ? OR due_date IS NULL", Date.today)
|
if due_date
|
||||||
|
due_date < Date.today
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def participants
|
def participants
|
||||||
|
@ -52,4 +60,20 @@ class Milestone < ActiveRecord::Base
|
||||||
def expires_at
|
def expires_at
|
||||||
"expires at #{due_date.stamp("Aug 21, 2011")}" if due_date
|
"expires at #{due_date.stamp("Aug 21, 2011")}" if due_date
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def can_be_closed?
|
||||||
|
open? && issues.opened.count.zero?
|
||||||
|
end
|
||||||
|
|
||||||
|
def is_empty?
|
||||||
|
total_items_count.zero?
|
||||||
|
end
|
||||||
|
|
||||||
|
def open?
|
||||||
|
!closed
|
||||||
|
end
|
||||||
|
|
||||||
|
def author_id
|
||||||
|
author_id_of_changes
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
77
app/models/namespace.rb
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: namespaces
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# name :string(255) not null
|
||||||
|
# path :string(255) not null
|
||||||
|
# owner_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# type :string(255)
|
||||||
|
#
|
||||||
|
|
||||||
|
class Namespace < ActiveRecord::Base
|
||||||
|
attr_accessible :name, :path
|
||||||
|
|
||||||
|
has_many :projects, dependent: :destroy
|
||||||
|
belongs_to :owner, class_name: "User"
|
||||||
|
|
||||||
|
validates :name, presence: true, uniqueness: true
|
||||||
|
validates :path, uniqueness: true, presence: true, length: { within: 1..255 },
|
||||||
|
format: { with: Gitlab::Regex.path_regex,
|
||||||
|
message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
|
||||||
|
validates :owner, presence: true
|
||||||
|
|
||||||
|
delegate :name, to: :owner, allow_nil: true, prefix: true
|
||||||
|
|
||||||
|
after_create :ensure_dir_exist
|
||||||
|
after_update :move_dir
|
||||||
|
after_destroy :rm_dir
|
||||||
|
|
||||||
|
scope :root, where('type IS NULL')
|
||||||
|
|
||||||
|
def self.search query
|
||||||
|
where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.global_id
|
||||||
|
'GLN'
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_param
|
||||||
|
path
|
||||||
|
end
|
||||||
|
|
||||||
|
def human_name
|
||||||
|
owner_name
|
||||||
|
end
|
||||||
|
|
||||||
|
def ensure_dir_exist
|
||||||
|
namespace_dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
|
||||||
|
system("mkdir -m 770 #{namespace_dir_path}") unless File.exists?(namespace_dir_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def move_dir
|
||||||
|
if path_changed?
|
||||||
|
old_path = File.join(Gitlab.config.gitolite.repos_path, path_was)
|
||||||
|
new_path = File.join(Gitlab.config.gitolite.repos_path, path)
|
||||||
|
if File.exists?(new_path)
|
||||||
|
raise "Already exists"
|
||||||
|
end
|
||||||
|
|
||||||
|
if system("mv #{old_path} #{new_path}")
|
||||||
|
send_update_instructions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def rm_dir
|
||||||
|
dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
|
||||||
|
system("rm -rf #{dir_path}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_update_instructions
|
||||||
|
projects.each(&:send_move_instructions)
|
||||||
|
end
|
||||||
|
end
|
|
@ -20,7 +20,7 @@ require 'file_size_validator'
|
||||||
class Note < ActiveRecord::Base
|
class Note < ActiveRecord::Base
|
||||||
|
|
||||||
attr_accessible :note, :noteable, :noteable_id, :noteable_type, :project_id,
|
attr_accessible :note, :noteable, :noteable_id, :noteable_type, :project_id,
|
||||||
:attachment, :line_code
|
:attachment, :line_code, :commit_id
|
||||||
|
|
||||||
attr_accessor :notify
|
attr_accessor :notify
|
||||||
attr_accessor :notify_author
|
attr_accessor :notify_author
|
||||||
|
@ -32,14 +32,17 @@ class Note < ActiveRecord::Base
|
||||||
delegate :name, to: :project, prefix: true
|
delegate :name, to: :project, prefix: true
|
||||||
delegate :name, :email, to: :author, prefix: true
|
delegate :name, :email, to: :author, prefix: true
|
||||||
|
|
||||||
validates :project, presence: true
|
validates :note, :project, presence: true
|
||||||
validates :note, presence: true, length: { within: 0..5000 }
|
|
||||||
validates :attachment, file_size: { maximum: 10.megabytes.to_i }
|
validates :attachment, file_size: { maximum: 10.megabytes.to_i }
|
||||||
|
|
||||||
mount_uploader :attachment, AttachmentUploader
|
validates :noteable_id, presence: true, if: ->(n) { n.noteable_type.present? && n.noteable_type != 'Commit' }
|
||||||
|
validates :commit_id, presence: true, if: ->(n) { n.noteable_type == 'Commit' }
|
||||||
|
|
||||||
|
mount_uploader :attachment, AttachmentUploader
|
||||||
|
|
||||||
# Scopes
|
# Scopes
|
||||||
scope :common, ->{ where(noteable_id: nil) }
|
scope :for_commits, ->{ where(noteable_type: "Commit") }
|
||||||
|
scope :common, ->{ where(noteable_id: nil, commit_id: nil) }
|
||||||
scope :today, ->{ where("created_at >= :date", date: Date.today) }
|
scope :today, ->{ where("created_at >= :date", date: Date.today) }
|
||||||
scope :last_week, ->{ where("created_at >= :date", date: (Date.today - 7.days)) }
|
scope :last_week, ->{ where("created_at >= :date", date: (Date.today - 7.days)) }
|
||||||
scope :since, ->(day) { where("created_at >= :date", date: (day)) }
|
scope :since, ->(day) { where("created_at >= :date", date: (day)) }
|
||||||
|
@ -67,7 +70,7 @@ class Note < ActiveRecord::Base
|
||||||
# override to return commits, which are not active record
|
# override to return commits, which are not active record
|
||||||
def noteable
|
def noteable
|
||||||
if for_commit?
|
if for_commit?
|
||||||
project.commit(noteable_id)
|
project.commit(commit_id)
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
@ -122,4 +125,12 @@ class Note < ActiveRecord::Base
|
||||||
def downvote?
|
def downvote?
|
||||||
note.start_with?('-1') || note.start_with?(':-1:')
|
note.start_with?('-1') || note.start_with?(':-1:')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def noteable_type_name
|
||||||
|
if noteable_type.present?
|
||||||
|
noteable_type.downcase
|
||||||
|
else
|
||||||
|
"wall"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,14 +9,13 @@
|
||||||
# created_at :datetime not null
|
# created_at :datetime not null
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
# private_flag :boolean default(TRUE), not null
|
# private_flag :boolean default(TRUE), not null
|
||||||
# code :string(255)
|
|
||||||
# owner_id :integer
|
# owner_id :integer
|
||||||
# default_branch :string(255)
|
# default_branch :string(255)
|
||||||
# issues_enabled :boolean default(TRUE), not null
|
# issues_enabled :boolean default(TRUE), not null
|
||||||
# wall_enabled :boolean default(TRUE), not null
|
# wall_enabled :boolean default(TRUE), not null
|
||||||
# merge_requests_enabled :boolean default(TRUE), not null
|
# merge_requests_enabled :boolean default(TRUE), not null
|
||||||
# wiki_enabled :boolean default(TRUE), not null
|
# wiki_enabled :boolean default(TRUE), not null
|
||||||
# group_id :integer
|
# namespace_id :integer
|
||||||
#
|
#
|
||||||
|
|
||||||
require "grit"
|
require "grit"
|
||||||
|
@ -26,13 +25,24 @@ class Project < ActiveRecord::Base
|
||||||
include PushObserver
|
include PushObserver
|
||||||
include Authority
|
include Authority
|
||||||
include Team
|
include Team
|
||||||
|
include NamespacedProject
|
||||||
|
|
||||||
|
class TransferError < StandardError; end
|
||||||
|
|
||||||
|
attr_accessible :name, :path, :description, :default_branch, :issues_enabled,
|
||||||
|
:wall_enabled, :merge_requests_enabled, :wiki_enabled, as: [:default, :admin]
|
||||||
|
|
||||||
|
attr_accessible :namespace_id, :owner_id, as: :admin
|
||||||
|
|
||||||
attr_accessible :name, :path, :description, :code, :default_branch, :issues_enabled,
|
|
||||||
:wall_enabled, :merge_requests_enabled, :wiki_enabled
|
|
||||||
attr_accessor :error_code
|
attr_accessor :error_code
|
||||||
|
|
||||||
# Relations
|
# Relations
|
||||||
belongs_to :group
|
belongs_to :group, foreign_key: "namespace_id", conditions: "type = 'Group'"
|
||||||
|
belongs_to :namespace
|
||||||
|
|
||||||
|
# TODO: replace owner with creator.
|
||||||
|
# With namespaces a project owner will be a namespace owner
|
||||||
|
# so this field makes sense only for global projects
|
||||||
belongs_to :owner, class_name: "User"
|
belongs_to :owner, class_name: "User"
|
||||||
has_many :users, through: :users_projects
|
has_many :users, through: :users_projects
|
||||||
has_many :events, dependent: :destroy
|
has_many :events, dependent: :destroy
|
||||||
|
@ -54,36 +64,79 @@ class Project < ActiveRecord::Base
|
||||||
# Validations
|
# Validations
|
||||||
validates :owner, presence: true
|
validates :owner, presence: true
|
||||||
validates :description, length: { within: 0..2000 }
|
validates :description, length: { within: 0..2000 }
|
||||||
validates :name, uniqueness: true, presence: true, length: { within: 0..255 }
|
validates :name, presence: true, length: { within: 0..255 }
|
||||||
validates :path, uniqueness: true, presence: true, length: { within: 0..255 },
|
validates :path, presence: true, length: { within: 0..255 },
|
||||||
format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
|
format: { with: Gitlab::Regex.path_regex,
|
||||||
message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
|
|
||||||
validates :code, presence: true, uniqueness: true, length: { within: 1..255 },
|
|
||||||
format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
|
|
||||||
message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
|
message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
|
||||||
validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
|
validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
|
||||||
:wiki_enabled, inclusion: { in: [true, false] }
|
:wiki_enabled, inclusion: { in: [true, false] }
|
||||||
|
|
||||||
|
validates_uniqueness_of :name, scope: :namespace_id
|
||||||
|
validates_uniqueness_of :path, scope: :namespace_id
|
||||||
|
|
||||||
validate :check_limit, :repo_name
|
validate :check_limit, :repo_name
|
||||||
|
|
||||||
# Scopes
|
# Scopes
|
||||||
scope :public_only, where(private_flag: false)
|
scope :public_only, where(private_flag: false)
|
||||||
scope :without_user, ->(user) { where("id NOT IN (:ids)", ids: user.projects.map(&:id) ) }
|
scope :without_user, ->(user) { where("id NOT IN (:ids)", ids: user.projects.map(&:id) ) }
|
||||||
scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
|
scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
|
||||||
|
scope :sorted_by_activity, ->() { order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC") }
|
||||||
|
scope :personal, ->(user) { where(namespace_id: user.namespace_id) }
|
||||||
|
scope :joined, ->(user) { where("namespace_id != ?", user.namespace_id) }
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
|
def authorized_for user
|
||||||
|
projects = includes(:users_projects, :namespace)
|
||||||
|
projects = projects.where("users_projects.user_id = :user_id or projects.owner_id = :user_id or namespaces.owner_id = :user_id", user_id: user.id)
|
||||||
|
end
|
||||||
|
|
||||||
def active
|
def active
|
||||||
joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
|
joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
|
||||||
end
|
end
|
||||||
|
|
||||||
def search query
|
def search query
|
||||||
where("name LIKE :query OR code LIKE :query OR path LIKE :query", query: "%#{query}%")
|
where("projects.name LIKE :query OR projects.path LIKE :query", query: "%#{query}%")
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_with_namespace(id)
|
||||||
|
if id.include?("/")
|
||||||
|
id = id.split("/")
|
||||||
|
namespace_id = Namespace.find_by_path(id.first).id
|
||||||
|
where(namespace_id: namespace_id).find_by_path(id.last)
|
||||||
|
else
|
||||||
|
where(path: id, namespace_id: nil).last
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_by_user(params, user)
|
def create_by_user(params, user)
|
||||||
|
namespace_id = params.delete(:namespace_id)
|
||||||
|
|
||||||
project = Project.new params
|
project = Project.new params
|
||||||
|
|
||||||
Project.transaction do
|
Project.transaction do
|
||||||
|
|
||||||
|
# Parametrize path for project
|
||||||
|
#
|
||||||
|
# Ex.
|
||||||
|
# 'GitLab HQ'.parameterize => "gitlab-hq"
|
||||||
|
#
|
||||||
|
project.path = project.name.dup.parameterize
|
||||||
|
|
||||||
project.owner = user
|
project.owner = user
|
||||||
|
|
||||||
|
# Apply namespace if user has access to it
|
||||||
|
# else fallback to user namespace
|
||||||
|
if namespace_id != Namespace.global_id
|
||||||
|
project.namespace_id = user.namespace_id
|
||||||
|
|
||||||
|
if namespace_id
|
||||||
|
group = Group.find_by_id(namespace_id)
|
||||||
|
if user.can? :manage_group, group
|
||||||
|
project.namespace_id = namespace_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
project.save!
|
project.save!
|
||||||
|
|
||||||
# Add user as project master
|
# Add user as project master
|
||||||
|
@ -126,7 +179,7 @@ class Project < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def repo_name
|
def repo_name
|
||||||
denied_paths = %w(gitolite-admin groups projects dashboard)
|
denied_paths = %w(gitolite-admin admin dashboard groups help profile projects search)
|
||||||
|
|
||||||
if denied_paths.include?(path)
|
if denied_paths.include?(path)
|
||||||
errors.add(:path, "like #{path} is not allowed")
|
errors.add(:path, "like #{path} is not allowed")
|
||||||
|
@ -134,11 +187,15 @@ class Project < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_param
|
def to_param
|
||||||
code
|
if namespace
|
||||||
|
namespace.path + "/" + path
|
||||||
|
else
|
||||||
|
path
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def web_url
|
def web_url
|
||||||
[Gitlab.config.url, code].join("/")
|
[Gitlab.config.gitlab.url, path_with_namespace].join("/")
|
||||||
end
|
end
|
||||||
|
|
||||||
def common_notes
|
def common_notes
|
||||||
|
@ -146,15 +203,15 @@ class Project < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_commit_note(commit)
|
def build_commit_note(commit)
|
||||||
notes.new(noteable_id: commit.id, noteable_type: "Commit")
|
notes.new(commit_id: commit.id, noteable_type: "Commit")
|
||||||
end
|
end
|
||||||
|
|
||||||
def commit_notes(commit)
|
def commit_notes(commit)
|
||||||
notes.where(noteable_id: commit.id, noteable_type: "Commit", line_code: nil)
|
notes.where(commit_id: commit.id, noteable_type: "Commit", line_code: nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
def commit_line_notes(commit)
|
def commit_line_notes(commit)
|
||||||
notes.where(noteable_id: commit.id, noteable_type: "Commit").where("line_code IS NOT NULL")
|
notes.where(commit_id: commit.id, noteable_type: "Commit").where("line_code IS NOT NULL")
|
||||||
end
|
end
|
||||||
|
|
||||||
def public?
|
def public?
|
||||||
|
@ -173,10 +230,6 @@ class Project < ActiveRecord::Base
|
||||||
last_event.try(:created_at) || updated_at
|
last_event.try(:created_at) || updated_at
|
||||||
end
|
end
|
||||||
|
|
||||||
def wiki_notes
|
|
||||||
Note.where(noteable_id: wikis.pluck(:id), noteable_type: 'Wiki', project_id: self.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def project_id
|
def project_id
|
||||||
self.id
|
self.id
|
||||||
end
|
end
|
||||||
|
@ -192,4 +245,24 @@ class Project < ActiveRecord::Base
|
||||||
def gitlab_ci?
|
def gitlab_ci?
|
||||||
gitlab_ci_service && gitlab_ci_service.active
|
gitlab_ci_service && gitlab_ci_service.active
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# For compatibility with old code
|
||||||
|
def code
|
||||||
|
path
|
||||||
|
end
|
||||||
|
|
||||||
|
def items_for entity
|
||||||
|
case entity
|
||||||
|
when 'issue' then
|
||||||
|
issues
|
||||||
|
when 'merge_request' then
|
||||||
|
merge_requests
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_move_instructions
|
||||||
|
self.users_projects.each do |member|
|
||||||
|
Notify.project_was_moved_email(member.id).deliver
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|