Redmine: 子チケットの一覧にボタンを追加して、REST API経由で親子関係を外す(View customize plugin)

ということで、サンプルとして「子チケットの一覧にボタンを追加して、REST API経由で親子関係を外す」ということをやってみました。

REST APIの認証は、APIキーを払い出したものをヘッダにX-Redmine-API-Keyとして設定する方法にしています。他にもいろいろ認証方式があるので、用途に応じて使い分けるのが良いかと思います。

View customize の設定内容

Path pattern

チケット画面を対象にします。

/issues/[0-9]+$

Code

Type:JavaScriptとして下記を設定します。APIキーは適宜変更してください。

追記@2017-11-12:application/jsonで送れていなかったので修正しました。以前の形(デフォルトだとapplication/x-www-form-urlencoded)だとcustom_fieldsのようなネストした構造のデータをうまく送信できませんでした。

$(function() {

  // REST APIのキー
  var apiKey = '払い出したAPIキー';

  // 子チケット一覧を対象に
  $('tr.child').each(function() {
    var target = $(this);

    // チケットIDを取得
    var issueUrl = target.find('td.subject > a').attr('href');
    var issueId = issueUrl .substr(issueUrl .lastIndexOf('/') + 1);

    // ボタンを追加して、ボタン押下時にチケットを更新
    var button = $('<input type="button" value="親子関係を外す">');
    button.on('click', function() {

      $.ajax({
          type: 'PUT',
          url: '/issues/' + issueId + '.json',
          headers: {
            'X-Redmine-API-Key': apiKey
          },
          // 更新時はレスポンスのコンテンツが無く
          // jsonだとエラーとなるのでtextにしておく
          dataType: 'text',
          contentType: 'application/json',
          data: JSON.stringify({
            'issue': {
              'parent_issue_id': '' // 親チケットIDをクリア
            }
          })
      }).done(function(data) {
        // 成功したらリロード
        location.reload();
      }).fail(function(data) {
        alert('失敗しました');
      });

    });

    target.append($('<td>').append(button));
  });
})

画面イメージ

下記のように子チケット一覧部分にボタンが追加され、ボタン押下で親子が外れます。

f:id:onozaty:20170723002608p:plain

REST APIについて

今回はチケットの更新を行いましたが、REST APIでは他にもいろいろできますので、ぜひ下記のドキュメントを参照してみてください。