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