11/12/2024, 3:47:07 PM
// ==UserScript==
// @name Pull out issue numbers - drupal.org
// @namespace Violentmonkey Scripts
// @match https://www.drupal.org/project/issues/search/*
// @grant none
// @version 1.0
// @author Chris Wells
// @license MIT
// @description 11/12/2024, 3:47:07 PM
// ==/UserScript==
(function() {
'use strict';
// Select the table by class name
const table = document.querySelector('.views-table.sticky-enabled');
// If table is not found, exit
if (!table) return;
// Add a new header cell for the "Issue Number" column
const headerRow = table.querySelector('thead tr');
const newHeaderCell = document.createElement('th');
newHeaderCell.className = 'views-field views-field-issue-number';
newHeaderCell.scope = 'col';
newHeaderCell.textContent = 'Issue Number';
headerRow.appendChild(newHeaderCell);
// Iterate over each row in the table body
const rows = table.querySelectorAll('tbody tr');
rows.forEach(row => {
// Find the first column with the link containing the issue number
const titleCell = row.querySelector('.views-field-title a');
if (titleCell) {
// Extract the issue number from the href attribute
const issueNumber = titleCell.href.split('/').pop();
const issueText = `[#${issueNumber}]`;
// Create a new cell for the issue number with a click-to-copy functionality
const issueCell = document.createElement('td');
issueCell.className = 'views-field views-field-issue-number';
issueCell.dataset.th = 'Issue Number';
// Create a clickable span element
const issueSpan = document.createElement('span');
issueSpan.textContent = issueText;
issueSpan.style.cursor = 'pointer';
issueSpan.style.color = 'blue'; // Optional styling for better UX
// Add event listener to copy text to clipboard on click
issueSpan.addEventListener('click', () => {
navigator.clipboard.writeText(issueText).then(() => {
}).catch(err => {
console.error('Failed to copy text: ', err);
});
});
// Append the span to the new cell, and the cell to the row
issueCell.appendChild(issueSpan);
row.appendChild(issueCell);
}
});
})();