// ==UserScript== // @name Trello coloured Scrum Kanban // @namespace https://trello.com/ // @version 1.8 // @description Colour list for Scrum, referenced with Kanban Game // @match https://trello.com/* // @require http://code.jquery.com/jquery-latest.js // @author Michael Wan // @downloadURL none // ==/UserScript== // Ref: https://stawebteam.wordpress.com/2014/03/07/coloured-lists-in-trello/ $(document).ready(function() { var red = '#fccbc2', blue = '#9ec4ff', green = '#dbffd1', grey = '#c4c4c4', black = '#898989', white = '#fff', yellow = '#ffd800', darkred = '#ff6363', lightblue = '#dbf3ff', lightorange = '#ffd396', darkdarkred = '#c1150f', pink = '#fabaff', orange = '#ff8300'; $('body').hover(function() { $("h2:contains('Analysis')").css('color', white).parents('.list').css('background', red); $("h2:contains('Development')").css('color', white).parents('.list').css('background', blue); $("h2:contains('Testing')").css('color', white).parents('.list').css('background', green); $("h2:contains('Ready to Deploy')").css('color', white).parents('.list').css('background', grey); $("h2:contains('Deployed')").css('color', white).parents('.list').css('background', black); $("span:contains('!')").parents('.list-card-details').css('border-color', yellow).css('border-style', 'solid').css('border-width', '5px'); $("span:contains('!!')").parents('.list-card-details').css('border-color', orange).css('border-style', 'solid').css('border-width', '5px'); $("span:contains('`')").parents('.list-card-details').css('border-color', lightblue).css('border-style', 'solid').css('border-width', '5px'); $(".card-short-id").append(" ").removeClass("hide").css('color', lightorange); $("span[class='list-card-title js-card-name']").filter(function () { return !new RegExp("\\(\\d+\\)").test($(this).text()); }).find(".card-short-id").css('color', darkdarkred); $("span:contains('Blocked')").parents('.list-card-details').css('background', pink); $("span:contains('[VIP]')").parents('.list-card-details').css('background', darkred); }); function printOneMemberWIP(value, key, map) { $("#actualWIP").append(`${key} = ${value} `); } function printWIP() { var text = ""; $("#actualWIP").remove(); var normalMap = $(".board-header-btns.mod-left").after("
ActualWIP (excluded Blocked):
"); var map = $('textarea:contains("Analysis"),textarea:contains("Development"),textarea:contains("Testing")') .closest("div.list-wrapper") .find("img.member-avatar") .map(function() { return this.alt.replace(/\(.+\)/, ""); }) .toArray() .reduce((acc, val) => acc.set(val, 1 + (acc.get(val) || 0)), new Map()); var blockedMap = $('textarea:contains("Analysis"),textarea:contains("Development"),textarea:contains("Testing")') .closest("div.list-wrapper") .find("span[title='Blocked'], span[title='Keep Monitoring']") .closest("a.list-card") .find("img.member-avatar") .map(function() { return this.alt.replace(/\(.+\)/, ""); }) .toArray() .reduce((acc, val) => acc.set(val, 1 + (acc.get(val) || 0)), new Map()); for (var [key, value] of blockedMap.entries()) { map.set(key, map.get(key) - blockedMap.get(key)); } map.forEach(printOneMemberWIP); setTimeout(function(){ printWIP(); }, 1000); } printWIP(); });