タイトル長くなりがち。
Redmineではチケットに対してコメントが追加できます。
こんな感じ↓

これをチケット一覧画面で、どのくらいの数のコメントがやり取りされているかを見たいです。
こんな感じ↓

確認した所、チケットのコメント情報の取得もAPIで実現でき、
表示部分もJSカスタマイズで出来そうだったので、
例によって view customize plugin の力を借りて実現します。
インストール手順はこちらをご覧下さい。
仕様
下記仕様で実装しました。
・システムによって追加された注記は数えない
・注記が0件の場合は吹き出しを表示しない
コード全体
実装したコードは下記の通りです。
const API_KEY = "ここには Redmine の APIキー を設定します";
$(document).ready(function() {
// fontAwesome CSS を追加
$('body').append("<link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'>");
// チケット一覧のtd要素のチケットidを元に、APIでチケット情報を取得する。
const tds = $("td.id");
const resultPromises = [];
$(tds).each(function(i, td) {
const issueId = $(td).find("a").text();
resultPromises.push(getIsuue(issueId));
});
// チケット情報全て取得完了後
Promise.all(resultPromises).then(function(results) {
// チケット毎のループ
results.forEach(function(result) {
const journals = result.issue.journals;
const issueId = result.issue.id;
const notesCount = getNotesCount(journals);
// チケットに注釈が記載されていない場合、スキップ
if (notesCount === 0) {
return;
}
const tds = $("td.id");
$(tds).each(function(i, td) {
const rowIssueId = $(td).find("a").text();
// 対象のチケットIDのtd以外の場合、スキップ
if (issueId !== Number(rowIssueId)) {
return;
}
// 吹き出し設定
$(td).append('<div><i class="fa fa-commenting-o" aria-hidden="true"></i>' + notesCount + '</div>');
});
});
});
});
/**
* チケットに書き込まれている注釈の数を返します。
* @param journals
*/
const getNotesCount = function(journals) {
let count = 0;
journals.forEach(function(journal) {
if (journal.notes !== "") {
count++;
}
});
return count;
}
/**
* 指定したidのチケット情報を取得します。
* @param id
*/
const getIsuue = function(id) {
return new Promise(function(resolve, reject) {
$.ajax({
type: 'GET',
url: '/issues/' + id + '.json?include=journals',
headers: {
'X-Redmine-API-Key': API_KEY
},
dataType: 'text',
contentType: 'application/json',
}).done(function(resp) {
resolve(JSON.parse(resp));
}).fail(function(jqXHR, textStatus, errorThrown){
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
reject(errorThrown);
});
});
}
解説など
チケットのコメント情報の取得
チケットのコメント情報の取得方法は若干つまりました。
一応リファレンスにもincludeパラメータ付けてね、と書いてあるのですが見落としてました・・・。
該当箇所
$.ajax({
type: 'GET',
url: '/issues/' + id + '.json?include=journals',
全てのチケット情報取得完了を待つ
チケット情報の取得は非同期通信で行われるので、Promiseを使用します。
全てのチケット情報の取得が完了次第、Promise.all()で後続処理を実行しています。
該当箇所
const resultPromises = [];
$(tds).each(function(i, td) {
const issueId = $(td).find("a").text();
resultPromises.push(getIsuue(issueId));
});
// チケット情報全て取得完了後
Promise.all(resultPromises).then(function(results) {
Promise + ループの書き方については、こちらも参考になるかしれません。
おわりに
作業しながら薄々「Redmineプラグインとして作ったほうがスマートかも」という気はしていました・・・。

