はじめに
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による魔改造で実現できたので満足。