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 |