Jira Agile: Estimated/Remaining Time for each team member in Planning or Work board

I am looking for a way to see the current work load (estimated time for all tasks in the sprint) during the planning or at least work phase of each individual team member on a glance.

Background:

We are using Jira with Greenhopper. In the old Agile boards, it was posible to sort the Planning Board by user and view the total time estimates for the selected Sprint for each user.

The new agile boards do not support this. I have found a Timesheet addin that would allow seeing the worked hours after the sprint, but I need an overview over an upcoming or current sprint.

What I would like to see is a report or view that would show me this information at a glance. It should be able to do so before the sprint has started (or completed), because it's needed in the planning phase. I considered using the Work board (since it lists hours on each task and I could manually note things), but unfortunately that only works for running sprints.

20 answers

1 accepted

This widget could not be displayed.

Agreed. Not having this feature makes it very difficult

This widget could not be displayed.

I think I was able to get what you are looking for by using the Worload Pie Gadget configured to show current estimate for future sprints (based on a filter for the future sprint tasks) by assignee.

Thanks this is helfpul, but this would be a lot more usefull in the agile view

From what I can tell, it is compatible with the agile greenhopper plugin and can be used on the same dashboard along side the greenhopper burndown gadget.

This solution works for me. It requires setting up a new filter each sprint (because the sprint in planning is not in openSprints()), but otherwise, it does what we need it to do.

Can you please extend a bit on how you tweaked the pie chart? So far I only could get it to display the number of issues per user, even though every single issue has a time estimate. Thanks!

There are several things you can configure. 1) The filter you want to use. That could be smoething like "openSprints()" or a specific sprint you searched for. 2) Statistic Type: This may be what you need to configure. You may want to enter assigne (I think that's the English term for it, I am using a German version of the board, there it is "Bearbeiter".) 3) Time field to report on: Current Estimate is usually the best, I think, becauseit means it will stay informative during the sprint, and the beginning of th esprint, Original and Current Estimate are the same. 4) Interval: Whatever works for you ;)

Thanks for the quick answer. I think I see the problem now. The pie chart doesn´t offer me the "Time field to report on" you are talking to me about. Is this something you got from a plug-in? Thanks again

Ok, the reason was that I was using the normal pie chart and not the Workload pie chart. I had to install the Jira Charting Plugin to see it. Everything is solved now. Thanks for the help.

This is pretty late but I came across this thread in a Google search, so this may be helpful to someone else. In your filter, use "sprint in openSprints() AND sprint not in futureSprints()" to target your active sprint.

This widget could not be displayed.

We are also looking for this functionality: "I am looking for a way to see the current work load (estimated time for all tasks in the sprint) during the planning phase of each individual team member on a glance."

We are looking for exactly the same thing. It would be great if you could add beside the sum of the issues in the Work when you set the swimlane to assingees.

This widget could not be displayed.

We want something like this.. Where it totals the count of the issues as well as the number of days. It is really annoying have to switch back to Classic (which doesn't actually work for sprints).

This widget could not be displayed.

I agree, some sort of widget / report that breaks down the amount of time remaining by person and task would be great.

While the work board can get you this information, you have to manually total up (from what I can see) and lose the quick at a glance that a more compact report can give.

This widget could not be displayed.

Hi Robert, how do you get the chart to show Current Estimate instead of the count of Issues?

This widget could not be displayed.

To all who may want to get updates regarding implementation of this feature, here are the related tickets in our JIRA:

- GHS-1333 As a team manager I would like to be able to plan my capacitiy/utilization per team member (assignee)

- GHS-9689 Support preassigning work to specialists

This widget could not be displayed.

We use a little solution here, little jquery to copy paste in your annoncement banner.  If someone have better way (with only jquery, there's other way I know) you can add your inputs!

Requirement :

  • add reamining estimate column in card layout in config.  I use regex in the html page and not rest to poke the issue so no perf hit.

 

function throttle(fn, time) {
    var t = 0;
    return function() {
        var args = arguments,
            ctx = this;
        clearTimeout(t);
        t = setTimeout(function() {
            fn.apply(ctx, args);
        }, time);
    };
}
function getDaysWeeks(hours) {
    return {
        weeks: Math.floor(hours / (5 * 8)),
        days: Math.floor((hours  % (5 * 8))/8),
        hours: hours % 8
    };
}
AJS.$(document).ready(function () {
document.addEventListener("DOMSubtreeModified", throttle(function() { //rajoute un listener sur les changement dans la page html pour repartir le script a chaque 100 ms
            //var username = AJS.$('#header-details-user-fullname').attr('data-username');  //ajouter si vous voulez un IF username
             //if (username == 'martin.poirier@ubisoft.com') {
		
                var path = window.location.pathname;
                if (path.substring(path.lastIndexOf('/') + 1).indexOf('RapidBoard') > -1) {
                    try {
                        totalday = 0;
                        totalhour = 0;
                        totalweek = 0;
						totalminute = 0;
                        var activesptring = AJS.$('.ghx-backlog-container.ghx-sprint-active').find('.ghx-issues')
                        AJS.$("span[data-tooltip*='day']", activesptring).each(function() {
                            totalday += parseInt(AJS.$(this).text().match(/(\d*).(?=day)/));
                        });
                        AJS.$("span[data-tooltip*='hour']", activesptring).each(function() {
                            totalhour += parseInt(AJS.$(this).text().match(/(\d*).(?=hour)/));
                        });
                        AJS.$("span[data-tooltip*='week']", activesptring).each(function() {
                
                            totalweek += parseInt(AJS.$(this).text().match(/(\d*).(?=week)/));
                        });
						AJS.$("span[data-tooltip*='minute']", activesptring).each(function() {                       
                            totalminute += parseInt(AJS.$(this).text().match(/(\d*).(?=minute)/));
                        });
                        totalremaininginhours = 0
                        if (totalweek != 0) {
                            totalremaininginhours += totalweek * 5 * 8
                        }
						 if (totalminute > 59) {
                            totalremaininginhours += Math.floor(totalminute / 60)
                        }
                        if (totalday != 0) {
                            totalremaininginhours += totalday * 8
                        }
                        if (totalhour != 0) {
                            totalremaininginhours += totalhour
                        }
                        var objRemaining = getDaysWeeks(totalremaininginhours);
						var weeks = ""
						var days = ""
						var hours = ""
//console.log(objRemaining);
                        var actions = AJS.$('.ghx-badge-group.ghx-right');  
var rowemptylist = AJS.$('[class="aui-badge ubiadded"]').text()
if (rowemptylist == undefined || rowemptylist == "")  // Si le box de no issue drag and drop est pas la encore
{				
AJS.$(actions).prepend('<span class="aui-badge ubiadded" title="Remaining estimate">' + objRemaining.weeks + 'w ' + objRemaining.days + 'd ' + objRemaining.hours + 'h</span>');
}
else
{
AJS.$('[class="aui-badge ubiadded"]').remove()
AJS.$(actions).prepend('<span class="aui-badge ubiadded" title="Remaining estimate">' + objRemaining.weeks + 'w ' + objRemaining.days + 'd ' + objRemaining.hours + 'h</span>');
}
                    } catch (ex) {
                      console.log("ERROR:" + ex);
                    }
                } //end of if path string
            // } //end of if username
//******************* CODE FOR THE WINDOWS ADDING COLOMNS REAMINING ESTIMATE
if (AJS.$('.form-body.ghx-assigned-work-table th').length < 4) //check si la colonne existe deja.. (par le nombre)
{
 try {
var estimatetable = AJS.$('.form-body.ghx-assigned-work-table');  
var firstthead = estimatetable.find('tr').eq(0);
AJS.$('<th class="ghx-right">Remaining Time Estimate</th>').appendTo(firstthead);
grandtotalremaininghours = 0;
estimatetable.find('tbody  > tr').each(function() { //chaque ligne..
currentuser = AJS.$(this).find('td:first').text() //first td avec le nom du user 
 var totalhour = 0;
 var totalweek = 0;
 var totalminute = 0;
 var totalday = 0;
 
 var activesptring = AJS.$('.ghx-backlog-container.ghx-sprint-active').find('.ghx-issues') //regarder dans la page pour le active sprint
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='day']").each(function() {
             totalday += parseInt(AJS.$(this).text().match(/(\d*).(?=day)/));
        });
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='week']").each(function() {
             totalweek += parseInt(AJS.$(this).text().match(/(\d*).(?=week)/));
        });
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='hour']").each(function() {
             totalhour += parseInt(AJS.$(this).text().match(/(\d*).(?=hour)/));
        });
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='minute']").each(function() {
             totalminute += parseInt(AJS.$(this).text().match(/(\d*).(?=minute)/));
        });
totalremaininginhours = 0
                        if (totalweek != 0) {
                            totalremaininginhours += totalweek * 5 * 8
                        }
						 if (totalminute > 59) {
                            totalremaininginhours += Math.floor(totalminute / 60)
                        }
                        if (totalday != 0) {
                            totalremaininginhours += totalday * 8
                        }
                        if (totalhour != 0) {
                            totalremaininginhours += totalhour
                        }
						grandtotalremaininghours += totalremaininginhours
                        var objRemaining = getDaysWeeks(totalremaininginhours);
var weeks = ""	
var days = ""	
var hours = ""					    
if (objRemaining.weeks != 0)
weeks = objRemaining.weeks + 'w '
if (objRemaining.days != 0)
days = objRemaining.days + 'd '
if (objRemaining.hours != 0)
hours = objRemaining.hours + 'h'

if ((weeks || days || hours) != "")
{
AJS.$(this).append('<td class="ghx-right">'+weeks + days + hours + '</td>')	
}	
else
AJS.$(this).append('<td class="ghx-right">0</td>')	
});
var objgrandtotalremaining = getDaysWeeks(grandtotalremaininghours);
if (objgrandtotalremaining.weeks != 0)
weeks = objgrandtotalremaining.weeks + 'w '
if (objgrandtotalremaining.days != 0)
days = objgrandtotalremaining.days + 'd '
if (objgrandtotalremaining.hours != 0)
hours = objgrandtotalremaining.hours + 'h'
if ((weeks || days || hours) != "")
estimatetable.find('tfoot  > tr:last').append('<td class="ghx-right">'+weeks + days + hours + '</td>')	
else
estimatetable.find('tfoot  > tr:last').append('<td class="ghx-right">0</td>')	
 } catch (ex) {
                      console.log("ERROR:" + ex);
                    }
 }
//***  END CODE REMAINING CODE ESTIMATE
         },100 ), false ); //})); //end listener
}); //end ready

 

This will add 2 things:remainingjquery.png

 

</script>

Have fun

Martin Poirier

Ubisoft

Thanks Martin!

Works for me (having some bugs in the calc in the summery window...)

Hi, great solution! Works perfect for me. Only a question: is there a way to hide the "Remaining Estimate" filed in card layout with the your script?

I need this because every card is enlarged and the backlog is more difficult to view.

Can you help me?

This solution is great, but it didn't work for us as-is because our users did not have an avatar set in their account (first initial displayed instead). We had to modify how the "currentUser" is fetched, and look for "span" and not just "img". Otherwise, we would get remaining times with values of 0.

The first part of the fix is to the currentUser code. This looks for the text portion of the td node only (otherwise, the first letter in the user's name would be included twice).

currentuser = AJS.$(this).find('td:first').contents().filter(function(){ return this.nodeType === 3; }).text();

 

Here's the second part of the fix.

var imgOrSpan = AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring);
if (!imgOrSpan.length) {
	imgOrSpan = AJS.$("span[data-tooltip*='" + currentuser + "']", activesptring);
}
imgOrSpan = imgOrSpan.parent().parent().parent();
imgOrSpan.find("span[data-tooltip*='day']").each(function() {
	totalday += parseInt(AJS.$(this).text().match(/(\d*).(?=day)/));
});
imgOrSpan.find("span[data-tooltip*='week']").each(function() {
	totalweek += parseInt(AJS.$(this).text().match(/(\d*).(?=week)/));
});
imgOrSpan.find("span[data-tooltip*='hour']").each(function() {
	totalhour += parseInt(AJS.$(this).text().match(/(\d*).(?=hour)/));
});
imgOrSpan.find("span[data-tooltip*='minute']").each(function() {
	totalminute += parseInt(AJS.$(this).text().match(/(\d*).(?=minute)/));
});
This widget could not be displayed.

I am currently Open Question Reminders, and yes, the question is still open, I am not aware of any features that would allow me to see estimated time/remaining time by team member.

This widget could not be displayed.

If it is available to you, Agile > Classic ..., is the only way I have found to see this information. This is not very useful as the Classic version is no longer being updated or supported AND it also goes off of FixVersion rather than Sprint. We are creating a version for each sprint which allows us to track it thus. Hopefully a Sprint based solution will be implemented.

One other workaround I just discovered is to make a Quick Filter for each of your Developers which will filter issues assigned to them and then show the sum of the estimates.

I am more looking for plugins or funtionality in Jira Agile then workarounds.

As a workaround, this search query would give you each developers task and then you have to compute manually (is tedious, e.g. would be somethnig you'd want a plugin for)

assignee = [developername] AND type = "[task type for work tasks*]" AND Sprint = "[sprint number]"

*) If you make any distinctions in this regard.

The ability to add each participant to the sprint, plan the team's capacity and see as we plan the sprint each participant's workload is a very important feature.

When will this be made available?

This widget could not be displayed.

We are looking for the same functionality.

This widget could not be displayed.

Hi everyone,

We have just released JIRA Agile integration for our plugin Intelligent Reports. You can easily get this information into a report using the plugin. Simply design your report visually in Microsoft Word, then use simple point and click rules to fill in the data and estimates. No scripting or API to learn.

There is even an included example "Sprint timesheet" report which displays the hours logged in a sprint after the sprint, which is similar except it reports logged hours instead of estimates.

Report is not something that can be used during spring planning.

This widget could not be displayed.

We also need to see

  1. An assignee on each issue in the sprint backlog, if available
  2. Grouping per assignee with estimation and remaining total sum
  3. Capacity in hours per team member per sprint to see how it copes with the plan

I am very surprised these basic features are not implemented. Even TFS has this now.

This widget could not be displayed.

I see that Tempo Planner has been released. Browsing over the materials I can not find a definate answer to wether this will solve this problem we are all having. Since Tempo Planner is only available on Jira 6 and above I am not able to test it out.

Anyone able to give this a test? If we could add the Tempo Planner tag to the question maybe those guys have an answer.

Hi David,

We @Tempoare looking into this problem and will report here when we have a solution.

Cheers,
Viðar

Hi,

Tempo Planner does show you the estimate and assignee information for an iteration. This works great with JIRA Agile. See screenshot here for example: https://tempoplugin.jira.com/wiki/display/PLANNER/Team+Backlog

Better docs about this feature will be available soon!

As I see it, the issue is that this screen is completely separate from the JIRA Agile sprint planning screen.

It is but we are doing a few things to make it more user friendly. The first is that you can perform many of the actions that you do on the sprint planning screen in the Planner screen. But we have other ideas and if you like to share some suggestions then we would love to hear them.

This widget could not be displayed.

The best means of answering the question, "How much time does each resource have in the sprint container we're working?" is to setup a Workload Pie gadget on a dashboard and use a filter like this - note use of the JQL function, futureSprints(). This will sum all subtasks in all sprints (containers) that have not been started yet. In my example, I'm including a cateogry of projects to include along with exluding two subtask issue types in the counts. This way, at sprint planning, we can stuff everyone up to capacity by referring to this pie chart, and then officially, "Start" the sprint.

category = A-Team AND
issuetype in subTaskIssueTypes() AND
issuetype not in ("Standup Meeting", "Sprint Mgmt") AND
Sprint in futureSprints()
ORDER BY assignee ASC, progress ASC, key ASC

This widget could not be displayed.

Looking for the same thing as well.

This widget could not be displayed.

Hi Viðar,

It doesn't look like Tempo is available for could/onDemand. Do you have plans to make a cloud version?

Thanks,
Greg

Tempo comes pre-installed with JIRA Cloud, you'll only need to activate it. Go to JIRA Admin > Add-ons > Manage add-ons and look up Tempo Timesheets, and click Free trial there to start using it.

Not the Tempo Planner

You are correct. Planner is not yet available for JIRA Cloud but the team is working hard on getting it there.

This widget could not be displayed.

It seems far fetched to try to come with workarounds for what should be a given feature for a project management/planning tool. In my case, I am not allowed to apply add-ins and to have our JIRA admin do anything requires about a thousand sign-offs

To me a simple solution would be to create quick filters for each resource and then to dynamically adjust the traffic light timings in the top right hand corner in plan mode and add this to each swim lane too (since I can show each resource per swim lane). Easily seeing how much time each resource has allocated to them has to be bread and butter for any planning tool surely??

This widget could not be displayed.

How I can get the totals of remaining time when there are sub-tasks associated with an issue.

This widget could not be displayed.

There is a little drop-down in the bottom right corner of the chart window, and if you select it, Edit is an option. On the Edit window you can select Current Estimate.

Suggest an answer

Log in or Sign up to answer
Community showcase
Published Apr 22, 2018 in Jira Software

How-to setup a secured Jira Software 7.9.0 on Ubuntu 16.04.4 in less than 30 minutes

...PermissionsStartOnly=true User=www-data Group=www-data ExecStart=/opt/jira/bin/startup.sh ExecStop=/opt/jira/bin/shutdown.sh TimeoutStartSec=120 TimeoutStopSec=600 PrivateTmp=true [Install] WantedBy...

1,479 views 10 12
Read article

Atlassian User Groups

Connect with like-minded Atlassian users at free events near you!

Find a group

Connect with like-minded Atlassian users at free events near you!

Find my local user group

Unfortunately there are no AUG chapters near you at the moment.

Start an AUG

You're one step closer to meeting fellow Atlassian users at your local meet up. Learn more about AUGs

Groups near you