jira-sp-summarize

the sp summarize

目前为 2024-05-08 提交的版本。查看 最新版本

// ==UserScript==
// @name         jira-sp-summarize
// @namespace    http://tampermonkey.net/
// @version      2024-05-08-fix-1
// @description  the sp summarize
// @author       Neo
// @match        https://jira.logisticsteam.com/issues/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=logisticsteam.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    function summarizeSp() {
        return {name: 'Story Point', value: summarize('customfield_10002')};
    }

    function summarizeTestPoint() {
        return {name: 'Test Point', value: summarize('customfield_12100')};
    }

    function summarizeDevHour() {
        return {name: 'Dev Hour', value: summarize('customfield_11602')};
    }

    function summarizeTestHour() {
        return {name: 'Test Hour', value: summarize('customfield_11601')};
    }

    function summarize(cellName) {
        // if not exist cellName dom, reutrn NaN
        if (!document.getElementsByClassName(cellName)[0]) {
            return NaN;
        }
        let table = document.getElementById('issuetable').getElementsByTagName('tbody')[0];
        let rows = table.getElementsByTagName('tr');
        let sum = 0;
        for (let i = 0; i < rows.length; i++) {
            let row = rows[i];
            let cell = row.getElementsByClassName(cellName)[0].textContent.trim();
            sum += parseFloat(cell) || 0;
        }
        return sum.toFixed(2);
    }

    function generateTextContext() {
        let objs = [summarizeSp(), summarizeDevHour(), summarizeTestPoint(), summarizeTestHour()];
        let text = '';
        for (let i = 0; i < objs.length; i++) {
            // skip if obj.value is NaN
            if (isNaN(objs[i].value)) {
                continue;
            }
            text += objs[i].name + ' : ' + objs[i].value + ' | ';
        }
        return text;
    }

    function insertSp(textContent) {
        // preappend a div befor the <div class="list-view"> show the dev
        let div = document.createElement('div');
        div.id = 'sp-total';
        div.style.margin = '20px';
        div.textContent = textContent;
        document.getElementsByClassName('navigator-group')[0].insertBefore(div, document.getElementsByClassName('navigator-group')[0].firstChild);
       
    }
    
    function regenerateSp(textContent) {
        let sp = document.getElementById('sp-total');
        sp.textContent = textContent;
    }

    insertSp(generateTextContext());

    const targetNode = document.getElementsByClassName('navigator-group')[0];

    // 配置观察选项:
    // `childList`:子元素的变动
    // `subtree`:所有下属节点(包括子节点和子节点的子节点等)的变动
    const config = { childList: true, subtree: true };

    // 当观察到变动时执行的回调函数
    const callback = function(mutationsList, observer) {
        for(const mutation of mutationsList) {
            if (mutation.type === 'childList') {
                regenerateSp(generateTextContext());
            }
        }
    };

    // 创建一个观察者对象并传入回调函数
    const observer = new MutationObserver(callback);

    // 以上述配置开始观察目标节点
    observer.observe(targetNode, config);

    // 之后,你可以随时停止观察
    // observer.disconnect();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址