Commit 6a18fd986270c7a0507d48c176bdefc52bd68b03
Exists in
spb-stable
and in
3 other branches
Merge branch 'restyle/issue' into 'master'
Improve UI for Issue#show, MR#show pages
Showing
11 changed files
with
112 additions
and
88 deletions
Show diff stats
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 "Issues" do | @@ -245,8 +242,7 @@ describe "Issues" 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 "Issues" do | @@ -258,4 +254,4 @@ describe "Issues" 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 |