// ==UserScript== // @name GitLab Reviewer Shortcut // @namespace kayw // @version 1.0 // @license MIT // @description Adds keyboard shortcuts to quickly assign reviewers in GitLab MRs // @match https://*.gitlab.com/* // @match http://*.gitlab.com/* // @match https://gitlab.*/* // @grant none // @downloadURL none // ==/UserScript== (function() { // Key for storing reviewer name in localStorage const REVIEWER_KEY = 'gitlab_default_reviewer'; // Initialize or get saved reviewer let defaultReviewer = localStorage.getItem(REVIEWER_KEY); // Create configuration interface function createConfigInterface() { // Check if config panel already exists if (document.getElementById('reviewer-config-panel')) { return; } // Create config panel const panel = document.createElement('div'); panel.id = 'reviewer-config-panel'; panel.style.cssText = ` position: fixed; top: 20px; right: 20px; background: white; border: 1px solid #ccc; border-radius: 5px; padding: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); z-index: 9999; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; `; // Add title const title = document.createElement('h3'); title.textContent = 'Configure Default Reviewer'; title.style.margin = '0 0 10px 0'; panel.appendChild(title); // Add input field const input = document.createElement('input'); input.type = 'text'; input.value = defaultReviewer; input.placeholder = 'Username without @'; input.style.cssText = ` width: 100%; padding: 5px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 3px; `; panel.appendChild(input); // Add save button const saveBtn = document.createElement('button'); saveBtn.textContent = 'Save'; saveBtn.style.cssText = ` background: #1f75cb; color: white; border: none; padding: 5px 10px; border-radius: 3px; cursor: pointer; margin-right: 5px; `; saveBtn.onclick = function() { defaultReviewer = input.value.trim().replace('@', ''); // Remove @ prefix if present localStorage.setItem(REVIEWER_KEY, defaultReviewer); panel.remove(); alert(`Default reviewer set to: @${defaultReviewer}`); }; panel.appendChild(saveBtn); // Add cancel button const cancelBtn = document.createElement('button'); cancelBtn.textContent = 'Cancel'; cancelBtn.style.cssText = ` background: #f5f5f5; border: 1px solid #ddd; padding: 5px 10px; border-radius: 3px; cursor: pointer; `; cancelBtn.onclick = function() { panel.remove(); }; panel.appendChild(cancelBtn); // Add to page document.body.appendChild(panel); // Focus input field input.focus(); input.select(); } // Register keyboard shortcuts document.addEventListener('keydown', function(event) { // Ctrl+Shift+R to open config interface if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'r') { event.preventDefault(); createConfigInterface(); return; } // Ctrl+R to assign reviewer if ((event.ctrlKey || event.metaKey) && !event.shiftKey && event.key === 'r') { // Prevent browser refresh event.preventDefault(); // Simulate pressing 'r' key to focus GitLab comment input const rKeyEvent = new KeyboardEvent('keydown', { key: 'r', code: 'KeyR', keyCode: 82, which: 82, bubbles: true }); document.dispatchEvent(rKeyEvent); // Wait for input to get focus setTimeout(function() { // Find comment input field const commentInput = document.querySelector('.js-comment-input, .note-textarea'); if (commentInput) { // Focus the input commentInput.focus(); // Set text to assign reviewer commentInput.value = `/assign_reviewer @${defaultReviewer}`; // Trigger input event for GitLab to recognize the change commentInput.dispatchEvent(new Event('input', { bubbles: true })); // Simulate Command+Enter to submit setTimeout(function() { const cmdEnterEvent = new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, metaKey: true, bubbles: true }); commentInput.dispatchEvent(cmdEnterEvent); }, 100); } }, 200); } }); // Add initialization message console.log(`GitLab reviewer shortcut initialized. Current reviewer: @${defaultReviewer}`); console.log('Use Ctrl+R (or Cmd+R) to assign reviewer'); console.log('Use Ctrl+Shift+R (or Cmd+Shift+R) to configure default reviewer'); })();