Redmineのプロジェクトメニューを改造して「トラッカーを指定して『新しいチケット』ページを開く」メニューアイテムを追加する

# 現状

プロジェクトメニューは下記画像のように Overview (概要) や Activity (活動) などのこと。

![Redmine のプロジェクトメニュー](https://qiita-image-store.s3.amazonaws.com/0/38075/8da16b3b-450f-103c-1380-9f278af769ab.png)

通常は「新しいチケット」 (New issue) のページを開いて、そこで目的のトラッカーを選択することになる。

# 調査

トラッカーを指定して「新しいチケット」のページを開く方法 (URL) は、下記リンク先を参考にした。

"URL to new issue with a specific tracker??"
https://www.redmine.org/boards/2/topics/14264

ただし Redmine 3.1.2 では下記

```
http://www.mysite.org/projects/{project}/issues/new?tracker_id={trackerid}
```

ではダメで、下記

```
http://www.mysite.org/projects/{project}/issues/new?issue[tracker_id]={trackerid}
```

とする必要があった。

# 改造の内容

プロジェクトメニューは下記で作成される。

* http://www.redmine.org/projects/redmine/repository/entry/tags/3.1.2/app/views/layouts/base.html.erb#L49
* http://www.redmine.org/projects/redmine/repository/entry/tags/3.1.2/lib/redmine/menu_manager.rb
* http://www.redmine.org/projects/redmine/repository/entry/tags/3.1.2/lib/redmine.rb#L224

メニューアイテムを追加する。お作法に従っているのか自信がない。

https://gist.github.com/ayweak/ebbecc2a4d047743fd57#file-redmine-rb-diff

```diff
--- a/redmine-3.1.2/lib/redmine.rb	2015-11-14 18:03:27.000000000 +0900
+++ b/redmine-3.1.2/lib/redmine.rb	2016-01-16 01:32:21.541000000 +0900
@@ -230,7 +230,19 @@
   menu.push :new_issue, { :controller => 'issues', :action => 'new', :copy_from => nil }, :param => :project_id, :caption => :label_issue_new,
               :html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) },
               :if => Proc.new { |p| p.trackers.any? },
-              :permission => :add_issues
+              :permission => :add_issues,
+              :children => Proc.new { |p|
+                p.trackers.map do |t|
+                  Redmine::MenuManager::MenuItem.new(
+                    :new_issue_with_specific_tracker,
+                    {
+                      :controller => 'issues', :action => 'new', :project_id => p,
+                      :copy_from => nil, :issue => { :tracker_id => t.id }
+                    },
+                    :caption => t.name
+                  )
+                end
+              }
   menu.push :gantt, { :controller => 'gantts', :action => 'show' }, :param => :project_id, :caption => :label_gantt
   menu.push :calendar, { :controller => 'calendars', :action => 'show' }, :param => :project_id, :caption => :label_calendar
   menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
```

見た目を整えるために CSS を修正する。マウスオーバーで表示するようにする。CSS はよく分かっていなくておかしな書き方かもしれない。

https://gist.github.com/ayweak/ebbecc2a4d047743fd57#file-application-css-diff

```diff
--- a/redmine-3.1.2/public/stylesheets/application.css	2015-11-14 18:03:29.000000000 +0900
+++ b/redmine-3.1.2/public/stylesheets/application.css	2016-01-16 01:32:37.221000000 +0900
@@ -39,6 +39,7 @@
   margin: 0px 2px 0px 0px;
   padding: 0px 0px 0px 0px;
   white-space:nowrap;
+  position: relative;
 }
 #main-menu li a {
   display: block;
@@ -51,6 +52,15 @@
 #main-menu li a:hover {background:#759FCF; color:#fff;}
 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
 
+#main-menu ul.menu-children {
+  position: absolute;
+  background-color: #628DB6; /* equals #header bg color */
+  min-width: 100%;
+  display: none;
+}
+#main-menu ul.menu-children li {float: none; margin: 0px;}
+#main-menu li a:hover + ul.menu-children, #main-menu ul.menu-children:hover {display: block; z-index: 1;}
+
 #admin-menu ul {margin: 0;  padding: 0;}
 #admin-menu li {margin: 0;  padding: 0 0 6px 0; list-style-type:none;}
 
```

# 改造後の見た目

下記は追加した後のスクリーンショット。

![「トラッカーを指定して『新しいチケット』ページを開く」メニューアイテムを追加](https://qiita-image-store.s3.amazonaws.com/0/38075/0330a0c6-0be7-fa35-b73b-5402c861a889.png)

下記スクリーンショットのように、名称の長いトラッカーでも幅が広がって表示できている。

![名称の長いトラッカーがある場合](https://qiita-image-store.s3.amazonaws.com/0/38075/4a7202a0-457a-e9c1-ef2a-9e19a7037dbf.png)