Commit 68e4df7065ebb805d8215b8c28f0eaf510dec17f
Exists in
spb-stable
and in
2 other branches
Merge branch 'ui-ux-improvements' into 'master'
UI/UX improvements
Showing
23 changed files
with
147 additions
and
167 deletions
Show diff stats
app/assets/stylesheets/generic/files.scss
app/assets/stylesheets/sections/snippets.scss
app/assets/stylesheets/sections/tree.scss
| @@ -117,15 +117,6 @@ | @@ -117,15 +117,6 @@ | ||
| 117 | } | 117 | } |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | -.tree-btn-group { | ||
| 121 | - top: 2px; | ||
| 122 | - | ||
| 123 | - .btn { | ||
| 124 | - margin-right: 0px; | ||
| 125 | - padding: 2px 10px; | ||
| 126 | - } | ||
| 127 | -} | ||
| 128 | - | ||
| 129 | .tree-download-holder .btn { | 120 | .tree-download-holder .btn { |
| 130 | padding: 4px 12px; | 121 | padding: 4px 12px; |
| 131 | } | 122 | } |
app/models/ability.rb
| @@ -236,7 +236,11 @@ class Ability | @@ -236,7 +236,11 @@ class Ability | ||
| 236 | :"modify_#{name}", | 236 | :"modify_#{name}", |
| 237 | ] | 237 | ] |
| 238 | else | 238 | else |
| 239 | - subject.respond_to?(:project) ? project_abilities(user, subject.project) : [] | 239 | + if subject.respond_to?(:project) |
| 240 | + project_abilities(user, subject.project) | ||
| 241 | + else | ||
| 242 | + [] | ||
| 243 | + end | ||
| 240 | end | 244 | end |
| 241 | end | 245 | end |
| 242 | end | 246 | end |
app/views/projects/blob/_actions.html.haml
| @@ -14,6 +14,6 @@ | @@ -14,6 +14,6 @@ | ||
| 14 | = link_to "blame", project_blame_path(@project, @id), class: "btn btn-small" unless @blob.empty? | 14 | = link_to "blame", project_blame_path(@project, @id), class: "btn btn-small" unless @blob.empty? |
| 15 | = link_to "history", project_commits_path(@project, @id), class: "btn btn-small" | 15 | = link_to "history", project_commits_path(@project, @id), class: "btn btn-small" |
| 16 | 16 | ||
| 17 | - - if allowed_tree_edit? | ||
| 18 | - = link_to '#modal-remove-blob', class: "remove-blob btn btn-small btn-remove", "data-toggle" => "modal" do | ||
| 19 | - remove | 17 | +- if allowed_tree_edit? |
| 18 | + = link_to '#modal-remove-blob', class: "remove-blob btn btn-small btn-remove", "data-toggle" => "modal" do | ||
| 19 | + remove |
app/views/projects/snippets/_blob.html.haml
| @@ -1,10 +0,0 @@ | @@ -1,10 +0,0 @@ | ||
| 1 | -.file-holder | ||
| 2 | - .file-title | ||
| 3 | - %i.icon-file | ||
| 4 | - %strong= @snippet.file_name | ||
| 5 | - %span.options | ||
| 6 | - .btn-group.tree-btn-group.pull-right | ||
| 7 | - - if can?(current_user, :admin_project_snippet, @project) || @snippet.author == current_user | ||
| 8 | - = link_to "Edit", edit_project_snippet_path(@project, @snippet), class: "btn btn-tiny", title: 'Edit Snippet' | ||
| 9 | - = link_to "Raw", raw_project_snippet_path(@project, @snippet), class: "btn btn-tiny", target: "_blank" | ||
| 10 | - = render 'snippets/blob_content' |
app/views/projects/snippets/_form.html.haml
| @@ -1,42 +0,0 @@ | @@ -1,42 +0,0 @@ | ||
| 1 | -%h3.page-title | ||
| 2 | - = @snippet.new_record? ? "New Snippet" : "Edit Snippet ##{@snippet.id}" | ||
| 3 | -%hr | ||
| 4 | -.snippet-form-holder | ||
| 5 | - = form_for [@project, @snippet], as: :project_snippet, url: url, html: {class: "form-horizontal snippet-form"} do |f| | ||
| 6 | - -if @snippet.errors.any? | ||
| 7 | - .alert.alert-danger | ||
| 8 | - %ul | ||
| 9 | - - @snippet.errors.full_messages.each do |msg| | ||
| 10 | - %li= msg | ||
| 11 | - | ||
| 12 | - .form-group | ||
| 13 | - = f.label :title, class: 'control-label' | ||
| 14 | - .col-sm-10= f.text_field :title, placeholder: "Example Snippet", class: 'form-control', required: true | ||
| 15 | - .form-group | ||
| 16 | - .file-editor | ||
| 17 | - = f.label :file_name, "File", class: 'control-label' | ||
| 18 | - .col-sm-10 | ||
| 19 | - .file-holder.snippet | ||
| 20 | - .file-title | ||
| 21 | - = f.text_field :file_name, placeholder: "example.rb", class: 'form-control snippet-file-name', required: true | ||
| 22 | - .file-content.code | ||
| 23 | - %pre#editor= @snippet.content | ||
| 24 | - = f.hidden_field :content, class: 'snippet-file-content' | ||
| 25 | - | ||
| 26 | - .form-actions | ||
| 27 | - - if @snippet.new_record? | ||
| 28 | - = f.submit 'Create snippet', class: "btn-create btn" | ||
| 29 | - - else | ||
| 30 | - = f.submit 'Save', class: "btn-save btn" | ||
| 31 | - | ||
| 32 | - - unless @snippet.new_record? | ||
| 33 | - .pull-right.prepend-left-20 | ||
| 34 | - = link_to 'Remove snippet', project_snippet_path(@project, @snippet), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn pull-right btn-remove delete-snippet prepend-left-10", id: "destroy_snippet_#{@snippet.id}" | ||
| 35 | - = link_to "Cancel", project_snippets_path(@project), class: "btn btn-cancel" | ||
| 36 | - | ||
| 37 | -:javascript | ||
| 38 | - var editor = ace.edit("editor"); | ||
| 39 | - $(".snippet-form-holder form").submit(function(){ | ||
| 40 | - $(".snippet-file-content").val(editor.getValue()); | ||
| 41 | - }); | ||
| 42 | - |
app/views/projects/snippets/edit.html.haml
app/views/projects/snippets/new.html.haml
app/views/projects/snippets/show.html.haml
| 1 | %h3.page-title | 1 | %h3.page-title |
| 2 | = @snippet.title | 2 | = @snippet.title |
| 3 | 3 | ||
| 4 | - %small.pull-right | 4 | + .pull-right |
| 5 | + = link_to new_project_snippet_path(@project), class: "btn btn-new", title: "New Snippet" do | ||
| 6 | + Add new snippet | ||
| 7 | + | ||
| 8 | +%hr | ||
| 9 | + | ||
| 10 | +.append-bottom-20 | ||
| 11 | + .pull-right | ||
| 5 | = "##{@snippet.id}" | 12 | = "##{@snippet.id}" |
| 6 | %span.light | 13 | %span.light |
| 7 | by | 14 | by |
| 8 | - = image_tag avatar_icon(@snippet.author_email), class: "avatar avatar-inline s16" | ||
| 9 | - = @snippet.author_name | ||
| 10 | -%div= render 'projects/snippets/blob' | 15 | + = link_to user_path(@snippet.author) do |
| 16 | + = image_tag avatar_icon(@snippet.author_email), class: "avatar avatar-inline s16" | ||
| 17 | + = @snippet.author_name | ||
| 18 | + | ||
| 19 | + .back-link | ||
| 20 | + = link_to project_snippets_path(@project) do | ||
| 21 | + ← project snippets | ||
| 22 | + | ||
| 23 | +.file-holder | ||
| 24 | + .file-title | ||
| 25 | + %i.icon-file | ||
| 26 | + %span.file_name | ||
| 27 | + = @snippet.file_name | ||
| 28 | + .options | ||
| 29 | + .btn-group | ||
| 30 | + - if can?(current_user, :modify_project_snippet, @snippet) | ||
| 31 | + = link_to "edit", edit_project_snippet_path(@project, @snippet), class: "btn btn-small", title: 'Edit Snippet' | ||
| 32 | + = link_to "raw", raw_project_snippet_path(@project, @snippet), class: "btn btn-small", target: "_blank" | ||
| 33 | + - if can?(current_user, :admin_project_snippet, @snippet) | ||
| 34 | + = link_to "remove", project_snippet_path(@project, @snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-small btn-remove", title: 'Delete Snippet' | ||
| 35 | + = render 'shared/snippets/blob' | ||
| 36 | + | ||
| 11 | %div#notes= render "projects/notes/notes_with_form" | 37 | %div#notes= render "projects/notes/notes_with_form" |
| @@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
| 1 | +- unless @snippet.content.empty? | ||
| 2 | + - if gitlab_markdown?(@snippet.file_name) | ||
| 3 | + .file-content.wiki | ||
| 4 | + = preserve do | ||
| 5 | + = markdown(@snippet.data) | ||
| 6 | + - elsif markup?(@snippet.file_name) | ||
| 7 | + .file-content.wiki | ||
| 8 | + = render_markup(@snippet.file_name, @snippet.data) | ||
| 9 | + - else | ||
| 10 | + .file-content.code | ||
| 11 | + = render 'shared/file_hljs', blob: @snippet | ||
| 12 | +- else | ||
| 13 | + .file-content.code | ||
| 14 | + .nothing-here-block Empty file |
| @@ -0,0 +1,55 @@ | @@ -0,0 +1,55 @@ | ||
| 1 | +.snippet-form-holder | ||
| 2 | + = form_for @snippet, url: url, html: { class: "form-horizontal snippet-form" } do |f| | ||
| 3 | + - if @snippet.errors.any? | ||
| 4 | + .alert.alert-danger | ||
| 5 | + %ul | ||
| 6 | + - @snippet.errors.full_messages.each do |msg| | ||
| 7 | + %li= msg | ||
| 8 | + | ||
| 9 | + .form-group | ||
| 10 | + = f.label :title, class: 'control-label' | ||
| 11 | + .col-sm-10= f.text_field :title, placeholder: "Example Snippet", class: 'form-control', required: true | ||
| 12 | + | ||
| 13 | + - unless @snippet.respond_to?(:project) | ||
| 14 | + .form-group | ||
| 15 | + = f.label "Access", class: 'control-label' | ||
| 16 | + .col-sm-10 | ||
| 17 | + = f.label :private_true, class: 'radio-label' do | ||
| 18 | + = f.radio_button :private, true | ||
| 19 | + %span | ||
| 20 | + %strong Private | ||
| 21 | + (only you can see this snippet) | ||
| 22 | + %br | ||
| 23 | + = f.label :private_false, class: 'radio-label' do | ||
| 24 | + = f.radio_button :private, false | ||
| 25 | + %span | ||
| 26 | + %strong Public | ||
| 27 | + (GitLab users can see this snippet) | ||
| 28 | + | ||
| 29 | + .form-group | ||
| 30 | + .file-editor | ||
| 31 | + = f.label :file_name, "File", class: 'control-label' | ||
| 32 | + .col-sm-10 | ||
| 33 | + .file-holder.snippet | ||
| 34 | + .file-title | ||
| 35 | + = f.text_field :file_name, placeholder: "example.rb", class: 'form-control snippet-file-name', required: true | ||
| 36 | + .file-content.code | ||
| 37 | + %pre#editor= @snippet.content | ||
| 38 | + = f.hidden_field :content, class: 'snippet-file-content' | ||
| 39 | + | ||
| 40 | + .form-actions | ||
| 41 | + - if @snippet.new_record? | ||
| 42 | + = f.submit 'Create snippet', class: "btn-create btn" | ||
| 43 | + - else | ||
| 44 | + = f.submit 'Save', class: "btn-save btn" | ||
| 45 | + | ||
| 46 | + - if @snippet.respond_to?(:project) | ||
| 47 | + = link_to "Cancel", project_snippets_path(@project), class: "btn btn-cancel" | ||
| 48 | + - else | ||
| 49 | + = link_to "Cancel", snippets_path(@project), class: "btn btn-cancel" | ||
| 50 | + | ||
| 51 | +:javascript | ||
| 52 | + var editor = ace.edit("editor"); | ||
| 53 | + $(".snippet-form-holder form").submit(function(){ | ||
| 54 | + $(".snippet-file-content").val(editor.getValue()); | ||
| 55 | + }); |
app/views/snippets/_blob.html.haml
| @@ -1,11 +0,0 @@ | @@ -1,11 +0,0 @@ | ||
| 1 | -.file-holder | ||
| 2 | - .file-title | ||
| 3 | - %i.icon-file | ||
| 4 | - %strong= @snippet.file_name | ||
| 5 | - %span.options | ||
| 6 | - .btn-group.tree-btn-group.pull-right | ||
| 7 | - - if @snippet.author == current_user | ||
| 8 | - = link_to "Edit", edit_snippet_path(@snippet), class: "btn btn-tiny", title: 'Edit Snippet' | ||
| 9 | - = link_to "Delete", snippet_path(@snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-tiny", title: 'Delete Snippet' | ||
| 10 | - = link_to "Raw", raw_snippet_path(@snippet), class: "btn btn-tiny", target: "_blank" | ||
| 11 | - = render 'snippets/blob_content' |
app/views/snippets/_blob_content.html.haml
| @@ -1,14 +0,0 @@ | @@ -1,14 +0,0 @@ | ||
| 1 | -- unless @snippet.content.empty? | ||
| 2 | - - if gitlab_markdown?(@snippet.file_name) | ||
| 3 | - .file-content.wiki | ||
| 4 | - = preserve do | ||
| 5 | - = markdown(@snippet.data) | ||
| 6 | - - elsif markup?(@snippet.file_name) | ||
| 7 | - .file-content.wiki | ||
| 8 | - = render_markup(@snippet.file_name, @snippet.data) | ||
| 9 | - - else | ||
| 10 | - .file-content.code | ||
| 11 | - = render 'shared/file_hljs', blob: @snippet | ||
| 12 | -- else | ||
| 13 | - .file-content.code | ||
| 14 | - .nothing-here-block Empty file |
app/views/snippets/_form.html.haml
| @@ -1,58 +0,0 @@ | @@ -1,58 +0,0 @@ | ||
| 1 | -%h3.page-title | ||
| 2 | - = @snippet.new_record? ? "New Snippet" : "Edit Snippet ##{@snippet.id}" | ||
| 3 | -%hr | ||
| 4 | -.snippet-form-holder | ||
| 5 | - = form_for @snippet, as: :personal_snippet, url: url, html: { class: "form-horizontal snippet-form" } do |f| | ||
| 6 | - -if @snippet.errors.any? | ||
| 7 | - .alert.alert-danger | ||
| 8 | - %ul | ||
| 9 | - - @snippet.errors.full_messages.each do |msg| | ||
| 10 | - %li= msg | ||
| 11 | - | ||
| 12 | - .form-group | ||
| 13 | - = f.label :title, class: 'control-label' | ||
| 14 | - .col-sm-10= f.text_field :title, placeholder: "Example Snippet", class: 'form-control', required: true | ||
| 15 | - .form-group | ||
| 16 | - = f.label "Access", class: 'control-label' | ||
| 17 | - .col-sm-10 | ||
| 18 | - = f.label :private_true, class: 'radio-label' do | ||
| 19 | - = f.radio_button :private, true | ||
| 20 | - %span | ||
| 21 | - %strong Private | ||
| 22 | - (only you can see this snippet) | ||
| 23 | - %br | ||
| 24 | - = f.label :private_false, class: 'radio-label' do | ||
| 25 | - = f.radio_button :private, false | ||
| 26 | - %span | ||
| 27 | - %strong Public | ||
| 28 | - (GitLab users can see this snippet) | ||
| 29 | - | ||
| 30 | - .form-group | ||
| 31 | - .file-editor | ||
| 32 | - = f.label :file_name, "File", class: 'control-label' | ||
| 33 | - .col-sm-10 | ||
| 34 | - .file-holder.snippet | ||
| 35 | - .file-title | ||
| 36 | - = f.text_field :file_name, placeholder: "example.rb", class: 'form-control snippet-file-name', required: true | ||
| 37 | - .file-content.code | ||
| 38 | - %pre#editor= @snippet.content | ||
| 39 | - = f.hidden_field :content, class: 'snippet-file-content' | ||
| 40 | - | ||
| 41 | - .form-actions | ||
| 42 | - - if @snippet.new_record? | ||
| 43 | - = f.submit 'Create snippet', class: "btn-create btn" | ||
| 44 | - - else | ||
| 45 | - = f.submit 'Save', class: "btn-save btn" | ||
| 46 | - | ||
| 47 | - - unless @snippet.new_record? | ||
| 48 | - .pull-right.prepend-left-20 | ||
| 49 | - = link_to 'Remove', snippet_path(@snippet), data: { confirm: 'Removed snippet cannot be restored! Are you sure?'}, method: :delete, class: "btn btn-remove delete-snippet", id: "destroy_snippet_#{@snippet.id}" | ||
| 50 | - = link_to "Cancel", snippets_path(@project), class: "btn btn-cancel" | ||
| 51 | - | ||
| 52 | - | ||
| 53 | -:javascript | ||
| 54 | - var editor = ace.edit("editor"); | ||
| 55 | - $(".snippet-form-holder form").submit(function(){ | ||
| 56 | - $(".snippet-file-content").val(editor.getValue()); | ||
| 57 | - }); | ||
| 58 | - |
app/views/snippets/edit.html.haml
app/views/snippets/new.html.haml
app/views/snippets/show.html.haml
| @@ -7,9 +7,9 @@ | @@ -7,9 +7,9 @@ | ||
| 7 | private | 7 | private |
| 8 | 8 | ||
| 9 | .pull-right | 9 | .pull-right |
| 10 | - = link_to new_snippet_path, class: "btn btn-new btn-small", title: "New Snippet" do | 10 | + = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do |
| 11 | Add new snippet | 11 | Add new snippet |
| 12 | - | 12 | +%hr |
| 13 | 13 | ||
| 14 | .append-bottom-20 | 14 | .append-bottom-20 |
| 15 | .pull-right | 15 | .pull-right |
| @@ -28,4 +28,16 @@ | @@ -28,4 +28,16 @@ | ||
| 28 | = link_to snippets_path do | 28 | = link_to snippets_path do |
| 29 | ← discover snippets | 29 | ← discover snippets |
| 30 | 30 | ||
| 31 | -%div= render 'blob' | 31 | +.file-holder |
| 32 | + .file-title | ||
| 33 | + %i.icon-file | ||
| 34 | + %span.file_name | ||
| 35 | + = @snippet.file_name | ||
| 36 | + .options | ||
| 37 | + .btn-group | ||
| 38 | + - if can?(current_user, :modify_personal_snippet, @snippet) | ||
| 39 | + = link_to "edit", edit_snippet_path(@snippet), class: "btn btn-small", title: 'Edit Snippet' | ||
| 40 | + = link_to "raw", raw_snippet_path(@snippet), class: "btn btn-small", target: "_blank" | ||
| 41 | + - if can?(current_user, :admin_personal_snippet, @snippet) | ||
| 42 | + = link_to "remove", snippet_path(@snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-small btn-remove", title: 'Delete Snippet' | ||
| 43 | + = render 'shared/snippets/blob' |
db/fixtures/development/12_snippets.rb
| 1 | Gitlab::Seeder.quiet do | 1 | Gitlab::Seeder.quiet do |
| 2 | contents = [ | 2 | contents = [ |
| 3 | - `curl https://gist.github.com/randx/4275756/raw/da2f262920c96d1a970d48bf2e99147954b1f4bd/glus1204.sh`, | ||
| 4 | - `curl https://gist.github.com/randx/3754594/raw/11026a295e6ef3a151c635707a3e1e8e15fc4725/gitlab_setup.sh `, | ||
| 5 | - `curl https://gist.github.com/randx/3065552/raw/29fbd09f4605a5ea22a5a9095e35fd1938dea4d6/gistfile1.sh`, | 3 | + `curl https://gist.githubusercontent.com/randx/4275756/raw/da2f262920c96d1a970d48bf2e99147954b1f4bd/glus1204.sh`, |
| 4 | + `curl https://gist.githubusercontent.com/randx/3754594/raw/11026a295e6ef3a151c635707a3e1e8e15fc4725/gitlab_setup.sh`, | ||
| 5 | + `curl https://gist.githubusercontent.com/randx/3065552/raw/29fbd09f4605a5ea22a5a9095e35fd1938dea4d6/gistfile1.sh`, | ||
| 6 | ] | 6 | ] |
| 7 | 7 | ||
| 8 | (1..50).each do |i| | 8 | (1..50).each do |i| |
features/project/snippets.feature
| @@ -30,6 +30,5 @@ Feature: Project Snippets | @@ -30,6 +30,5 @@ Feature: Project Snippets | ||
| 30 | 30 | ||
| 31 | Scenario: I destroy "Snippet one" | 31 | Scenario: I destroy "Snippet one" |
| 32 | Given I visit snippet page "Snippet one" | 32 | Given I visit snippet page "Snippet one" |
| 33 | - And I click link "Edit" | ||
| 34 | And I click link "Remove Snippet" | 33 | And I click link "Remove Snippet" |
| 35 | Then I should not see "Snippet one" in snippets | 34 | Then I should not see "Snippet one" in snippets |
features/snippets/snippets.feature
| @@ -24,6 +24,5 @@ Feature: Snippets Feature | @@ -24,6 +24,5 @@ Feature: Snippets Feature | ||
| 24 | 24 | ||
| 25 | Scenario: I destroy "Personal snippet one" | 25 | Scenario: I destroy "Personal snippet one" |
| 26 | Given I visit snippet page "Personal snippet one" | 26 | Given I visit snippet page "Personal snippet one" |
| 27 | - And I click link "Edit" | ||
| 28 | And I click link "Destroy" | 27 | And I click link "Destroy" |
| 29 | Then I should not see "Personal snippet one" in snippets | 28 | Then I should not see "Personal snippet one" in snippets |
features/steps/project/snippets.rb
| @@ -48,7 +48,7 @@ class ProjectSnippets < Spinach::FeatureSteps | @@ -48,7 +48,7 @@ class ProjectSnippets < Spinach::FeatureSteps | ||
| 48 | end | 48 | end |
| 49 | 49 | ||
| 50 | And 'I click link "Remove Snippet"' do | 50 | And 'I click link "Remove Snippet"' do |
| 51 | - click_link "Remove snippet" | 51 | + click_link "remove" |
| 52 | end | 52 | end |
| 53 | 53 | ||
| 54 | And 'I submit new snippet "Snippet three"' do | 54 | And 'I submit new snippet "Snippet three"' do |
features/steps/snippets/snippets.rb
| @@ -19,7 +19,7 @@ class SnippetsFeature < Spinach::FeatureSteps | @@ -19,7 +19,7 @@ class SnippetsFeature < Spinach::FeatureSteps | ||
| 19 | end | 19 | end |
| 20 | 20 | ||
| 21 | And 'I click link "Destroy"' do | 21 | And 'I click link "Destroy"' do |
| 22 | - click_link "Remove" | 22 | + click_link "remove" |
| 23 | end | 23 | end |
| 24 | 24 | ||
| 25 | And 'I submit new snippet "Personal snippet three"' do | 25 | And 'I submit new snippet "Personal snippet three"' do |