My Merge Requests Gitlab

Show Link to opened Merge Requests created by user

2025-01-26 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         My Merge Requests Gitlab
// @namespace    http://tampermonkey.net/
// @version      3.0.1
// @description  Show Link to opened Merge Requests created by user
// @author       0w0miki
// @license      MIT
// @match        https://gitlab.com/*
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==

(function() {
    'use strict';

    function $(selector) {
        return document.querySelector(selector);
    }

    function addCreateMrButton(list) {
        let buttonHtml = list.children[0].outerHTML;
        buttonHtml = buttonHtml.replace('assignee_username', 'scope=all&state=opened&author_username');
        buttonHtml = buttonHtml.replace('merge_requests_assigned', 'merge_requests_created');
        buttonHtml = buttonHtml.replaceAll('Assigned', 'Created');
        list.insertAdjacentHTML('beforeend', buttonHtml);
    }

    function updateCreateMRCount(count) {
        document.querySelectorAll('a[data-track-label="merge_requests_created"] span.badge').forEach(node => {
            node.textContent = count;
        });
        $('button[data-track-label="merge_requests_menu"] span').textContent = totalMr + count;
    }

    const totalMr = Number($('button[data-track-label="merge_requests_menu"] span').textContent);
    const lastMrCount = GM_getValue("open_mr_count") || 0;

    const my_mr_url = $('a[data-track-label="merge_requests_assigned"]').href.replace('assignee_username', 'scope=all&state=opened&author_username');
    const mrList = document.querySelectorAll('ul :has(>li [data-track-label*="merge_requests"])');
    mrList.forEach(list => {
        addCreateMrButton(list);
    });
    updateCreateMRCount(lastMrCount);

    fetch(my_mr_url)
    .then(response => response.text())
    .then(html => {
        const parser = new DOMParser();
        const doc = parser.parseFromString(html, 'text/html');
        const open_mr_count = doc.querySelector('a#state-opened > span.badge').textContent;
        updateCreateMRCount(open_mr_count);
        GM_setValue("open_mr_count", open_mr_count);
    });
})();