diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueComponent.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueComponent.java index f51e1cb6c..63e4be0eb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueComponent.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueComponent.java @@ -30,6 +30,7 @@ import java.util.Set; import java.util.SortedSet; import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.planner.entities.DayAssignment; @@ -263,6 +264,23 @@ public class QueueComponent extends XulElement implements result.setClass(cssClass); + Task task = queueElement.getResourceAllocation().getTask(); + if (task.getDeadline() != null) { + Div deadline = new Div(); + deadline.setId("deadline" + result.getUuid()); + deadline.setSclass("deadline"); + deadline + .setStyle("left:" + + getDeadlinePixels(datesMapper, task.getDeadline()) + + "px"); + + result.appendChild(deadline); + result.appendChild(generateNonWorkableShade(datesMapper, + queueElement)); + } + + result.appendChild(generateCompletionShade(datesMapper, queueElement)); + return result; } @@ -296,6 +314,31 @@ public class QueueComponent extends XulElement implements return notWorkableHoursShade; } + private static Div generateCompletionShade(IDatesMapper datesMapper, + LimitingResourceQueueElement queueElement) { + + int workableHours = queueElement.getLimitingResourceQueue() + .getResource().getCalendar().getCapacityAt( + queueElement.getEndDate()); + + int shadeWidth = new Long((24 - workableHours) + * DatesMapperOnInterval.MILISECONDS_PER_HOUR + / datesMapper.getMilisecondsPerPixel()).intValue(); + + int shadeLeft = new Long((workableHours - queueElement.getEndHour()) + * DatesMapperOnInterval.MILISECONDS_PER_HOUR + / datesMapper.getMilisecondsPerPixel()).intValue() + + shadeWidth; + ; + Div notWorkableHoursShade = new Div(); + notWorkableHoursShade.setContext(""); + notWorkableHoursShade.setSclass("limiting-completion"); + + notWorkableHoursShade.setStyle("left: " + shadeLeft + "px; width: " + + shadeWidth + "px;"); + return notWorkableHoursShade; + } + private static int getWidthPixels(IDatesMapper datesMapper, LimitingResourceQueueElement queueElement) { return datesMapper.toPixels(getEndMillis(queueElement) @@ -307,6 +350,13 @@ public class QueueComponent extends XulElement implements + (queueElement.getStartHour() * DatesMapperOnInterval.MILISECONDS_PER_HOUR); } + private static int getDeadlinePixels(IDatesMapper datesMapper, + LocalDate deadlineDate) { + return datesMapper.toPixelsAbsolute((deadlineDate.toDateMidnight() + .getMillis())); + } + + private static long getEndMillis(LimitingResourceQueueElement queueElement) { return queueElement.getEndDate().toDateMidnight().getMillis() + (queueElement.getEndHour() * DatesMapperOnInterval.MILISECONDS_PER_HOUR); diff --git a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css index 67ea87b8e..fdd84690d 100644 --- a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css +++ b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css @@ -1052,6 +1052,17 @@ div.z-tree { } + +.queue-element .deadline { + position: auto; + margin-top: -5px; + float:left; + left:-100px; /* Hide when it has't been set */ + width:10px; + height:22px; + background-image: url("../../zkau/web/ganttz/img/deadline.png"); +} + body .perspectives-column { display:inline; }