2011年06月01日

ガントチャート日付表示 on Redmine-1.2.0

5月30日にRedmineのバージョンが1.2.0になりました.

(※一番最後に,少し修正したものを置きました!2011.06.06)

ガントチャートの絞り込み機能にどうもバグが有る気がして,4月中旬にその時期の最新版のレポジトリからダウンロードしてきたredmineを使用していましたが,1.1.3とも若干異なる部分もあるし,早く次のバージョンに環境を合わせて置きたかったので待望の更新です.

多くのプラグインはRedmineのバージョンに合わせているのでレポジトリから引っ張ってきたものがどこまで適用できるか悩んでしまう時もあり,そういう意味で更新したかったのです.

まず,日本語の文字化けがなくなったのは大きい.
そして,ガントチャートの表示が以前は親子関係にずれがあったのですがそれもなくなりました.
さらには当日でクローズしたチケットもきちんと緑色で表示されるようになりました.

ということでさっそく,ガントチャートに日付が出るようにしました.

参考:以前自分が行った修正.
ただし,これはHTMLの解釈の問題なのか,貼りつけ方が失敗したのかちょっと構文が崩れてしまっていたので参考にされた方がいましたら,うまく動かせなくて不快な思いをさせたかもしれません.ごめんなさい.

Redmineガントチャートの日付表示再び



■修正ファイル

・gantts_controller.rb


・show.html.erb
修正ソースコードはこちら
show.html.erb

・gantt.rb

修正ソースコードはこちら.
gantt.rb


以下,詳細な変更部分.

今回も"'{<>}'" のコメントがあるとそこだけHTML解釈されてブログ表示結果がおかしくなってしまうのでどうしても修正内容知りたい方はファイルをダウンロードして該当位置を見てください.回避方法知っている方はおしえてくださーい!
(追記.<"div>, <"/div>のようにダブルコーテーションマークをdivや/div, em, /emの前に挿入して解釈されるのを防ぎました.コピペするときはこの"マークを消してください.)


- /app/controllers/gantts_controller.rb

# add date for output.
# これはプロジェクトの名前を出力するだけです.

#basename = (@project ? "#{@project.identifier}-" : '') + 'gantt'
basename = Time.now.strftime("%Y%m%d-") + (@project ? "#{@project.identifier}-" : '') + 'gantt'





- /app/views/gantts/show.html.erb



--- redmine-1.2.0/app/views/gantts/show.html.erb 2011-05-30 18:47:22.000000000 +0900
+++ app/views/gantts/show.html.erb 2011-05-31 20:47:30.118416800 +0900
@@ -38,6 +38,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
@@ -46,6 +49,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
@@ -131,6 +138,33 @@
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
@@ -138,11 +172,12 @@
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
%>
- <"em><"div style="left:<%= left %>px;top:37px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday ><"/em> 5 %>" class="gantt_hdr">
+ <"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>
<%







- lib/redmine/helpers/gantt.rb



--- redmine-1.2.0/lib/redmine/helpers/gantt.rb 2011-05-30 18:47:30.000000000 +0900
+++ lib/redmine/helpers/gantt.rb 2011-06-01 11:51:13.940114300 +0900
@@ -1,3 +1,4 @@
+# -*- coding: cp932 -*-
# Redmine - project management software
# Copyright (C) 2006-2011 Jean-Philippe Lang
#
@@ -410,6 +411,8 @@
imgl.new_image(subject_width+g_width+1, height)
gc = Magick::Draw.new

+ gc.font = "c:\WINDOWS\Fonts\VL-Gothic-Regular.ttf"
+ gc.pointsize = 12
# Subjects
gc.stroke('transparent')
subjects(:image => gc, :top => (headers_height + 20), :indent => 4, :format => :image)
@@ -524,13 +527,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

@@ -595,6 +601,26 @@
wday = wday + 1
wday = 1 if wday > 7
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)
+ 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)






(※2011/6/6 追記)
あの後,縦線をPDFのガントチャートに引くという素晴らしいことをしていたサイトをみつけました.1.2.0では修正の必要があったので修正したものを載せます.こちらのほうが,土日の日には色がついたりの親切設計です:)

ご利用は自己責任で!

数日前に変更したばかりですが,PDFのガントチャートに縦線を入れる方法があったのでそれについてメモ.

参考:
"Redmine の ガントチャートの PDF 出力に縦線を出してみた - 玩具箱" - http://d.hatena.ne.jp/gangubako/20110407/1302168692

修正ファイル:redmine_path/lib/redmine/helpers/gantt.rb


■差分ファイル
gantt.rb_1.2.0.diff


■修正したファイル
gantt.rb


以下,修正内容.



--- c:/tmp/redmine/redmine-1.2.0/lib/redmine/helpers/gantt.rb 2011-05-30 18:47:30.000000000 +0900
+++ gantt.rb 2011-06-03 13:08:33.948718000 +0900
@@ -1,3 +1,4 @@
+# -*- coding: cp932 -*-
# Redmine - project management software
# Copyright (C) 2006-2011 Jean-Philippe Lang
#
@@ -254,9 +255,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
@@ -410,6 +438,9 @@
imgl.new_image(subject_width+g_width+1, height)
gc = Magick::Draw.new

+ #gc.font = "c:\\WINDOWS\Fonts\VL-Gothic-Regular.ttf"
+ gc.font = "C:\\WINDWS\\FONTS\\MSGOTHIC.TTC" #和文フォントの指定
+ gc.pointsize = 12
# Subjects
gc.stroke('transparent')
subjects(:image => gc, :top => (headers_height + 20), :indent => 4, :format => :image)
@@ -524,13 +555,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

@@ -590,6 +624,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
@@ -597,12 +639,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,
@@ -612,6 +691,7 @@
:indent_increment => 5,
:top_increment => 5,
:format => :pdf,
+ :top_start => top,
:pdf => pdf
}
render(options)
@@ -699,8 +779,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
posted by maplewine at 20:24| Comment(5) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
日付表示のパッチを使わせていただいています。

縦線表示も反映しているのですが、2ヶ月表示にすると縦線が2重に表示されてしまうのですが、どこか反映漏れがあるのでしょうか?
Posted by あらしくん at 2011年09月14日 13:28
ご質問ありがとうございます.
そうなんです,縦線入ってしまうのです..
原因が絞りきれておらず,後回しにしたままです...すみません.
Posted by 管理人 at 2011年09月14日 17:59
そうなんですね…
私もがんばって追っかけてみたのですがいまいちわからず、パッチの反映ミスかと思ってましたので。
とりあえず同じようになるとのことで、安心?しました。
Posted by あらしくん at 2011年09月15日 17:59
>あらしくん さん

対応しました.以下のページを御覧ください.

http://in.shappi.org/?1318589457
Posted by 管理人 at 2011年10月14日 19:53
不等号の記号は
&lt;
&gt;
ですよ。全部半角で。
Posted by お礼 at 2012年04月26日 15:25
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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