使用油猴脚本实现 Jira 缺陷自动填充描述模板、扩展快速工具栏

主要功能

  1. 自动填充缺陷描述模板
  2. 自动选择指定 or 最新的冲刺
  3. 注入快速选择栏,可以快速选择自定义字段(环境、分类)和经办人

在这里插入图片描述

其他

  1. 因为牵扯到很多自定义字段,不同的平台所以肯定没法直接用,需要修改 field 定位。

  2. 快速选择栏实现参考了这个脚本:
    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...
})();
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值