Merge branch 'master' into mmonaco/gitlab-ce-api-user-noconfirm
Conflicts: lib/api/users.rb
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
CHANGELOG merge=union
|
60
.gitignore
vendored
|
@ -1,42 +1,42 @@
|
|||
.bundle
|
||||
.rbx/
|
||||
db/*.sqlite3
|
||||
db/*.sqlite3-journal
|
||||
log/*.log*
|
||||
tmp/
|
||||
.sass-cache/
|
||||
coverage/*
|
||||
backups/*
|
||||
*.log
|
||||
*.swp
|
||||
public/uploads/
|
||||
.ruby-version
|
||||
.ruby-gemset
|
||||
.rvmrc
|
||||
.rbenv-version
|
||||
.DS_Store
|
||||
.bundle
|
||||
.chef
|
||||
.directory
|
||||
nohup.out
|
||||
Vagrantfile
|
||||
.envrc
|
||||
.gitlab_shell_secret
|
||||
.idea
|
||||
.rbenv-version
|
||||
.rbx/
|
||||
.ruby-gemset
|
||||
.ruby-version
|
||||
.rvmrc
|
||||
.sass-cache/
|
||||
.secret
|
||||
.vagrant
|
||||
config/gitlab.yml
|
||||
Vagrantfile
|
||||
backups/*
|
||||
config/aws.yml
|
||||
config/database.yml
|
||||
config/gitlab.yml
|
||||
config/initializers/omniauth.rb
|
||||
config/initializers/rack_attack.rb
|
||||
config/initializers/smtp_settings.rb
|
||||
config/unicorn.rb
|
||||
config/resque.yml
|
||||
config/aws.yml
|
||||
config/unicorn.rb
|
||||
coverage/*
|
||||
db/*.sqlite3
|
||||
db/*.sqlite3-journal
|
||||
db/data.yml
|
||||
.idea
|
||||
.DS_Store
|
||||
.chef
|
||||
vendor/bundle/*
|
||||
rails_best_practices_output.html
|
||||
doc/code/*
|
||||
.secret
|
||||
*.log
|
||||
public/uploads.*
|
||||
public/assets/
|
||||
.envrc
|
||||
dump.rdb
|
||||
log/*.log*
|
||||
nohup.out
|
||||
public/assets/
|
||||
public/uploads.*
|
||||
public/uploads/
|
||||
rails_best_practices_output.html
|
||||
tags
|
||||
.gitlab_shell_secret
|
||||
tmp/
|
||||
vendor/bundle/*
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
user: git
|
||||
group: git
|
||||
services:
|
||||
- postgres
|
||||
before_precompile: ./bin/pkgr_before_precompile.sh
|
||||
targets:
|
||||
debian-7: &wheezy
|
||||
build_dependencies:
|
||||
- libkrb5-dev
|
||||
- libicu-dev
|
||||
- cmake
|
||||
- pkg-config
|
||||
|
@ -14,6 +17,7 @@ targets:
|
|||
ubuntu-12.04: *wheezy
|
||||
ubuntu-14.04:
|
||||
build_dependencies:
|
||||
- libkrb5-dev
|
||||
- libicu-dev
|
||||
- cmake
|
||||
- pkg-config
|
||||
|
@ -23,6 +27,7 @@ targets:
|
|||
- git
|
||||
centos-6:
|
||||
build_dependencies:
|
||||
- krb5-devel
|
||||
- libicu-devel
|
||||
- cmake
|
||||
- pkgconfig
|
||||
|
|
1006
.rubocop.yml
Normal file
|
@ -1 +1 @@
|
|||
2.1.3
|
||||
2.1.5
|
||||
|
|
192
CHANGELOG
|
@ -1,14 +1,199 @@
|
|||
Please view this file on the master branch, on stable branches it's out of date.
|
||||
|
||||
v 7.9.0 (unreleased)
|
||||
- Move labels/milestones tabs to sidebar
|
||||
- Upgrade Rails gem to version 4.1.9.
|
||||
- Improve error messages for file edit failures
|
||||
- Improve UI for commits, issues and merge request lists
|
||||
- Fix commit comments on first line of diff not rendering in Merge Request Discussion view.
|
||||
- Improve trigger merge request hook when source project branch has been updated (Kirill Zaitsev)
|
||||
- Save web edit in new branch
|
||||
- Fix ordering of imported but unchanged projects (Marco Wessel)
|
||||
- Mobile UI improvements: make aside content expandable
|
||||
- Generalize image upload in drag and drop in markdown to all files (Hannes Rosenögger)
|
||||
- Fix mass-unassignment of issues (Robert Speicher)
|
||||
- Allow user confirmation to be skipped for new users via API
|
||||
|
||||
v 7.8.1
|
||||
- Fix run of custom post receive hooks
|
||||
- Fix migration that caused issues when upgrading to version 7.8 from versions prior to 7.3
|
||||
- Fix the warning for LDAP users about need to set password
|
||||
- Fix avatars which were not shown for non logged in users
|
||||
- Fix urls for the issues when relative url was enabled
|
||||
- Add Bitbucket omniauth provider.
|
||||
- Add Bitbucket importer.
|
||||
|
||||
v 7.8.0
|
||||
- Fix access control and protection against XSS for note attachments and other uploads.
|
||||
- Replace highlight.js with rouge-fork rugments (Stefan Tatschner)
|
||||
- Make project search case insensitive (Hannes Rosenögger)
|
||||
- Include issue/mr participants in list of recipients for reassign/close/reopen emails
|
||||
- Expose description in groups API
|
||||
- Better UI for project services page
|
||||
- Cleaner UI for web editor
|
||||
- Add diff syntax highlighting in email-on-push service notifications (Hannes Rosenögger)
|
||||
- Add API endpoint to fetch all changes on a MergeRequest (Jeroen van Baarsen)
|
||||
- View note image attachments in new tab when clicked instead of downloading them
|
||||
- Improve sorting logic in UI and API. Explicitly define what sorting method is used by default
|
||||
- Allow more variations for commit messages closing issues (Julien Bianchi and Hannes Rosenögger)
|
||||
- Fix overflow at sidebar when have several items
|
||||
- Add notes for label changes in issue and merge requests
|
||||
- Show tags in commit view (Hannes Rosenögger)
|
||||
- Only count a user's vote once on a merge request or issue (Michael Clarke)
|
||||
- Increate font size when browse source files and diffs
|
||||
- Create new file in empty repository using GitLab UI
|
||||
- Ability to clone project using oauth2 token
|
||||
- Upgrade Sidekiq gem to version 3.3.0
|
||||
- Stop git zombie creation during force push check
|
||||
- Show success/error messages for test setting button in services
|
||||
- Added Rubocop for code style checks
|
||||
- Fix commits pagination
|
||||
- Async load a branch information at the commit page
|
||||
- Disable blacklist validation for project names
|
||||
- Allow configuring protection of the default branch upon first push (Marco Wessel)
|
||||
- Add gitlab.com importer
|
||||
- Add an ability to login with gitlab.com
|
||||
- Add a commit calendar to the user profile (Hannes Rosenögger)
|
||||
- Submit comment on command-enter
|
||||
- Notify all members of a group when that group is mentioned in a comment, for example: `@gitlab-org` or `@sales`.
|
||||
- Extend issue clossing pattern to include "Resolve", "Resolves", "Resolved", "Resolving" and "Close"
|
||||
- Fix long broadcast message cut-off on left sidebar (Visay Keo)
|
||||
- Add Project Avatars (Steven Thonus and Hannes Rosenögger)
|
||||
- Password reset token validity increased from 2 hours to 2 days since it is also send on account creation.
|
||||
- Edit group members via API
|
||||
- Enable raw image paste from clipboard, currently Chrome only (Marco Cyriacks)
|
||||
- Add action property to merge request hook (Julien Bianchi)
|
||||
- Remove duplicates from group milestone participants list.
|
||||
- Add a new API function that retrieves all issues assigned to a single milestone (Justin Whear and Hannes Rosenögger)
|
||||
- API: Access groups with their path (Julien Bianchi)
|
||||
- Added link to milestone and keeping resource context on smaller viewports for issues and merge requests (Jason Blanchard)
|
||||
- Allow notification email to be set separately from primary email.
|
||||
- API: Add support for editing an existing project (Mika Mäenpää and Hannes Rosenögger)
|
||||
- Don't have Markdown preview fail for long comments/wiki pages.
|
||||
- When test web hook - show error message instead of 500 error page if connection to hook url was reset
|
||||
- Added support for firing system hooks on group create/destroy and adding/removing users to group (Boyan Tabakov)
|
||||
- Added persistent collapse button for left side nav bar (Jason Blanchard)
|
||||
- Prevent losing unsaved comments by automatically restoring them when comment page is loaded again.
|
||||
- Don't allow page to be scaled on mobile.
|
||||
- Clean the username acquired from OAuth/LDAP so it doesn't fail username validation and block signing up.
|
||||
- Show assignees in merge request index page (Kelvin Mutuma)
|
||||
- Link head panel titles to relevant root page.
|
||||
- Allow users that signed up via OAuth to set their password in order to use Git over HTTP(S).
|
||||
- Show users button to share their newly created public or internal projects on twitter
|
||||
- Add quick help links to the GitLab pricing and feature comparison pages.
|
||||
- Fix duplicate authorized applications in user profile and incorrect application client count in admin area.
|
||||
- Make sure Markdown previews always use the same styling as the eventual destination.
|
||||
- Remove deprecated Group#owner_id from API
|
||||
- Show projects user contributed to on user page. Show stars near project on user page.
|
||||
- Improve database performance for GitLab
|
||||
- Add Asana service (Jeremy Benoist)
|
||||
- Improve project web hooks with extra data
|
||||
|
||||
v 7.7.2
|
||||
- Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch
|
||||
- Fix issue when LDAP user can't login with existing GitLab account
|
||||
|
||||
v 7.7.1
|
||||
- Improve mention autocomplete performance
|
||||
- Show setup instructions for GitHub import if disabled
|
||||
- Allow use http for OAuth applications
|
||||
|
||||
v 7.7.0
|
||||
- Import from GitHub.com feature
|
||||
- Add Jetbrains Teamcity CI service (Jason Lippert)
|
||||
- Mention notification level
|
||||
- Markdown preview in wiki (Yuriy Glukhov)
|
||||
- Raise group avatar filesize limit to 200kb
|
||||
- OAuth applications feature
|
||||
- Show user SSH keys in admin area
|
||||
- Developer can push to protected branches option
|
||||
- Set project path instead of project name in create form
|
||||
- Block Git HTTP access after 10 failed authentication attempts
|
||||
- Updates to the messages returned by API (sponsored by O'Reilly Media)
|
||||
- New UI layout with side navigation
|
||||
- Add alert message in case of outdated browser (IE < 10)
|
||||
- Added API support for sorting projects
|
||||
- Update gitlab_git to version 7.0.0.rc14
|
||||
- Add API project search filter option for authorized projects
|
||||
- Fix File blame not respecting branch selection
|
||||
- Change some of application settings on fly in admin area UI
|
||||
- Redesign signin/signup pages
|
||||
- Close standard input in Gitlab::Popen.popen
|
||||
- Trigger GitLab CI when push tags
|
||||
- When accept merge request - do merge using sidaekiq job
|
||||
- Enable web signups by default
|
||||
- Fixes for diff comments: drag-n-drop images, selecting images
|
||||
- Fixes for edit comments: drag-n-drop images, preview mode, selecting images, save & update
|
||||
- Remove password strength indicator
|
||||
|
||||
|
||||
|
||||
v 7.6.0
|
||||
- Fork repository to groups
|
||||
- New rugged version
|
||||
- Add CRON=1 backup setting for quiet backups
|
||||
- Fix failing wiki restore
|
||||
- Add optional Sidekiq MemoryKiller middleware (enabled via SIDEKIQ_MAX_RSS env variable)
|
||||
- Monokai highlighting style now more faithful to original design (Mark Riedesel)
|
||||
- Create project with repository in synchrony
|
||||
- Added ability to create empty repo or import existing one if project does not have repository
|
||||
- Reactivate highlight.js language autodetection
|
||||
- Mobile UI improvements
|
||||
- Change maximum avatar file size from 100KB to 200KB
|
||||
- Strict validation for snippet file names
|
||||
- Enable Markdown preview for issues, merge requests, milestones, and notes (Vinnie Okada)
|
||||
- In the docker directory is a container template based on the Omnibus packages.
|
||||
- Update Sidekiq to version 2.17.8
|
||||
- Add author filter to project issues and merge requests pages
|
||||
- Atom feed for user activity
|
||||
- Support multiple omniauth providers for the same user
|
||||
- Rendering cross reference in issue title and tooltip for merge request
|
||||
- Show username in comments
|
||||
- Possibility to create Milestones or Labels when Issues are disabled
|
||||
- Fix bug with showing gpg signature in tag
|
||||
|
||||
v 7.5.3
|
||||
- Bump gitlab_git to 7.0.0.rc12 (includes Rugged 0.21.2)
|
||||
|
||||
v 7.5.2
|
||||
- Don't log Sidekiq arguments by default
|
||||
- Fix restore of wiki repositories from backups
|
||||
|
||||
v 7.5.1
|
||||
- Add missing timestamps to 'members' table
|
||||
|
||||
v 7.5.0
|
||||
- API: Add support for Hipchat (Kevin Houdebert)
|
||||
- Add time zone configuration on gitlab.yml (Sullivan Senechal)
|
||||
- Add time zone configuration in gitlab.yml (Sullivan Senechal)
|
||||
- Fix LDAP authentication for Git HTTP access
|
||||
- Run 'GC.start' after every EmailsOnPushWorker job
|
||||
- Fix LDAP config lookup for provider 'ldap'
|
||||
- Drop all sequences during Postgres database restore
|
||||
- Project title links to project homepage (Ben Bodenmiller)
|
||||
- Add Atlassian Bamboo CI service (Drew Blessing)
|
||||
- Mentioned @user will receive email even if he is not participating in issue or commit
|
||||
- Session API: Use case-insensitive authentication like in UI (Andrey Krivko)
|
||||
- Tie up loose ends with annotated tags: API & UI (Sean Edge)
|
||||
- Return valid json for deleting branch via API (sponsored by O'Reilly Media)
|
||||
- Expose username in project events API (sponsored by O'Reilly Media)
|
||||
- Allow user confirmation to be skipped for new users via API
|
||||
- Adds comments to commits in the API
|
||||
- Performance improvements
|
||||
- Fix post-receive issue for projects with deleted forks
|
||||
- New gitlab-shell version with custom hooks support
|
||||
- Improve code
|
||||
- GitLab CI 5.2+ support (does not support older versions)
|
||||
- Fixed bug when you can not push commits starting with 000000 to protected branches
|
||||
- Added a password strength indicator
|
||||
- Change project name and path in one form
|
||||
- Display renamed files in diff views (Vinnie Okada)
|
||||
- Fix raw view for public snippets
|
||||
- Use secret token with GitLab internal API.
|
||||
- Add missing timestamps to 'members' table
|
||||
|
||||
v 7.4.3
|
||||
- Fix raw snippets view
|
||||
- Fix security issue for member api
|
||||
- Fix buildbox integration
|
||||
|
||||
v 7.4.2
|
||||
- Fix internal snippet exposing for unauthenticated users
|
||||
|
@ -30,6 +215,7 @@ v 7.4.0
|
|||
- Do not delete tmp/repositories itself during clean-up, only its contents
|
||||
- Support for backup uploads to remote storage
|
||||
- Prevent notes polling when there are not notes
|
||||
- Internal ForkService: Prepare support for fork to a given namespace
|
||||
- API: Add support for forking a project via the API (Bernhard Kaindl)
|
||||
- API: filter project issues by milestone (Julien Bianchi)
|
||||
- Fail harder in the backup script
|
||||
|
@ -53,7 +239,7 @@ v 7.4.0
|
|||
- Fix ambiguous sha problem with mentioned commit
|
||||
- Fixed bug with apostrophe when at mentioning users
|
||||
- Add active directory ldap option
|
||||
- Developers can push to wiki repo. Protected branches does not affect wiki repo any more
|
||||
- Developers can push to wiki repo. Protected branches does not affect wiki repo any more
|
||||
- Faster rev list
|
||||
- Fix branch removal
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ Please send a merge request with a tested solution or a merge request with a fai
|
|||
**[Search the issues](https://gitlab.com/gitlab-org/gitlab-ce/issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format (as the first post):
|
||||
|
||||
1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen)
|
||||
1. **Steps to reproduce:** How can we reproduce the issue, preferably on the [GitLab development virtual machine with vagrant](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/doc/development.md) (start your issue with: `vagrant destroy && vagrant up && vagrant ssh`)
|
||||
1. **Steps to reproduce:** How can we reproduce the issue
|
||||
1. **Expected behavior:** Describe your issue in detail
|
||||
1. **Observed behavior**
|
||||
1. **Relevant logs and/or screenshots:** Please use code blocks (\`\`\`) to format console output, logs, and code as it's very hard to read otherwise.
|
||||
|
@ -63,7 +63,7 @@ If you can, please submit a merge request with the fix or improvements including
|
|||
1. Fork the project on GitLab Cloud
|
||||
1. Create a feature branch
|
||||
1. Write [tests](README.md#run-the-tests) and code
|
||||
1. Add your changes to the [CHANGELOG](CHANGELOG) insert your line at a [random point](doc/workflow/gitlab_flow.md#do-not-order-commits-with-rebase) in the current version
|
||||
1. Add your changes to the [CHANGELOG](CHANGELOG)
|
||||
1. If you are changing the README, some documentation or other things which have no effect on the tests, add `[ci skip]` somewhere in the commit message
|
||||
1. If you have multiple commits please combine them into one commit by [squashing them](http://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)
|
||||
1. Push the commit to your fork
|
||||
|
@ -75,20 +75,49 @@ If you can, please submit a merge request with the fix or improvements including
|
|||
1. Link relevant [issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) and/or [feature requests](http://feedback.gitlab.com/) from the merge request description and leave a comment on them with a link back to the MR
|
||||
1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submission
|
||||
1. If your MR touches code that executes shell commands, make sure it adheres to the [shell command guidelines]( doc/development/shell_commands.md).
|
||||
1. Also have a look at the [shell command guidelines](doc/development/shell_commands.md) if your code reads or opens files, or handles paths to files on disk.
|
||||
|
||||
The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast. Before this time the GitLab B.V. team is still dealing with work that is created by the monthly release such as assisting subscribers with upgrade issues, the release of Enterprise Edition and the upgrade of GitLab Cloud. After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features.
|
||||
|
||||
Please keep the change in a single MR **as small as possible**. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? Can you do part of the refactor? The increased reviewability of small MR's that leads to higher code quality is more important to us than having a minimal commit log. The smaller a MR is the more likely it is it will be merged (quickly), after that you can send more MR's to enhance it.
|
||||
|
||||
For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). If you would like quick feedback on your merge request feel free to mention one of the Merge Marshalls of [the core-team](https://about.gitlab.com/core-team/). Please ensure that your merge request meets the following contribution acceptance criteria.
|
||||
For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). If you would like quick feedback on your merge request feel free to mention one of the Merge Marshalls of [the core-team](https://about.gitlab.com/core-team/). Please ensure that your merge request meets the contribution acceptance criteria.
|
||||
|
||||
**Please format your merge request description as follows:**
|
||||
## Definition of done
|
||||
|
||||
If you contribute to GitLab please know that changes involve more than just code.
|
||||
We have the following [definition of done](http://guide.agilealliance.org/guide/definition-of-done.html).
|
||||
Please ensure you support the feature you contribute through all of these steps.
|
||||
|
||||
1. Description explaning the relevancy (see following item)
|
||||
1. Working and clean code that is commented where needed
|
||||
1. Unit and integration tests that pass on the CI server
|
||||
1. Documented in the /doc directory
|
||||
1. Changelog entry added
|
||||
1. Reviewed and any concerns are addressed
|
||||
1. Merged by the project lead
|
||||
1. Added to the release blog article
|
||||
1. Added to [the website](https://gitlab.com/gitlab-com/www-gitlab-com/) if relevant
|
||||
1. Community questions answered
|
||||
1. Answers to questions radiated (in docs/wiki/etc.)
|
||||
|
||||
If you add a dependency in GitLab (such as an operating system package) please consider updating the following and note the applicability of each in your merge request:
|
||||
|
||||
1. Note the addition in the release blog post (create one if it doesn't exist yet) https://gitlab.com/gitlab-com/www-gitlab-com/merge_requests/
|
||||
1. Upgrade guide, for example https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/7.5-to-7.6.md
|
||||
1. Upgrader https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/upgrader.md#2-run-gitlab-upgrade-tool
|
||||
1. Installation guide https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#1-packages-dependencies
|
||||
1. GitLab Development Kit https://gitlab.com/gitlab-org/gitlab-development-kit
|
||||
1. Test suite https://gitlab.com/gitlab-org/gitlab-ci/blob/master/doc/examples/configure_a_runner_to_run_the_gitlab_ce_test_suite.md
|
||||
1. Omnibus package creator https://gitlab.com/gitlab-org/omnibus-gitlab
|
||||
|
||||
## Merge request description format
|
||||
|
||||
1. What does this MR do?
|
||||
1. Are there points in the code the reviewer needs to double check?
|
||||
1. Why was this MR needed?
|
||||
1. What are the relevant issue numbers / [Feature requests](http://feedback.gitlab.com/)?
|
||||
1. Screenshots (If appropriate)
|
||||
1. Screenshots (if relevant)
|
||||
|
||||
## Contribution acceptance criteria
|
||||
|
||||
|
@ -99,6 +128,7 @@ For examples of feedback on merge requests please look at already [closed merge
|
|||
1. Can merge without problems (if not please merge `master`, never rebase commits pushed to the remote server)
|
||||
1. Does not break any existing functionality
|
||||
1. Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
|
||||
1. Migrations should do only one thing (eg: either create a table, move data to a new table or remove an old table) to aid retrying on failure
|
||||
1. Keeps the GitLab code base clean and well structured
|
||||
1. Contains functionality we think other users will benefit from too
|
||||
1. Doesn't add configuration options since they complicate future changes
|
||||
|
@ -121,5 +151,20 @@ For examples of feedback on merge requests please look at already [closed merge
|
|||
1. [CoffeeScript](https://github.com/thoughtbot/guides/tree/master/style#coffeescript)
|
||||
1. [Shell commands](doc/development/shell_commands.md) created by GitLab contributors to enhance security
|
||||
1. [Markdown](http://www.cirosantilli.com/markdown-styleguide)
|
||||
1. Interface text should be written subjectively instead of objectively. It should be the gitlab core team addressing a person. It should be written in present time and never use past tense (has been/was). For example instead of "prohibited this user from being saved due to the following errors:" the text should be "sorry, we could not create your account because:". Also these [excellent writing guidelines](https://github.com/NARKOZ/guides#writing).
|
||||
|
||||
This is also the style used by linting tools such as [RuboCop](https://github.com/bbatsov/rubocop), [PullReview](https://www.pullreview.com/) and [Hound CI](https://houndci.com).
|
||||
|
||||
## Code of conduct
|
||||
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
||||
|
||||
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
|
||||
|
||||
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior can be
|
||||
reported by emailing contact@gitlab.com
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
||||
|
|
|
@ -1 +1 @@
|
|||
2.1.0
|
||||
2.5.4
|
||||
|
|
50
Gemfile
|
@ -28,22 +28,30 @@ gem 'omniauth-google-oauth2'
|
|||
gem 'omniauth-twitter'
|
||||
gem 'omniauth-github'
|
||||
gem 'omniauth-shibboleth'
|
||||
gem 'omniauth-kerberos'
|
||||
gem 'omniauth-gitlab'
|
||||
gem 'omniauth-bitbucket'
|
||||
gem 'doorkeeper', '2.1.0'
|
||||
gem "rack-oauth2", "~> 1.0.5"
|
||||
|
||||
# Browser detection
|
||||
gem "browser"
|
||||
|
||||
# Extracting information from a git repository
|
||||
# Provide access to Gitlab::Git library
|
||||
gem "gitlab_git", '7.0.0.rc10'
|
||||
gem "gitlab_git", '7.0.0.rc14'
|
||||
|
||||
# Ruby/Rack Git Smart-HTTP Server Handler
|
||||
gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack'
|
||||
gem 'gitlab-grack', '~> 2.0.0.rc2', require: 'grack'
|
||||
|
||||
# LDAP Auth
|
||||
gem 'gitlab_omniauth-ldap', '1.2.0', require: "omniauth-ldap"
|
||||
|
||||
# Git Wiki
|
||||
gem 'gollum-lib', '~> 3.0.0'
|
||||
gem 'gollum-lib', '~> 4.0.0'
|
||||
|
||||
# Language detection
|
||||
gem "gitlab-linguist", "~> 3.0.0", require: "linguist"
|
||||
gem "gitlab-linguist", "~> 3.0.1", require: "linguist"
|
||||
|
||||
# API
|
||||
gem "grape", "~> 0.6.1"
|
||||
|
@ -89,7 +97,7 @@ gem "github-markup"
|
|||
gem 'redcarpet', '~> 3.1.2'
|
||||
gem 'RedCloth'
|
||||
gem 'rdoc', '~>3.6'
|
||||
gem 'org-ruby', '= 0.9.9'
|
||||
gem 'org-ruby', '= 0.9.12'
|
||||
gem 'creole', '~>0.3.6'
|
||||
gem 'wikicloth', '=0.8.1'
|
||||
gem 'asciidoctor', '= 0.1.4'
|
||||
|
@ -112,7 +120,7 @@ gem "acts-as-taggable-on"
|
|||
# Background jobs
|
||||
gem 'slim'
|
||||
gem 'sinatra', require: nil
|
||||
gem 'sidekiq', '2.17.0'
|
||||
gem 'sidekiq', '~> 3.3'
|
||||
|
||||
# HTTP requests
|
||||
gem "httparty"
|
||||
|
@ -134,7 +142,7 @@ gem "redis-rails"
|
|||
gem 'tinder', '~> 1.9.2'
|
||||
|
||||
# HipChat integration
|
||||
gem "hipchat", "~> 0.14.0"
|
||||
gem "hipchat", "~> 1.4.0"
|
||||
|
||||
# Flowdock integration
|
||||
gem "gitlab-flowdock-git-hook", "~> 0.4.2"
|
||||
|
@ -145,9 +153,15 @@ gem "gemnasium-gitlab-service", "~> 0.2"
|
|||
# Slack integration
|
||||
gem "slack-notifier", "~> 1.0.0"
|
||||
|
||||
# Asana integration
|
||||
gem 'asana', '~> 0.0.6'
|
||||
|
||||
# d3
|
||||
gem "d3_rails", "~> 3.1.4"
|
||||
|
||||
#cal-heatmap
|
||||
gem "cal-heatmap-rails", "~> 0.0.1"
|
||||
|
||||
# underscore-rails
|
||||
gem "underscore-rails", "~> 1.4.4"
|
||||
|
||||
|
@ -163,13 +177,9 @@ gem 'ace-rails-ap'
|
|||
# Keyboard shortcuts
|
||||
gem 'mousetrap-rails'
|
||||
|
||||
# Semantic UI Sass for Sidebar
|
||||
gem 'semantic-ui-sass', '~> 0.16.1.0'
|
||||
|
||||
gem "sass-rails", '~> 4.0.2'
|
||||
gem "coffee-rails"
|
||||
gem "uglifier"
|
||||
gem "therubyracer"
|
||||
gem 'turbolinks'
|
||||
gem 'jquery-turbolinks'
|
||||
|
||||
|
@ -193,13 +203,12 @@ group :development do
|
|||
gem "letter_opener"
|
||||
gem 'quiet_assets', '~> 1.0.1'
|
||||
gem 'rack-mini-profiler', require: false
|
||||
gem "byebug"
|
||||
|
||||
# Better errors handler
|
||||
gem 'better_errors'
|
||||
gem 'binding_of_caller'
|
||||
|
||||
gem 'rails_best_practices'
|
||||
|
||||
# Docs generator
|
||||
gem "sdoc"
|
||||
|
||||
|
@ -209,11 +218,12 @@ end
|
|||
|
||||
group :development, :test do
|
||||
gem 'coveralls', require: false
|
||||
gem 'rubocop', '0.28.0', require: false
|
||||
# gem 'rails-dev-tweaks'
|
||||
gem 'spinach-rails'
|
||||
gem "rspec-rails"
|
||||
gem "rspec-rails", '2.99'
|
||||
gem "capybara", '~> 2.2.1'
|
||||
gem "pry"
|
||||
gem "pry-rails"
|
||||
gem "awesome_print"
|
||||
gem "database_cleaner"
|
||||
gem "launchy"
|
||||
|
@ -239,14 +249,14 @@ group :development, :test do
|
|||
|
||||
gem 'jasmine', '2.0.2'
|
||||
|
||||
gem "spring", '1.1.3'
|
||||
gem "spring-commands-rspec", '1.0.1'
|
||||
gem "spring", '1.3.1'
|
||||
gem "spring-commands-rspec", '1.0.4'
|
||||
gem "spring-commands-spinach", '1.0.0'
|
||||
end
|
||||
|
||||
group :test do
|
||||
gem "simplecov", require: false
|
||||
gem "shoulda-matchers", "~> 2.1.0"
|
||||
gem "shoulda-matchers", "~> 2.7.0"
|
||||
gem 'email_spec'
|
||||
gem "webmock"
|
||||
gem 'test_after_commit'
|
||||
|
@ -254,6 +264,10 @@ end
|
|||
|
||||
group :production do
|
||||
gem "gitlab_meta", '7.0'
|
||||
gem "therubyracer"
|
||||
end
|
||||
|
||||
gem "newrelic_rpm"
|
||||
|
||||
gem 'octokit', '3.7.0'
|
||||
gem "rugments"
|
||||
|
|
309
Gemfile.lock
|
@ -3,27 +3,31 @@ GEM
|
|||
specs:
|
||||
RedCloth (4.2.9)
|
||||
ace-rails-ap (2.0.1)
|
||||
actionmailer (4.1.1)
|
||||
actionpack (= 4.1.1)
|
||||
actionview (= 4.1.1)
|
||||
mail (~> 2.5.4)
|
||||
actionpack (4.1.1)
|
||||
actionview (= 4.1.1)
|
||||
activesupport (= 4.1.1)
|
||||
actionmailer (4.1.9)
|
||||
actionpack (= 4.1.9)
|
||||
actionview (= 4.1.9)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
actionpack (4.1.9)
|
||||
actionview (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
rack (~> 1.5.2)
|
||||
rack-test (~> 0.6.2)
|
||||
actionview (4.1.1)
|
||||
activesupport (= 4.1.1)
|
||||
actionview (4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
activemodel (4.1.1)
|
||||
activesupport (= 4.1.1)
|
||||
activemodel (4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.1.1)
|
||||
activemodel (= 4.1.1)
|
||||
activesupport (= 4.1.1)
|
||||
activerecord (4.1.9)
|
||||
activemodel (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
arel (~> 5.0.0)
|
||||
activesupport (4.1.1)
|
||||
activeresource (4.0.0)
|
||||
activemodel (~> 4.0)
|
||||
activesupport (~> 4.0)
|
||||
rails-observers (~> 0.1.1)
|
||||
activesupport (4.1.9)
|
||||
i18n (~> 0.6, >= 0.6.9)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
|
@ -36,7 +40,16 @@ GEM
|
|||
activerecord (>= 2.3.0)
|
||||
rake (>= 0.8.7)
|
||||
arel (5.0.1.20140414130214)
|
||||
asana (0.0.6)
|
||||
activeresource (>= 3.2.3)
|
||||
asciidoctor (0.1.4)
|
||||
ast (2.0.0)
|
||||
astrolabe (1.3.0)
|
||||
parser (>= 2.2.0.pre.3, < 3.0)
|
||||
attr_required (1.0.0)
|
||||
autoprefixer-rails (5.1.6)
|
||||
execjs
|
||||
json
|
||||
awesome_print (1.2.0)
|
||||
axiom-types (0.0.5)
|
||||
descendants_tracker (~> 0.0.1)
|
||||
|
@ -47,9 +60,15 @@ GEM
|
|||
erubis (>= 2.6.6)
|
||||
binding_of_caller (0.7.2)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bootstrap-sass (3.0.3.0)
|
||||
sass (~> 3.2)
|
||||
bootstrap-sass (3.3.3)
|
||||
autoprefixer-rails (>= 5.0.0.1)
|
||||
sass (>= 3.2.19)
|
||||
browser (0.7.2)
|
||||
builder (3.2.2)
|
||||
byebug (3.2.0)
|
||||
columnize (~> 0.8)
|
||||
debugger-linecache (~> 1.2)
|
||||
cal-heatmap-rails (0.0.1)
|
||||
capybara (2.2.1)
|
||||
mime-types (>= 1.16)
|
||||
nokogiri (>= 1.3.3)
|
||||
|
@ -60,12 +79,10 @@ GEM
|
|||
activemodel (>= 3.2.0)
|
||||
activesupport (>= 3.2.0)
|
||||
json (>= 1.7)
|
||||
celluloid (0.15.2)
|
||||
timers (~> 1.1.0)
|
||||
celluloid (0.16.0)
|
||||
timers (~> 4.0.0)
|
||||
charlock_holmes (0.6.9.4)
|
||||
cliver (0.3.2)
|
||||
code_analyzer (0.4.3)
|
||||
sexp_processor
|
||||
coderay (1.1.0)
|
||||
coercible (1.0.0)
|
||||
descendants_tracker (~> 0.0.1)
|
||||
|
@ -78,7 +95,8 @@ GEM
|
|||
coffee-script-source (1.6.3)
|
||||
colored (1.2)
|
||||
colorize (0.5.8)
|
||||
connection_pool (1.2.0)
|
||||
columnize (0.9.0)
|
||||
connection_pool (2.1.0)
|
||||
coveralls (0.7.0)
|
||||
multi_json (~> 1.3)
|
||||
rest-client
|
||||
|
@ -93,6 +111,7 @@ GEM
|
|||
daemons (1.1.9)
|
||||
database_cleaner (1.3.0)
|
||||
debug_inspector (0.0.2)
|
||||
debugger-linecache (1.2.0)
|
||||
default_value_for (3.0.0)
|
||||
activerecord (>= 3.2.0, < 5.0)
|
||||
descendants_tracker (0.0.3)
|
||||
|
@ -107,6 +126,8 @@ GEM
|
|||
diff-lcs (1.2.5)
|
||||
diffy (3.0.3)
|
||||
docile (1.1.5)
|
||||
doorkeeper (2.1.0)
|
||||
railties (>= 3.1)
|
||||
dotenv (0.9.0)
|
||||
dropzonejs-rails (0.4.14)
|
||||
rails (> 3.1)
|
||||
|
@ -120,7 +141,7 @@ GEM
|
|||
equalizer (0.0.8)
|
||||
erubis (2.7.0)
|
||||
escape_utils (0.2.4)
|
||||
eventmachine (1.0.3)
|
||||
eventmachine (1.0.4)
|
||||
excon (0.32.1)
|
||||
execjs (2.0.2)
|
||||
expression_parser (0.9.0)
|
||||
|
@ -158,43 +179,46 @@ GEM
|
|||
dotenv (>= 0.7)
|
||||
thor (>= 0.13.6)
|
||||
formatador (0.2.4)
|
||||
gemnasium-gitlab-service (0.2.2)
|
||||
rugged (~> 0.19)
|
||||
gemnasium-gitlab-service (0.2.4)
|
||||
rugged (~> 0.21)
|
||||
gherkin-ruby (0.3.1)
|
||||
racc
|
||||
github-markup (1.1.0)
|
||||
github-markup (1.3.1)
|
||||
posix-spawn (~> 0.3.8)
|
||||
gitlab-flowdock-git-hook (0.4.2.2)
|
||||
gitlab-grit (>= 2.4.1)
|
||||
multi_json
|
||||
gitlab-grack (2.0.0.pre)
|
||||
gitlab-grack (2.0.0.rc2)
|
||||
rack (~> 1.5.1)
|
||||
gitlab-grit (2.6.12)
|
||||
gitlab-grit (2.7.2)
|
||||
charlock_holmes (~> 0.6)
|
||||
diff-lcs (~> 1.1)
|
||||
mime-types (~> 1.15)
|
||||
posix-spawn (~> 0.3)
|
||||
gitlab-linguist (3.0.0)
|
||||
gitlab-linguist (3.0.1)
|
||||
charlock_holmes (~> 0.6.6)
|
||||
escape_utils (~> 0.2.4)
|
||||
mime-types (~> 1.19)
|
||||
gitlab_emoji (0.0.1.1)
|
||||
emoji (~> 1.0.1)
|
||||
gitlab_git (7.0.0.rc10)
|
||||
gitlab_git (7.0.0.rc14)
|
||||
activesupport (~> 4.0)
|
||||
charlock_holmes (~> 0.6)
|
||||
gitlab-linguist (~> 3.0)
|
||||
rugged (~> 0.21.0)
|
||||
rugged (~> 0.21.2)
|
||||
gitlab_meta (7.0)
|
||||
gitlab_omniauth-ldap (1.2.0)
|
||||
net-ldap (~> 0.9)
|
||||
omniauth (~> 1.0)
|
||||
pyu-ruby-sasl (~> 0.0.3.1)
|
||||
rubyntlm (~> 0.3)
|
||||
gollum-lib (3.0.0)
|
||||
github-markup (~> 1.1.0)
|
||||
gitlab-grit (~> 2.6.5)
|
||||
nokogiri (~> 1.6.1)
|
||||
rouge (~> 1.3.3)
|
||||
gollum-grit_adapter (0.1.0)
|
||||
gitlab-grit (~> 2.7.1)
|
||||
gollum-lib (4.0.0)
|
||||
github-markup (~> 1.3.1)
|
||||
gollum-grit_adapter (~> 0.1.0)
|
||||
nokogiri (~> 1.6.4)
|
||||
rouge (~> 1.7.4)
|
||||
sanitize (~> 2.1.0)
|
||||
stringex (~> 2.5.1)
|
||||
gon (5.0.1)
|
||||
|
@ -235,9 +259,9 @@ GEM
|
|||
railties (>= 4.0.1)
|
||||
hashie (2.1.2)
|
||||
hike (1.2.3)
|
||||
hipchat (0.14.0)
|
||||
httparty
|
||||
hipchat (1.4.0)
|
||||
httparty
|
||||
hitimes (1.2.2)
|
||||
html-pipeline (1.11.0)
|
||||
activesupport (>= 2)
|
||||
nokogiri (~> 1.4)
|
||||
|
@ -251,7 +275,8 @@ GEM
|
|||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
httpauth (0.2.1)
|
||||
i18n (0.6.11)
|
||||
httpclient (2.5.3.3)
|
||||
i18n (0.7.0)
|
||||
ice_nine (0.10.0)
|
||||
jasmine (2.0.2)
|
||||
jasmine-core (~> 2.0.0)
|
||||
|
@ -270,29 +295,28 @@ GEM
|
|||
turbolinks
|
||||
jquery-ui-rails (4.2.1)
|
||||
railties (>= 3.2.16)
|
||||
json (1.8.1)
|
||||
json (1.8.2)
|
||||
jwt (0.1.13)
|
||||
multi_json (>= 1.5)
|
||||
kaminari (0.15.1)
|
||||
actionpack (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
kgio (2.8.1)
|
||||
kgio (2.9.2)
|
||||
launchy (2.4.2)
|
||||
addressable (~> 2.3)
|
||||
letter_opener (1.1.2)
|
||||
launchy (~> 2.2)
|
||||
libv8 (3.16.14.3)
|
||||
libv8 (3.16.14.7)
|
||||
listen (2.3.1)
|
||||
celluloid (>= 0.15.2)
|
||||
rb-fsevent (>= 0.9.3)
|
||||
rb-inotify (>= 0.9)
|
||||
lumberjack (1.0.4)
|
||||
mail (2.5.4)
|
||||
mime-types (~> 1.16)
|
||||
treetop (~> 1.4.8)
|
||||
mail (2.6.3)
|
||||
mime-types (>= 1.16, < 3)
|
||||
method_source (0.8.2)
|
||||
mime-types (1.25.1)
|
||||
mini_portile (0.6.0)
|
||||
mini_portile (0.6.1)
|
||||
minitest (5.3.5)
|
||||
mousetrap-rails (1.4.6)
|
||||
multi_json (1.10.1)
|
||||
|
@ -304,8 +328,8 @@ GEM
|
|||
net-ssh (>= 2.6.5)
|
||||
net-ssh (2.8.0)
|
||||
newrelic_rpm (3.9.4.245)
|
||||
nokogiri (1.6.2.1)
|
||||
mini_portile (= 0.6.0)
|
||||
nokogiri (1.6.5)
|
||||
mini_portile (~> 0.6.0)
|
||||
nprogress-rails (0.1.2.3)
|
||||
oauth (0.4.7)
|
||||
oauth2 (0.8.1)
|
||||
|
@ -314,15 +338,29 @@ GEM
|
|||
jwt (~> 0.1.4)
|
||||
multi_json (~> 1.0)
|
||||
rack (~> 1.2)
|
||||
octokit (3.7.0)
|
||||
sawyer (~> 0.6.0, >= 0.5.3)
|
||||
omniauth (1.1.4)
|
||||
hashie (>= 1.2, < 3)
|
||||
rack
|
||||
omniauth-bitbucket (0.0.2)
|
||||
multi_json (~> 1.7)
|
||||
omniauth (~> 1.1)
|
||||
omniauth-oauth (~> 1.0)
|
||||
omniauth-github (1.1.1)
|
||||
omniauth (~> 1.0)
|
||||
omniauth-oauth2 (~> 1.1)
|
||||
omniauth-gitlab (1.0.0)
|
||||
omniauth (~> 1.0)
|
||||
omniauth-oauth2 (~> 1.0)
|
||||
omniauth-google-oauth2 (0.2.5)
|
||||
omniauth (> 1.0)
|
||||
omniauth-oauth2 (~> 1.1)
|
||||
omniauth-kerberos (0.2.0)
|
||||
omniauth-multipassword
|
||||
timfel-krb5-auth (~> 0.8)
|
||||
omniauth-multipassword (0.4.1)
|
||||
omniauth (~> 1.0)
|
||||
omniauth-oauth (1.0.1)
|
||||
oauth
|
||||
omniauth (~> 1.0)
|
||||
|
@ -334,9 +372,11 @@ GEM
|
|||
omniauth-twitter (1.0.1)
|
||||
multi_json (~> 1.3)
|
||||
omniauth-oauth (~> 1.0)
|
||||
org-ruby (0.9.9)
|
||||
org-ruby (0.9.12)
|
||||
rubypants (~> 0.2)
|
||||
orm_adapter (0.5.0)
|
||||
parser (2.2.0.2)
|
||||
ast (>= 1.1, < 3.0)
|
||||
pg (0.15.1)
|
||||
phantomjs (1.9.2.0)
|
||||
poltergeist (1.5.1)
|
||||
|
@ -344,12 +384,14 @@ GEM
|
|||
cliver (~> 0.3.1)
|
||||
multi_json (~> 1.0)
|
||||
websocket-driver (>= 0.2.0)
|
||||
polyglot (0.3.4)
|
||||
posix-spawn (0.3.9)
|
||||
powerpack (0.0.9)
|
||||
pry (0.9.12.4)
|
||||
coderay (~> 1.0)
|
||||
method_source (~> 0.8)
|
||||
slop (~> 3.4)
|
||||
pry-rails (0.3.2)
|
||||
pry (>= 0.9.10)
|
||||
pyu-ruby-sasl (0.0.3.3)
|
||||
quiet_assets (1.0.2)
|
||||
railties (>= 3.1, < 5.0)
|
||||
|
@ -357,45 +399,45 @@ GEM
|
|||
rack (1.5.2)
|
||||
rack-accept (0.4.5)
|
||||
rack (>= 0.4)
|
||||
rack-attack (2.3.0)
|
||||
rack-attack (4.2.0)
|
||||
rack
|
||||
rack-cors (0.2.9)
|
||||
rack-mini-profiler (0.9.0)
|
||||
rack (>= 1.1.3)
|
||||
rack-mount (0.8.3)
|
||||
rack (>= 1.0.0)
|
||||
rack-oauth2 (1.0.8)
|
||||
activesupport (>= 2.3)
|
||||
attr_required (>= 0.0.5)
|
||||
httpclient (>= 2.2.0.2)
|
||||
multi_json (>= 1.3.6)
|
||||
rack (>= 1.1)
|
||||
rack-protection (1.5.1)
|
||||
rack
|
||||
rack-test (0.6.2)
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.1.1)
|
||||
actionmailer (= 4.1.1)
|
||||
actionpack (= 4.1.1)
|
||||
actionview (= 4.1.1)
|
||||
activemodel (= 4.1.1)
|
||||
activerecord (= 4.1.1)
|
||||
activesupport (= 4.1.1)
|
||||
rails (4.1.9)
|
||||
actionmailer (= 4.1.9)
|
||||
actionpack (= 4.1.9)
|
||||
actionview (= 4.1.9)
|
||||
activemodel (= 4.1.9)
|
||||
activerecord (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.1.1)
|
||||
railties (= 4.1.9)
|
||||
sprockets-rails (~> 2.0)
|
||||
rails-observers (0.1.2)
|
||||
activemodel (~> 4.0)
|
||||
rails_autolink (1.1.6)
|
||||
rails (> 3.1)
|
||||
rails_best_practices (1.14.4)
|
||||
activesupport
|
||||
awesome_print
|
||||
code_analyzer (>= 0.4.3)
|
||||
colored
|
||||
erubis
|
||||
i18n
|
||||
require_all
|
||||
ruby-progressbar
|
||||
railties (4.1.1)
|
||||
actionpack (= 4.1.1)
|
||||
activesupport (= 4.1.1)
|
||||
railties (4.1.9)
|
||||
actionpack (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
raindrops (0.12.0)
|
||||
rake (10.3.2)
|
||||
rainbow (2.0.0)
|
||||
raindrops (0.13.0)
|
||||
rake (10.4.2)
|
||||
raphael-rails (2.1.2)
|
||||
rb-fsevent (0.9.3)
|
||||
rb-inotify (0.9.2)
|
||||
|
@ -403,7 +445,7 @@ GEM
|
|||
rdoc (3.12.2)
|
||||
json (~> 1.4)
|
||||
redcarpet (3.1.2)
|
||||
redis (3.0.6)
|
||||
redis (3.1.0)
|
||||
redis-actionpack (4.0.0)
|
||||
actionpack (~> 4)
|
||||
redis-rack (~> 1.5.0)
|
||||
|
@ -411,8 +453,8 @@ GEM
|
|||
redis-activesupport (4.0.0)
|
||||
activesupport (~> 4)
|
||||
redis-store (~> 1.1.0)
|
||||
redis-namespace (1.4.1)
|
||||
redis (~> 3.0.4)
|
||||
redis-namespace (1.5.1)
|
||||
redis (~> 3.0, >= 3.0.4)
|
||||
redis-rack (1.5.0)
|
||||
rack (~> 1.5)
|
||||
redis-store (~> 1.1.0)
|
||||
|
@ -424,30 +466,40 @@ GEM
|
|||
redis (>= 2.2)
|
||||
ref (1.0.5)
|
||||
request_store (1.0.5)
|
||||
require_all (1.3.2)
|
||||
rest-client (1.6.7)
|
||||
mime-types (>= 1.16)
|
||||
rinku (1.7.3)
|
||||
rouge (1.3.3)
|
||||
rspec (2.14.1)
|
||||
rspec-core (~> 2.14.0)
|
||||
rspec-expectations (~> 2.14.0)
|
||||
rspec-mocks (~> 2.14.0)
|
||||
rspec-core (2.14.7)
|
||||
rspec-expectations (2.14.4)
|
||||
rouge (1.7.4)
|
||||
rspec (2.99.0)
|
||||
rspec-core (~> 2.99.0)
|
||||
rspec-expectations (~> 2.99.0)
|
||||
rspec-mocks (~> 2.99.0)
|
||||
rspec-collection_matchers (1.1.2)
|
||||
rspec-expectations (>= 2.99.0.beta1)
|
||||
rspec-core (2.99.2)
|
||||
rspec-expectations (2.99.2)
|
||||
diff-lcs (>= 1.1.3, < 2.0)
|
||||
rspec-mocks (2.14.4)
|
||||
rspec-rails (2.14.0)
|
||||
rspec-mocks (2.99.3)
|
||||
rspec-rails (2.99.0)
|
||||
actionpack (>= 3.0)
|
||||
activemodel (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
railties (>= 3.0)
|
||||
rspec-core (~> 2.14.0)
|
||||
rspec-expectations (~> 2.14.0)
|
||||
rspec-mocks (~> 2.14.0)
|
||||
ruby-progressbar (1.2.0)
|
||||
rspec-collection_matchers
|
||||
rspec-core (~> 2.99.0)
|
||||
rspec-expectations (~> 2.99.0)
|
||||
rspec-mocks (~> 2.99.0)
|
||||
rubocop (0.28.0)
|
||||
astrolabe (~> 1.3)
|
||||
parser (>= 2.2.0.pre.7, < 3.0)
|
||||
powerpack (~> 0.0.6)
|
||||
rainbow (>= 1.99.1, < 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
ruby-progressbar (1.7.1)
|
||||
rubyntlm (0.4.0)
|
||||
rubypants (0.2.0)
|
||||
rugged (0.21.0)
|
||||
rugged (0.21.4)
|
||||
rugments (1.0.0.beta3)
|
||||
safe_yaml (0.9.7)
|
||||
sanitize (2.1.0)
|
||||
nokogiri (>= 1.4.4)
|
||||
|
@ -457,6 +509,9 @@ GEM
|
|||
sass (~> 3.2.0)
|
||||
sprockets (~> 2.8, <= 2.11.0)
|
||||
sprockets-rails (~> 2.0)
|
||||
sawyer (0.6.0)
|
||||
addressable (~> 2.3.5)
|
||||
faraday (~> 0.8, < 0.10)
|
||||
sdoc (0.3.20)
|
||||
json (>= 1.1.3)
|
||||
rdoc (~> 3.10)
|
||||
|
@ -465,17 +520,14 @@ GEM
|
|||
activesupport (>= 3.1, < 4.2)
|
||||
select2-rails (3.5.2)
|
||||
thor (~> 0.14)
|
||||
semantic-ui-sass (0.16.1.0)
|
||||
sass (~> 3.2)
|
||||
settingslogic (2.0.9)
|
||||
sexp_processor (4.4.0)
|
||||
shoulda-matchers (2.1.0)
|
||||
shoulda-matchers (2.7.0)
|
||||
activesupport (>= 3.0.0)
|
||||
sidekiq (2.17.0)
|
||||
celluloid (>= 0.15.2)
|
||||
connection_pool (>= 1.0.0)
|
||||
sidekiq (3.3.0)
|
||||
celluloid (>= 0.16.0)
|
||||
connection_pool (>= 2.0.0)
|
||||
json
|
||||
redis (>= 3.0.4)
|
||||
redis (>= 3.0.6)
|
||||
redis-namespace (>= 1.3.1)
|
||||
simple_oauth (0.1.9)
|
||||
simplecov (0.9.0)
|
||||
|
@ -492,7 +544,7 @@ GEM
|
|||
slim (2.0.2)
|
||||
temple (~> 0.6.6)
|
||||
tilt (>= 1.3.3, < 2.1)
|
||||
slop (3.4.7)
|
||||
slop (3.6.0)
|
||||
spinach (0.8.7)
|
||||
colorize (= 0.5.8)
|
||||
gherkin-ruby (>= 0.3.1)
|
||||
|
@ -500,8 +552,8 @@ GEM
|
|||
capybara (>= 2.0.0)
|
||||
railties (>= 3)
|
||||
spinach (>= 0.4)
|
||||
spring (1.1.3)
|
||||
spring-commands-rspec (1.0.1)
|
||||
spring (1.3.1)
|
||||
spring-commands-rspec (1.0.4)
|
||||
spring (>= 0.9.1)
|
||||
spring-commands-spinach (1.0.0)
|
||||
spring (>= 0.9.1)
|
||||
|
@ -510,13 +562,13 @@ GEM
|
|||
multi_json (~> 1.0)
|
||||
rack (~> 1.0)
|
||||
tilt (~> 1.1, != 1.3.0)
|
||||
sprockets-rails (2.1.3)
|
||||
sprockets-rails (2.2.4)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
sprockets (~> 2.8)
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
stamp (0.5.0)
|
||||
state_machine (1.2.0)
|
||||
stringex (2.5.1)
|
||||
stringex (2.5.2)
|
||||
temple (0.6.7)
|
||||
term-ansicolor (1.2.2)
|
||||
tins (~> 0.8)
|
||||
|
@ -531,7 +583,9 @@ GEM
|
|||
thor (0.19.1)
|
||||
thread_safe (0.3.4)
|
||||
tilt (1.4.1)
|
||||
timers (1.1.0)
|
||||
timers (4.0.1)
|
||||
hitimes
|
||||
timfel-krb5-auth (0.8.3)
|
||||
tinder (1.9.3)
|
||||
eventmachine (~> 1.0)
|
||||
faraday (~> 0.8)
|
||||
|
@ -542,9 +596,6 @@ GEM
|
|||
multi_json (~> 1.7)
|
||||
twitter-stream (~> 0.1)
|
||||
tins (0.13.1)
|
||||
treetop (1.4.15)
|
||||
polyglot
|
||||
polyglot (>= 0.3.1)
|
||||
turbolinks (2.0.0)
|
||||
coffee-rails
|
||||
twitter-stream (0.1.16)
|
||||
|
@ -594,11 +645,15 @@ DEPENDENCIES
|
|||
acts-as-taggable-on
|
||||
addressable
|
||||
annotate (~> 2.6.0.beta2)
|
||||
asana (~> 0.0.6)
|
||||
asciidoctor (= 0.1.4)
|
||||
awesome_print
|
||||
better_errors
|
||||
binding_of_caller
|
||||
bootstrap-sass (~> 3.0)
|
||||
browser
|
||||
byebug
|
||||
cal-heatmap-rails (~> 0.0.1)
|
||||
capybara (~> 2.2.1)
|
||||
carrierwave
|
||||
coffee-rails
|
||||
|
@ -611,6 +666,7 @@ DEPENDENCIES
|
|||
devise (= 3.2.4)
|
||||
devise-async (= 0.9.0)
|
||||
diffy (~> 3.0.3)
|
||||
doorkeeper (= 2.1.0)
|
||||
dropzonejs-rails
|
||||
email_spec
|
||||
enumerize
|
||||
|
@ -622,13 +678,13 @@ DEPENDENCIES
|
|||
gemnasium-gitlab-service (~> 0.2)
|
||||
github-markup
|
||||
gitlab-flowdock-git-hook (~> 0.4.2)
|
||||
gitlab-grack (~> 2.0.0.pre)
|
||||
gitlab-linguist (~> 3.0.0)
|
||||
gitlab-grack (~> 2.0.0.rc2)
|
||||
gitlab-linguist (~> 3.0.1)
|
||||
gitlab_emoji (~> 0.0.1.1)
|
||||
gitlab_git (= 7.0.0.rc10)
|
||||
gitlab_git (= 7.0.0.rc14)
|
||||
gitlab_meta (= 7.0)
|
||||
gitlab_omniauth-ldap (= 1.2.0)
|
||||
gollum-lib (~> 3.0.0)
|
||||
gollum-lib (~> 4.0.0)
|
||||
gon (~> 5.0.0)
|
||||
grape (~> 0.6.1)
|
||||
grape-entity (~> 0.4.2)
|
||||
|
@ -636,7 +692,7 @@ DEPENDENCIES
|
|||
guard-rspec
|
||||
guard-spinach
|
||||
haml-rails
|
||||
hipchat (~> 0.14.0)
|
||||
hipchat (~> 1.4.0)
|
||||
html-pipeline-gitlab (~> 0.1.0)
|
||||
httparty
|
||||
jasmine (= 2.0.2)
|
||||
|
@ -653,22 +709,26 @@ DEPENDENCIES
|
|||
mysql2
|
||||
newrelic_rpm
|
||||
nprogress-rails
|
||||
octokit (= 3.7.0)
|
||||
omniauth (~> 1.1.3)
|
||||
omniauth-bitbucket
|
||||
omniauth-github
|
||||
omniauth-gitlab
|
||||
omniauth-google-oauth2
|
||||
omniauth-kerberos
|
||||
omniauth-shibboleth
|
||||
omniauth-twitter
|
||||
org-ruby (= 0.9.9)
|
||||
org-ruby (= 0.9.12)
|
||||
pg
|
||||
poltergeist (~> 1.5.1)
|
||||
pry
|
||||
pry-rails
|
||||
quiet_assets (~> 1.0.1)
|
||||
rack-attack
|
||||
rack-cors
|
||||
rack-mini-profiler
|
||||
rack-oauth2 (~> 1.0.5)
|
||||
rails (~> 4.1.0)
|
||||
rails_autolink (~> 1.1)
|
||||
rails_best_practices
|
||||
raphael-rails (~> 2.1.2)
|
||||
rb-fsevent
|
||||
rb-inotify
|
||||
|
@ -676,24 +736,25 @@ DEPENDENCIES
|
|||
redcarpet (~> 3.1.2)
|
||||
redis-rails
|
||||
request_store
|
||||
rspec-rails
|
||||
rspec-rails (= 2.99)
|
||||
rubocop (= 0.28.0)
|
||||
rugments
|
||||
sanitize (~> 2.0)
|
||||
sass-rails (~> 4.0.2)
|
||||
sdoc
|
||||
seed-fu
|
||||
select2-rails
|
||||
semantic-ui-sass (~> 0.16.1.0)
|
||||
settingslogic
|
||||
shoulda-matchers (~> 2.1.0)
|
||||
sidekiq (= 2.17.0)
|
||||
shoulda-matchers (~> 2.7.0)
|
||||
sidekiq (~> 3.3)
|
||||
simplecov
|
||||
sinatra
|
||||
six
|
||||
slack-notifier (~> 1.0.0)
|
||||
slim
|
||||
spinach-rails
|
||||
spring (= 1.1.3)
|
||||
spring-commands-rspec (= 1.0.1)
|
||||
spring (= 1.3.1)
|
||||
spring-commands-rspec (= 1.0.4)
|
||||
spring-commands-spinach (= 1.0.0)
|
||||
stamp
|
||||
state_machine
|
||||
|
|
|
@ -71,7 +71,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue
|
|||
|
||||
### Feature requests
|
||||
|
||||
Thank you for your interest in improving GitLab. We don't use the issue tracker for feature requests. Things that are wrong but are not a regression compared to older versions of GitLab are considered feature requests and not issues. Please use the [feature request forum](http://feedback.gitlab.com/) for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
|
||||
Thank you for your interest in improving GitLab. We don't use the issue tracker for feature requests. Things that are wrong but are not a regression compared to older versions of GitLab are considered feature requests and not issues. Please use the \[feature request forum\]\(http://feedback.gitlab.com/) for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
|
||||
|
||||
### Issue report for old version
|
||||
|
||||
|
@ -104,3 +104,10 @@ This merge request has been closed because a request for more information has no
|
|||
### Accepting merge requests
|
||||
|
||||
Is there a request on [the feature request forum](http://feedback.gitlab.com/forums/176466-general) that is similar to this? If so, can you make a comment with a link to it? Please be aware that new functionality that is not marked [accepting merge/pull requests](http://feedback.gitlab.com/forums/176466-general/status/796455) on the forum might not make it into GitLab. You might be asked to make changes and even after implementing them your feature might still be declined. If you want to reduce the chance of this happening please have a discussion in the forum first.
|
||||
|
||||
### Only accepting merge requests with green tests
|
||||
|
||||
We can only accept a merge request if all the tests are green. I've just
|
||||
restarted the build. When the tests are still not passing after this restart and
|
||||
you're sure that is does not have anything to do with your code changes, please
|
||||
rebase with master to see if that solves the issue.
|
||||
|
|
2
Procfile
|
@ -1,2 +1,2 @@
|
|||
web: bundle exec unicorn_rails -p ${PORT:="3000"} -E ${RAILS_ENV:="development"} -c ${UNICORN_CONFIG:="config/unicorn.rb"}
|
||||
worker: bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,common,default,gitlab_shell
|
||||
worker: bundle exec sidekiq -q post_receive -q mailer -q system_hook -q project_web_hook -q gitlab_shell -q common -q default
|
||||
|
|
92
README.md
|
@ -9,11 +9,19 @@
|
|||
- Each project can also have an issue tracker and a wiki
|
||||
- Used by more than 100,000 organizations, GitLab is the most popular solution to manage Git repositories on-premises
|
||||
- Completely free and open source (MIT Expat license)
|
||||
- Powered by Ruby on Rails
|
||||
- Powered by [Ruby on Rails](https://github.com/rails/rails)
|
||||
|
||||
## Editions
|
||||
|
||||
There are two editions of GitLab.
|
||||
*GitLab [Community Edition](https://about.gitlab.com/features/) (CE)* is available without any costs under an MIT license.
|
||||
|
||||
*GitLab Enterprise Edition (EE)* includes [extra features](https://about.gitlab.com/features/#compare) that are most useful for organizations with more than 100 users.
|
||||
To get access to the EE and support please [become a subscriber](https://about.gitlab.com/pricing/).
|
||||
|
||||
## Canonical source
|
||||
|
||||
- The source of GitLab Community Edition is [hosted on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/) and there are mirrors to make [contributing](CONTRIBUTING.md) as easy as possible.
|
||||
The source of GitLab Community Edition is [hosted on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/) and there are mirrors to make [contributing](CONTRIBUTING.md) as easy as possible.
|
||||
|
||||
## Code status
|
||||
|
||||
|
@ -40,81 +48,45 @@ On [about.gitlab.com](https://about.gitlab.com/) you can find more information a
|
|||
|
||||
## Requirements
|
||||
|
||||
- Ubuntu/Debian/CentOS/RHEL**
|
||||
- ruby 2.0+
|
||||
- git 1.7.10+
|
||||
- redis 2.0+
|
||||
GitLab requires the following software:
|
||||
|
||||
- Ubuntu/Debian/CentOS/RHEL
|
||||
- Ruby (MRI) 2.0 or 2.1
|
||||
- Git 1.7.10+
|
||||
- Redis 2.0+
|
||||
- MySQL or PostgreSQL
|
||||
|
||||
** More details are in the [requirements doc](doc/install/requirements.md).
|
||||
Please see the [requirements documentation](doc/install/requirements.md) for system requirements and more information about the supported operating systems.
|
||||
|
||||
## Installation
|
||||
|
||||
Please see [the installation page on the GitLab website](https://about.gitlab.com/installation/) for the various options.
|
||||
Since a manual installation is a lot of work and error prone we strongly recommend the fast and reliable [Omnibus package installation](https://about.gitlab.com/downloads/) (deb/rpm).
|
||||
The recommended way to install GitLab is using the provided [Omnibus packages](https://about.gitlab.com/downloads/). Compared to an installation from source, this is faster and less error prone. Just select your operating system, download the respective package (Debian or RPM) and install it using the system's package manager.
|
||||
|
||||
There are various other options to install GitLab, please refer to the [installation page on the GitLab website](https://about.gitlab.com/installation/) for more information.
|
||||
|
||||
You can access a new installation with the login **`root`** and password **`5iveL!fe`**, after login you are required to set a unique password.
|
||||
|
||||
## Third-party applications
|
||||
|
||||
There are a lot of applications and API wrappers for GitLab.
|
||||
Find them [on our website](https://about.gitlab.com/applications/).
|
||||
There are a lot of [third-party applications integrating with GitLab](https://about.gitlab.com/applications/). These include GUI Git clients, mobile applications and API wrappers for various languages.
|
||||
|
||||
### New versions
|
||||
## GitLab release cycle
|
||||
|
||||
Since 2011 a minor or major version of GitLab is released on the 22nd of every month. Patch and security releases come out when needed. New features are detailed on the [blog](https://about.gitlab.com/blog/) and in the [changelog](CHANGELOG). For more information about the release process see the release [documentation](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/release). Features that will likely be in the next releases can be found on the [feature request forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457).
|
||||
Since 2011 a minor or major version of GitLab is released on the 22nd of every month. Patch and security releases are published when needed. New features are detailed on the [blog](https://about.gitlab.com/blog/) and in the [changelog](CHANGELOG). For more information about the release process see the [release documentation](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/release). Features that will likely be in the next releases can be found on the [feature request forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457).
|
||||
|
||||
### Upgrading
|
||||
## Upgrading
|
||||
|
||||
For updating the the Omnibus installation please see the [update documentation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/update.md). For manual installations there is an [upgrader script](doc/update/upgrader.md) and there are [upgrade guides](doc/update).
|
||||
|
||||
## Run in production mode
|
||||
|
||||
The Installation guide contains instructions on how to download an init script and run it automatically on boot. You can also start the init script manually:
|
||||
|
||||
sudo service gitlab start
|
||||
|
||||
or by directly calling the script:
|
||||
|
||||
sudo /etc/init.d/gitlab start
|
||||
|
||||
Please login with `root` / `5iveL!fe`
|
||||
For updating the Omnibus installation please see the [update documentation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/update.md). For installations from source there is an [upgrader script](doc/update/upgrader.md) and there are [upgrade guides](doc/update) detailing all necessary commands to migrate to the next version.
|
||||
|
||||
## Install a development environment
|
||||
|
||||
We recommend setting up your development environment with [the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit).
|
||||
If you do not use the development kit you might need to copy the example development unicorn configuration file
|
||||
To work on GitLab itself, we recommend setting up your development environment with [the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit).
|
||||
If you do not use the GitLab Development Kit you need to install and setup all the dependencies yourself, this is a lot of work and error prone.
|
||||
One small thing you also have to do when installing it yourself is to copy the example development unicorn configuration file:
|
||||
|
||||
cp config/unicorn.rb.example.development config/unicorn.rb
|
||||
|
||||
## Run in development mode
|
||||
|
||||
Start it with [Foreman](https://github.com/ddollar/foreman)
|
||||
|
||||
bundle exec foreman start -p 3000
|
||||
|
||||
or start each component separately:
|
||||
|
||||
bundle exec rails s
|
||||
bin/background_jobs start
|
||||
|
||||
And surf to [localhost:3000](http://localhost:3000/) and login with `root` / `5iveL!fe`.
|
||||
|
||||
## Run the tests
|
||||
|
||||
- Run all tests:
|
||||
|
||||
bundle exec rake test
|
||||
|
||||
- [RSpec](http://rspec.info/) unit and functional tests.
|
||||
|
||||
All RSpec tests: `bundle exec rake spec`
|
||||
|
||||
Single RSpec file: `bundle exec rspec spec/controllers/commit_controller_spec.rb`
|
||||
|
||||
- [Spinach](https://github.com/codegram/spinach) integration tests.
|
||||
|
||||
All Spinach tests: `bundle exec rake spinach`
|
||||
|
||||
Single Spinach test: `bundle exec spinach features/project/issues/milestones.feature`
|
||||
Instructions on how to start GitLab and how to run the tests can be found in the [development section of the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit#development).
|
||||
|
||||
## Documentation
|
||||
|
||||
|
@ -131,4 +103,4 @@ Please see [Getting help for GitLab](https://about.gitlab.com/getting-help/) on
|
|||
## Is it awesome?
|
||||
|
||||
Thanks for [asking this question](https://twitter.com/supersloth/status/489462789384056832) Joshua.
|
||||
[These people](https://twitter.com/gitlabhq/favorites) seem to like it.
|
||||
[These people](https://twitter.com/gitlab/favorites) seem to like it.
|
||||
|
|
2
VERSION
|
@ -1 +1 @@
|
|||
7.5.0.pre
|
||||
7.9.0.pre
|
||||
|
|
BIN
app/assets/images/authbuttons/bitbucket_32.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
app/assets/images/authbuttons/bitbucket_64.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.1 KiB |
BIN
app/assets/images/authbuttons/gitlab_32.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
app/assets/images/authbuttons/gitlab_64.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 167 B |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 396 B After Width: | Height: | Size: 367 B |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 691 B After Width: | Height: | Size: 418 B |
BIN
app/assets/images/gitorious-logo-black.png
Normal file
After Width: | Height: | Size: 809 B |
BIN
app/assets/images/gitorious-logo-blue.png
Normal file
After Width: | Height: | Size: 495 B |
Before Width: | Height: | Size: 1,019 B After Width: | Height: | Size: 726 B |
Before Width: | Height: | Size: 331 B After Width: | Height: | Size: 222 B |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 197 B |
Before Width: | Height: | Size: 704 B After Width: | Height: | Size: 621 B |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 942 B |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 3.1 KiB |
BIN
app/assets/images/solarized-light-scheme-preview.png
Normal file
After Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 231 B |
Before Width: | Height: | Size: 50 B After Width: | Height: | Size: 49 B |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 3.7 KiB |
|
@ -12,7 +12,7 @@ class @Activities
|
|||
|
||||
|
||||
toggleFilter: (sender) ->
|
||||
sender.parent().toggleClass "inactive"
|
||||
sender.parent().toggleClass "active"
|
||||
event_filters = $.cookie("event_filter")
|
||||
filter = sender.attr("id").split("_")[0]
|
||||
if event_filters
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
@Api =
|
||||
groups_path: "/api/:version/groups.json"
|
||||
group_path: "/api/:version/groups/:id.json"
|
||||
users_path: "/api/:version/users.json"
|
||||
user_path: "/api/:version/users/:id.json"
|
||||
notes_path: "/api/:version/projects/:id/notes.json"
|
||||
|
@ -51,6 +53,33 @@
|
|||
).done (users) ->
|
||||
callback(users)
|
||||
|
||||
group: (group_id, callback) ->
|
||||
url = Api.buildUrl(Api.group_path)
|
||||
url = url.replace(':id', group_id)
|
||||
|
||||
$.ajax(
|
||||
url: url
|
||||
data:
|
||||
private_token: gon.api_token
|
||||
dataType: "json"
|
||||
).done (group) ->
|
||||
callback(group)
|
||||
|
||||
# Return groups list. Filtered by query
|
||||
# Only active groups retrieved
|
||||
groups: (query, skip_ldap, callback) ->
|
||||
url = Api.buildUrl(Api.groups_path)
|
||||
|
||||
$.ajax(
|
||||
url: url
|
||||
data:
|
||||
private_token: gon.api_token
|
||||
search: query
|
||||
per_page: 20
|
||||
dataType: "json"
|
||||
).done (groups) ->
|
||||
callback(groups)
|
||||
|
||||
# Return project users list. Filtered by query
|
||||
# Only active users retrieved
|
||||
projectUsers: (project_id, query, callback) ->
|
||||
|
|
|
@ -16,16 +16,16 @@
|
|||
#= require jquery.scrollTo
|
||||
#= require jquery.blockUI
|
||||
#= require jquery.turbolinks
|
||||
#= require jquery.sticky-kit.min
|
||||
#= require turbolinks
|
||||
#= require autosave
|
||||
#= require bootstrap
|
||||
#= require password_strength
|
||||
#= require select2
|
||||
#= require raphael
|
||||
#= require g.raphael-min
|
||||
#= require g.bar-min
|
||||
#= require chart-lib.min
|
||||
#= require branch-graph
|
||||
#= require highlight.pack
|
||||
#= require ace/ace
|
||||
#= require ace/ext-searchbox
|
||||
#= require d3
|
||||
|
@ -33,7 +33,6 @@
|
|||
#= require nprogress
|
||||
#= require nprogress-turbolinks
|
||||
#= require dropzone
|
||||
#= require semantic-ui/sidebar
|
||||
#= require mousetrap
|
||||
#= require mousetrap/pause
|
||||
#= require shortcuts
|
||||
|
@ -41,6 +40,7 @@
|
|||
#= require shortcuts_dashboard_navigation
|
||||
#= require shortcuts_issueable
|
||||
#= require shortcuts_network
|
||||
#= require cal-heatmap
|
||||
#= require_tree .
|
||||
|
||||
window.slugify = (text) ->
|
||||
|
@ -51,12 +51,6 @@ window.ajaxGet = (url) ->
|
|||
|
||||
window.showAndHide = (selector) ->
|
||||
|
||||
window.errorMessage = (message) ->
|
||||
ehtml = $("<p>")
|
||||
ehtml.addClass("error_message")
|
||||
ehtml.html(message)
|
||||
ehtml
|
||||
|
||||
window.split = (val) ->
|
||||
return val.split( /,\s*/ )
|
||||
|
||||
|
@ -82,24 +76,18 @@ window.disableButtonIfEmptyField = (field_selector, button_selector) ->
|
|||
# Disable button if any input field with given selector is empty
|
||||
window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) ->
|
||||
closest_submit = form.find(button_selector)
|
||||
empty = false
|
||||
form.find('input').filter(form_selector).each ->
|
||||
empty = true if rstrip($(this).val()) is ""
|
||||
|
||||
if empty
|
||||
closest_submit.disable()
|
||||
else
|
||||
closest_submit.enable()
|
||||
|
||||
form.keyup ->
|
||||
empty = false
|
||||
updateButtons = ->
|
||||
filled = true
|
||||
form.find('input').filter(form_selector).each ->
|
||||
empty = true if rstrip($(this).val()) is ""
|
||||
filled = rstrip($(this).val()) != "" || !$(this).attr('required')
|
||||
|
||||
if empty
|
||||
closest_submit.disable()
|
||||
else
|
||||
if filled
|
||||
closest_submit.enable()
|
||||
else
|
||||
closest_submit.disable()
|
||||
|
||||
updateButtons()
|
||||
form.keyup(updateButtons)
|
||||
|
||||
window.sanitize = (str) ->
|
||||
return str.replace(/<(?:.|\n)*?>/gm, '')
|
||||
|
@ -115,8 +103,17 @@ window.unbindEvents = ->
|
|||
$(document).unbind('scroll')
|
||||
$(document).off('scroll')
|
||||
|
||||
window.shiftWindow = ->
|
||||
scrollBy 0, -50
|
||||
|
||||
document.addEventListener("page:fetch", unbindEvents)
|
||||
|
||||
# Scroll the window to avoid the topnav bar
|
||||
# https://github.com/twitter/bootstrap/issues/1768
|
||||
if location.hash
|
||||
setTimeout shiftWindow, 1
|
||||
window.addEventListener "hashchange", shiftWindow
|
||||
|
||||
$ ->
|
||||
# Click a .one_click_select field, select the contents
|
||||
$(".one_click_select").on 'click', -> $(@).select()
|
||||
|
@ -185,6 +182,8 @@ $ ->
|
|||
form = btn.closest("form")
|
||||
new ConfirmDangerModal(form, text)
|
||||
|
||||
new Aside()
|
||||
|
||||
(($) ->
|
||||
# Disable an element and add the 'disabled' Bootstrap class
|
||||
$.fn.extend disable: ->
|
||||
|
|
17
app/assets/javascripts/aside.js.coffee
Normal file
|
@ -0,0 +1,17 @@
|
|||
class @Aside
|
||||
constructor: ->
|
||||
$(document).off "click", "a.show-aside"
|
||||
$(document).on "click", 'a.show-aside', (e) ->
|
||||
e.preventDefault()
|
||||
btn = $(e.currentTarget)
|
||||
icon = btn.find('i')
|
||||
console.log('1')
|
||||
|
||||
if icon.hasClass('fa-angle-left')
|
||||
btn.parent().find('section').hide()
|
||||
btn.parent().find('aside').fadeIn()
|
||||
icon.removeClass('fa-angle-left').addClass('fa-angle-right')
|
||||
else
|
||||
btn.parent().find('aside').hide()
|
||||
btn.parent().find('section').fadeIn()
|
||||
icon.removeClass('fa-angle-right').addClass('fa-angle-left')
|
33
app/assets/javascripts/autosave.js.coffee
Normal file
|
@ -0,0 +1,33 @@
|
|||
class @Autosave
|
||||
constructor: (field, key) ->
|
||||
@field = field
|
||||
|
||||
key = key.join("/") if key.join?
|
||||
@key = "autosave/#{key}"
|
||||
|
||||
@field.data "autosave", this
|
||||
|
||||
@restore()
|
||||
|
||||
@field.on "input", => @save()
|
||||
|
||||
restore: ->
|
||||
return unless window.localStorage?
|
||||
|
||||
text = window.localStorage.getItem @key
|
||||
@field.val text if text?.length > 0
|
||||
@field.trigger "input"
|
||||
|
||||
save: ->
|
||||
return unless window.localStorage?
|
||||
|
||||
text = @field.val()
|
||||
if text?.length > 0
|
||||
window.localStorage.setItem @key, text
|
||||
else
|
||||
@reset()
|
||||
|
||||
reset: ->
|
||||
return unless window.localStorage?
|
||||
|
||||
window.localStorage.removeItem @key
|
44
app/assets/javascripts/blob/edit_blob.js.coffee
Normal file
|
@ -0,0 +1,44 @@
|
|||
class @EditBlob
|
||||
constructor: (assets_path, mode)->
|
||||
ace.config.set "modePath", assets_path + '/ace'
|
||||
ace.config.loadModule "ace/ext/searchbox"
|
||||
if mode
|
||||
ace_mode = mode
|
||||
editor = ace.edit("editor")
|
||||
editor.focus()
|
||||
@editor = editor
|
||||
|
||||
if ace_mode
|
||||
editor.getSession().setMode "ace/mode/" + ace_mode
|
||||
|
||||
disableButtonIfEmptyField "#commit_message", ".js-commit-button"
|
||||
$(".js-commit-button").click ->
|
||||
$("#file-content").val editor.getValue()
|
||||
$(".file-editor form").submit()
|
||||
return
|
||||
|
||||
editModePanes = $(".js-edit-mode-pane")
|
||||
editModeLinks = $(".js-edit-mode a")
|
||||
editModeLinks.click (event) ->
|
||||
event.preventDefault()
|
||||
currentLink = $(this)
|
||||
paneId = currentLink.attr("href")
|
||||
currentPane = editModePanes.filter(paneId)
|
||||
editModeLinks.parent().removeClass "active hover"
|
||||
currentLink.parent().addClass "active hover"
|
||||
editModePanes.hide()
|
||||
if paneId is "#preview"
|
||||
currentPane.fadeIn 200
|
||||
$.post currentLink.data("preview-url"),
|
||||
content: editor.getValue()
|
||||
, (response) ->
|
||||
currentPane.empty().append response
|
||||
return
|
||||
|
||||
else
|
||||
currentPane.fadeIn 200
|
||||
editor.focus()
|
||||
return
|
||||
|
||||
editor: ->
|
||||
return @editor
|
21
app/assets/javascripts/blob/new_blob.js.coffee
Normal file
|
@ -0,0 +1,21 @@
|
|||
class @NewBlob
|
||||
constructor: (assets_path, mode)->
|
||||
ace.config.set "modePath", assets_path + '/ace'
|
||||
ace.config.loadModule "ace/ext/searchbox"
|
||||
if mode
|
||||
ace_mode = mode
|
||||
editor = ace.edit("editor")
|
||||
editor.focus()
|
||||
@editor = editor
|
||||
|
||||
if ace_mode
|
||||
editor.getSession().setMode "ace/mode/" + ace_mode
|
||||
|
||||
disableButtonIfEmptyField "#commit_message", ".js-commit-button"
|
||||
$(".js-commit-button").click ->
|
||||
$("#file-content").val editor.getValue()
|
||||
$(".file-editor form").submit()
|
||||
return
|
||||
|
||||
editor: ->
|
||||
return @editor
|
30
app/assets/javascripts/calendar.js.coffee
Normal file
|
@ -0,0 +1,30 @@
|
|||
class @calendar
|
||||
options =
|
||||
month: "short"
|
||||
day: "numeric"
|
||||
year: "numeric"
|
||||
|
||||
constructor: (timestamps, starting_year, starting_month) ->
|
||||
cal = new CalHeatMap()
|
||||
cal.init
|
||||
itemName: ["commit"]
|
||||
data: timestamps
|
||||
start: new Date(starting_year, starting_month)
|
||||
domainLabelFormat: "%b"
|
||||
id: "cal-heatmap"
|
||||
domain: "month"
|
||||
subDomain: "day"
|
||||
range: 12
|
||||
tooltip: true
|
||||
label:
|
||||
position: "top"
|
||||
legend: [
|
||||
0
|
||||
1
|
||||
4
|
||||
7
|
||||
]
|
||||
legendCellPadding: 3
|
||||
onClick: (date, count) ->
|
||||
return
|
||||
return
|
|
@ -1,6 +1,7 @@
|
|||
class @Diff
|
||||
UNFOLD_COUNT = 20
|
||||
constructor: ->
|
||||
$(document).off('click', '.js-unfold')
|
||||
$(document).on('click', '.js-unfold', (event) =>
|
||||
target = $(event.target)
|
||||
unfoldBottom = target.hasClass('js-unfold-bottom')
|
||||
|
@ -36,6 +37,8 @@ class @Diff
|
|||
)
|
||||
)
|
||||
|
||||
$('.diff-header').stick_in_parent(recalc_every: 1, offset_top: $('.navbar').height())
|
||||
|
||||
lineNumbers: (line) ->
|
||||
return ([0, 0]) unless line.children().length
|
||||
lines = line.children().slice(0, 2)
|
||||
|
|
|
@ -4,7 +4,6 @@ $ ->
|
|||
class Dispatcher
|
||||
constructor: () ->
|
||||
@initSearch()
|
||||
@initHighlight()
|
||||
@initPageScripts()
|
||||
|
||||
initPageScripts: ->
|
||||
|
@ -27,23 +26,26 @@ class Dispatcher
|
|||
new ZenMode()
|
||||
when 'projects:milestones:show'
|
||||
new Milestone()
|
||||
when 'projects:milestones:new'
|
||||
when 'projects:milestones:new', 'projects:milestones:edit'
|
||||
new ZenMode()
|
||||
when 'projects:issues:new','projects:issues:edit'
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.issue-form'))
|
||||
when 'projects:merge_requests:new', 'projects:merge_requests:edit'
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
new Diff()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.merge-request-form'))
|
||||
when 'projects:merge_requests:show'
|
||||
new Diff()
|
||||
shortcut_handler = new ShortcutsIssueable()
|
||||
new ZenMode()
|
||||
when "projects:merge_requests:diffs"
|
||||
new Diff()
|
||||
new ZenMode()
|
||||
when 'projects:merge_requests:index'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'dashboard:show'
|
||||
|
@ -52,14 +54,13 @@ class Dispatcher
|
|||
when 'projects:commit:show'
|
||||
new Commit()
|
||||
new Diff()
|
||||
new ZenMode()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:commits:show'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'groups:show', 'projects:show'
|
||||
new Activities()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:teams:members:index'
|
||||
new TeamMembers()
|
||||
when 'groups:members'
|
||||
new GroupMembers()
|
||||
new UsersSelect()
|
||||
|
@ -77,6 +78,8 @@ class Dispatcher
|
|||
# Ensure we don't create a particular shortcut handler here. This is
|
||||
# already created, where the network graph is created.
|
||||
shortcut_handler = true
|
||||
when 'projects:forks:new'
|
||||
new ProjectFork()
|
||||
when 'users:show'
|
||||
new User()
|
||||
|
||||
|
@ -94,6 +97,7 @@ class Dispatcher
|
|||
new Profile()
|
||||
when 'projects'
|
||||
new Project()
|
||||
new ProjectAvatar()
|
||||
switch path[1]
|
||||
when 'edit'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
|
@ -108,6 +112,7 @@ class Dispatcher
|
|||
new Wikis()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.wiki-form'))
|
||||
when 'snippets', 'labels', 'graphs'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'team_members', 'deploy_keys', 'hooks', 'services', 'protected_branches'
|
||||
|
@ -126,10 +131,3 @@ class Dispatcher
|
|||
project_ref = opts.data('autocomplete-project-ref')
|
||||
|
||||
new SearchAutocomplete(path, project_id, project_ref)
|
||||
|
||||
initHighlight: ->
|
||||
$('.highlight pre code').each (i, e) ->
|
||||
$(e).html($.map($(e).html().split("\n"), (line, i) ->
|
||||
"<span class='line' id='LC" + (i + 1) + "'>" + line + "</span>"
|
||||
).join("\n"))
|
||||
hljs.highlightBlock(e)
|
||||
|
|
240
app/assets/javascripts/dropzone_input.js.coffee
Normal file
|
@ -0,0 +1,240 @@
|
|||
class @DropzoneInput
|
||||
constructor: (form) ->
|
||||
Dropzone.autoDiscover = false
|
||||
alertClass = "alert alert-danger alert-dismissable div-dropzone-alert"
|
||||
alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\""
|
||||
divHover = "<div class=\"div-dropzone-hover\"></div>"
|
||||
divSpinner = "<div class=\"div-dropzone-spinner\"></div>"
|
||||
divAlert = "<div class=\"" + alertClass + "\"></div>"
|
||||
iconPaperclip = "<i class=\"fa fa-paperclip div-dropzone-icon\"></i>"
|
||||
iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
|
||||
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
||||
project_uploads_path = window.project_uploads_path or null
|
||||
|
||||
form_textarea = $(form).find("textarea.markdown-area")
|
||||
form_textarea.wrap "<div class=\"div-dropzone\"></div>"
|
||||
form_textarea.bind 'paste', (event) =>
|
||||
handlePaste(event)
|
||||
|
||||
form_dropzone = $(form).find('.div-dropzone')
|
||||
form_dropzone.parent().addClass "div-dropzone-wrapper"
|
||||
form_dropzone.append divHover
|
||||
$(".div-dropzone-hover").append iconPaperclip
|
||||
form_dropzone.append divSpinner
|
||||
$(".div-dropzone-spinner").append iconSpinner
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
|
||||
# Preview button
|
||||
$(document).off "click", ".js-md-preview-button"
|
||||
$(document).on "click", ".js-md-preview-button", (e) ->
|
||||
###
|
||||
Shows the Markdown preview.
|
||||
|
||||
Lets the server render GFM into Html and displays it.
|
||||
###
|
||||
e.preventDefault()
|
||||
form = $(this).closest("form")
|
||||
# toggle tabs
|
||||
form.find(".js-md-write-button").parent().removeClass "active"
|
||||
form.find(".js-md-preview-button").parent().addClass "active"
|
||||
|
||||
# toggle content
|
||||
form.find(".md-write-holder").hide()
|
||||
form.find(".md-preview-holder").show()
|
||||
|
||||
preview = form.find(".js-md-preview")
|
||||
mdText = form.find(".markdown-area").val()
|
||||
if mdText.trim().length is 0
|
||||
preview.text "Nothing to preview."
|
||||
else
|
||||
preview.text "Loading..."
|
||||
$.post($(this).data("url"),
|
||||
md_text: mdText
|
||||
).success (previewData) ->
|
||||
preview.html previewData
|
||||
|
||||
# Write button
|
||||
$(document).off "click", ".js-md-write-button"
|
||||
$(document).on "click", ".js-md-write-button", (e) ->
|
||||
###
|
||||
Shows the Markdown textarea.
|
||||
###
|
||||
e.preventDefault()
|
||||
form = $(this).closest("form")
|
||||
# toggle tabs
|
||||
form.find(".js-md-write-button").parent().addClass "active"
|
||||
form.find(".js-md-preview-button").parent().removeClass "active"
|
||||
|
||||
# toggle content
|
||||
form.find(".md-write-holder").show()
|
||||
form.find(".md-preview-holder").hide()
|
||||
|
||||
dropzone = form_dropzone.dropzone(
|
||||
url: project_uploads_path
|
||||
dictDefaultMessage: ""
|
||||
clickable: true
|
||||
paramName: "file"
|
||||
maxFilesize: 10
|
||||
uploadMultiple: false
|
||||
headers:
|
||||
"X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
|
||||
|
||||
previewContainer: false
|
||||
|
||||
processing: ->
|
||||
$(".div-dropzone-alert").alert "close"
|
||||
|
||||
dragover: ->
|
||||
form_textarea.addClass "div-dropzone-focus"
|
||||
form.find(".div-dropzone-hover").css "opacity", 0.7
|
||||
return
|
||||
|
||||
dragleave: ->
|
||||
form_textarea.removeClass "div-dropzone-focus"
|
||||
form.find(".div-dropzone-hover").css "opacity", 0
|
||||
return
|
||||
|
||||
drop: ->
|
||||
form_textarea.removeClass "div-dropzone-focus"
|
||||
form.find(".div-dropzone-hover").css "opacity", 0
|
||||
form_textarea.focus()
|
||||
return
|
||||
|
||||
success: (header, response) ->
|
||||
child = $(dropzone[0]).children("textarea")
|
||||
$(child).val $(child).val() + formatLink(response.link) + "\n"
|
||||
return
|
||||
|
||||
error: (temp, errorMessage) ->
|
||||
checkIfMsgExists = $(".error-alert").children().length
|
||||
if checkIfMsgExists is 0
|
||||
$(".error-alert").append divAlert
|
||||
$(".div-dropzone-alert").append btnAlert + errorMessage
|
||||
return
|
||||
|
||||
sending: ->
|
||||
form_dropzone.find(".div-dropzone-spinner").css
|
||||
"opacity": 0.7
|
||||
"display": "inherit"
|
||||
return
|
||||
|
||||
complete: ->
|
||||
$(".dz-preview").remove()
|
||||
$(".markdown-area").trigger "input"
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
return
|
||||
)
|
||||
|
||||
child = $(dropzone[0]).children("textarea")
|
||||
|
||||
formatLink = (link) ->
|
||||
text = "[#{link.alt}](#{link.url})"
|
||||
text = "!#{text}" if link.is_image
|
||||
text
|
||||
|
||||
handlePaste = (event) ->
|
||||
pasteEvent = event.originalEvent
|
||||
if pasteEvent.clipboardData and pasteEvent.clipboardData.items
|
||||
image = isImage(pasteEvent)
|
||||
if image
|
||||
event.preventDefault()
|
||||
|
||||
filename = getFilename(pasteEvent) or "image.png"
|
||||
text = "{{" + filename + "}}"
|
||||
pasteText(text)
|
||||
uploadFile image.getAsFile(), filename
|
||||
|
||||
isImage = (data) ->
|
||||
i = 0
|
||||
while i < data.clipboardData.items.length
|
||||
item = data.clipboardData.items[i]
|
||||
if item.type.indexOf("image") isnt -1
|
||||
return item
|
||||
i++
|
||||
return false
|
||||
|
||||
pasteText = (text) ->
|
||||
caretStart = $(child)[0].selectionStart
|
||||
caretEnd = $(child)[0].selectionEnd
|
||||
textEnd = $(child).val().length
|
||||
|
||||
beforeSelection = $(child).val().substring 0, caretStart
|
||||
afterSelection = $(child).val().substring caretEnd, textEnd
|
||||
$(child).val beforeSelection + text + afterSelection
|
||||
form_textarea.trigger "input"
|
||||
|
||||
getFilename = (e) ->
|
||||
if window.clipboardData and window.clipboardData.getData
|
||||
value = window.clipboardData.getData("Text")
|
||||
else if e.clipboardData and e.clipboardData.getData
|
||||
value = e.clipboardData.getData("text/plain")
|
||||
|
||||
value = value.split("\r")
|
||||
value.first()
|
||||
|
||||
uploadFile = (item, filename) ->
|
||||
formData = new FormData()
|
||||
formData.append "file", item, filename
|
||||
$.ajax
|
||||
url: project_uploads_path
|
||||
type: "POST"
|
||||
data: formData
|
||||
dataType: "json"
|
||||
processData: false
|
||||
contentType: false
|
||||
headers:
|
||||
"X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
|
||||
|
||||
beforeSend: ->
|
||||
showSpinner()
|
||||
closeAlertMessage()
|
||||
|
||||
success: (e, textStatus, response) ->
|
||||
insertToTextArea(filename, formatLink(response.responseJSON.link))
|
||||
|
||||
error: (response) ->
|
||||
showError(response.responseJSON.message)
|
||||
|
||||
complete: ->
|
||||
closeSpinner()
|
||||
|
||||
insertToTextArea = (filename, url) ->
|
||||
$(child).val (index, val) ->
|
||||
val.replace("{{" + filename + "}}", url + "\n")
|
||||
|
||||
appendToTextArea = (url) ->
|
||||
$(child).val (index, val) ->
|
||||
val + url + "\n"
|
||||
|
||||
showSpinner = (e) ->
|
||||
form.find(".div-dropzone-spinner").css
|
||||
"opacity": 0.7
|
||||
"display": "inherit"
|
||||
|
||||
closeSpinner = ->
|
||||
form.find(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
|
||||
showError = (message) ->
|
||||
checkIfMsgExists = $(".error-alert").children().length
|
||||
if checkIfMsgExists is 0
|
||||
$(".error-alert").append divAlert
|
||||
$(".div-dropzone-alert").append btnAlert + message
|
||||
|
||||
closeAlertMessage = ->
|
||||
form.find(".div-dropzone-alert").alert "close"
|
||||
|
||||
form.find(".markdown-selector").click (e) ->
|
||||
e.preventDefault()
|
||||
$(@).closest('.gfm-form').find('.div-dropzone').click()
|
||||
return
|
||||
|
||||
formatLink: (link) ->
|
||||
text = "[#{link.alt}](#{link.url})"
|
||||
text = "!#{text}" if link.is_image
|
||||
text
|
41
app/assets/javascripts/groups_select.js.coffee
Normal file
|
@ -0,0 +1,41 @@
|
|||
class @GroupsSelect
|
||||
constructor: ->
|
||||
$('.ajax-groups-select').each (i, select) =>
|
||||
skip_ldap = $(select).hasClass('skip_ldap')
|
||||
|
||||
$(select).select2
|
||||
placeholder: "Search for a group"
|
||||
multiple: $(select).hasClass('multiselect')
|
||||
minimumInputLength: 0
|
||||
query: (query) ->
|
||||
Api.groups query.term, skip_ldap, (groups) ->
|
||||
data = { results: groups }
|
||||
query.callback(data)
|
||||
|
||||
initSelection: (element, callback) ->
|
||||
id = $(element).val()
|
||||
if id isnt ""
|
||||
Api.group(id, callback)
|
||||
|
||||
|
||||
formatResult: (args...) =>
|
||||
@formatResult(args...)
|
||||
formatSelection: (args...) =>
|
||||
@formatSelection(args...)
|
||||
dropdownCssClass: "ajax-groups-dropdown"
|
||||
escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
|
||||
m
|
||||
|
||||
formatResult: (group) ->
|
||||
if group.avatar_url
|
||||
avatar = group.avatar_url
|
||||
else
|
||||
avatar = gon.default_avatar_url
|
||||
|
||||
"<div class='group-result'>
|
||||
<div class='group-name'>#{group.name}</div>
|
||||
<div class='group-path'>#{group.path}</div>
|
||||
</div>"
|
||||
|
||||
formatSelection: (group) ->
|
||||
group.name
|
35
app/assets/javascripts/importer_status.js.coffee
Normal file
|
@ -0,0 +1,35 @@
|
|||
class @ImporterStatus
|
||||
constructor: (@jobs_url, @import_url) ->
|
||||
this.initStatusPage()
|
||||
this.setAutoUpdate()
|
||||
|
||||
initStatusPage: ->
|
||||
$(".js-add-to-import").click (event) =>
|
||||
new_namespace = null
|
||||
tr = $(event.currentTarget).closest("tr")
|
||||
id = tr.attr("id").replace("repo_", "")
|
||||
if tr.find(".import-target input").length > 0
|
||||
new_namespace = tr.find(".import-target input").prop("value")
|
||||
tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name"))
|
||||
$.post @import_url, {repo_id: id, new_namespace: new_namespace}, dataType: 'script'
|
||||
|
||||
$(".js-import-all").click (event) =>
|
||||
$(".js-add-to-import").each ->
|
||||
$(this).click()
|
||||
|
||||
setAutoUpdate: ->
|
||||
setInterval (=>
|
||||
$.get @jobs_url, (data) =>
|
||||
$.each data, (i, job) =>
|
||||
job_item = $("#project_" + job.id)
|
||||
status_field = job_item.find(".job-status")
|
||||
|
||||
if job.import_status == 'finished'
|
||||
job_item.removeClass("active").addClass("success")
|
||||
status_field.html('<span class="cgreen"><i class="fa fa-check"></i> done</span>')
|
||||
else if job.import_status == 'started'
|
||||
status_field.html("<i class='fa fa-spinner fa-spin'></i> started")
|
||||
else
|
||||
status_field.html(job.import_status)
|
||||
|
||||
), 4000
|
|
@ -1,9 +1,9 @@
|
|||
class @Issue
|
||||
constructor: ->
|
||||
$('.edit-issue.inline-update input[type="submit"]').hide()
|
||||
$(".issue-box .inline-update").on "change", "select", ->
|
||||
$(".context .inline-update").on "change", "select", ->
|
||||
$(this).submit()
|
||||
$(".issue-box .inline-update").on "change", "#issue_assignee_id", ->
|
||||
$(".context .inline-update").on "change", "#issue_assignee_id", ->
|
||||
$(this).submit()
|
||||
|
||||
if $("a.btn-close").length
|
||||
|
@ -15,3 +15,10 @@ class @Issue
|
|||
"issue"
|
||||
updateTaskState
|
||||
)
|
||||
|
||||
$('.issue-details').waitForImages ->
|
||||
$('.issuable-affix').affix offset:
|
||||
top: ->
|
||||
@top = $('.issue-details').outerHeight(true) + 25
|
||||
bottom: ->
|
||||
@bottom = $('.footer').outerHeight(true)
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
$(this).html totalIssues + 1
|
||||
else
|
||||
$(this).html totalIssues - 1
|
||||
$("body").on "click", ".issues-filters .dropdown-menu a", ->
|
||||
$("body").on "click", ".issues-other-filters .dropdown-menu a", ->
|
||||
$('.issues-list').block(
|
||||
message: null,
|
||||
overlayCSS:
|
||||
|
@ -77,9 +77,9 @@
|
|||
ids.push $(value).attr("data-id")
|
||||
|
||||
$("#update_issues_ids").val ids
|
||||
$(".issues-filters").hide()
|
||||
$(".issues-other-filters").hide()
|
||||
$(".issues_bulk_update").show()
|
||||
else
|
||||
$("#update_issues_ids").val []
|
||||
$(".issues_bulk_update").hide()
|
||||
$(".issues-filters").show()
|
||||
$(".issues-other-filters").show()
|
||||
|
|
|
@ -1,196 +0,0 @@
|
|||
formatLink = (str) ->
|
||||
"![" + str.alt + "](" + str.url + ")"
|
||||
|
||||
$(document).ready ->
|
||||
alertClass = "alert alert-danger alert-dismissable div-dropzone-alert"
|
||||
alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\""
|
||||
divHover = "<div class=\"div-dropzone-hover\"></div>"
|
||||
divSpinner = "<div class=\"div-dropzone-spinner\"></div>"
|
||||
divAlert = "<div class=\"" + alertClass + "\"></div>"
|
||||
iconPicture = "<i class=\"fa fa-picture-o div-dropzone-icon\"></i>"
|
||||
iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
|
||||
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
||||
project_image_path_upload = window.project_image_path_upload or null
|
||||
|
||||
$("textarea.markdown-area").wrap "<div class=\"div-dropzone\"></div>"
|
||||
|
||||
$(".div-dropzone").parent().addClass "div-dropzone-wrapper"
|
||||
|
||||
$(".div-dropzone").append divHover
|
||||
$(".div-dropzone-hover").append iconPicture
|
||||
$(".div-dropzone").append divSpinner
|
||||
$(".div-dropzone-spinner").append iconSpinner
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
|
||||
dropzone = $(".div-dropzone").dropzone(
|
||||
url: project_image_path_upload
|
||||
dictDefaultMessage: ""
|
||||
clickable: true
|
||||
paramName: "markdown_img"
|
||||
maxFilesize: 10
|
||||
uploadMultiple: false
|
||||
acceptedFiles: "image/jpg,image/jpeg,image/gif,image/png"
|
||||
headers:
|
||||
"X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
|
||||
|
||||
previewContainer: false
|
||||
|
||||
processing: ->
|
||||
$(".div-dropzone-alert").alert "close"
|
||||
|
||||
dragover: ->
|
||||
$(".div-dropzone > textarea").addClass "div-dropzone-focus"
|
||||
$(".div-dropzone-hover").css "opacity", 0.7
|
||||
return
|
||||
|
||||
dragleave: ->
|
||||
$(".div-dropzone > textarea").removeClass "div-dropzone-focus"
|
||||
$(".div-dropzone-hover").css "opacity", 0
|
||||
return
|
||||
|
||||
drop: ->
|
||||
$(".div-dropzone > textarea").removeClass "div-dropzone-focus"
|
||||
$(".div-dropzone-hover").css "opacity", 0
|
||||
$(".div-dropzone > textarea").focus()
|
||||
return
|
||||
|
||||
success: (header, response) ->
|
||||
child = $(dropzone[0]).children("textarea")
|
||||
$(child).val $(child).val() + formatLink(response.link) + "\n"
|
||||
return
|
||||
|
||||
error: (temp, errorMessage) ->
|
||||
checkIfMsgExists = $(".error-alert").children().length
|
||||
if checkIfMsgExists is 0
|
||||
$(".error-alert").append divAlert
|
||||
$(".div-dropzone-alert").append btnAlert + errorMessage
|
||||
return
|
||||
|
||||
sending: ->
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0.7
|
||||
"display": "inherit"
|
||||
return
|
||||
|
||||
complete: ->
|
||||
$(".dz-preview").remove()
|
||||
$(".markdown-area").trigger "input"
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
return
|
||||
)
|
||||
|
||||
child = $(dropzone[0]).children("textarea")
|
||||
|
||||
formatLink = (str) ->
|
||||
"![" + str.alt + "](" + str.url + ")"
|
||||
|
||||
handlePaste = (e) ->
|
||||
e.preventDefault()
|
||||
my_event = e.originalEvent
|
||||
|
||||
if my_event.clipboardData and my_event.clipboardData.items
|
||||
processItem(my_event)
|
||||
|
||||
processItem = (e) ->
|
||||
image = isImage(e)
|
||||
if image
|
||||
filename = getFilename(e) or "image.png"
|
||||
text = "{{" + filename + "}}"
|
||||
pasteText(text)
|
||||
uploadFile image.getAsFile(), filename
|
||||
|
||||
else
|
||||
text = e.clipboardData.getData("text/plain")
|
||||
pasteText(text)
|
||||
|
||||
isImage = (data) ->
|
||||
i = 0
|
||||
while i < data.clipboardData.items.length
|
||||
item = data.clipboardData.items[i]
|
||||
if item.type.indexOf("image") isnt -1
|
||||
return item
|
||||
i++
|
||||
return false
|
||||
|
||||
pasteText = (text) ->
|
||||
caretStart = $(child)[0].selectionStart
|
||||
caretEnd = $(child)[0].selectionEnd
|
||||
textEnd = $(child).val().length
|
||||
|
||||
beforeSelection = $(child).val().substring 0, caretStart
|
||||
afterSelection = $(child).val().substring caretEnd, textEnd
|
||||
$(child).val beforeSelection + text + afterSelection
|
||||
$(".markdown-area").trigger "input"
|
||||
|
||||
getFilename = (e) ->
|
||||
if window.clipboardData and window.clipboardData.getData
|
||||
value = window.clipboardData.getData("Text")
|
||||
else if e.clipboardData and e.clipboardData.getData
|
||||
value = e.clipboardData.getData("text/plain")
|
||||
|
||||
value = value.split("\r")
|
||||
value.first()
|
||||
|
||||
uploadFile = (item, filename) ->
|
||||
formData = new FormData()
|
||||
formData.append "markdown_img", item, filename
|
||||
$.ajax
|
||||
url: project_image_path_upload
|
||||
type: "POST"
|
||||
data: formData
|
||||
dataType: "json"
|
||||
processData: false
|
||||
contentType: false
|
||||
headers:
|
||||
"X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
|
||||
|
||||
beforeSend: ->
|
||||
showSpinner()
|
||||
closeAlertMessage()
|
||||
|
||||
success: (e, textStatus, response) ->
|
||||
insertToTextArea(filename, formatLink(response.responseJSON.link))
|
||||
|
||||
error: (response) ->
|
||||
showError(response.responseJSON.message)
|
||||
|
||||
complete: ->
|
||||
closeSpinner()
|
||||
|
||||
insertToTextArea = (filename, url) ->
|
||||
$(child).val (index, val) ->
|
||||
val.replace("{{" + filename + "}}", url + "\n")
|
||||
|
||||
appendToTextArea = (url) ->
|
||||
$(child).val (index, val) ->
|
||||
val + url + "\n"
|
||||
|
||||
showSpinner = (e) ->
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0.7
|
||||
"display": "inherit"
|
||||
|
||||
closeSpinner = ->
|
||||
$(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
|
||||
showError = (message) ->
|
||||
checkIfMsgExists = $(".error-alert").children().length
|
||||
if checkIfMsgExists is 0
|
||||
$(".error-alert").append divAlert
|
||||
$(".div-dropzone-alert").append btnAlert + message
|
||||
|
||||
closeAlertMessage = ->
|
||||
$(".div-dropzone-alert").alert "close"
|
||||
|
||||
$(".markdown-selector").click (e) ->
|
||||
e.preventDefault()
|
||||
$(@).closest('.gfm-form').find('.div-dropzone').click()
|
||||
return
|
||||
|
||||
return
|
|
@ -20,15 +20,22 @@ class @MergeRequest
|
|||
if $("a.btn-close").length
|
||||
$("li.task-list-item input:checkbox").prop("disabled", false)
|
||||
|
||||
$('.merge-request-details').waitForImages ->
|
||||
$('.issuable-affix').affix offset:
|
||||
top: ->
|
||||
@top = $('.merge-request-details').outerHeight(true) + 91
|
||||
bottom: ->
|
||||
@bottom = $('.footer').outerHeight(true)
|
||||
|
||||
# Local jQuery finder
|
||||
$: (selector) ->
|
||||
this.$el.find(selector)
|
||||
|
||||
initContextWidget: ->
|
||||
$('.edit-merge_request.inline-update input[type="submit"]').hide()
|
||||
$(".issue-box .inline-update").on "change", "select", ->
|
||||
$(".context .inline-update").on "change", "select", ->
|
||||
$(this).submit()
|
||||
$(".issue-box .inline-update").on "change", "#merge_request_assignee_id", ->
|
||||
$(".context .inline-update").on "change", "#merge_request_assignee_id", ->
|
||||
$(this).submit()
|
||||
|
||||
initMergeWidget: ->
|
||||
|
@ -89,6 +96,10 @@ class @MergeRequest
|
|||
this.$('.merge-request-tabs .diffs-tab').addClass 'active'
|
||||
this.loadDiff() unless @diffs_loaded
|
||||
this.$('.diffs').show()
|
||||
$(".diff-header").trigger("sticky_kit:recalc")
|
||||
when 'commits'
|
||||
this.$('.merge-request-tabs .commits-tab').addClass 'active'
|
||||
this.$('.commits').show()
|
||||
else
|
||||
this.$('.merge-request-tabs .notes-tab').addClass 'active'
|
||||
this.$('.notes').show()
|
||||
|
@ -132,3 +143,16 @@ class @MergeRequest
|
|||
this.$('.automerge_widget').hide()
|
||||
this.$('.merge-in-progress').hide()
|
||||
this.$('.automerge_widget.already_cannot_be_merged').show()
|
||||
|
||||
mergeInProgress: ->
|
||||
$.ajax
|
||||
type: 'GET'
|
||||
url: $('.merge-request').data('url')
|
||||
success: (data) =>
|
||||
switch data.state
|
||||
when 'merged'
|
||||
location.reload()
|
||||
else
|
||||
setTimeout(merge_request.mergeInProgress, 3000)
|
||||
dataType: 'json'
|
||||
|
||||
|
|
|
@ -36,18 +36,9 @@ class @Notes
|
|||
# delete note attachment
|
||||
$(document).on "click", ".js-note-attachment-delete", @removeAttachment
|
||||
|
||||
# Preview button
|
||||
$(document).on "click", ".js-note-preview-button", @previewNote
|
||||
|
||||
# Preview button
|
||||
$(document).on "click", ".js-note-write-button", @writeNote
|
||||
|
||||
# reset main target form after submit
|
||||
$(document).on "ajax:complete", ".js-main-target-form", @resetMainTargetForm
|
||||
|
||||
# attachment button
|
||||
$(document).on "click", ".js-choose-note-attachment-button", @chooseNoteAttachment
|
||||
|
||||
# update the file name when an attachment is selected
|
||||
$(document).on "change", ".js-note-attachment-input", @updateFormAttachment
|
||||
|
||||
|
@ -64,8 +55,9 @@ class @Notes
|
|||
$(document).on "visibilitychange", @visibilityChange
|
||||
|
||||
@notes_forms = '.js-main-target-form textarea, .js-discussion-note-form textarea'
|
||||
$(document).on('keypress', @notes_forms, (e)->
|
||||
if e.keyCode == 10 || (e.ctrlKey && e.keyCode == 13)
|
||||
# Chrome doesn't fire keypress or keyup for Command+Enter, so we need keydown.
|
||||
$(document).on('keydown', @notes_forms, (e) ->
|
||||
if e.keyCode == 10 || ((e.metaKey || e.ctrlKey) && e.keyCode == 13)
|
||||
$(@).parents('form').submit()
|
||||
)
|
||||
|
||||
|
@ -77,14 +69,11 @@ class @Notes
|
|||
$(document).off "click", ".note-edit-cancel"
|
||||
$(document).off "click", ".js-note-delete"
|
||||
$(document).off "click", ".js-note-attachment-delete"
|
||||
$(document).off "click", ".js-note-preview-button"
|
||||
$(document).off "click", ".js-note-write-button"
|
||||
$(document).off "ajax:complete", ".js-main-target-form"
|
||||
$(document).off "click", ".js-choose-note-attachment-button"
|
||||
$(document).off "click", ".js-discussion-reply-button"
|
||||
$(document).off "click", ".js-add-diff-note-button"
|
||||
$(document).off "visibilitychange"
|
||||
$(document).off "keypress", @notes_forms
|
||||
$(document).off "keydown", @notes_forms
|
||||
$(document).off "keyup", ".js-note-text"
|
||||
$(document).off "click", ".js-note-target-reopen"
|
||||
$(document).off "click", ".js-note-target-close"
|
||||
|
@ -122,10 +111,6 @@ class @Notes
|
|||
if @isNewNote(note)
|
||||
@note_ids.push(note.id)
|
||||
$('ul.main-notes-list').append(note.html)
|
||||
code = "#note_" + note.id + " .highlight pre code"
|
||||
$(code).each (i, e) ->
|
||||
hljs.highlightBlock(e)
|
||||
|
||||
|
||||
###
|
||||
Check if note does not exists on page
|
||||
|
@ -165,47 +150,6 @@ class @Notes
|
|||
# cleanup after successfully creating a diff/discussion note
|
||||
@removeDiscussionNoteForm(form)
|
||||
|
||||
###
|
||||
Shows write note textarea.
|
||||
###
|
||||
writeNote: (e) ->
|
||||
e.preventDefault()
|
||||
form = $(this).closest("form")
|
||||
# toggle tabs
|
||||
form.find(".js-note-write-button").parent().addClass "active"
|
||||
form.find(".js-note-preview-button").parent().removeClass "active"
|
||||
|
||||
# toggle content
|
||||
form.find(".note-write-holder").show()
|
||||
form.find(".note-preview-holder").hide()
|
||||
|
||||
###
|
||||
Shows the note preview.
|
||||
|
||||
Lets the server render GFM into Html and displays it.
|
||||
###
|
||||
previewNote: (e) ->
|
||||
e.preventDefault()
|
||||
form = $(this).closest("form")
|
||||
# toggle tabs
|
||||
form.find(".js-note-write-button").parent().removeClass "active"
|
||||
form.find(".js-note-preview-button").parent().addClass "active"
|
||||
|
||||
# toggle content
|
||||
form.find(".note-write-holder").hide()
|
||||
form.find(".note-preview-holder").show()
|
||||
|
||||
preview = form.find(".js-note-preview")
|
||||
noteText = form.find(".js-note-text").val()
|
||||
if noteText.trim().length is 0
|
||||
preview.text "Nothing to preview."
|
||||
else
|
||||
preview.text "Loading..."
|
||||
$.post($(this).data("url"),
|
||||
note: noteText
|
||||
).success (previewData) ->
|
||||
preview.html previewData
|
||||
|
||||
###
|
||||
Called in response the main target form has been successfully submitted.
|
||||
|
||||
|
@ -220,17 +164,10 @@ class @Notes
|
|||
form.find(".js-errors").remove()
|
||||
|
||||
# reset text and preview
|
||||
form.find(".js-note-write-button").click()
|
||||
form.find(".js-md-write-button").click()
|
||||
form.find(".js-note-text").val("").trigger "input"
|
||||
|
||||
###
|
||||
Called when clicking the "Choose File" button.
|
||||
|
||||
Opens the file selection dialog.
|
||||
###
|
||||
chooseNoteAttachment: ->
|
||||
form = $(this).closest("form")
|
||||
form.find(".js-note-attachment-input").click()
|
||||
form.find(".js-note-text").data("autosave").reset()
|
||||
|
||||
###
|
||||
Shows the main form and does some setup on it.
|
||||
|
@ -268,23 +205,34 @@ class @Notes
|
|||
setupNoteForm: (form) ->
|
||||
disableButtonIfEmptyField form.find(".js-note-text"), form.find(".js-comment-button")
|
||||
form.removeClass "js-new-note-form"
|
||||
form.find('.div-dropzone').remove()
|
||||
|
||||
# setup preview buttons
|
||||
form.find(".js-note-write-button, .js-note-preview-button").tooltip placement: "left"
|
||||
previewButton = form.find(".js-note-preview-button")
|
||||
form.find(".js-note-text").on "input", ->
|
||||
form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left"
|
||||
previewButton = form.find(".js-md-preview-button")
|
||||
|
||||
textarea = form.find(".js-note-text")
|
||||
|
||||
textarea.on "input", ->
|
||||
if $(this).val().trim() isnt ""
|
||||
previewButton.removeClass("turn-off").addClass "turn-on"
|
||||
else
|
||||
previewButton.removeClass("turn-on").addClass "turn-off"
|
||||
|
||||
new Autosave textarea, [
|
||||
"Note"
|
||||
form.find("#note_commit_id").val()
|
||||
form.find("#note_line_code").val()
|
||||
form.find("#note_noteable_type").val()
|
||||
form.find("#note_noteable_id").val()
|
||||
]
|
||||
|
||||
# remove notify commit author checkbox for non-commit notes
|
||||
form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit"
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
new DropzoneInput(form)
|
||||
form.show()
|
||||
|
||||
|
||||
###
|
||||
Called in response to the new note form being submitted
|
||||
|
||||
|
@ -308,11 +256,10 @@ class @Notes
|
|||
Updates the current note field.
|
||||
###
|
||||
updateNote: (xhr, note, status) =>
|
||||
note_li = $("#note_" + note.id)
|
||||
note_li = $(".note-row-" + note.id)
|
||||
note_li.replaceWith(note.html)
|
||||
code = "#note_" + note.id + " .highlight pre code"
|
||||
$(code).each (i, e) ->
|
||||
hljs.highlightBlock(e)
|
||||
note_li.find('.note-edit-form').hide()
|
||||
note_li.find('.note-body > .note-text').show()
|
||||
|
||||
###
|
||||
Called in response to clicking the edit note link
|
||||
|
@ -324,12 +271,20 @@ class @Notes
|
|||
showEditForm: (e) ->
|
||||
e.preventDefault()
|
||||
note = $(this).closest(".note")
|
||||
note.find(".note-text").hide()
|
||||
note.find(".note-body > .note-text").hide()
|
||||
note.find(".note-header").hide()
|
||||
base_form = note.find(".note-edit-form")
|
||||
form = base_form.clone().insertAfter(base_form)
|
||||
form.addClass('current-note-edit-form')
|
||||
form.find('.div-dropzone').remove()
|
||||
|
||||
# Show the attachment delete link
|
||||
note.find(".js-note-attachment-delete").show()
|
||||
|
||||
# Setup markdown form
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
form = note.find(".note-edit-form")
|
||||
new DropzoneInput(form)
|
||||
|
||||
form.show()
|
||||
textarea = form.find("textarea")
|
||||
textarea.focus()
|
||||
|
@ -343,9 +298,9 @@ class @Notes
|
|||
cancelEdit: (e) ->
|
||||
e.preventDefault()
|
||||
note = $(this).closest(".note")
|
||||
note.find(".note-text").show()
|
||||
note.find(".js-note-attachment-delete").hide()
|
||||
note.find(".note-edit-form").hide()
|
||||
note.find(".note-body > .note-text").show()
|
||||
note.find(".note-header").show()
|
||||
note.find(".current-note-edit-form").remove()
|
||||
|
||||
###
|
||||
Called in response to deleting a note of any kind.
|
||||
|
@ -377,7 +332,7 @@ class @Notes
|
|||
removeAttachment: ->
|
||||
note = $(this).closest(".note")
|
||||
note.find(".note-attachment").remove()
|
||||
note.find(".note-text").show()
|
||||
note.find(".note-body > .note-text").show()
|
||||
note.find(".js-note-attachment-delete").hide()
|
||||
note.find(".note-edit-form").hide()
|
||||
|
||||
|
@ -424,7 +379,7 @@ class @Notes
|
|||
###
|
||||
addDiffNote: (e) =>
|
||||
e.preventDefault()
|
||||
link = e.target
|
||||
link = e.currentTarget
|
||||
form = $(".js-new-note-form")
|
||||
row = $(link).closest("tr")
|
||||
nextRow = row.next()
|
||||
|
@ -451,6 +406,8 @@ class @Notes
|
|||
removeDiscussionNoteForm: (form)->
|
||||
row = form.closest("tr")
|
||||
|
||||
form.find(".js-note-text").data("autosave").reset()
|
||||
|
||||
# show the reply button (will only work for replies)
|
||||
form.prev(".js-discussion-reply-button").show()
|
||||
if row.is(".js-temp-notes-holder")
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
#= require pwstrength-bootstrap-1.2.2
|
||||
overwritten_messages =
|
||||
wordSimilarToUsername: "Your password should not contain your username"
|
||||
|
||||
overwritten_rules =
|
||||
wordSequences: false
|
||||
|
||||
options =
|
||||
showProgressBar: false
|
||||
showVerdicts: false
|
||||
showPopover: true
|
||||
showErrors: true
|
||||
showStatus: true
|
||||
errorMessages: overwritten_messages
|
||||
|
||||
$(document).ready ->
|
||||
profileOptions = {}
|
||||
profileOptions.ui = options
|
||||
profileOptions.rules =
|
||||
activated: overwritten_rules
|
||||
|
||||
deviseOptions = {}
|
||||
deviseOptions.common =
|
||||
usernameField: "#user_username"
|
||||
deviseOptions.ui = options
|
||||
deviseOptions.rules =
|
||||
activated: overwritten_rules
|
||||
|
||||
$("#user_password_profile").pwstrength profileOptions
|
||||
$("#user_password_sign_up").pwstrength deviseOptions
|
||||
$("#user_password_recover").pwstrength deviseOptions
|
|
@ -16,5 +16,11 @@ class @Project
|
|||
$('.hide-no-ssh-message').on 'click', (e) ->
|
||||
path = '/'
|
||||
$.cookie('hide_no_ssh_message', 'false', { path: path })
|
||||
$(@).parents('.no-ssh-key-message').hide()
|
||||
$(@).parents('.no-ssh-key-message').remove()
|
||||
e.preventDefault()
|
||||
|
||||
$('.hide-no-password-message').on 'click', (e) ->
|
||||
path = '/'
|
||||
$.cookie('hide_no_password_message', 'false', { path: path })
|
||||
$(@).parents('.no-password-message').remove()
|
||||
e.preventDefault()
|
||||
|
|
9
app/assets/javascripts/project_avatar.js.coffee
Normal file
|
@ -0,0 +1,9 @@
|
|||
class @ProjectAvatar
|
||||
constructor: ->
|
||||
$('.js-choose-project-avatar-button').bind 'click', ->
|
||||
form = $(this).closest('form')
|
||||
form.find('.js-project-avatar-input').click()
|
||||
$('.js-project-avatar-input').bind 'change', ->
|
||||
form = $(this).closest('form')
|
||||
filename = $(this).val().replace(/^.*[\\\/]/, '')
|
||||
form.find('.js-avatar-filename').text(filename)
|
5
app/assets/javascripts/project_fork.js.coffee
Normal file
|
@ -0,0 +1,5 @@
|
|||
class @ProjectFork
|
||||
constructor: ->
|
||||
$('.fork-thumbnail a').on 'click', ->
|
||||
$('.fork-namespaces').hide()
|
||||
$('.save-project-loader').show()
|
|
@ -9,17 +9,3 @@ class @ProjectNew
|
|||
|
||||
initEvents: ->
|
||||
disableButtonIfEmptyField '#project_name', '.project-submit'
|
||||
|
||||
$('#project_issues_enabled').change ->
|
||||
if ($(this).is(':checked') == true)
|
||||
$('#project_issues_tracker').removeAttr('disabled')
|
||||
else
|
||||
$('#project_issues_tracker').attr('disabled', 'disabled')
|
||||
|
||||
$('#project_issues_tracker').change()
|
||||
|
||||
$('#project_issues_tracker').change ->
|
||||
if ($(this).val() == gon.default_issues_tracker || $(this).is(':disabled'))
|
||||
$('#project_issues_tracker_id').attr('disabled', 'disabled')
|
||||
else
|
||||
$('#project_issues_tracker_id').removeAttr('disabled')
|
||||
|
|
|
@ -6,7 +6,7 @@ class @ProjectShow
|
|||
new Flash('Star toggle failed. Try again later.', 'alert')
|
||||
|
||||
$("a[data-toggle='tab']").on "shown.bs.tab", (e) ->
|
||||
$.cookie "default_view", $(e.target).attr("href")
|
||||
$.cookie "default_view", $(e.target).attr("href"), { expires: 30 }
|
||||
|
||||
defaultView = $.cookie("default_view")
|
||||
if defaultView
|
||||
|
|
|
@ -15,7 +15,7 @@ class @ProjectUsersSelect
|
|||
name: 'Unassigned',
|
||||
avatar: null,
|
||||
username: 'none',
|
||||
id: ''
|
||||
id: -1
|
||||
}
|
||||
|
||||
data.results.unshift(nullUser)
|
||||
|
|
21
app/assets/javascripts/protected_branches.js.coffee
Normal file
|
@ -0,0 +1,21 @@
|
|||
$ ->
|
||||
$(":checkbox").change ->
|
||||
name = $(this).attr("name")
|
||||
if name == "developers_can_push"
|
||||
id = $(this).val()
|
||||
checked = $(this).is(":checked")
|
||||
url = $(this).data("url")
|
||||
$.ajax
|
||||
type: "PUT"
|
||||
url: url
|
||||
dataType: "json"
|
||||
data:
|
||||
id: id
|
||||
developers_can_push: checked
|
||||
|
||||
success: ->
|
||||
new Flash("Branch updated.", "notice")
|
||||
location.reload true
|
||||
|
||||
error: ->
|
||||
new Flash("Failed to update branch!", "alert")
|
|
@ -1,26 +1,14 @@
|
|||
responsive_resize = ->
|
||||
current_width = $(window).width()
|
||||
if current_width < 985
|
||||
$('.responsive-side').addClass("ui right wide sidebar")
|
||||
$(document).on("click", '.toggle-nav-collapse', (e) ->
|
||||
e.preventDefault()
|
||||
collapsed = 'page-sidebar-collapsed'
|
||||
expanded = 'page-sidebar-expanded'
|
||||
|
||||
if $('.page-with-sidebar').hasClass(collapsed)
|
||||
$('.page-with-sidebar').removeClass(collapsed).addClass(expanded)
|
||||
$('.toggle-nav-collapse i').removeClass('fa-angle-right').addClass('fa-angle-left')
|
||||
$.cookie("collapsed_nav", "false", { path: '/' })
|
||||
else
|
||||
$('.responsive-side').removeClass("ui right wide sidebar")
|
||||
|
||||
$ ->
|
||||
# Depending on window size, set the sidebar offscreen.
|
||||
responsive_resize()
|
||||
|
||||
$('.sidebar-expand-button').click ->
|
||||
$('.ui.sidebar')
|
||||
.sidebar({overlay: true})
|
||||
.sidebar('toggle')
|
||||
|
||||
# Hide sidebar on click outside of sidebar
|
||||
$(document).mouseup (e) ->
|
||||
container = $(".ui.sidebar")
|
||||
container.sidebar "hide" if not container.is(e.target) and container.has(e.target).length is 0
|
||||
return
|
||||
|
||||
# On resize, check if sidebar should be offscreen.
|
||||
$(window).resize ->
|
||||
responsive_resize()
|
||||
return
|
||||
$('.page-with-sidebar').removeClass(expanded).addClass(collapsed)
|
||||
$('.toggle-nav-collapse i').removeClass('fa-angle-left').addClass('fa-angle-right')
|
||||
$.cookie("collapsed_nav", "true", { path: '/' })
|
||||
)
|
||||
|
|
|
@ -46,7 +46,7 @@ class @ContributorsGraph
|
|||
|
||||
class @ContributorsMasterGraph extends ContributorsGraph
|
||||
constructor: (@data) ->
|
||||
@width = $('.container').width() - 70
|
||||
@width = $('.container').width() - 345
|
||||
@height = 200
|
||||
@x = null
|
||||
@y = null
|
||||
|
@ -119,7 +119,7 @@ class @ContributorsMasterGraph extends ContributorsGraph
|
|||
|
||||
class @ContributorsAuthorGraph extends ContributorsGraph
|
||||
constructor: (@data) ->
|
||||
@width = $('.container').width()/2 - 100
|
||||
@width = $('.container').width()/2 - 225
|
||||
@height = 200
|
||||
@x = null
|
||||
@y = null
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
class @TeamMembers
|
||||
constructor: ->
|
||||
$('.team-members .project-access-select').on "change", ->
|
||||
$(this.form).submit()
|
|
@ -10,7 +10,15 @@ class @ZenMode
|
|||
if not @active_checkbox
|
||||
@scroll_position = window.pageYOffset
|
||||
|
||||
$('body').on 'change', '.zennable input[type=checkbox]', (e) =>
|
||||
$('body').on 'click', '.zen-enter-link', (e) =>
|
||||
e.preventDefault()
|
||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true)
|
||||
|
||||
$('body').on 'click', '.zen-leave-link', (e) =>
|
||||
e.preventDefault()
|
||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false)
|
||||
|
||||
$('body').on 'change', '.zen-toggle-comment', (e) =>
|
||||
checkbox = e.currentTarget
|
||||
if checkbox.checked
|
||||
# Disable other keyboard shortcuts in ZEN mode
|
||||
|
@ -32,8 +40,6 @@ class @ZenMode
|
|||
@active_zen_area = @active_checkbox.parent().find('textarea')
|
||||
@active_zen_area.focus()
|
||||
window.location.hash = ZenMode.fullscreen_prefix + @active_checkbox.prop('id')
|
||||
# Disable dropzone in ZEN mode
|
||||
Dropzone.forElement('.div-dropzone').disable()
|
||||
|
||||
exitZenMode: =>
|
||||
if @active_zen_area isnt null
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
*= require jquery.ui.autocomplete
|
||||
*= require jquery.atwho
|
||||
*= require select2
|
||||
*= require highlightjs.min
|
||||
*= require_self
|
||||
*= require dropzone/basic
|
||||
*= require cal-heatmap
|
||||
*/
|
||||
|
||||
@import "main/*";
|
||||
|
@ -55,8 +55,3 @@
|
|||
* Styles for JS behaviors.
|
||||
*/
|
||||
@import "behaviors.scss";
|
||||
|
||||
/**
|
||||
* Styles for responsive sidebar
|
||||
*/
|
||||
@import "semantic-ui/modules/sidebar";
|
||||
|
|
|
@ -1,12 +1,22 @@
|
|||
// Details
|
||||
//--------
|
||||
.js-details-container .content { display: none; }
|
||||
.js-details-container .content.hide { display: block; }
|
||||
.js-details-container.open .content { display: block; }
|
||||
.js-details-container.open .content.hide { display: none; }
|
||||
.js-details-container {
|
||||
.content {
|
||||
display: none;
|
||||
&.hide { display: block; }
|
||||
}
|
||||
&.open .content {
|
||||
display: block;
|
||||
&.hide { display: none; }
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle between two states.
|
||||
.js-toggler-container .turn-on { display: block; }
|
||||
.js-toggler-container .turn-off { display: none; }
|
||||
.js-toggler-container.on .turn-on { display: none; }
|
||||
.js-toggler-container.on .turn-off { display: block; }
|
||||
.js-toggler-container {
|
||||
.turn-on { display: block; }
|
||||
.turn-off { display: none; }
|
||||
&.on {
|
||||
.turn-on { display: none; }
|
||||
.turn-off { display: block; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,21 @@
|
|||
float: left;
|
||||
margin-right: 12px;
|
||||
width: 40px;
|
||||
padding: 1px;
|
||||
@include border-radius(4px);
|
||||
height: 40px;
|
||||
padding: 0;
|
||||
@include border-radius($avatar_radius);
|
||||
|
||||
&.avatar-inline {
|
||||
float: none;
|
||||
margin-left: 3px;
|
||||
margin-left: 4px;
|
||||
margin-bottom: 2px;
|
||||
|
||||
&.s16 { margin-right: 2px; }
|
||||
&.s24 { margin-right: 2px; }
|
||||
&.s16 { margin-right: 4px; }
|
||||
&.s24 { margin-right: 4px; }
|
||||
}
|
||||
|
||||
&.group-avatar, &.project-avatar, &.avatar-tile {
|
||||
@include border-radius(0px);
|
||||
}
|
||||
|
||||
&.s16 { width: 16px; height: 16px; margin-right: 6px; }
|
||||
|
@ -21,3 +27,16 @@
|
|||
&.s90 { width: 90px; height: 90px; margin-right: 15px; }
|
||||
&.s160 { width: 160px; height: 160px; margin-right: 20px; }
|
||||
}
|
||||
|
||||
.identicon {
|
||||
text-align: center;
|
||||
vertical-align: top;
|
||||
|
||||
&.s16 { font-size: 12px; line-height: 1.33; }
|
||||
&.s24 { font-size: 14px; line-height: 1.8; }
|
||||
&.s26 { font-size: 20px; line-height: 1.33; }
|
||||
&.s32 { font-size: 22px; line-height: 32px; }
|
||||
&.s60 { font-size: 32px; line-height: 60px; }
|
||||
&.s90 { font-size: 36px; line-height: 90px; }
|
||||
&.s160 { font-size: 96px; line-height: 1.33; }
|
||||
}
|
||||
|
|
|
@ -173,6 +173,11 @@
|
|||
margin-right: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-lg {
|
||||
font-size: 15px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-block {
|
||||
|
|
95
app/assets/stylesheets/generic/calendar.scss
Normal file
|
@ -0,0 +1,95 @@
|
|||
.calendar_onclick_placeholder {
|
||||
padding: 0 0 2px 0;
|
||||
}
|
||||
|
||||
.calendar_commit_activity {
|
||||
padding: 5px 0 0;
|
||||
}
|
||||
|
||||
.calendar_onclick_second {
|
||||
font-size: 14px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.calendar_onclick_hr {
|
||||
padding: 0;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.calendar_commit_date {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.calendar_activity_summary {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/**
|
||||
* This overwrites the default values of the cal-heatmap gem
|
||||
*/
|
||||
.calendar {
|
||||
.qi {
|
||||
background-color: #999;
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.q1 {
|
||||
background-color: #dae289;
|
||||
fill: #ededed;
|
||||
}
|
||||
|
||||
.q2 {
|
||||
background-color: #cedb9c;
|
||||
fill: #ACD5F2;
|
||||
}
|
||||
|
||||
.q3 {
|
||||
background-color: #b5cf6b;
|
||||
fill: #7FA8D1;
|
||||
}
|
||||
|
||||
.q4 {
|
||||
background-color: #637939;
|
||||
fill: #49729B;
|
||||
}
|
||||
|
||||
.q5 {
|
||||
background-color: #3b6427;
|
||||
fill: #254E77;
|
||||
}
|
||||
|
||||
.domain-background {
|
||||
fill: none;
|
||||
shape-rendering: crispedges;
|
||||
}
|
||||
|
||||
.ch-tooltip {
|
||||
position: absolute;
|
||||
display: none;
|
||||
margin-top: 22px;
|
||||
margin-left: 1px;
|
||||
font-size: 13px;
|
||||
padding: 3px;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -54,6 +54,11 @@ pre {
|
|||
text-shadow: none;
|
||||
}
|
||||
|
||||
.dropdown-menu-align-right {
|
||||
left: auto;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.dropdown-menu > li > a:hover,
|
||||
.dropdown-menu > li > a:focus {
|
||||
background: $bg_primary;
|
||||
|
@ -207,24 +212,16 @@ li.note {
|
|||
}
|
||||
}
|
||||
|
||||
.no-ssh-key-message {
|
||||
padding: 10px 0;
|
||||
background: #C67;
|
||||
margin: 0;
|
||||
color: #FFF;
|
||||
margin-top: -1px;
|
||||
.browser-alert {
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
|
||||
background: #C67;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
a {
|
||||
color: #fff;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.links-xs {
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
padding: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.warning_message {
|
||||
|
@ -281,10 +278,6 @@ img.emoji {
|
|||
height: 220px;
|
||||
}
|
||||
|
||||
.navless-container {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.description-block {
|
||||
@extend .light-well;
|
||||
@extend .light;
|
||||
|
@ -300,11 +293,17 @@ table {
|
|||
|
||||
.dashboard-intro-icon {
|
||||
float: left;
|
||||
text-align: center;
|
||||
font-size: 32px;
|
||||
color: #AAA;
|
||||
padding: 5px 0;
|
||||
width: 50px;
|
||||
min-height: 100px;
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.dashboard-intro-text {
|
||||
display: inline-block;
|
||||
margin-left: -60px;
|
||||
padding-left: 60px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.broadcast-message {
|
||||
|
@ -330,14 +329,14 @@ table {
|
|||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
.container .content { margin-top: 20px; }
|
||||
}
|
||||
|
||||
.wiki .highlight, .note-body .highlight {
|
||||
margin-bottom: 9px;
|
||||
}
|
||||
|
||||
.wiki .code {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.footer-links a {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
@ -359,3 +358,9 @@ table {
|
|||
.task-status {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
#nprogress .spinner {
|
||||
top: auto !important;
|
||||
bottom: 20px !important;
|
||||
left: 20px !important;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
}
|
||||
.file-content {
|
||||
background: #fff;
|
||||
font-size: 11px;
|
||||
|
||||
&.image_file {
|
||||
background: #eee;
|
||||
|
@ -54,8 +53,6 @@
|
|||
}
|
||||
|
||||
&.wiki {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
padding: 25px;
|
||||
|
||||
.highlight {
|
||||
|
|
|
@ -31,7 +31,12 @@ fieldset legend {
|
|||
margin-bottom: 18px;
|
||||
background-color: whitesmoke;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
padding-left: 17%;
|
||||
}
|
||||
|
||||
@media (min-width: $screen-sm-min) {
|
||||
.form-actions {
|
||||
padding-left: 17%;
|
||||
}
|
||||
}
|
||||
|
||||
label {
|
||||
|
@ -88,139 +93,7 @@ label {
|
|||
@include box-shadow(none);
|
||||
}
|
||||
|
||||
.issuable-description {
|
||||
.issuable-description,
|
||||
.wiki-content {
|
||||
margin-top: 35px;
|
||||
}
|
||||
|
||||
.zennable {
|
||||
position: relative;
|
||||
|
||||
input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.collapse {
|
||||
display: none;
|
||||
opacity: 0.5;
|
||||
|
||||
&:before {
|
||||
content: '\f066';
|
||||
font-family: FontAwesome;
|
||||
color: #000;
|
||||
font-size: 28px;
|
||||
position: relative;
|
||||
padding: 30px 40px 0 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
|
||||
.expand {
|
||||
opacity: 0.5;
|
||||
|
||||
&:before {
|
||||
content: '\f065';
|
||||
font-family: FontAwesome;
|
||||
color: #000;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
padding-right: 20px;
|
||||
position: relative;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop .expand {
|
||||
display: none;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop .collapse {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
position: absolute;
|
||||
top: -26px;
|
||||
right: 0;
|
||||
font-variant: small-caps;
|
||||
text-transform: uppercase;
|
||||
font-size: 10px;
|
||||
padding: 4px;
|
||||
font-weight: 500;
|
||||
letter-spacing: 1px;
|
||||
|
||||
&:before {
|
||||
display: inline-block;
|
||||
width: 10px;
|
||||
height: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop {
|
||||
background-color: white;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 1031;
|
||||
|
||||
textarea {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
border-radius: 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;
|
||||
}
|
||||
}
|
||||
|
||||
.zen-backdrop textarea::-webkit-input-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea:-moz-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea::-moz-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea:-ms-input-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea:-moz-placeholder {
|
||||
color: #999;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea::-moz-placeholder {
|
||||
color: #999;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea:-ms-input-placeholder {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
.issue-form, .merge-request-form, .wiki-form {
|
||||
.description {
|
||||
height: 20em;
|
||||
border-top-left-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,4 +18,4 @@
|
|||
.description {
|
||||
height: 14em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.highlighted-data {
|
||||
.file-content.code {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
margin: 0px;
|
||||
|
@ -10,11 +10,16 @@
|
|||
border: none;
|
||||
border-radius: 0;
|
||||
font-family: $monospace_font;
|
||||
font-size: 12px !important;
|
||||
line-height: 16px !important;
|
||||
font-size: $code_font_size !important;
|
||||
line-height: $code_line_height !important;
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
overflow-y: hidden;
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
|
||||
code {
|
||||
font-family: $monospace_font;
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
padding: 0;
|
||||
|
@ -25,10 +30,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
.hljs {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.line-numbers {
|
||||
padding: 10px;
|
||||
text-align: right;
|
||||
|
@ -37,8 +38,8 @@
|
|||
a {
|
||||
font-family: $monospace_font;
|
||||
display: block;
|
||||
font-size: 12px !important;
|
||||
line-height: 16px !important;
|
||||
font-size: $code_font_size !important;
|
||||
line-height: $code_line_height !important;
|
||||
white-space: nowrap;
|
||||
|
||||
i {
|
||||
|
@ -51,14 +52,19 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.highlight {
|
||||
overflow: auto;
|
||||
overflow-y: hidden;
|
||||
.note-text .code {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
background: $box_bg;
|
||||
padding: 1em;
|
||||
overflow-x: auto;
|
||||
|
||||
pre {
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
}
|
||||
code {
|
||||
font-family: $monospace_font;
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,123 +1,32 @@
|
|||
/**
|
||||
* Issue box:
|
||||
* Huge block (one per page) for storing title, descripion and other information.
|
||||
* Issue box for showing Open/Closed state:
|
||||
* Used for Issue#show page, MergeRequest#show page etc
|
||||
*
|
||||
* CLasses:
|
||||
* .issue-box - Regular box
|
||||
*/
|
||||
|
||||
.issue-box {
|
||||
color: #555;
|
||||
margin:20px 0;
|
||||
background: $box_bg;
|
||||
@include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09));
|
||||
display: inline-block;
|
||||
padding: 7px 13px;
|
||||
font-weight: normal;
|
||||
margin-right: 5px;
|
||||
|
||||
&.issue-box-closed {
|
||||
.state {
|
||||
background-color: #F3CECE;
|
||||
border-color: $border_danger;
|
||||
}
|
||||
.state-label {
|
||||
background-color: $bg_danger;
|
||||
color: #FFF;
|
||||
}
|
||||
background-color: $bg_danger;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
&.issue-box-merged {
|
||||
.state {
|
||||
background-color: #B7CEE7;
|
||||
border-color: $border_primary;
|
||||
}
|
||||
.state-label {
|
||||
background-color: $bg_primary;
|
||||
color: #FFF;
|
||||
}
|
||||
background-color: $bg_primary;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
&.issue-box-open {
|
||||
.state {
|
||||
background-color: #D6F1D7;
|
||||
border-color: $bg_success;
|
||||
}
|
||||
.state-label {
|
||||
background-color: $bg_success;
|
||||
color: #FFF;
|
||||
}
|
||||
background-color: $bg_success;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
&.issue-box-expired {
|
||||
.state {
|
||||
background-color: #EEE9B3;
|
||||
border-color: #faebcc;
|
||||
}
|
||||
.state-label {
|
||||
background: #cea61b;
|
||||
color: #FFF;
|
||||
}
|
||||
}
|
||||
|
||||
.control-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.state {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 28px;
|
||||
font-weight: normal;
|
||||
line-height: 1.5;
|
||||
margin: 0;
|
||||
color: #333;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
|
||||
.context {
|
||||
border: none;
|
||||
border-top: 1px solid #eee;
|
||||
padding: 10px 15px;
|
||||
|
||||
// Reset text align for children
|
||||
.text-right > * { text-align: left; }
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
// Don't right align on mobile
|
||||
.text-right { text-align: left; }
|
||||
|
||||
.row .col-md-6 {
|
||||
padding-top: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.description {
|
||||
padding: 0 15px 10px 15px;
|
||||
|
||||
code {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
}
|
||||
|
||||
.title, .context, .description {
|
||||
.clearfix {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.state-label {
|
||||
font-size: 14px;
|
||||
float: left;
|
||||
font-weight: bold;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
|
||||
.creator {
|
||||
float: right;
|
||||
padding: 10px 15px;
|
||||
a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
background: #cea61b;
|
||||
color: #FFF;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,12 +69,11 @@
|
|||
}
|
||||
|
||||
.well-title {
|
||||
font-size: 14px;
|
||||
font-size: $list-font-size;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.row_title {
|
||||
font-weight: 500;
|
||||
color: #444;
|
||||
&:hover {
|
||||
color: #444;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
opacity: 0;
|
||||
font-size: 50px;
|
||||
transition: opacity 200ms ease-in-out;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.div-dropzone-spinner {
|
||||
|
@ -50,3 +51,29 @@
|
|||
margin-bottom: 0;
|
||||
transition: opacity 200ms ease-in-out;
|
||||
}
|
||||
|
||||
.md-preview-holder {
|
||||
background: #FFF;
|
||||
border: 1px solid #ddd;
|
||||
min-height: 100px;
|
||||
padding: 5px;
|
||||
font-size: 14px;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.new_note,
|
||||
.edit_note,
|
||||
.issuable-description,
|
||||
.milestone-description,
|
||||
.wiki-content,
|
||||
.merge-request-form {
|
||||
.nav-tabs {
|
||||
margin-bottom: 0;
|
||||
border: none;
|
||||
|
||||
li a,
|
||||
li.active a {
|
||||
border: 1px solid #DDD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
74
app/assets/stylesheets/generic/mobile.scss
Normal file
|
@ -0,0 +1,74 @@
|
|||
/** Common mobile (screen XS, SM) styles **/
|
||||
@media (max-width: $screen-xs-max) {
|
||||
.container .content {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.nav.nav-tabs > li > a {
|
||||
padding: 10px;
|
||||
font-size: 12px;
|
||||
margin-right: 3px;
|
||||
|
||||
.badge {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.issues-filters,
|
||||
.dash-projects-filters,
|
||||
.check-all-holder {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.rss-btn {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.project-home-panel {
|
||||
.star-fork-buttons {
|
||||
padding-top: 10px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.project-home-links {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-sm-max) {
|
||||
.issues-filters {
|
||||
.milestone-filter, .labels-filter {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.page-title .new-issue-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.issue_edited_ago, .note_edited_ago {
|
||||
display: none;
|
||||
}
|
||||
|
||||
aside {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.show-aside {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
|
||||
.show-aside {
|
||||
display: none;
|
||||
position: fixed;
|
||||
right: 0px;
|
||||
top: 30%;
|
||||
padding: 5px 15px;
|
||||
background: #EEE;
|
||||
font-size: 20px;
|
||||
color: #777;
|
||||
z-index: 100;
|
||||
@include box-shadow(0 1px 2px #DDD);
|
||||
}
|
|
@ -116,6 +116,18 @@ select {
|
|||
}
|
||||
}
|
||||
|
||||
.group-result {
|
||||
.group-image {
|
||||
float: left;
|
||||
}
|
||||
.group-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
.group-path {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
.user-result {
|
||||
.user-image {
|
||||
float: left;
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
.ui.sidebar {
|
||||
z-index: 1000 !important;
|
||||
background: #fff;
|
||||
padding: 10px;
|
||||
width: 285px;
|
||||
}
|
||||
|
||||
.ui.right.sidebar {
|
||||
border-left: 1px solid #e1e1e1;
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
.sidebar-expand-button {
|
||||
cursor: pointer;
|
||||
transition: all 0.4s;
|
||||
-moz-transition: all 0.4s;
|
||||
-webkit-transition: all 0.4s;
|
||||
}
|
||||
|
||||
.fixed.sidebar-expand-button {
|
||||
background: #f9f9f9;
|
||||
color: #555;
|
||||
padding: 9px 12px 6px 14px;
|
||||
border: 1px solid #E1E1E1;
|
||||
border-right: 0;
|
||||
position: fixed;
|
||||
top: 108px;
|
||||
right: 0px;
|
||||
margin-right: 0;
|
||||
&:hover {
|
||||
background: #ddd;
|
||||
color: #333;
|
||||
padding-right: 25px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn.btn-default.sidebar-expand-button {
|
||||
margin-left: 12px;
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
@media (min-width: 767px) {
|
||||
.btn.btn-default.sidebar-expand-button {
|
||||
display: none!important;
|
||||
}
|
||||
}
|
20
app/assets/stylesheets/generic/tables.scss
Normal file
|
@ -0,0 +1,20 @@
|
|||
table {
|
||||
&.table {
|
||||
tr {
|
||||
td, th {
|
||||
padding: 8px 10px;
|
||||
line-height: 20px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
th {
|
||||
font-weight: normal;
|
||||
font-size: 15px;
|
||||
border-bottom: 1px solid #CCC !important;
|
||||
}
|
||||
td {
|
||||
border-color: #F1F1F1 !important;
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -42,7 +42,7 @@
|
|||
background: #fff;
|
||||
color: #737881;
|
||||
float: left;
|
||||
@include border-radius(40px);
|
||||
@include border-radius($avatar_radius);
|
||||
@include box-shadow(0 0 0 3px #EEE);
|
||||
overflow: hidden;
|
||||
|
||||
|
@ -58,6 +58,10 @@
|
|||
padding: 10px 15px;
|
||||
margin-left: 60px;
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
&:after {
|
||||
content: '';
|
||||
display: block;
|
||||
|
@ -74,4 +78,57 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.system-note .timeline-entry-inner {
|
||||
.timeline-icon {
|
||||
background: none;
|
||||
margin-left: 12px;
|
||||
margin-top: 0;
|
||||
@include box-shadow(none);
|
||||
|
||||
span {
|
||||
margin: 0 2px;
|
||||
font-size: 16px;
|
||||
color: #eeeeee;
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-content {
|
||||
background: none;
|
||||
margin-left: 45px;
|
||||
padding: 0px 15px;
|
||||
|
||||
&:after { border: 0; }
|
||||
|
||||
.note-header {
|
||||
span { font-size: 12px; }
|
||||
|
||||
.avatar {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.note-text {
|
||||
font-size: 12px;
|
||||
margin-left: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
.timeline {
|
||||
&:before {
|
||||
background: none;
|
||||
}
|
||||
.timeline-entry .timeline-entry-inner {
|
||||
.timeline-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.timeline-content {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,10 @@ h3.page-title {
|
|||
font-size: 22px;
|
||||
}
|
||||
|
||||
h4.page-title {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
h6 {
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
|
@ -128,3 +132,7 @@ a:focus {
|
|||
textarea.js-gfm-input {
|
||||
font-family: $monospace_font;
|
||||
}
|
||||
|
||||
.strikethrough {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
|
98
app/assets/stylesheets/generic/zen.scss
Normal file
|
@ -0,0 +1,98 @@
|
|||
.zennable {
|
||||
position: relative;
|
||||
|
||||
input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.zen-enter-link {
|
||||
color: #888;
|
||||
position: absolute;
|
||||
top: -26px;
|
||||
right: 4px;
|
||||
}
|
||||
|
||||
.zen-leave-link {
|
||||
display: none;
|
||||
color: #888;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
padding: 5px;
|
||||
font-size: 36px;
|
||||
|
||||
&:hover {
|
||||
color: #111;
|
||||
}
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop .zen-enter-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop .zen-leave-link {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop {
|
||||
background-color: white;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 1031;
|
||||
|
||||
textarea {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
border-radius: 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;
|
||||
}
|
||||
}
|
||||
|
||||
.zen-backdrop textarea::-webkit-input-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea:-moz-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea::-moz-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea:-ms-input-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea:-moz-placeholder {
|
||||
color: #999;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea::-moz-placeholder {
|
||||
color: #999;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea:-ms-input-placeholder {
|
||||
color: #999;
|
||||
}
|
||||
}
|
|
@ -1,9 +1,6 @@
|
|||
/*
|
||||
* Twitter bootstrap with GitLab customizations/additions
|
||||
*
|
||||
* Some unused bootstrap compontents like panels are not included.
|
||||
* Other components like tabs are modified to GitLab style.
|
||||
*
|
||||
*/
|
||||
|
||||
$font-size-base: 13px !default;
|
||||
|
@ -148,6 +145,10 @@ $list-group-active-bg: $bg_primary;
|
|||
color: #666;
|
||||
}
|
||||
|
||||
.nav-compact > li > a {
|
||||
padding: 6px 12px;
|
||||
}
|
||||
|
||||
.nav-small > li > a {
|
||||
padding: 3px 5px;
|
||||
font-size: 12px;
|
||||
|
|