35

28

Bug-monkey scripts probably don't qualify as full plug-ins on their own right and probably don't belong in the plug-in gallery, but it would be nice to have a centralized repository of BugMonkey scripts/css where people can share them

Since they are essentially just text blocks, I though I'd open a Question on here where people could post their scripts and/or vote on the best ones.

Michael: If you had other ideas for another place to do this, please let me know and I'll delete this post.

flag
2 
Seems fine to me! – Michael Pryor Sep 16 2009 at 17:29
show 1 more comment

116 Answers

1 2 3 4 next
15

Problem: Filter menu too long

Once you have lots of (shared) filters, the filter menu becomes cumbersome to use, esp. when you try to access your own filters.

Solution: Group filters by name

Organize filters in the menu into groups based on common prefixes.

Anything in the filter name before the first colon is considered the filter's group name (e.g. if filter name is "Testing: Most Recent Build" then "Testing" is the group name). To group two or more filters together, use the same prefix for them, e.g. "Testing: Production", "Testing: Development".

If a group contains two or more filters, the Filters menu will show "Group Name: n filters" instead of the actual filters. Clicking on this item will show or hide the group's original list of filters indented below it.

Screenshot

alt text

Script

Tested with FB 8.

name:          Grouped Filters
description:   Changes Filters menu to group filters by group name
author:        Stepan Riha
version:       1.0.0.4

js:

$(document).ready(function() {

    // Change visibility of links in group
    function toggleGroup() {
        var $this = $(this);
        var group = $this.data('group');

        if(!group.prepared) {
            prepareLinks(group);
        }

        processLinks(group, group.isOpen
            ? function($link) { $link.hide(); }
            : function($link) { $link.show(); });

        group.isOpen = !group.isOpen;

        return false;
    };

    // Replace filter group name with its list of filters
    function prepareLinks(group) {
        var groupname = jQuery.trim(group.text+":");
        processLinks(group, function($link) {
            var html = $link.html();
            html = html.replace(groupname, '');
            $link.html(html).addClass('filter_group-link');
        });
        group.prepared = true;
    };

    // Apply callback to each link in group
    function processLinks(group, callback) {
        for(var j = 0; j < group.links.length; j++) {
            callback(group.links[j]);
        }
    };

    // Collect filter links and group by prefix
    var groups = [];
    var $prev = null;
    var group = null;
    $('#filterPopup a').each(function() {
        var $this = $(this);
        // Use everything up to first : as group name
        var text = $this.text();
        text = text.replace(/\:.*/, '');
        // Create new group, if necessary
        if(!group || group.text != text) {
            group = { text: text, links: [] };
            groups.push(group);
        }
        group.links.push($this);
    });

    // Process groups of 2 or more links
    for(var i = 0; i < groups.length; i++) {
        var group = groups[i];
        var links = group.links;
        if(links.length > 1) {
            // Hide links
            processLinks(group, function($link) { $link.hide(); });

            // Create group link
            group.link = $("<a href='#' class='filter_group'><span>" + group.text + ": " + links.length + " filters</span></a>")
                    .bind("click", toggleGroup)
                    .data('group', group)
                    .insertBefore(links[0]);
        }
    }
});


css:

a.filter_group {
    padding-left: 17px !important;
    font-style: italic;
}
a.filter_group span {
    padding-left: 5px;
    border-left: solid 3px #B1C9DD;
}
a.filter_group:hover span {
    border-left-color: #E0E9F1;
}
a.filter_group-link {
    padding-left: 23px !important;
}
link|flag
show 2 more comments
13

The Problem:
I'm always having to look up the search syntax, particularly the axis names, and I don't like doing that.

My Solution
I wrote a BugMonkey script that adds an icon next to the search box with a dropdown of search axis values. Mousing over an item in the dropdown will show more info on how to use that axis, and clicking on it will insert it in the search box.

It isn't all that pretty yet, but it's functional. Feel free to update the script here if you want to add some cosmetics to it or improve the mouseover text on the search items.

Screenshot:
Screenshot

The Script

name:          Search Box Helper
description:   Adds a syntax helper widget to the search box.
author:        John Fuex
version:       1.0.0.0

js:

   var searchAxes = getSearchAxes();
   var srchInput = $('#idDropList_searchFor_oText');

   var imgSearchHelperButton = $('<span></span>');
   imgSearchHelperButton.attr('id','searchHelperButton')
                        .text('?')
                        .css('position','absolute')
                        .css('left',srchInput.position().left - 25)
                        .css('top', srchInput.position().top);  
   srchInput.after(imgSearchHelperButton);
   var divSearchHelper = $('<div></div>')
   divSearchHelper.attr('id','divSearchHelper')                  
                  .css('position','absolute')
                  .css('width',srchInput.css('width'))
                  .css('top', srchInput.position().top + srchInput.outerHeight()) 
                  .css('left',imgSearchHelperButton.position().left)                  
                  .css('z-index','500')
                  .css('display','none');
  for (var axisID=0; axisID<searchAxes.length; axisID+=2) {
      var divHelpItem = $('<div></div>')      
      var itemText = searchAxes[axisID];
      var itemDescription = searchAxes[axisID+1]
      if(itemText.substr(0,1)=='#') {
         itemText = itemText.substr(1);
         divHelpItem .addClass('searchHelperItemHeader')
      }
      else {
         divHelpItem .addClass('searchHelperItem');
      }
      var helpItem = $("<a/>").text(itemText).attr('title',itemDescription);      
      divHelpItem.append(helpItem);
      divSearchHelper.append(divHelpItem );
  }
  srchInput.after(divSearchHelper);
   // Attach event handlers
   $('#searchHelperButton').click(function () { $('#divSearchHelper').toggle();});
   $(".searchHelperItem").click(function() { 
                                        var srchInput = $('#idDropList_searchFor_oText');
                                        var newSearchText = srchInput.val() + (srchInput.val() != '' ? ' ' : '') + $(this).text() + ':';                                        
                                        srchInput.val(newSearchText);
                                        $('#divSearchHelper').toggle(false);
                                        srchInput.focus();
                                  });
function getSearchAxes() {
return ["#Cases","Axes for Searching Cases",
           "AlsoEditedBy","cases edited by the specified user, to be used in combination with EditedBy",
           "Area","cases in the specified area",
           "AssignedTo","cases assigned to the specified user",
           "Attachment","cases with an attachment with the specified name",
           "Category","cases with the specified category",
           "Closed","(date) cases closed on the date specified",
           "ClosedBy","cases last closed by the specified user",
           "CommunityUser","cases that were submitted by the specified community user",
           "Computer","cases containing specific text in the second custom field. Note that this field may have been renamed in your installation",
           "Correspondent","cases with the specified email correspondent",
           "CreatedBy","cases created by the specified user",
           "Department","cases belonging to the specified department",
           "Due","(date) cases due on the date specified",
           "Edited","(date) cases modified on the date specified",
           "EditedBy","cases with a bug event generated by the specified user",
           "ElapsedTime","cases with the specified (range of) elapsed time",
           "EstimateCurrent","cases with the specified (range of) current estimate",
           "EstimateOriginal","cases with the specified (range of) original estimate",
           "From","cases with emails from the specified email address",
           "LastEdited","(date) cases that were modified on the date specified and have not been modified since then",
           "LastEditedBy","cases last edited by the specified user",
           "LastViewed","(date) cases that you last viewed on the date specified",
           "Milestone","cases assigned to the specified milestone",
           "Occurrences","Number of occurrences for a BugzScout case",
           "Opened","(date) cases opened on the date specified",
           "OpenedBy","cases last opened or reopened by the specified user",
           "OrderBy","This takes another axis as its argument and sorts the search results by that axis",
           "Outline","returns cases in the same subcase hierarchy as the specified case",
           "Parent","returns all subcases of the specified case",
           "Root","all cases in the hierarchy underneath the specified case",
           "Priority","cases with the specified priority",
           "Project","cases in the specified project",
           "ProjectGroup", "Cases in the specified project group (Requires the Project Groups Plugin",
           "RelatedTo","cases that are linked to the specified case",
           "Release","same as milestone",
           "ReleaseNotes","search cases with text in release notes, use * to see all cases with release notes",
           "RemainingTime","cases with the specified (range of) original estimate",
           "Resolved","(date) cases resolved on the date specified",
           "ResolvedBy","cases last resolved by the specified user",
           "Show","cases with the specified attribute (Read, Unread, Subscribed or Spam)",
           "StarredBy","starredby:me shows cases you have starred",
           "Status","cases with the specified status",
           "Tag","cases with the specified tag",
           "Title","cases containing the specified words in the title",
           "To","cases with email to the specified email address",
           "Version","cases containing specific text in the first custom field. Note that this field may have been renamed in your installation",
           "ViewedBy","viewedby:me shows cases you have previously viewed",

       "#Wiki Pages","Axes for Wiki Pages",
        "Edited","(date) wiki pages that were modified on the date specified",
        "EditedBy","wiki pages edited by the specified user",
        "LastEdited","(date) wiki pages that were modified on the date specified and have not been modified since then",
        "LastEditedBy","wiki pages last edited by the specified user",
        "LastViewed","(date) wiki pages that you last viewed on the date specified",
        "Show","wiki pages with the specified attribute (Read, Unread or Subscribed)",
        "StarredBy","starredby:me shows wiki pages you have starred",
        "Title","Finds wiki pages containing the specified words in the title",
        "ViewedBy","viewedby:me shows wiki pages you have previously viewed",
        "Wiki","wiki pages in the specified wiki",

       "#Discussion Topics","Axes for Discussion Topics",
           "CreatedBy","topics created by the specified user",
           "DiscussionGroup","topics in the specified discussion group",
           "Edited","(date) topics that were modified on the date specified",
           "EditedBy","topics edited by the specified user",
           "LastEdited","(date) topics modified on the date specified and which have not been modified since then",
           "LastEditedBy","topics last edited by the specified user",
           "LastViewed","(date) topics that you last viewed on the date specified",
           "Opened","(date) topics opened on the date specified",
           "Show","topics with the specified attribute (Read or Unread)",
           "StarredBy","starredby:me shows topics you have starred",
           "Title","topics containing the specified words in the title",
           "Type","type:case for cases, type:wiki for wiki pages, type:discuss for discussion topics",
           "ViewedBy","viewedby:me shows topics you have previously viewed"
       ];
}


css:

#divSearchHelper {
   background-color: white;
   border: 1px solid #000000;
   min-height:30px;
   max-height:200px;
   overflow-y: scroll;
}
#searchHelperButton {
    font-family: Sand, fantasy 
    background-color:#E0E9F1;
    border: 1px;
    cursor:hand;cursor:pointer;
}
.searchHelperItemHeader {
    cursor:hand;cursor:default;
    margin-left: 1em;
    font-weight: bold;
}
.searchHelperItem {
    cursor:hand;cursor:pointer;
    margin-left: 2em;
}
link|flag
show 1 more comment
9

name:          +Sub/Parent Case links
description:   Add new subcase/parent case quick links to the case view
author:        Adam Wishneusky, Chad McElligott, Michel de Ruiter
version:       1.3.0.0

js:

if (!window.goBug)
  return;
function getSel() {
  if        (window.getSelection)
    return   window.getSelection().toString();
  else if (document.getSelection)
    return document.getSelection().toString();
  else if (document.selection)
    return document.selection.createRange().text;
  return '';
};
function addButtons() {
  $('.icon-left.subcase,.icon-left.addparent').remove(); // Existing buttons
  if ($("ul.buttons").length == 0)
    return;
  var sLinkStart = 'default.asp?command=new&pg=pgEditBug'                +
    '&ixCategory='         +                    goBug.ixCategory         +
    '&ixProject='          +                    goBug.ixProject          +
    '&ixArea='             +                    goBug.ixArea             +
    '&ixFixFor='           +                    goBug.ixFixFor           +
    '&ixPersonAssignedTo=' +                    goBug.ixPersonAssignedTo +
    '&sCustomerEmail='     + encodeURIComponent(goBug.sCustomerEmail)    +
    '&ixPriority='         +                    goBug.ixPriority         +
    '&sTags='              + encodeURIComponent(goBug.ListTagsAsArray()) +
    '&sEvent='; // To be updated dynamically.
  var sNewButtons = '<li><a class="actionButton2 icon-left subcase" href="'   +
    sLinkStart +
    '&ixBugParent='        +                    goBug.ixBug              +
    '&b=c">Subcase</a><li>';
  if (goBug.ixBugParent == 0)
    sNewButtons +=  '<li><a class="actionButton2 icon-left addparent" href="' +
    sLinkStart +
    '&ixBugChildren='      +                    goBug.ixBug              +
    '&b=c">Parent</a></li>';
  $("ul.buttons").prepend($(sNewButtons));
}
addButtons();
$(window).on('BugViewChange', addButtons);
$(document).on('mouseup', '#bugviewContainer', function() { // Update sEvent:
  $('a.subcase,a.addparent').each(function() {
    this.setAttribute('href', this.getAttribute('href')
      .replace(/&sEvent=[^&]*/, '&sEvent=' + encodeURIComponent(getSel())));
  });
});


css:

/* Green plus sign: */
.icon-left.subcase::before,
.icon-left.addparent::before {
  background-position: 0px -163px;
  height: 16px;
}
#mainArea ul {
  font-size: 12px !important;
}
#bugviewContainer .buttonbar ul.toolbar.buttons {
  white-space: nowrap;
}
link|flag
1 
I have modified this script to work with the recent layout change (noticed when upgrading to 8.7.57.0). I will happily share, just not sure where would be best to put it. – Chad McElligott Jan 23 2012 at 16:37
show 8 more comments
7

Here's some sample javascript which can be used to replace text in bug events. I'm currently using this for creating links and replacing long urls with shorter ones within bug events.

In this sample there are two objects which I use as a poor man's replacement for hashes:

  • aRegExps contains regular expressions to match in the text of the bug event
  • aReplacements contains the replacement texts for the corresponding regexps

What these replacements do:

  • svnlink - This replaces a string in the form of SVN#revision with a link to our svn viewVC server
  • shortenlink - Replaces a very long url (we have a lot of those here) with a shorter one (note that this doesn't modify the href in the anchor tag, just the text that is displayed)
  • replaceurl - Replaces one url with another

To add more replacements just add a matching pair of aRegExps and aReplacements objects.

A couple of notes about this sample:

  • The regular expressions in the sample are obviously examples which I replaced before posting here and need to be customized.
  • Remember to escape special characters in the regexps
  • It has been mostly tested in Chrome and Firefox. No guarantees on other browsers.

Here's the sample:

Note that you need to edit the below js code to adit/add your keywords and corresponding replacements.

name:          Replace links
description:   Replaces keywords with links in BugEvents
author:        Roman Hernandez
version:       1.0

js:

var aRegExps = new Object();
var aReplacements = new Object();

aRegExps["svnlink"] = RegExp(/SVN#(\d+)/g);
aReplacements["svnlink"] = "<a href=\"http://your.svn.url/viewvc?view=rev&revision=$1\">SVN#$1</a>";

aRegExps["shortenlink"] = RegExp(/>http:\/\/some\.common\.url\/path\?link=something/g);
aReplacements["shortenlink"] = ">SVN#";

aRegExps["replaceurl"] = RegExp(/http:\/\/url\.to\.replace/g);
aReplacements["replaceurl"] = "http://replacement.url.here";

// Find all the bugevent body elements
$("div.body").each(
  function (){
     var content = $(this).html();
     var replace = false;
     for (var key in aRegExps){
       if (aRegExps[key].test(content)){
        replace = true;
        content = content.replace(aRegExps[key], aReplacements[key]);
       }    
     }
     if (replace)
       $(this).html(content);
  }
);    
link|flag
6

I've been able to create a custom menu that looks and performs exactly like the native menus in FogBugz (Filters, Schedules, Wiki, etc)

Custom Menu

http://fogbugz.stackexchange.com/questions/6471/how-to-create-a-custom-menu-in-the-menu-bar

link|flag
6

Great new script for you Chuck Norris lovers - the plugin that will freak you out! Do you want your developers to log into Fogbugz more often? Well, this will give them a real reason. Introducing the "Chuck Norris Jokes Rotator"!!

Enjoy!

name:          Chuck Norris Jokes Rotator
description:   Adds some Chuck Norris jokes on top
author:        Gal Segal
version:       1.0.0.0

js:

(function($){
  $.fn.chuckIt = function(options) {

    var plugin = function(container) {
            this.container = container;
            this.container.css({
                color: '#000',
                position:'absolute',
                top:'0',
                left:'10px',
                display:'inline'
            });
            this.options = $.extend({}, this.defaults, options);
        };

        plugin.prototype = {
            updateInterval:undefined,
            container:undefined,
            defaults: {
                interval:10000
            },
            start: function() {
                var self = this;
                $.ajax({
                  url: "http://code.icndb.com/jquery.icndb.min.js",
                  dataType: "script",
                  success: function(d) {
                        self.setInterval();
                        self.updateJoke();
                    }
                }); 
            },
            setInterval: function () {
                this.updateInterval = setInterval($.proxy(this.updateJoke, this), this.options.interval);
            },
            clearInterval: function() {
                clearInterval(this.updateInterval);
            },
            updateJoke: function() {
                var self = this;
                this.clearInterval();
                $.icndb.getRandomJoke({
                    success:function(joke){
                        console.log(self);
                        self.container.fadeOut(500, function(){
                            self.container.html(joke.joke)
                                   .fadeIn(500);
                        });     
                        self.setInterval();
                    }
                });
            }
        };

    $(this).each(function(i, v) {
        var pluginInstance = new plugin($(v));
        pluginInstance.start();
    });
  };
})(jQuery);
$(document).ready(function(){
    $('<div id="joke"></div>').appendTo('#banner').chuckIt();
});
link|flag
show 4 more comments
6

In using FogBugz, I noticed that most of the users didn't like seeing the full history of everywhere a bug had been in its storied life. For particularly old bugs, there might be a full page of "Assigned to Peter", "Assigned to Paul", "Assigned to Mary", "Milestone changed to 1.2.3" et cetera. Since people managing the bugs usually needed to see these 'empty edits' and the people fixing bugs only rarely did, I use BugMonkey to hide the 'empty edits'. I use a session cookie to remember the setting.

Also, I very rarely need to see the full header of an email. We use email as a method for our support staff to submit information about cases. As such, their email should look more like an edit and less like something else. I've reformatted the email so that the header is togglable (default to off) and the emails look more like edits. If the email is an Out of Office Autoreply, hide it.

This will also provide color coding for incoming vs. outgoing emails, so the email chain can be easily scanned for information.

Script:

name:          Hide empty edits and tidy up
description:   Hides edits with no text, optionally hides email headers, colors incoming and outgoing emails
author:        alficles, FogBugz 8 compatibility edits by Quentin Schroeder
version:       1.0.0.0

js:

// Cookie functions (mostly) stolen from some blog on the net.
function createCookie(name, value, days)
{
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name)
{
    var ca = document.cookie.split(';');
    var nameEQ = name + "=";
    for(var i=0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}
function eraseCookie(name)
{
    createCookie(name, "", -1);
}
$("div.emailHeader").parent().prepend("<div class=\"emailHeaderToggle\">Toggle Email Header</div>");
$("div.emailHeader").each(function(i) { 
    var whoEle = $(this).find("div.emailHeaderValue:first");
    var actEle = whoEle.parents("div.bugevent").find("span.action");
    var who = whoEle.text();
    var act = actEle.text();
    var nameReg = /"([^"]*)"/;
    if (!(/^Replied/.exec(act))) {
        if (nameReg.test(whoEle.text())) {
            actEle.append(" by "+nameReg.exec(who)[1]);
        }
        else {
            actEle.append(" by "+whoEle.html());
        }
    }
});
$("div.emailHeaderToggle").click(function() {
    var emailHeader = $(this).parent().find("div.emailHeader");
    var old_val = emailHeader.css("display");
    if (old_val == "block") { emailHeader.css("display","none"); }
    else { emailHeader.css("display","block"); }
});
var emptyCount = 0;
$(".bugevent").each(function() {
    var bodyEle = $(this).find(".body");
    var bodyTxt = bodyEle.text();
    if (/^[ \t\n]*$/.exec(bodyTxt)) {
        $(this).addClass("emptyBody");
        emptyCount += 1;
    }
});
$(".email .emailHeader .emailHeaderValue").each(function() {
    if (/^Out of Office AutoReply/i.exec($(this).text())) {
        $(this).parents(".bugevent").addClass("emptyBody");
        emptyCount += 1;
    }
});
if (emptyCount > 0) {
    $("#BugEvents").prepend("<div id=\"EmptyBodyToggle\">Show/Hide Empty Edits ("+emptyCount+")</div>");
}
$("#EmptyBodyToggle").click(function() {
    var old_val = $(".emptyBody").css("display");
    if (old_val == "block")
    {
        $(".emptyBody").css("display","none");
        createCookie("showEmpty","false");
    } else {
        $(".emptyBody").css("display","block");
        createCookie("showEmpty","true");
    }
});
if (readCookie("showEmpty") == "true") {
    $(".emptyBody").css("display","block");
}
$(".email").each(function() {
    var actions = this.getElementsByClassName('action');
    if (actions.length > 0)
        if (/Replied/.exec(actions[0].innerText)) {
            $(this).children('.body').addClass("outgoing");
        }
        else { // outgoing message
            $(this).children('.body').addClass("incoming");
        }
});


css:

div.emailBody {
    padding: 0px;
    background-color: inherit;
}
div.email {
    border: none;
}
div.incoming {
    background-color: #E0F5E0 !important; // green
}
div.outgoing {
    background-color: #EBF5FF !important; // blue
}
div.emailHeader {
    display: none;
    border: 1px solid #ADABA8;
    margin-bottom: 10px;
    margin-top: 5px;
}
div.editable div.emailHeader {
    display: block;
}
div.emailHeaderToggle {
    font-size: 70%;
    font-style: italic;
    color: #888;
    padding: 2px;
    cursor: pointer;
}
div.emailHeaderToggle:hover {
    text-decoration: underline;
    color: #000;
}
#EmptyBodyToggle {
    font-style: italic;
    color: #888;
    padding-bottom: 7px;
    cursor: pointer;
}
#EmptyBodyToggle:hover {
    text-decoration: underline;
    color: #000;
}
.emptyBody {
    display: none;
    padding-left: 5px;
    margin-left: 5px;
    border-left: 3px solid #d6d6d6;
}
link|flag
5

I posted a simple script to make the Project: Area on the case page into live links.

link|flag
show 1 more comment
5

I posted a script that makes the case history text that is generated when you add a subcase (e.g., Created subcase 1234) a clickable link to the subcase you're adding.

link|flag
4

Per-Project Categories:

Here's a script that adds support for per-project categories. The details are in the linked question, but basically, you just prefix any per-project categories you want to have with their associated project's name. For example, to have a "Hot Lead" category that only applies to the "Sales" project, you'd create a category called "Sales - Hot Lead". Any categories that don't have a "project prefix" are considered global categories and will be visible for all projects.

name:          Filter categories by their project prefix
description:   Allows you to create per-project categories by prefixing the category name with the project. Eg. "Sales - Hot Lead" will only apply to the "Sales" project. Categories without a project prefix (basically, those that don't contain " - " will be displayed for all projects.
author:        Dane Bertram & Daniel LeCheminant
version:       1.0.0.0

js:

var toggleProjectCategories = function(sProject){
    if(!$('#ixCategory').length) return;

    var existingIxCat = parseInt($('#ixCategory :selected').val());
    var cats = $('#ixCategory').empty();

    $(DB.Category).each(function(ix, cat){
        if(cat.fDeleted) return; // skip deleted categories
        var sCategoryPrefix = /^(.+) - (.+)/.exec(cat.sCategory); // capture the project prefix and non-prefixed category name
        if(!sCategoryPrefix || sCategoryPrefix[1] === sProject){
            // either a global category (no project prefix), or a per-project
            // category that matches the currently selected project
            var newOpt = $('<option>')
                .val(cat.ixCategory)
                .text(sCategoryPrefix ? sCategoryPrefix[2] : cat.sCategory)
                .appendTo(cats);

            // if we're transitioning into edit mode, keep the previously-selected category selected
            if(cat.ixCategory === existingIxCat) newOpt.attr('selected', 'selected');
        }
    })

    DropListControl.refresh(cats[0]);
}

var init = function(){
    $('#ixProject').change(function() {
        toggleProjectCategories($(this).find(":selected").text());
    });
    toggleProjectCategories($('#ixProject :selected').text());
}

$(window).bind("BugViewChange", init);
init();
link|flag
4

I have taken parts of Jake B's CSS code and joined it with our own Bugmonkey CSS code.

Fogbugz 7 default look (left) and the look after the redesign (right):

Screenshots here: http://img12.imageshack.us/img12/7561/fogbugz.png

/* some edited stuff from Jake B's code from http://fogbugz.stackexchange.com/questions/59/bugmonkey-script-archive/60#60 */

a.vb{color: #0F5491 !important}
a.uvb{font-weight:bold !important}
#mainArea,#mainAreaContinued{font-size:10pt !important}
.changes{padding: 0 !important;padding-left:5px !important}
#idContainer{width: 90% !important}
#www-fogcreek-com-fogbugz,#mainArea{font-family:segoe ui,arial,sans-serif;}

.buttonbar {width: 100% !important}

div.bugShadowBottom {width: 100% !important; max-width: 79em;}
#bugviewContainer {width: 100% !important}
#bugviewContainer .top .idTitleProjectAndArea {margin-left:13.5em !important}
#bugviewContainer .bugevents {margin-left:14em !important}
#bugviewContainer .bugevents .bugevent .body textarea { width:99% !important}
#BugFields, #BugMeta {width:100% !important;min-width:800px !important}
div.emailHeaderName {font-family:segoe ui,arial,sans-serif !important; font-size:8pt !important; color:#555 !important;}
div.emailHeaderValue {font-family:segoe ui,arial,sans-serif !important; font-size:8pt !important; color:#555 !important;}
div.emailBody {padding:4px!important;}

#bugviewContainer .top .row1 {width: 49.3em !important;} 
#bugviewContainer .top .row2, 
#bugviewContainer .top .row3, 
#bugviewContainer .top .rowPlugin {width: 15.5em !important} 
#bugviewContainer .top .row2 input,
#bugviewContainer .top .row3 input,
#bugviewContainer .top .rowPlugin input {width: 17em !important}
#bugviewContainer .top .plugins.edit {margin-left:0em !important; clear:left; width:100% !important;}
#bugviewContainer .top .title {font-size:1.5em !important;}
.bugTopItem3 {width: 99% !important}


#banner {border-top: 2px solid #E0E9F1 !important; border-bottom: 2px solid #E0E9F1 !important; }

.bugs tbody tr td {font-size:12px !important; color:#888 !important; }
.bugs tbody tr td a {text-decoration:none !important; }
.bugs tbody tr td a:hover {text-decoration:underline !important; }

#mainArea #bugGrid .g-r-context td a { color: #999 !important; } 
#mainArea #bugGrid .g-r-context td a.dotted { border-bottom: 1px dotted #999 !important;}

/*********************************** stuff by dirk paessler *****************************/

#BugFields, #BugMeta { width: 100%!important;}
.buttonbar{ width: 100%;}
#bugviewContainer { background-color: #F0EDE6; width:100%;}

#bugviewContainer .side { width: 175px;}
#bugviewContainer .top .ixBug {width: 180px;}
#bugviewContainer .top .row1 { width: 80%;}

div.emailHeaderValue,div.emailHeaderName{font-size:11px}

#bugviewContainer .bugevents .bugevent .summary .action { color: #555; font-weight: normal; font-size: 10px;float:left}
#bugviewContainer .bugevents .bugevent .summary .date { color: #555;  font-weight: normal; font-size: 10px;float:right}
#bugviewContainer .bugevents .bugevent .summary a:link { color: #555; text-decoration:none;font-weight:bolder}
#bugviewContainer .bugevents .bugevent .summary {background-color:#eee;border-left:1px solid#888;border-right:1px solid#888;border-top:1px solid#888;border-bottom:0px solid#888;padding:0px;padding-left:2px;padding-right:2px}
#bugviewContainer .bugevents .bugevent .changes {background-color:#fff;border-left:1px solid#888;border-right:1px solid#888;padding:0px;}

#bugviewContainer .bugevents .bugevent .summary .date { color: #666; }

#bugviewContainer .bugevents .bugevent .body {padding:0px;margin-top:0px;border-left:1px solid#888;border-right:1px solid#888;border-bottom:1px solid#888; font-size: 11px; background-color:#fff;}
#bugviewContainer .bugevents .bugevent .editable { font-size:11px; }

div.bugShadowBottom { background: none;margin:none;left:0px;width:100%!important}
div.bugShadowRight { background: none;width:100%!important}
div.bugShadowBL { background: none; width:100%!important}
div.bugShadowUR { background: none; width:100%!important}
div.bugShadowBR { background: none;width:100%!important }

textarea.bug{width:700px;font-size:11px;font-family:segoe ui,arial,sans-serif;}

#bugviewContainer .bugevents .bugevent .body textarea {width:auto;}

textarea.smallBug{width:400px;font-size:11px;font-family:segoe ui,arial,sans-serif;}

div.emailBody {font-size:11px;background-color: white;}

#bugviewContainer .bugevents .bugevent .body textarea {width:95%;padding:6px}

#bugviewContainer .bugevents .bugevent .emailHeaderValue input {width:95% !important;}

#bugviewContainer .top .row2:first-child{clear:both}

#bugviewContainer .top .ixBug {;font-family:segoe ui,arial,sans-serif;}
textarea,input,body,td,span,div{;font-family:segoe ui,arial,sans-serif!important;}

#mainnav a.navlink{;font-family:segoe ui,arial,sans-serif!important;}

#bugviewContainer .top .title {font-weight:bold}

#bugviewContainer .top #statusbarspacer {display:none}
#bugviewContainer .top {min-height:0px}
#bugviewContainer .top .ixBug{height:100px}
#bugviewContainer .top .statusbar {padding-top:0px;}
#bugviewContainer .top .title{padding:0px}
#bugviewContainer .top .idTitleProjectAndArea{min-height:0px}
.summary{height:12px!important}

div.email {border:none;border-top:1px solid #888;}
link|flag
4

I posted a couple of Tyler's BugMonkey scripts that provide visual status and/or priority columns in the list view. They use color in addition to text. :)

Visual Status and Priority columns

A = Active, R = Resolved, C = Closed

http://fogbugz.stackexchange.com/questions/8229/

link|flag
show 2 more comments
4

Prevent Blank Case Titles

This script simply disables the "OK" button when editing a case if the value of the Title field or event body is left blank. For non-logged-in users, it also requires an email address.

Note that this is only for new cases. If you want to require fields during edits, you need to hook into the BugViewChange event.

name:          Require title, event and email
description:   Cannot submit a case if the title or event is empty, and email is required for non-logged-in users
author:        Quentin Schroeder and Adam Wishneusky
version:       2.0.0.0

js:

$(document).ready(function(){
  // don't do anything if we're not on the case edit page
  if (!$('#bugviewContainer').length) return;
  // $(this).attr("title", "Facilita Support");
  var okButton = $('#Button_OKEdit')[0];
  if (!okButton) return;
  okButton.disabled = true;
  okButton.title = "Case title cannot be blank";

  var verifyFields = function(event)
  {
    var okButton = $('#Button_OKEdit')[0];
    if (($('#idBugTitleEdit')[0].value.length > 0) &&
        ($('#sEventEdit')[0].value.length > 0) &&
        (IsLoggedIn() || ($('#idDropList_sCustomerEmail_oText')[0].value.length > 0) ))
    {   
        okButton.disabled = false;
        okButton.title = "";
    } 
    else 
    {
        okButton.disabled = true;
        okButton.title = "Case title cannot be blank";
    }
    if (this.originalOnKeyUp)
      this.originalOnKeyUp(event);
  }

  // remove this if you don't want to require titles
  var titleText = $('#idBugTitleEdit')[0];
  if (titleText.onkeyup) 
    titleText.originalOnKeyUp = titleText.onkeyup;
  titleText.onkeyup = verifyFields;

  // remove this if you don't want to require event text
  var eventText = $('#sEventEdit')[0];
  if (eventText.onkeyup) 
    eventText.originalOnKeyUp = eventText.onkeyup;
  eventText.onkeyup = verifyFields;

  // remove this if you don't want to require anonymous visitors' email addresses
  if (!IsLoggedIn())
  {
    var emailText = $('#idDropList_sCustomerEmail_oText')[0];
    if (emailText.onkeyup) 
      emailText.originalOnKeyUp = emailText.onkeyup;
    emailText.onkeyup = verifyFields;
  }
});

See also this newer script which may or may not be better :P

link|flag
3

I posted a script that adds a "Toggle Hierarchies" button to the upper-right corner of the list cases page. Clicking it will collapse/expand all the case hierarchies on the page.

link|flag
show 2 more comments
3

I posted a script that will help you determine what type of user you're dealing with (Not logged in, Normal, Community, or Administrator) and the user's full name (or "Anonymous" if they're not logged in).

link|flag
3

Add the following CSS to hide the "Send & Close" and "Resolve & Close" buttons when editing a case. (The wording and function of these buttons are confusing to users and more often than not lead to incorrectly-closed cases.)

.dlgButtonWide#Button_SendAndCloseEmail { font-weight: normal; display: none; }
.dlgButtonWide#Button_ResolveAndClose { font-weight: normal; display: none; }
link|flag
show 1 more comment
3

I wanted to show which Case Events are mine. One easy way is this css line, which highlights all links to me:

a[href$='ixPerson=4'] { background-color: white; border: 1px dotted gray; }

Of course you'll have to change the number to your own ixPerson.

link|flag
show 2 more comments
3

tghw posted a script here that displays a notification real-time when someone edits a case while you're looking at it.

link|flag
3

This script makes the action button bar at the top of the case page (Edit, Reply, Resolve, etc.) stick to the top of the browser window when you scroll down the page (in view mode).

It does the same for the editor when you're in edit mode.

http://fogbugz.stackexchange.com/questions/9944/floating-action-bar-editor-on-the-case-page-so-you-can-use-them-even-if-you-scrol

link|flag
3

Problem:

We noticed that some emails we received from customers were showing up blank (i.e. without any message body) in FogBugz. After investigation, we discovered that they were using b0rked email software that was sending MIME multipart/alternative messages with an empty text/plain part, but with content in a text/html part. FogBugz sees that the message claims to have a text/plain part and picks that when it creates the bug event. Result: an empty email body.

Solution:

This customization adds a "[Show HTML Source]" link to the top of the email body in any email bug events. Clicking on that link causes the original source email to be fetched and parsed. If it is a multipart/alternative message with a text/html part, the email body in the bug event is replaced with the HTML source code.

Caveats:

  • This code supports decoding base64-encoded messages, but other transfer encodings (e.g. quoted-printable) are displayed as-is. My requirement was to get the message to the point where it was feasible for a human being to pick out the content.
  • I didn't read any specs before writing the email parsing code, so there are probably lots of corner cases that it fails to handle.
  • I haven't attempted to optimize the email parsing code at all, so it's horribly inefficient in terms of space and time. Clicking "Show HTML Source" for large email messages may bring your browser to its knees.
  • No attempt is made to convert between character encodings. If the HTML source is encoded as anything other than UTF-8, it'll be a bit of a mess.

Credits:

Code:

name:          HTML email source display
description:   Allows viewing HTML source of multipart/alternative email messages with an HTML part
author:        Andrew Molyneux, Adam Wishneusky
version:       1.0.0.0

js:

$(function() {
  // Base64 from http://www.webtoolkit.info/javascript-base64.html
  // Tweaked formatting and removed support for encoding
  var Base64 = {
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    decode : function (input) {
      var output = "";
      var chr1, chr2, chr3;
      var enc1, enc2, enc3, enc4;
      var i = 0;
      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
      while (i < input.length) {
        enc1 = this._keyStr.indexOf(input.charAt(i++));
        enc2 = this._keyStr.indexOf(input.charAt(i++));
        enc3 = this._keyStr.indexOf(input.charAt(i++));
        enc4 = this._keyStr.indexOf(input.charAt(i++));
        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;
        output = output + String.fromCharCode(chr1);
        if (enc3 != 64) {
          output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
          output = output + String.fromCharCode(chr3);
        }
      }
      output = Base64._utf8_decode(output);
      return output;
    },
    _utf8_decode : function (utftext) {
      var string = "";
      var i = 0;
      var c = c1 = c2 = 0;
      while ( i < utftext.length ) {
        c = utftext.charCodeAt(i);
        if (c < 128) {
          string += String.fromCharCode(c);
          i++;
        } else if((c > 191) && (c < 224)) {
          c2 = utftext.charCodeAt(i+1);
          string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
          i += 2;
        } else {
          c2 = utftext.charCodeAt(i+1);
          c3 = utftext.charCodeAt(i+2);
          string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
          i += 3;
        }
      }
      return string;
    }
  };
  function htmlEncode(value) {
    return $('<div/>').text(value).html();
  }
  function parseHeaders(headers) {
    var result = {};
    var lines = headers.split("\r\n");
    var lastfieldName = '';
    $.each(lines, function(i, line) {
      if (/^\s+/.test(line)) {
        result[lastFieldName] += line;
      } else {
        var parts = line.split(':');
        if (parts.length >= 2) {
          var fieldName = $.trim(parts[0]);
          var fieldValue = $.trim(parts.slice(1).join(':'));
          result[fieldName] = fieldValue;
          lastFieldName = fieldName;
        }
      }
    });
    return result;
  }
  function getHeadersAndBody(msg) {
    var parts = msg.split("\r\n\r\n");
    if (parts.length < 2) {
      return false;
    }
    var headersText = parts[0];
    var bodyText = parts.slice(1).join("\r\n\r\n");
    return {headers: parseHeaders(headersText), body: bodyText};
  }
  // Given the value of Content-Type, check if it's multipart/alternative.
  // If it is, return the boundary string. Otherwise, return false.
  function getBoundary(contentType) {
    if (!(/^multipart\/alternative/.test(contentType))) {
      return false;
    }
    var parts = contentType.split(';');
    var reBoundary = /^\s*boundary="?([^"]+)"?\s*$/;
    var result = false;
    $.each(parts, function(i, part) {
      var matches = part.match(reBoundary);
      if (matches !== null) {
        result = matches[1];
        return false;
      }
    });
    return result;
  }
  // Given the body of a multipart/alternative email message, find
  // the part with the given contentType.
  function findPart(body, boundary, contentType) {
    var reContentType = new RegExp('^' + contentType.replace('/', '\\/'));
    var parts = body.split('--' + boundary);
    var result = false;
    $.each(parts, function(i, part) {
      var message = getHeadersAndBody(part);
      if (message !== false) {
        if (reContentType.test(message.headers['Content-Type'])) {
          result = message;
          return false;
        }
      }
    });
    return result;
  }
  var reBugEventId = /^bugevent_([0-9]+)$/;
  $('.bugevent.email').each(function(i,bugEvent) {
    var bugEventId = bugEvent.id.match(reBugEventId)[1];
    $(bugEvent).find('.emailBody').each(function(i2,emailBody) {
      var linkDiv = $('<div>');
      var link = $('<a>', {href: '', text: '[Show HTML Source]'});
      link.click(function(event) {
        $.ajax({
          type:     'get',
          url:      'default.asp?pg=pgDownload&pgType=pgSource&ixBugEvent=' + bugEventId,
          dataType: 'text',
          success:  function(data) {
            var message = getHeadersAndBody(data);
            var contentType = message.headers['Content-Type'];
            var boundary = getBoundary(contentType);
            if (boundary === false) {
              link.replaceWith('<p>No HTML found.</p>');
              return;
            }
            var htmlPart = findPart(message.body, boundary, 'text/html');
            if (htmlPart === false) {
              link.replaceWith('<p>No HTML found.</p>');
              return;
            }
            var htmlBody = htmlPart.body;
            if (htmlPart.headers['Content-Transfer-Encoding'] == 'base64') {
              htmlBody = Base64.decode($.trim(htmlBody));
            }
            $(emailBody).empty();
            $(emailBody).append("<p>" + htmlEncode(htmlBody).replace(/\r\n/g,'<br>\r\n') + "</p>");
          }
        });
        return false;
      });
      linkDiv.append(link);
      $(emailBody).prepend(linkDiv);
    });
  });
});
link|flag
2

Here's what we're currently working on. This is very much a work in progress and we've got a more planned.

Some notes:

  • Adjusted the width of the case so that it fills 1/2 of a standard 22" widescreen monitor (950px), yay Windows 7!
  • Removed the dark blue borders from the header strip
  • Made some fonts bigger & more readable, replaced excessive Verdana use with some Arial (personal preference)
  • Changed the bug grid colors to be a little less overwhelming and more Gmail-y

Here's the code (just the CSS field in BugMonkey):

a.vb{color: #0F5491 !important}
a.uvb{font-weight:bold !important}
#mainArea,#mainAreaContinued{font-size:10pt !important}
.changes{padding: 0 !important}
#idContainer{width: 90% !important}
#www-fogcreek-com-fogbugz,#mainArea{font-family:Arial;}

.buttonbar {width: 100% !important}

div.bugShadowBottom {width: 100% !important; max-width: 79em;}
#bugviewContainer {width: 100% !important}
#bugviewContainer .top .ixBug {width:13em !important}
#bugviewContainer .top .idTitleProjectAndArea {margin-left:13.5em !important}
#bugviewContainer .side {width:13em !important}
#bugviewContainer .bugevents {margin-left:14em !important}
#bugviewContainer .bugevents .bugevent .body textarea { width:99% !important}
#BugFields, #BugMeta {width:100% !important}
div.emailHeaderName {font-family:arial !important; font-size:8pt !important; color:#555 !important;}
div.emailHeaderValue {font-family:arial !important; font-size:8pt !important; color:#555 !important;}
div.emailBody {font-size:10pt !important; padding:12px 10px !important;}

#bugviewContainer .top .row1 {width: 49.3em !important;} 
#bugviewContainer .top .row2, 
#bugviewContainer .top .row3, 
#bugviewContainer .top .rowPlugin {width: 15.5em !important} 
#bugviewContainer .top .row2 input,
#bugviewContainer .top .row3 input,
#bugviewContainer .top .rowPlugin input {width: 17em !important}
#bugviewContainer .top .plugins.edit {margin-left:0em !important; clear:left; width:100% !important;}
#bugviewContainer .top .title {font-size:1.5em !important;}
.bugTopItem3 {width: 99% !important}

#bugviewContainer .bugevents .bugevent .summary .action {font-size:10pt !important;}
#bugviewContainer .bugevents .bugevent .changes {font-size:10pt !important;}

#banner {border-top: 2px solid #E0E9F1 !important; border-bottom: 2px solid #E0E9F1 !important; }

.bugs tbody tr td {font-size:12px !important; color:#888 !important; }
.bugs tbody tr td a {text-decoration:none !important; }
.bugs tbody tr td a:hover {text-decoration:underline !important; }

#mainArea #bugGrid .g-r-context td a { color: #999 !important; } 
#mainArea #bugGrid .g-r-context td a.dotted { border-bottom: 1px dotted #999 !important;}
link|flag
1 
note: 7.3 introduces re-sizable case view. You can click and drag the little handles to change the width. – adambox May 17 2010 at 18:49
show 1 more comment
2

I wanted to get the contents of one special article displayed in a panel to the left of every page in a Wiki. The Wiki is a product spec, the special article is where we maintain the table of contents. Not an ideal solution, because the left panel gets cleared/reloaded with every refresh, but... here's what I did:

First, I modified that Wiki's template HTML so that there were some new div's with unique id's. The most important ones for this example are an empty container for the table of contents and a container containing only the body of the article.

HTML:
...
<div id="idTablesContainer">
</div>

<div id="idArticleContainer">
    <h1>$headline$</h1>
    <div id="idBodyContainer">$body$</div>
</div>
...

Then I modified the Wiki's template CSS to lay out the new div's (there are most likely many ways to do this nicer).

CSS:
...
#idTablesContainer, #idArticleContainer
{
    position:	absolute; 
    top:		160px; 
    bottom:		40px; 
    overflow:	auto;
}
#idTablesContainer
{
    left:		1%;
    width:		23%;
}
#idArticleContainer
{
    left:		25%;
    width:		75%; 
}
...

Next, I created the table of contents in a Wiki article (W370 in my case) and added the JavaScript to BugMonkey that would load it. There's also a function to show/hide it. I call it from an onClick attribute in a tag that I put in the HTML template.

JAVASCRIPT:
function Slide()
{
    if ($('#idTablesContainer').is (':visible'))
    {
    	$("#idTablesContainer").hide();
    	$("#idArticleContainer").animate({width: "98%",left: "1%"}, 0 );
    }
    else
    {
    	$("#idArticleContainer").animate({width: "75%",left: "25%"}, 0 );
    	$("#idTablesContainer").show();
    }
}

/* thanks to Kory Gorsky for the code I based this on */
$(document).ready(function(){
    /* only if this is a page from the customized Wiki... */
    if($("#idTablesContainer").length ) {
    	/* ...get W370 (the table of contents)... */
    	$.get("/default.asp?W370", function (data){
    		/* ... and put only the Body from the ToC into the current page's Table Container. */
    		$("#idTablesContainer").html(data).html($("#idBodyContainer").html());
    	});
    }

});
link|flag
2

I posted a script to auto-create links on the case view page for protocols other than http and https (such as ftp://, file://, telnet://, etc.).

link|flag
2

Links to UNC paths: convert [\unc\path\directory] to proper link:

if(!window.goBug) {
   var wikiBody = $("div#bodyContent").html();
   wikiBody = wikiBody.replace(/\[\\\\([^\]]+)\]/g, "<a href='file://///$1'>\\\\$1</a>");
   $("div#bodyContent").html(wikiBody);
}

Requires proper configuration of Firefox, to allow intranet links from your FogBugz server:

http://kb.mozillazine.org/Links_to_local_pages_don%27t_work

[Note: Someone please post Chrome solution, and delete this note]

link|flag
1 
There's an extension to make file:// - Links work on Chrome: chrome.google.com/extensions/detail/… – peterchen Apr 1 2011 at 8:43
show 1 more comment
2

Daniel posted a script to hide bugevents you have already seen.

link|flag
2

I posted Daniel's script to highlight cases in grid view which are overdue. It can also highlight due today and due tomorrow.

link|flag
2

Here is a short script I wrote that adds an "Edit" link next to each case in the case list/grid. This allows to quickly open several tests in a new window, already in edit mode.

link|flag
show 1 more comment
2

Inline text-based attachments

Here's a script that allows you to embed text-based attachments directly into the case view based on the file extensions you specify:

name:        Inline text-based attachments
description: Inlines the specified attachments types directly into the bug view
author:      Dane Bertram
version:     1.0.0.0
minApi:      1.0

js: 

var inlineExtensions = ['txt', 'js'];

var regex = new RegExp('\\.(' + inlineExtensions.join('|') + ')$');
$('div.attachments a[href^=default.asp?pg=pgDownload]')
.filter(function(){ return regex.test($(this).attr('href')); }) // only the extensions we want inlined
.each(function(){
    var $anchor = $(this);
    $.get($anchor.attr('href'), function(data) {
        $('<pre>')
        .css({ 'max-height' : '200px', 'border' : '1px solid #C7C7C7' })
        .text(data)
        .appendTo($anchor.parent('p'));
    });
});
link|flag
2

Just got FogBugz today, and the default case screen is terrible, so I just tweek it with a bit of CSS and I wanted to share with you if you want:

  • messages with no body will be faded out
  • focus on message it self
  • irrelevant stuff for developer is faded out

examples:

alt text

with email:

alt text

with Kiln messages:

alt text

Snippet Source:

name:          Case View for better readability
description:   Changes the Case View Layout Color
author:        Bruno Alexandre
version:       1.0.0.1

js:

   // Fadeout empty body classes (replace css opacity with .hide() if you want to hide it completely)
   $("#bugviewContainer .bugevent .body").each(function(){ if($(this).html().length == 0) { $(this).hide().parent().css("opacity", "0.6");  } });


css:

/* Top styling */
#bugviewContainer .top .title { font-size: 34px; padding: 28px 0 10px 0; text-shadow: 2px 2px 5px #C7C7C7;font-weight: bold;color: #39668E; }
#bugviewContainer .top .ixBug { float: left; color: #39668E; width: 180px; text-align: center; padding-top: 20px; }
#bugviewContainer .top #statusbarspacer { display: none; }

/* Messages styling */
#bugviewContainer .kiln,
#bugviewContainer .bugevent { background-color: #FAF1B4; padding: 0 0 10px 0; border: 1px solid #C7C7C7; border-radius: 8px 8px 0 0; box-shadow: 2px 2px 5px #AAA; }
#bugviewContainer .bugevents .bugevent .summary .action, 
#bugviewContainer .bugevents .pseudobugevent .summary .action { color: #999; }
#bugviewContainer .kiln .body,
#bugviewContainer .bugevent .body { padding: 20px 10px !important; background-color: #E1D8A2; margin: 10px 10px 10px 20px !important; border-bottom: 0px solid #F46F14; color: #222; font-family: Georgia; font-size: 16px !important; }
#bugviewContainer .kiln .changes,
#bugviewContainer .bugevent .changes { padding: 5px 20px; }
#bugviewContainer .kiln .summary,
#bugviewContainer .bugevent .summary {background-color: #F0EDE6;padding: 5px; border-radius: 8px 8px 0 0; }

#bugviewContainer .kiln { background-color: #F1F9F1; border: 1px solid #E0F1DF; }
#bugviewContainer .kiln .body { background-color: #E0F1DF; }

/* Mailing styling */
#bugviewContainer .bugevent .attachments {  }
#bugviewContainer .bugevent .email { margin: -10px !important; color: #333; }
#bugviewContainer .bugevent .email .emailHeader { background-color: #F1F1F1; }
#bugviewContainer .bugevent .email .emailBody { font-size: 11px !important; }

#bugviewContainer .idTitleProjectAndArea .subtitle,
#bugviewContainer .idTitleProjectAndArea .statusbar { opacity: 0.7; text-align: right; font-size: 11px; }
#bugviewContainer .bugevent .email .emailHeaderName,
#bugviewContainer .bugevent .email .emailHeaderValue,
#bugviewContainer .bugevent .email .emailHeaderName,
#bugviewContainer .bugevent .email .emailHeaderValue,
#bugviewContainer .bugevent .email .emailHeaderName,
#bugviewContainer .bugevent .email .emailHeaderValue,
#bugviewContainer .bugevent .email .emailHeaderName,
#bugviewContainer .bugevent .email .emailHeaderValue { font-size: 11px !important; }
#bugviewContainerSide .dialog-item-last { margin-bottom: 350px; }

/* Links styling */
#bugviewContainer .kiln .summary a:link, 
#bugviewContainer .kiln .summary a:visited, 
#bugviewContainer .kiln .summary a.novisited:visited,
#bugviewContainer .bugevent .summary a:link, 
#bugviewContainer .bugevent .summary a:visited, 
#bugviewContainer .bugevent .summary a.novisited:visited { color: #0F5491; text-decoration: none; font-weight: normal; }
#bugviewContainer .bugevent .kiln a:hover,
#bugviewContainer .bugevent .summary a:hover { text-decoration: underline; }

#bugviewContainer .kiln a:link,
#bugviewContainer .kiln a:visited { text-decoration: none; }
#bugviewContainer .kiln a:hover { text-decoration: underline; }

/* More styling? */
link|flag
show 1 more comment
1 2 3 4 next

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.