diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java index fda8a090a..cf65c7aa9 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java @@ -389,7 +389,8 @@ public class LeftTasksTreeRow extends GenericForwardComposer { private boolean canChangeStartDate() { return disabilityConfiguration.isMovingTasksEnabled() - && task.canBeExplicitlyMoved(); + && task.canBeExplicitlyMoved() + && !task.isLimitingAndHasDayAssignments(); } private boolean canChangeEndDate() { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java index dc569d8bc..e83630720 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java @@ -61,7 +61,7 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties long lengthMilliseconds, String notes, Date hoursAdvanceEndDate, Date advanceEndDate, - BigDecimal hoursAdvancePercentage, BigDecimal advancePercentage) { + BigDecimal hoursAdvancePercentage, BigDecimal advancePercentage) { this.name = name; this.beginDate = beginDate.getTime(); this.lengthMilliseconds = lengthMilliseconds; @@ -167,6 +167,14 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties return false; } + public boolean isLimiting() { + return false; + } + + public boolean isLimitingAndHasDayAssignments() { + return false; + } + @Override public boolean canBeExplicitlyResized() { return true; diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java index f0adfb582..aea7171ff 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java @@ -78,6 +78,10 @@ public interface ITaskFundamentalProperties { public boolean isSubcontracted(); + public boolean isLimiting(); + + public boolean isLimitingAndHasDayAssignments(); + public boolean canBeExplicitlyResized(); public String getAssignedStatus(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java index 877bcff3f..e16e9eb2a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -311,6 +311,14 @@ public abstract class Task implements ITaskFundamentalProperties { return fundamentalProperties.isSubcontracted(); } + public boolean isLimiting() { + return fundamentalProperties.isLimiting(); + } + + public boolean isLimitingAndHasDayAssignments() { + return fundamentalProperties.isLimitingAndHasDayAssignments(); + } + public boolean canBeExplicitlyResized() { return fundamentalProperties.canBeExplicitlyResized(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskLeaf.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskLeaf.java index a6f0a805b..06b6a3644 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskLeaf.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/TaskLeaf.java @@ -54,7 +54,7 @@ public class TaskLeaf extends Task { @Override public boolean canBeExplicitlyMoved() { - return !isSubcontracted(); + return !(isSubcontracted() || isLimitingAndHasDayAssignments()); } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java index e23f19e30..3d64e0982 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java @@ -552,6 +552,10 @@ public abstract class ResourceAllocation extends return getLimitingResourceQueueElement() != null; } + public boolean isLimitingAndHasDayAssignments() { + return isLimiting() && hasAssignments(); + } + public boolean isSatisfied() { return hasAssignments(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java index d661bfb16..23392aec5 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -181,6 +181,16 @@ public class Task extends TaskElement { return !(getLimitingResourceAllocations().isEmpty()); } + private ResourceAllocation getAssociatedLimitingResourceAllocation() { + Set> resourceAllocations = getLimitingResourceAllocations(); + return (resourceAllocations.size() > 0) ? resourceAllocations.iterator().next() : null; + } + + public boolean isLimitingAndHasDayAssignments() { + ResourceAllocation resourceAllocation = getAssociatedLimitingResourceAllocation(); + return (resourceAllocation != null) ? resourceAllocation.isLimitingAndHasDayAssignments() : false; + } + public void addResourceAllocation(ResourceAllocation resourceAllocation) { addResourceAllocation(resourceAllocation, true); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java index 45644ad55..648e10488 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -409,6 +409,14 @@ public abstract class TaskElement extends BaseEntity { return false; } + public boolean isLimiting() { + return false; + } + + public boolean isLimitingAndHasDayAssignments() { + return false; + } + public TaskElement getTopMost() { TaskElement result = this; while (result.getParent() != null) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java index 9ece3fe7a..ccdebfb8e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java @@ -561,6 +561,16 @@ public class TaskElementAdapter implements ITaskElementAdapter { return taskElement.isSubcontracted(); } + @Override + public boolean isLimiting() { + return taskElement.isLimiting(); + } + + @Override + public boolean isLimitingAndHasDayAssignments() { + return taskElement.isLimitingAndHasDayAssignments(); + } + private void stepsBeforePossibleReallocation() { taskDAO.reattach(taskElement); reattachAllResourcesForTask(); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingAllocationRow.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingAllocationRow.java index e16c5ce8b..a21fdfa34 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingAllocationRow.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingAllocationRow.java @@ -234,4 +234,8 @@ public class LimitingAllocationRow { && resourceAllocation instanceof GenericResourceAllocation; } + public boolean hasDayAssignments() { + return resourceAllocation.hasAssignments(); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingResourceAllocationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingResourceAllocationController.java index 6d9c1af67..5a3c53508 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingResourceAllocationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/LimitingResourceAllocationController.java @@ -68,6 +68,8 @@ public class LimitingResourceAllocationController extends GenericForwardComposer private Tab tabLimitingResourceAllocation; + private Tab tabLimitingWorkerSearch; + private Grid gridLimitingOrderElementHours; private Grid gridLimitingAllocations; @@ -93,6 +95,7 @@ public class LimitingResourceAllocationController extends GenericForwardComposer IMessagesForUser messagesForUser) { try { resourceAllocationModel.init(task); + tabLimitingWorkerSearch.setDisabled(existsResourceAllocationWithDayAssignments()); limitingNewAllocationSelector.setAllocationsAdder(resourceAllocationModel); gridLimitingOrderElementHours.setModel(new ListModelList( resourceAllocationModel.getHoursAggregatedByCriteria())); @@ -173,7 +176,9 @@ public class LimitingResourceAllocationController extends GenericForwardComposer } private Intbox intboxHours(final LimitingAllocationRow resourceAllocation) { - return bindToHours(new Intbox(), resourceAllocation); + Intbox result = bindToHours(new Intbox(), resourceAllocation); + result.setDisabled(resourceAllocation.hasDayAssignments()); + return result; } private Intbox bindToHours(Intbox intbox, final LimitingAllocationRow resourceAllocation) { @@ -195,7 +200,9 @@ public class LimitingResourceAllocationController extends GenericForwardComposer } private Listbox listboxPriority(final LimitingAllocationRow resourceAllocation) { - return bindToPriority(buildPriorityList(resourceAllocation.getPriority()), resourceAllocation); + Listbox result = bindToPriority(buildPriorityList(resourceAllocation.getPriority()), resourceAllocation); + result.setDisabled(resourceAllocation.hasDayAssignments()); + return result; } private Listbox buildPriorityList(int selectedValue) { @@ -238,4 +245,17 @@ public class LimitingResourceAllocationController extends GenericForwardComposer } + public boolean existsResourceAllocationWithDayAssignments() { + final LimitingAllocationRow limitingAllocationRow = getLimitingAllocationRow(); + return (limitingAllocationRow != null) ? limitingAllocationRow + .hasDayAssignments() : false; + } + + private LimitingAllocationRow getLimitingAllocationRow() { + final List limitingAllocationRows = resourceAllocationModel + .getResourceAllocationRows(); + return (limitingAllocationRows.size() > 0) ? limitingAllocationRows + .get(0) : null; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java index cce341ac8..021194e49 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java @@ -184,6 +184,12 @@ public class TaskPropertiesController extends GenericForwardComposer { setOldState(null); originalState = getResourceAllocationType(currentTaskElement); + final boolean disabled = currentTaskElement.isSubcontracted() + || currentTaskElement.isLimitingAndHasDayAssignments(); + startConstraintTypes.setDisabled(disabled); + startConstraintDate.setDisabled(disabled); + lbResourceAllocationType.setDisabled(disabled); + taskEditFormComposer.init(context.getRelativeTo(), context.getTask()); updateComponentValuesForTask(); } @@ -335,6 +341,7 @@ public class TaskPropertiesController extends GenericForwardComposer { } }); + } private boolean thereIsTransition(ResourceAllocationTypeEnum newState) { diff --git a/navalplanner-webapp/src/main/webapp/planner/_tabPanelLimitingResourceAllocation.zul b/navalplanner-webapp/src/main/webapp/planner/_tabPanelLimitingResourceAllocation.zul index 4e8189475..36cf489f1 100644 --- a/navalplanner-webapp/src/main/webapp/planner/_tabPanelLimitingResourceAllocation.zul +++ b/navalplanner-webapp/src/main/webapp/planner/_tabPanelLimitingResourceAllocation.zul @@ -28,8 +28,13 @@ - - + + + @@ -77,8 +82,8 @@ - - + +