NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Bitbucket Pull Request filter // @namespace https://openuserjs.org/users/sagaban // @version 0.5 // @description Highlight bitbucket pull request // @author Santiago // @require https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.2/babel.js // @require https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.js // @match https://descinet.bbva.es/stash/projects/*/pull-requests // @updateURL https://openuserjs.org/meta/sagaban/Bitbucket_Pull_Request_filter.meta.js // ==/UserScript== /* jshint ignore:start */ var inline_src = (<><![CDATA[ /* jshint ignore:end */ /* jshint esnext: false */ /* jshint esversion: 6 */ window.addEventListener('load', function() { // TODO: Migrar todo a ES6 const CHANNEL_REVIEWERS_NEEDED = 2; const HTML_USER_IDS = [ 'xe21500', /* Alberto Matías Vega*/ 'e043895', /* Beatriz de Miguel Pérez */ 'e043699', /* Adrian González Rus */ 'e043697', /* Juan Antonio Gomez Benito */ 'xe61724', /* Santiago Bandiera */ 'e046959', /* Jose Luis Represa */ 'e030441' /* FÉLIX SÁNCHEZ FERNÁNDEZ */ ]; const UPDATE_INTERVAL = 2500; let rowAmountCache; let myUser; window.setInterval(checkUpdate, UPDATE_INTERVAL); function checkUpdate(){ //$PRRows: Cada una de las filas con el PR y los reviewers var $PRRows = document.querySelectorAll('tr.pull-request-row'); if (rowAmountCache !== $PRRows.length ){ rowAmountCache = $PRRows.length; update($PRRows); } } function update($PRRows){ myUser = myUser || document.querySelector('#current-user').getAttribute('data-username'); $PRRows.forEach(function($row){ var $reviewersCell = $row.getElementsByClassName('reviewers')[0]; var reviewers = _.reduce($reviewersCell.children, function(acc, element){ //Compruebo si el elemento es de los reviewer visibles if (element.classList.contains('user-avatar')){ acc.push(getReviewerInfo(element)); } //Compruebo si el elemento es de los reviewer que parecen al hacer click en el botón con el número if (element.classList.contains('avatar-dropdown')){ var hiddenReviewers = _.map(element.getElementsByClassName('user-avatar'), function(menuElement){ return getReviewerInfo(menuElement); }); acc.push(...hiddenReviewers); } return acc; }, []); var reviewersInfo = _.reduce(reviewers, function(acc, reviewer) { //Check if I'm a reviewer acc.amIaReviewer = acc.amIaReviewer || (reviewer.username === myUser); //Check that I already aproved the PR acc.IAlreadyApproved = acc.IAlreadyApproved || ((reviewer.username === myUser) && reviewer.hasApproved); //Check that is approved by two or more people from channel if (reviewer.isFromChannel && reviewer.hasApproved) acc.channelsApproves++; return acc; }, { channelsApproves: 0 }); // Cambio el background de la fila de acuerdo a 3 criterios if(reviewersInfo.amIaReviewer && !reviewersInfo.IAlreadyApproved && reviewersInfo.channelsApproves < CHANNEL_REVIEWERS_NEEDED){ $row.style.backgroundColor = 'bisque'; } }); } // Extraigo: // * username // * hasApproved // * isFromChannel function getReviewerInfo(spanElement){ var username = spanElement.getAttribute('data-username'); return { username, hasApproved: !spanElement.classList.contains('badge-hidden'), isFromChannel: HTML_USER_IDS.includes(username), }; } }, false); /* jshint ignore:start */ ]]></>).toString(); var c = Babel.transform(inline_src, { presets: [ "es2015", "es2016" ] }); eval(c.code); /* jshint ignore:end */