Redmineでテンプレートごとにチケット作成リンクを表示させる

# はじめに
* redmineで一つのプロジェクトに複数のチケットテンプレートを用意したいことがある
* redmineのチケット作成は`新しいチケット`リンクのみなので、これをテンプレートごとに表示させたい
    * これを
<table><thead><tr><th><img width="544" alt="スクリーンショット 2017-10-12 7.48.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/183449/a874dbc8-022a-695e-f79d-787c5f2c54b8.png" border="">
</th></tr></thead></table>

    * こんなかんじに
<table><thead><tr><th><img width="545" alt="スクリーンショット 2017-10-12 7.49.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/183449/475183ff-930b-3a08-1f10-6c767ad20fa2.png">
</th></tr></thead></table>
* redmineの表示をカスタマイズするプラグインとして、view customize plugin というものがあるのでこれを利用する

# というわけで
以下の順番で説明する。どちらも view customize plugin を使用する。

1. チケット作成リンクを増やす
2. リンクにチケットテンプレートを適用する

# 1. チケット作成リンクを増やす

## Path pattern

```
/projects/{project}/issues
```

## Code 

```js
$(function() {
  var element = $('div.contextual').clone();
  $('div.contextual')
    .html('<a class="icon icon-add new-issue" href="/redmine/projects/{project}/issues/new">新しい△△チケット</a>');
  $('div.contextual').after(element);
  element
    .html('<a class="icon icon-add new-issue" href="/redmine/projects/{project}/issues/new?type=marumaru">新しい○○チケット</a>');  // (1)
});
```


## 補足
(1) 
今回は[Redmine Issue Templates Plugin](https://github.com/akiko-pusu/redmine_issue_templates)というプラグインを使ってチケットテンプレートを作成する。
チケット作成ページでテンプレートを読み込ませるために、チケット作成リンクに`?type=marumaru`というクエリを追加している。

ちなみにチケットテンプレートはチケット作成ページのクエリで作ることもできる。[^1]

[^1]: （例：[[Redmine]ブックマークで新しいチケット用のテンプレートを作成](https://qiita.com/mkzk_develop/items/dbcb39c836301b14e908)） 


# 2. リンクにチケットテンプレートを適用する

## Path pattern

```java
/{project}/issues/new  // (1)
```

## Code

```js
$(function() {
  // クエリをparamsに格納
  var url = location.href;
  params = url.split("?");

  // クエリ指定時のみチケットテンプレートを読み込ませる (2)
  if (params.length != 1) {
    // クエリをarrayに入れる
    spparams = params[1].split("&");
    var paramArray = [];

    for (i = 0; i < spparams.length; i++) {
      vol = spparams[i].split("=");
      paramArray.push(vol[0]);
      paramArray[vol[0]] = vol[1];
    }

    // チケットテンプレート適用 (3)
    if (paramArray["type"] == "marumaru") {
      setTimeout(function() {    // (4)
        eraseSubjectAndDescription();
        $('#issue_template').val(5);   // (5)
        load_url = '/redmine/projects/{project}/issue_templates/load';   // (6)
        should_replaced = 'false';
        confirm_msg = "";
        load_template(load_url, confirm_msg, should_replaced);
      }, 600);
    }
  }
});
```

## 補足
（1）
view customize plugin はクエリをPathに指定することができないため、チケット作成リンクをPathに設定する

（2）
クエリがない場合、直後の`spparams = params[1].split("&");`でエラーになるため先にif文で括っている
ちなみにこの辺のコードは[javascriptでクエリ文字列を取得する](https://qiita.com/ma_me/items/03aaebb5dc440b380244)をほぼコピペしている

（3）
クエリの`type`に指定した値で判定を行う

（4）
`setTimeout`で0.6秒sleepを入れている。
Redmine Issue Templates Plugin はデフォルトテンプレートを設定している場合、ページ読み込み時の一番最後にデフォルトテンプレートをロードする。
そうすると今回読み込みたいテンプレートが上書きされてしまうため、適当に時間を置くようにしている。

（5）
`$('#issue_template').val(5);` はテンプレートのidを入力すること

（6）
`load_template()`はテンプレート読み込みのfunction。

# 参考
[jQueryでsetTimeoutを使ってfunctionの実行を遅らせる方法](http://black-flag.net/jquery/20110405-2878.html)
[View customize pluginを使いこなす](https://www.slideshare.net/onozaty/view-customizeplugin-62005780)
[javascriptでクエリ文字列を取得する - qiita](https://qiita.com/ma_me/items/03aaebb5dc440b380244)