// ==UserScript== // @name gitlab booster // @namespace http://tampermonkey.net/ // @version 1.0.1 // @description Boost productivity for code reviewers on gitlab // @author braineo // @match https://gitlab.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=gitlab.com // @require https://cdn.jsdelivr.net/gh/CoeJoder/waitForKeyElements.js@16f3c035e2c41f8af0437a1eca1c9899e722ec37/waitForKeyElements.js // @require https://code.jquery.com/jquery-3.7.1.min.js // @license AGPL-3.0-or-later // @grant GM_addElement // @grant window.onurlchange // @downloadURL none // ==/UserScript== /* global $ waitForKeyElements */ (function () { 'use strict'; // copy from this extension // https://github.com/Krystofee/gitlab-unresolved-threads/blob/master/enhance-merge-requests.js async function fetchGitLabData(url) { const response = await fetch(url, { headers: { 'Content-Type': 'application/json' }, }); if (!response.ok) { console.error('Failed to fetch GitLab data:', response.statusText); return null; } return await response.json(); } // // Element manipulation // function createThreadsBadge(element, badgeClassName, resolved, resolvable) { const li = $('
  • ') .addClass('issuable-comments d-none d-sm-flex') .prependTo(element); $('') .addClass( `gl-badge badge badge-pill badge-${badgeClassName} sm has-tooltip`, ) .text(`${resolved}/${resolvable} threads resolved`) .prependTo(li); } function createDiffStat(element, fileCount, addLineCount, deleteLinCount) { $('
    ') .css({ display: 'flex', 'flex-direction': 'row', gap: '3px' }) .append( $('
    ', { class: 'diff-stats-group' }).append( $('', { class: 'gl-text-gray-500 bold', text: `${fileCount} files`, }), ), $('
    ', { class: 'diff-stats-group gl-text-green-600 gl-display-flex gl-align-items-center bold', }).append($('').text('+'), $('').text(`${addLineCount}`)), $('
    ', { class: 'diff-stats-group gl-text-red-500 gl-display-flex gl-align-items-center bold', }).append( $('').text('-'), $('').text(`${deleteLinCount}`), ), ) .prependTo(element); } function ensurePanelLayout() { // ensure two column scroll structure const layout = document.querySelector('div.layout-page'); $(layout).css({ display: 'flex', height: '100vh', overflow: 'hidden' }); const content = document.querySelector('div.content-wrapper'); $(content).css({ overflowY: 'scroll' }); } function ensureSidePanel(panelName, url) { const buttonId = `close-${panelName.toLowerCase().replaceAll(' ', '-')}`; if (!document.querySelector(`#${buttonId}`)) { const topBar = document.querySelector('.top-bar-container'); $(topBar).append( $('