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 | 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 "Issues" 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 "Issues" 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 | ... | ... |