Imported Upstream version 8.4.0+dfsg~rc1
This commit is contained in:
parent
d511a8f485
commit
cadc90562a
590 changed files with 24560 additions and 3359 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -26,6 +26,7 @@ config/initializers/smtp_settings.rb
|
||||||
config/resque.yml
|
config/resque.yml
|
||||||
config/unicorn.rb
|
config/unicorn.rb
|
||||||
config/secrets.yml
|
config/secrets.yml
|
||||||
|
config/sidekiq.yml
|
||||||
coverage/*
|
coverage/*
|
||||||
db/*.sqlite3
|
db/*.sqlite3
|
||||||
db/*.sqlite3-journal
|
db/*.sqlite3-journal
|
||||||
|
|
|
@ -12,6 +12,7 @@ before_script:
|
||||||
|
|
||||||
spec:feature:
|
spec:feature:
|
||||||
script:
|
script:
|
||||||
|
- RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null
|
||||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature
|
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature
|
||||||
tags:
|
tags:
|
||||||
- ruby
|
- ruby
|
||||||
|
|
76
CHANGELOG
76
CHANGELOG
|
@ -1,6 +1,76 @@
|
||||||
Please view this file on the master branch, on stable branches it's out of date.
|
Please view this file on the master branch, on stable branches it's out of date.
|
||||||
|
|
||||||
v 8.3.0 (unreleased)
|
v 8.4.0 (unreleased)
|
||||||
|
- Autocomplete data is now always loaded, instead of when focusing a comment text area (Yorick Peterse)
|
||||||
|
- Improved performance of finding issues for an entire group (Yorick Peterse)
|
||||||
|
- Added custom application performance measuring system powered by InfluxDB (Yorick Peterse)
|
||||||
|
- Bump fog to 1.36.0 (Stan Hu)
|
||||||
|
- Add user's last used IP addresses to admin page (Stan Hu)
|
||||||
|
- Add housekeeping function to project settings page
|
||||||
|
- The default GitLab logo now acts as a loading indicator
|
||||||
|
- Fix caching issue where build status was not updating in project dashboard (Stan Hu)
|
||||||
|
- Accept 2xx status codes for successful Web hook triggers (Stan Hu)
|
||||||
|
- Fix missing date of month in network graph when commits span a month (Stan Hu)
|
||||||
|
- Expire view caches when application settings change (e.g. Gravatar disabled) (Stan Hu)
|
||||||
|
- Don't notify users twice if they are both project watchers and subscribers (Stan Hu)
|
||||||
|
- Implement new UI for group page
|
||||||
|
- Implement search inside emoji picker
|
||||||
|
- Add API support for looking up a user by username (Stan Hu)
|
||||||
|
- Add project permissions to all project API endpoints (Stan Hu)
|
||||||
|
- Link to milestone in "Milestone changed" system note
|
||||||
|
- Only allow group/project members to mention `@all`
|
||||||
|
- Expose Git's version in the admin area (Trey Davis)
|
||||||
|
- Add "Frequently used" category to emoji picker
|
||||||
|
- Add CAS support (tduehr)
|
||||||
|
- Add link to merge request on build detail page
|
||||||
|
- Fix: Problem with projects ending with .keys (Jose Corcuera)
|
||||||
|
- Revert back upvote and downvote button to the issue and MR pages
|
||||||
|
- Swap position of Assignee and Author selector on Issuables (Zeger-Jan van de Weg)
|
||||||
|
- Add system hook messages for project rename and transfer (Steve Norman)
|
||||||
|
- Fix version check image in Safari
|
||||||
|
- Show 'All' tab by default in the builds page
|
||||||
|
- Add Open Graph and Twitter Card data to all pages
|
||||||
|
- Fix API project lookups when querying with a namespace with dots (Stan Hu)
|
||||||
|
- Enable forcing Two-Factor authentication sitewide, with optional grace period
|
||||||
|
- Import GitHub Pull Requests into GitLab
|
||||||
|
- Change single user API endpoint to return more detailed data (Michael Potthoff)
|
||||||
|
- Update version check images to use SVG
|
||||||
|
- Validate README format before displaying
|
||||||
|
- Enable Microsoft Azure OAuth2 support (Janis Meybohm)
|
||||||
|
- Properly set task-list class on single item task lists
|
||||||
|
- Add file finder feature in tree view (Kyungchul Shin)
|
||||||
|
- Ajax filter by message for commits page
|
||||||
|
- API: Add support for deleting a tag via the API (Robert Schilling)
|
||||||
|
- Allow subsequent validations in CI Linter
|
||||||
|
|
||||||
|
v 8.3.4
|
||||||
|
- Use gitlab-workhorse 0.5.4 (fixes API routing bug)
|
||||||
|
|
||||||
|
v 8.3.3
|
||||||
|
- Preserve CE behavior with JIRA integration by only calling API if URL is set
|
||||||
|
- Fix duplicated branch creation/deletion events when using Web UI (Stan Hu)
|
||||||
|
- Add configurable LDAP server query timeout
|
||||||
|
- Get "Merge when build succeeds" to work when commits were pushed to MR target branch while builds were running
|
||||||
|
- Suppress e-mails on failed builds if allow_failure is set (Stan Hu)
|
||||||
|
- Fix project transfer e-mail sending incorrect paths in e-mail notification (Stan Hu)
|
||||||
|
- Better support for referencing and closing issues in Asana service (Mike Wyatt)
|
||||||
|
- Enable "Add key" button when user fills in a proper key (Stan Hu)
|
||||||
|
- Fix error in processing reply-by-email messages (Jason Lee)
|
||||||
|
- Fix Error 500 when visiting build page of project with nil runners_token (Stan Hu)
|
||||||
|
- Use WOFF versions of SourceSansPro fonts
|
||||||
|
- Fix regression when builds were not generated for tags created through web/api interface
|
||||||
|
|
||||||
|
v 8.3.2
|
||||||
|
- Disable --follow in `git log` to avoid loading duplicate commit data in infinite scroll (Stan Hu)
|
||||||
|
- Add support for Google reCAPTCHA in user registration
|
||||||
|
|
||||||
|
v 8.3.1
|
||||||
|
- Fix Error 500 when global milestones have slashes (Stan Hu)
|
||||||
|
- Fix Error 500 when doing a search in dashboard before visiting any project (Stan Hu)
|
||||||
|
- Fix LDAP identity and user retrieval when special characters are used
|
||||||
|
- Move Sidekiq-cron configuration to gitlab.yml
|
||||||
|
|
||||||
|
v 8.3.0
|
||||||
- Bump rack-attack to 4.3.1 for security fix (Stan Hu)
|
- Bump rack-attack to 4.3.1 for security fix (Stan Hu)
|
||||||
- API support for starred projects for authorized user (Zeger-Jan van de Weg)
|
- API support for starred projects for authorized user (Zeger-Jan van de Weg)
|
||||||
- Add open_issues_count to project API (Stan Hu)
|
- Add open_issues_count to project API (Stan Hu)
|
||||||
|
@ -62,6 +132,8 @@ v 8.3.0 (unreleased)
|
||||||
- Do not show build status unless builds are enabled and `.gitlab-ci.yml` is present
|
- Do not show build status unless builds are enabled and `.gitlab-ci.yml` is present
|
||||||
- Persist runners registration token in database
|
- Persist runners registration token in database
|
||||||
- Fix online editor should not remove newlines at the end of the file
|
- Fix online editor should not remove newlines at the end of the file
|
||||||
|
- Expose Git's version in the admin area
|
||||||
|
- Show "New Merge Request" buttons on canonical repos when you have a fork (Josh Frye)
|
||||||
|
|
||||||
v 8.2.3
|
v 8.2.3
|
||||||
- Fix application settings cache not expiring after changes (Stan Hu)
|
- Fix application settings cache not expiring after changes (Stan Hu)
|
||||||
|
@ -120,6 +192,8 @@ v 8.2.0
|
||||||
- Allow to define cache in `.gitlab-ci.yml`
|
- Allow to define cache in `.gitlab-ci.yml`
|
||||||
- Fix: 500 error returned if destroy request without HTTP referer (Kazuki Shimizu)
|
- Fix: 500 error returned if destroy request without HTTP referer (Kazuki Shimizu)
|
||||||
- Remove deprecated CI events from project settings page
|
- Remove deprecated CI events from project settings page
|
||||||
|
- Use issue editor as cross reference comment author when issue is edited with a new mention.
|
||||||
|
- Add graphs of commits ahead and behind default branch (Jeff Stubler)
|
||||||
- Improve personal snippet access workflow (Douglas Alexandre)
|
- Improve personal snippet access workflow (Douglas Alexandre)
|
||||||
- [API] Add ability to fetch the commit ID of the last commit that actually touched a file
|
- [API] Add ability to fetch the commit ID of the last commit that actually touched a file
|
||||||
- Fix omniauth documentation setting for omnibus configuration (Jon Cairns)
|
- Fix omniauth documentation setting for omnibus configuration (Jon Cairns)
|
||||||
|
|
|
@ -155,6 +155,28 @@ sudo -u git -H bundle exec rake gitlab:env:info)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Issue weight
|
||||||
|
|
||||||
|
Issue weight allows us to get an idea of the amount of work required to solve
|
||||||
|
one or multiple issues. This makes it possible to schedule work more accurately.
|
||||||
|
|
||||||
|
You are encouraged to set the weight of any issue. Following the guidelines
|
||||||
|
below will make it easy to manage this, without unnecessary overhead.
|
||||||
|
|
||||||
|
1. Set weight for any issue at the earliest possible convenience
|
||||||
|
1. If you don't agree with a set weight, discuss with other developers until
|
||||||
|
consensus is reached about the weight
|
||||||
|
1. Issue weights are an abstract measurement of complexity of the issue. Do not
|
||||||
|
relate issue weight directly to time. This is called [anchoring](https://en.wikipedia.org/wiki/Anchoring)
|
||||||
|
and something you want to avoid.
|
||||||
|
1. Something that has a weight of 1 (or no weight) is really small and simple.
|
||||||
|
Something that is 9 is rewriting a large fundamental part of GitLab,
|
||||||
|
which might lead to many hard problems to solve. Changing some text in GitLab
|
||||||
|
is probably 1, adding a new Git Hook maybe 4 or 5, big features 7-9.
|
||||||
|
1. If something is very large, it should probably be split up in multiple
|
||||||
|
issues or chunks. You can simply not set the weight of a parent issue and set
|
||||||
|
weights to children issues.
|
||||||
|
|
||||||
## Merge requests
|
## Merge requests
|
||||||
|
|
||||||
We welcome merge requests with fixes and improvements to GitLab code, tests,
|
We welcome merge requests with fixes and improvements to GitLab code, tests,
|
||||||
|
@ -358,7 +380,7 @@ available at [http://contributor-covenant.org/version/1/1/0/](http://contributor
|
||||||
[core team]: https://about.gitlab.com/core-team/
|
[core team]: https://about.gitlab.com/core-team/
|
||||||
[getting help page]: https://about.gitlab.com/getting-help/
|
[getting help page]: https://about.gitlab.com/getting-help/
|
||||||
[Codetriage]: http://www.codetriage.com/gitlabhq/gitlabhq
|
[Codetriage]: http://www.codetriage.com/gitlabhq/gitlabhq
|
||||||
[up-for-grabs]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=up+for+grabs
|
[up-for-grabs]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=up-for-grabs
|
||||||
[medium-up-for-grabs]: https://medium.com/@kentcdodds/first-timers-only-78281ea47455
|
[medium-up-for-grabs]: https://medium.com/@kentcdodds/first-timers-only-78281ea47455
|
||||||
[ce-tracker]: https://gitlab.com/gitlab-org/gitlab-ce/issues
|
[ce-tracker]: https://gitlab.com/gitlab-org/gitlab-ce/issues
|
||||||
[ee-tracker]: https://gitlab.com/gitlab-org/gitlab-ee/issues
|
[ee-tracker]: https://gitlab.com/gitlab-org/gitlab-ee/issues
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2.6.9
|
2.6.10
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.5.1
|
0.5.4
|
||||||
|
|
41
Gemfile
41
Gemfile
|
@ -22,7 +22,9 @@ gem 'devise', '~> 3.5.3'
|
||||||
gem 'devise-async', '~> 0.9.0'
|
gem 'devise-async', '~> 0.9.0'
|
||||||
gem 'doorkeeper', '~> 2.2.0'
|
gem 'doorkeeper', '~> 2.2.0'
|
||||||
gem 'omniauth', '~> 1.2.2'
|
gem 'omniauth', '~> 1.2.2'
|
||||||
|
gem 'omniauth-azure-oauth2', '~> 0.0.6'
|
||||||
gem 'omniauth-bitbucket', '~> 0.0.2'
|
gem 'omniauth-bitbucket', '~> 0.0.2'
|
||||||
|
gem 'omniauth-cas3', '~> 1.1.2'
|
||||||
gem 'omniauth-facebook', '~> 3.0.0'
|
gem 'omniauth-facebook', '~> 3.0.0'
|
||||||
gem 'omniauth-github', '~> 1.1.1'
|
gem 'omniauth-github', '~> 1.1.1'
|
||||||
gem 'omniauth-gitlab', '~> 1.0.0'
|
gem 'omniauth-gitlab', '~> 1.0.0'
|
||||||
|
@ -31,9 +33,12 @@ gem 'omniauth-kerberos', '~> 0.3.0', group: :kerberos
|
||||||
gem 'omniauth-saml', '~> 1.4.0'
|
gem 'omniauth-saml', '~> 1.4.0'
|
||||||
gem 'omniauth-shibboleth', '~> 1.2.0'
|
gem 'omniauth-shibboleth', '~> 1.2.0'
|
||||||
gem 'omniauth-twitter', '~> 1.2.0'
|
gem 'omniauth-twitter', '~> 1.2.0'
|
||||||
gem 'omniauth_crowd'
|
gem 'omniauth_crowd', '~> 2.2.0'
|
||||||
gem 'rack-oauth2', '~> 1.2.1'
|
gem 'rack-oauth2', '~> 1.2.1'
|
||||||
|
|
||||||
|
# reCAPTCHA protection
|
||||||
|
gem 'recaptcha', require: 'recaptcha/rails'
|
||||||
|
|
||||||
# Two-factor authentication
|
# Two-factor authentication
|
||||||
gem 'devise-two-factor', '~> 2.0.0'
|
gem 'devise-two-factor', '~> 2.0.0'
|
||||||
gem 'rqrcode-rails3', '~> 0.1.7'
|
gem 'rqrcode-rails3', '~> 0.1.7'
|
||||||
|
@ -44,7 +49,7 @@ gem "browser", '~> 1.0.0'
|
||||||
|
|
||||||
# Extracting information from a git repository
|
# Extracting information from a git repository
|
||||||
# Provide access to Gitlab::Git library
|
# Provide access to Gitlab::Git library
|
||||||
gem "gitlab_git", '~> 7.2.20'
|
gem "gitlab_git", '~> 7.2.22'
|
||||||
|
|
||||||
# LDAP Auth
|
# LDAP Auth
|
||||||
# GitLab fork with several improvements to original library. For full list of changes
|
# GitLab fork with several improvements to original library. For full list of changes
|
||||||
|
@ -62,10 +67,6 @@ gem 'grape', '~> 0.13.0'
|
||||||
gem 'grape-entity', '~> 0.4.2'
|
gem 'grape-entity', '~> 0.4.2'
|
||||||
gem 'rack-cors', '~> 0.4.0', require: 'rack/cors'
|
gem 'rack-cors', '~> 0.4.0', require: 'rack/cors'
|
||||||
|
|
||||||
# Format dates and times
|
|
||||||
# based on human-friendly examples
|
|
||||||
gem "stamp", '~> 0.6.0'
|
|
||||||
|
|
||||||
# Pagination
|
# Pagination
|
||||||
gem "kaminari", "~> 0.16.3"
|
gem "kaminari", "~> 0.16.3"
|
||||||
|
|
||||||
|
@ -79,7 +80,7 @@ gem "carrierwave", '~> 0.9.0'
|
||||||
gem 'dropzonejs-rails', '~> 0.7.1'
|
gem 'dropzonejs-rails', '~> 0.7.1'
|
||||||
|
|
||||||
# for aws storage
|
# for aws storage
|
||||||
gem "fog", "~> 1.25.0"
|
gem "fog", "~> 1.36.0"
|
||||||
gem "unf", '~> 0.1.4'
|
gem "unf", '~> 0.1.4'
|
||||||
|
|
||||||
# Authorization
|
# Authorization
|
||||||
|
@ -165,13 +166,13 @@ gem 'asana', '~> 0.4.0'
|
||||||
gem 'ruby-fogbugz', '~> 0.2.1'
|
gem 'ruby-fogbugz', '~> 0.2.1'
|
||||||
|
|
||||||
# d3
|
# d3
|
||||||
gem 'd3_rails', '~> 3.5.5'
|
gem 'd3_rails', '~> 3.5.0'
|
||||||
|
|
||||||
#cal-heatmap
|
#cal-heatmap
|
||||||
gem "cal-heatmap-rails", "~> 0.0.1"
|
gem 'cal-heatmap-rails', '~> 3.5.0'
|
||||||
|
|
||||||
# underscore-rails
|
# underscore-rails
|
||||||
gem "underscore-rails", "~> 1.4.4"
|
gem "underscore-rails", "~> 1.8.0"
|
||||||
|
|
||||||
# Sanitize user input
|
# Sanitize user input
|
||||||
gem "sanitize", '~> 2.0'
|
gem "sanitize", '~> 2.0'
|
||||||
|
@ -189,21 +190,21 @@ gem 'mousetrap-rails', '~> 1.4.6'
|
||||||
# Detect and convert string character encoding
|
# Detect and convert string character encoding
|
||||||
gem 'charlock_holmes', '~> 0.7.3'
|
gem 'charlock_holmes', '~> 0.7.3'
|
||||||
|
|
||||||
gem "sass-rails", '~> 4.0.5'
|
gem "sass-rails", '~> 5.0.0'
|
||||||
gem "coffee-rails", '~> 4.1.0'
|
gem "coffee-rails", '~> 4.1.0'
|
||||||
gem "uglifier", '~> 2.7.2'
|
gem "uglifier", '~> 2.7.2'
|
||||||
gem 'turbolinks', '~> 2.5.0'
|
gem 'turbolinks', '~> 2.5.0'
|
||||||
gem 'jquery-turbolinks', '~> 2.1.0'
|
gem 'jquery-turbolinks', '~> 2.1.0'
|
||||||
|
|
||||||
gem 'addressable', '~> 2.3.8'
|
gem 'addressable', '~> 2.3.8'
|
||||||
gem 'bootstrap-sass', '~> 3.0'
|
gem 'bootstrap-sass', '~> 3.3.0'
|
||||||
gem 'font-awesome-rails', '~> 4.2'
|
gem 'font-awesome-rails', '~> 4.2'
|
||||||
gem 'gitlab_emoji', '~> 0.2.0'
|
gem 'gitlab_emoji', '~> 0.2.0'
|
||||||
gem 'gon', '~> 6.0.1'
|
gem 'gon', '~> 6.0.1'
|
||||||
gem 'jquery-atwho-rails', '~> 1.3.2'
|
gem 'jquery-atwho-rails', '~> 1.3.2'
|
||||||
gem 'jquery-rails', '~> 3.1.3'
|
gem 'jquery-rails', '~> 4.0.0'
|
||||||
gem 'jquery-scrollto-rails', '~> 1.4.3'
|
gem 'jquery-scrollto-rails', '~> 1.4.3'
|
||||||
gem 'jquery-ui-rails', '~> 4.2.1'
|
gem 'jquery-ui-rails', '~> 5.0.0'
|
||||||
gem 'nprogress-rails', '~> 0.1.6.7'
|
gem 'nprogress-rails', '~> 0.1.6.7'
|
||||||
gem 'raphael-rails', '~> 2.1.2'
|
gem 'raphael-rails', '~> 2.1.2'
|
||||||
gem 'request_store', '~> 1.2.0'
|
gem 'request_store', '~> 1.2.0'
|
||||||
|
@ -211,9 +212,17 @@ gem 'select2-rails', '~> 3.5.9'
|
||||||
gem 'virtus', '~> 1.0.1'
|
gem 'virtus', '~> 1.0.1'
|
||||||
gem 'net-ssh', '~> 3.0.1'
|
gem 'net-ssh', '~> 3.0.1'
|
||||||
|
|
||||||
|
# Metrics
|
||||||
|
group :metrics do
|
||||||
|
gem 'allocations', '~> 1.0', require: false, platform: :mri
|
||||||
|
gem 'method_source', '~> 0.8', require: false
|
||||||
|
gem 'influxdb', '~> 0.2', require: false
|
||||||
|
gem 'connection_pool', '~> 2.0', require: false
|
||||||
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "foreman"
|
gem "foreman"
|
||||||
gem 'brakeman', '3.0.1', require: false
|
gem 'brakeman', '~> 3.1.0', require: false
|
||||||
|
|
||||||
gem "annotate", "~> 2.6.0"
|
gem "annotate", "~> 2.6.0"
|
||||||
gem "letter_opener", '~> 1.1.2'
|
gem "letter_opener", '~> 1.1.2'
|
||||||
|
@ -238,7 +247,7 @@ group :development, :test do
|
||||||
gem 'byebug', platform: :mri
|
gem 'byebug', platform: :mri
|
||||||
gem 'pry-rails'
|
gem 'pry-rails'
|
||||||
|
|
||||||
gem 'awesome_print', '~> 1.2.0'
|
gem 'awesome_print', '~> 1.2.0', require: false
|
||||||
gem 'fuubar', '~> 2.0.0'
|
gem 'fuubar', '~> 2.0.0'
|
||||||
|
|
||||||
gem 'database_cleaner', '~> 1.4.0'
|
gem 'database_cleaner', '~> 1.4.0'
|
||||||
|
|
194
Gemfile.lock
194
Gemfile.lock
|
@ -49,6 +49,7 @@ GEM
|
||||||
addressable (2.3.8)
|
addressable (2.3.8)
|
||||||
after_commit_queue (1.3.0)
|
after_commit_queue (1.3.0)
|
||||||
activerecord (>= 3.0)
|
activerecord (>= 3.0)
|
||||||
|
allocations (1.0.3)
|
||||||
annotate (2.6.10)
|
annotate (2.6.10)
|
||||||
activerecord (>= 3.2, <= 4.3)
|
activerecord (>= 3.2, <= 4.3)
|
||||||
rake (~> 10.4)
|
rake (~> 10.4)
|
||||||
|
@ -65,7 +66,7 @@ GEM
|
||||||
attr_encrypted (1.3.4)
|
attr_encrypted (1.3.4)
|
||||||
encryptor (>= 1.3.0)
|
encryptor (>= 1.3.0)
|
||||||
attr_required (1.0.0)
|
attr_required (1.0.0)
|
||||||
autoprefixer-rails (6.1.1)
|
autoprefixer-rails (6.2.3)
|
||||||
execjs
|
execjs
|
||||||
json
|
json
|
||||||
awesome_print (1.2.0)
|
awesome_print (1.2.0)
|
||||||
|
@ -81,18 +82,20 @@ GEM
|
||||||
erubis (>= 2.6.6)
|
erubis (>= 2.6.6)
|
||||||
binding_of_caller (0.7.2)
|
binding_of_caller (0.7.2)
|
||||||
debug_inspector (>= 0.0.1)
|
debug_inspector (>= 0.0.1)
|
||||||
bootstrap-sass (3.3.5)
|
bootstrap-sass (3.3.6)
|
||||||
autoprefixer-rails (>= 5.0.0.1)
|
autoprefixer-rails (>= 5.2.1)
|
||||||
sass (>= 3.2.19)
|
sass (>= 3.3.4)
|
||||||
brakeman (3.0.1)
|
brakeman (3.1.4)
|
||||||
erubis (~> 2.6)
|
erubis (~> 2.6)
|
||||||
fastercsv (~> 1.5)
|
fastercsv (~> 1.5)
|
||||||
haml (>= 3.0, < 5.0)
|
haml (>= 3.0, < 5.0)
|
||||||
highline (~> 1.6.20)
|
highline (>= 1.6.20, < 2.0)
|
||||||
multi_json (~> 1.2)
|
multi_json (~> 1.2)
|
||||||
ruby2ruby (~> 2.1.1)
|
ruby2ruby (>= 2.1.1, < 2.3.0)
|
||||||
ruby_parser (~> 3.5.0)
|
ruby_parser (~> 3.7.0)
|
||||||
|
safe_yaml (>= 1.0)
|
||||||
sass (~> 3.0)
|
sass (~> 3.0)
|
||||||
|
slim (>= 1.3.6, < 4.0)
|
||||||
terminal-table (~> 1.4)
|
terminal-table (~> 1.4)
|
||||||
browser (1.0.1)
|
browser (1.0.1)
|
||||||
builder (3.2.2)
|
builder (3.2.2)
|
||||||
|
@ -102,8 +105,8 @@ GEM
|
||||||
bundler-audit (0.4.0)
|
bundler-audit (0.4.0)
|
||||||
bundler (~> 1.2)
|
bundler (~> 1.2)
|
||||||
thor (~> 0.18)
|
thor (~> 0.18)
|
||||||
byebug (8.2.0)
|
byebug (8.2.1)
|
||||||
cal-heatmap-rails (0.0.1)
|
cal-heatmap-rails (3.5.1)
|
||||||
capybara (2.4.4)
|
capybara (2.4.4)
|
||||||
mime-types (>= 1.16)
|
mime-types (>= 1.16)
|
||||||
nokogiri (>= 1.3.3)
|
nokogiri (>= 1.3.3)
|
||||||
|
@ -117,6 +120,7 @@ GEM
|
||||||
activemodel (>= 3.2.0)
|
activemodel (>= 3.2.0)
|
||||||
activesupport (>= 3.2.0)
|
activesupport (>= 3.2.0)
|
||||||
json (>= 1.7)
|
json (>= 1.7)
|
||||||
|
cause (0.1)
|
||||||
charlock_holmes (0.7.3)
|
charlock_holmes (0.7.3)
|
||||||
chunky_png (1.3.5)
|
chunky_png (1.3.5)
|
||||||
cliver (0.3.2)
|
cliver (0.3.2)
|
||||||
|
@ -140,10 +144,10 @@ GEM
|
||||||
term-ansicolor (~> 1.3)
|
term-ansicolor (~> 1.3)
|
||||||
thor (~> 0.19.1)
|
thor (~> 0.19.1)
|
||||||
tins (~> 1.6.0)
|
tins (~> 1.6.0)
|
||||||
crack (0.4.2)
|
crack (0.4.3)
|
||||||
safe_yaml (~> 1.0.0)
|
safe_yaml (~> 1.0.0)
|
||||||
creole (0.5.0)
|
creole (0.5.0)
|
||||||
d3_rails (3.5.6)
|
d3_rails (3.5.11)
|
||||||
railties (>= 3.1.0)
|
railties (>= 3.1.0)
|
||||||
daemons (1.2.3)
|
daemons (1.2.3)
|
||||||
database_cleaner (1.4.1)
|
database_cleaner (1.4.1)
|
||||||
|
@ -215,22 +219,46 @@ GEM
|
||||||
flowdock (0.7.1)
|
flowdock (0.7.1)
|
||||||
httparty (~> 0.7)
|
httparty (~> 0.7)
|
||||||
multi_json
|
multi_json
|
||||||
fog (1.25.0)
|
fog (1.36.0)
|
||||||
|
fog-aliyun (>= 0.1.0)
|
||||||
|
fog-atmos
|
||||||
|
fog-aws (>= 0.6.0)
|
||||||
fog-brightbox (~> 0.4)
|
fog-brightbox (~> 0.4)
|
||||||
fog-core (~> 1.25)
|
fog-core (~> 1.32)
|
||||||
|
fog-dynect (~> 0.0.2)
|
||||||
|
fog-ecloud (~> 0.1)
|
||||||
|
fog-google (<= 0.1.0)
|
||||||
fog-json
|
fog-json
|
||||||
|
fog-local
|
||||||
|
fog-powerdns (>= 0.1.1)
|
||||||
fog-profitbricks
|
fog-profitbricks
|
||||||
fog-radosgw (>= 0.0.2)
|
fog-radosgw (>= 0.0.2)
|
||||||
|
fog-riakcs
|
||||||
fog-sakuracloud (>= 0.0.4)
|
fog-sakuracloud (>= 0.0.4)
|
||||||
|
fog-serverlove
|
||||||
fog-softlayer
|
fog-softlayer
|
||||||
|
fog-storm_on_demand
|
||||||
fog-terremark
|
fog-terremark
|
||||||
fog-vmfusion
|
fog-vmfusion
|
||||||
fog-voxel
|
fog-voxel
|
||||||
|
fog-xenserver
|
||||||
fog-xml (~> 0.1.1)
|
fog-xml (~> 0.1.1)
|
||||||
ipaddress (~> 0.5)
|
ipaddress (~> 0.5)
|
||||||
nokogiri (~> 1.5, >= 1.5.11)
|
nokogiri (~> 1.5, >= 1.5.11)
|
||||||
opennebula
|
fog-aliyun (0.1.0)
|
||||||
fog-brightbox (0.9.0)
|
fog-core (~> 1.27)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
ipaddress (~> 0.8)
|
||||||
|
xml-simple (~> 1.1)
|
||||||
|
fog-atmos (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
fog-aws (0.8.1)
|
||||||
|
fog-core (~> 1.27)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
fog-xml (~> 0.1)
|
||||||
|
ipaddress (~> 0.8)
|
||||||
|
fog-brightbox (0.10.1)
|
||||||
fog-core (~> 1.22)
|
fog-core (~> 1.22)
|
||||||
fog-json
|
fog-json
|
||||||
inflecto (~> 0.0.2)
|
inflecto (~> 0.0.2)
|
||||||
|
@ -238,21 +266,48 @@ GEM
|
||||||
builder
|
builder
|
||||||
excon (~> 0.45)
|
excon (~> 0.45)
|
||||||
formatador (~> 0.2)
|
formatador (~> 0.2)
|
||||||
|
fog-dynect (0.0.2)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
|
fog-ecloud (0.3.0)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
|
fog-google (0.1.0)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-xml
|
||||||
fog-json (1.0.2)
|
fog-json (1.0.2)
|
||||||
fog-core (~> 1.0)
|
fog-core (~> 1.0)
|
||||||
multi_json (~> 1.10)
|
multi_json (~> 1.10)
|
||||||
|
fog-local (0.2.1)
|
||||||
|
fog-core (~> 1.27)
|
||||||
|
fog-powerdns (0.1.1)
|
||||||
|
fog-core (~> 1.27)
|
||||||
|
fog-json (~> 1.0)
|
||||||
|
fog-xml (~> 0.1)
|
||||||
fog-profitbricks (0.0.5)
|
fog-profitbricks (0.0.5)
|
||||||
fog-core
|
fog-core
|
||||||
fog-xml
|
fog-xml
|
||||||
nokogiri
|
nokogiri
|
||||||
fog-radosgw (0.0.4)
|
fog-radosgw (0.0.5)
|
||||||
fog-core (>= 1.21.0)
|
fog-core (>= 1.21.0)
|
||||||
fog-json
|
fog-json
|
||||||
fog-xml (>= 0.0.1)
|
fog-xml (>= 0.0.1)
|
||||||
fog-sakuracloud (1.4.0)
|
fog-riakcs (0.1.0)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-softlayer (1.0.2)
|
fog-xml
|
||||||
|
fog-sakuracloud (1.7.5)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-serverlove (0.1.2)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-softlayer (1.0.3)
|
||||||
|
fog-core
|
||||||
|
fog-json
|
||||||
|
fog-storm_on_demand (0.1.1)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-terremark (0.1.0)
|
fog-terremark (0.1.0)
|
||||||
|
@ -264,6 +319,9 @@ GEM
|
||||||
fog-voxel (0.1.0)
|
fog-voxel (0.1.0)
|
||||||
fog-core
|
fog-core
|
||||||
fog-xml
|
fog-xml
|
||||||
|
fog-xenserver (0.2.2)
|
||||||
|
fog-core
|
||||||
|
fog-xml
|
||||||
fog-xml (0.1.2)
|
fog-xml (0.1.2)
|
||||||
fog-core
|
fog-core
|
||||||
nokogiri (~> 1.5, >= 1.5.11)
|
nokogiri (~> 1.5, >= 1.5.11)
|
||||||
|
@ -277,11 +335,11 @@ GEM
|
||||||
ruby-progressbar (~> 1.4)
|
ruby-progressbar (~> 1.4)
|
||||||
gemnasium-gitlab-service (0.2.6)
|
gemnasium-gitlab-service (0.2.6)
|
||||||
rugged (~> 0.21)
|
rugged (~> 0.21)
|
||||||
gemojione (2.1.0)
|
gemojione (2.1.1)
|
||||||
json
|
json
|
||||||
get_process_mem (0.2.0)
|
get_process_mem (0.2.0)
|
||||||
gherkin-ruby (0.3.2)
|
gherkin-ruby (0.3.2)
|
||||||
github-linguist (4.7.2)
|
github-linguist (4.7.3)
|
||||||
charlock_holmes (~> 0.7.3)
|
charlock_holmes (~> 0.7.3)
|
||||||
escape_utils (~> 1.1.0)
|
escape_utils (~> 1.1.0)
|
||||||
mime-types (>= 1.19)
|
mime-types (>= 1.19)
|
||||||
|
@ -298,7 +356,7 @@ GEM
|
||||||
posix-spawn (~> 0.3)
|
posix-spawn (~> 0.3)
|
||||||
gitlab_emoji (0.2.0)
|
gitlab_emoji (0.2.0)
|
||||||
gemojione (~> 2.1)
|
gemojione (~> 2.1)
|
||||||
gitlab_git (7.2.21)
|
gitlab_git (7.2.22)
|
||||||
activesupport (~> 4.0)
|
activesupport (~> 4.0)
|
||||||
charlock_holmes (~> 0.7.3)
|
charlock_holmes (~> 0.7.3)
|
||||||
github-linguist (~> 4.7.0)
|
github-linguist (~> 4.7.0)
|
||||||
|
@ -347,7 +405,7 @@ GEM
|
||||||
html2haml (>= 1.0.1)
|
html2haml (>= 1.0.1)
|
||||||
railties (>= 4.0.1)
|
railties (>= 4.0.1)
|
||||||
hashie (3.4.3)
|
hashie (3.4.3)
|
||||||
highline (1.6.21)
|
highline (1.7.8)
|
||||||
hike (1.2.3)
|
hike (1.2.3)
|
||||||
hipchat (1.5.2)
|
hipchat (1.5.2)
|
||||||
httparty
|
httparty
|
||||||
|
@ -370,17 +428,21 @@ GEM
|
||||||
i18n (0.7.0)
|
i18n (0.7.0)
|
||||||
ice_nine (0.11.1)
|
ice_nine (0.11.1)
|
||||||
inflecto (0.0.2)
|
inflecto (0.0.2)
|
||||||
ipaddress (0.8.0)
|
influxdb (0.2.3)
|
||||||
|
cause
|
||||||
|
json
|
||||||
|
ipaddress (0.8.2)
|
||||||
jquery-atwho-rails (1.3.2)
|
jquery-atwho-rails (1.3.2)
|
||||||
jquery-rails (3.1.4)
|
jquery-rails (4.0.5)
|
||||||
railties (>= 3.0, < 5.0)
|
rails-dom-testing (~> 1.0)
|
||||||
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
jquery-scrollto-rails (1.4.3)
|
jquery-scrollto-rails (1.4.3)
|
||||||
railties (> 3.1, < 5.0)
|
railties (> 3.1, < 5.0)
|
||||||
jquery-turbolinks (2.1.0)
|
jquery-turbolinks (2.1.0)
|
||||||
railties (>= 3.1.0)
|
railties (>= 3.1.0)
|
||||||
turbolinks
|
turbolinks
|
||||||
jquery-ui-rails (4.2.1)
|
jquery-ui-rails (5.0.5)
|
||||||
railties (>= 3.2.16)
|
railties (>= 3.2.16)
|
||||||
json (1.8.3)
|
json (1.8.3)
|
||||||
jwt (1.5.2)
|
jwt (1.5.2)
|
||||||
|
@ -416,7 +478,7 @@ GEM
|
||||||
net-ldap (0.12.1)
|
net-ldap (0.12.1)
|
||||||
net-ssh (3.0.1)
|
net-ssh (3.0.1)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
newrelic-grape (2.0.0)
|
newrelic-grape (2.1.0)
|
||||||
grape
|
grape
|
||||||
newrelic_rpm
|
newrelic_rpm
|
||||||
newrelic_rpm (3.9.4.245)
|
newrelic_rpm (3.9.4.245)
|
||||||
|
@ -435,10 +497,18 @@ GEM
|
||||||
omniauth (1.2.2)
|
omniauth (1.2.2)
|
||||||
hashie (>= 1.2, < 4)
|
hashie (>= 1.2, < 4)
|
||||||
rack (~> 1.0)
|
rack (~> 1.0)
|
||||||
|
omniauth-azure-oauth2 (0.0.6)
|
||||||
|
jwt (~> 1.0)
|
||||||
|
omniauth (~> 1.0)
|
||||||
|
omniauth-oauth2 (~> 1.1)
|
||||||
omniauth-bitbucket (0.0.2)
|
omniauth-bitbucket (0.0.2)
|
||||||
multi_json (~> 1.7)
|
multi_json (~> 1.7)
|
||||||
omniauth (~> 1.1)
|
omniauth (~> 1.1)
|
||||||
omniauth-oauth (~> 1.0)
|
omniauth-oauth (~> 1.0)
|
||||||
|
omniauth-cas3 (1.1.3)
|
||||||
|
addressable (~> 2.3)
|
||||||
|
nokogiri (~> 1.6.6)
|
||||||
|
omniauth (~> 1.2)
|
||||||
omniauth-facebook (3.0.0)
|
omniauth-facebook (3.0.0)
|
||||||
omniauth-oauth2 (~> 1.2)
|
omniauth-oauth2 (~> 1.2)
|
||||||
omniauth-github (1.1.2)
|
omniauth-github (1.1.2)
|
||||||
|
@ -476,10 +546,6 @@ GEM
|
||||||
activesupport
|
activesupport
|
||||||
nokogiri (>= 1.4.4)
|
nokogiri (>= 1.4.4)
|
||||||
omniauth (~> 1.0)
|
omniauth (~> 1.0)
|
||||||
opennebula (4.14.2)
|
|
||||||
json
|
|
||||||
nokogiri
|
|
||||||
rbvmomi
|
|
||||||
org-ruby (0.9.12)
|
org-ruby (0.9.12)
|
||||||
rubypants (~> 0.2)
|
rubypants (~> 0.2)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
|
@ -555,12 +621,10 @@ GEM
|
||||||
ffi (>= 0.5.0)
|
ffi (>= 0.5.0)
|
||||||
rblineprof (0.3.6)
|
rblineprof (0.3.6)
|
||||||
debugger-ruby_core_source (~> 1.3)
|
debugger-ruby_core_source (~> 1.3)
|
||||||
rbvmomi (1.8.2)
|
|
||||||
builder
|
|
||||||
nokogiri (>= 1.4.1)
|
|
||||||
trollop
|
|
||||||
rdoc (3.12.2)
|
rdoc (3.12.2)
|
||||||
json (~> 1.4)
|
json (~> 1.4)
|
||||||
|
recaptcha (1.0.2)
|
||||||
|
json
|
||||||
redcarpet (3.3.3)
|
redcarpet (3.3.3)
|
||||||
redis (3.2.2)
|
redis (3.2.2)
|
||||||
redis-actionpack (4.0.1)
|
redis-actionpack (4.0.1)
|
||||||
|
@ -631,10 +695,10 @@ GEM
|
||||||
ruby-saml (1.0.0)
|
ruby-saml (1.0.0)
|
||||||
nokogiri (>= 1.5.10)
|
nokogiri (>= 1.5.10)
|
||||||
uuid (~> 2.3)
|
uuid (~> 2.3)
|
||||||
ruby2ruby (2.1.4)
|
ruby2ruby (2.2.0)
|
||||||
ruby_parser (~> 3.1)
|
ruby_parser (~> 3.1)
|
||||||
sexp_processor (~> 4.0)
|
sexp_processor (~> 4.0)
|
||||||
ruby_parser (3.5.0)
|
ruby_parser (3.7.2)
|
||||||
sexp_processor (~> 4.1)
|
sexp_processor (~> 4.1)
|
||||||
rubyntlm (0.5.2)
|
rubyntlm (0.5.2)
|
||||||
rubypants (0.2.0)
|
rubypants (0.2.0)
|
||||||
|
@ -643,12 +707,13 @@ GEM
|
||||||
safe_yaml (1.0.4)
|
safe_yaml (1.0.4)
|
||||||
sanitize (2.1.0)
|
sanitize (2.1.0)
|
||||||
nokogiri (>= 1.4.4)
|
nokogiri (>= 1.4.4)
|
||||||
sass (3.2.19)
|
sass (3.4.20)
|
||||||
sass-rails (4.0.5)
|
sass-rails (5.0.4)
|
||||||
railties (>= 4.0.0, < 5.0)
|
railties (>= 4.0.0, < 5.0)
|
||||||
sass (~> 3.2.2)
|
sass (~> 3.1)
|
||||||
sprockets (~> 2.8, < 3.0)
|
sprockets (>= 2.8, < 4.0)
|
||||||
sprockets-rails (~> 2.0)
|
sprockets-rails (>= 2.0, < 4.0)
|
||||||
|
tilt (>= 1.1, < 3)
|
||||||
sawyer (0.6.0)
|
sawyer (0.6.0)
|
||||||
addressable (~> 2.3.5)
|
addressable (~> 2.3.5)
|
||||||
faraday (~> 0.8, < 0.10)
|
faraday (~> 0.8, < 0.10)
|
||||||
|
@ -687,6 +752,9 @@ GEM
|
||||||
tilt (>= 1.3, < 3)
|
tilt (>= 1.3, < 3)
|
||||||
six (0.2.0)
|
six (0.2.0)
|
||||||
slack-notifier (1.2.1)
|
slack-notifier (1.2.1)
|
||||||
|
slim (3.0.6)
|
||||||
|
temple (~> 0.7.3)
|
||||||
|
tilt (>= 1.3.3, < 2.1)
|
||||||
slop (3.6.0)
|
slop (3.6.0)
|
||||||
spinach (0.8.10)
|
spinach (0.8.10)
|
||||||
colorize
|
colorize
|
||||||
|
@ -712,7 +780,6 @@ GEM
|
||||||
actionpack (>= 3.0)
|
actionpack (>= 3.0)
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
sprockets (>= 2.8, < 4.0)
|
sprockets (>= 2.8, < 4.0)
|
||||||
stamp (0.6.0)
|
|
||||||
state_machines (0.4.0)
|
state_machines (0.4.0)
|
||||||
state_machines-activemodel (0.3.0)
|
state_machines-activemodel (0.3.0)
|
||||||
activemodel (~> 4.1)
|
activemodel (~> 4.1)
|
||||||
|
@ -728,6 +795,7 @@ GEM
|
||||||
railties (>= 3.2.5, < 5)
|
railties (>= 3.2.5, < 5)
|
||||||
teaspoon-jasmine (2.2.0)
|
teaspoon-jasmine (2.2.0)
|
||||||
teaspoon (>= 1.0.0)
|
teaspoon (>= 1.0.0)
|
||||||
|
temple (0.7.6)
|
||||||
term-ansicolor (1.3.2)
|
term-ansicolor (1.3.2)
|
||||||
tins (~> 1.0)
|
tins (~> 1.0)
|
||||||
terminal-table (1.5.2)
|
terminal-table (1.5.2)
|
||||||
|
@ -751,7 +819,6 @@ GEM
|
||||||
multi_json (~> 1.7)
|
multi_json (~> 1.7)
|
||||||
twitter-stream (~> 0.1)
|
twitter-stream (~> 0.1)
|
||||||
tins (1.6.0)
|
tins (1.6.0)
|
||||||
trollop (2.1.2)
|
|
||||||
turbolinks (2.5.3)
|
turbolinks (2.5.3)
|
||||||
coffee-rails
|
coffee-rails
|
||||||
twitter-stream (0.1.16)
|
twitter-stream (0.1.16)
|
||||||
|
@ -763,7 +830,7 @@ GEM
|
||||||
uglifier (2.7.2)
|
uglifier (2.7.2)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
underscore-rails (1.4.4)
|
underscore-rails (1.8.3)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.7.1)
|
unf_ext (0.0.7.1)
|
||||||
|
@ -783,7 +850,7 @@ GEM
|
||||||
coercible (~> 1.0)
|
coercible (~> 1.0)
|
||||||
descendants_tracker (~> 0.0, >= 0.0.3)
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
||||||
equalizer (~> 0.0, >= 0.0.9)
|
equalizer (~> 0.0, >= 0.0.9)
|
||||||
warden (1.2.3)
|
warden (1.2.4)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
web-console (2.2.1)
|
web-console (2.2.1)
|
||||||
activemodel (>= 4.0)
|
activemodel (>= 4.0)
|
||||||
|
@ -800,6 +867,7 @@ GEM
|
||||||
builder
|
builder
|
||||||
expression_parser
|
expression_parser
|
||||||
rinku
|
rinku
|
||||||
|
xml-simple (1.1.5)
|
||||||
xpath (2.0.0)
|
xpath (2.0.0)
|
||||||
nokogiri (~> 1.3)
|
nokogiri (~> 1.3)
|
||||||
|
|
||||||
|
@ -814,6 +882,7 @@ DEPENDENCIES
|
||||||
acts-as-taggable-on (~> 3.4)
|
acts-as-taggable-on (~> 3.4)
|
||||||
addressable (~> 2.3.8)
|
addressable (~> 2.3.8)
|
||||||
after_commit_queue
|
after_commit_queue
|
||||||
|
allocations (~> 1.0)
|
||||||
annotate (~> 2.6.0)
|
annotate (~> 2.6.0)
|
||||||
asana (~> 0.4.0)
|
asana (~> 0.4.0)
|
||||||
asciidoctor (~> 1.5.2)
|
asciidoctor (~> 1.5.2)
|
||||||
|
@ -823,22 +892,23 @@ DEPENDENCIES
|
||||||
benchmark-ips
|
benchmark-ips
|
||||||
better_errors (~> 1.0.1)
|
better_errors (~> 1.0.1)
|
||||||
binding_of_caller (~> 0.7.2)
|
binding_of_caller (~> 0.7.2)
|
||||||
bootstrap-sass (~> 3.0)
|
bootstrap-sass (~> 3.3.0)
|
||||||
brakeman (= 3.0.1)
|
brakeman (~> 3.1.0)
|
||||||
browser (~> 1.0.0)
|
browser (~> 1.0.0)
|
||||||
bullet
|
bullet
|
||||||
bundler-audit
|
bundler-audit
|
||||||
byebug
|
byebug
|
||||||
cal-heatmap-rails (~> 0.0.1)
|
cal-heatmap-rails (~> 3.5.0)
|
||||||
capybara (~> 2.4.0)
|
capybara (~> 2.4.0)
|
||||||
capybara-screenshot (~> 1.0.0)
|
capybara-screenshot (~> 1.0.0)
|
||||||
carrierwave (~> 0.9.0)
|
carrierwave (~> 0.9.0)
|
||||||
charlock_holmes (~> 0.7.3)
|
charlock_holmes (~> 0.7.3)
|
||||||
coffee-rails (~> 4.1.0)
|
coffee-rails (~> 4.1.0)
|
||||||
colorize (~> 0.7.0)
|
colorize (~> 0.7.0)
|
||||||
|
connection_pool (~> 2.0)
|
||||||
coveralls (~> 0.8.2)
|
coveralls (~> 0.8.2)
|
||||||
creole (~> 0.5.0)
|
creole (~> 0.5.0)
|
||||||
d3_rails (~> 3.5.5)
|
d3_rails (~> 3.5.0)
|
||||||
database_cleaner (~> 1.4.0)
|
database_cleaner (~> 1.4.0)
|
||||||
default_value_for (~> 3.0.0)
|
default_value_for (~> 3.0.0)
|
||||||
devise (~> 3.5.3)
|
devise (~> 3.5.3)
|
||||||
|
@ -853,7 +923,7 @@ DEPENDENCIES
|
||||||
ffaker (~> 2.0.0)
|
ffaker (~> 2.0.0)
|
||||||
flay
|
flay
|
||||||
flog
|
flog
|
||||||
fog (~> 1.25.0)
|
fog (~> 1.36.0)
|
||||||
font-awesome-rails (~> 4.2)
|
font-awesome-rails (~> 4.2)
|
||||||
foreman
|
foreman
|
||||||
fuubar (~> 2.0.0)
|
fuubar (~> 2.0.0)
|
||||||
|
@ -862,7 +932,7 @@ DEPENDENCIES
|
||||||
github-markup (~> 1.3.1)
|
github-markup (~> 1.3.1)
|
||||||
gitlab-flowdock-git-hook (~> 1.0.1)
|
gitlab-flowdock-git-hook (~> 1.0.1)
|
||||||
gitlab_emoji (~> 0.2.0)
|
gitlab_emoji (~> 0.2.0)
|
||||||
gitlab_git (~> 7.2.20)
|
gitlab_git (~> 7.2.22)
|
||||||
gitlab_meta (= 7.0)
|
gitlab_meta (= 7.0)
|
||||||
gitlab_omniauth-ldap (~> 1.2.1)
|
gitlab_omniauth-ldap (~> 1.2.1)
|
||||||
gollum-lib (~> 4.1.0)
|
gollum-lib (~> 4.1.0)
|
||||||
|
@ -873,14 +943,16 @@ DEPENDENCIES
|
||||||
hipchat (~> 1.5.0)
|
hipchat (~> 1.5.0)
|
||||||
html-pipeline (~> 1.11.0)
|
html-pipeline (~> 1.11.0)
|
||||||
httparty (~> 0.13.3)
|
httparty (~> 0.13.3)
|
||||||
|
influxdb (~> 0.2)
|
||||||
jquery-atwho-rails (~> 1.3.2)
|
jquery-atwho-rails (~> 1.3.2)
|
||||||
jquery-rails (~> 3.1.3)
|
jquery-rails (~> 4.0.0)
|
||||||
jquery-scrollto-rails (~> 1.4.3)
|
jquery-scrollto-rails (~> 1.4.3)
|
||||||
jquery-turbolinks (~> 2.1.0)
|
jquery-turbolinks (~> 2.1.0)
|
||||||
jquery-ui-rails (~> 4.2.1)
|
jquery-ui-rails (~> 5.0.0)
|
||||||
kaminari (~> 0.16.3)
|
kaminari (~> 0.16.3)
|
||||||
letter_opener (~> 1.1.2)
|
letter_opener (~> 1.1.2)
|
||||||
mail_room (~> 0.6.1)
|
mail_room (~> 0.6.1)
|
||||||
|
method_source (~> 0.8)
|
||||||
minitest (~> 5.7.0)
|
minitest (~> 5.7.0)
|
||||||
mousetrap-rails (~> 1.4.6)
|
mousetrap-rails (~> 1.4.6)
|
||||||
mysql2 (~> 0.3.16)
|
mysql2 (~> 0.3.16)
|
||||||
|
@ -893,7 +965,9 @@ DEPENDENCIES
|
||||||
oauth2 (~> 1.0.0)
|
oauth2 (~> 1.0.0)
|
||||||
octokit (~> 3.7.0)
|
octokit (~> 3.7.0)
|
||||||
omniauth (~> 1.2.2)
|
omniauth (~> 1.2.2)
|
||||||
|
omniauth-azure-oauth2 (~> 0.0.6)
|
||||||
omniauth-bitbucket (~> 0.0.2)
|
omniauth-bitbucket (~> 0.0.2)
|
||||||
|
omniauth-cas3 (~> 1.1.2)
|
||||||
omniauth-facebook (~> 3.0.0)
|
omniauth-facebook (~> 3.0.0)
|
||||||
omniauth-github (~> 1.1.1)
|
omniauth-github (~> 1.1.1)
|
||||||
omniauth-gitlab (~> 1.0.0)
|
omniauth-gitlab (~> 1.0.0)
|
||||||
|
@ -902,7 +976,7 @@ DEPENDENCIES
|
||||||
omniauth-saml (~> 1.4.0)
|
omniauth-saml (~> 1.4.0)
|
||||||
omniauth-shibboleth (~> 1.2.0)
|
omniauth-shibboleth (~> 1.2.0)
|
||||||
omniauth-twitter (~> 1.2.0)
|
omniauth-twitter (~> 1.2.0)
|
||||||
omniauth_crowd
|
omniauth_crowd (~> 2.2.0)
|
||||||
org-ruby (~> 0.9.12)
|
org-ruby (~> 0.9.12)
|
||||||
paranoia (~> 2.0)
|
paranoia (~> 2.0)
|
||||||
pg (~> 0.18.2)
|
pg (~> 0.18.2)
|
||||||
|
@ -917,6 +991,7 @@ DEPENDENCIES
|
||||||
raphael-rails (~> 2.1.2)
|
raphael-rails (~> 2.1.2)
|
||||||
rblineprof
|
rblineprof
|
||||||
rdoc (~> 3.6)
|
rdoc (~> 3.6)
|
||||||
|
recaptcha
|
||||||
redcarpet (~> 3.3.3)
|
redcarpet (~> 3.3.3)
|
||||||
redis-namespace
|
redis-namespace
|
||||||
redis-rails (~> 4.0.0)
|
redis-rails (~> 4.0.0)
|
||||||
|
@ -929,7 +1004,7 @@ DEPENDENCIES
|
||||||
rubocop (~> 0.35.0)
|
rubocop (~> 0.35.0)
|
||||||
ruby-fogbugz (~> 0.2.1)
|
ruby-fogbugz (~> 0.2.1)
|
||||||
sanitize (~> 2.0)
|
sanitize (~> 2.0)
|
||||||
sass-rails (~> 4.0.5)
|
sass-rails (~> 5.0.0)
|
||||||
sdoc (~> 0.3.20)
|
sdoc (~> 0.3.20)
|
||||||
seed-fu (~> 2.3.5)
|
seed-fu (~> 2.3.5)
|
||||||
select2-rails (~> 3.5.9)
|
select2-rails (~> 3.5.9)
|
||||||
|
@ -948,7 +1023,6 @@ DEPENDENCIES
|
||||||
spring-commands-spinach (~> 1.0.0)
|
spring-commands-spinach (~> 1.0.0)
|
||||||
spring-commands-teaspoon (~> 0.0.2)
|
spring-commands-teaspoon (~> 0.0.2)
|
||||||
sprockets (~> 2.12.3)
|
sprockets (~> 2.12.3)
|
||||||
stamp (~> 0.6.0)
|
|
||||||
state_machines-activerecord (~> 0.3.0)
|
state_machines-activerecord (~> 0.3.0)
|
||||||
task_list (~> 1.0.2)
|
task_list (~> 1.0.2)
|
||||||
teaspoon (~> 1.0.0)
|
teaspoon (~> 1.0.0)
|
||||||
|
@ -958,7 +1032,7 @@ DEPENDENCIES
|
||||||
tinder (~> 1.10.0)
|
tinder (~> 1.10.0)
|
||||||
turbolinks (~> 2.5.0)
|
turbolinks (~> 2.5.0)
|
||||||
uglifier (~> 2.7.2)
|
uglifier (~> 2.7.2)
|
||||||
underscore-rails (~> 1.4.4)
|
underscore-rails (~> 1.8.0)
|
||||||
unf (~> 0.1.4)
|
unf (~> 0.1.4)
|
||||||
unicorn (~> 4.8.2)
|
unicorn (~> 4.8.2)
|
||||||
unicorn-worker-killer (~> 0.4.2)
|
unicorn-worker-killer (~> 0.4.2)
|
||||||
|
@ -969,4 +1043,4 @@ DEPENDENCIES
|
||||||
wikicloth (= 0.8.1)
|
wikicloth (= 0.8.1)
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.10.6
|
1.11.2
|
||||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2011-2015 GitLab B.V.
|
Copyright (c) 2011-2016 GitLab B.V.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
8.3.0
|
8.4.0.rc1
|
|
@ -1,7 +1,8 @@
|
||||||
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
|
Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
|
|
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-Black.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-Black.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-BlackIt.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-BlackIt.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-Bold.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-Bold.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-BoldIt.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-BoldIt.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-ExtraLight.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-ExtraLight.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-ExtraLightIt.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-ExtraLightIt.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-It.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-It.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-Light.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-Light.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-LightIt.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-LightIt.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-Regular.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-Regular.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-Semibold.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-Semibold.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/fonts/SourceSansPro-SemiboldIt.ttf.woff
Executable file
BIN
app/assets/fonts/SourceSansPro-SemiboldIt.ttf.woff
Executable file
Binary file not shown.
Binary file not shown.
BIN
app/assets/images/auth_buttons/azure_64.png
Normal file
BIN
app/assets/images/auth_buttons/azure_64.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 986 B |
Binary file not shown.
Before Width: | Height: | Size: 26 KiB |
BIN
app/assets/images/emoji.png
Normal file
BIN
app/assets/images/emoji.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 813 KiB |
BIN
app/assets/images/gitlab_logo.png
Normal file
BIN
app/assets/images/gitlab_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.1 KiB |
|
@ -5,17 +5,17 @@
|
||||||
# the compiled file.
|
# the compiled file.
|
||||||
#
|
#
|
||||||
#= require jquery
|
#= require jquery
|
||||||
#= require jquery.ui.all
|
#= require jquery-ui
|
||||||
#= require jquery_ujs
|
#= require jquery_ujs
|
||||||
#= require jquery.cookie
|
#= require jquery.cookie
|
||||||
#= require jquery.endless-scroll
|
#= require jquery.endless-scroll
|
||||||
#= require jquery.highlight
|
#= require jquery.highlight
|
||||||
#= require jquery.history
|
|
||||||
#= require jquery.waitforimages
|
#= require jquery.waitforimages
|
||||||
#= require jquery.atwho
|
#= require jquery.atwho
|
||||||
#= require jquery.scrollTo
|
#= require jquery.scrollTo
|
||||||
#= require jquery.blockUI
|
|
||||||
#= require jquery.turbolinks
|
#= require jquery.turbolinks
|
||||||
|
#= require d3
|
||||||
|
#= require cal-heatmap
|
||||||
#= require turbolinks
|
#= require turbolinks
|
||||||
#= require autosave
|
#= require autosave
|
||||||
#= require bootstrap
|
#= require bootstrap
|
||||||
|
@ -27,7 +27,6 @@
|
||||||
#= require branch-graph
|
#= require branch-graph
|
||||||
#= require ace/ace
|
#= require ace/ace
|
||||||
#= require ace/ext-searchbox
|
#= require ace/ext-searchbox
|
||||||
#= require d3
|
|
||||||
#= require underscore
|
#= require underscore
|
||||||
#= require nprogress
|
#= require nprogress
|
||||||
#= require nprogress-turbolinks
|
#= require nprogress-turbolinks
|
||||||
|
@ -39,9 +38,9 @@
|
||||||
#= require shortcuts_dashboard_navigation
|
#= require shortcuts_dashboard_navigation
|
||||||
#= require shortcuts_issuable
|
#= require shortcuts_issuable
|
||||||
#= require shortcuts_network
|
#= require shortcuts_network
|
||||||
#= require cal-heatmap
|
|
||||||
#= require jquery.nicescroll.min
|
#= require jquery.nicescroll.min
|
||||||
#= require_tree .
|
#= require_tree .
|
||||||
|
#= require fuzzaldrin-plus.min
|
||||||
|
|
||||||
window.slugify = (text) ->
|
window.slugify = (text) ->
|
||||||
text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase()
|
text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase()
|
||||||
|
|
|
@ -1,12 +1,28 @@
|
||||||
class @AwardsHandler
|
class @AwardsHandler
|
||||||
constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) ->
|
constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) ->
|
||||||
|
$(".add-award").click (event)->
|
||||||
|
event.stopPropagation()
|
||||||
|
event.preventDefault()
|
||||||
|
$(".emoji-menu").show()
|
||||||
|
|
||||||
|
$("html").click ->
|
||||||
|
if !$(event.target).closest(".emoji-menu").length
|
||||||
|
if $(".emoji-menu").is(":visible")
|
||||||
|
$(".emoji-menu").hide()
|
||||||
|
|
||||||
|
@renderFrequentlyUsedBlock()
|
||||||
|
@setupSearch()
|
||||||
|
|
||||||
addAward: (emoji) ->
|
addAward: (emoji) ->
|
||||||
emoji = @normilizeEmojiName(emoji)
|
emoji = @normilizeEmojiName(emoji)
|
||||||
@postEmoji emoji, =>
|
@postEmoji emoji, =>
|
||||||
@addAwardToEmojiBar(emoji)
|
@addAwardToEmojiBar(emoji)
|
||||||
|
|
||||||
|
$(".emoji-menu").hide()
|
||||||
|
|
||||||
addAwardToEmojiBar: (emoji, custom_path = '') ->
|
addAwardToEmojiBar: (emoji) ->
|
||||||
|
@addEmojiToFrequentlyUsedList(emoji)
|
||||||
|
|
||||||
emoji = @normilizeEmojiName(emoji)
|
emoji = @normilizeEmojiName(emoji)
|
||||||
if @exist(emoji)
|
if @exist(emoji)
|
||||||
if @isActive(emoji)
|
if @isActive(emoji)
|
||||||
|
@ -17,7 +33,7 @@ class @AwardsHandler
|
||||||
counter.parent().addClass("active")
|
counter.parent().addClass("active")
|
||||||
@addMeToAuthorList(emoji)
|
@addMeToAuthorList(emoji)
|
||||||
else
|
else
|
||||||
@createEmoji(emoji, custom_path)
|
@createEmoji(emoji)
|
||||||
|
|
||||||
exist: (emoji) ->
|
exist: (emoji) ->
|
||||||
@findEmojiIcon(emoji).length > 0
|
@findEmojiIcon(emoji).length > 0
|
||||||
|
@ -27,15 +43,19 @@ class @AwardsHandler
|
||||||
|
|
||||||
decrementCounter: (emoji) ->
|
decrementCounter: (emoji) ->
|
||||||
counter = @findEmojiIcon(emoji).siblings(".counter")
|
counter = @findEmojiIcon(emoji).siblings(".counter")
|
||||||
|
emojiIcon = counter.parent()
|
||||||
|
|
||||||
if parseInt(counter.text()) > 1
|
if parseInt(counter.text()) > 1
|
||||||
counter.text(parseInt(counter.text()) - 1)
|
counter.text(parseInt(counter.text()) - 1)
|
||||||
counter.parent().removeClass("active")
|
emojiIcon.removeClass("active")
|
||||||
@removeMeFromAuthorList(emoji)
|
@removeMeFromAuthorList(emoji)
|
||||||
|
else if emoji =="thumbsup" || emoji == "thumbsdown"
|
||||||
|
emojiIcon.tooltip("destroy")
|
||||||
|
counter.text(0)
|
||||||
|
emojiIcon.removeClass("active")
|
||||||
else
|
else
|
||||||
award = counter.parent()
|
emojiIcon.tooltip("destroy")
|
||||||
award.tooltip("destroy")
|
emojiIcon.remove()
|
||||||
award.remove()
|
|
||||||
|
|
||||||
removeMeFromAuthorList: (emoji) ->
|
removeMeFromAuthorList: (emoji) ->
|
||||||
award_block = @findEmojiIcon(emoji).parent()
|
award_block = @findEmojiIcon(emoji).parent()
|
||||||
|
@ -54,35 +74,39 @@ class @AwardsHandler
|
||||||
resetTooltip: (award) ->
|
resetTooltip: (award) ->
|
||||||
award.tooltip("destroy")
|
award.tooltip("destroy")
|
||||||
|
|
||||||
# "destroy" call is asynchronous, this is why we need to set timeout.
|
# "destroy" call is asynchronous and there is no appropriate callback on it, this is why we need to set timeout.
|
||||||
setTimeout (->
|
setTimeout (->
|
||||||
award.tooltip()
|
award.tooltip()
|
||||||
), 200
|
), 200
|
||||||
|
|
||||||
|
|
||||||
createEmoji: (emoji, custom_path) ->
|
createEmoji: (emoji) ->
|
||||||
|
emojiCssClass = @resolveNameToCssClass(emoji)
|
||||||
|
|
||||||
nodes = []
|
nodes = []
|
||||||
nodes.push("<div class='award active' title='me'>")
|
nodes.push("<div class='award active' title='me'>")
|
||||||
nodes.push("<div class='icon' data-emoji='" + emoji + "'>")
|
nodes.push("<div class='icon emoji-icon #{emojiCssClass}' data-emoji='#{emoji}'></div>")
|
||||||
nodes.push(@getImage(emoji, custom_path))
|
nodes.push("<div class='counter'>1</div>")
|
||||||
nodes.push("</div>")
|
nodes.push("</div>")
|
||||||
nodes.push("<div class='counter'>1")
|
|
||||||
nodes.push("</div></div>")
|
|
||||||
|
|
||||||
$(".awards-controls").before(nodes.join("\n"))
|
emoji_node = $(nodes.join("\n")).insertBefore(".awards-controls").find(".emoji-icon").data("emoji", emoji)
|
||||||
|
|
||||||
$(".award").tooltip()
|
$(".award").tooltip()
|
||||||
|
|
||||||
getImage: (emoji, custom_path) ->
|
resolveNameToCssClass: (emoji) ->
|
||||||
if custom_path
|
emoji_icon = $(".emoji-menu-content [data-emoji='#{emoji}']")
|
||||||
$("<img>").attr({src: custom_path, width: 20, height: 20}).wrap("<div>").parent().html()
|
|
||||||
else
|
|
||||||
$("li[data-emoji='" + emoji + "']").html()
|
|
||||||
|
|
||||||
|
if emoji_icon.length > 0
|
||||||
|
unicodeName = emoji_icon.data("unicode-name")
|
||||||
|
else
|
||||||
|
# Find by alias
|
||||||
|
unicodeName = $(".emoji-menu-content [data-aliases*=':#{emoji}:']").data("unicode-name")
|
||||||
|
|
||||||
|
"emoji-#{unicodeName}"
|
||||||
|
|
||||||
postEmoji: (emoji, callback) ->
|
postEmoji: (emoji, callback) ->
|
||||||
$.post @post_emoji_url, { note: {
|
$.post @post_emoji_url, { note: {
|
||||||
note: ":" + emoji + ":"
|
note: ":#{emoji}:"
|
||||||
noteable_type: @noteable_type
|
noteable_type: @noteable_type
|
||||||
noteable_id: @noteable_id
|
noteable_id: @noteable_id
|
||||||
}},(data) ->
|
}},(data) ->
|
||||||
|
@ -90,7 +114,7 @@ class @AwardsHandler
|
||||||
callback.call()
|
callback.call()
|
||||||
|
|
||||||
findEmojiIcon: (emoji) ->
|
findEmojiIcon: (emoji) ->
|
||||||
$(".icon[data-emoji='" + emoji + "']")
|
$(".award [data-emoji='#{emoji}']")
|
||||||
|
|
||||||
scrollToAwards: ->
|
scrollToAwards: ->
|
||||||
$('body, html').animate({
|
$('body, html').animate({
|
||||||
|
@ -99,3 +123,44 @@ class @AwardsHandler
|
||||||
|
|
||||||
normilizeEmojiName: (emoji) ->
|
normilizeEmojiName: (emoji) ->
|
||||||
@aliases[emoji] || emoji
|
@aliases[emoji] || emoji
|
||||||
|
|
||||||
|
addEmojiToFrequentlyUsedList: (emoji) ->
|
||||||
|
frequently_used_emojis = @getFrequentlyUsedEmojis()
|
||||||
|
frequently_used_emojis.push(emoji)
|
||||||
|
$.cookie('frequently_used_emojis', frequently_used_emojis.join(","), { expires: 365 })
|
||||||
|
|
||||||
|
getFrequentlyUsedEmojis: ->
|
||||||
|
frequently_used_emojis = ($.cookie('frequently_used_emojis') || "").split(",")
|
||||||
|
_.compact(_.uniq(frequently_used_emojis))
|
||||||
|
|
||||||
|
renderFrequentlyUsedBlock: ->
|
||||||
|
if $.cookie('frequently_used_emojis')
|
||||||
|
frequently_used_emojis = @getFrequentlyUsedEmojis()
|
||||||
|
|
||||||
|
ul = $("<ul>")
|
||||||
|
|
||||||
|
for emoji in frequently_used_emojis
|
||||||
|
do (emoji) ->
|
||||||
|
$(".emoji-menu-content [data-emoji='#{emoji}']").closest("li").clone().appendTo(ul)
|
||||||
|
|
||||||
|
$("input.emoji-search").after(ul).after($("<h5>").text("Frequently used"))
|
||||||
|
|
||||||
|
setupSearch: ->
|
||||||
|
$("input.emoji-search").keyup (ev) =>
|
||||||
|
term = $(ev.target).val()
|
||||||
|
|
||||||
|
# Clean previous search results
|
||||||
|
$("ul.emoji-search,h5.emoji-search").remove()
|
||||||
|
|
||||||
|
if term
|
||||||
|
# Generate a search result block
|
||||||
|
h5 = $("<h5>").text("Search results").addClass("emoji-search")
|
||||||
|
found_emojis = @searchEmojis(term).show()
|
||||||
|
ul = $("<ul>").addClass("emoji-search").append(found_emojis)
|
||||||
|
$(".emoji-menu-content ul, .emoji-menu-content h5").hide()
|
||||||
|
$(".emoji-menu-content").append(h5).append(ul)
|
||||||
|
else
|
||||||
|
$(".emoji-menu-content").children().show()
|
||||||
|
|
||||||
|
searchEmojis: (term)->
|
||||||
|
$(".emoji-menu-content [data-emoji*='#{term}']").closest("li").clone()
|
||||||
|
|
|
@ -35,7 +35,7 @@ class @BlobFileDropzone
|
||||||
return
|
return
|
||||||
|
|
||||||
this.on 'sending', (file, xhr, formData) ->
|
this.on 'sending', (file, xhr, formData) ->
|
||||||
formData.append('new_branch', form.find('.js-new-branch').val())
|
formData.append('target_branch', form.find('.js-target-branch').val())
|
||||||
formData.append('create_merge_request', form.find('.js-create-merge-request').val())
|
formData.append('create_merge_request', form.find('.js-create-merge-request').val())
|
||||||
formData.append('commit_message', form.find('.js-commit-message').val())
|
formData.append('commit_message', form.find('.js-commit-message').val())
|
||||||
return
|
return
|
||||||
|
|
|
@ -66,7 +66,7 @@ class @BranchGraph
|
||||||
r.rect(40, 0, 30, @barHeight).attr fill: "#444"
|
r.rect(40, 0, 30, @barHeight).attr fill: "#444"
|
||||||
|
|
||||||
for day, mm in @days
|
for day, mm in @days
|
||||||
if cuday isnt day[0]
|
if cuday isnt day[0] || cumonth isnt day[1]
|
||||||
# Dates
|
# Dates
|
||||||
r.text(55, @offsetY + @unitTime * mm, day[0])
|
r.text(55, @offsetY + @unitTime * mm, day[0])
|
||||||
.attr(
|
.attr(
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
class @Calendar
|
class @Calendar
|
||||||
options =
|
|
||||||
month: "short"
|
|
||||||
day: "numeric"
|
|
||||||
year: "numeric"
|
|
||||||
|
|
||||||
constructor: (timestamps, starting_year, starting_month, calendar_activities_path) ->
|
constructor: (timestamps, starting_year, starting_month, calendar_activities_path) ->
|
||||||
cal = new CalHeatMap()
|
cal = new CalHeatMap()
|
||||||
cal.init
|
cal.init
|
||||||
|
|
|
@ -1,15 +1,5 @@
|
||||||
class @CommitsList
|
class @CommitsList
|
||||||
@data =
|
@timer = null
|
||||||
ref: null
|
|
||||||
limit: 0
|
|
||||||
offset: 0
|
|
||||||
@disable = false
|
|
||||||
|
|
||||||
@showProgress: ->
|
|
||||||
$('.loading').show()
|
|
||||||
|
|
||||||
@hideProgress: ->
|
|
||||||
$('.loading').hide()
|
|
||||||
|
|
||||||
@init: (ref, limit) ->
|
@init: (ref, limit) ->
|
||||||
$("body").on "click", ".day-commits-table li.commit", (event) ->
|
$("body").on "click", ".day-commits-table li.commit", (event) ->
|
||||||
|
@ -18,38 +8,32 @@ class @CommitsList
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
return false
|
return false
|
||||||
|
|
||||||
@data.ref = ref
|
Pager.init limit, false
|
||||||
@data.limit = limit
|
|
||||||
@data.offset = limit
|
|
||||||
|
|
||||||
this.initLoadMore()
|
@content = $("#commits-list")
|
||||||
this.showProgress()
|
@searchField = $("#commits-search")
|
||||||
|
@initSearch()
|
||||||
|
|
||||||
|
@initSearch: ->
|
||||||
|
@timer = null
|
||||||
|
@searchField.keyup =>
|
||||||
|
clearTimeout(@timer)
|
||||||
|
@timer = setTimeout(@filterResults, 500)
|
||||||
|
|
||||||
|
@filterResults: =>
|
||||||
|
form = $(".commits-search-form")
|
||||||
|
search = @searchField.val()
|
||||||
|
commitsUrl = form.attr("action") + '?' + form.serialize()
|
||||||
|
@content.fadeTo('fast', 0.5)
|
||||||
|
|
||||||
@getOld: ->
|
|
||||||
this.showProgress()
|
|
||||||
$.ajax
|
$.ajax
|
||||||
type: "GET"
|
type: "GET"
|
||||||
url: location.href
|
url: form.attr("action")
|
||||||
data: @data
|
data: form.serialize()
|
||||||
complete: this.hideProgress
|
complete: =>
|
||||||
success: (data) ->
|
@content.fadeTo('fast', 1.0)
|
||||||
CommitsList.append(data.count, data.html)
|
success: (data) =>
|
||||||
|
@content.html(data.html)
|
||||||
|
# Change url so if user reload a page - search results are saved
|
||||||
|
history.replaceState {page: commitsUrl}, document.title, commitsUrl
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
|
|
||||||
@append: (count, html) ->
|
|
||||||
$("#commits-list").append(html)
|
|
||||||
if count > 0
|
|
||||||
@data.offset += count
|
|
||||||
else
|
|
||||||
@disable = true
|
|
||||||
|
|
||||||
@initLoadMore: ->
|
|
||||||
$(document).unbind('scroll')
|
|
||||||
$(document).endlessScroll
|
|
||||||
bottomPixels: 400
|
|
||||||
fireDelay: 1000
|
|
||||||
fireOnce: true
|
|
||||||
ceaseFire: =>
|
|
||||||
@disable
|
|
||||||
callback: =>
|
|
||||||
this.getOld()
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ class Dispatcher
|
||||||
new DropzoneInput($('.release-form'))
|
new DropzoneInput($('.release-form'))
|
||||||
when 'projects:merge_requests:show'
|
when 'projects:merge_requests:show'
|
||||||
new Diff()
|
new Diff()
|
||||||
shortcut_handler = new ShortcutsIssuable()
|
shortcut_handler = new ShortcutsIssuable(true)
|
||||||
new ZenMode()
|
new ZenMode()
|
||||||
when "projects:merge_requests:diffs"
|
when "projects:merge_requests:diffs"
|
||||||
new Diff()
|
new Diff()
|
||||||
|
@ -87,7 +87,9 @@ class Dispatcher
|
||||||
new GroupAvatar()
|
new GroupAvatar()
|
||||||
when 'projects:tree:show'
|
when 'projects:tree:show'
|
||||||
new TreeView()
|
new TreeView()
|
||||||
shortcut_handler = new ShortcutsNavigation()
|
shortcut_handler = new ShortcutsTree()
|
||||||
|
when 'projects:find_file:show'
|
||||||
|
shortcut_handler = true
|
||||||
when 'projects:blob:show'
|
when 'projects:blob:show'
|
||||||
new LineHighlighter()
|
new LineHighlighter()
|
||||||
shortcut_handler = new ShortcutsNavigation()
|
shortcut_handler = new ShortcutsNavigation()
|
||||||
|
|
|
@ -66,7 +66,7 @@ class @DropzoneInput
|
||||||
|
|
||||||
success: (header, response) ->
|
success: (header, response) ->
|
||||||
child = $(dropzone[0]).children("textarea")
|
child = $(dropzone[0]).children("textarea")
|
||||||
$(child).val $(child).val() + formatLink(response.link) + "\n"
|
$(child).val $(child).val() + response.link.markdown + "\n"
|
||||||
return
|
return
|
||||||
|
|
||||||
error: (temp, errorMessage) ->
|
error: (temp, errorMessage) ->
|
||||||
|
@ -99,11 +99,6 @@ class @DropzoneInput
|
||||||
|
|
||||||
child = $(dropzone[0]).children("textarea")
|
child = $(dropzone[0]).children("textarea")
|
||||||
|
|
||||||
formatLink = (link) ->
|
|
||||||
text = "[#{link.alt}](#{link.url})"
|
|
||||||
text = "!#{text}" if link.is_image
|
|
||||||
text
|
|
||||||
|
|
||||||
handlePaste = (event) ->
|
handlePaste = (event) ->
|
||||||
pasteEvent = event.originalEvent
|
pasteEvent = event.originalEvent
|
||||||
if pasteEvent.clipboardData and pasteEvent.clipboardData.items
|
if pasteEvent.clipboardData and pasteEvent.clipboardData.items
|
||||||
|
@ -162,7 +157,7 @@ class @DropzoneInput
|
||||||
closeAlertMessage()
|
closeAlertMessage()
|
||||||
|
|
||||||
success: (e, textStatus, response) ->
|
success: (e, textStatus, response) ->
|
||||||
insertToTextArea(filename, formatLink(response.responseJSON.link))
|
insertToTextArea(filename, response.responseJSON.link.markdown)
|
||||||
|
|
||||||
error: (response) ->
|
error: (response) ->
|
||||||
showError(response.responseJSON.message)
|
showError(response.responseJSON.message)
|
||||||
|
@ -202,8 +197,3 @@ class @DropzoneInput
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
$(@).closest('.gfm-form').find('.div-dropzone').click()
|
$(@).closest('.gfm-form').find('.div-dropzone').click()
|
||||||
return
|
return
|
||||||
|
|
||||||
formatLink: (link) ->
|
|
||||||
text = "[#{link.alt}](#{link.url})"
|
|
||||||
text = "!#{text}" if link.is_image
|
|
||||||
text
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ GitLab.GfmAutoComplete =
|
||||||
searchKey: 'search'
|
searchKey: 'search'
|
||||||
callbacks:
|
callbacks:
|
||||||
beforeSave: (members) ->
|
beforeSave: (members) ->
|
||||||
$.map members, (m) ->
|
$.map members, (m) ->
|
||||||
title = m.name
|
title = m.name
|
||||||
title += " (#{m.count})" if m.count
|
title += " (#{m.count})" if m.count
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ GitLab.GfmAutoComplete =
|
||||||
insertTpl: '${atwho-at}${id}'
|
insertTpl: '${atwho-at}${id}'
|
||||||
callbacks:
|
callbacks:
|
||||||
beforeSave: (issues) ->
|
beforeSave: (issues) ->
|
||||||
$.map issues, (i) ->
|
$.map issues, (i) ->
|
||||||
id: i.iid
|
id: i.iid
|
||||||
title: sanitize(i.title)
|
title: sanitize(i.title)
|
||||||
search: "#{i.iid} #{i.title}"
|
search: "#{i.iid} #{i.title}"
|
||||||
|
@ -63,12 +63,12 @@ GitLab.GfmAutoComplete =
|
||||||
insertTpl: '${atwho-at}${id}'
|
insertTpl: '${atwho-at}${id}'
|
||||||
callbacks:
|
callbacks:
|
||||||
beforeSave: (merges) ->
|
beforeSave: (merges) ->
|
||||||
$.map merges, (m) ->
|
$.map merges, (m) ->
|
||||||
id: m.iid
|
id: m.iid
|
||||||
title: sanitize(m.title)
|
title: sanitize(m.title)
|
||||||
search: "#{m.iid} #{m.title}"
|
search: "#{m.iid} #{m.title}"
|
||||||
|
|
||||||
input.one 'focus', =>
|
if @dataSource
|
||||||
$.getJSON(@dataSource).done (data) ->
|
$.getJSON(@dataSource).done (data) ->
|
||||||
# load members
|
# load members
|
||||||
input.atwho 'load', '@', data.members
|
input.atwho 'load', '@', data.members
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#= require flash
|
||||||
#= require jquery.waitforimages
|
#= require jquery.waitforimages
|
||||||
#= require task_list
|
#= require task_list
|
||||||
|
|
||||||
|
@ -6,13 +7,54 @@ class @Issue
|
||||||
# Prevent duplicate event bindings
|
# Prevent duplicate event bindings
|
||||||
@disableTaskList()
|
@disableTaskList()
|
||||||
|
|
||||||
if $("a.btn-close").length
|
if $('a.btn-close').length
|
||||||
@initTaskList()
|
@initTaskList()
|
||||||
|
@initIssueBtnEventListeners()
|
||||||
|
|
||||||
initTaskList: ->
|
initTaskList: ->
|
||||||
$('.detail-page-description .js-task-list-container').taskList('enable')
|
$('.detail-page-description .js-task-list-container').taskList('enable')
|
||||||
$(document).on 'tasklist:changed', '.detail-page-description .js-task-list-container', @updateTaskList
|
$(document).on 'tasklist:changed', '.detail-page-description .js-task-list-container', @updateTaskList
|
||||||
|
|
||||||
|
initIssueBtnEventListeners: ->
|
||||||
|
_this = @
|
||||||
|
issueFailMessage = 'Unable to update this issue at this time.'
|
||||||
|
$('a.btn-close, a.btn-reopen').on 'click', (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopImmediatePropagation()
|
||||||
|
$this = $(this)
|
||||||
|
isClose = $this.hasClass('btn-close')
|
||||||
|
shouldSubmit = $this.hasClass('btn-comment')
|
||||||
|
if shouldSubmit
|
||||||
|
_this.submitNoteForm($this.closest('form'))
|
||||||
|
$this.prop('disabled', true)
|
||||||
|
url = $this.attr('href')
|
||||||
|
$.ajax
|
||||||
|
type: 'PUT'
|
||||||
|
url: url,
|
||||||
|
error: (jqXHR, textStatus, errorThrown) ->
|
||||||
|
issueStatus = if isClose then 'close' else 'open'
|
||||||
|
new Flash(issueFailMessage, 'alert')
|
||||||
|
success: (data, textStatus, jqXHR) ->
|
||||||
|
if data.saved
|
||||||
|
if isClose
|
||||||
|
$('a.btn-close').addClass('hidden')
|
||||||
|
$('a.btn-reopen').removeClass('hidden')
|
||||||
|
$('div.status-box-closed').removeClass('hidden')
|
||||||
|
$('div.status-box-open').addClass('hidden')
|
||||||
|
else
|
||||||
|
$('a.btn-reopen').addClass('hidden')
|
||||||
|
$('a.btn-close').removeClass('hidden')
|
||||||
|
$('div.status-box-closed').addClass('hidden')
|
||||||
|
$('div.status-box-open').removeClass('hidden')
|
||||||
|
else
|
||||||
|
new Flash(issueFailMessage, 'alert')
|
||||||
|
$this.prop('disabled', false)
|
||||||
|
|
||||||
|
submitNoteForm: (form) =>
|
||||||
|
noteText = form.find("textarea.js-note-text").val()
|
||||||
|
if noteText.trim().length > 0
|
||||||
|
form.submit()
|
||||||
|
|
||||||
disableTaskList: ->
|
disableTaskList: ->
|
||||||
$('.detail-page-description .js-task-list-container').taskList('disable')
|
$('.detail-page-description .js-task-list-container').taskList('disable')
|
||||||
$(document).off 'tasklist:changed', '.detail-page-description .js-task-list-container'
|
$(document).off 'tasklist:changed', '.detail-page-description .js-task-list-container'
|
||||||
|
|
|
@ -15,13 +15,6 @@
|
||||||
$(this).html totalIssues + 1
|
$(this).html totalIssues + 1
|
||||||
else
|
else
|
||||||
$(this).html totalIssues - 1
|
$(this).html totalIssues - 1
|
||||||
$("body").on "click", ".issues-other-filters .dropdown-menu a", ->
|
|
||||||
$('.issues-list').block(
|
|
||||||
message: null,
|
|
||||||
overlayCSS:
|
|
||||||
backgroundColor: '#DDD'
|
|
||||||
opacity: .4
|
|
||||||
)
|
|
||||||
|
|
||||||
reload: ->
|
reload: ->
|
||||||
Issues.initSelects()
|
Issues.initSelects()
|
||||||
|
@ -54,7 +47,7 @@
|
||||||
form = $("#issue_search_form")
|
form = $("#issue_search_form")
|
||||||
search = $("#issue_search").val()
|
search = $("#issue_search").val()
|
||||||
$('.issues-holder').css("opacity", '0.5')
|
$('.issues-holder').css("opacity", '0.5')
|
||||||
issues_url = form.attr('action') + '? '+ form.serialize()
|
issues_url = form.attr('action') + '?' + form.serialize()
|
||||||
|
|
||||||
$.ajax
|
$.ajax
|
||||||
type: "GET"
|
type: "GET"
|
||||||
|
@ -65,7 +58,7 @@
|
||||||
success: (data) ->
|
success: (data) ->
|
||||||
$('.issues-holder').html(data.html)
|
$('.issues-holder').html(data.html)
|
||||||
# Change url so if user reload a page - search results are saved
|
# Change url so if user reload a page - search results are saved
|
||||||
History.replaceState {page: issues_url}, document.title, issues_url
|
history.replaceState {page: issues_url}, document.title, issues_url
|
||||||
Issues.reload()
|
Issues.reload()
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
|
|
||||||
|
|
44
app/assets/javascripts/logo.js.coffee
Normal file
44
app/assets/javascripts/logo.js.coffee
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
NProgress.configure(showSpinner: false)
|
||||||
|
|
||||||
|
defaultClass = 'tanuki-shape'
|
||||||
|
pieces = [
|
||||||
|
'path#tanuki-right-cheek',
|
||||||
|
'path#tanuki-right-eye, path#tanuki-right-ear',
|
||||||
|
'path#tanuki-nose',
|
||||||
|
'path#tanuki-left-eye, path#tanuki-left-ear',
|
||||||
|
'path#tanuki-left-cheek',
|
||||||
|
]
|
||||||
|
pieceIndex = 0
|
||||||
|
firstPiece = pieces[0]
|
||||||
|
|
||||||
|
currentTimer = null
|
||||||
|
delay = 150
|
||||||
|
|
||||||
|
clearHighlights = ->
|
||||||
|
$(".#{defaultClass}.highlight").attr('class', defaultClass)
|
||||||
|
|
||||||
|
start = ->
|
||||||
|
clearHighlights()
|
||||||
|
pieceIndex = 0
|
||||||
|
pieces.reverse() unless pieces[0] == firstPiece
|
||||||
|
clearInterval(currentTimer) if currentTimer
|
||||||
|
currentTimer = setInterval(work, delay)
|
||||||
|
|
||||||
|
stop = ->
|
||||||
|
clearInterval(currentTimer)
|
||||||
|
clearHighlights()
|
||||||
|
|
||||||
|
work = ->
|
||||||
|
clearHighlights()
|
||||||
|
$(pieces[pieceIndex]).attr('class', "#{defaultClass} highlight")
|
||||||
|
|
||||||
|
# If we hit the last piece, reset the index and then reverse the array to
|
||||||
|
# get a nice back-and-forth sweeping look
|
||||||
|
if pieceIndex == pieces.length - 1
|
||||||
|
pieceIndex = 0
|
||||||
|
pieces.reverse()
|
||||||
|
else
|
||||||
|
pieceIndex++
|
||||||
|
|
||||||
|
$(document).on('page:fetch', start)
|
||||||
|
$(document).on('page:change', stop)
|
|
@ -19,6 +19,7 @@ class @MergeRequest
|
||||||
|
|
||||||
# Prevent duplicate event bindings
|
# Prevent duplicate event bindings
|
||||||
@disableTaskList()
|
@disableTaskList()
|
||||||
|
@initMRBtnListeners()
|
||||||
|
|
||||||
if $("a.btn-close").length
|
if $("a.btn-close").length
|
||||||
@initTaskList()
|
@initTaskList()
|
||||||
|
@ -43,6 +44,27 @@ class @MergeRequest
|
||||||
$('.detail-page-description .js-task-list-container').taskList('enable')
|
$('.detail-page-description .js-task-list-container').taskList('enable')
|
||||||
$(document).on 'tasklist:changed', '.detail-page-description .js-task-list-container', @updateTaskList
|
$(document).on 'tasklist:changed', '.detail-page-description .js-task-list-container', @updateTaskList
|
||||||
|
|
||||||
|
initMRBtnListeners: ->
|
||||||
|
_this = @
|
||||||
|
$('a.btn-close, a.btn-reopen').on 'click', (e) ->
|
||||||
|
$this = $(this)
|
||||||
|
if $this.data('submitted')
|
||||||
|
return
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopImmediatePropagation()
|
||||||
|
shouldSubmit = $this.hasClass('btn-comment')
|
||||||
|
console.log("shouldSubmit")
|
||||||
|
if shouldSubmit
|
||||||
|
_this.submitNoteForm($this.closest('form'),$this)
|
||||||
|
|
||||||
|
submitNoteForm: (form, $button) =>
|
||||||
|
noteText = form.find("textarea.js-note-text").val()
|
||||||
|
if noteText.trim().length > 0
|
||||||
|
form.submit()
|
||||||
|
$button.data('submitted',true)
|
||||||
|
$button.trigger('click')
|
||||||
|
|
||||||
|
|
||||||
disableTaskList: ->
|
disableTaskList: ->
|
||||||
$('.detail-page-description .js-task-list-container').taskList('disable')
|
$('.detail-page-description .js-task-list-container').taskList('disable')
|
||||||
$(document).off 'tasklist:changed', '.detail-page-description .js-task-list-container'
|
$(document).off 'tasklist:changed', '.detail-page-description .js-task-list-container'
|
||||||
|
|
|
@ -18,7 +18,7 @@ class @MergeRequestWidget
|
||||||
if data.state == "merged"
|
if data.state == "merged"
|
||||||
urlSuffix = if deleteSourceBranch then '?delete_source=true' else ''
|
urlSuffix = if deleteSourceBranch then '?delete_source=true' else ''
|
||||||
|
|
||||||
window.location.href = window.location.href + urlSuffix
|
window.location.href = window.location.pathname + urlSuffix
|
||||||
else if data.merge_error
|
else if data.merge_error
|
||||||
$('.mr-widget-body').html("<h4>" + data.merge_error + "</h4>")
|
$('.mr-widget-body').html("<h4>" + data.merge_error + "</h4>")
|
||||||
else
|
else
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
form = $("#issue_search_form")
|
form = $("#issue_search_form")
|
||||||
search = $("#issue_search").val()
|
search = $("#issue_search").val()
|
||||||
$('.merge-requests-holder').css("opacity", '0.5')
|
$('.merge-requests-holder').css("opacity", '0.5')
|
||||||
issues_url = form.attr('action') + '? '+ form.serialize()
|
issues_url = form.attr('action') + '?' + form.serialize()
|
||||||
|
|
||||||
$.ajax
|
$.ajax
|
||||||
type: "GET"
|
type: "GET"
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
success: (data) ->
|
success: (data) ->
|
||||||
$('.merge-requests-holder').html(data.html)
|
$('.merge-requests-holder').html(data.html)
|
||||||
# Change url so if user reload a page - search results are saved
|
# Change url so if user reload a page - search results are saved
|
||||||
History.replaceState {page: issues_url}, document.title, issues_url
|
history.replaceState {page: issues_url}, document.title, issues_url
|
||||||
MergeRequests.reload()
|
MergeRequests.reload()
|
||||||
dataType: "json"
|
dataType: "json"
|
||||||
|
|
||||||
|
|
78
app/assets/javascripts/new_branch_form.js.coffee
Normal file
78
app/assets/javascripts/new_branch_form.js.coffee
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
class @NewBranchForm
|
||||||
|
constructor: (form, availableRefs) ->
|
||||||
|
@branchNameError = form.find('.js-branch-name-error')
|
||||||
|
@name = form.find('.js-branch-name')
|
||||||
|
@ref = form.find('#ref')
|
||||||
|
|
||||||
|
@setupAvailableRefs(availableRefs)
|
||||||
|
@setupRestrictions()
|
||||||
|
@addBinding()
|
||||||
|
@init()
|
||||||
|
|
||||||
|
addBinding: ->
|
||||||
|
@name.on 'blur', @validate
|
||||||
|
|
||||||
|
init: ->
|
||||||
|
@name.trigger 'blur' if @name.val().length > 0
|
||||||
|
|
||||||
|
setupAvailableRefs: (availableRefs) ->
|
||||||
|
@ref.autocomplete
|
||||||
|
source: availableRefs,
|
||||||
|
minLength: 1
|
||||||
|
|
||||||
|
setupRestrictions: ->
|
||||||
|
startsWith = {
|
||||||
|
pattern: /^(\/|\.)/g,
|
||||||
|
prefix: "can't start with",
|
||||||
|
conjunction: "or"
|
||||||
|
}
|
||||||
|
|
||||||
|
endsWith = {
|
||||||
|
pattern: /(\/|\.|\.lock)$/g,
|
||||||
|
prefix: "can't end in",
|
||||||
|
conjunction: "or"
|
||||||
|
}
|
||||||
|
|
||||||
|
invalid = {
|
||||||
|
pattern: /(\s|~|\^|:|\?|\*|\[|\\|\.\.|@\{|\/{2,}){1}/g
|
||||||
|
prefix: "can't contain",
|
||||||
|
conjunction: ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
single = {
|
||||||
|
pattern: /^@+$/g
|
||||||
|
prefix: "can't be",
|
||||||
|
conjunction: "or"
|
||||||
|
}
|
||||||
|
|
||||||
|
@restrictions = [startsWith, invalid, endsWith, single]
|
||||||
|
|
||||||
|
validate: =>
|
||||||
|
@branchNameError.empty()
|
||||||
|
|
||||||
|
unique = (values, value) ->
|
||||||
|
values.push(value) unless value in values
|
||||||
|
values
|
||||||
|
|
||||||
|
formatter = (values, restriction) ->
|
||||||
|
formatted = values.map (value) ->
|
||||||
|
switch
|
||||||
|
when /\s/.test value then 'spaces'
|
||||||
|
when /\/{2,}/g.test value then 'consecutive slashes'
|
||||||
|
else "'#{value}'"
|
||||||
|
|
||||||
|
"#{restriction.prefix} #{formatted.join(restriction.conjunction)}"
|
||||||
|
|
||||||
|
validator = (errors, restriction) =>
|
||||||
|
matched = @name.val().match(restriction.pattern)
|
||||||
|
|
||||||
|
if matched
|
||||||
|
errors.concat formatter(matched.reduce(unique, []), restriction)
|
||||||
|
else
|
||||||
|
errors
|
||||||
|
|
||||||
|
errors = @restrictions.reduce validator, []
|
||||||
|
|
||||||
|
if errors.length > 0
|
||||||
|
errorMessage = $("<span/>").text(errors.join(', '))
|
||||||
|
@branchNameError.append(errorMessage)
|
|
@ -1,6 +1,6 @@
|
||||||
class @NewCommitForm
|
class @NewCommitForm
|
||||||
constructor: (form) ->
|
constructor: (form) ->
|
||||||
@newBranch = form.find('.js-new-branch')
|
@newBranch = form.find('.js-target-branch')
|
||||||
@originalBranch = form.find('.js-original-branch')
|
@originalBranch = form.find('.js-original-branch')
|
||||||
@createMergeRequest = form.find('.js-create-merge-request')
|
@createMergeRequest = form.find('.js-create-merge-request')
|
||||||
@createMergeRequestContainer = form.find('.js-create-merge-request-container')
|
@createMergeRequestContainer = form.find('.js-create-merge-request-container')
|
||||||
|
|
|
@ -33,8 +33,6 @@ class @Notes
|
||||||
$(document).on "click", ".note-edit-cancel", @cancelEdit
|
$(document).on "click", ".note-edit-cancel", @cancelEdit
|
||||||
|
|
||||||
# Reopen and close actions for Issue/MR combined with note form submit
|
# Reopen and close actions for Issue/MR combined with note form submit
|
||||||
$(document).on "click", ".js-note-target-reopen", @targetReopen
|
|
||||||
$(document).on "click", ".js-note-target-close", @targetClose
|
|
||||||
$(document).on "click", ".js-comment-button", @updateCloseButton
|
$(document).on "click", ".js-comment-button", @updateCloseButton
|
||||||
$(document).on "keyup", ".js-note-text", @updateTargetButtons
|
$(document).on "keyup", ".js-note-text", @updateTargetButtons
|
||||||
|
|
||||||
|
@ -127,7 +125,7 @@ class @Notes
|
||||||
@initTaskList()
|
@initTaskList()
|
||||||
|
|
||||||
if note.award
|
if note.award
|
||||||
awards_handler.addAwardToEmojiBar(note.note, note.emoji_path)
|
awards_handler.addAwardToEmojiBar(note.note)
|
||||||
awards_handler.scrollToAwards()
|
awards_handler.scrollToAwards()
|
||||||
|
|
||||||
###
|
###
|
||||||
|
@ -512,17 +510,6 @@ class @Notes
|
||||||
visibilityChange: =>
|
visibilityChange: =>
|
||||||
@refresh()
|
@refresh()
|
||||||
|
|
||||||
targetReopen: (e) =>
|
|
||||||
@submitNoteForm($(e.target).parents('form'))
|
|
||||||
|
|
||||||
targetClose: (e) =>
|
|
||||||
@submitNoteForm($(e.target).parents('form'))
|
|
||||||
|
|
||||||
submitNoteForm: (form) =>
|
|
||||||
noteText = form.find(".js-note-text").val()
|
|
||||||
if noteText.trim().length > 0
|
|
||||||
form.submit()
|
|
||||||
|
|
||||||
updateCloseButton: (e) =>
|
updateCloseButton: (e) =>
|
||||||
textarea = $(e.target)
|
textarea = $(e.target)
|
||||||
form = textarea.parents('form')
|
form = textarea.parents('form')
|
||||||
|
@ -531,7 +518,6 @@ class @Notes
|
||||||
updateTargetButtons: (e) =>
|
updateTargetButtons: (e) =>
|
||||||
textarea = $(e.target)
|
textarea = $(e.target)
|
||||||
form = textarea.parents('form')
|
form = textarea.parents('form')
|
||||||
|
|
||||||
if textarea.val().trim().length > 0
|
if textarea.val().trim().length > 0
|
||||||
form.find('.js-note-target-reopen').text('Comment & reopen')
|
form.find('.js-note-target-reopen').text('Comment & reopen')
|
||||||
form.find('.js-note-target-close').text('Comment & close')
|
form.find('.js-note-target-close').text('Comment & close')
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
class @Project
|
class @Project
|
||||||
constructor: ->
|
constructor: ->
|
||||||
# Git protocol switcher
|
# Git protocol switcher
|
||||||
$('.js-protocol-switch').click ->
|
$('ul.clone-options-dropdown a').click ->
|
||||||
return if $(@).hasClass('active')
|
return if $(@).hasClass('active')
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,7 +10,8 @@ class @Project
|
||||||
# Add the active class for the clicked button
|
# Add the active class for the clicked button
|
||||||
$(@).toggleClass('active')
|
$(@).toggleClass('active')
|
||||||
|
|
||||||
url = $(@).data('clone')
|
url = $("#project_clone").val()
|
||||||
|
console.log("url",url)
|
||||||
|
|
||||||
# Update the input field
|
# Update the input field
|
||||||
$('#project_clone').val(url)
|
$('#project_clone').val(url)
|
||||||
|
|
125
app/assets/javascripts/project_find_file.js.coffee
Normal file
125
app/assets/javascripts/project_find_file.js.coffee
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
class @ProjectFindFile
|
||||||
|
constructor: (@element, @options)->
|
||||||
|
@filePaths = {}
|
||||||
|
@inputElement = @element.find(".file-finder-input")
|
||||||
|
|
||||||
|
# init event
|
||||||
|
@initEvent()
|
||||||
|
|
||||||
|
# focus text input box
|
||||||
|
@inputElement.focus()
|
||||||
|
|
||||||
|
# load file list
|
||||||
|
@load(@options.url)
|
||||||
|
|
||||||
|
# init event
|
||||||
|
initEvent: ->
|
||||||
|
@inputElement.off "keyup"
|
||||||
|
@inputElement.on "keyup", (event) =>
|
||||||
|
target = $(event.target)
|
||||||
|
value = target.val()
|
||||||
|
oldValue = target.data("oldValue") ? ""
|
||||||
|
|
||||||
|
if value != oldValue
|
||||||
|
target.data("oldValue", value)
|
||||||
|
@findFile()
|
||||||
|
@element.find("tr.tree-item").eq(0).addClass("selected").focus()
|
||||||
|
|
||||||
|
@element.find(".tree-content-holder .tree-table").on "click", (event) ->
|
||||||
|
if (event.target.nodeName != "A")
|
||||||
|
path = @element.find(".tree-item-file-name a", this).attr("href")
|
||||||
|
location.href = path if path
|
||||||
|
|
||||||
|
# find file
|
||||||
|
findFile: ->
|
||||||
|
searchText = @inputElement.val()
|
||||||
|
result = if searchText.length > 0 then fuzzaldrinPlus.filter(@filePaths, searchText) else @filePaths
|
||||||
|
@renderList result, searchText
|
||||||
|
|
||||||
|
# files pathes load
|
||||||
|
load: (url) ->
|
||||||
|
$.ajax
|
||||||
|
url: url
|
||||||
|
method: "get"
|
||||||
|
dataType: "json"
|
||||||
|
success: (data) =>
|
||||||
|
@element.find(".loading").hide()
|
||||||
|
@filePaths = data
|
||||||
|
@findFile()
|
||||||
|
@element.find(".files-slider tr.tree-item").eq(0).addClass("selected").focus()
|
||||||
|
|
||||||
|
# render result
|
||||||
|
renderList: (filePaths, searchText) ->
|
||||||
|
@element.find(".tree-table > tbody").empty()
|
||||||
|
|
||||||
|
for filePath, i in filePaths
|
||||||
|
break if i == 20
|
||||||
|
|
||||||
|
if searchText
|
||||||
|
matches = fuzzaldrinPlus.match(filePath, searchText)
|
||||||
|
|
||||||
|
blobItemUrl = "#{@options.blobUrlTemplate}/#{filePath}"
|
||||||
|
|
||||||
|
html = @makeHtml filePath, matches, blobItemUrl
|
||||||
|
@element.find(".tree-table > tbody").append(html)
|
||||||
|
|
||||||
|
# highlight text(awefwbwgtc -> <b>a</b>wefw<b>b</b>wgt<b>c</b> )
|
||||||
|
highlighter = (element, text, matches) ->
|
||||||
|
lastIndex = 0
|
||||||
|
highlightText = ""
|
||||||
|
matchedChars = []
|
||||||
|
|
||||||
|
for matchIndex in matches
|
||||||
|
unmatched = text.substring(lastIndex, matchIndex)
|
||||||
|
|
||||||
|
if unmatched
|
||||||
|
element.append(matchedChars.join("").bold()) if matchedChars.length
|
||||||
|
matchedChars = []
|
||||||
|
element.append(document.createTextNode(unmatched))
|
||||||
|
|
||||||
|
matchedChars.push(text[matchIndex])
|
||||||
|
lastIndex = matchIndex + 1
|
||||||
|
|
||||||
|
element.append(matchedChars.join("").bold()) if matchedChars.length
|
||||||
|
element.append(document.createTextNode(text.substring(lastIndex)))
|
||||||
|
|
||||||
|
# make tbody row html
|
||||||
|
makeHtml: (filePath, matches, blobItemUrl) ->
|
||||||
|
$tr = $("<tr class='tree-item'><td class='tree-item-file-name'><i class='fa fa-file-text-o fa-fw'></i><span class='str-truncated'><a></a></span></td></tr>")
|
||||||
|
if matches
|
||||||
|
$tr.find("a").replaceWith(highlighter($tr.find("a"), filePath, matches).attr("href", blobItemUrl))
|
||||||
|
else
|
||||||
|
$tr.find("a").attr("href", blobItemUrl).text(filePath)
|
||||||
|
|
||||||
|
return $tr
|
||||||
|
|
||||||
|
selectRow: (type) ->
|
||||||
|
rows = @element.find(".files-slider tr.tree-item")
|
||||||
|
selectedRow = @element.find(".files-slider tr.tree-item.selected")
|
||||||
|
|
||||||
|
if rows && rows.length > 0
|
||||||
|
if selectedRow && selectedRow.length > 0
|
||||||
|
if type == "UP"
|
||||||
|
next = selectedRow.prev()
|
||||||
|
else if type == "DOWN"
|
||||||
|
next = selectedRow.next()
|
||||||
|
|
||||||
|
if next.length > 0
|
||||||
|
selectedRow.removeClass "selected"
|
||||||
|
selectedRow = next
|
||||||
|
else
|
||||||
|
selectedRow = rows.eq(0)
|
||||||
|
selectedRow.addClass("selected").focus()
|
||||||
|
|
||||||
|
selectRowUp: =>
|
||||||
|
@selectRow "UP"
|
||||||
|
|
||||||
|
selectRowDown: =>
|
||||||
|
@selectRow "DOWN"
|
||||||
|
|
||||||
|
goToTree: =>
|
||||||
|
location.href = @options.treeUrl
|
||||||
|
|
||||||
|
goToBlob: =>
|
||||||
|
path = @element.find(".tree-item.selected .tree-item-file-name a").attr("href")
|
||||||
|
location.href = path if path
|
|
@ -8,17 +8,17 @@ class @ProjectsList
|
||||||
|
|
||||||
$(".projects-list-filter").keyup ->
|
$(".projects-list-filter").keyup ->
|
||||||
terms = $(this).val()
|
terms = $(this).val()
|
||||||
uiBox = $(this).closest('.projects-list-holder')
|
uiBox = $('div.projects-list-holder')
|
||||||
if terms == "" || terms == undefined
|
if terms == "" || terms == undefined
|
||||||
uiBox.find(".projects-list li").show()
|
uiBox.find("ul.projects-list li").show()
|
||||||
else
|
else
|
||||||
uiBox.find(".projects-list li").each (index) ->
|
uiBox.find("ul.projects-list li").each (index) ->
|
||||||
name = $(this).find(".filter-title").text()
|
name = $(this).find("span.filter-title").text()
|
||||||
|
|
||||||
if name.toLowerCase().search(terms.toLowerCase()) == -1
|
if name.toLowerCase().search(terms.toLowerCase()) == -1
|
||||||
$(this).hide()
|
$(this).hide()
|
||||||
else
|
else
|
||||||
$(this).show()
|
$(this).show()
|
||||||
uiBox.find(".projects-list li.bottom").hide()
|
uiBox.find("ul.projects-list li.bottom").hide()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ class @Shortcuts
|
||||||
|
|
||||||
selectiveHelp: (e) =>
|
selectiveHelp: (e) =>
|
||||||
Shortcuts.showHelp(e, @enabledHelp)
|
Shortcuts.showHelp(e, @enabledHelp)
|
||||||
|
|
||||||
@showHelp: (e, location) ->
|
@showHelp: (e, location) ->
|
||||||
if $('#modal-shortcuts').length > 0
|
if $('#modal-shortcuts').length > 0
|
||||||
$('#modal-shortcuts').modal('show')
|
$('#modal-shortcuts').modal('show')
|
||||||
|
@ -17,8 +17,7 @@ class @Shortcuts
|
||||||
dataType: 'script',
|
dataType: 'script',
|
||||||
success: (e) ->
|
success: (e) ->
|
||||||
if location and location.length > 0
|
if location and location.length > 0
|
||||||
for l in location
|
$(l).show() for l in location
|
||||||
$(l).show()
|
|
||||||
else
|
else
|
||||||
$('.hidden-shortcut').show()
|
$('.hidden-shortcut').show()
|
||||||
$('.js-more-help-button').remove()
|
$('.js-more-help-button').remove()
|
||||||
|
@ -28,3 +27,8 @@ class @Shortcuts
|
||||||
@focusSearch: (e) ->
|
@focusSearch: (e) ->
|
||||||
$('#search').focus()
|
$('#search').focus()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
||||||
|
$(document).on 'click.more_help', '.js-more-help-button', (e) ->
|
||||||
|
$(@).remove()
|
||||||
|
$('.hidden-shortcut').show()
|
||||||
|
e.preventDefault()
|
||||||
|
|
19
app/assets/javascripts/shortcuts_find_file.js.coffee
Normal file
19
app/assets/javascripts/shortcuts_find_file.js.coffee
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#= require shortcuts_navigation
|
||||||
|
|
||||||
|
class @ShortcutsFindFile extends ShortcutsNavigation
|
||||||
|
constructor: (@projectFindFile) ->
|
||||||
|
super()
|
||||||
|
_oldStopCallback = Mousetrap.stopCallback
|
||||||
|
# override to fire shortcuts action when focus in textbox
|
||||||
|
Mousetrap.stopCallback = (event, element, combo) =>
|
||||||
|
if element == @projectFindFile.inputElement[0] and (combo == 'up' or combo == 'down' or combo == 'esc' or combo == 'enter')
|
||||||
|
# when press up/down key in textbox, cusor prevent to move to home/end
|
||||||
|
event.preventDefault()
|
||||||
|
return false
|
||||||
|
|
||||||
|
return _oldStopCallback(event, element, combo)
|
||||||
|
|
||||||
|
Mousetrap.bind('up', @projectFindFile.selectRowUp)
|
||||||
|
Mousetrap.bind('down', @projectFindFile.selectRowDown)
|
||||||
|
Mousetrap.bind('esc', @projectFindFile.goToTree)
|
||||||
|
Mousetrap.bind('enter', @projectFindFile.goToBlob)
|
4
app/assets/javascripts/shortcuts_tree.coffee
Normal file
4
app/assets/javascripts/shortcuts_tree.coffee
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
class @ShortcutsTree extends ShortcutsNavigation
|
||||||
|
constructor: ->
|
||||||
|
super()
|
||||||
|
Mousetrap.bind('t', -> ShortcutsTree.findAndFollowLink('.shortcuts-find-file'))
|
22
app/assets/javascripts/star.js.coffee
Normal file
22
app/assets/javascripts/star.js.coffee
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
class @Star
|
||||||
|
constructor: ->
|
||||||
|
$('.project-home-panel .toggle-star').on('ajax:success', (e, data, status, xhr) ->
|
||||||
|
$this = $(this)
|
||||||
|
$starSpan = $this.find('span')
|
||||||
|
$starIcon = $this.find('i')
|
||||||
|
|
||||||
|
toggleStar = (isStarred) ->
|
||||||
|
$this.parent().find('span.count').text data.star_count
|
||||||
|
if isStarred
|
||||||
|
$starSpan.removeClass('starred').text 'Star'
|
||||||
|
$starIcon.removeClass('fa-star').addClass 'fa-star-o'
|
||||||
|
else
|
||||||
|
$starSpan.addClass('starred').text 'Unstar'
|
||||||
|
$starIcon.removeClass('fa-star-o').addClass 'fa-star'
|
||||||
|
return
|
||||||
|
|
||||||
|
toggleStar $starSpan.hasClass('starred')
|
||||||
|
return
|
||||||
|
).on 'ajax:error', (e, xhr, status, error) ->
|
||||||
|
new Flash('Star toggle failed. Try again later.', 'alert')
|
||||||
|
return
|
|
@ -117,5 +117,5 @@ class @UsersSelect
|
||||||
callback(users)
|
callback(users)
|
||||||
|
|
||||||
buildUrl: (url) ->
|
buildUrl: (url) ->
|
||||||
url = gon.relative_url_root + url if gon.relative_url_root?
|
url = gon.relative_url_root.replace(/\/$/, '') + url if gon.relative_url_root?
|
||||||
return url
|
return url
|
||||||
|
|
|
@ -1,56 +1,80 @@
|
||||||
|
# Zen Mode (full screen) textarea
|
||||||
|
#
|
||||||
|
#= provides zen_mode:enter
|
||||||
|
#= provides zen_mode:leave
|
||||||
|
#
|
||||||
|
#= require jquery.scrollTo
|
||||||
#= require dropzone
|
#= require dropzone
|
||||||
#= require mousetrap
|
#= require mousetrap
|
||||||
#= require mousetrap/pause
|
#= require mousetrap/pause
|
||||||
|
#
|
||||||
|
# ### Events
|
||||||
|
#
|
||||||
|
# `zen_mode:enter`
|
||||||
|
#
|
||||||
|
# Fired when the "Edit in fullscreen" link is clicked.
|
||||||
|
#
|
||||||
|
# **Synchronicity** Sync
|
||||||
|
# **Bubbles** Yes
|
||||||
|
# **Cancelable** No
|
||||||
|
# **Target** a.js-zen-enter
|
||||||
|
#
|
||||||
|
# `zen_mode:leave`
|
||||||
|
#
|
||||||
|
# Fired when the "Leave Fullscreen" link is clicked.
|
||||||
|
#
|
||||||
|
# **Synchronicity** Sync
|
||||||
|
# **Bubbles** Yes
|
||||||
|
# **Cancelable** No
|
||||||
|
# **Target** a.js-zen-leave
|
||||||
|
#
|
||||||
class @ZenMode
|
class @ZenMode
|
||||||
constructor: ->
|
constructor: ->
|
||||||
@active_zen_area = null
|
@active_backdrop = null
|
||||||
@active_checkbox = null
|
@active_textarea = null
|
||||||
@scroll_position = 0
|
|
||||||
|
|
||||||
$(window).scroll =>
|
$(document).on 'click', '.js-zen-enter', (e) ->
|
||||||
if not @active_checkbox
|
|
||||||
@scroll_position = window.pageYOffset
|
|
||||||
|
|
||||||
$('body').on 'click', '.zen-enter-link', (e) =>
|
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true).change()
|
$(e.currentTarget).trigger('zen_mode:enter')
|
||||||
|
|
||||||
$('body').on 'click', '.zen-leave-link', (e) =>
|
$(document).on 'click', '.js-zen-leave', (e) ->
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false).change()
|
$(e.currentTarget).trigger('zen_mode:leave')
|
||||||
|
|
||||||
$('body').on 'change', '.zen-toggle-comment', (e) =>
|
$(document).on 'zen_mode:enter', (e) =>
|
||||||
checkbox = e.currentTarget
|
@enter(e.target.parentNode)
|
||||||
if checkbox.checked
|
$(document).on 'zen_mode:leave', (e) =>
|
||||||
# Disable other keyboard shortcuts in ZEN mode
|
@exit()
|
||||||
Mousetrap.pause()
|
|
||||||
@updateActiveZenArea(checkbox)
|
|
||||||
else
|
|
||||||
@exitZenMode()
|
|
||||||
|
|
||||||
$(document).on 'keydown', (e) =>
|
$(document).on 'keydown', (e) ->
|
||||||
if e.keyCode is 27 # Esc
|
if e.keyCode == 27 # Esc
|
||||||
@exitZenMode()
|
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
$(document).trigger('zen_mode:leave')
|
||||||
|
|
||||||
|
enter: (backdrop) ->
|
||||||
|
Mousetrap.pause()
|
||||||
|
|
||||||
|
@active_backdrop = $(backdrop)
|
||||||
|
@active_backdrop.addClass('fullscreen')
|
||||||
|
|
||||||
|
@active_textarea = @active_backdrop.find('textarea')
|
||||||
|
|
||||||
updateActiveZenArea: (checkbox) =>
|
|
||||||
@active_checkbox = $(checkbox)
|
|
||||||
@active_checkbox.prop('checked', true)
|
|
||||||
@active_zen_area = @active_checkbox.parent().find('textarea')
|
|
||||||
# Prevent a user-resized textarea from persisting to fullscreen
|
# Prevent a user-resized textarea from persisting to fullscreen
|
||||||
@active_zen_area.removeAttr('style')
|
@active_textarea.removeAttr('style')
|
||||||
@active_zen_area.focus()
|
@active_textarea.focus()
|
||||||
|
|
||||||
exitZenMode: =>
|
exit: ->
|
||||||
if @active_zen_area isnt null
|
if @active_textarea
|
||||||
Mousetrap.unpause()
|
Mousetrap.unpause()
|
||||||
@active_checkbox.prop('checked', false)
|
|
||||||
@active_zen_area = null
|
@active_textarea.closest('.zen-backdrop').removeClass('fullscreen')
|
||||||
@active_checkbox = null
|
|
||||||
@restoreScroll(@scroll_position)
|
@scrollTo(@active_textarea)
|
||||||
# Enable dropzone when leaving ZEN mode
|
|
||||||
|
@active_textarea = null
|
||||||
|
@active_backdrop = null
|
||||||
|
|
||||||
Dropzone.forElement('.div-dropzone').enable()
|
Dropzone.forElement('.div-dropzone').enable()
|
||||||
|
|
||||||
restoreScroll: (y) ->
|
scrollTo: (zen_area) ->
|
||||||
window.scrollTo(window.pageXOffset, y)
|
$.scrollTo(zen_area, 0, offset: -150)
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
* 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
|
* 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.
|
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
||||||
*= require jquery.ui.datepicker
|
*= require jquery-ui/datepicker
|
||||||
*= require jquery.ui.autocomplete
|
*= require jquery-ui/autocomplete
|
||||||
*= require jquery.atwho
|
*= require jquery.atwho
|
||||||
*= require select2
|
*= require select2
|
||||||
*= require_self
|
*= require_self
|
||||||
|
@ -48,4 +48,4 @@
|
||||||
/*
|
/*
|
||||||
* Styles for JS behaviors.
|
* Styles for JS behaviors.
|
||||||
*/
|
*/
|
||||||
@import "behaviors.scss";
|
@import "behaviors.scss";
|
||||||
|
|
|
@ -72,11 +72,20 @@
|
||||||
> p:last-child {
|
> p:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.block-controls {
|
||||||
|
float: right;
|
||||||
|
|
||||||
|
.control {
|
||||||
|
float: left;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover-block {
|
.cover-block {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background: #f7f8fa;
|
background: $background-color;
|
||||||
margin: -$gl-padding;
|
margin: -$gl-padding;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
padding: 44px $gl-padding;
|
padding: 44px $gl-padding;
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
@mixin btn-default {
|
@mixin btn-default {
|
||||||
@include border-radius(2px);
|
@include border-radius(3px);
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
text-transform: uppercase;
|
font-size: 15px;
|
||||||
font-size: 13px;
|
font-weight: 500;
|
||||||
font-weight: 600;
|
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
padding: 11px $gl-padding;
|
padding: 11px $gl-padding;
|
||||||
letter-spacing: .4px;
|
letter-spacing: .4px;
|
||||||
|
@ -18,7 +17,7 @@
|
||||||
|
|
||||||
@mixin btn-middle {
|
@mixin btn-middle {
|
||||||
@include btn-default;
|
@include btn-default;
|
||||||
@include border-radius(2px);
|
@include border-radius(3px);
|
||||||
padding: 11px 24px;
|
padding: 11px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +50,10 @@
|
||||||
@include btn-color($blue-light, $border-blue-light, $blue-normal, $border-blue-normal, $blue-dark, $border-blue-dark, #FFFFFF);
|
@include btn-color($blue-light, $border-blue-light, $blue-normal, $border-blue-normal, $blue-dark, $border-blue-dark, #FFFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin btn-blue-medium {
|
||||||
|
@include btn-color($blue-medium-light, $border-blue-light, $blue-medium, $border-blue-normal, $blue-medium-dark, $border-blue-dark, #FFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
@mixin btn-orange {
|
@mixin btn-orange {
|
||||||
@include btn-color($orange-light, $border-orange-light, $orange-normal, $border-orange-normal, $orange-dark, $border-orange-dark, #FFFFFF);
|
@include btn-color($orange-light, $border-orange-light, $orange-normal, $border-orange-normal, $orange-dark, $border-orange-dark, #FFFFFF);
|
||||||
}
|
}
|
||||||
|
@ -60,7 +63,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin btn-gray {
|
@mixin btn-gray {
|
||||||
@include btn-color($gray-light, $border-gray-light, $gray-normal, $border-gray-normal, $gray-dark, $border-gray-dark, #313236);
|
@include btn-color($gray-light, $border-gray-light, $gray-normal, $border-gray-light, $gray-dark, $border-gray-dark, #313236);
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin btn-white {
|
@mixin btn-white {
|
||||||
|
@ -75,6 +78,10 @@
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.btn-nr {
|
||||||
|
padding: 7px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
&.btn-xs {
|
&.btn-xs {
|
||||||
padding: 1px 5px;
|
padding: 1px 5px;
|
||||||
}
|
}
|
||||||
|
@ -91,11 +98,15 @@
|
||||||
@include btn-gray;
|
@include btn-gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.btn-primary,
|
&.btn-primary {
|
||||||
|
@include btn-blue-medium;
|
||||||
|
}
|
||||||
|
|
||||||
&.btn-info {
|
&.btn-info {
|
||||||
@include btn-blue;
|
@include btn-blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.btn-close,
|
||||||
&.btn-warning {
|
&.btn-warning {
|
||||||
@include btn-orange;
|
@include btn-orange;
|
||||||
}
|
}
|
||||||
|
@ -110,20 +121,8 @@
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.btn-close {
|
|
||||||
color: $gl-danger;
|
|
||||||
border-color: $gl-danger;
|
|
||||||
&:hover {
|
|
||||||
color: #B94A48;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.btn-reopen {
|
&.btn-reopen {
|
||||||
color: $gl-success;
|
/* should be same as parent class for now */
|
||||||
border-color: $gl-success;
|
|
||||||
&:hover {
|
|
||||||
color: #468847;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.btn-grouped {
|
&.btn-grouped {
|
||||||
|
|
|
@ -19,38 +19,33 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This overwrites the default values of the cal-heatmap gem
|
* This overwrites the default values of the cal-heatmap gem
|
||||||
*/
|
*/
|
||||||
.calendar {
|
.calendar {
|
||||||
.qi {
|
.qi {
|
||||||
background-color: #999;
|
|
||||||
fill: #fff;
|
fill: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.q1 {
|
.q1 {
|
||||||
background-color: #dae289;
|
fill: #ededed !important;
|
||||||
fill: #ededed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.q2 {
|
.q2 {
|
||||||
background-color: #cedb9c;
|
fill: #ACD5F2 !important;
|
||||||
fill: #ACD5F2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.q3 {
|
.q3 {
|
||||||
background-color: #b5cf6b;
|
fill: #7FA8D1 !important;
|
||||||
fill: #7FA8D1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.q4 {
|
.q4 {
|
||||||
background-color: #637939;
|
fill: #49729B !important;
|
||||||
fill: #49729B;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.q5 {
|
.q5 {
|
||||||
background-color: #3b6427;
|
fill: #254E77 !important;
|
||||||
fill: #254E77;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.domain-background {
|
.domain-background {
|
||||||
|
@ -59,32 +54,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.ch-tooltip {
|
.ch-tooltip {
|
||||||
position: absolute;
|
|
||||||
display: none;
|
|
||||||
margin-top: 22px;
|
|
||||||
margin-left: 1px;
|
|
||||||
font-size: 13px;
|
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
font-weight: 550;
|
font-weight: 550;
|
||||||
background-color: #222;
|
|
||||||
span {
|
|
||||||
position: absolute;
|
|
||||||
width: 200px;
|
|
||||||
text-align: center;
|
|
||||||
visibility: hidden;
|
|
||||||
border-radius: 10px;
|
|
||||||
&:after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -8px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border-top: 8px solid #000000;
|
|
||||||
border-right: 8px solid transparent;
|
|
||||||
border-left: 8px solid transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,7 +374,7 @@ table {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-top-menu {
|
.center-top-menu, .left-top-menu {
|
||||||
@include nav-menu;
|
@include nav-menu;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
|
@ -408,6 +408,11 @@ table {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.left-top-menu {
|
||||||
|
text-align: left;
|
||||||
|
border-bottom: 1px solid #EEE;
|
||||||
|
}
|
||||||
|
|
||||||
.center-middle-menu {
|
.center-middle-menu {
|
||||||
@include nav-menu;
|
@include nav-menu;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
|
@ -3,23 +3,23 @@
|
||||||
font-family: 'Source Sans Pro';
|
font-family: 'Source Sans Pro';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), font-url('SourceSansPro-Light.ttf');
|
src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), font-url('SourceSansPro-Light.ttf.woff');
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Source Sans Pro';
|
font-family: 'Source Sans Pro';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Source Sans Pro'), local('SourceSansPro-Regular'), font-url('SourceSansPro-Regular.ttf');
|
src: local('Source Sans Pro'), local('SourceSansPro-Regular'), font-url('SourceSansPro-Regular.ttf.woff');
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Source Sans Pro';
|
font-family: 'Source Sans Pro';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), font-url('SourceSansPro-Semibold.ttf');
|
src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), font-url('SourceSansPro-Semibold.ttf.woff');
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Source Sans Pro';
|
font-family: 'Source Sans Pro';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), font-url('SourceSansPro-Bold.ttf');
|
src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), font-url('SourceSansPro-Bold.ttf.woff');
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.status-box {
|
.status-box {
|
||||||
@include border-radius(2px);
|
@include border-radius(3px);
|
||||||
|
|
||||||
display: block;
|
display: block;
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.status-box-open {
|
&.status-box-open {
|
||||||
background-color: #019875;
|
background-color: $green-light;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #EAEBEC !important;
|
background-color: #F3F3F3 !important;
|
||||||
|
|
||||||
&.navless {
|
&.navless {
|
||||||
background-color: white !important;
|
background-color: white !important;
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
|
|
||||||
|
|
||||||
/** light list with border-bottom between li **/
|
/** light list with border-bottom between li **/
|
||||||
ul.bordered-list {
|
ul.bordered-list, ul.unstyled-list {
|
||||||
@include basic-list;
|
@include basic-list;
|
||||||
|
|
||||||
&.top-list {
|
&.top-list {
|
||||||
|
@ -88,6 +88,10 @@ ul.bordered-list {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ul.unstyled-list > li {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
ul.task-list {
|
ul.task-list {
|
||||||
li.task-list-item {
|
li.task-list-item {
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
|
|
|
@ -123,7 +123,6 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin-top: 5px;
|
|
||||||
height: 56px;
|
height: 56px;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
|
@ -131,9 +130,9 @@
|
||||||
|
|
||||||
a {
|
a {
|
||||||
padding: 14px;
|
padding: 14px;
|
||||||
font-size: 17px;
|
font-size: 15px;
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
color: #7f8fa4;
|
color: #959494;
|
||||||
border-bottom: 2px solid transparent;
|
border-bottom: 2px solid transparent;
|
||||||
|
|
||||||
&:hover, &:active, &:focus {
|
&:hover, &:active, &:focus {
|
||||||
|
@ -143,8 +142,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.active a {
|
&.active a {
|
||||||
color: #4c4e54;
|
color: #616060;
|
||||||
border-bottom: 2px solid #1cacfc;
|
border-bottom: 2px solid #4688f1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.badge {
|
.badge {
|
||||||
|
|
|
@ -81,7 +81,7 @@
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-top-menu {
|
.center-top-menu, .left-top-menu {
|
||||||
li a {
|
li a {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding: 19px 10px;
|
padding: 19px 10px;
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
.tanuki-shape {
|
.tanuki-shape {
|
||||||
transition: all 0.8s;
|
transition: all 0.8s;
|
||||||
|
|
||||||
&:hover {
|
&:hover, &.highlight {
|
||||||
fill: rgb(255, 255, 255);
|
fill: rgb(255, 255, 255);
|
||||||
transition: all 0.1s;
|
transition: all 0.1s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,17 +54,17 @@
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
margin: 24px 0 12px 0;
|
margin: 24px 0 12px 0;
|
||||||
font-size: 1.25em;
|
font-size: 1.1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
margin: 24px 0 12px 0;
|
margin: 24px 0 12px 0;
|
||||||
font-size: 1.1em;
|
font-size: 0.98em;
|
||||||
}
|
}
|
||||||
|
|
||||||
h5 {
|
h5 {
|
||||||
margin: 24px 0 12px 0;
|
margin: 24px 0 12px 0;
|
||||||
font-size: 1em;
|
font-size: 0.95em;
|
||||||
}
|
}
|
||||||
|
|
||||||
h6 {
|
h6 {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
$hover: #FFFAF1;
|
$hover: #faf9f9;
|
||||||
$gl-text-color: #54565B;
|
$gl-text-color: #54565B;
|
||||||
$gl-text-green: #4A2;
|
$gl-text-green: #4A2;
|
||||||
$gl-text-red: #D12F19;
|
$gl-text-red: #D12F19;
|
||||||
$gl-text-orange: #D90;
|
$gl-text-orange: #D90;
|
||||||
$gl-header-color: #4c4e54;
|
$gl-header-color: #323232;
|
||||||
$gl-link-color: #333c48;
|
$gl-link-color: #333c48;
|
||||||
$md-text-color: #444;
|
$md-text-color: #444;
|
||||||
$md-link-color: #3084bb;
|
$md-link-color: #3084bb;
|
||||||
|
@ -15,26 +15,28 @@ $sidebar_width: 230px;
|
||||||
$avatar_radius: 50%;
|
$avatar_radius: 50%;
|
||||||
$code_font_size: 13px;
|
$code_font_size: 13px;
|
||||||
$code_line_height: 1.5;
|
$code_line_height: 1.5;
|
||||||
$border-color: #dce0e6;
|
$border-color: #efeff1;
|
||||||
$table-border-color: #eef0f2;
|
$table-border-color: #eef0f2;
|
||||||
$background-color: #F7F8FA;
|
$background-color: #faf9f9;
|
||||||
$header-height: 58px;
|
$header-height: 58px;
|
||||||
$fixed-layout-width: 1280px;
|
$fixed-layout-width: 1280px;
|
||||||
$gl-gray: #7f8fa4;
|
$gl-gray: #5a5a5a;
|
||||||
$gl-padding: 16px;
|
$gl-padding: 16px;
|
||||||
|
$gl-padding-top:10px;
|
||||||
$gl-avatar-size: 46px;
|
$gl-avatar-size: 46px;
|
||||||
|
$secondary-text: #7f8fa4;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Color schema
|
* Color schema
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$white-light: #FFFFFF;
|
$white-light: #FFFFFF;
|
||||||
$white-normal: #DCE0E5;
|
$white-normal: #ededed;
|
||||||
$white-dark: #E4E7ED;
|
$white-dark: #ededed;
|
||||||
|
|
||||||
$gray-light: #F0F2F5;
|
$gray-light: #f7f7f7;
|
||||||
$gray-normal: #DCE0E5;
|
$gray-normal: #ededed;
|
||||||
$gray-dark: #E4E7ED;
|
$gray-dark: #ededed;
|
||||||
|
|
||||||
$green-light: #31AF64;
|
$green-light: #31AF64;
|
||||||
$green-normal: #2FAA60;
|
$green-normal: #2FAA60;
|
||||||
|
@ -44,6 +46,10 @@ $blue-light: #2EA8E5;
|
||||||
$blue-normal: #2D9FD8;
|
$blue-normal: #2D9FD8;
|
||||||
$blue-dark: #2897CE;
|
$blue-dark: #2897CE;
|
||||||
|
|
||||||
|
$blue-medium-light: #3498CB;
|
||||||
|
$blue-medium: #2F8EBF;
|
||||||
|
$blue-medium-dark: #2D86B4;
|
||||||
|
|
||||||
$orange-light: #FC6443;
|
$orange-light: #FC6443;
|
||||||
$orange-normal: #E75E40;
|
$orange-normal: #E75E40;
|
||||||
$orange-dark: #CE5237;
|
$orange-dark: #CE5237;
|
||||||
|
@ -52,11 +58,11 @@ $red-light: #F43263;
|
||||||
$red-normal: #E52C5A;
|
$red-normal: #E52C5A;
|
||||||
$red-dark: #D22852;
|
$red-dark: #D22852;
|
||||||
|
|
||||||
$border-white-light: #E3E7EC;
|
$border-white-light: #F1F2F4;
|
||||||
$border-white-normal: #D6DAE2;
|
$border-white-normal: #D6DAE2;
|
||||||
$border-white-dark: #C6CACF;
|
$border-white-dark: #C6CACF;
|
||||||
|
|
||||||
$border-gray-light: #DCE0E5;
|
$border-gray-light: #d1d1d1;
|
||||||
$border-gray-normal: #D6DAE2;
|
$border-gray-normal: #D6DAE2;
|
||||||
$border-gray-dark: #C6CACF;
|
$border-gray-dark: #C6CACF;
|
||||||
|
|
||||||
|
@ -76,6 +82,8 @@ $border-red-light: #E52C5A;
|
||||||
$border-red-normal: #D22852;
|
$border-red-normal: #D22852;
|
||||||
$border-red-dark: #CA264F;
|
$border-red-dark: #CA264F;
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
$light-grey-header: #faf9f9;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* State colors:
|
* State colors:
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
.zennable {
|
.zennable {
|
||||||
.zen-toggle-comment {
|
a.js-zen-enter {
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.zen-enter-link {
|
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
|
@ -11,7 +7,7 @@
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.zen-leave-link {
|
a.js-zen-leave {
|
||||||
display: none;
|
display: none;
|
||||||
color: $gl-text-color;
|
color: $gl-text-color;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -25,62 +21,41 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide the Enter link when we're in Zen mode
|
.zen-backdrop {
|
||||||
input:checked ~ .zen-backdrop .zen-enter-link {
|
&.fullscreen {
|
||||||
display: none;
|
background-color: white;
|
||||||
}
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 1031;
|
||||||
|
|
||||||
// Show the Leave link when we're in Zen mode
|
textarea {
|
||||||
input:checked ~ .zen-backdrop .zen-leave-link {
|
border: none;
|
||||||
display: block;
|
box-shadow: none;
|
||||||
position: absolute;
|
border-radius: 0;
|
||||||
top: 0;
|
color: #000;
|
||||||
}
|
font-size: 20px;
|
||||||
|
line-height: 26px;
|
||||||
|
padding: 30px;
|
||||||
|
display: block;
|
||||||
|
outline: none;
|
||||||
|
resize: none;
|
||||||
|
height: 100vh;
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
input:checked ~ .zen-backdrop {
|
a.js-zen-enter {
|
||||||
background-color: white;
|
display: none;
|
||||||
position: fixed;
|
}
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: 1031;
|
|
||||||
|
|
||||||
textarea {
|
a.js-zen-leave {
|
||||||
border: none;
|
display: block;
|
||||||
box-shadow: none;
|
position: absolute;
|
||||||
border-radius: 0;
|
top: 0;
|
||||||
color: #000;
|
}
|
||||||
font-size: 20px;
|
|
||||||
line-height: 26px;
|
|
||||||
padding: 30px;
|
|
||||||
display: block;
|
|
||||||
outline: none;
|
|
||||||
resize: none;
|
|
||||||
height: 100vh;
|
|
||||||
max-width: 900px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the color of the placeholder text in the Zenned-out textarea darker,
|
|
||||||
// so it becomes visible
|
|
||||||
|
|
||||||
input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder {
|
|
||||||
color: #A8A8A8;
|
|
||||||
}
|
|
||||||
|
|
||||||
input:checked ~ .zen-backdrop textarea:-moz-placeholder {
|
|
||||||
color: #A8A8A8;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
input:checked ~ .zen-backdrop textarea::-moz-placeholder {
|
|
||||||
color: #A8A8A8;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
input:checked ~ .zen-backdrop textarea:-ms-input-placeholder {
|
|
||||||
color: #A8A8A8;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
@include clearfix;
|
@include clearfix;
|
||||||
line-height: 34px;
|
line-height: 34px;
|
||||||
|
|
||||||
|
.emoji-icon {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
margin: 7px 0 0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
.award {
|
.award {
|
||||||
@include border-radius(5px);
|
@include border-radius(5px);
|
||||||
|
|
||||||
|
@ -40,6 +46,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.awards-controls {
|
.awards-controls {
|
||||||
|
position: relative;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
float: left;
|
float: left;
|
||||||
|
|
||||||
|
@ -55,32 +62,64 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.awards-menu {
|
.emoji-menu{
|
||||||
padding: $gl-padding;
|
position: absolute;
|
||||||
min-width: 214px;
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1000;
|
||||||
|
display: none;
|
||||||
|
float: left;
|
||||||
|
min-width: 160px;
|
||||||
|
padding: 5px 0;
|
||||||
|
margin: 2px 0 0;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: left;
|
||||||
|
list-style: none;
|
||||||
|
background-color: #fff;
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
background-clip: padding-box;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border: 1px solid rgba(0,0,0,.15);
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
|
||||||
|
box-shadow: 0 6px 12px rgba(0,0,0,.175);
|
||||||
|
|
||||||
> li {
|
.emoji-menu-content {
|
||||||
cursor: pointer;
|
padding: $gl-padding;
|
||||||
width: 30px;
|
width: 300px;
|
||||||
height: 30px;
|
height: 300px;
|
||||||
text-align: center;
|
overflow-y: scroll;
|
||||||
@include border-radius(5px);
|
|
||||||
|
|
||||||
img {
|
h5 {
|
||||||
margin-bottom: 2px;
|
clear: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
ul {
|
||||||
background-color: #ccc;
|
list-style-type: none;
|
||||||
|
margin-left: -20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.emoji-search{
|
||||||
|
background: image-url("icon-search.png") 240px no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
text-align: center;
|
||||||
|
float: left;
|
||||||
|
margin: 3px;
|
||||||
|
list-decorate: none;
|
||||||
|
@include border-radius(5px);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.awards-menu{
|
|
||||||
li {
|
|
||||||
float: left;
|
|
||||||
margin: 3px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,10 +28,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.commits-feed-holder {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
li.commit {
|
li.commit {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
|
|
||||||
|
@ -122,3 +118,59 @@ li.commit {
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.divergence-graph {
|
||||||
|
padding: 12px 12px 0 0;
|
||||||
|
float: right;
|
||||||
|
|
||||||
|
.graph-side {
|
||||||
|
position: relative;
|
||||||
|
width: 80px;
|
||||||
|
height: 22px;
|
||||||
|
padding: 5px 0 13px;
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
.bar {
|
||||||
|
position: absolute;
|
||||||
|
height: 4px;
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bar-behind {
|
||||||
|
right: 0;
|
||||||
|
border-radius: 3px 0 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bar-ahead {
|
||||||
|
left: 0;
|
||||||
|
border-radius: 0 3px 3px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count {
|
||||||
|
padding-top: 6px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #333;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-behind {
|
||||||
|
padding-right: 4px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count-ahead {
|
||||||
|
padding-left: 4px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-separator {
|
||||||
|
position: relative;
|
||||||
|
width: 1px;
|
||||||
|
height: 18px;
|
||||||
|
margin: 5px 0 0;
|
||||||
|
float: left;
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
border-bottom: 1px solid $border-color;
|
border-bottom: 1px solid $border-color;
|
||||||
color: #5c5d5e;
|
color: #5c5d5e;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 42px;
|
line-height: 34px;
|
||||||
|
|
||||||
.author {
|
.author {
|
||||||
color: #5c5d5e;
|
color: #5c5d5e;
|
||||||
|
|
1272
app/assets/stylesheets/pages/emojis.scss
Normal file
1272
app/assets/stylesheets/pages/emojis.scss
Normal file
File diff suppressed because it is too large
Load diff
|
@ -138,6 +138,7 @@
|
||||||
*/
|
*/
|
||||||
.event-last-push {
|
.event-last-push {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
width: 100%;
|
||||||
.event-last-push-text {
|
.event-last-push-text {
|
||||||
@include str-truncated(100%);
|
@include str-truncated(100%);
|
||||||
padding: 5px 0;
|
padding: 5px 0;
|
||||||
|
|
|
@ -94,8 +94,16 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.cross-project-reference {
|
.cross-project-reference {
|
||||||
font-weight: bold;
|
|
||||||
color: $gl-link-color;
|
color: $gl-link-color;
|
||||||
|
|
||||||
|
span {
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 85%;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
float: right;
|
float: right;
|
||||||
|
|
|
@ -144,3 +144,8 @@ form.edit-issue {
|
||||||
.issue-form .select2-container {
|
.issue-form .select2-container {
|
||||||
width: 250px !important;
|
width: 250px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.issue-closed-by-widget {
|
||||||
|
color: $secondary-text;
|
||||||
|
margin-left: 52px;
|
||||||
|
}
|
|
@ -75,16 +75,15 @@
|
||||||
|
|
||||||
.common-note-form {
|
.common-note-form {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
background: #F7F8FA;
|
background: #fff;
|
||||||
padding: $gl-padding;
|
padding: $gl-padding;
|
||||||
margin-left: -$gl-padding;
|
margin-left: -$gl-padding;
|
||||||
margin-right: -$gl-padding;
|
margin-right: -$gl-padding;
|
||||||
border-top: 1px solid $border-color;
|
|
||||||
margin-bottom: -$gl-padding;
|
margin-bottom: -$gl-padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
.note-form-actions {
|
.note-form-actions {
|
||||||
background: #F9F9F9;
|
background: #fff;
|
||||||
|
|
||||||
.note-form-option {
|
.note-form-option {
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
|
|
|
@ -128,7 +128,7 @@ ul.notes {
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
border-bottom: none;
|
border-bottom: 1px solid $border-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-home-panel {
|
.project-home-panel {
|
||||||
|
|
||||||
|
.cover-controls {
|
||||||
|
.project-settings-dropdown {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.project-identicon-holder {
|
.project-identicon-holder {
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
@ -91,21 +98,83 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.input-group {
|
.git-clone-holder {
|
||||||
display: inline-table;
|
display: inline-table;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 17px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-repo-buttons {
|
.project-repo-buttons {
|
||||||
margin-top: 12px;
|
margin-top: 12px;
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
|
|
||||||
|
.count-buttons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
@include btn-gray;
|
@include btn-gray;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
.count-with-arrow {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
margin-left: 4px;
|
||||||
|
|
||||||
|
.arrow {
|
||||||
|
&:before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-color: transparent;
|
||||||
|
border-style: solid;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
margin-top: -6px;
|
||||||
|
border-width: 7px 5px 7px 0;
|
||||||
|
border-right-color: #dce0e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-color: transparent;
|
||||||
|
border-style: solid;
|
||||||
|
top: 50%;
|
||||||
|
left: 1px;
|
||||||
|
margin-top: -9px;
|
||||||
|
border-width: 10px 7px 10px 0;
|
||||||
|
border-right-color: #FFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
.count {
|
.count {
|
||||||
|
@include btn-gray;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
background: white;
|
||||||
|
border-radius: 2px;
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 20px;
|
||||||
|
padding: 11px 16px;
|
||||||
|
letter-spacing: .4px;
|
||||||
|
padding: 10px;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
touch-action: manipulation;
|
||||||
|
cursor: pointer;
|
||||||
|
background-image: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
margin: 0 11px 0px 4px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,6 +194,13 @@
|
||||||
margin-right: 45px;
|
margin-right: 45px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.clone-options {
|
||||||
|
display: table-cell;
|
||||||
|
a.btn {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.form-control {
|
.form-control {
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
@extend .monospace;
|
@extend .monospace;
|
||||||
|
@ -219,10 +295,9 @@
|
||||||
|
|
||||||
border: 1px solid #c6cacf !important;
|
border: 1px solid #c6cacf !important;
|
||||||
background-color: #e4e7ed !important;
|
background-color: #e4e7ed !important;
|
||||||
text-transform: uppercase;
|
text-transform: none;
|
||||||
color: #313236 !important;
|
color: #313236 !important;
|
||||||
font-size: 13px;
|
font-size: 15px;
|
||||||
font-weight: 600;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-menu {
|
.dropdown-menu {
|
||||||
|
@ -335,6 +410,43 @@ ul.nav.nav-projects-tabs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.last-push-widget {
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-area {
|
||||||
|
border-bottom: 1px solid #EEE;
|
||||||
|
margin: 0 -16px;
|
||||||
|
padding: 0 $gl-padding;
|
||||||
|
height: 42px;
|
||||||
|
|
||||||
|
ul.left-top-menu {
|
||||||
|
display: inline-block;
|
||||||
|
width: 50%;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.projects-search-form {
|
||||||
|
width: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
float: right;
|
||||||
|
padding-top: 7px;
|
||||||
|
text-align: right;
|
||||||
|
|
||||||
|
.btn-green {
|
||||||
|
margin-top: -2px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $screen-xs-max) {
|
||||||
|
.projects-search-form {
|
||||||
|
padding-top: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.fork-namespaces {
|
.fork-namespaces {
|
||||||
.fork-thumbnail {
|
.fork-thumbnail {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@ -412,11 +524,19 @@ pre.light-well {
|
||||||
|
|
||||||
.projects-search-form {
|
.projects-search-form {
|
||||||
margin: -$gl-padding;
|
margin: -$gl-padding;
|
||||||
background-color: #f8fafc;
|
|
||||||
padding: $gl-padding;
|
padding: $gl-padding;
|
||||||
|
padding-bottom: 0;
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
border-top: 1px solid #e7e9ed;
|
|
||||||
border-bottom: 1px solid #e7e9ed;
|
input {
|
||||||
|
display: inline-block;
|
||||||
|
width: calc(100% - 151px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
display: inline-block;
|
||||||
|
width: 135px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.git-empty {
|
.git-empty {
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
.tree-holder {
|
.tree-holder {
|
||||||
|
|
||||||
|
.file-finder {
|
||||||
|
width: 50%;
|
||||||
|
.file-finder-input {
|
||||||
|
width: 95%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.tree-table {
|
.tree-table {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,10 @@ class AbuseReportsController < ApplicationController
|
||||||
@abuse_report.reporter = current_user
|
@abuse_report.reporter = current_user
|
||||||
|
|
||||||
if @abuse_report.save
|
if @abuse_report.save
|
||||||
if current_application_settings.admin_notification_email.present?
|
@abuse_report.notify
|
||||||
AbuseReportMailer.notify(@abuse_report.id).deliver_later
|
|
||||||
end
|
|
||||||
|
|
||||||
message = "Thank you for your report. A GitLab administrator will look into it shortly."
|
message = "Thank you for your report. A GitLab administrator will look into it shortly."
|
||||||
redirect_to root_path, notice: message
|
redirect_to @abuse_report.user, notice: message
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
end
|
end
|
||||||
|
@ -23,6 +21,9 @@ class AbuseReportsController < ApplicationController
|
||||||
private
|
private
|
||||||
|
|
||||||
def report_params
|
def report_params
|
||||||
params.require(:abuse_report).permit(:user_id, :message)
|
params.require(:abuse_report).permit(%i(
|
||||||
|
message
|
||||||
|
user_id
|
||||||
|
))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,11 +6,9 @@ class Admin::AbuseReportsController < Admin::ApplicationController
|
||||||
def destroy
|
def destroy
|
||||||
abuse_report = AbuseReport.find(params[:id])
|
abuse_report = AbuseReport.find(params[:id])
|
||||||
|
|
||||||
if params[:remove_user]
|
abuse_report.remove_user if params[:remove_user]
|
||||||
abuse_report.user.destroy
|
|
||||||
end
|
|
||||||
|
|
||||||
abuse_report.destroy
|
abuse_report.destroy
|
||||||
|
|
||||||
render nothing: true
|
render nothing: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue