// ==UserScript==
// @name TFS Helper
// @namespace http://jonas.ninja
// @version 1.6.1
// @description Adds styles and moves things around so that oft-used functions are easier
// @author @_jnblog
// @match http://*/tfs/DefaultCollection/*/_backlogs*
// @match http://*/tfs/DefaultCollection/*/_versionControl*
// @match http://*/tfs/DefaultCollection/*/_workitems*
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js
// @grant GM_addStyle
// @downloadURL none
// ==/UserScript==
/* jshint -W097 */
/* global GM_addStyle */
/* jshint asi: true, multistr: true */
var $ = unsafeWindow.jQuery;
var topClass = "makeTfsNotAwful"
$('body').addClass(topClass)
waitForKeyElements("div.tab-page[rawtitle=Links]", doEverything, false)
$(document).on('click', 'input.task-identifier', copyId)
.on('dblclick', 'input.task-identifier', copyMessage)
function copyId(e) {
displayResult(copy(this), $(this).next('span.copy-message'), $(this).parent())
}
function copyMessage(e) {
var optMessage = makeMessage(this)
displayResult(copy(this, optMessage), $(this).next('span.copy-message'), $(this).parent(), true)
}
function makeMessage(el) {
var parent = $(el).closest('.info-text-wrapper')
if (parent.length === 0) {
console.error("The userscript _TFS Helper_ could not identify this task's name")
}
return 't' + parent.children('a.caption').text().match(/\d{5,}/)[0] + ' ' + parent.children('.info-text').text().replace(/^dev: /i, "")
}
function doEverything(linksPane) {
if ($(linksPane).data('moved')) {
return
}
showLinksPane(linksPane)
stackAllTabs(linksPane)
addBlockedButton(linksPane)
window.setTimeout(function() {
addTaskIdCopyUtilities(linksPane)
changeDialogBorderColor(linksPane)
}, 250)
}
function showLinksPane(linksPane) {
$(linksPane).data('moved', true)
.addClass('linksPanel')
.prepend($("
").addClass('linksPanelHeader')
.text($(linksPane).attr('rawtitle')))
var link = $('a[rawtitle=Links]')
link.closest('td').parent().closest('td').prev().css({'width': '30%' /*, 'padding-right': '12px'*/})
link.closest('td').prepend(linksPane)
link.parent().remove()
}
function changeDialogBorderColor(linksPane) {
// depending on the type of this work item, color the border differently
var dialog = $(linksPane).closest('.workitem-dialog')
var caption = dialog.find('a.caption').text()
if (caption.indexOf('Product Backlog Item ') !== -1) {
dialog.css('border-color', '#009CCC') // blue
} else if (caption.indexOf('Bug ') !== -1) {
dialog.css('border-color', '#CC293D') // red
} else if (caption.indexOf('Feature ') !== -1) {
dialog.css('border-color', '#773B93') // purple
} else { // Task
dialog.css('border-color', '#E0C252') // yellow
}
}
function stackAllTabs(linksPane) {
var column2 = $(linksPane).closest('table.content').parent('.column')
if (Math.max(window.innerWidth, document.documentElement.clientWidth) >= 1600) return;
column2.add(column2.prev()).css({width: '100%', display: 'block'})
window.dispatchEvent(new Event('resize'));
}
function addTaskIdCopyUtilities(linksPane) {
$('.workitem-info-bar').find('.info-text-wrapper').each(function() {
var $header = $(this)
if ($header.hasClass('added')) {
return
}
$header.addClass('added')
var id = $header.find('a.caption').text().match(/\d+/)[0]
var $container = $('
').css('display', 'inline-block')
$container.append($('').addClass('task-identifier'))
$container.append($('').addClass('copy-message'))
$header.find('span.info-text').after($container)
});
}
function addBlockedButton(linksPane) {
var blockedInput = linksPane.find('[aria-label=Blocked]');
blockedInput.closest('.control-cell').css({width: 'calc(100% - 60px)', 'min-width': '50px'})
}
function copy(elToCopy, optMessage) {
var $fakeElem = $('