Commit 6a18fd986270c7a0507d48c176bdefc52bd68b03

Authored by Dmitriy Zaporozhets
2 parents b09610b5 ededfd2d

Merge branch 'restyle/issue' into 'master'

Improve UI for Issue#show, MR#show pages
app/assets/stylesheets/generic/common.scss
@@ -88,11 +88,15 @@ pre.well-pre { @@ -88,11 +88,15 @@ pre.well-pre {
88 /** Big Labels **/ 88 /** Big Labels **/
89 .state-label { 89 .state-label {
90 font-size: 14px; 90 font-size: 14px;
91 - padding: 6px 25px; 91 + padding: 9px 25px;
92 text-align: center; 92 text-align: center;
93 - @include border-radius(4px);  
94 text-shadow: none; 93 text-shadow: none;
95 - margin-left: 10px; 94 + margin-right: 20px;
  95 +
  96 + &.state-label-blue {
  97 + background: #31708f;
  98 + color: #FFF;
  99 + }
96 100
97 &.state-label-green { 101 &.state-label-green {
98 background: #4A4; 102 background: #4A4;
app/assets/stylesheets/generic/issue_box.scss
@@ -17,26 +17,33 @@ @@ -17,26 +17,33 @@
17 margin-bottom: 0; 17 margin-bottom: 0;
18 } 18 }
19 19
  20 + .state {
  21 + height: 34px;
  22 + border-bottom: 1px solid #DDD;
  23 + line-height: 32px;
  24 + }
  25 +
20 .title { 26 .title {
21 font-size: 22px; 27 font-size: 22px;
22 font-weight: 500; 28 font-weight: 500;
23 line-height: 1.5; 29 line-height: 1.5;
24 margin: 0; 30 margin: 0;
25 color: #333; 31 color: #333;
  32 + padding-bottom: 0;
  33 + padding: 15px 25px;
26 } 34 }
27 35
28 .context { 36 .context {
29 border: none; 37 border: none;
30 border-top: 1px solid #eee; 38 border-top: 1px solid #eee;
  39 + padding: 15px 25px;
31 } 40 }
32 41
33 .description { 42 .description {
34 - border-top: 1px solid #eee; 43 + padding: 0 25px 15px 25px;
35 } 44 }
36 45
37 .title, .context, .description { 46 .title, .context, .description {
38 - padding: 15px 25px;  
39 -  
40 .clearfix { 47 .clearfix {
41 margin: 0; 48 margin: 0;
42 } 49 }
app/helpers/issues_helper.rb
@@ -84,4 +84,12 @@ module IssuesHelper @@ -84,4 +84,12 @@ module IssuesHelper
84 def milestone_options object 84 def milestone_options object
85 options_from_collection_for_select(@project.milestones.active, 'id', 'title', object.milestone_id) 85 options_from_collection_for_select(@project.milestones.active, 'id', 'title', object.milestone_id)
86 end 86 end
  87 +
  88 + def issue_alert_class(issue)
  89 + if issue.closed?
  90 + 'alert-danger'
  91 + else
  92 + 'alert-success'
  93 + end
  94 + end
87 end 95 end
app/helpers/merge_requests_helper.rb
@@ -41,4 +41,14 @@ module MergeRequestsHelper @@ -41,4 +41,14 @@ module MergeRequestsHelper
41 "Branches: #{@merge_request.source_branch} #{separator} #{@merge_request.target_branch}" 41 "Branches: #{@merge_request.source_branch} #{separator} #{@merge_request.target_branch}"
42 end 42 end
43 end 43 end
  44 +
  45 + def merge_request_alert_class(merge_request)
  46 + if merge_request.merged?
  47 + 'alert-info'
  48 + elsif merge_request.closed?
  49 + 'alert-danger'
  50 + else
  51 + 'alert-success'
  52 + end
  53 + end
44 end 54 end
app/views/projects/issues/_issue_context.html.haml
1 = form_for [@project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| 1 = form_for [@project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f|
2 - Created by #{link_to_member(@project, issue.author)}   
3 - - if issue.assignee  
4 - \ and currently assigned to 2 + %strong.append-right-10
  3 + Assignee:
5 4
6 - if can?(current_user, :modify_issue, @issue) 5 - if can?(current_user, :modify_issue, @issue)
7 = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @issue.assignee_id) 6 = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @issue.assignee_id)
8 - elsif issue.assignee 7 - elsif issue.assignee
9 = link_to_member(@project, @issue.assignee) 8 = link_to_member(@project, @issue.assignee)
  9 + - else
  10 + None
10 11
11 -  
12 - .pull-right.hidden-sm.hidden-xs  
13 - - if issue.milestone  
14 - - milestone = issue.milestone  
15 - %cite.cgray Attached to milestone  
16 - 12 + .pull-right
  13 + %strong.append-right-10
  14 + Milestone:
17 - if can?(current_user, :modify_issue, @issue) 15 - if can?(current_user, :modify_issue, @issue)
18 = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'}) 16 = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'})
19 -  
20 = hidden_field_tag :issue_context 17 = hidden_field_tag :issue_context
21 = f.submit class: 'btn' 18 = f.submit class: 'btn'
22 - elsif issue.milestone 19 - elsif issue.milestone
23 = link_to issue.milestone.title, project_milestone_path 20 = link_to issue.milestone.title, project_milestone_path
  21 + - else
  22 + None
app/views/projects/issues/show.html.haml
1 %h3.page-title 1 %h3.page-title
2 Issue ##{@issue.iid} 2 Issue ##{@issue.iid}
3 3
4 - %small  
5 - created #{time_ago_with_tooltip(@issue.created_at)}  
6 -  
7 - - if @issue.closed?  
8 - %span.state-label.state-label-red Closed  
9 - - else  
10 - %span.state-label.state-label-green Open  
11 -  
12 %span.pull-right 4 %span.pull-right
13 - if can?(current_user, :write_issue, @project) 5 - if can?(current_user, :write_issue, @project)
14 = link_to new_project_issue_path(@project), class: "btn grouped", title: "New Issue", id: "new_issue_link" do 6 = link_to new_project_issue_path(@project), class: "btn grouped", title: "New Issue", id: "new_issue_link" do
@@ -38,18 +30,27 @@ @@ -38,18 +30,27 @@
38 = @issue.milestone.title 30 = @issue.milestone.title
39 31
40 .issue-box 32 .issue-box
  33 + .state{ class: issue_alert_class(@issue) }
  34 + - if @issue.closed?
  35 + %span.state-label.state-label-red Closed
  36 + - else
  37 + %span.state-label.state-label-green Open
  38 +
  39 + %span.creator
  40 + Created by #{link_to_member(@project, @issue.author)} #{time_ago_with_tooltip(@issue.created_at)}
  41 +
41 %h4.title 42 %h4.title
42 = gfm escape_once(@issue.title) 43 = gfm escape_once(@issue.title)
43 44
44 - .context  
45 - %cite.cgray  
46 - = render partial: 'issue_context', locals: { issue: @issue }  
47 -  
48 - if @issue.description.present? 45 - if @issue.description.present?
49 .description 46 .description
50 .wiki 47 .wiki
51 = preserve do 48 = preserve do
52 = markdown @issue.description 49 = markdown @issue.description
  50 + .context
  51 + %cite.cgray
  52 + = render partial: 'issue_context', locals: { issue: @issue }
  53 +
53 54
54 - content_for :note_actions do 55 - content_for :note_actions do
55 - if can?(current_user, :modify_issue, @issue) 56 - if can?(current_user, :modify_issue, @issue)
app/views/projects/merge_requests/show/_context.html.haml
1 = form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| 1 = form_for [@project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f|
2 - Created by #{link_to_member(@project, merge_request.author)}   
3 - - if merge_request.assignee  
4 - \ and currently assigned to 2 + %strong.append-right-10
  3 + Assignee:
5 4
6 - if can?(current_user, :modify_merge_request, @merge_request) 5 - if can?(current_user, :modify_merge_request, @merge_request)
7 = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @merge_request.assignee_id) 6 = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @merge_request.assignee_id)
8 - elsif merge_request.assignee 7 - elsif merge_request.assignee
9 = link_to_member(@project, @merge_request.assignee) 8 = link_to_member(@project, @merge_request.assignee)
  9 + - else
  10 + None
10 11
11 -  
12 - .pull-right.hidden-sm.hidden-xs  
13 - - if merge_request.milestone  
14 - - milestone = merge_request.milestone  
15 - %cite.cgray Attached to milestone  
16 - 12 + .pull-right
  13 + %strong.append-right-10
  14 + Milestone:
17 - if can?(current_user, :modify_merge_request, @merge_request) 15 - if can?(current_user, :modify_merge_request, @merge_request)
18 = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'}) 16 = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'})
19 -  
20 = hidden_field_tag :merge_request_context 17 = hidden_field_tag :merge_request_context
21 = f.submit class: 'btn' 18 = f.submit class: 'btn'
22 - elsif merge_request.milestone 19 - elsif merge_request.milestone
23 = link_to merge_request.milestone.title, project_milestone_path 20 = link_to merge_request.milestone.title, project_milestone_path
  21 + - else
  22 + None
app/views/projects/merge_requests/show/_mr_box.html.haml
1 .issue-box 1 .issue-box
  2 + .state{ class: merge_request_alert_class(@merge_request) }
  3 + - if @merge_request.merged?
  4 + %span.state-label.state-label-blue
  5 + Merged
  6 + - elsif @merge_request.closed?
  7 + %span.state-label.state-label-red
  8 + Closed
  9 + - else
  10 + %span.state-label.state-label-green
  11 + Open
  12 + %span.creator
  13 + Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)}
  14 +
2 %h4.title 15 %h4.title
3 = gfm escape_once(@merge_request.title) 16 = gfm escape_once(@merge_request.title)
4 17
5 - .context  
6 - %cite.cgray  
7 - = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request }  
8 -  
9 - if @merge_request.description.present? 18 - if @merge_request.description.present?
10 .description 19 .description
11 .wiki 20 .wiki
12 = preserve do 21 = preserve do
13 = markdown @merge_request.description 22 = markdown @merge_request.description
14 23
15 - - if @merge_request.closed?  
16 - .description.alert-danger  
17 - %span  
18 - %i.icon-remove  
19 - Closed by #{link_to_member(@project, @merge_request.closed_event.author)}  
20 - #{time_ago_with_tooltip(@merge_request.closed_event.created_at)}.  
21 - - if @merge_request.merged?  
22 - .description.alert-success  
23 - %span  
24 - %i.icon-ok  
25 - Merged by #{link_to_member(@project, @merge_request.merge_event.author)}  
26 - #{time_ago_with_tooltip(@merge_request.merge_event.created_at)}.  
27 - - if !@closes_issues.empty? && @merge_request.opened?  
28 - .description.alert-info  
29 - %span  
30 - %i.icon-ok  
31 - Accepting this merge request will close #{@closes_issues.size == 1 ? 'issue' : 'issues'}  
32 - = succeed '.' do  
33 - != gfm(@closes_issues.map { |i| "##{i.iid}" }.to_sentence) 24 + .context
  25 + %cite.cgray
  26 + = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request }
  27 +
  28 +- if @merge_request.closed?
  29 + .alert.alert-info
  30 + %span
  31 + %i.icon-remove
  32 + Closed by #{link_to_member(@project, @merge_request.closed_event.author)}
  33 + #{time_ago_with_tooltip(@merge_request.closed_event.created_at)}.
  34 +- if @merge_request.merged?
  35 + .alert.alert-info
  36 + %span
  37 + %i.icon-ok
  38 + Merged by #{link_to_member(@project, @merge_request.merge_event.author)}
  39 + #{time_ago_with_tooltip(@merge_request.merge_event.created_at)}.
  40 +- if !@closes_issues.empty? && @merge_request.opened?
  41 + .alert.alert-info.alert-info
  42 + %span
  43 + %i.icon-ok
  44 + Accepting this merge request will close #{@closes_issues.size == 1 ? 'issue' : 'issues'}
  45 + = succeed '.' do
  46 + != gfm(@closes_issues.map { |i| "##{i.iid}" }.to_sentence)
app/views/projects/merge_requests/show/_mr_title.html.haml
1 %h3.page-title 1 %h3.page-title
2 = "Merge Request ##{@merge_request.iid}" 2 = "Merge Request ##{@merge_request.iid}"
3 - %small  
4 - created #{time_ago_with_tooltip(@merge_request.created_at)}  
5 -  
6 - - if @merge_request.merged?  
7 - %span.state-label.state-label-green  
8 - %i.icon-ok  
9 - Merged  
10 - - elsif @merge_request.closed?  
11 - %span.state-label.state-label-red  
12 - Closed  
13 - - else  
14 - %span.state-label.state-label-green  
15 - Open  
16 -  
17 -  
18 3
19 %span.pull-right 4 %span.pull-right
20 - if can?(current_user, :modify_merge_request, @merge_request) 5 - if can?(current_user, :modify_merge_request, @merge_request)
features/steps/project/project_merge_requests.rb
@@ -55,7 +55,9 @@ class ProjectMergeRequests < Spinach::FeatureSteps @@ -55,7 +55,9 @@ class ProjectMergeRequests < Spinach::FeatureSteps
55 end 55 end
56 56
57 step 'I click link "Close"' do 57 step 'I click link "Close"' do
58 - click_link "Close" 58 + within '.page-title' do
  59 + click_link "Close"
  60 + end
59 end 61 end
60 62
61 step 'I submit new merge request "Wiki Feature"' do 63 step 'I submit new merge request "Wiki Feature"' do
@@ -163,7 +165,7 @@ class ProjectMergeRequests < Spinach::FeatureSteps @@ -163,7 +165,7 @@ class ProjectMergeRequests < Spinach::FeatureSteps
163 end 165 end
164 166
165 step 'I should see merged request' do 167 step 'I should see merged request' do
166 - within '.page-title' do 168 + within '.issue-box' do
167 page.should have_content "Merged" 169 page.should have_content "Merged"
168 end 170 end
169 end 171 end
spec/features/issues_spec.rb
@@ -186,7 +186,7 @@ describe "Issues" do @@ -186,7 +186,7 @@ describe "Issues" do
186 find('.edit-issue.inline-update #issue_assignee_id').set project.team.members.first.id 186 find('.edit-issue.inline-update #issue_assignee_id').set project.team.members.first.id
187 click_button 'Update Issue' 187 click_button 'Update Issue'
188 188
189 - page.should have_content "currently assigned to" 189 + page.should have_content "Assignee:"
190 page.has_select?('issue_assignee_id', :selected => project.team.members.first.name) 190 page.has_select?('issue_assignee_id', :selected => project.team.members.first.name)
191 end 191 end
192 end 192 end
@@ -206,11 +206,9 @@ describe "Issues" do @@ -206,11 +206,9 @@ describe "Issues" do
206 login_with guest 206 login_with guest
207 207
208 visit project_issue_path(project, issue) 208 visit project_issue_path(project, issue)
209 - page.should have_content "currently assigned to #{issue.assignee.name}"  
210 - 209 + page.should have_content issue.assignee.name
211 end 210 end
212 end 211 end
213 -  
214 end 212 end
215 213
216 describe 'update milestone from issue#show' do 214 describe 'update milestone from issue#show' do
@@ -225,17 +223,16 @@ describe "Issues" do @@ -225,17 +223,16 @@ describe "Issues" do
225 find('.edit-issue.inline-update').select(milestone.title, from: 'issue_milestone_id') 223 find('.edit-issue.inline-update').select(milestone.title, from: 'issue_milestone_id')
226 click_button 'Update Issue' 224 click_button 'Update Issue'
227 225
228 - page.should have_content "Attached to milestone" 226 + page.should have_content "Milestone"
229 page.has_select?('issue_assignee_id', :selected => milestone.title) 227 page.has_select?('issue_assignee_id', :selected => milestone.title)
230 end 228 end
231 end 229 end
232 230
233 context 'by unauthorized user' do 231 context 'by unauthorized user' do
234 -  
235 let(:guest) { create(:user) } 232 let(:guest) { create(:user) }
236 233
237 before :each do 234 before :each do
238 - project.team << [[guest], :guest] 235 + project.team << [guest, :guest]
239 issue.milestone = milestone 236 issue.milestone = milestone
240 issue.save 237 issue.save
241 end 238 end
@@ -245,8 +242,7 @@ describe &quot;Issues&quot; do @@ -245,8 +242,7 @@ describe &quot;Issues&quot; do
245 login_with guest 242 login_with guest
246 243
247 visit project_issue_path(project, issue) 244 visit project_issue_path(project, issue)
248 -  
249 - page.should have_content "Attached to milestone #{milestone.title}" 245 + page.should have_content milestone.title
250 end 246 end
251 end 247 end
252 end 248 end
@@ -258,4 +254,4 @@ describe &quot;Issues&quot; do @@ -258,4 +254,4 @@ describe &quot;Issues&quot; do
258 def last_issue 254 def last_issue
259 all("ul.issues-list li").last.text 255 all("ul.issues-list li").last.text
260 end 256 end
261 -end  
262 \ No newline at end of file 257 \ No newline at end of file
  258 +end