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 7e2ae5fdc..3f56d3faa 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 @@ -566,6 +566,10 @@ public abstract class ResourceAllocation extends setOriginalTotalAssigment(getAssignedHours()); } + public void removeLimitingDayAssignments() { + allocateLimitingDayAssignments(Collections.emptyList()); + } + public void allocateLimitingDayAssignments(List assignments) { assert isLimiting(); resetAssignmentsTo(assignments); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java index b66d24e07..0ec1d1ac7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/ILimitingResourceQueueModel.java @@ -109,4 +109,6 @@ public interface ILimitingResourceQueueModel { boolean userCanRead(Order order, String loginName); + void unschedule(LimitingResourceQueueElement element); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java index 3f27137e7..83c19455f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java @@ -202,7 +202,7 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { private void initializeCalendarIfAny(Resource resource) { if (resource != null) { - resourceDAO.reattach(resource); + resource.getName(); initializeCalendarIfAny(resource.getCalendar()); } } @@ -466,6 +466,20 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { return null; } + private LimitingResourceQueue retrieveQueueFromModel(LimitingResourceQueue queue) { + return findQueue(limitingResourceQueues, queue); + } + + private LimitingResourceQueue findQueue(List queues, + LimitingResourceQueue queue) { + for (LimitingResourceQueue each : limitingResourceQueues) { + if (each.getId().equals(queue.getId())) { + return each; + } + } + return null; + } + private LimitingResourceQueueElement retrieveQueueElementFromModel( LimitingResourceQueueElement element) { return findQueueElement(unassignedLimitingResourceQueueElements, @@ -591,4 +605,22 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { taskDAO.save(task); } + @Override + public void unschedule(LimitingResourceQueueElement element) { + LimitingResourceQueue queue = retrieveQueueFromModel(element.getLimitingResourceQueue()); + + queue.removeLimitingResourceQueueElement(element); + + // Set as unassigned element + element.setLimitingResourceQueue(null); + element.setStartDate(null); + element.setStartHour(0); + element.setEndDate(null); + element.setEndHour(0); + + element.getResourceAllocation().removeLimitingDayAssignments(); + unassignedLimitingResourceQueueElements.add(element); + toBeSaved.add(element); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java index b1d6ef570..d120051d3 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java @@ -34,6 +34,7 @@ import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.LimitingResourceQueueElement; import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.resources.entities.LimitingResourceQueue; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.web.common.Util; import org.navalplanner.web.limitingresources.LimitingResourcesPanel.IToolbarCommand; @@ -51,6 +52,7 @@ import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Composer; import org.zkoss.zul.Button; import org.zkoss.zul.Checkbox; +import org.zkoss.zul.Div; import org.zkoss.zul.Grid; import org.zkoss.zul.Label; import org.zkoss.zul.Messagebox; @@ -161,19 +163,8 @@ public class LimitingResourcesController implements Composer { SeveralModificators.create(new BankHolidaysMarker()), parent); } - private void updateLimitingResourceQueues() { - limitingResourcesPanel - .resetLimitingResourceQueues(limitingResourceQueueModel - .getLimitingResourceQueues()); - limitingResourcesPanel.reloadLimitingResourcesList(); - } - private LimitingResourcesPanel buildLimitingResourcesPanel() { - LimitingResourcesPanel result = new LimitingResourcesPanel( - limitingResourceQueueModel.getLimitingResourceQueues(), - timeTracker); - result.setVariable("limitingResourcesController", this, true); - return result; + return new LimitingResourcesPanel(this, timeTracker); } /** @@ -328,7 +319,7 @@ public class LimitingResourcesController implements Composer { limitingResourceQueueModel .assignLimitingResourceQueueElement(element); Util.reloadBindings(gridUnassignedLimitingResourceQueueElements); - updateLimitingResourceQueues(); + limitingResourcesPanel.reloadLimitingResourcesList(); } private Checkbox automaticQueueing( @@ -344,4 +335,14 @@ public class LimitingResourcesController implements Composer { } + public List getLimitingResourceQueues() { + return limitingResourceQueueModel.getLimitingResourceQueues(); + } + + public void unschedule(QueueTask task) { + limitingResourceQueueModel.unschedule(task.getLimitingResourceQueueElement()); + Util.reloadBindings(gridUnassignedLimitingResourceQueueElements); + task.detach(); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java index 6a837c86c..31f590947 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesPanel.java @@ -20,9 +20,8 @@ package org.navalplanner.web.limitingresources; -import static org.zkoss.ganttz.i18n.I18nHelper._; +import static org.navalplanner.web.I18nHelper._; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -61,14 +60,14 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { public String getImage(); } + private LimitingResourcesController limitingResourcesController; + private TimeTrackerComponent timeTrackerComponent; private LimitingResourcesLeftPane leftPane; private QueueListComponent queueListComponent; - private List limitingResourceQueues = new ArrayList(); - private MutableTreeModel treeModel; private TimeTracker timeTracker; @@ -84,33 +83,46 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { private LimitingDependencyList dependencyList; - public LimitingResourcesPanel(List groups, + public LimitingResourcesPanel(LimitingResourcesController limitingResourcesController, TimeTracker timeTracker) { - init(groups, timeTracker); + init(limitingResourcesController, timeTracker); } - public void init(List groups, TimeTracker timeTracker) { - limitingResourceQueues.addAll(groups); + public void init(LimitingResourcesController limitingResourcesController, + TimeTracker timeTracker) { + this.limitingResourcesController = limitingResourcesController; this.timeTracker = timeTracker; + this.setVariable("limitingResourcesController", + limitingResourcesController, true); + treeModel = createModelForTree(); timeTrackerComponent = timeTrackerForResourcesLoadPanel(timeTracker); queueListComponent = new QueueListComponent(timeTracker, treeModel); + leftPane = new LimitingResourcesLeftPane(treeModel, queueListComponent); registerNeededScripts(); } - public void resetLimitingResourceQueues(List queues) { - limitingResourceQueues = new ArrayList(); - limitingResourceQueues.addAll(queues); - } - public void reloadLimitingResourcesList() { queueListComponent.setModel(createModelForTree()); queueListComponent.invalidate(); } + private MutableTreeModel createModelForTree() { + MutableTreeModel result = MutableTreeModel + .create(LimitingResourceQueue.class); + for (LimitingResourceQueue LimitingResourceQueue : getLimitingResourceQueues()) { + result.addToRoot(LimitingResourceQueue); + } + return result; + } + + private List getLimitingResourceQueues() { + return limitingResourcesController.getLimitingResourceQueues(); + } + public ListModel getFilters() { String[] filters = new String[] { filterResources, filterCriterions }; return new SimpleListModel(filters); @@ -192,16 +204,6 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { .retrieve(); } - private MutableTreeModel createModelForTree() { - MutableTreeModel result = MutableTreeModel - .create(LimitingResourceQueue.class); - for (LimitingResourceQueue LimitingResourceQueue : this.limitingResourceQueues) { - result.addToRoot(LimitingResourceQueue); - } - return result; - } - - private TimeTrackerComponent timeTrackerForResourcesLoadPanel( TimeTracker timeTracker) { return new TimeTrackerComponent(timeTracker) { @@ -282,5 +284,8 @@ public class LimitingResourcesPanel extends HtmlMacroComponent { }; } + public void unschedule(QueueTask task) { + limitingResourcesController.unschedule(task); + } -} \ No newline at end of file +} 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 26fd57dab..078ece576 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 @@ -37,6 +37,7 @@ import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; import org.zkoss.ganttz.util.MenuBuilder; import org.zkoss.ganttz.util.MenuBuilder.ItemAction; +import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.ext.AfterCompose; import org.zkoss.zul.impl.XulElement; @@ -132,9 +133,19 @@ public class QueueComponent extends XulElement implements } } - // FIXME: Implement real unnasign operation private void unnasign(QueueTask choosen) { - choosen.detach(); + final LimitingResourcesPanel panel = getLimitingResourcesPanel(choosen.getParent()); + panel.unschedule(choosen); + } + + private LimitingResourcesPanel getLimitingResourcesPanel(Component comp) { + if (comp == null) { + return null; + } + if (comp instanceof LimitingResourcesPanel) { + return (LimitingResourcesPanel) comp; + } + return getLimitingResourcesPanel(comp.getParent()); } private static QueueTask createDivForQueueElement(IDatesMapper datesMapper, diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTask.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTask.java index 89c5e6895..45dc000a4 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTask.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTask.java @@ -64,7 +64,6 @@ public class QueueTask extends Div { + taskUid + "')"); } }); - } public LocalDate getStart() { @@ -83,4 +82,5 @@ public class QueueTask extends Div { public LimitingResourceQueueElement getLimitingResourceQueueElement() { return element; } + }