My Merge Requests Gitlab

Show Link to opened Merge Requests created by user

  1. // ==UserScript==
  2. // @name My Merge Requests Gitlab
  3. // @namespace http://tampermonkey.net/
  4. // @version 3.0.2
  5. // @description Show Link to opened Merge Requests created by user
  6. // @author 0w0miki
  7. // @license MIT
  8. // @match https://gitlab.com/*
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. function $(selector) {
  17. return document.querySelector(selector);
  18. }
  19.  
  20. function addCreateMrButton(list) {
  21. let buttonHtml = list.children[0].outerHTML;
  22. buttonHtml = buttonHtml.replace('assignee_username', 'scope=all&state=opened&author_username');
  23. buttonHtml = buttonHtml.replace('merge_requests_assigned', 'merge_requests_created');
  24. buttonHtml = buttonHtml.replaceAll('Assigned', 'Created');
  25. list.insertAdjacentHTML('beforeend', buttonHtml);
  26. }
  27.  
  28. function updateCreateMRCount(count) {
  29. document.querySelectorAll('a[data-track-label="merge_requests_created"] span.badge').forEach(node => {
  30. node.textContent = count;
  31. });
  32. $('button[data-track-label="merge_requests_menu"] span').textContent = Number(totalMr) + Number(count);
  33. }
  34.  
  35. const totalMr = Number($('button[data-track-label="merge_requests_menu"] span').textContent);
  36. const lastMrCount = GM_getValue("open_mr_count") || 0;
  37.  
  38. const my_mr_url = $('a[data-track-label="merge_requests_assigned"]').href.replace('assignee_username', 'scope=all&state=opened&author_username');
  39. const mrList = document.querySelectorAll('ul :has(>li [data-track-label*="merge_requests"])');
  40. mrList.forEach(list => {
  41. addCreateMrButton(list);
  42. });
  43. updateCreateMRCount(lastMrCount);
  44.  
  45. fetch(my_mr_url)
  46. .then(response => response.text())
  47. .then(html => {
  48. const parser = new DOMParser();
  49. const doc = parser.parseFromString(html, 'text/html');
  50. const open_mr_count = doc.querySelector('a#state-opened > span.badge').textContent;
  51. updateCreateMRCount(open_mr_count);
  52. GM_setValue("open_mr_count", open_mr_count);
  53. });
  54. })();