はじめに
Redmineでは「トラッカー」でタスクの種類(バグ,雑務,etc…)を指定して、
作業時間を記録する為に「活動」として実際の作業内容(設計,開発,etc…)を
指定します。
しかし、例えば「トラッカー」で”雑務”を選択したのに「活動」で”開発”は選択して
欲しくないのです。
つまりは、「トラッカー」の値により、選択する必要の無い「活動」はプルダウンに
表示しないようにしたい。
環境
各バージョン等は下記の通り。
Redmine
3.0.0.stable
view customize plugin
1.2.2
準備
トラッカーのIDを確認する
トラッカーにはIDが採番されており、後述のJavaScriptでどのトラッカーか判定する為に使用する。
トラッカーのIDは下記から確認できる。
ヘッダの”管理” > トラッカーを選択…
現在作成されているトラッカーの一覧が表示されるので、任意のトラッカーを選択…
画面遷移後のURLの trackers/○/edit の”○”部分がトラッカーID。
活動のIDを取得する
トラッカーと同様に、活動にもIDが採番されている。
こちらも後述のJavaScriptで使用する為、下記から確認しておく。
ヘッダの”管理” > 列挙項目を選択…
現在作成されている作業の一覧が表示されるので、任意の作業を選択…
画面遷移後のURLの enumerations/○/edit の”○”部分が作業のID。
設定内容
設定は下記の通りです。
Path pattern
/issues/[0-9]+
Type
JavaScript
Code
$(function() { // 「トラッカー」ID毎に、有効にする「活動」IDを配列で設定 const workMap = { '1':[ // トラッカーID:1(バグ)は、 '8', // 活動ID:8(設計)と '9' // 活動ID:9(開発)を有効にする ], '3': [ // トラッカーID:3(雑務)は、 '10' // 活動ID:10(打ち合わせ)を有効にする ] // それ以外のトラッカーの時は何もしない。 }; const setWorksEnabled = function() { // 「活動」の選択状態をクリア $('#time_entry_activity_id').val(""); // 全選択肢の disabled をクリア const activities = $('#time_entry_activity_id option'); $(activities).each(function(index) { $(activities[index]).prop('disabled', false); }); // 選択中の「トラッカー」毎に「活動」の有効/無効を設定 const enabledWorks = workMap [$('#issue_tracker_id option:selected').val()]; if(enabledWorks) { $(activities).each(function(index) { if($(activities[index]).val() === '') return; if(enabledWorks.indexOf($(activities[index]).val()) === -1) { $(activities[index]).prop('disabled', true); } }); } }; // 初期表示時の設定処理呼び出し setWorksEnabled(); $(document).ajaxComplete(function(){ // トラッカー変更時の設定処理呼び出し setWorksEnabled(); }); });
結果
トラッカーが”バグ”の時は、”設計”、”開発”が有効になっている。
トラッカーが”雑務”の時は、”打ち合わせ”が有効になっている。
それ以外の時は何もしない(有効/無効の制御をしない)
おわりに
恥ずかしながらoptionにdisabledが設定できる事を始めて知った。。。
トラッカーを変更する度に有効にする選択肢を残してoptionをremove()しないといけないかと
思っていたが、嬉しい誤算だった。
また、大抵の事はWeb上で見つかるが、この件については見つからなかった。
そういう時は大抵自分の認識が誤っているので、「トラッカー」毎に選択可能な「活動」を変更する、という使い方はRedmineが想定しているものではないのか・・・?
とりあえずview customize pluginによる魔改造で実現できたので満足。