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