Added 'x notes' and +1 counters to issues and merge requests. Refs #549
This commit is contained in:
parent
8d8b82127f
commit
2d00f2dfe4
6 changed files with 52 additions and 5 deletions
|
@ -34,7 +34,7 @@ class MergeRequest < ActiveRecord::Base
|
||||||
|
|
||||||
|
|
||||||
def validate_branches
|
def validate_branches
|
||||||
if target_branch == source_branch
|
if target_branch == source_branch
|
||||||
errors.add :base, "You can not use same branch for source and target branches"
|
errors.add :base, "You can not use same branch for source and target branches"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -51,6 +51,11 @@ class MergeRequest < ActiveRecord::Base
|
||||||
def last_commit
|
def last_commit
|
||||||
project.commit(source_branch)
|
project.commit(source_branch)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Return the number of +1 comments (upvotes)
|
||||||
|
def upvotes
|
||||||
|
notes.select(&:upvote?).size
|
||||||
|
end
|
||||||
end
|
end
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
#
|
#
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
%span.label.important critical
|
%span.label.important critical
|
||||||
- if issue.today?
|
- if issue.today?
|
||||||
%span.label.success today
|
%span.label.success today
|
||||||
|
- if issue.notes.any?
|
||||||
|
%span.label= pluralize issue.notes.count, 'note'
|
||||||
- if issue.upvotes > 0
|
- if issue.upvotes > 0
|
||||||
%span.label.success= "+#{issue.upvotes}"
|
%span.label.success= "+#{issue.upvotes}"
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,13 @@
|
||||||
- else
|
- else
|
||||||
= link_to 'Close', project_issue_path(@project, @issue, :issue => {:closed => true }, :status_only => true), :method => :put, :class => "btn", :title => "Close Issue"
|
= link_to 'Close', project_issue_path(@project, @issue, :issue => {:closed => true }, :status_only => true), :method => :put, :class => "btn", :title => "Close Issue"
|
||||||
- if can?(current_user, :admin_project, @project) || @issue.author == current_user
|
- if can?(current_user, :admin_project, @project) || @issue.author == current_user
|
||||||
= link_to edit_project_issue_path(@project, @issue), :class => "btn small" do
|
= link_to edit_project_issue_path(@project, @issue), :class => "btn" do
|
||||||
Edit
|
Edit
|
||||||
|
|
||||||
|
- if @issue.upvotes > 0
|
||||||
|
%button.btn.success= "+#{@issue.upvotes}"
|
||||||
|
|
||||||
|
|
||||||
.back_link
|
.back_link
|
||||||
= link_to project_issues_path(@project) do
|
= link_to project_issues_path(@project) do
|
||||||
← To issues list
|
← To issues list
|
||||||
|
@ -36,9 +40,6 @@
|
||||||
= image_tag gravatar_icon(@issue.assignee_email), :width => 16, :class => "lil_av"
|
= image_tag gravatar_icon(@issue.assignee_email), :width => 16, :class => "lil_av"
|
||||||
%strong.author= link_to_issue_assignee(@issue)
|
%strong.author= link_to_issue_assignee(@issue)
|
||||||
|
|
||||||
- if @issue.upvotes > 0
|
|
||||||
%span.label.success= "+#{@issue.upvotes}"
|
|
||||||
|
|
||||||
%hr
|
%hr
|
||||||
|
|
||||||
%div= simple_format @issue.title
|
%div= simple_format @issue.title
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
authored
|
authored
|
||||||
= time_ago_in_words(merge_request.created_at)
|
= time_ago_in_words(merge_request.created_at)
|
||||||
ago
|
ago
|
||||||
|
- if merge_request.notes.any?
|
||||||
|
%span.label= pluralize merge_request.notes.count, 'note'
|
||||||
|
- if merge_request.upvotes > 0
|
||||||
|
%span.label.success= "+#{merge_request.upvotes}"
|
||||||
.right
|
.right
|
||||||
%span.label= merge_request.source_branch
|
%span.label= merge_request.source_branch
|
||||||
→
|
→
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
= link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small" do
|
= link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small" do
|
||||||
Edit
|
Edit
|
||||||
|
|
||||||
|
- if @merge_request.upvotes > 0
|
||||||
|
%button.btn.success= "+#{@merge_request.upvotes}"
|
||||||
|
|
||||||
.back_link
|
.back_link
|
||||||
= link_to project_merge_requests_path(@project) do
|
= link_to project_merge_requests_path(@project) do
|
||||||
← To merge requests
|
← To merge requests
|
||||||
|
|
|
@ -25,6 +25,38 @@ describe MergeRequest do
|
||||||
:author => Factory(:user),
|
:author => Factory(:user),
|
||||||
:assignee => Factory(:user),
|
:assignee => Factory(:user),
|
||||||
:project => Factory.create(:project)).should be_valid }
|
:project => Factory.create(:project)).should be_valid }
|
||||||
|
|
||||||
|
describe "plus 1" do
|
||||||
|
let(:project) { Factory(:project) }
|
||||||
|
subject {
|
||||||
|
Factory.create(:merge_request,
|
||||||
|
:author => Factory(:user),
|
||||||
|
:assignee => Factory(:user),
|
||||||
|
:project => project)
|
||||||
|
}
|
||||||
|
|
||||||
|
it "with no notes has a 0/0 score" do
|
||||||
|
subject.upvotes.should == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should recognize non-+1 notes" do
|
||||||
|
subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone'))
|
||||||
|
subject.should have(1).note
|
||||||
|
subject.notes.first.upvote?.should be_false
|
||||||
|
subject.upvotes.should == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should recognize a single +1 note" do
|
||||||
|
subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))
|
||||||
|
subject.upvotes.should == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should recognize a multiple +1 notes" do
|
||||||
|
subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))
|
||||||
|
subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo'))
|
||||||
|
subject.upvotes.should == 2
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in a new issue