// ==UserScript== // @name TFS Helper // @namespace http://jonas.ninja // @version 1.6.2 // @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) refreshNowAndLater(); } 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'}) } 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 = $('