]> source.dussan.org Git - redmine.git/commitdiff
Integrated revision graph into scmid column.
authorEtienne Massip <etienne.massip@gmail.com>
Sat, 11 Feb 2012 14:57:44 +0000 (14:57 +0000)
committerEtienne Massip <etienne.massip@gmail.com>
Sat, 11 Feb 2012 14:57:44 +0000 (14:57 +0000)
Allow wrapping of comment text so that the width doesn't overlap the sidebar while using multiple repositories.
Some code cleanup also.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8850 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/helpers/repositories_helper.rb
app/views/repositories/_revision_graph.html.erb
app/views/repositories/_revisions.html.erb
public/javascripts/revision_graph.js
public/stylesheets/application.css
public/stylesheets/scm.css

index 3c12262a517cff713bddd63631c63de0e2dea87d..a3bb0573aae37973d530510ad35ba298c89eb7e8 100644 (file)
@@ -271,7 +271,6 @@ module RepositoriesHelper
       commits_by_scmid[commit.scmid] = {
         :parent_scmids => commit.parents.collect { |parent| parent.scmid },
         :rdmid => commit_index,
-        :space => 0,
         :refs  => refs_map.include?(commit.scmid) ? refs_map[commit.scmid].join(" ") : nil,
         :scmid => commit.scmid,
         :href  => block_given? ? yield(commit.scmid) : commit.scmid
@@ -280,40 +279,40 @@ module RepositoriesHelper
 
     heads.sort! { |head1, head2| head1.to_s <=> head2.to_s }
 
-    mark_index = 0
+    space = nil  
     heads.each do |head|
       if commits_by_scmid.include? head.scmid
-        mark_index = mark_chain(mark_index += 1, commits_by_scmid[head.scmid], commits_by_scmid)
+        space = index_head((space || -1) + 1, head, commits_by_scmid)
       end
     end
+
     # when no head matched anything use first commit
-    if mark_index == 0
-       mark_chain(mark_index += 1, commits_by_scmid.values.first, commits_by_scmid)
-    end
-    commits_by_scmid
+    space ||= index_head(0, commits.first, commits_by_scmid)
+
+    return commits_by_scmid, space
   end
 
-  def mark_chain(mark_index, commit, commits_by_scmid)
+  def index_head(space, commit, commits_by_scmid)
 
-    stack = [[mark_index, commit]]
-    mark_max_index = mark_index
+    stack = [[space, commits_by_scmid[commit.scmid]]]
+    max_space = space
 
     until stack.empty?
-      mark_index, commit = stack.pop
-      commit[:space] = mark_index if commit[:space] == 0
+      space, commit = stack.pop
+      commit[:space] = space if commit[:space].nil?
 
-      mark_index -=1
+      space -= 1
       commit[:parent_scmids].each_with_index do |parent_scmid, parent_index|
 
         parent_commit = commits_by_scmid[parent_scmid]
 
-        if parent_commit and parent_commit[:space] == 0
+        if parent_commit and parent_commit[:space].nil?
 
-          stack.unshift [mark_index += 1, parent_commit]
+          stack.unshift [space += 1, parent_commit]
         end
       end
-      mark_max_index = mark_index if mark_max_index < mark_index
+      max_space = space if max_space < space
     end
-    mark_max_index
+    max_space
   end
 end
index ef04220affc9a8ba707f107b83016a8df5ac616f..db82bedae28de56dd4d4f9a04281cbdda0f36b0f 100644 (file)
@@ -4,9 +4,10 @@
 <script type="text/javascript" charset="utf-8">
   Event.observe(window, 'load', function(){
     revisionGraph(
-        document.getElementById("holder"),
-        <%= commits.to_json.html_safe %>);
+        document.getElementById('holder'),
+        <%= commits.to_json.html_safe %>,
+        <%= space %>);
   });
 </script>
 
-<div id="holder" class="graph"></div>
+<div id="holder" class="revision-graph" style="width: <%= (space + 1) * 20 %>px;"></div>
index 77744dae1f58cfcafd2624187daf46ddecd61689..cb583689d6b49450f5aaacb2817213137dc51733 100644 (file)
@@ -6,9 +6,6 @@
      ) do %>
 <table class="list changesets">
 <thead><tr>
-<% if show_revision_graph %>
-  <th></th>
-<% end %>
 <th>#</th>
 <th></th>
 <th></th>
 </tr></thead>
 <tbody>
 <% show_diff = revisions.size > 1 %>
+<%= if show_revision_graph && revisions && revisions.any?
+    indexed_commits, graph_space = index_commits(revisions, @repository.branches) do |scmid|
+                             url_for(
+                               :controller => 'repositories',
+                               :action => 'revision',
+                               :id => project,
+                               :repository_id => @repository.identifier_param,
+                               :rev => scmid)
+                         end
+    render :partial => 'revision_graph',
+         :locals => {
+            :commits => indexed_commits,
+            :space => graph_space
+        }
+end %>
 <% line_num = 1 %>
 <% revisions.each do |changeset| %>
 <tr class="changeset <%= cycle 'odd', 'even' %>">
-<% if show_revision_graph %>
-  <% if line_num == 1 %>
-    <td class="revision_graph" rowspan="<%= revisions.size %>">
-      <%= render :partial => 'revision_graph',
-                 :locals => {
-                    :commits => index_commits(
-                                 revisions,
-                                 @repository.branches) do |scmid|
-                                     url_for(
-                                       :controller => 'repositories',
-                                       :action => 'revision',
-                                       :id => project,
-                                       :repository_id => @repository.identifier_param,
-                                       :rev => scmid)
-                                end
-                    } %>
-    </td>
-  <% end %>
-<% end %>
-<td class="id"><%= link_to_revision(changeset, @repository) %></td>
+<td class="id"<%= show_revision_graph ? " style=\"padding-left:#{(graph_space + 1) * 20}px\"" : '' %>><%= link_to_revision(changeset, @repository) %></td>
 <td class="checkbox"><%= radio_button_tag('rev', changeset.identifier, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < revisions.size) %></td>
 <td class="checkbox"><%= radio_button_tag('rev_to', changeset.identifier, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %></td>
 <td class="committed_on"><%= format_time(changeset.committed_on) %></td>
 <td class="author"><%= h truncate(changeset.author.to_s, :length => 30) %></td>
-<% if show_revision_graph %>
-  <td class="comments_nowrap">
-    <%= textilizable(truncate(truncate_at_line_break(changeset.comments, 0), :length => 90)) %>
-  </td>
-<% else %>
-  <td class="comments"><%= textilizable(truncate_at_line_break(changeset.comments)) %></td>
-<% end %>
+<td class="comments"><%= textilizable(truncate_at_line_break(changeset.comments)) %></td>
 </tr>
 <% line_num += 1 %>
 <% end %>
index 70feb974d74149b7f4f23a0bb33ca73871c94773..bde8f9e78e7a8a4c46121174b10670674c60c123 100644 (file)
@@ -1,29 +1,25 @@
 
-function revisionGraph(holder, commits_hash) {
+function revisionGraph(holder, commits_hash, graph_space) {
 
-    var LEFT_PADDING = 3,
-        TOP_PADDING = 10,
-        XSTEP = 20;
-
-    var YSTEP = $$('tr.changeset')[0].getHeight();
+    var XSTEP = 20,
+        CIRCLE_INROW_OFFSET = 10;
 
     var commits_by_scmid = $H(commits_hash),
         commits = commits_by_scmid.values();
 
-    // init max dimensions
-    var max_rdmid = max_space = 0;
-    commits.each(function(commit) {
+    var max_rdmid = commits.length - 1;
 
-        max_rdmid = Math.max(max_rdmid, commit.rdmid);
-        max_space = Math.max(max_space, commit.space);
-    });
+    var commit_table_rows = $$('table.changesets tr.changeset');
+
+    // init dimensions
+    var graph_offset = $(holder).getLayout().get('top'),
+        graph_width = (graph_space + 1) * XSTEP,
+        graph_height = commit_table_rows[max_rdmid].getLayout().get('top') + commit_table_rows[max_rdmid].getLayout().get('height') - graph_offset;
 
-    var graph_height = max_rdmid * YSTEP + YSTEP,
-        graph_width = max_space * XSTEP + XSTEP;
 
     // init colors
-    var colors = ['#000'];
-    for (var k = 0; k < max_space; k++) {
+    var colors = [];
+    for (var k = 0; k < graph_space + 1; k++) {
         colors.push(Raphael.getColor());
     }
 
@@ -37,8 +33,8 @@ function revisionGraph(holder, commits_hash) {
 
     commits.each(function(commit) {
 
-        y = TOP_PADDING + YSTEP *(max_rdmid - commit.rdmid);
-        x = LEFT_PADDING + XSTEP * commit.space;
+        y = commit_table_rows[max_rdmid - commit.rdmid].getLayout().get('top') - graph_offset + CIRCLE_INROW_OFFSET;
+        x = XSTEP / 2 + XSTEP * commit.space;
 
         graph.circle(x, y, 3).attr({fill: colors[commit.space], stroke: 'none'});
 
@@ -64,8 +60,8 @@ function revisionGraph(holder, commits_hash) {
             parent_commit = commits_by_scmid.get(parent_scmid);
 
             if (parent_commit) {
-                parent_y = TOP_PADDING + YSTEP * (max_rdmid - parent_commit.rdmid);
-                parent_x = LEFT_PADDING + XSTEP * parent_commit.space;
+                parent_y = commit_table_rows[max_rdmid - parent_commit.rdmid].getLayout().get('top') - graph_offset + CIRCLE_INROW_OFFSET;
+                parent_x = XSTEP / 2 + XSTEP * parent_commit.space;
 
                 if (parent_commit.space == commit.space) {
                     // vertical path
index bc04d7ee746114aed62ba25156e60a4dd6408a4b..98407afc4b9172b12f62806d005f1d62c40a2d0d 100644 (file)
@@ -176,7 +176,6 @@ tr.changeset ul, ol { margin-top: 0px; margin-bottom: 0px; }
 tr.changeset td.revision_graph { width: 15%; background-color: #fffffb; }
 tr.changeset td.author { text-align: center; width: 15%; white-space:nowrap;}
 tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;}
-tr.changeset td.comments_nowrap { width: 45%; white-space:nowrap;}
 
 table.files tr.file td { text-align: center; }
 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
index 47213354338a26cef07c455a004baacab51a2b87..f1d795f0bf6daac43e354b3d956410ab9a3583ea 100644 (file)
@@ -4,6 +4,8 @@ table.revision-info td {
     padding: 0px;
 }
 
+div.revision-graph { position: absolute; overflow:hidden; }
+
 div.changeset-changes ul { margin: 0; padding: 0; }
 div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }