Adding a widget that shows issue assignment flow
This commit is contained in:
parent
164b0320b5
commit
b2c84f3b9f
|
@ -10,6 +10,26 @@ class GraphsController < ApplicationController
|
||||||
|
|
||||||
helper IssuesHelper
|
helper IssuesHelper
|
||||||
|
|
||||||
|
def recent_assigned_to_changes_graph
|
||||||
|
# Get the top visible projects by issue count
|
||||||
|
sql = " select u1.id as old_user, u2.id as new_user, count(*) as changes_count"
|
||||||
|
sql << " from journals as j"
|
||||||
|
sql << " left join journal_details as jd on j.id = jd.journal_id"
|
||||||
|
sql << " left join users as u1 on jd.old_value = u1.id"
|
||||||
|
sql << " left join users as u2 on jd.value = u2.id"
|
||||||
|
sql << " where journalized_type = 'issue' and prop_key = 'assigned_to_id' and DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) <= j.created_on"
|
||||||
|
sql << " and (u1.id = #{User.current.id} or u2.id = #{User.current.id})"
|
||||||
|
sql << " and u1.id <> 0 and u2.id <> 0"
|
||||||
|
sql << " group by old_value, value"
|
||||||
|
@assigned_to_changes = ActiveRecord::Base.connection.select_all(sql)
|
||||||
|
user_ids = @assigned_to_changes.collect { |change| [change["old_user"].to_i, change["new_user"].to_i] }.flatten.uniq
|
||||||
|
user_ids.delete(User.current.id)
|
||||||
|
@users = User.find(:all, :conditions => "id IN ("+user_ids.join(',')+")").index_by { |user| user.id } unless user_ids.empty?
|
||||||
|
|
||||||
|
headers["Content-Type"] = "image/svg+xml"
|
||||||
|
render :layout => false
|
||||||
|
end
|
||||||
|
|
||||||
def recent_status_changes_graph
|
def recent_status_changes_graph
|
||||||
# Get the top visible projects by issue count
|
# Get the top visible projects by issue count
|
||||||
sql = " select is1.id as old_status, is2.id as new_status, count(*) as changes_count"
|
sql = " select is1.id as old_status, is2.id as new_status, count(*) as changes_count"
|
||||||
|
|
56
app/views/graphs/recent_assigned_to_changes_graph.html.erb
Normal file
56
app/views/graphs/recent_assigned_to_changes_graph.html.erb
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||||
|
|
||||||
|
<%
|
||||||
|
points = Hash.new
|
||||||
|
points[User.current.id] = { "x" => 140, "y" => 140 }
|
||||||
|
i = -1
|
||||||
|
@users.each do |user_id, user|
|
||||||
|
points[user_id] = {
|
||||||
|
"x" => Math.sin(2*Math::PI*i/@users.size)*100 + 140,
|
||||||
|
"y" => Math.cos(2*Math::PI*i/@users.size)*100 + 140
|
||||||
|
}
|
||||||
|
i -= 1
|
||||||
|
end unless @users.nil?
|
||||||
|
%>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="280" height="280">
|
||||||
|
<g fill-opacity="0.2" stroke-opacity="0.5">
|
||||||
|
<% @assigned_to_changes.each do |assigned_to_change| %>
|
||||||
|
<%
|
||||||
|
changes_count = [assigned_to_change["changes_count"].to_i*3,35].min
|
||||||
|
old_user = assigned_to_change["old_user"].to_i
|
||||||
|
new_user = assigned_to_change["new_user"].to_i
|
||||||
|
|
||||||
|
x1 = points[old_user]["x"]
|
||||||
|
y1 = points[old_user]["y"]
|
||||||
|
|
||||||
|
x2 = points[new_user]["x"]
|
||||||
|
y2 = points[new_user]["y"]
|
||||||
|
|
||||||
|
atan2 = -Math.atan2(y1-y2,x1-x2)
|
||||||
|
xdiff = Math.sin(atan2)*changes_count
|
||||||
|
ydiff = Math.cos(atan2)*changes_count
|
||||||
|
%>
|
||||||
|
<polygon
|
||||||
|
points="
|
||||||
|
<%= x1-xdiff %>,<%= y1-ydiff %>
|
||||||
|
<%= x1+xdiff %>,<%= y1+ydiff %>
|
||||||
|
<%= x2+xdiff/5 %>,<%= y2+ydiff/5 %>
|
||||||
|
<%= x2-xdiff/5 %>,<%= y2-ydiff/5 %>"
|
||||||
|
fill="<%= assigned_to_change["old_user"].to_i == User.current.id ? "green" : "red" %>"
|
||||||
|
stroke="<%= assigned_to_change["old_user"].to_i == User.current.id ? "green" : "red" %>"
|
||||||
|
/>
|
||||||
|
<% end %>
|
||||||
|
</g>
|
||||||
|
<g fill="#EEEEEE" stroke="black" stroke-width="1" stroke-opacity="0.75">
|
||||||
|
<% points.each do |user_id, point| %>
|
||||||
|
<circle cx="<%= point["x"] %>" cy="<%= point["y"] %>" r="35" />
|
||||||
|
<% end %>
|
||||||
|
</g>
|
||||||
|
<g font-family="Helvetica, Arial" font-size="12" text-anchor="middle">
|
||||||
|
<% points.each do |user_id, point| %>
|
||||||
|
<text x="<%= point["x"] %>" y="<%= point["y"] + 3 %>"><%= user_id == User.current.id ? User.current : @users[user_id] %></text>
|
||||||
|
<% end %>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,5 @@
|
||||||
|
<h3><%= l(:label_graphs_issue_status_flow) %></h3>
|
||||||
|
|
||||||
|
<div style="text-align: center">
|
||||||
|
<%= tag("embed", :width => "280", :height => 280, :type => "image/svg+xml", :src => url_for(:controller => 'graphs', :action => 'recent_assigned_to_changes_graph')) %>
|
||||||
|
</div>
|
Loading…
Reference in New Issue
Block a user