先週の第15回redmine.tokyoで紹介したスクリプトです。
REST APIを使って複数の子チケットをまとめて作成します。
作業を子チケットに分割して運用しているようなところだと、かなりうれしいのではと思います。 例えば、親として機能開発があって、その下に設計、製造、テストみたいな子チケットを作るような場合、これで1クリックで定型的な子チケットが作れるようになります。
設定内容
- Path pattern:
.*
- Insertion position:
Bottom of issue detail
$(function() { var projectId = $('#issue_project_id').val(); var trackerId = $('#issue_tracker_id').val(); var subject = $('#issue_subject').val(); var priorityId = $('#issue_priority_id').val(); var parentIssueId = ViewCustomize.context.issue.id; // 子チケットとして作成する情報 var issueChildren = [ { 'issue': { 'project_id': projectId, 'tracker_id': trackerId, 'subject': subject + ' - 子チケット1', 'priority_id': priorityId, 'parent_issue_id': parentIssueId } }, { 'issue': { 'project_id': projectId, 'tracker_id': trackerId, 'subject': subject + ' - 子チケット2', 'priority_id': priorityId, 'parent_issue_id': parentIssueId } }, { 'issue': { 'project_id': projectId, 'tracker_id': trackerId, 'subject': subject + ' - 子チケット3', 'priority_id': priorityId, 'parent_issue_id': parentIssueId } } ]; var link = $('<a title="子チケットの一括作成" class="icon icon-add" href="#">子チケットの一括作成</a>'); $('#issue_tree').before($('<p>').append(link)); link.on('click', function() { if (!confirm('子チケットをまとめて作成します。よろしいですか。')) { return; } // チケット作成処理(非同期)を順次実行し、最後にリロード var defer = $.Deferred(); var promise = defer.promise(); for (var i = 0; i < issueChildren.length; i++) { promise = promise.then(createIssue(issueChildren[i])); } promise .done(function() { // 成功したらリロード location.reload(); }) .fail(function() { alert('失敗しました'); }); defer.resolve(); }); function createIssue(issue) { return function() { return $.ajax({ type: 'POST', url: '/issues.json', headers: { 'X-Redmine-API-Key': ViewCustomize.context.user.apiKey }, // 作成時はレスポンスのコンテンツが無く、jsonだとエラーとなるのでtextにしておく dataType: 'text', contentType: 'application/json', data: JSON.stringify(issue) }); }; } })
画面イメージ