自習室

こもります

Redmine(ver.2.4.2, Rails ver3.2.16) のガントチャートに日付を表示する

前置き

動機

ガントチャートで (+拡大) を押していくと、チャートがズームされていって、曜日が見えるようになるのだけど、標準では日付は表示されません。

チケットの登録時の「開始日」や「期日」には日付で入力するので、ガントチャートを見ながら自分の仕事量を考えて仕事を割り振っていこうと思うと、ガントチャート上で日付を確認したくなります。

と言うわけで、ガントチャート上で日付を表示したいです。

f:id:AMANE:20140126185856p:plain

before

f:id:AMANE:20140126190157p:plain

after

読まれる方への注意

Ruby on Railsはまるっきり勉強をしたことが無いので、手探りです。間違いがあったらごめんなさい。なんとなくModel View Controllerという考え方があって、RailsのViewの部分のテンプレートを書き換えれば、自分の望むデータを表示できるのだろうな、というぐらいの認識でやっています。

環境

手順

参考にさせていただいたサイト様

基本的にはこちらの通り

【Redmine 1.1.2】ガントチャートに日付を表示させる|渋谷ではたらくマー君の技術とかブログ。

そもそもRailsを全然分かっていないので、最低限のことはこちらで

テンプレート(ビュー)とヘルパーメソッド - Ruby on Rails入門

念のためバックアップは取る

cd views/gantts
cp show.html.erb _show.html.erb

views/gantts/show.html.erb を書き換える

90行目あたりに、ズーム率を上げるとヘッダの行数を増やす記述を追加

<%
  zoom = 1
  @gantt.zoom.times { zoom = zoom * 2 }

  subject_width = 330
  header_height = 18

  headers_height = header_height
  show_weeks = false
  show_days  = false
+ show_day_num = false

  if @gantt.zoom > 1
    show_weeks = true
    headers_height = 2 * header_height
    if @gantt.zoom > 2
        show_days = true
        headers_height = 3 * header_height
+    if @gantt.zoom > 3
+      show_day_num = true
+      headers_height = 4 * header_height
+    end
    end
  end

230行目あたりに、日付のHTMLを生成する記述を追加する。ついでに週末に色を着ける

# <% ###### Weeks headers ###### %>
# <% if show_weeks %>
# 中略
# <% end %> ブロックのあと
+ <% ###### Days Headers Num ###### %>
+ <% if show_day_num %>
+  <%
+     left = 0
+     height = g_height + header_height - 1
+     wday = @gantt.date_from.cwday
+     day_num = @gantt.date_from
+     width = zoom - 1
+  %>
+   <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %>
+     <%
+       style  = ""
+       style += "left: #{left}px;"
+       style += "top: 37px;"
+       style += "width: #{width}px;"
+       style += "height: #{height}px;"
+       style += "font-size:0.7em;"
+       clss = "gantt_hdr"
+       clss << " nwday" if @gantt.non_working_week_days.include?(wday)
+     %>
+     <% if wday == 6 %><% style += "color:blue;" %><% end %>
+     <% if wday == 7 %><% style += "color:red;" %><% end %>
+     <%= content_tag(:div, :style => style, :class => clss) do %>
+       <%= day_num.day %>
+     <% end %>
+     <%
+       left = left + width + 1
+       day_num = day_num + 1
+       wday = wday + 1
+       wday = 1 if wday > 7
+     %>
+   <% end %>
+ <% end %>

<% ###### Days headers ####### %>
<% if show_days %>
# 以下略

235行目あたり、日付の行が足された分曜日の行をずらす。週末の色付けもする

<% ###### Days headers ####### %>
<% if show_days %>
  <%
    left = 0
    height = g_height + header_height - 1
    wday = @gantt.date_from.cwday
+    top = (show_day_num ? 55 : 37)
  %>
  <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %>
    <%
      width =  zoom - 1
      style  = ""
      style += "left: #{left}px;"
+     style += "top: #{top}px;"
      style += "width: #{width}px;"
      style += "height: #{height}px;"
      style += "font-size:0.7em;"
      clss = "gantt_hdr"
      clss << " nwday" if @gantt.non_working_week_days.include?(wday)
    %>
    <% if wday == 6 %><% style += "color:blue;" %><% end %>
    <% if wday == 7 %><% style += "color:red;" %><% end %>
    <%= content_tag(:div, :style => style, :class => clss) do %>
      <%= day_letter(wday) %>
    <% end %>

これらを書き換えた後、Redmineを再起動すると、更新が反映されます。以上です。