Redmine 2.0.3のガントチャート(Gantt Chart)の並び方を変更してみた | Ujsag.Takashi.Lap

Ujsag.Takashi.Lap

身の回りのことやらメモをつれずれと。

Redmine 2.0.3のガントチャートは、チケットIDで並べかえが行われてしまっていて、
なんかわかりにくいなーって感じがしたので、
【Redmine 1.1.2】ガントチャートを開始日順にソートする を参考に次のポリシーで作ってみました。

・両方に開始日がある → 日付順に並べ替える
・片方に開始日がある → 日付がないほうが下に行く
・両方に開始日がない → チケット番号順


■修正方法
Redmineのインストールディレクトリから、gantt.rbというファイルを編集する
(lib/redmine/helpers/gantt.rb)

+が追加した処理。

def gantt_issue_compare(x, y, issues)
+ if x.start_date.nil?() or y.start_date.nil?()
+ count = 1 + project_issues(project).size
+ count += project_versions(project).size
+ if x.start_date.nil?() and not y.start_date.nil?()
+ count <=> y.root_id
+ elsif not x.start_date.nil?() and y.start_date.nil?()
+ x.root_id <=> count
+ else
if x.root_id == y.root_id
x.lft <=> y.lft
else
x.root_id <=> y.root_id
end
+ end
+ else
+ if x.start_date == y.start_date
+ x.lft <=> y.lft
+ else
+ x.start_date <=> y.start_date
+ end
+ end
end
片方に日付がない場合にはは最後尾に持ってきたいので、
プロジェクトに存在するチケット+バージョンの数+1と比較して、
入れ替えるようにしました。
(issueの数だけだと、バージョンの項目が入ると動作しなくなった)


入れた結果がこんな感じ。
Ujsag.Takashi.Lap
日付どおりに並んで、日付がはいっていないものは
バージョンの中の最後尾に配置されるようになりました。


■残課題
・issue.count まわりoverflow対策


まだ課題も残っていますが、とりあえずということで。
他の人の参考になれば幸いです。


#後はBetter Gantt Chartのように関係線の矢印がでればいい感じ・・・。
#こっそりと、日付+土日に色づけもしてあります。


と思ったら・・・Redminのソート問題で解決されていました。
def gantt_issue_compare(x, y, issues)
+ [(x.root.start_date or x.start_date or Date.new()), (x.start_date or Date.new()), x.root_id, x.lft] <=> [(y.root.start_date or y.start_date or Date.new()), (y.start_date or Date.new()), y.root_id, y.lft]
#if x.root_id == y.root_id # x.lft <=> y.lft
#else # #x.root_id <=> y.root_id
#end
end

(一番最後に表示ではないけど、こっちのほうがエレガント・・・)



エレファントな一日を過ごしてしまった・・・orz
まあスキルがついたということにしようと思います・・・。