– go to postプロジェクト管理にRedmineを導入してみました。状況を報告する為にガントチャートをPDF出力してみたのですが、時間の単位が日付ではなく週で表示されるのでちょっと不評でした。。。
自分としてはそんなもんかなぁと気にならなかったのですが、同僚がRedmineのガントチャートに日付の表示を追加を見つけてきてくれたので、ブラウザでの閲覧時には日付を表示出来るように対応してみました。
やったことは参照先のまんまなんではしょりますが、ブラウザで日付で見れるとなると今度はPDFには反映されないの?ってことになります。
PDFの生成をどこでやっているのかわからないので、ムリです。って答えていたのですが色々調べているウチに/lib/redmine/export/pdf.rbでPDFを生成していそうって事がわかったので実験してみたところ日付が出るようになりました。
rubyがちゃんとわかっているわけではないので、ブラウザに対応した時の対応の真似事をしただけなのですが備忘録として書いておきます。(#addが追加した部分です。)
300行あたり
if gantt.months < 7
show_weeks = true
headers_heigth = 2*header_heigth
if gantt.months < 3
show_days = true
# headers_heigth = 3*header_heigth
headers_heigth = 4*header_heigth #add
end
end
g_width = 210
zoom = (g_width) / (gantt.date_to - gantt.date_from + 1)
g_height = 120
t_height = g_height + headers_heigth
y_start = pdf.GetY
# Months headers
month_f = gantt.date_from
left = subject_width
height = header_heigth
gantt.months.times do
width = ((month_f >> 1) - month_f) * zoom
pdf.SetY(y_start)
pdf.SetX(left)
pdf.Cell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C")
left = left + width
month_f = month_f >> 1
end
# Weeks headers
if show_weeks
left = subject_width
height = header_heigth
if gantt.date_from.cwday == 1
# gantt.date_from is monday
week_f = gantt.date_from
else
# find next monday after gantt.date_from
week_f = gantt.date_from + (7 - gantt.date_from.cwday + 1)
width = (7 - gantt.date_from.cwday + 1) * zoom-1
pdf.SetY(y_start + header_heigth)
pdf.SetX(left)
pdf.Cell(width + 1, height, "", "LTR")
left = left + width+1
end
while week_f <= gantt.date_to
width = (week_f + 6 <= gantt.date_to) ? 7 * zoom : (gantt.date_to - week_f + 1) * zoom
pdf.SetY(y_start + header_heigth)
pdf.SetX(left)
pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C")
left = left + width
week_f = week_f+7
end
end
# Days headers
if show_days
left = subject_width
height = header_heigth
wday = gantt.date_from.cwday
day_num = gantt.date_from #add
pdf.SetFontStyle('B',7)
(gantt.date_to - gantt.date_from + 1).to_i.times do
width = zoom
pdf.SetY(y_start + 2 * header_heigth)
pdf.SetX(left)
pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C")
# add ここから
pdf.SetY(y_start + 3 * header_heigth)
pdf.SetX(left)
pdf.Cell(width, height, day_num.day.to_s, "LTR", 0, "C")
day_num = day_num + 1
# ここまで
left = left + width
wday = wday + 1
wday = 1 if wday > 7
end
end