view customize pluginで親チケットへの工数入力を禁止する(Redmine)

view customize pluginで親チケットへの工数入力を禁止する(Redmine)
                 
最終更新日から90日以上経過しています。

はじめに

Redmineではチケットを親子関係で紐付けて、子チケットの工数を親チケット側に集計表示する事が
できます。
逆に言うと、子チケットの工数は親チケットに吸い上げるので、親チケット側では工数を入力したくない。
ので、view customize plugin で実現してみます。

完成イメージ

先に完成形。
親チケットに対して工数を入力するとアラートを表示して登録を中止します。

環境

各バージョン等は下記の通り。

Redmine

3.0.0.stable

view customize plugin

1.2.2

設定内容

設定は下記の通りです。

Path pattern

チケットの詳細画面を対象にするパターン

/issues/[0-9]+

Type

JavaScript

Code

$(function() {
    const URL = location.href;
    // チケット番号をURLから取得
    const ISSUE_ID = URL.substr(URL.lastIndexOf("/")+1);

    $('#issue-form').submit(function() {
        // 作業実績を取得
        const hours = $('#time_entry_hours').val();
        // 作業実績が入力されている場合のみ
        if(hours !== "" && isFinite(hours)) {
            $.ajax({
                type: 'GET',
                url: '/issues/' + ISSUE_ID + '.json?include=children',
                headers: {
                    'X-Redmine-API-Key': 'abcde.....................'
                },
                dataType: 'json',
                contentType: 'application/json',
            }).done(function(resp) {
                console.log(resp);
                if(resp['issue']['children']) {
                    alert('親チケットには工数を入力できません。');
                }else{
                    $('#issue-form').off('submit');
                    $('#issue-form').submit();
                }
            }).fail(function(error) {
                console.log(error);    
            });
            return false;
        }
    });
});

ポイント、というか詰まった所1:子チケットの取得

 
 url: '/issues/' + ISSUE_ID + '.json?include=children', 

Redmineには、こちらに記載されている内容のAPIが用意されています。
チケット情報はissuesで取得できますが、子チケットの情報を取得するには?include=children
付与する必要があります。
これに気付けず絶望してました。リファレンスはちゃんと読もう、自分。

ポイント、というか詰まった所2:submitの中止と再実行

 
                    $('#issue-form').off('submit');
                    $('#issue-form').submit();
                }
            }).fail(function(error) {
                console.log(error);    
            });
            return false;

submit()にイベントを付与しますが、非同期処理でチケット情報を取得する為、
return false; で中止します。
そしてチケット情報取得後に本来のsubmit()を実行したいので、再度同じ処理が実行されないよう、off(‘submit’)で付与したイベント外した後にsubmit()します。

おわりに

RedmineのAPIが思ったより充実していたので、色々実装できそうな気がした。
親チケットの予定工数は入力できないようにRedmine側で制御されているようなので、
今後のアップデートで実績工数も入力不可になるのかな?

 

 

Redmineカテゴリの最新記事