Redmineを全社展開したのですが、利用者が増えるとやはりタイトルのような要望が上がってきました…ですのでview customize pluginを使用して対応しました。

要件


下記の要件を満たすようなことをやりました。

新規作成時

  • 特定のトラッカーでは新規作成時に指定した担当者にする
  • 特定のトラッカーではステータスに応じて担当者を自動で設定する
  • 上記以外の場合は担当者は「自分」に設定する
  • 担当者を設定した後にトラッカーを変更した場合に、特定のステータス以外の場合はトラッカー変更前の担当者のままにする

編集時

  • 編集を押した時点のトラッカーとステータスが何であれ、現在設定されている担当者を維持する
  • 編集でトラッカーとステータスを切り替えた場合、特定のトラッカーではステータスに応じて担当者を自動で設定する

その他

  • 上記の全てを満たすJavaScriptを1つで書く

これはView Customize Pluginで書くJavaScriptが分割した場合に、それぞれのJavaScriptがどのように影響するか読み切れなかったのと、管理するJavaScriptの数が増えると私が管理しきれないので1つのJavaScriptに全て書くことにしました。View Customize Pluginで書いた各々のJavaScriptを相互に呼び出せれば分割したんですが…う~ん、できるのかな…?ちょっとわかりません…

後は、RedmineはIssue登録時はURLはプロジェクト個別のものですが、編集時は(末尾のIssue番号以外)全プロジェクトで共通ということもあり、1つで記述しました。コードが長くなるとパフォーマンスとか通信量的にアレかな…とも思ったのですが、今回後述してるくらいなら許容範囲かなと。

設定内容


Path Pattern

1
/issues

Code

下記のような感じになりました。下記のコードは「ステータス新規 = 1」で判断してます(Redmienデフォルトだとそうなってる)ので「新規」のidが変わってる場合は適当に変更してください。

なお、私はJavaScriptド素人なので下記のコードは結構アレなんじゃないかなという気がします。2週間くらいちゃんと動いてるので動作的には問題ないと思いますが。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
$(function(){
var statusChanged = false;
//ステータスが変わったかどうか判定
$(document).on('change', '#issue_status_id', function() {
statusChanged = true;
});

//現在の担当者ID取得
var currentAssignees = $('#issue_assigned_to_id').val();

function setAssignees() {
var tracker_id = $('#issue_tracker_id').val();
var status_id = $('#issue_status_id').val();

//トラッカー10,11,12ときのみ
if (tracker_id == '10' || tracker_id == '11' || tracker_id == '12') {
//新規作成時に担当者いない場合
if (status_id == '1' && currentAssignees.length == 0) {
//担当者を30番の人にする
$('#issue_assigned_to_id').val(30);
return;
}

//これ以降はステータスが変わったときのみ処理する
if (!statusChanged) {
return;
}

//ステータス(新規以外)でそれぞれ特定の担当者に設定する
switch(status_id) {
case "3":
$('#issue_assigned_to_id').val(31);
return;
case "4":
$('#issue_assigned_to_id').val(32);
return;
case "5":
$('#issue_assigned_to_id').val(33);
return;
default: //現在の担当に設定する
$('#issue_assigned_to_id').val(currentAssignees);
return;
}
//ステータス変更時に担当者未割当のとき何もしない
} else if (statusChanged && currentAssignees.length == 0) {
return;
} else {
//新規で担当者いない場合は自分に設定する
if (status_id == '1' && currentAssignees.length == 0) {
setMySelf();
}
}
}

//担当者一覧から自分を設定する関数
function setMySelf() {
$('#issue_assigned_to_id option').each(function(){
var person = $(this);
if (IsMe(person)){
$('#issue_assigned_to_id').val(person.attr('value'));
return;
}
});
}

//自分かどうか判断する関数
function IsMe(person) {
if (person.text() == '<< 自分 >>'){
return true;
}
}

setAssignees();
var _replaceIssueFormWith = replaceIssueFormWith;
replaceIssueFormWith = function(html){
_replaceIssueFormWith(html);
setAssignees();
};
});

上記コードの74~77行目が何やってるかは下記のプラグインの作成者様の記事をご覧ください。

Redmine: ステータスに応じて、カスタムフィールドの表示を切り替える (View customize plugin)

担当者を「自分」に設定するのは下記の記事を参考にさせて頂きました。

Redmineの少機能設定

その他


前職とかではこういった要望がでてこなかったので、使ったことのないプラグインだったのですが、これはスゴイですわ…あまり多くのプラグインは入れたくないので、対応できるものはこれで対応していきたいと思います。

なお、私はJavaScriptド素…(以下略