Commit 388d72e6bf9c3e72113b8c16d1cc266b41870eb9
1 parent
a8fad4ff
Exists in
master
and in
4 other branches
Add render_tree helper; simplify (speed up) tree_icon
Showing
6 changed files
with
44 additions
and
41 deletions
Show diff stats
app/assets/javascripts/tree.js.coffee
| ... | ... | @@ -15,6 +15,7 @@ $ -> |
| 15 | 15 | $("#tree-slider .tree-item").live 'click', (e) -> |
| 16 | 16 | $('.tree-item-file-name a', this).trigger('click') if (e.target.nodeName != "A") |
| 17 | 17 | |
| 18 | + # Show/Hide the loading spinner | |
| 18 | 19 | $('#tree-slider .tree-item-file-name a, .breadcrumb a, .project-refs-form').live |
| 19 | 20 | "ajax:beforeSend": -> $('.tree_progress').addClass("loading") |
| 20 | 21 | "ajax:complete": -> $('.tree_progress').removeClass("loading") | ... | ... |
app/decorators/tree_decorator.rb
| ... | ... | @@ -8,14 +8,14 @@ class TreeDecorator < ApplicationDecorator |
| 8 | 8 | |
| 9 | 9 | #parts = parts[0...-1] if is_blob? |
| 10 | 10 | |
| 11 | - yield(h.link_to("..", "#", remote: :true)) if parts.count > max_links | |
| 11 | + yield(h.link_to("..", "#", remote: true)) if parts.count > max_links | |
| 12 | 12 | |
| 13 | 13 | parts.each do |part| |
| 14 | 14 | part_path = File.join(part_path, part) unless part_path.empty? |
| 15 | 15 | part_path = part if part_path.empty? |
| 16 | 16 | |
| 17 | 17 | next unless parts.last(2).include?(part) if parts.count > max_links |
| 18 | - yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path)), remote: :true)) | |
| 18 | + yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path)), remote: true)) | |
| 19 | 19 | end |
| 20 | 20 | end |
| 21 | 21 | end | ... | ... |
app/helpers/tree_helper.rb
| 1 | 1 | module TreeHelper |
| 2 | - def tree_icon(content) | |
| 3 | - if content.is_a?(Grit::Blob) | |
| 4 | - if content.text? | |
| 5 | - image_tag "file_txt.png" | |
| 6 | - elsif content.image? | |
| 7 | - image_tag "file_img.png" | |
| 2 | + # Sorts a repository's tree so that folders are before files and renders | |
| 3 | + # their corresponding partials | |
| 4 | + # | |
| 5 | + # contents - A Grit::Tree object for the current tree | |
| 6 | + def render_tree(contents) | |
| 7 | + # Render Folders before Files/Submodules | |
| 8 | + folders, files = contents.partition { |v| v.kind_of?(Grit::Tree) } | |
| 9 | + | |
| 10 | + tree = "" | |
| 11 | + | |
| 12 | + # Render folders if we have any | |
| 13 | + tree += render partial: 'tree/tree_item', collection: folders, locals: {type: 'folder'} if folders.present? | |
| 14 | + | |
| 15 | + files.each do |f| | |
| 16 | + if f.respond_to?(:url) | |
| 17 | + # Object is a Submodule | |
| 18 | + tree += render partial: 'tree/submodule_item', object: f | |
| 8 | 19 | else |
| 9 | - image_tag "file_bin.png" | |
| 20 | + # Object is a Blob | |
| 21 | + tree += render partial: 'tree/tree_item', object: f, locals: {type: 'file'} | |
| 10 | 22 | end |
| 11 | - else | |
| 12 | - image_tag "file_dir.png" | |
| 13 | 23 | end |
| 24 | + | |
| 25 | + tree.html_safe | |
| 14 | 26 | end |
| 15 | 27 | |
| 16 | - def tree_hex_class(content) | |
| 17 | - "file_#{hexdigest(content.name)}" | |
| 28 | + # Return an image icon depending on the file type | |
| 29 | + # | |
| 30 | + # type - String type of the tree item; either 'folder' or 'file' | |
| 31 | + def tree_icon(type) | |
| 32 | + image = type == 'folder' ? 'file_dir.png' : 'file_txt.png' | |
| 33 | + image_tag(image, size: '16x16') | |
| 18 | 34 | end |
| 19 | 35 | |
| 20 | - def tree_full_path(content) | |
| 21 | - content.name.force_encoding('utf-8') | |
| 22 | - if params[:path] | |
| 23 | - File.join(params[:path], content.name) | |
| 24 | - else | |
| 25 | - content.name | |
| 26 | - end | |
| 36 | + def tree_hex_class(content) | |
| 37 | + "file_#{hexdigest(content.name)}" | |
| 27 | 38 | end |
| 28 | 39 | |
| 29 | 40 | # Public: Determines if a given filename is compatible with GitHub::Markup. | ... | ... |
app/views/tree/_tree.html.haml
| ... | ... | @@ -14,7 +14,6 @@ |
| 14 | 14 | - if tree.is_blob? |
| 15 | 15 | = render partial: "tree/tree_file", object: tree |
| 16 | 16 | - else |
| 17 | - - contents = tree.contents | |
| 18 | 17 | %table#tree-slider{class: "table_#{@hex_path} tree-table" } |
| 19 | 18 | %thead |
| 20 | 19 | %th Name |
| ... | ... | @@ -24,22 +23,16 @@ |
| 24 | 23 | = link_to "History", tree.history_path, class: "right" |
| 25 | 24 | |
| 26 | 25 | - if tree.up_dir? |
| 27 | - %tr{ class: "tree-item", url: tree.up_dir_path } | |
| 26 | + %tr.tree-item | |
| 28 | 27 | %td.tree-item-file-name |
| 29 | - = image_tag "file_empty.png" | |
| 30 | - = link_to "..", tree.up_dir_path, remote: :true | |
| 28 | + = image_tag "file_empty.png", size: '16x16' | |
| 29 | + = link_to "..", tree.up_dir_path, remote: true | |
| 31 | 30 | %td |
| 32 | 31 | %td |
| 33 | 32 | |
| 34 | - - index = 0 | |
| 35 | - - contents.select{ |i| i.is_a?(Grit::Tree)}.each do |content| | |
| 36 | - = render partial: "tree/tree_item", locals: { content: content, index: (index += 1) } | |
| 37 | - - contents.select{ |i| i.is_a?(Grit::Blob)}.each do |content| | |
| 38 | - = render partial: "tree/tree_item", locals: { content: content, index: (index += 1) } | |
| 39 | - - contents.select{ |i| i.is_a?(Grit::Submodule)}.each do |content| | |
| 40 | - = render partial: "tree/submodule_item", locals: { content: content, index: (index += 1) } | |
| 33 | + = render_tree(tree.contents) | |
| 41 | 34 | |
| 42 | - - if content = contents.select{ |c| c.is_a?(Grit::Blob) and c.name =~ /^readme/i }.first | |
| 35 | + - if content = tree.contents.find { |c| c.is_a?(Grit::Blob) and c.name =~ /^readme/i } | |
| 43 | 36 | .file_holder#README |
| 44 | 37 | .file_title |
| 45 | 38 | %i.icon-file | ... | ... |
app/views/tree/_tree_item.html.haml
| 1 | -- file = tree_full_path(content) | |
| 2 | -%tr{ class: "tree-item #{tree_hex_class(content)}", url: project_tree_path(@project, tree_join(@id, file)) } | |
| 1 | +%tr{ class: "tree-item #{tree_hex_class(tree_item)}" } | |
| 3 | 2 | %td.tree-item-file-name |
| 4 | - = tree_icon(content) | |
| 5 | - %strong= link_to truncate(content.name, length: 40), project_tree_path(@project, tree_join(@id || @commit.id, file)), remote: :true | |
| 3 | + = tree_icon(type) | |
| 4 | + %strong= link_to truncate(tree_item.name, length: 40), project_tree_path(@project, tree_join(@id || @commit.id, tree_item.name)), remote: true | |
| 6 | 5 | %td.tree_time_ago.cgray |
| 7 | - - if index == 1 | |
| 8 | - %span.log_loading | |
| 9 | - Loading commit data.. | |
| 10 | - = image_tag "ajax_loader_tree.gif", width: 14 | |
| 6 | + %span.log_loading.hide | |
| 7 | + Loading commit data... | |
| 8 | + = image_tag "ajax_loader_tree.gif", width: 14 | |
| 11 | 9 | %td.tree_commit | ... | ... |
app/views/tree/show.js.haml
| 1 | 1 | :plain |
| 2 | 2 | // Load Files list |
| 3 | - $("#tree-holder").html("#{escape_javascript(render(partial: "tree", locals: {commit: @commit, tree: @tree}))}"); | |
| 3 | + $("#tree-holder").html("#{escape_javascript(render(partial: "tree", locals: {tree: @tree}))}"); | |
| 4 | 4 | $("#tree-content-holder").show("slide", { direction: "right" }, 150); |
| 5 | 5 | $('.project-refs-form #path').val("#{@path}"); |
| 6 | 6 | ... | ... |