なんかわかりにくいなーって感じがしたので、
【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](https://stat.ameba.jp/user_images/20120916/20/taka-vagyok/54/cb/p/t02200134_0800048812191077825.png?caw=800)
日付どおりに並んで、日付がはいっていないものは
バージョンの中の最後尾に配置されるようになりました。
■残課題
・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
まあスキルがついたということにしようと思います・・・。