2011年06月17日

Redmineガントチャートに矢印つける

redmine_better_gantt_chart のプラグインがRedmine のバージョン1.2.0に対応されたので取り込んでみました.

ここからダウンロードできます.
https://github.com/kulesa/redmine_better_gantt_chart



このプラグインは,チケット同士がFollows/Precedes(日本語では"後続する"/"先行する"で結構分かりづらい言葉. の関係になっているときにガントチャート上でその関係を矢印で結んで視覚的に分かりやすくしてくれます.

この関連するチケットに当てはめるFollows/Precedesに対する日本語"後続する"/"先行する"は,分かりづらいのだけど,ガントチャート上でその役割をチケット名にして表示してみると結構分かりやすいです.



↓こんな感じ.
better_ganttchart.JPG



redmine1.2.0にアップデートした直後に一度いれてみたのですが,ガントチャート上の出力はうまくいきましたが,PDFの出力がエラーになってできなくなってしまったので一度プラグインを外していたのでした.

今回,1.2.0stableに対応との記述があったので早速入れてみたところ,無事PDF出力も出来ました.
ただ,以前自分が書き換えた「ガントチャートに日付を表示する」及び「ガントチャートのPDF出力に日付を表示する+縦線入れる」ができなくなってしまったので,プラグインのファイルを編集しました.



今回はそのdiff及び修正ファイルを載せます.
修正ファイルは最後に添付しています.
あと,HTML解釈防止のために,"<"は全角で書いているのでコピペする場合は気をつけてください.まぁ自己責任で.



■redmine_better_gantt_chart/lib/redmine/helpers/better_gantt.rb

--- better_gantt.rb 2011-06-17 19:20:25.558317100 +0900
+++ redmine_better_gantt_chart/lib/redmine/helpers/better_gantt.rb 2011-06-17 19:17:47.263106600 +0900
@@ -1,3 +1,4 @@
+# -*- coding: cp932 -*-
# Redmine - project management software
# Copyright (C) 2006-2011 Jean-Philippe Lang
#
@@ -255,9 +256,36 @@
case options[:format]
when :pdf
options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top])
+ vertical_line_pdf(options)
end
end

+ # --------------------------vertical line.start
+ def vertical_line_pdf(options)
+ left = options[:subject_width]
+ day = 0
+ options[:pdf].SetFontStyle('B',7)
+ width = options[:zoom]
+ options[:pdf].SetDrawColor(200,200,200)
+ (self.date_to - self.date_from).to_i.times do
+ leftwidth = (left + width ).to_i
+ options[:pdf].SetY(options[:top_start].to_i)
+ options[:pdf].SetX(left)
+ options[:pdf].RDMCell(width, options[:top].to_i - options[:top_start].to_i, "", "R", 0, "C")
+ if Time.now.beginning_of_day == self.date_from.since(day.days)
+ options[:pdf].SetDrawColor(255, 0, 0)
+ options[:pdf].Line( leftwidth, options[:top_start].to_i, leftwidth, options[:top])
+ options[:pdf].SetDrawColor(200,200,200)
+ else
+ options[:pdf].Line( leftwidth, options[:top_start].to_i, leftwidth, options[:top])
+ end
+ left = left + width
+ day = day + 1
+ end
+ options[:pdf].SetDrawColor(0, 0, 0)
+ end
+ # --------------------------vertical line.end
+
def subject_for_project(project, options)
case options[:format]
when :html
@@ -540,13 +568,16 @@
headers_height = header_height
show_weeks = false
show_days = false
+ show_day_num = false # <= 追加

if self.months < 7
show_weeks = true
headers_height = 2*header_height
if self.months < 3
show_days = true
- headers_height = 3*header_height
+ show_day_num = true
+ #headers_height = 3*header_height
+ headers_height = 4*header_height
end
end

@@ -606,6 +637,14 @@
width = zoom
pdf.SetY(y_start + 2 * header_height)
pdf.SetX(left)
+ case(wday)
+ when 6
+ pdf.SetTextColor(0, 0, 255)
+ when 7
+ pdf.SetTextColor(255, 0, 0)
+ else
+ pdf.SetTextColor(0, 0, 0)
+ end
pdf.RDMCell(width, height, day_name(wday).first, "LTR", 0, "C")
left = left + width
wday = wday + 1
@@ -613,12 +652,49 @@
end
end

+
+ # Day num headers
+ if show_day_num # num
+ left = subject_width
+ height = header_height
+ wday = self.date_from.cwday
+ day_num = self.date_from
+ pdf.SetFontStyle('B',7)
+ (self.date_to - self.date_from + 1).to_i.times do
+ width = zoom
+ pdf.SetY(y_start + 3 * header_height)
+ pdf.SetX(left)
+ case(wday)
+ when 6
+ pdf.SetTextColor(0, 0, 255)
+ when 7
+ pdf.SetTextColor(255, 0, 0)
+ else
+ pdf.SetTextColor(0, 0, 0)
+ end
+ pdf.RDMCell(width, height, day_num.day.to_s, "LTR", 0, "C")
+ left = left + width
+ day_num = day_num + 1
+ wday = wday + 1
+ wday = 1 if wday > 7
+ end
+ end
+
pdf.SetY(y_start)
pdf.SetX(15)
+ case(wday)
+ when 6
+ pdf.SetTextColor(0, 0, 255)
+ when 7
+ pdf.SetTextColor(255, 0, 0)
+ else
+ pdf.SetTextColor(0, 0, 0)
+ end
pdf.RDMCell(subject_width+g_width-15, headers_height, "", 1)

# Tasks
top = headers_height + y_start
+ pdf.SetTextColor(0, 0, 0)
options = {
:top => top,
:zoom => zoom,
@@ -628,6 +704,7 @@
:indent_increment => 5,
:top_increment => 5,
:format => :pdf,
+ :top_start => top,
:pdf => pdf
}
render(options)
@@ -715,8 +792,10 @@
def pdf_new_page?(options)
if options[:top] > 180
options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top])
+ vertical_line_pdf(options)
options[:pdf].AddPage("L")
- options[:top] = 15
+ #options[:top] = 15
+ options[:top] = options[:top_start] = 15
options[:pdf].Line(15, options[:top] - 0.1, PDF::TotalWidth, options[:top] - 0.1)
end
end






■redmine_better_gantt_chart/app/views/gantts/show.html.erb

--- show.html.erb 2011-06-17 18:33:10.118071800 +0900
+++ redmine_better_gantt_chart/app/views/gantts/show.html.erb 2011-06-17 17:37:30.763415800 +0900
@@ -40,6 +40,9 @@
headers_height = header_heigth
show_weeks = false
show_days = false
+# add show day
+show_day_num = false # <= ここ
+

if @gantt.zoom >1
show_weeks = true
@@ -48,6 +51,10 @@
show_days = true
headers_height = 3*header_heigth
end
+ if @gantt.zoom > 3 # <= ここの条件を丸々追加
+ show_day_num = true
+ headers_height = 4*header_heigth
+ end
end

# Width of the entire chart
@@ -133,6 +140,31 @@
end
end %>

+<%
+#add show day
+#
+# Days headers Num
+#
+if show_day_num
+ left = 0
+ height = g_height + header_heigth*2 - 1
+ wday = @gantt.date_from.cwday
+ day_num = @gantt.date_from
+ (@gantt.date_to - @gantt.date_from + 1).to_i.times do
+ width = zoom - 1
+%>
+ <div style="left:<%= left %>px;top:37px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %><%= "color:blue;" if wday == 6 %><%= "color:red;" if wday == 7 %>" class="gantt_hdr">
+ <%= day_num.day %>
+ </div>
+<%
+ left = left + width+1
+ day_num = day_num + 1
+ wday = wday + 1
+ wday = 1 if wday > 7
+ end
+end %>
+
+
<%
#
# Days headers
@@ -140,12 +172,13 @@
if show_days
left = 0
height = g_height + header_heigth - 1
+ top = (show_day_num ? 55 : 37) # <= ここ
wday = @gantt.date_from.cwday
(@gantt.date_to - @gantt.date_from + 1).to_i.times do
width = zoom - 1
%>
- <div style="left:<%= left %>px;top:37px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %>" class="gantt_hdr">
- <%= day_name(wday).first %>
+ <div style="left:%= left %>px;top:<%= top %>px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %><%= "color:blue;" if wday == 6 %><%= "color:red;" if wday == 7 %>" class="gantt_hdr">
+ <%= day_name(wday).first %>
</div>
<%
left = left + width+1





■修正ファイルはこちら.

・better_gantt.rb.diff

・show.html.erb.diff

・show.html.erb

・better_gantt.rb

posted by maplewine at 20:03| Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック