主要功能
- 自动填充缺陷描述模板
- 自动选择指定 or 最新的冲刺
- 注入快速选择栏,可以快速选择自定义字段(环境、分类)和经办人
其他
-
因为牵扯到很多自定义字段,不同的平台所以肯定没法直接用,需要修改 field 定位。
-
快速选择栏实现参考了这个脚本:
https://greasyfork.org/zh-CN/scripts/390169-jirabugtemplate
源码
// ==UserScript==
// @name Jira Bug Template
// @namespace http://tampermonkey.net/
// @version 0.2
// @description 1. 填充缺陷描述; 2. 选择建议 sprint(需修改定位); 3. 快速选择工具条(需修改定位)
// @author Chen
// @match https://xxxxx.atlassian.net/jira/software/c/projects/*
// @match https://xxxxx.atlassian.net/browse/*
// @icon https://www.google.com/s2/favicons?domain=atlassian.net
// @grant none
// ==/UserScript==
// 缺陷模板
const bugTypeName = '缺陷';
const descriptionKeyword = '测试结果';
const descriptionTemplate = `(i) *可复现地址*
(on) *操作步骤*
1.
2.
:( *测试结果*
1.
:D *预期结果*
1.
`;
const defaultAssignee = '自动';
const onlineIssueAssignee = 'xxxx@xxxx.com';
const currentSprint = 'xxxx Sprint 2'; // 制定选择的冲刺,也可以无脑选择第一个。
function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
// 轮询器
function timesInterval(handler, intervalTime, times) {
let curTimes = 0;
let timer = setInterval(() => {
try {
handler();
clearInterval(timer);
}
catch(err) {
// 不做任何处理
}
curTimes++;
if (curTimes >= times) {
clearInterval(timer);
}
}, intervalTime)
}
// 模拟键盘输入
function mockInput (dom, text) {
var evt = new InputEvent('input', {
inputType: 'insertText',
data: text,
dataTransfer: null,
isComposing: false
});
dom.value = text;
dom.dispatchEvent(evt);
}
(function() {
'use strict';
var currentProject = ''
// 全局点击事件
document.addEventListener("click", function(){
if (document.querySelectorAll('#create-issue-dialog.jira-dialog-open').length > 0 && document.getElementById('issuetype-field').value === bugTypeName ){ // 存在 issue 弹层
// 填充 描述模板
let description = document.getElementById('description')
if (!description.innerHTML.includes(descriptionKeyword)) { //没有模板关键字
description.innerHTML = descriptionTemplate
}
// 选择 sprint
if (document.querySelector('input[aria-controls=customfield_10020-suggestions]')){ // 没选过 sprint
//document.getElementById('customfield_10020-field').click()
mockInput($('#customfield_10020-field')[0], currentSprint)
sleep(100).then(() => {
timesInterval(() => {
//document.querySelector('#customfield_10020-suggestions #建议 .aui-list-item-link, #所有冲刺 .aui-list-item-link').click()
$('#customfield_10020-suggestions #建议 .aui-list-item-link, #所有冲刺 .aui-list-item-link').slice(-1)[0].click()
}, 100, 30);
})
}
// focus 标题
//if (!$('#summary')[0].value){ // 没填过 summary
// $('#create-issue-dialog .form-body')[0].scrollTop = 0
// $('#summary')[0].focus()
//}
if (document.querySelector('.jira-dialog-heading').value !== 'injected'){ // 当前没有被注入过
// 更新当前项目名
currentProject = $('#project-field')[0].value
// 注入 toolbar
function fillBugType(type) {
function selectAssignee(assignee) {
mockInput($('#assignee-field')[0], assignee)
sleep(600).then(() => {
timesInterval(() => {
$('#assignee-suggestions #建议 > .aui-list-item, #所有用户 > .aui-list-item')[0].click()
}, 100, 30);
})
}
let env = $('#customfield_10036')[0]
let end = $('#customfield_10037')[0]
if (type === '质检问题(前端)'){
env.value = 10026
end.value = 10029
selectAssignee(defaultAssignee)
}else if(type === '质检问题(后端)'){
env.value = 10026
end.value = 10030
selectAssignee(defaultAssignee)
}else if(type === '线上缺陷(前端)'){
env.value = 10028
end.value = 10029
selectAssignee(onlineIssueAssignee)
}else if(type === '线上缺陷(后端)'){
env.value = 10028
end.value = 10030
selectAssignee(onlineIssueAssignee)
}
}
let summaryField = $('#summary').parent();
if (summaryField) {
let aTag = [];
const bugType = ['质检问题(前端)', "质检问题(后端)", "线上缺陷(前端)", "线上缺陷(后端)"];
for (let type of bugType) {
const tag = `<a href='#' style="margin-right: 10px">${type}</a>`;
aTag.push(tag)
}
const fieldHtml = `<div id="bug-type-field" class="field-group"><label>快速选择</label><div style="padding: 5px 0 0;">${aTag.join('')}</div></div>`;
summaryField.before(fieldHtml);
$('#bug-type-field a').each((index, element) => {
console.log('添加监听')
element.addEventListener('click', () => {
fillBugType(element.innerText)
})
});
}
// 标记为已注入
document.querySelector('.jira-dialog-heading').value = 'injected'
}else{
// 更换项目后,能够触发一次
if (currentProject !== $('#project-field')[0].value){
// 重置注入标记
document.querySelector('.jira-dialog-heading').value = ''
}
}
}
});
// Your code here...
})();