summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorVinnie Okada <vokada@mrvinn.com>2015-02-19 20:53:05 -0700
committerVinnie Okada <vokada@mrvinn.com>2015-02-19 20:53:05 -0700
commit9e9ce95d62ec4feb76c3ec238dd3189c781f40ce (patch)
tree28939e566ce29a278cd7ae15e37266aa6a16a17c /app
parent76aad9b76ed756ca9ba2cbcdb399c815e542b3ae (diff)
parentde040ffaaef4ad5ebd93b3f7a237add438dbddd5 (diff)
downloadgitlab-ce-9e9ce95d62ec4feb76c3ec238dd3189c781f40ce.tar.gz
Merge branch 'master' into rails-4.1.9
Conflicts: app/views/dashboard/_project.html.haml app/views/events/event/_common.html.haml app/views/explore/projects/_project.html.haml app/views/groups/_projects.html.haml app/views/projects/_home_panel.html.haml app/views/projects/_issues_nav.html.haml app/views/projects/issues/_discussion.html.haml app/views/projects/issues/_issues.html.haml app/views/projects/issues/show.html.haml app/views/projects/merge_requests/_discussion.html.haml app/views/projects/merge_requests/_show.html.haml app/views/projects/milestones/index.html.haml app/views/projects/notes/_edit_form.html.haml app/views/shared/_issuable_filter.html.haml
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/issue.js.coffee6
-rw-r--r--app/assets/javascripts/issues.js.coffee6
-rw-r--r--app/assets/javascripts/merge_request.js.coffee6
-rw-r--r--app/assets/javascripts/notes.js.coffee10
-rw-r--r--app/assets/stylesheets/generic/typography.scss6
-rw-r--r--app/assets/stylesheets/highlight/dark.scss1
-rw-r--r--app/assets/stylesheets/highlight/monokai.scss5
-rw-r--r--app/assets/stylesheets/highlight/solarized_dark.scss5
-rw-r--r--app/assets/stylesheets/highlight/solarized_light.scss5
-rw-r--r--app/assets/stylesheets/highlight/white.scss5
-rw-r--r--app/assets/stylesheets/sections/dashboard.scss9
-rw-r--r--app/assets/stylesheets/sections/events.scss4
-rw-r--r--app/assets/stylesheets/sections/issuable.scss25
-rw-r--r--app/assets/stylesheets/sections/issues.scss11
-rw-r--r--app/assets/stylesheets/sections/merge_requests.scss13
-rw-r--r--app/assets/stylesheets/sections/nav_sidebar.scss12
-rw-r--r--app/controllers/admin/application_settings_controller.rb1
-rw-r--r--app/controllers/dashboard_controller.rb24
-rw-r--r--app/controllers/explore/projects_controller.rb2
-rw-r--r--app/controllers/groups_controller.rb26
-rw-r--r--app/controllers/profiles_controller.rb1
-rw-r--r--app/controllers/projects/tags_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb13
-rw-r--r--app/controllers/users_controller.rb21
-rw-r--r--app/finders/trending_projects_finder.rb2
-rw-r--r--app/helpers/application_helper.rb8
-rw-r--r--app/helpers/application_settings_helper.rb4
-rw-r--r--app/helpers/blob_helper.rb2
-rw-r--r--app/helpers/events_helper.rb53
-rw-r--r--app/helpers/gitlab_markdown_helper.rb9
-rw-r--r--app/models/application_setting.rb2
-rw-r--r--app/models/event.rb108
-rw-r--r--app/models/members/project_member.rb23
-rw-r--r--app/models/user.rb26
-rw-r--r--app/services/create_branch_service.rb2
-rw-r--r--app/services/create_tag_service.rb2
-rw-r--r--app/services/delete_branch_service.rb2
-rw-r--r--app/services/event_create_service.rb72
-rw-r--r--app/services/git_push_service.rb11
-rw-r--r--app/services/git_tag_push_service.rb11
-rw-r--r--app/services/projects/create_service.rb12
-rw-r--r--app/views/admin/application_settings/_form.html.haml5
-rw-r--r--app/views/admin/applications/index.html.haml2
-rw-r--r--app/views/admin/projects/index.html.haml14
-rw-r--r--app/views/dashboard/_activities.html.haml7
-rw-r--r--app/views/dashboard/_groups.html.haml2
-rw-r--r--app/views/dashboard/_project.html.haml2
-rw-r--r--app/views/devise/sessions/_new_base.html.haml8
-rw-r--r--app/views/events/_event.html.haml6
-rw-r--r--app/views/events/event/_common.html.haml10
-rw-r--r--app/views/events/event/_created_project.html.haml27
-rw-r--r--app/views/events/event/_note.html.haml6
-rw-r--r--app/views/events/event/_push.html.haml2
-rw-r--r--app/views/explore/projects/_project.html.haml8
-rw-r--r--app/views/groups/_projects.html.haml2
-rw-r--r--app/views/groups/show.html.haml5
-rw-r--r--app/views/help/index.html.haml6
-rw-r--r--app/views/layouts/nav/_project.html.haml14
-rw-r--r--app/views/profiles/applications.html.haml10
-rw-r--r--app/views/projects/_home_panel.html.haml2
-rw-r--r--app/views/projects/_issuable_form.html.haml2
-rw-r--r--app/views/projects/_issues_nav.html.haml51
-rw-r--r--app/views/projects/_md_preview.html.haml2
-rw-r--r--app/views/projects/_visibility_level.html.haml2
-rw-r--r--app/views/projects/diffs/_warning.html.haml2
-rw-r--r--app/views/projects/issues/_discussion.html.haml40
-rw-r--r--app/views/projects/issues/_issues.html.haml15
-rw-r--r--app/views/projects/issues/index.html.haml34
-rw-r--r--app/views/projects/issues/show.html.haml69
-rw-r--r--app/views/projects/labels/index.html.haml2
-rw-r--r--app/views/projects/merge_requests/_discussion.html.haml37
-rw-r--r--app/views/projects/merge_requests/_merge_request.html.haml2
-rw-r--r--app/views/projects/merge_requests/_new_submit.html.haml2
-rw-r--r--app/views/projects/merge_requests/_show.html.haml65
-rw-r--r--app/views/projects/merge_requests/index.html.haml7
-rw-r--r--app/views/projects/merge_requests/show/_mr_accept.html.haml2
-rw-r--r--app/views/projects/milestones/_form.html.haml2
-rw-r--r--app/views/projects/milestones/index.html.haml14
-rw-r--r--app/views/projects/milestones/show.html.haml1
-rw-r--r--app/views/projects/new.html.haml6
-rw-r--r--app/views/projects/notes/_edit_form.html.haml2
-rw-r--r--app/views/projects/notes/_form.html.haml2
-rw-r--r--app/views/projects/wikis/_form.html.haml2
-rw-r--r--app/views/shared/_file_highlight.html.haml3
-rw-r--r--app/views/shared/_issuable_filter.html.haml193
-rw-r--r--app/views/shared/_milestones_filter.html.haml2
-rw-r--r--app/views/users/_projects.html.haml27
-rw-r--r--app/views/users/calendar.html.haml2
-rw-r--r--app/views/users/show.html.haml4
89 files changed, 760 insertions, 540 deletions
diff --git a/app/assets/javascripts/issue.js.coffee b/app/assets/javascripts/issue.js.coffee
index 45c248e6fb6..9b7c1be8355 100644
--- a/app/assets/javascripts/issue.js.coffee
+++ b/app/assets/javascripts/issue.js.coffee
@@ -15,3 +15,9 @@ class @Issue
"issue"
updateTaskState
)
+
+ $('.issuable-affix').affix offset:
+ top: ->
+ @top = $('.issue-details').outerHeight(true) + 25
+ bottom: ->
+ @bottom = $('.footer').outerHeight(true)
diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee
index 2499ad5ad80..6513f4bcefc 100644
--- a/app/assets/javascripts/issues.js.coffee
+++ b/app/assets/javascripts/issues.js.coffee
@@ -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()
diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee
index 5bcbd56852d..757592842eb 100644
--- a/app/assets/javascripts/merge_request.js.coffee
+++ b/app/assets/javascripts/merge_request.js.coffee
@@ -20,6 +20,12 @@ class @MergeRequest
if $("a.btn-close").length
$("li.task-list-item input:checkbox").prop("disabled", false)
+ $('.issuable-affix').affix offset:
+ top: ->
+ @top = $('.merge-request-details').outerHeight(true) + 70
+ bottom: ->
+ @bottom = $('.footer').outerHeight(true)
+
# Local jQuery finder
$: (selector) ->
this.$el.find(selector)
diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee
index 47c5ecdedf1..1c090bd06dc 100644
--- a/app/assets/javascripts/notes.js.coffee
+++ b/app/assets/javascripts/notes.js.coffee
@@ -77,7 +77,7 @@ class @Notes
$(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"
@@ -272,7 +272,7 @@ class @Notes
note_li = $(".note-row-" + note.id)
note_li.replaceWith(note.html)
note_li.find('.note-edit-form').hide()
- note_li.find('.note-text').show()
+ note_li.find('.note-body > .note-text').show()
###
Called in response to clicking the edit note link
@@ -284,7 +284,7 @@ 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)
@@ -311,7 +311,7 @@ class @Notes
cancelEdit: (e) ->
e.preventDefault()
note = $(this).closest(".note")
- note.find(".note-text").show()
+ note.find(".note-body > .note-text").show()
note.find(".note-header").show()
note.find(".current-note-edit-form").remove()
@@ -345,7 +345,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()
diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss
index 58243bc5ba2..c547ebb3aaf 100644
--- a/app/assets/stylesheets/generic/typography.scss
+++ b/app/assets/stylesheets/generic/typography.scss
@@ -17,6 +17,10 @@ h3.page-title {
font-size: 22px;
}
+h4.page-title {
+ margin-top: 0px;
+}
+
h6 {
color: #888;
text-transform: uppercase;
@@ -131,4 +135,4 @@ textarea.js-gfm-input {
.strikethrough {
text-decoration: line-through;
-} \ No newline at end of file
+}
diff --git a/app/assets/stylesheets/highlight/dark.scss b/app/assets/stylesheets/highlight/dark.scss
index 4095d35b05f..fcd4d47bace 100644
--- a/app/assets/stylesheets/highlight/dark.scss
+++ b/app/assets/stylesheets/highlight/dark.scss
@@ -12,6 +12,7 @@
border-left: 1px solid #666;
}
+ // highlight line via anchor
pre.hll {
background-color: #fff !important;
}
diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss
index 730018e3e28..bcd2e716657 100644
--- a/app/assets/stylesheets/highlight/monokai.scss
+++ b/app/assets/stylesheets/highlight/monokai.scss
@@ -12,6 +12,11 @@
border-left: 1px solid #555;
}
+ // highlight line via anchor
+ pre.hll {
+ background-color: #49483e !important;
+ }
+
.hll { background-color: #49483e }
.c { color: #75715e } /* Comment */
.err { color: #960050; background-color: #1e0010 } /* Error */
diff --git a/app/assets/stylesheets/highlight/solarized_dark.scss b/app/assets/stylesheets/highlight/solarized_dark.scss
index be6904100ec..4a6b759bd2c 100644
--- a/app/assets/stylesheets/highlight/solarized_dark.scss
+++ b/app/assets/stylesheets/highlight/solarized_dark.scss
@@ -12,6 +12,11 @@
border-left: 1px solid #113b46;
}
+ // highlight line via anchor
+ pre.hll {
+ background-color: #073642 !important;
+ }
+
/* Solarized Dark
For use with Jekyll and Pygments
diff --git a/app/assets/stylesheets/highlight/solarized_light.scss b/app/assets/stylesheets/highlight/solarized_light.scss
index 55be6e30383..7254f4d7ac1 100644
--- a/app/assets/stylesheets/highlight/solarized_light.scss
+++ b/app/assets/stylesheets/highlight/solarized_light.scss
@@ -12,6 +12,11 @@
border-left: 1px solid #c5d0d4;
}
+ // highlight line via anchor
+ pre.hll {
+ background-color: #eee8d5 !important;
+ }
+
/* Solarized Light
For use with Jekyll and Pygments
diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss
index 050a5d241a6..4d6f5dfd91e 100644
--- a/app/assets/stylesheets/highlight/white.scss
+++ b/app/assets/stylesheets/highlight/white.scss
@@ -12,6 +12,11 @@
border-left: 1px solid #bbb;
}
+ // highlight line via anchor
+ pre.hll {
+ background-color: #f8eec7 !important;
+ }
+
.hll { background-color: #f8f8f8 }
.c { color: #999988; font-style: italic; }
.err { color: #a61717; background-color: #e3d2d2; }
diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss
index 77d403cc687..feb9a4ad295 100644
--- a/app/assets/stylesheets/sections/dashboard.scss
+++ b/app/assets/stylesheets/sections/dashboard.scss
@@ -120,6 +120,15 @@
}
}
+.dash-new-group {
+ background: $bg_success;
+ border: 1px solid $border_success;
+
+ a {
+ color: #FFF;
+ }
+}
+
.dash-list .str-truncated {
max-width: 72%;
}
diff --git a/app/assets/stylesheets/sections/events.scss b/app/assets/stylesheets/sections/events.scss
index 9582c995980..b7614513216 100644
--- a/app/assets/stylesheets/sections/events.scss
+++ b/app/assets/stylesheets/sections/events.scss
@@ -64,6 +64,10 @@
.md {
font-size: 13px;
+
+ iframe.twitter-share-button {
+ vertical-align: bottom;
+ }
}
pre {
diff --git a/app/assets/stylesheets/sections/issuable.scss b/app/assets/stylesheets/sections/issuable.scss
new file mode 100644
index 00000000000..75bd39853bd
--- /dev/null
+++ b/app/assets/stylesheets/sections/issuable.scss
@@ -0,0 +1,25 @@
+@media (max-width: $screen-sm-max) {
+ .issuable-affix {
+ margin-top: 20px;
+ }
+}
+
+@media (max-width: $screen-md-max) {
+ .issuable-affix {
+ position: static;
+ }
+}
+
+@media (min-width: $screen-md-max) {
+ .issuable-affix {
+ &.affix-top {
+ position: static;
+ }
+
+ &.affix {
+ position: fixed;
+ top: 70px;
+ width: 220px;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss
index 7a9d3334d96..ccfc9b704a6 100644
--- a/app/assets/stylesheets/sections/issues.scss
+++ b/app/assets/stylesheets/sections/issues.scss
@@ -94,8 +94,15 @@
}
}
-.issue-show-labels .color-label {
- padding: 6px 10px;
+.issue-show-labels {
+ a {
+ margin-right: 5px;
+ margin-bottom: 5px;
+ display: inline-block;
+ .color-label {
+ padding: 6px 10px;
+ }
+ }
}
form.edit-issue {
diff --git a/app/assets/stylesheets/sections/merge_requests.scss b/app/assets/stylesheets/sections/merge_requests.scss
index 0e27c389387..a3eabb5e330 100644
--- a/app/assets/stylesheets/sections/merge_requests.scss
+++ b/app/assets/stylesheets/sections/merge_requests.scss
@@ -24,6 +24,7 @@
.accept-control {
display: inline-block;
+ margin: 0;
margin-left: 20px;
padding: 10px 0;
line-height: 20px;
@@ -31,6 +32,7 @@
.remove_source_checkbox {
margin: 0;
+ font-weight: bold;
}
}
}
@@ -185,6 +187,13 @@
}
}
-.merge-request-show-labels .label {
- padding: 6px 10px;
+.merge-request-show-labels {
+ a {
+ margin-right: 5px;
+ margin-bottom: 5px;
+ display: inline-block;
+ .color-label {
+ padding: 6px 10px;
+ }
+ }
}
diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss
index 9c7d1a03a03..3ef2a578b7f 100644
--- a/app/assets/stylesheets/sections/nav_sidebar.scss
+++ b/app/assets/stylesheets/sections/nav_sidebar.scss
@@ -40,12 +40,16 @@
.nav-sidebar li {
&.active a {
- color: #111;
- background: #EEE;
+ color: #333;
+ background: #FFF;
font-weight: bold;
+ border: 1px solid #EEE;
+ border-right: 1px solid transparent;
+ border-left: 3px solid $style_color;
&.no-highlight {
background: none;
+ border: none;
}
i {
@@ -65,7 +69,7 @@
color: #555;
display: block;
text-decoration: none;
- padding: 6px 15px;
+ padding: 8px 15px;
font-size: 13px;
line-height: 20px;
text-shadow: 0 1px 2px #FFF;
@@ -133,7 +137,7 @@
li a {
padding-left: 18px;
font-size: 14px;
- padding: 10px 15px;
+ padding: 8px 15px;
text-align: center;
& > span {
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index 7458542fc73..2b0c500e97a 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -26,6 +26,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
:signup_enabled,
:signin_enabled,
:gravatar_enabled,
+ :twitter_sharing_enabled,
:sign_in_text,
:home_page_url
)
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 9e59264e418..eca7b39bcdf 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -12,11 +12,7 @@ class DashboardController < ApplicationController
@groups = current_user.authorized_groups.order_name_asc
@has_authorized_projects = @projects.count > 0
@projects_count = @projects.count
- @projects = @projects.limit(@projects_limit)
-
- @events = Event.in_projects(current_user.authorized_projects.pluck(:id))
- @events = @event_filter.apply_filter(@events)
- @events = @events.limit(20).offset(params[:offset] || 0)
+ @projects = @projects.includes(:namespace).limit(@projects_limit)
@last_push = current_user.recent_push
@@ -24,8 +20,16 @@ class DashboardController < ApplicationController
respond_to do |format|
format.html
- format.json { pager_json("events/_events", @events.count) }
- format.atom { render layout: false }
+
+ format.json do
+ load_events
+ pager_json("events/_events", @events.count)
+ end
+
+ format.atom do
+ load_events
+ render layout: false
+ end
end
end
@@ -74,4 +78,10 @@ class DashboardController < ApplicationController
def load_projects
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
end
+
+ def load_events
+ @events = Event.in_projects(current_user.authorized_projects.pluck(:id))
+ @events = @event_filter.apply_filter(@events).with_associations
+ @events = @events.limit(20).offset(params[:offset] || 0)
+ end
end
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index d75fd8e72fa..0e5891ae807 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -18,7 +18,7 @@ class Explore::ProjectsController < ApplicationController
def starred
@starred_projects = ProjectsFinder.new.execute(current_user)
- @starred_projects = @starred_projects.order('star_count DESC')
+ @starred_projects = @starred_projects.reorder('star_count DESC')
@starred_projects = @starred_projects.page(params[:page]).per(10)
end
end
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index aad3709090e..d011523c94f 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -10,11 +10,11 @@ class GroupsController < ApplicationController
# Load group projects
before_filter :load_projects, except: [:new, :create, :projects, :edit, :update]
+ before_filter :event_filter, only: :show
+ before_filter :set_title, only: [:new, :create]
layout :determine_layout
- before_filter :set_title, only: [:new, :create]
-
def new
@group = Group.new
end
@@ -32,15 +32,21 @@ class GroupsController < ApplicationController
end
def show
- @events = Event.in_projects(project_ids)
- @events = event_filter.apply_filter(@events)
- @events = @events.limit(20).offset(params[:offset] || 0)
@last_push = current_user.recent_push if current_user
+ @projects = @projects.includes(:namespace)
respond_to do |format|
format.html
- format.json { pager_json("events/_events", @events.count) }
- format.atom { render layout: false }
+
+ format.json do
+ load_events
+ pager_json("events/_events", @events.count)
+ end
+
+ format.atom do
+ load_events
+ render layout: false
+ end
end
end
@@ -149,4 +155,10 @@ class GroupsController < ApplicationController
def group_params
params.require(:group).permit(:name, :description, :path, :avatar)
end
+
+ def load_events
+ @events = Event.in_projects(project_ids)
+ @events = event_filter.apply_filter(@events).with_associations
+ @events = @events.limit(20).offset(params[:offset] || 0)
+ end
end
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
index f7584c03411..a7863aba756 100644
--- a/app/controllers/profiles_controller.rb
+++ b/app/controllers/profiles_controller.rb
@@ -16,6 +16,7 @@ class ProfilesController < ApplicationController
def applications
@applications = current_user.oauth_applications
@authorized_tokens = current_user.oauth_authorized_tokens
+ @authorized_apps = @authorized_tokens.map(&:application).uniq
end
def update
diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb
index dafbb4d51ea..08c7ce3f37d 100644
--- a/app/controllers/projects/tags_controller.rb
+++ b/app/controllers/projects/tags_controller.rb
@@ -27,7 +27,7 @@ class Projects::TagsController < Projects::ApplicationController
tag = @repository.find_tag(params[:id])
if tag && @repository.rm_tag(tag.name)
- Event.create_ref_event(@project, current_user, tag, 'rm', 'refs/tags')
+ EventCreateService.new.push_ref(@project, current_user, tag, 'rm', 'refs/tags')
end
respond_to do |format|
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index cf039d5f132..38341b1c8c6 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -5,9 +5,10 @@ class ProjectsController < ApplicationController
# Authorize
before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive]
+ before_filter :set_title, only: [:new, :create]
+ before_filter :event_filter, only: :show
layout 'navless', only: [:new, :create, :fork]
- before_filter :set_title, only: [:new, :create]
def new
@project = Project.new
@@ -65,9 +66,6 @@ class ProjectsController < ApplicationController
end
limit = (params[:limit] || 20).to_i
- @events = @project.events.recent
- @events = event_filter.apply_filter(@events)
- @events = @events.limit(limit).offset(params[:offset] || 0)
@show_star = !(current_user && current_user.starred?(@project))
@@ -85,7 +83,12 @@ class ProjectsController < ApplicationController
end
end
- format.json { pager_json('events/_events', @events.count) }
+ format.json do
+ @events = @project.events.recent
+ @events = event_filter.apply_filter(@events).with_associations
+ @events = @events.limit(limit).offset(params[:offset] || 0)
+ pager_json('events/_events', @events.count)
+ end
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 84a04c5ebe6..4c2fe4c3c8d 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -4,19 +4,20 @@ class UsersController < ApplicationController
layout :determine_layout
def show
- # Projects user can view
- visible_projects = ProjectsFinder.new.execute(current_user)
- authorized_projects_ids = visible_projects.pluck(:id)
+ @contributed_projects = Project.
+ where(id: authorized_projects_ids & @user.contributed_projects_ids).
+ in_group_namespace.includes(:namespace)
@projects = @user.personal_projects.
- where(id: authorized_projects_ids)
+ where(id: authorized_projects_ids).includes(:namespace)
# Collect only groups common for both users
@groups = @user.groups & GroupsFinder.new.execute(current_user)
# Get user activity feed for projects common for both users
@events = @user.recent_events.
- where(project_id: authorized_projects_ids).limit(30)
+ where(project_id: authorized_projects_ids).
+ with_associations.limit(30)
@title = @user.name
@title_url = user_path(@user)
@@ -28,8 +29,8 @@ class UsersController < ApplicationController
end
def calendar
- visible_projects = ProjectsFinder.new.execute(current_user)
- calendar = Gitlab::CommitsCalendar.new(visible_projects, @user)
+ projects = Project.where(id: authorized_projects_ids & @user.contributed_projects_ids)
+ calendar = Gitlab::CommitsCalendar.new(projects, @user)
@timestamps = calendar.timestamps
@starting_year = calendar.starting_year
@starting_month = calendar.starting_month
@@ -54,4 +55,10 @@ class UsersController < ApplicationController
return authenticate_user!
end
end
+
+ def authorized_projects_ids
+ # Projects user can view
+ @authorized_projects_ids ||=
+ ProjectsFinder.new.execute(current_user).pluck(:id)
+ end
end
diff --git a/app/finders/trending_projects_finder.rb b/app/finders/trending_projects_finder.rb
index 32d7968924a..a79bd47d986 100644
--- a/app/finders/trending_projects_finder.rb
+++ b/app/finders/trending_projects_finder.rb
@@ -8,7 +8,7 @@ class TrendingProjectsFinder
# for period of time - ex. month
projects.joins(:notes).where('notes.created_at > ?', start_date).
select("projects.*, count(notes.id) as ncount").
- group("projects.id").order("ncount DESC")
+ group("projects.id").reorder("ncount DESC")
end
private
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c3c77d9880f..365de3595cd 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -51,7 +51,13 @@ module ApplicationHelper
end
def project_icon(project_id, options = {})
- project = Project.find_with_namespace(project_id)
+ project =
+ if project_id.is_a?(Project)
+ project = project_id
+ else
+ Project.find_with_namespace(project_id)
+ end
+
if project.avatar.present?
image_tag project.avatar.url, options
elsif project.avatar_in_git
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index 04299316102..1ee086da997 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -3,6 +3,10 @@ module ApplicationSettingsHelper
current_application_settings.gravatar_enabled?
end
+ def twitter_sharing_enabled?
+ current_application_settings.twitter_sharing_enabled?
+ end
+
def signup_enabled?
current_application_settings.signup_enabled?
end
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index f5f27223d5b..798d62b3a09 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -17,7 +17,7 @@ module BlobHelper
end
def no_highlight_files
- %w(credits changelog copying copyright license authors)
+ %w(credits changelog news copying copyright license authors)
end
def edit_blob_link(project, ref, path, options = {})
diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb
index 6e7aa521302..063916a8df8 100644
--- a/app/helpers/events_helper.rb
+++ b/app/helpers/events_helper.rb
@@ -10,11 +10,15 @@ module EventsHelper
end
def event_action_name(event)
- target = if event.target_type
- event.target_type.titleize.downcase
- else
- 'project'
- end
+ target = if event.target_type
+ if event.note?
+ event.note_target_type
+ else
+ event.target_type.titleize.downcase
+ end
+ else
+ 'project'
+ end
[event.action_name, target].join(" ")
end
@@ -42,21 +46,30 @@ module EventsHelper
end
def event_feed_title(event)
- if event.issue?
- "#{event.author_name} #{event.action_name} issue ##{event.target_iid}: #{event.issue_title} at #{event.project_name}"
- elsif event.merge_request?
- "#{event.author_name} #{event.action_name} MR ##{event.target_iid}: #{event.merge_request_title} at #{event.project_name}"
- elsif event.push?
- "#{event.author_name} #{event.push_action_name} #{event.ref_type} #{event.ref_name} at #{event.project_name}"
- elsif event.membership_changed?
- "#{event.author_name} #{event.action_name} #{event.project_name}"
- elsif event.note? && event.note_commit?
- "#{event.author_name} commented on #{event.note_target_type} #{event.note_short_commit_id} at #{event.project_name}"
- elsif event.note?
- "#{event.author_name} commented on #{event.note_target_type} ##{truncate event.note_target_iid} at #{event.project_name}"
- else
- ""
+ words = []
+ words << event.author_name
+ words << event_action_name(event)
+
+ if event.push?
+ words << event.ref_type
+ words << event.ref_name
+ words << "at"
+ elsif event.commented?
+ if event.note_commit?
+ words << event.note_short_commit_id
+ else
+ words << "##{truncate event.note_target_iid}"
+ end
+ words << "at"
+ elsif event.target
+ words << "##{event.target_iid}:"
+ words << event.target.title if event.target.respond_to?(:title)
+ words << "at"
end
+
+ words << event.project_name
+
+ words.join(" ")
end
def event_feed_url(event)
@@ -106,8 +119,6 @@ module EventsHelper
render "events/event_push", event: event
elsif event.merge_request?
render "events/event_merge_request", merge_request: event.merge_request
- elsif event.push?
- render "events/event_push", event: event
elsif event.note?
render "events/event_note", note: event.note
end
diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb
index 800cacdc2c2..ab30f498c01 100644
--- a/app/helpers/gitlab_markdown_helper.rb
+++ b/app/helpers/gitlab_markdown_helper.rb
@@ -110,7 +110,7 @@ module GitlabMarkdownHelper
end
def link_to_ignore?(link)
- if link =~ /\#\w+/
+ if link =~ /\A\#\w+/
# ignore anchors like <a href="#my-header">
true
else
@@ -122,10 +122,11 @@ module GitlabMarkdownHelper
["http://","https://", "ftp://", "mailto:"]
end
- def rebuild_path(path)
- path.gsub!(/(#.*)/, "")
+ def rebuild_path(file_path)
+ file_path = file_path.dup
+ file_path.gsub!(/(#.*)/, "")
id = $1 || ""
- file_path = relative_file_path(path)
+ file_path = relative_file_path(file_path)
file_path = sanitize_slashes(file_path)
[
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 6d4e220b16c..f1d918e5457 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -8,6 +8,7 @@
# signup_enabled :boolean
# signin_enabled :boolean
# gravatar_enabled :boolean
+# twitter_sharing_enabled :boolean
# sign_in_text :text
# created_at :datetime
# updated_at :datetime
@@ -30,6 +31,7 @@ class ApplicationSetting < ActiveRecord::Base
default_branch_protection: Settings.gitlab['default_branch_protection'],
signup_enabled: Settings.gitlab['signup_enabled'],
signin_enabled: Settings.gitlab['signin_enabled'],
+ twitter_sharing_enabled: Settings.gitlab['twitter_sharing_enabled'],
gravatar_enabled: Settings.gravatar['enabled'],
sign_in_text: Settings.extra['sign_in_text'],
)
diff --git a/app/models/event.rb b/app/models/event.rb
index 9a42d380f87..5579ab1dbb0 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -47,31 +47,9 @@ class Event < ActiveRecord::Base
scope :recent, -> { order("created_at DESC") }
scope :code_push, -> { where(action: PUSHED) }
scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
+ scope :with_associations, -> { includes(project: :namespace) }
class << self
- def create_ref_event(project, user, ref, action = 'add', prefix = 'refs/heads')
- commit = project.repository.commit(ref.target)
-
- if action.to_s == 'add'
- before = '00000000'
- after = commit.id
- else
- before = commit.id
- after = '00000000'
- end
-
- Event.create(
- project: project,
- action: Event::PUSHED,
- data: {
- ref: "#{prefix}/#{ref.name}",
- before: before,
- after: after
- },
- author_id: user.id
- )
- end
-
def reset_event_cache_for(target)
Event.where(target_id: target.id, target_type: target.class.to_s).
order('id DESC').limit(100).
@@ -84,6 +62,8 @@ class Event < ActiveRecord::Base
true
elsif membership_changed?
true
+ elsif created_project?
+ true
else
(issue? || merge_request? || note? || milestone?) && target
end
@@ -98,25 +78,51 @@ class Event < ActiveRecord::Base
end
def target_title
- if target && target.respond_to?(:title)
- target.title
- end
+ target.title if target && target.respond_to?(:title)
+ end
+
+ def created?
+ action == CREATED
end
def push?
- action == self.class::PUSHED && valid_push?
+ action == PUSHED && valid_push?
end
def merged?
- action == self.class::MERGED
+ action == MERGED
end
def closed?
- action == self.class::CLOSED
+ action == CLOSED
end
def reopened?
- action == self.class::REOPENED
+ action == REOPENED
+ end
+
+ def joined?
+ action == JOINED
+ end
+
+ def left?
+ action == LEFT
+ end
+
+ def commented?
+ action == COMMENTED
+ end
+
+ def membership_changed?
+ joined? || left?
+ end
+
+ def created_project?
+ created? && !target
+ end
+
+ def created_target?
+ created? && target
end
def milestone?
@@ -135,32 +141,32 @@ class Event < ActiveRecord::Base
target_type == "MergeRequest"
end
- def joined?
- action == JOINED
- end
-
- def left?
- action == LEFT
- end
-
- def membership_changed?
- joined? || left?
+ def milestone
+ target if milestone?
end
def issue
- target if target_type == "Issue"
+ target if issue?
end
def merge_request
- target if target_type == "MergeRequest"
+ target if merge_request?
end
def note
- target if target_type == "Note"
+ target if note?
end
def action_name
- if closed?
+ if push?
+ if new_ref?
+ "pushed new"
+ elsif rm_ref?
+ "deleted"
+ else
+ "pushed to"
+ end
+ elsif closed?
"closed"
elsif merged?
"accepted"
@@ -168,6 +174,10 @@ class Event < ActiveRecord::Base
'joined'
elsif left?
'left'
+ elsif commented?
+ "commented on"
+ elsif created_project?
+ "created"
else
"opened"
end
@@ -236,16 +246,6 @@ class Event < ActiveRecord::Base
tag? ? "tag" : "branch"
end
- def push_action_name
- if new_ref?
- "pushed new"
- elsif rm_ref?
- "deleted"
- else
- "pushed to"
- end
- end
-
def push_with_commits?
md_ref? && commits.any? && commit_from && commit_to
end
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 30c09f768d7..e4791d0f0aa 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -114,13 +114,11 @@ class ProjectMember < Member
end
def post_create_hook
- Event.create(
- project_id: self.project.id,
- action: Event::JOINED,
- author_id: self.user.id
- )
-
- notification_service.new_team_member(self) unless owner?
+ unless owner?
+ event_service.join_project(self.project, self.user)
+ notification_service.new_team_member(self)
+ end
+
system_hook_service.execute_hooks_for(self, :create)
end
@@ -129,15 +127,14 @@ class ProjectMember < Member
end
def post_destroy_hook
- Event.create(
- project_id: self.project.id,
- action: Event::LEFT,
- author_id: self.user.id
- )
-
+ event_service.leave_project(self.project, self.user)
system_hook_service.execute_hooks_for(self, :destroy)
end
+ def event_service
+ EventCreateService.new
+ end
+
def notification_service
NotificationService.new
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 5f98bfb7870..21ccc76978e 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -55,14 +55,13 @@ class User < ActiveRecord::Base
include Gitlab::ConfigHelper
include TokenAuthenticatable
extend Gitlab::ConfigHelper
- extend Gitlab::CurrentSettings
+ include Gitlab::CurrentSettings
default_value_for :admin, false
default_value_for :can_create_group, gitlab_config.default_can_create_group
default_value_for :can_create_team, false
default_value_for :hide_no_ssh_key, false
default_value_for :hide_no_password, false
- default_value_for :projects_limit, current_application_settings.default_projects_limit
default_value_for :theme_id, gitlab_config.default_theme
devise :database_authenticatable, :lockable, :async,
@@ -141,6 +140,7 @@ class User < ActiveRecord::Base
before_save :ensure_authentication_token
after_save :ensure_namespace_correct
+ after_initialize :set_projects_limit
after_create :post_create_hook
after_destroy :post_destroy_hook
@@ -255,7 +255,7 @@ class User < ActiveRecord::Base
counter = 0
base = username
while User.by_login(username).present? || Namespace.by_path(username).present?
- counter += 1
+ counter += 1
username = "#{base}#{counter}"
end
@@ -459,10 +459,17 @@ class User < ActiveRecord::Base
def set_notification_email
if self.notification_email.blank? || !self.all_emails.include?(self.notification_email)
- self.notification_email = self.email
+ self.notification_email = self.email
end
end
+ def set_projects_limit
+ connection_default_value_defined = new_record? && !projects_limit_changed?
+ return unless self.projects_limit.nil? || connection_default_value_defined
+
+ self.projects_limit = current_application_settings.default_projects_limit
+ end
+
def requires_ldap_check?
if !Gitlab.config.ldap.enabled
false
@@ -559,7 +566,7 @@ class User < ActiveRecord::Base
def post_create_hook
log_info("User \"#{self.name}\" (#{self.email}) was created")
- notification_service.new_user(self, @reset_token)
+ notification_service.new_user(self, @reset_token) if self.created_by_id
system_hook_service.execute_hooks_for(self, :create)
end
@@ -607,4 +614,13 @@ class User < ActiveRecord::Base
def oauth_authorized_tokens
Doorkeeper::AccessToken.where(resource_owner_id: self.id, revoked_at: nil)
end
+
+ def contributed_projects_ids
+ Event.where(author_id: self).
+ where("created_at > ?", Time.now - 1.year).
+ code_push.
+ reorder(project_id: :desc).
+ select('DISTINCT(project_id)').
+ map(&:project_id)
+ end
end
diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb
index 901f67bafb3..5e971c7891c 100644
--- a/app/services/create_branch_service.rb
+++ b/app/services/create_branch_service.rb
@@ -17,7 +17,7 @@ class CreateBranchService < BaseService
new_branch = repository.find_branch(branch_name)
if new_branch
- Event.create_ref_event(project, current_user, new_branch, 'add')
+ EventCreateService.new.push_ref(project, current_user, new_branch, 'add')
return success(new_branch)
else
return error('Invalid reference name')
diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb
index 041c2287c36..a735d3f7f20 100644
--- a/app/services/create_tag_service.rb
+++ b/app/services/create_tag_service.rb
@@ -26,7 +26,7 @@ class CreateTagService < BaseService
project.gitlab_ci_service.async_execute(push_data)
end
- Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags')
+ EventCreateService.new.push_ref(project, current_user, new_tag, 'add', 'refs/tags')
success(new_tag)
else
error('Invalid reference name')
diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb
index cae6327fe72..c26aee2b0aa 100644
--- a/app/services/delete_branch_service.rb
+++ b/app/services/delete_branch_service.rb
@@ -25,7 +25,7 @@ class DeleteBranchService < BaseService
end
if repository.rm_branch(branch_name)
- Event.create_ref_event(project, current_user, branch, 'rm')
+ EventCreateService.new.push_ref(project, current_user, branch, 'rm')
success('Branch was removed')
else
return error('Failed to remove branch')
diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 8d8a5873e62..ba9547b9242 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -7,58 +7,98 @@
#
class EventCreateService
def open_issue(issue, current_user)
- create_event(issue, current_user, Event::CREATED)
+ create_record_event(issue, current_user, Event::CREATED)
end
def close_issue(issue, current_user)
- create_event(issue, current_user, Event::CLOSED)
+ create_record_event(issue, current_user, Event::CLOSED)
end
def reopen_issue(issue, current_user)
- create_event(issue, current_user, Event::REOPENED)
+ create_record_event(issue, current_user, Event::REOPENED)
end
def open_mr(merge_request, current_user)
- create_event(merge_request, current_user, Event::CREATED)
+ create_record_event(merge_request, current_user, Event::CREATED)
end
def close_mr(merge_request, current_user)
- create_event(merge_request, current_user, Event::CLOSED)
+ create_record_event(merge_request, current_user, Event::CLOSED)
end
def reopen_mr(merge_request, current_user)
- create_event(merge_request, current_user, Event::REOPENED)
+ create_record_event(merge_request, current_user, Event::REOPENED)
end
def merge_mr(merge_request, current_user)
- create_event(merge_request, current_user, Event::MERGED)
+ create_record_event(merge_request, current_user, Event::MERGED)
end
def open_milestone(milestone, current_user)
- create_event(milestone, current_user, Event::CREATED)
+ create_record_event(milestone, current_user, Event::CREATED)
end
def close_milestone(milestone, current_user)
- create_event(milestone, current_user, Event::CLOSED)
+ create_record_event(milestone, current_user, Event::CLOSED)
end
def reopen_milestone(milestone, current_user)
- create_event(milestone, current_user, Event::REOPENED)
+ create_record_event(milestone, current_user, Event::REOPENED)
end
def leave_note(note, current_user)
- create_event(note, current_user, Event::COMMENTED)
+ create_record_event(note, current_user, Event::COMMENTED)
+ end
+
+ def join_project(project, current_user)
+ create_event(project, current_user, Event::JOINED)
+ end
+
+ def leave_project(project, current_user)
+ create_event(project, current_user, Event::LEFT)
+ end
+
+ def create_project(project, current_user)
+ create_event(project, current_user, Event::CREATED)
+ end
+
+ def push_ref(project, current_user, ref, action = 'add', prefix = 'refs/heads')
+ commit = project.repository.commit(ref.target)
+
+ if action.to_s == 'add'
+ before = '00000000'
+ after = commit.id
+ else
+ before = commit.id
+ after = '00000000'
+ end
+
+ data = {
+ ref: "#{prefix}/#{ref.name}",
+ before: before,
+ after: after
+ }
+
+ push(project, current_user, data)
+ end
+
+ def push(project, current_user, push_data)
+ create_event(project, current_user, Event::PUSHED, data: push_data)
end
private
- def create_event(record, current_user, status)
- Event.create(
- project: record.project,
- target_id: record.id,
- target_type: record.class.name,
+ def create_record_event(record, current_user, status)
+ create_event(record.project, current_user, status, target_id: record.id, target_type: record.class.name)
+ end
+
+ def create_event(project, current_user, status, attributes = {})
+ attributes.reverse_merge!(
+ project: project,
action: status,
author_id: current_user.id
)
+
+ Event.create(attributes)
end
end
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index c775f79ec29..f21e6ac207d 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -52,7 +52,7 @@ class GitPushService
end
@push_data = post_receive_data(oldrev, newrev, ref)
- create_push_event(@push_data)
+ EventCreateService.new.push(project, user, @push_data)
project.execute_hooks(@push_data.dup, :push_hooks)
project.execute_services(@push_data.dup)
end
@@ -60,15 +60,6 @@ class GitPushService
protected
- def create_push_event(push_data)
- Event.create!(
- project: project,
- action: Event::PUSHED,
- data: push_data,
- author_id: push_data[:user_id]
- )
- end
-
# Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched,
# close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables.
def process_commit_messages(ref)
diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb
index c24809ad607..46d8987f12d 100644
--- a/app/services/git_tag_push_service.rb
+++ b/app/services/git_tag_push_service.rb
@@ -5,7 +5,7 @@ class GitTagPushService
@project, @user = project, user
@push_data = create_push_data(oldrev, newrev, ref)
- create_push_event
+ EventCreateService.new.push(project, user, @push_data)
project.repository.expire_cache
project.execute_hooks(@push_data.dup, :tag_push_hooks)
@@ -22,13 +22,4 @@ class GitTagPushService
Gitlab::PushDataBuilder.
build(project, user, oldrev, newrev, ref, [])
end
-
- def create_push_event
- Event.create!(
- project: project,
- action: Event::PUSHED,
- data: push_data,
- author_id: push_data[:user_id]
- )
- end
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 139de70114b..4fe790b98f1 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -52,13 +52,7 @@ module Projects
end
end
- if @project.persisted?
- if @project.wiki_enabled?
- @project.create_wiki
- end
-
- after_create_actions
- end
+ after_create_actions if @project.persisted?
@project
rescue => ex
@@ -79,6 +73,10 @@ module Projects
def after_create_actions
log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"")
+
+ @project.create_wiki if @project.wiki_enabled?
+
+ event_service.create_project(@project, current_user)
system_hook_service.execute_hooks_for(@project, :create)
unless @project.group
diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml
index ae0c70a79c7..f528d69f431 100644
--- a/app/views/admin/application_settings/_form.html.haml
+++ b/app/views/admin/application_settings/_form.html.haml
@@ -19,6 +19,11 @@
= f.label :gravatar_enabled, class: 'control-label'
.col-sm-10
= f.check_box :gravatar_enabled, class: 'checkbox'
+ .form-group
+ = f.label :twitter_sharing_enabled, "Twitter enabled", class: 'control-label'
+ .col-sm-10
+ = f.check_box :twitter_sharing_enabled, class: 'checkbox'
+ %span.help-block Show users button to share their newly created public or internal projects on twitter
%fieldset
%legend Misc
.form-group
diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml
index f2fed51eaf8..d550278710e 100644
--- a/app/views/admin/applications/index.html.haml
+++ b/app/views/admin/applications/index.html.haml
@@ -17,6 +17,6 @@
%tr{:id => "application_#{application.id}"}
%td= link_to application.name, admin_application_path(application)
%td= application.redirect_uri
- %td= application.access_tokens.count
+ %td= application.access_tokens.map(&:resource_owner_id).uniq.count
%td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link'
%td= render 'delete_form', application: application
diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml
index dffb4f0d82d..0f9cdfc9e8e 100644
--- a/app/views/admin/projects/index.html.haml
+++ b/app/views/admin/projects/index.html.haml
@@ -13,15 +13,13 @@
.form-group
%strong Activity
.checkbox
- = label_tag :with_push, 'Not empty'
- = check_box_tag :with_push, 1, params[:with_push]
- &nbsp;
- %span.light Projects with push events
+ = label_tag :with_push do
+ = check_box_tag :with_push, 1, params[:with_push]
+ %span Projects with push events
.checkbox
- = label_tag :abandoned, 'Abandoned'
- = check_box_tag :abandoned, 1, params[:abandoned]
- &nbsp;
- %span.light No activity over 6 month
+ = label_tag :abandoned do
+ = check_box_tag :abandoned, 1, params[:abandoned]
+ %span No activity over 6 month
%fieldset
%strong Visibility level:
diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml
index fdf96dd6f56..c1fc1602d0a 100644
--- a/app/views/dashboard/_activities.html.haml
+++ b/app/views/dashboard/_activities.html.haml
@@ -1,9 +1,4 @@
= render "events/event_last_push", event: @last_push
= render 'shared/event_filter'
-
-- if @events.any?
- .content_list
-- else
- .nothing-here-block Projects activity will be displayed here
-
+.content_list
= spinner
diff --git a/app/views/dashboard/_groups.html.haml b/app/views/dashboard/_groups.html.haml
index ddf44270802..e3df43d8892 100644
--- a/app/views/dashboard/_groups.html.haml
+++ b/app/views/dashboard/_groups.html.haml
@@ -3,7 +3,7 @@
.input-group
= search_field_tag :filter_group, nil, placeholder: 'Filter by name', class: 'dash-filter form-control'
- if current_user.can_create_group?
- .input-group-addon
+ .input-group-addon.dash-new-group
= link_to new_group_path, class: "" do
%strong New group
%ul.well-list.dash-list
diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml
index d638a161f40..3dd69df523d 100644
--- a/app/views/dashboard/_project.html.haml
+++ b/app/views/dashboard/_project.html.haml
@@ -1,6 +1,6 @@
= link_to namespace_project_path(project.namespace, project), class: dom_class(project) do
.dash-project-avatar
- = project_icon("#{project.namespace.to_param}/#{project.to_param}", alt: '', class: 'avatar project-avatar s40')
+ = project_icon(project, alt: '', class: 'avatar project-avatar s40')
.dash-project-access-icon
= visibility_level_icon(project.visibility_level)
%span.str-truncated
diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml
index ab9085f0ba7..54a39726771 100644
--- a/app/views/devise/sessions/_new_base.html.haml
+++ b/app/views/devise/sessions/_new_base.html.haml
@@ -2,11 +2,11 @@
= f.text_field :login, class: "form-control top", placeholder: "Username or Email", autofocus: "autofocus"
= f.password_field :password, class: "form-control bottom", placeholder: "Password"
- if devise_mapping.rememberable?
- .remember-me
- %label.checkbox.remember_me{for: "user_remember_me"}
+ .remember-me.checkbox
+ %label{for: "user_remember_me"}
= f.check_box :remember_me
%span Remember me
- .pull-right
- = link_to "Forgot your password?", new_password_path(resource_name)
+ .pull-right
+ = link_to "Forgot your password?", new_password_path(resource_name)
%div
= f.submit "Sign in", class: "btn btn-save"
diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml
index c7976ba564f..02b1dec753c 100644
--- a/app/views/events/_event.html.haml
+++ b/app/views/events/_event.html.haml
@@ -3,12 +3,14 @@
.event-item-timestamp
#{time_ago_with_tooltip(event.created_at)}
- = cache event do
+ = cache [event, current_user] do
= image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:''
- if event.push?
= render "events/event/push", event: event
- - elsif event.note?
+ - elsif event.commented?
= render "events/event/note", event: event
+ - elsif event.created_project?
+ = render "events/event/created_project", event: event
- else
= render "events/event/common", event: event \ No newline at end of file
diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml
index b3f32dab79c..a39e62e9dac 100644
--- a/app/views/events/event/_common.html.haml
+++ b/app/views/events/event/_common.html.haml
@@ -1,15 +1,17 @@
.event-title
%span.author_name= link_to_author event
- %span.event_label{class: event.action_name}= event_action_name(event)
+ %span.event_label{class: event.action_name}
+ = event_action_name(event)
+
- if event.target
%strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target]
- - else
- %strong= gfm event.target_title
- at
+ at
+
- if event.project
= link_to_project event.project
- else
= event.project_name
+
- if event.target.respond_to?(:title)
.event-body
.event-note
diff --git a/app/views/events/event/_created_project.html.haml b/app/views/events/event/_created_project.html.haml
new file mode 100644
index 00000000000..3c7153d235f
--- /dev/null
+++ b/app/views/events/event/_created_project.html.haml
@@ -0,0 +1,27 @@
+.event-title
+ %span.author_name= link_to_author event
+ %span.event_label{class: event.action_name}
+ = event_action_name(event)
+
+ - if event.project
+ = link_to_project event.project
+ - else
+ = event.project_name
+
+- if current_user == event.author && !event.project.private? && twitter_sharing_enabled?
+ .event-body
+ .event-note
+ .md
+ %p
+ Congratulations! Why not share your accomplishment with the world?
+
+ %a.twitter-share-button{ |
+ href: "https://twitter.com/share", |
+ "data-url" => event.project.web_url, |
+ "data-text" => "I just created a new project in GitLab! GitLab is version control on your server.", |
+ "data-size" => "medium", |
+ "data-related" => "gitlab", |
+ "data-hashtags" => "gitlab", |
+ "data-count" => "none"}
+ Tweet
+ %script{src: "//platform.twitter.com/widgets.js"} \ No newline at end of file
diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml
index 6ec8e54fba5..0acb8538778 100644
--- a/app/views/events/event/_note.html.haml
+++ b/app/views/events/event/_note.html.haml
@@ -1,6 +1,10 @@
.event-title
%span.author_name= link_to_author event
- %span.event_label commented on #{event_note_title_html(event)} at
+ %span.event_label
+ = event.action_name
+ = event_note_title_html(event)
+ at
+
- if event.project
= link_to_project event.project
- else
diff --git a/app/views/events/event/_push.html.haml b/app/views/events/event/_push.html.haml
index 092d246a94c..489138887ae 100644
--- a/app/views/events/event/_push.html.haml
+++ b/app/views/events/event/_push.html.haml
@@ -1,6 +1,6 @@
.event-title
%span.author_name= link_to_author event
- %span.event_label.pushed #{event.push_action_name} #{event.ref_type}
+ %span.event_label.pushed #{event.action_name} #{event.ref_type}
- if event.rm_ref?
%strong= event.ref_name
- else
diff --git a/app/views/explore/projects/_project.html.haml b/app/views/explore/projects/_project.html.haml
index cdd6ede36a1..d65fb529373 100644
--- a/app/views/explore/projects/_project.html.haml
+++ b/app/views/explore/projects/_project.html.haml
@@ -3,11 +3,9 @@
.project-access-icon
= visibility_level_icon(project.visibility_level)
= link_to project.name_with_namespace, [project.namespace.becomes(Namespace), project]
-
- - if current_page?(starred_explore_projects_path)
- %strong.pull-right
- %i.fa.fa-star
- = pluralize project.star_count, 'star'
+ %span.pull-right
+ %i.fa.fa-star
+ = project.star_count
.project-info
- if project.description.present?
diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml
index 5fe93f4e083..2f28470f8be 100644
--- a/app/views/groups/_projects.html.haml
+++ b/app/views/groups/_projects.html.haml
@@ -13,7 +13,7 @@
%li.project-row
= link_to namespace_project_path(project.namespace, project), class: dom_class(project) do
.dash-project-avatar
- = project_icon("#{project.namespace.to_param}/#{project.to_param}", alt: '', class: 'avatar s40')
+ = project_icon(project, alt: '', class: 'avatar s40')
.dash-project-access-icon
= visibility_level_icon(project.visibility_level)
%span.str-truncated
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index f2e591c1939..d5af859ee62 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -13,10 +13,7 @@
- if current_user
= render "events/event_last_push", event: @last_push
= render 'shared/event_filter'
- - if @events.any?
- .content_list
- - else
- .nothing-here-block Project activity will be displayed here
+ .content_list
= spinner
%aside.side.col-md-4
= render "projects", projects: @projects
diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml
index 7b8193abfdf..af39dfeac5b 100644
--- a/app/views/help/index.html.haml
+++ b/app/views/help/index.html.haml
@@ -42,3 +42,9 @@
%li
Use
= link_to 'shortcuts', '#', onclick: 'Shortcuts.showHelp(event)'
+ %li
+ Get a support
+ = link_to 'subscription', 'https://about.gitlab.com/pricing/'
+ %li
+ = link_to 'Compare', 'https://about.gitlab.com/features/#compare'
+ GitLab editions
diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml
index 62a51047c3c..67e2721bb4a 100644
--- a/app/views/layouts/nav/_project.html.haml
+++ b/app/views/layouts/nav/_project.html.haml
@@ -49,8 +49,14 @@
%span
Graphs
+ = nav_link(controller: :milestones) do
+ = link_to project_milestones_path(@project), title: 'Milestones' do
+ %i.fa.fa-clock-o
+ %span
+ Milestones
+
- if project_nav_tab? :issues
- = nav_link(controller: %w(issues milestones labels)) do
+ = nav_link(controller: :issues) do
= link_to url_for_project_issues, title: 'Issues', class: 'shortcuts-issues' do
%i.fa.fa-exclamation-circle
%span
@@ -66,6 +72,12 @@
Merge Requests
%span.count.merge_counter= @project.merge_requests.opened.count
+ = nav_link(controller: :labels) do
+ = link_to project_labels_path(@project), title: 'Labels' do
+ %i.fa.fa-tags
+ %span
+ Labels
+
- if project_nav_tab? :wiki
= nav_link(controller: :wikis) do
= link_to namespace_project_wiki_path(@project.namespace, @project, :home), title: 'Wiki', class: 'shortcuts-wiki' do
diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml
index cb24e4a3dde..4b5817e10bf 100644
--- a/app/views/profiles/applications.html.haml
+++ b/app/views/profiles/applications.html.haml
@@ -36,12 +36,12 @@
%th Scope
%th
%tbody
- - @authorized_tokens.each do |token|
- - application = token.application
- %tr{:id => "application_#{application.id}"}
- %td= application.name
+ - @authorized_apps.each do |app|
+ - token = app.authorized_tokens.order('created_at desc').first
+ %tr{:id => "application_#{app.id}"}
+ %td= app.name
%td= token.created_at
%td= token.scopes
- %td= render 'doorkeeper/authorized_applications/delete_form', application: application
+ %td= render 'doorkeeper/authorized_applications/delete_form', application: app
- else
%p.light You dont have any authorized applications
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 60d461da664..c0e13e67be3 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -1,7 +1,7 @@
- empty_repo = @project.empty_repo?
.project-home-panel{:class => ("empty-project" if empty_repo)}
.project-identicon-holder
- = project_icon("#{@project.namespace.to_param}/#{@project.to_param}", alt: '', class: 'avatar project-avatar')
+ = project_icon(@project, alt: '', class: 'avatar project-avatar')
.project-home-row
.project-home-desc
- if @project.description.present?
diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml
index 52a31610e6c..a7d5a52584c 100644
--- a/app/views/projects/_issuable_form.html.haml
+++ b/app/views/projects/_issuable_form.html.haml
@@ -15,7 +15,7 @@
= f.label :description, 'Description', class: 'control-label'
.col-sm-10
- = render layout: 'projects/md_preview' do
+ = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do
= render 'projects/zen', f: f, attr: :description,
classes: 'description form-control'
.col-sm-12.hint
diff --git a/app/views/projects/_issues_nav.html.haml b/app/views/projects/_issues_nav.html.haml
deleted file mode 100644
index 3f14616af2c..00000000000
--- a/app/views/projects/_issues_nav.html.haml
+++ /dev/null
@@ -1,51 +0,0 @@
-%ul.nav.nav-tabs
- - if project_nav_tab? :issues
- = nav_link(controller: :issues) do
- = link_to namespace_project_issues_path(@project.namespace, @project), class: "tab" do
- %i.fa.fa-exclamation-circle
- Issues
- - if project_nav_tab? :merge_requests
- = nav_link(controller: :merge_requests) do
- = link_to namespace_project_merge_requests_path(@project.namespace, @project), class: "tab" do
- %i.fa.fa-tasks
- Merge Requests
- = nav_link(controller: :milestones) do
- = link_to namespace_project_milestones_path(@project.namespace, @project), class: "tab" do
- %i.fa.fa-clock-o
- Milestones
- = nav_link(controller: :labels) do
- = link_to namespace_project_labels_path(@project.namespace, @project), class: "tab" do
- %i.fa.fa-tags
- Labels
-
-
- - if current_controller?(:issues)
- - if current_user
- %li.hidden-xs
- = link_to namespace_project_issues_path(@project.namespace, @project, :atom, { private_token: current_user.private_token }) do
- %i.fa.fa-rss
-
- %li.pull-right
- .pull-right
- .pull-left
- = form_tag namespace_project_issues_path(@project.namespace, @project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do
- .append-right-10.hidden-xs.hidden-sm
- = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' }
- = hidden_field_tag :state, params['state']
- = hidden_field_tag :scope, params['scope']
- = hidden_field_tag :assignee_id, params['assignee_id']
- = hidden_field_tag :milestone_id, params['milestone_id']
- = hidden_field_tag :label_id, params['label_id']
-
- - if can? current_user, :write_issue, @project
- = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do
- %i.fa.fa-plus
- New Issue
-
- - if current_controller?(:merge_requests)
- %li.pull-right
- .pull-right
- - if can? current_user, :write_merge_request, @project
- = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-new pull-left", title: "New Merge Request" do
- %i.fa.fa-plus
- New Merge Request
diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml
index a2c8ee1d116..f356a25dbfa 100644
--- a/app/views/projects/_md_preview.html.haml
+++ b/app/views/projects/_md_preview.html.haml
@@ -10,4 +10,4 @@
.md-write-holder
= yield
.md-preview-holder.hide
- .js-md-preview
+ .js-md-preview{class: (preview_class if defined?(preview_class))}
diff --git a/app/views/projects/_visibility_level.html.haml b/app/views/projects/_visibility_level.html.haml
index 5f34e66b3ed..42c8e685224 100644
--- a/app/views/projects/_visibility_level.html.haml
+++ b/app/views/projects/_visibility_level.html.haml
@@ -7,8 +7,8 @@
- Gitlab::VisibilityLevel.values.each do |level|
.radio
- restricted = restricted_visibility_levels.include?(level)
- = f.radio_button :visibility_level, level, checked: (visibility_level == level), disabled: restricted
= label :project_visibility_level, level do
+ = f.radio_button :visibility_level, level, checked: (visibility_level == level), disabled: restricted
= visibility_level_icon(level)
.option-title
= visibility_level_label(level)
diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml
index de091038e30..5725c84600f 100644
--- a/app/views/projects/diffs/_warning.html.haml
+++ b/app/views/projects/diffs/_warning.html.haml
@@ -15,5 +15,5 @@
%p
To preserve performance only
%strong #{allowed_diff_size} of #{diffs.size}
- files displayed.
+ files are displayed.
diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml
index c7c8af2f2c0..1579e7c5ccf 100644
--- a/app/views/projects/issues/_discussion.html.haml
+++ b/app/views/projects/issues/_discussion.html.haml
@@ -14,24 +14,24 @@
.voting_notes#notes= render "projects/notes/notes_with_form"
.col-md-3
- %div
- .clearfix
- %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'}
- = cross_project_reference(@project, @issue)
- %hr
- .context
- %cite.cgray
- = render partial: 'issue_context', locals: { issue: @issue }
- %hr
- .clearfix
- .votes-holder
- %h6 Votes
- #votes= render 'votes/votes_block', votable: @issue
-
- - if @issue.labels.any?
+ .issuable-affix
+ .clearfix
+ %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'}
+ = cross_project_reference(@project, @issue)
%hr
- %h6 Labels
- .issue-show-labels
- - @issue.labels.each do |label|
- = link_to namespace_project_issues_path(@project.namespace, @project, label_name: label.name) do
- %p= render_colored_label(label)
+ .context
+ %cite.cgray
+ = render partial: 'issue_context', locals: { issue: @issue }
+ %hr
+ .clearfix
+ .votes-holder
+ %h6 Votes
+ #votes= render 'votes/votes_block', votable: @issue
+
+ - if @issue.labels.any?
+ %hr
+ %h6 Labels
+ .issue-show-labels
+ - @issue.labels.each do |label|
+ = link_to namespace_project_issues_path(@project.namespace, @project, label_name: label.name) do
+ = render_colored_label(label)
diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml
index 73ce78133d5..5d243adb5fe 100644
--- a/app/views/projects/issues/_issues.html.haml
+++ b/app/views/projects/issues/_issues.html.haml
@@ -1,18 +1,3 @@
-.append-bottom-10
- .check-all-holder
- = check_box_tag "check_all_issues", nil, false, class: "check_all_issues left", disabled: !can?(current_user, :modify_issue, @project)
- = render 'shared/issuable_filter'
-
- .clearfix
- .issues_bulk_update.hide
- = form_tag bulk_update_namespace_project_issues_path(@project.namespace, @project), method: :post do
- = select_tag('update[status]', options_for_select([['Open', 'open'], ['Closed', 'closed']]), prompt: "Status")
- = project_users_select_tag('update[assignee_id]', placeholder: 'Assignee')
- = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone")
- = hidden_field_tag 'update[issues_ids]', []
- = hidden_field_tag :status, params[:status]
- = button_tag "Update issues", class: "btn update_selected_issues btn-save"
-
.panel.panel-default
%ul.well-list.issues-list
= render @issues
diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml
index 0d00d6bfded..0d0e3e3c82f 100644
--- a/app/views/projects/issues/index.html.haml
+++ b/app/views/projects/issues/index.html.haml
@@ -1,4 +1,36 @@
-= render "projects/issues_nav"
+.append-bottom-10
+ .pull-right
+ .pull-left
+ - if current_user
+ .hidden-xs.pull-left
+ = link_to project_issues_path(@project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do
+ %i.fa.fa-rss
+
+ = form_tag project_issues_path(@project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form' do
+ .append-right-10.hidden-xs.hidden-sm
+ = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' }
+ = hidden_field_tag :state, params['state']
+ = hidden_field_tag :scope, params['scope']
+ = hidden_field_tag :assignee_id, params['assignee_id']
+ = hidden_field_tag :milestone_id, params['milestone_id']
+ = hidden_field_tag :label_id, params['label_id']
+
+ - if can? current_user, :write_issue, @project
+ = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do
+ %i.fa.fa-plus
+ New Issue
+
+ = render 'shared/issuable_filter'
+
+ .clearfix
+ .issues_bulk_update.hide
+ = form_tag bulk_update_project_issues_path(@project), method: :post do
+ = select_tag('update[status]', options_for_select([['Open', 'open'], ['Closed', 'closed']]), prompt: "Status")
+ = project_users_select_tag('update[assignee_id]', placeholder: 'Assignee')
+ = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone")
+ = hidden_field_tag 'update[issues_ids]', []
+ = hidden_field_tag :status, params[:status]
+ = button_tag "Update issues", class: "btn update_selected_issues btn-save"
.issues-holder
= render "issues"
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index ca38a4e765d..224ad4041ea 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -1,37 +1,40 @@
-%h4.page-title
- .issue-box{ class: issue_box_class(@issue) }
- - if @issue.closed?
- Closed
- - else
- Open
- Issue ##{@issue.iid}
- %small.creator
- &middot; created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)}
+.issue
+ .issue-details
+ %h4.page-title
+ .issue-box{ class: issue_box_class(@issue) }
+ - if @issue.closed?
+ Closed
+ - else
+ Open
+ Issue ##{@issue.iid}
+ %small.creator
+ &middot; created by #{link_to_member(@project, @issue.author)} #{issue_timestamp(@issue)}
- .pull-right
- - if can?(current_user, :write_issue, @project)
- = link_to new_namespace_project_issue_path(@project.namespace, @project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do
- %i.fa.fa-plus
- New Issue
- - if can?(current_user, :modify_issue, @issue)
- - if @issue.closed?
- = link_to 'Reopen', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen"
- - else
- = link_to 'Close', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue"
+ .pull-right
+ - if can?(current_user, :write_issue, @project)
+ = link_to new_namespace_project_issue_path(@project.namespace, @project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do
+ %i.fa.fa-plus
+ New Issue
+ - if can?(current_user, :modify_issue, @issue)
+ - if @issue.closed?
+ = link_to 'Reopen', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen"
+ - else
+ = link_to 'Close', namespace_project_issue_path(@project.namespace, @project, @issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue"
- = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: "btn btn-grouped issuable-edit" do
- %i.fa.fa-pencil-square-o
- Edit
+ = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: "btn btn-grouped issuable-edit" do
+ %i.fa.fa-pencil-square-o
+ Edit
-%hr
-%h3.issue-title
- = gfm escape_once(@issue.title)
-%div
- - if @issue.description.present?
- .description
- .wiki
- = preserve do
- = markdown(@issue.description, parse_tasks: true)
+ %hr
+ %h3.issue-title
+ = gfm escape_once(@issue.title)
+ %div
+ - if @issue.description.present?
+ .description
+ .wiki
+ = preserve do
+ = markdown(@issue.description, parse_tasks: true)
-%hr
-= render "projects/issues/discussion"
+ %hr
+ .issue-discussion
+ = render "projects/issues/discussion"
diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml
index c53d75b1bb6..0700e72d39c 100644
--- a/app/views/projects/labels/index.html.haml
+++ b/app/views/projects/labels/index.html.haml
@@ -1,5 +1,3 @@
-= render "projects/issues_nav"
-
- if can? current_user, :admin_label, @project
= link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do
New label
diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml
index e3d3e69a9d3..b05f0c24320 100644
--- a/app/views/projects/merge_requests/_discussion.html.haml
+++ b/app/views/projects/merge_requests/_discussion.html.haml
@@ -10,22 +10,23 @@
= render "projects/merge_requests/show/participants"
= render "projects/notes/notes_with_form"
.col-md-3
- .clearfix
- %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'}
- = cross_project_reference(@project, @merge_request)
- %hr
- .context
- %cite.cgray
- = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request }
- %hr
- .votes-holder
- %h6 Votes
- #votes= render 'votes/votes_block', votable: @merge_request
-
- - if @merge_request.labels.any?
+ .issuable-affix
+ .clearfix
+ %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'}
+ = cross_project_reference(@project, @merge_request)
+ %hr
+ .context
+ %cite.cgray
+ = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request }
%hr
- %h6 Labels
- .merge-request-show-labels
- - @merge_request.labels.each do |label|
- = link_to namespace_project_merge_requests_path(@project.namespace, @project, label_name: label.name) do
- %p= render_colored_label(label)
+ .votes-holder
+ %h6 Votes
+ #votes= render 'votes/votes_block', votable: @merge_request
+
+ - if @merge_request.labels.any?
+ %hr
+ %h6 Labels
+ .merge-request-show-labels
+ - @merge_request.labels.each do |label|
+ = link_to namespace_project_merge_requests_path(@project.namespace, @project, label_name: label.name) do
+ = render_colored_label(label)
diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml
index 3567401817b..fb1e5737680 100644
--- a/app/views/projects/merge_requests/_merge_request.html.haml
+++ b/app/views/projects/merge_requests/_merge_request.html.haml
@@ -18,7 +18,7 @@
- if merge_request.assignee
assigned to #{link_to_member(merge_request.source_project, merge_request.assignee)}
- else
- Work In Progress
+ Unassigned
- if merge_request.votes_count > 0
= render 'votes/votes_inline', votable: merge_request
- if merge_request.notes.any?
diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml
index 2a3fce0df30..75d65e6649c 100644
--- a/app/views/projects/merge_requests/_new_submit.html.haml
+++ b/app/views/projects/merge_requests/_new_submit.html.haml
@@ -19,7 +19,7 @@
.form-group.issuable-description
= f.label :description, 'Description', class: 'control-label'
.col-sm-10
- = render layout: 'projects/md_preview' do
+ = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do
= render 'projects/zen', f: f, attr: :description, classes: 'description form-control'
.col-sm-12-hint
diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml
index 45c3a419d97..a53aed2f38a 100644
--- a/app/views/projects/merge_requests/_show.html.haml
+++ b/app/views/projects/merge_requests/_show.html.haml
@@ -1,37 +1,38 @@
.merge-request{'data-url' => namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}
- = render "projects/merge_requests/show/mr_title"
- %hr
- = render "projects/merge_requests/show/mr_box"
- %hr
- .append-bottom-20
- .slead
- %span From
- - if @merge_request.for_fork?
- %strong.label-branch<
- - if @merge_request.source_project
- = link_to @merge_request.source_project_namespace, namespace_project_path(@merge_request.source_project.namespace, @merge_request.source_project)
- - else
- \ #{@merge_request.source_project_namespace}
- \:#{@merge_request.source_branch}
- %span into
- %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch}
- - else
- %strong.label-branch #{@merge_request.source_branch}
- %span into
- %strong.label-branch #{@merge_request.target_branch}
- - if @merge_request.open?
- %span.pull-right
- .btn-group
- %a.btn.dropdown-toggle{ data: {toggle: :dropdown} }
- %i.fa.fa-download
- Download as
- %span.caret
- %ul.dropdown-menu
- %li= link_to "Email Patches", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :patch)
- %li= link_to "Plain Diff", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :diff)
+ .merge-request-details
+ = render "projects/merge_requests/show/mr_title"
+ %hr
+ = render "projects/merge_requests/show/mr_box"
+ %hr
+ .append-bottom-20
+ .slead
+ %span From
+ - if @merge_request.for_fork?
+ %strong.label-branch<
+ - if @merge_request.source_project
+ = link_to @merge_request.source_project_namespace, namespace_project_path(@merge_request.source_project.namespace, @merge_request.source_project)
+ - else
+ \ #{@merge_request.source_project_namespace}
+ \:#{@merge_request.source_branch}
+ %span into
+ %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch}
+ - else
+ %strong.label-branch #{@merge_request.source_branch}
+ %span into
+ %strong.label-branch #{@merge_request.target_branch}
+ - if @merge_request.open?
+ %span.pull-right
+ .btn-group
+ %a.btn.dropdown-toggle{ data: {toggle: :dropdown} }
+ %i.fa.fa-download
+ Download as
+ %span.caret
+ %ul.dropdown-menu
+ %li= link_to "Email Patches", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :patch)
+ %li= link_to "Plain Diff", namespace_project_merge_request_path(@project.namespace, @project, @merge_request, format: :diff)
- = render "projects/merge_requests/show/how_to_merge"
- = render "projects/merge_requests/show/state_widget"
+ = render "projects/merge_requests/show/how_to_merge"
+ = render "projects/merge_requests/show/state_widget"
- if @commits.present?
%ul.nav.nav-tabs.merge-request-tabs
diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml
index 2654ea70990..35e85156951 100644
--- a/app/views/projects/merge_requests/index.html.haml
+++ b/app/views/projects/merge_requests/index.html.haml
@@ -1,7 +1,10 @@
-= render "projects/issues_nav"
-
.merge-requests-holder
.append-bottom-10
+ .pull-right
+ - if can? current_user, :write_merge_request, @project
+ = link_to new_project_merge_request_path(@project), class: "btn btn-new pull-left", title: "New Merge Request" do
+ %i.fa.fa-plus
+ New Merge Request
= render 'shared/issuable_filter'
.panel.panel-default
%ul.well-list.mr-list
diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml
index 12ab184973c..fb2c3220b8a 100644
--- a/app/views/projects/merge_requests/show/_mr_accept.html.haml
+++ b/app/views/projects/merge_requests/show/_mr_accept.html.haml
@@ -17,7 +17,7 @@
.accept-action
= f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request"
- if can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && !@merge_request.for_fork?
- .accept-control
+ .accept-control.checkbox
= label_tag :should_remove_source_branch, class: "remove_source_checkbox" do
= check_box_tag :should_remove_source_branch
Remove source-branch
diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml
index 46132eed0b9..e9c2a73bd3f 100644
--- a/app/views/projects/milestones/_form.html.haml
+++ b/app/views/projects/milestones/_form.html.haml
@@ -21,7 +21,7 @@
.form-group.milestone-description
= f.label :description, "Description", class: "control-label"
.col-sm-10
- = render layout: 'projects/md_preview' do
+ = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do
= render 'projects/zen', f: f, attr: :description, classes: 'description form-control'
.hint
.pull-left Milestones are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}.
diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml
index 084c6d010da..d3eab8d6d75 100644
--- a/app/views/projects/milestones/index.html.haml
+++ b/app/views/projects/milestones/index.html.haml
@@ -1,12 +1,8 @@
-= render "projects/issues_nav"
-.milestones_content
- %h3.page-title
- Milestones
- - if can? current_user, :admin_milestone, @project
- = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do
- %i.fa.fa-plus
- New Milestone
-
+.pull-right
+ - if can? current_user, :admin_milestone, @project
+ = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do
+ %i.fa.fa-plus
+ New Milestone
= render 'shared/milestones_filter'
.milestones
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 3107766e993..fea96f37011 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -1,4 +1,3 @@
-= render "projects/issues_nav"
%h4.page-title
.issue-box{ class: issue_box_class(@milestone) }
- if @milestone.closed?
diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml
index 61f6a66c386..6f5851d61a1 100644
--- a/app/views/projects/new.html.haml
+++ b/app/views/projects/new.html.haml
@@ -52,7 +52,7 @@
%i.fa.fa-github
Import projects from GitHub
= render 'github_import_modal'
-
+
.project-import.form-group
.col-sm-2
.col-sm-10
@@ -60,7 +60,7 @@
= link_to status_import_gitlab_path do
%i.fa.fa-heart
Import projects from GitLab.com
- - else
+ - elsif request.host != 'gitlab.com'
= link_to '#', class: 'how_to_import_link light' do
%i.fa.fa-heart
Import projects from GitLab.com
@@ -99,4 +99,4 @@
e.preventDefault()
import_modal = $(this).parent().find(".modal").show()
$('.modal-header .close').bind 'click', ->
- $(".modal").hide() \ No newline at end of file
+ $(".modal").hide()
diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml
index 9fda7aafd51..602acd6d010 100644
--- a/app/views/projects/notes/_edit_form.html.haml
+++ b/app/views/projects/notes/_edit_form.html.haml
@@ -1,6 +1,6 @@
.note-edit-form
= form_for note, url: namespace_project_note_path(@project.namespace, @project, note), method: :put, remote: true, authenticity_token: true do |f|
- = render layout: 'projects/md_preview' do
+ = render layout: 'projects/md_preview', locals: { preview_class: "note-text" } do
= render 'projects/zen', f: f, attr: :note,
classes: 'note_text js-note-text'
diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml
index 28c11aa5548..e1f2754f0d4 100644
--- a/app/views/projects/notes/_form.html.haml
+++ b/app/views/projects/notes/_form.html.haml
@@ -5,7 +5,7 @@
= f.hidden_field :noteable_id
= f.hidden_field :noteable_type
- = render layout: 'projects/md_preview' do
+ = render layout: 'projects/md_preview', locals: { preview_class: "note-text" } do
= render 'projects/zen', f: f, attr: :note,
classes: 'note_text js-note-text'
diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml
index 1e1400058e1..0d52f9ecbb6 100644
--- a/app/views/projects/wikis/_form.html.haml
+++ b/app/views/projects/wikis/_form.html.haml
@@ -22,7 +22,7 @@
.form-group.wiki-content
= f.label :content, class: 'control-label'
.col-sm-10
- = render layout: 'projects/md_preview' do
+ = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do
= render 'projects/zen', f: f, attr: :content, classes: 'description form-control'
.col-sm-12.hint
.pull-left Wiki content is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}
diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml
index 52b48ff7451..fba69dd0f3f 100644
--- a/app/views/shared/_file_highlight.html.haml
+++ b/app/views/shared/_file_highlight.html.haml
@@ -7,4 +7,5 @@
= link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do
%i.fa.fa-link
= i
- = highlight(blob.name, blob.data)
+ :preserve
+ #{highlight(blob.name, blob.data)}
diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml
index 0e094d8844b..61647b09527 100644
--- a/app/views/shared/_issuable_filter.html.haml
+++ b/app/views/shared/_issuable_filter.html.haml
@@ -1,6 +1,6 @@
.issues-filters
- .pull-left.append-right-20
- %ul.nav.nav-pills.nav-compact
+ .issues-state-filters
+ %ul.nav.nav-tabs
%li{class: ("active" if params[:state] == 'opened')}
= link_to page_filter_path(state: 'opened') do
%i.fa.fa-exclamation-circle
@@ -14,99 +14,106 @@
%i.fa.fa-compass
All
- .dropdown.inline.assignee-filter
- %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
- %i.fa.fa-user
- %span.light assignee:
- - if @assignee.present?
- %strong= @assignee.name
- - elsif params[:assignee_id] == "0"
- Unassigned
- - else
- Any
- %b.caret
- %ul.dropdown-menu
- %li
- = link_to page_filter_path(assignee_id: nil) do
- Any
- = link_to page_filter_path(assignee_id: 0) do
- Unassigned
- - @assignees.sort_by(&:name).each do |user|
- %li
- = link_to page_filter_path(assignee_id: user.id) do
- = image_tag avatar_icon(user.email), class: "avatar s16", alt: ''
- = user.name
-
- .dropdown.inline.prepend-left-10.author-filter
- %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
- %i.fa.fa-user
- %span.light author:
- - if @author.present?
- %strong= @author.name
- - elsif params[:author_id] == "0"
- Unassigned
- - else
- Any
- %b.caret
- %ul.dropdown-menu
- %li
- = link_to page_filter_path(author_id: nil) do
- Any
- = link_to page_filter_path(author_id: 0) do
- Unassigned
- - @authors.sort_by(&:name).each do |user|
- %li
- = link_to page_filter_path(author_id: user.id) do
- = image_tag avatar_icon(user.email), class: "avatar s16", alt: ''
- = user.name
-
- .dropdown.inline.prepend-left-10.milestone-filter
- %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
- %i.fa.fa-clock-o
- %span.light milestone:
- - if @milestone.present?
- %strong= @milestone.title
- - elsif params[:milestone_id] == "0"
- None (backlog)
- - else
- Any
- %b.caret
- %ul.dropdown-menu
- %li
- = link_to page_filter_path(milestone_id: nil) do
- Any
- = link_to page_filter_path(milestone_id: 0) do
- None (backlog)
- - @milestones.each do |milestone|
- %li
- = link_to page_filter_path(milestone_id: milestone.id) do
- %strong= milestone.title
- %small.light= milestone.expires_at
+ %div
+ - if controller.controller_name == 'issues'
+ .check-all-holder
+ = check_box_tag "check_all_issues", nil, false,
+ class: "check_all_issues left",
+ disabled: !can?(current_user, :modify_issue, @project)
+ .issues-other-filters
+ .dropdown.inline.assignee-filter
+ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
+ %i.fa.fa-user
+ %span.light assignee:
+ - if @assignee.present?
+ %strong= @assignee.name
+ - elsif params[:assignee_id] == "0"
+ Unassigned
+ - else
+ Any
+ %b.caret
+ %ul.dropdown-menu
+ %li
+ = link_to page_filter_path(assignee_id: nil) do
+ Any
+ = link_to page_filter_path(assignee_id: 0) do
+ Unassigned
+ - @assignees.sort_by(&:name).each do |user|
+ %li
+ = link_to page_filter_path(assignee_id: user.id) do
+ = image_tag avatar_icon(user.email), class: "avatar s16", alt: ''
+ = user.name
- - if @project
- .dropdown.inline.prepend-left-10.labels-filter
- %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
- %i.fa.fa-tags
- %span.light label:
- - if params[:label_name].present?
- %strong= params[:label_name]
- - else
- Any
- %b.caret
- %ul.dropdown-menu
- %li
- = link_to page_filter_path(label_name: nil) do
+ .dropdown.inline.prepend-left-10.author-filter
+ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
+ %i.fa.fa-user
+ %span.light author:
+ - if @author.present?
+ %strong= @author.name
+ - elsif params[:author_id] == "0"
+ Unassigned
+ - else
Any
- - if @project.labels.any?
- - @project.labels.each do |label|
+ %b.caret
+ %ul.dropdown-menu
+ %li
+ = link_to page_filter_path(author_id: nil) do
+ Any
+ = link_to page_filter_path(author_id: 0) do
+ Unassigned
+ - @authors.sort_by(&:name).each do |user|
%li
- = link_to page_filter_path(label_name: label.name) do
- = render_colored_label(label)
- - else
+ = link_to page_filter_path(author_id: user.id) do
+ = image_tag avatar_icon(user.email), class: "avatar s16", alt: ''
+ = user.name
+
+ .dropdown.inline.prepend-left-10.milestone-filter
+ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
+ %i.fa.fa-clock-o
+ %span.light milestone:
+ - if @milestone.present?
+ %strong= @milestone.title
+ - elsif params[:milestone_id] == "0"
+ None (backlog)
+ - else
+ Any
+ %b.caret
+ %ul.dropdown-menu
%li
- = link_to generate_namespace_project_labels_path(@project.namespace, @project, redirect: request.original_url), method: :post do
- %i.fa.fa-plus-circle
- Create default labels
+ = link_to page_filter_path(milestone_id: nil) do
+ Any
+ = link_to page_filter_path(milestone_id: 0) do
+ None (backlog)
+ - @milestones.each do |milestone|
+ %li
+ = link_to page_filter_path(milestone_id: milestone.id) do
+ %strong= milestone.title
+ %small.light= milestone.expires_at
+
+ - if @project
+ .dropdown.inline.prepend-left-10.labels-filter
+ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
+ %i.fa.fa-tags
+ %span.light label:
+ - if params[:label_name].present?
+ %strong= params[:label_name]
+ - else
+ Any
+ %b.caret
+ %ul.dropdown-menu
+ %li
+ = link_to page_filter_path(label_name: nil) do
+ Any
+ - if @project.labels.any?
+ - @project.labels.each do |label|
+ %li
+ = link_to page_filter_path(label_name: label.name) do
+ = render_colored_label(label)
+ - else
+ %li
+ = link_to generate_namespace_project_labels_path(@project.namespace, @project, redirect: request.original_url), method: :post do
+ %i.fa.fa-plus-circle
+ Create default labels
- .pull-right
- = render 'shared/sort_dropdown'
+ .pull-right
+ = render 'shared/sort_dropdown'
diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml
index 208f1b77372..f685ae7726c 100644
--- a/app/views/shared/_milestones_filter.html.haml
+++ b/app/views/shared/_milestones_filter.html.haml
@@ -1,5 +1,5 @@
.milestones-filters.append-bottom-10
- %ul.nav.nav-pills.nav-compact
+ %ul.nav.nav-tabs
%li{class: ("active" if params[:state].blank? || params[:state] == 'opened')}
= link_to milestones_filter_path(state: 'opened') do
%i.fa.fa-exclamation-circle
diff --git a/app/views/users/_projects.html.haml b/app/views/users/_projects.html.haml
index 1d38f8e8ab8..c925a48f550 100644
--- a/app/views/users/_projects.html.haml
+++ b/app/views/users/_projects.html.haml
@@ -1,6 +1,21 @@
-.panel.panel-default
- .panel-heading Personal projects
- %ul.well-list
- - projects.each do |project|
- %li
- = link_to_project project
+- if @contributed_projects.present?
+ .panel.panel-default
+ .panel-heading Projects contributed to
+ %ul.well-list
+ - @contributed_projects.sort_by(&:star_count).reverse.each do |project|
+ %li
+ = link_to_project project
+ %span.pull-right.light
+ %i.fa.fa-star
+ = project.star_count
+
+- if @projects.present?
+ .panel.panel-default
+ .panel-heading Personal projects
+ %ul.well-list
+ - @projects.sort_by(&:star_count).reverse.each do |project|
+ %li
+ = link_to_project project
+ %span.pull-right.light
+ %i.fa.fa-star
+ = project.star_count
diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml
index 13bdc5ed1e7..1d1c974da24 100644
--- a/app/views/users/calendar.html.haml
+++ b/app/views/users/calendar.html.haml
@@ -1,4 +1,4 @@
-%h4 Calendar
+%h4 Commits calendar
#cal-heatmap.calendar
:javascript
new calendar(
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index b05918b019e..5e82d5780cf 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -35,9 +35,7 @@
= render @events
.col-md-4
= render 'profile', user: @user
- - if @projects.present?
- = render 'projects', projects: @projects
-
+ = render 'projects'
:coffeescript
$ ->