summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2007-10-22 19:34:21 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2007-10-22 19:34:21 +0000
commit33003e5b2d881a30df7dc37a0c2a7b07b2a67ebe (patch)
tree1a08550ffa2f665d9a64aeb68001cb7074571f5c
parent8ca4d35dcc466df18b0fa6a322d00b030b183d15 (diff)
downloadredmine-33003e5b2d881a30df7dc37a0c2a7b07b2a67ebe.tar.gz
redmine-33003e5b2d881a30df7dc37a0c2a7b07b2a67ebe.zip
SCM browser: directories can now be collapsed and re-expanded with no additional request.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@863 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/views/repositories/_dir_list.rhtml2
-rw-r--r--app/views/repositories/_dir_list_content.rhtml8
-rw-r--r--public/javascripts/application.js34
3 files changed, 39 insertions, 5 deletions
diff --git a/app/views/repositories/_dir_list.rhtml b/app/views/repositories/_dir_list.rhtml
index b9c3fd54c..1ed623ae8 100644
--- a/app/views/repositories/_dir_list.rhtml
+++ b/app/views/repositories/_dir_list.rhtml
@@ -1,4 +1,4 @@
-<table class="list">
+<table class="list" id="browser">
<thead>
<tr id="root">
<th><%= l(:field_name) %></th>
diff --git a/app/views/repositories/_dir_list_content.rhtml b/app/views/repositories/_dir_list_content.rhtml
index 742da4951..3dfe4319b 100644
--- a/app/views/repositories/_dir_list_content.rhtml
+++ b/app/views/repositories/_dir_list_content.rhtml
@@ -1,15 +1,15 @@
<% @entries.each do |entry| %>
<% tr_id = Digest::MD5.hexdigest(entry.path)
depth = params[:depth].to_i %>
-<tr id="<%= tr_id %>">
+<tr id="<%= tr_id %>" class="<%= params[:parent_id] %>">
<td>
<%= if entry.is_dir?
link_to_remote h(entry.name),
- {:url => {:action => 'browse', :id => @project, :path => entry.path, :rev => @rev, :depth => (depth + 1)},
+ {:url => {:action => 'browse', :id => @project, :path => entry.path, :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
:update => tr_id,
:position => :after,
- :success => "Element.addClassName('#{tr_id}', 'open');",
- :condition => "!Element.hasClassName('#{tr_id}', 'open')"
+ :success => "scmEntryLoaded('#{tr_id}')",
+ :condition => "scmEntryClick('#{tr_id}')"
},
{:href => url_for({:action => 'browse', :id => @project, :path => entry.path, :rev => @rev}),
:class => ('icon icon-folder'),
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index bf86f398a..8432685dd 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -59,6 +59,40 @@ function checkBulkEdit(form) {
return false;
}
+function collapseScmEntry(id) {
+ var els = document.getElementsByClassName(id, 'browser');
+ for (var i = 0; i < els.length; i++) {
+ collapseScmEntry(els[i].id);
+ Element.hide(els[i]);
+ }
+ $(id).removeClassName('open');
+}
+
+function expandScmEntry(id) {
+ var els = document.getElementsByClassName(id, 'browser');
+ for (var i = 0; i < els.length; i++) {
+ Element.show(els[i]);
+ }
+ $(id).addClassName('open');
+}
+
+function scmEntryClick(id) {
+ el = $(id);
+ if (el.hasClassName('open')) {
+ collapseScmEntry(id);
+ return false;
+ } else if (el.hasClassName('loaded')) {
+ expandScmEntry(id);
+ return false;
+ }
+ return true;
+}
+
+function scmEntryLoaded(id) {
+ Element.addClassName(id, 'open');
+ Element.addClassName(id, 'loaded');
+}
+
/* shows and hides ajax indicator */
Ajax.Responders.register({
onCreate: function(){