From 6aa76be16f977c1fc1c871a4205e6858283feabc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Thu, 30 Jul 2009 14:06:46 +0200 Subject: [PATCH] ItEr18S09CUCreacionProxectoPlanificacionItEr17S10: Showing popup for splitting hours. --- .../web/planner/IOrderPlanningModel.java | 1 + .../web/planner/ISplitTaskCommand.java | 2 + .../web/planner/OrderPlanningController.java | 10 ++- .../web/planner/OrderPlanningModel.java | 2 + .../navalplanner/web/planner/ShareBean.java | 68 ++++++++++++++++ .../web/planner/SplitTaskCommand.java | 37 +++++++-- .../web/planner/SplittingController.java | 81 +++++++++++++++++++ .../src/main/webapp/planner/order.zul | 25 ++++++ 8 files changed, 218 insertions(+), 8 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ShareBean.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplittingController.java diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java index 36e4cd446..d74d780ed 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/IOrderPlanningModel.java @@ -16,6 +16,7 @@ public interface IOrderPlanningModel { void createConfiguration(Order order, ResourceAllocationController resourceAllocationController, EditTaskController editTaskController, + SplittingController splittingController, ConfigurationOnTransaction onTransaction); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISplitTaskCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISplitTaskCommand.java index 650887da1..2127f36c7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISplitTaskCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ISplitTaskCommand.java @@ -7,4 +7,6 @@ public interface ISplitTaskCommand extends ICommandOnTask { public void setState(PlanningState planningState); + public void setSplitWindowController(SplittingController splittingController); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java index 9eb86eb5c..f0b1d1ba5 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningController.java @@ -23,10 +23,14 @@ public class OrderPlanningController implements @Autowired private ResourceAllocationController resourceAllocationController; + @Autowired + private SplittingController splittingController; + public ResourceAllocationController getResourceAllocationController() { return resourceAllocationController; } + @Autowired private EditTaskController editTaskController; @@ -48,7 +52,7 @@ public class OrderPlanningController implements @Override public void showSchedule(Order order) { model.createConfiguration(order, resourceAllocationController, - editTaskController, + editTaskController, splittingController, new ConfigurationOnTransaction() { @Override @@ -65,4 +69,8 @@ public class OrderPlanningController implements handler.registerListener(this, planner.getPage()); } + public SplittingController getSplittingController() { + return splittingController; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java index b18ca3e2b..e72884512 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/OrderPlanningModel.java @@ -48,6 +48,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { public void createConfiguration(Order order, ResourceAllocationController resourceAllocationController, EditTaskController editTaskController, + SplittingController splittingController, ConfigurationOnTransaction onTransaction) { Order orderReloaded = reload(order); if (!orderReloaded.isSomeTaskElementScheduled()) @@ -66,6 +67,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { ISplitTaskCommand splitCommand = getSplitCommand(); splitCommand.setState(planningState); + splitCommand.setSplitWindowController(splittingController); configuration.addCommandOnTask(splitCommand); IMergeTaskCommand mergeCommand = getMergeTaskCommand(); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ShareBean.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ShareBean.java new file mode 100644 index 000000000..c650fad52 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ShareBean.java @@ -0,0 +1,68 @@ +package org.navalplanner.web.planner; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; + +public class ShareBean { + + public static int[] toHours(ShareBean... shares) { + Validate.noNullElements(shares); + int[] result = new int[shares.length]; + for (int i = 0; i < result.length; i++) { + result[i] = shares[i].getHours(); + } + return result; + } + + public static int sum(Collection shareBeans) { + Validate.noNullElements(shareBeans); + int result = 0; + for (ShareBean shareBean : shareBeans) { + result += shareBean.getHours(); + } + return result; + } + + public static List toShareBeans(String name, int[] hours) { + ArrayList result = new ArrayList(); + for (int i = 0; i < hours.length; i++) { + ShareBean s = new ShareBean(); + s.setName(name + "." + (i + 1)); + s.setHours(hours[i]); + result.add(s); + } + return result; + } + + private String name; + + private Integer hours; + + public ShareBean() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + if (StringUtils.isEmpty(name)) + return; + this.name = name; + } + + public Integer getHours() { + return hours; + } + + public void setHours(Integer share) { + if (share == null || share <= 0) + return; + this.hours = share; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplitTaskCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplitTaskCommand.java index 48cfafb40..e38f0cb03 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplitTaskCommand.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplitTaskCommand.java @@ -1,8 +1,11 @@ package org.navalplanner.web.planner; +import java.util.List; + import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; +import org.navalplanner.web.planner.SplittingController.ActionOnOk; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -13,6 +16,7 @@ import org.zkoss.ganttz.extensions.IContextWithPlannerTask; public class SplitTaskCommand implements ISplitTaskCommand { private PlanningState planningState; + private SplittingController splittingController; @Override public void setState(PlanningState planningState) { @@ -20,17 +24,31 @@ public class SplitTaskCommand implements ISplitTaskCommand { } @Override - public void doAction(IContextWithPlannerTask context, - TaskElement taskElement) { + public void doAction(final IContextWithPlannerTask context, + final TaskElement taskElement) { if (!taskElement.isLeaf()) { // TODO show some message if this action is not aplyable return; } - Task task = (Task) taskElement; - TaskGroup newGroup = task.split(createTwoEqualShares(taskElement)); - context.replace(task, newGroup); - planningState.removed(taskElement); - planningState.added(newGroup); + final Task task = (Task) taskElement; + int[] shares = createTwoEqualShares(taskElement); + splittingController.show( + ShareBean.toShareBeans(task.getName(), shares), task + .getWorkHours(), new ActionOnOk() { + + @Override + public void doOkAction(ShareBean[] shares) { + TaskGroup newGroup = task.split(ShareBean + .toHours(shares)); + List children = newGroup.getChildren(); + for (int i = 0; i < shares.length; i++) { + children.get(i).setName(shares[i].getName()); + } + context.replace(task, newGroup); + planningState.removed(taskElement); + planningState.added(newGroup); + } + }); } private int[] createTwoEqualShares(TaskElement taskElement) { @@ -44,4 +62,9 @@ public class SplitTaskCommand implements ISplitTaskCommand { return "Split task"; } + @Override + public void setSplitWindowController(SplittingController splittingController) { + this.splittingController = splittingController; + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplittingController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplittingController.java new file mode 100644 index 000000000..f9d49882a --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/SplittingController.java @@ -0,0 +1,81 @@ +package org.navalplanner.web.planner; + +import java.util.List; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.zkoss.zk.ui.WrongValueException; +import org.zkoss.zk.ui.util.Clients; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Label; +import org.zkoss.zul.SimpleListModel; +import org.zkoss.zul.Window; +import org.zkoss.zul.api.Grid; + +@Component +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class SplittingController extends GenericForwardComposer { + + private ActionOnOk curentAction; + private Window window; + + private Grid sharesListing; + + private Label totalHoursLabel; + private List sharesList; + private Integer totalHours; + + public interface ActionOnOk { + public void doOkAction(ShareBean[] shares); + } + + public void show(List initialSharesList, Integer totalHours, + ActionOnOk ok) { + this.sharesList = initialSharesList; + this.totalHours = totalHours; + this.curentAction = ok; + this.totalHoursLabel.setValue(totalHours + ""); + this.sharesListing.setModel(new SimpleListModel(initialSharesList)); + showWindow(); + } + + public void onClick$splitOk() { + checkSumIsEqualToTotal(); + Clients.closeErrorBox(totalHoursLabel); + hideWindow(); + curentAction.doOkAction(this.sharesList.toArray(new ShareBean[0])); + } + + private void checkSumIsEqualToTotal() { + int sum = ShareBean.sum(sharesList); + if (sum != totalHours) { + throw new WrongValueException(totalHoursLabel, + "the sum is not equal: " + sum); + } + } + + public void onClick$splitCancel() { + hideWindow(); + } + + private void showWindow() { + try { + window.setMode("modal"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private void hideWindow() { + window.setVisible(false); + } + + @Override + public void doAfterCompose(org.zkoss.zk.ui.Component comp) throws Exception { + super.doAfterCompose(comp); + window = (Window) comp; + + } + +} diff --git a/navalplanner-webapp/src/main/webapp/planner/order.zul b/navalplanner-webapp/src/main/webapp/planner/order.zul index 8d105bbbb..c11a84f46 100644 --- a/navalplanner-webapp/src/main/webapp/planner/order.zul +++ b/navalplanner-webapp/src/main/webapp/planner/order.zul @@ -11,6 +11,7 @@ @@ -84,6 +85,30 @@ + + + + + + + + + + + + + + + + + +