プロジェクト切り替え時にウォッチャーを変更する(Redmine View Customize Plugin)

スポンサーリンク

プロジェクト切り替え時にウォッチャーを変えたいのだけどうまくいかないといった問い合わせもらったので、サンプルコード書いてみました。

入力フォーム差し替えと絡んでハマりそうな箇所なので、他の方の参考にもなればと思います。

入力フォームの差し替え

プロジェクトやステータス、トラッカーを切り替えた際には、入力フォーム自体が差し替えられます。サーバ側を呼び出して、受け取ったHTMLの断片で差し替えるようなイメージです。

チケットの題名や説明、カスタムフィールドなどは、空の入力フォームを作った後に、もともと設定されていた情報に移し替えています。
ただ、ウォッチャーのところは、チェックの付与情報自体が付いたHTMLがサーバ側からかえってきて、それをそのまま差し替えるだけです。(サーバ呼び出しの際にフォームの情報も送っている)
そのため、サーバの呼び出しが行われた後に画面側の情報を変えてもそれが反映されません。

ということで、サーバ側呼び出しの前に画面側を変えてあげる必要がありますが、そうなるとイベントのキャプチャフェーズで拾ってあげる必要があります。jQueryではキャプチャフェーズを指定できないので、addEventListenerで指定する形となります。

設定内容

  • Path pattern: .*
  • Insertion position: Bottom of issue form
/*
Path pattern: .*
Insertion position: Bottom of issue form(チケット入力欄の下)
Type: JavaScript

プロジェクトを変更したら、ウォッチャーを変更する
*/
$(function() {

  var changeWatcher = function() {
    switch($('#issue_project_id').val()) {
      case '1':
        $('#issue_watcher_user_ids_1 input').prop('checked', true);
        break;

      case '2':
        $('#issue_watcher_user_ids_8 input').prop('checked', true);
        break;

      case '3':
        $('#issue_watcher_user_ids_9 input').prop('checked', true);
        break;
    }
  };

  document.getElementById('all_attributes').addEventListener(
    'change',
    function(e) {
      if (e.srcElement.id == 'issue_project_id') {
        // プロジェクト変更時のみ
        changeWatcher();
      }
    },
    true); // キャプチャフェーズ
})