Commit ad0f5fdc2729ac26268c2638c064abbf14134688
1 parent
172ad962
Exists in
spb-stable
and in
2 other branches
Improve mobile UI for issues and merge requests
Showing
9 changed files
with
119 additions
and
59 deletions
Show diff stats
CHANGELOG
| @@ -8,6 +8,7 @@ v 6.9.0 | @@ -8,6 +8,7 @@ v 6.9.0 | ||
| 8 | - Fix syntax highlighting for code comments blocks | 8 | - Fix syntax highlighting for code comments blocks |
| 9 | - Improve comments loading logic | 9 | - Improve comments loading logic |
| 10 | - Stop refreshing comments when the tab is hidden | 10 | - Stop refreshing comments when the tab is hidden |
| 11 | + - Improve issue and merge request mobile UI (Drew Blessing) | ||
| 11 | 12 | ||
| 12 | v 6.8.0 | 13 | v 6.8.0 |
| 13 | - Ability to at mention users that are participating in issue and merge req. discussion | 14 | - Ability to at mention users that are participating in issue and merge req. discussion |
app/assets/stylesheets/generic/issue_box.scss
| @@ -70,7 +70,6 @@ | @@ -70,7 +70,6 @@ | ||
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | .state { | 72 | .state { |
| 73 | - height: 34px; | ||
| 74 | border-bottom: 1px solid #DDD; | 73 | border-bottom: 1px solid #DDD; |
| 75 | line-height: 32px; | 74 | line-height: 32px; |
| 76 | } | 75 | } |
| @@ -89,6 +88,18 @@ | @@ -89,6 +88,18 @@ | ||
| 89 | border: none; | 88 | border: none; |
| 90 | border-top: 1px solid #eee; | 89 | border-top: 1px solid #eee; |
| 91 | padding: 15px 25px; | 90 | padding: 15px 25px; |
| 91 | + | ||
| 92 | + // Reset text align for children | ||
| 93 | + .text-right > * { text-align: left; } | ||
| 94 | + | ||
| 95 | + @media (max-width: $screen-xs-max) { | ||
| 96 | + // Don't right align on mobile | ||
| 97 | + .text-right { text-align: left; } | ||
| 98 | + | ||
| 99 | + .row .col-md-6 { | ||
| 100 | + padding-top: 5px; | ||
| 101 | + } | ||
| 102 | + } | ||
| 92 | } | 103 | } |
| 93 | 104 | ||
| 94 | .description { | 105 | .description { |
| @@ -106,7 +117,11 @@ | @@ -106,7 +117,11 @@ | ||
| 106 | padding: 1px 25px; | 117 | padding: 1px 25px; |
| 107 | text-align: center; | 118 | text-align: center; |
| 108 | text-shadow: none; | 119 | text-shadow: none; |
| 109 | - margin-right: 20px; | ||
| 110 | display: inline-block; | 120 | display: inline-block; |
| 121 | + line-height: 34px; | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + .creator { | ||
| 125 | + padding: 2px 15px; | ||
| 111 | } | 126 | } |
| 112 | } | 127 | } |
app/assets/stylesheets/sections/issues.scss
| @@ -143,3 +143,36 @@ form.edit-issue { | @@ -143,3 +143,36 @@ form.edit-issue { | ||
| 143 | border-color: #E5E5E5; | 143 | border-color: #E5E5E5; |
| 144 | } | 144 | } |
| 145 | } | 145 | } |
| 146 | + | ||
| 147 | +@media (max-width: $screen-xs-max) { | ||
| 148 | + .issue-btn-group { | ||
| 149 | + width: 100%; | ||
| 150 | + margin-top: 5px; | ||
| 151 | + | ||
| 152 | + .btn-group { | ||
| 153 | + width: 100%; | ||
| 154 | + | ||
| 155 | + ul { | ||
| 156 | + width: 100%; | ||
| 157 | + text-align: center; | ||
| 158 | + } | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + .btn { | ||
| 162 | + width: 100%; | ||
| 163 | + margin-top: -1px; | ||
| 164 | + | ||
| 165 | + &:first-child:not(:last-child) { | ||
| 166 | + border-radius: 4px 4px 0 0; | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + &:not(:first-child):not(:last-child) { | ||
| 170 | + border-radius: 0; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + &:last-child:not(:first-child) { | ||
| 174 | + border-radius: 0 0 4px 4px; | ||
| 175 | + } | ||
| 176 | + } | ||
| 177 | + } | ||
| 178 | +} |
app/assets/stylesheets/sections/votes.scss
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 | - %strong.append-right-10 | ||
| 3 | - Assignee: | 2 | + .row |
| 3 | + .col-md-6 | ||
| 4 | + %strong.append-right-10 | ||
| 5 | + Assignee: | ||
| 4 | 6 | ||
| 5 | - - if can?(current_user, :modify_issue, @issue) | ||
| 6 | - = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @issue.assignee_id) | ||
| 7 | - - elsif issue.assignee | ||
| 8 | - = link_to_member(@project, @issue.assignee) | ||
| 9 | - - else | ||
| 10 | - None | 7 | + - if can?(current_user, :modify_issue, @issue) |
| 8 | + = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @issue.assignee_id) | ||
| 9 | + - elsif issue.assignee | ||
| 10 | + = link_to_member(@project, @issue.assignee) | ||
| 11 | + - else | ||
| 12 | + None | ||
| 11 | 13 | ||
| 12 | - .pull-right | ||
| 13 | - %strong.append-right-10 | ||
| 14 | - Milestone: | ||
| 15 | - - if can?(current_user, :modify_issue, @issue) | ||
| 16 | - = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'}) | ||
| 17 | - = hidden_field_tag :issue_context | ||
| 18 | - = f.submit class: 'btn' | ||
| 19 | - - elsif issue.milestone | ||
| 20 | - = link_to issue.milestone.title, project_milestone_path | ||
| 21 | - - else | ||
| 22 | - None | 14 | + .col-md-6.text-right |
| 15 | + %strong.append-right-10 | ||
| 16 | + Milestone: | ||
| 17 | + - if can?(current_user, :modify_issue, @issue) | ||
| 18 | + = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact'}) | ||
| 19 | + = hidden_field_tag :issue_context | ||
| 20 | + = f.submit class: 'btn' | ||
| 21 | + - elsif issue.milestone | ||
| 22 | + = link_to issue.milestone.title, project_milestone_path | ||
| 23 | + - else | ||
| 24 | + 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 | - %span.pull-right | 4 | + %span.pull-right.issue-btn-group |
| 5 | - if can?(current_user, :write_issue, @project) | 5 | - if can?(current_user, :write_issue, @project) |
| 6 | = link_to new_project_issue_path(@project), class: "btn btn-grouped", title: "New Issue", id: "new_issue_link" do | 6 | = link_to new_project_issue_path(@project), class: "btn btn-grouped", title: "New Issue", id: "new_issue_link" do |
| 7 | %i.icon-plus | 7 | %i.icon-plus |
| @@ -16,28 +16,29 @@ | @@ -16,28 +16,29 @@ | ||
| 16 | %i.icon-edit | 16 | %i.icon-edit |
| 17 | Edit | 17 | Edit |
| 18 | 18 | ||
| 19 | -.votes-holder | ||
| 20 | - #votes= render 'votes/votes_block', votable: @issue | 19 | +.clearfix |
| 20 | + .votes-holder | ||
| 21 | + #votes= render 'votes/votes_block', votable: @issue | ||
| 21 | 22 | ||
| 22 | -.back-link | ||
| 23 | - = link_to project_issues_path(@project) do | ||
| 24 | - ← To issues list | ||
| 25 | - %span.milestone-nav-link | ||
| 26 | - - if @issue.milestone | ||
| 27 | - | | ||
| 28 | - %span.light Milestone | ||
| 29 | - = link_to project_milestone_path(@project, @issue.milestone) do | ||
| 30 | - = @issue.milestone.title | 23 | + .back-link |
| 24 | + = link_to project_issues_path(@project) do | ||
| 25 | + ← To issues list | ||
| 26 | + %span.milestone-nav-link | ||
| 27 | + - if @issue.milestone | ||
| 28 | + | | ||
| 29 | + %span.light Milestone | ||
| 30 | + = link_to project_milestone_path(@project, @issue.milestone) do | ||
| 31 | + = @issue.milestone.title | ||
| 31 | 32 | ||
| 32 | .issue-box{ class: issue_box_class(@issue) } | 33 | .issue-box{ class: issue_box_class(@issue) } |
| 33 | - .state | ||
| 34 | - %span.state-label | 34 | + .state.clearfix |
| 35 | + .state-label.col-sm-2.col-xs-12 | ||
| 35 | - if @issue.closed? | 36 | - if @issue.closed? |
| 36 | Closed | 37 | Closed |
| 37 | - else | 38 | - else |
| 38 | Open | 39 | Open |
| 39 | 40 | ||
| 40 | - %span.creator | 41 | + %span.creator.col-sm-9.col-xs-12 |
| 41 | Created by #{link_to_member(@project, @issue.author)} #{time_ago_with_tooltip(@issue.created_at)} | 42 | Created by #{link_to_member(@project, @issue.author)} #{time_ago_with_tooltip(@issue.created_at)} |
| 42 | 43 | ||
| 43 | %h4.title | 44 | %h4.title |
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 | - %strong.append-right-10 | ||
| 3 | - Assignee: | 2 | + .row |
| 3 | + .col-md-6 | ||
| 4 | + %strong.append-right-10 | ||
| 5 | + Assignee: | ||
| 4 | 6 | ||
| 5 | - - if can?(current_user, :modify_merge_request, @merge_request) | ||
| 6 | - = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @merge_request.assignee_id) | ||
| 7 | - - elsif merge_request.assignee | ||
| 8 | - = link_to_member(@project, @merge_request.assignee) | ||
| 9 | - - else | ||
| 10 | - None | 7 | + - if can?(current_user, :modify_merge_request, @merge_request) |
| 8 | + = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control', selected: @merge_request.assignee_id) | ||
| 9 | + - elsif merge_request.assignee | ||
| 10 | + = link_to_member(@project, @merge_request.assignee) | ||
| 11 | + - else | ||
| 12 | + None | ||
| 11 | 13 | ||
| 12 | - .pull-right | ||
| 13 | - %strong.append-right-10 | ||
| 14 | - Milestone: | ||
| 15 | - - if can?(current_user, :modify_merge_request, @merge_request) | ||
| 16 | - = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone (none):" }, {class: 'select2 select2-compact'}) | ||
| 17 | - = hidden_field_tag :merge_request_context | ||
| 18 | - = f.submit class: 'btn' | ||
| 19 | - - elsif merge_request.milestone | ||
| 20 | - = link_to merge_request.milestone.title, project_milestone_path | ||
| 21 | - - else | ||
| 22 | - None | 14 | + .col-md-6.text-right |
| 15 | + %strong.append-right-10 | ||
| 16 | + Milestone: | ||
| 17 | + - if can?(current_user, :modify_merge_request, @merge_request) | ||
| 18 | + = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact'}) | ||
| 19 | + = hidden_field_tag :merge_request_context | ||
| 20 | + = f.submit class: 'btn' | ||
| 21 | + - elsif merge_request.milestone | ||
| 22 | + = link_to merge_request.milestone.title, project_milestone_path | ||
| 23 | + - else | ||
| 24 | + None |
app/views/projects/merge_requests/show/_mr_box.html.haml
| 1 | .issue-box{ class: issue_box_class(@merge_request) } | 1 | .issue-box{ class: issue_box_class(@merge_request) } |
| 2 | - .state | ||
| 3 | - %span.state-label | 2 | + .state.clearfix |
| 3 | + %span.state-label.col-sm-2.col-xs-12 | ||
| 4 | - if @merge_request.merged? | 4 | - if @merge_request.merged? |
| 5 | Merged | 5 | Merged |
| 6 | - elsif @merge_request.closed? | 6 | - elsif @merge_request.closed? |
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | - else | 8 | - else |
| 9 | Open | 9 | Open |
| 10 | 10 | ||
| 11 | - %span.creator | 11 | + %span.creator.col-sm-9.col-xs-12 |
| 12 | Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} | 12 | Created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} |
| 13 | 13 | ||
| 14 | %h4.title | 14 | %h4.title |
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 | 3 | ||
| 4 | - %span.pull-right | 4 | + %span.pull-right.issue-btn-group |
| 5 | - if can?(current_user, :modify_merge_request, @merge_request) | 5 | - if can?(current_user, :modify_merge_request, @merge_request) |
| 6 | - if @merge_request.open? | 6 | - if @merge_request.open? |
| 7 | .btn-group.pull-left | 7 | .btn-group.pull-left |