diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationCommand.java new file mode 100644 index 000000000..01a17239b --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationCommand.java @@ -0,0 +1,47 @@ +package org.navalplanner.web.planner; + +import static org.navalplanner.web.I18nHelper._; + +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.planner.entities.TaskElement; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.zkoss.ganttz.extensions.IContextWithPlannerTask; + +/** + * A command that opens a window to make the calendar allocation of a task. + * + * @author Manuel Rego Casasnovas + */ +@Component +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class CalendarAllocationCommand implements ICalendarAllocationCommand { + + private CalendarAllocationController calendarAllocationController; + + public CalendarAllocationCommand() { + } + + @Override + public void doAction(IContextWithPlannerTask context, + TaskElement task) { + if (task instanceof Task) { + this.calendarAllocationController.showWindow((Task) task, context + .getTask()); + } + } + + @Override + public String getName() { + return _("Calendar allocation"); + } + + @Override + public void setCalendarAllocationController( + CalendarAllocationController calendarAllocationController) { + this.calendarAllocationController = calendarAllocationController; + } + + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationController.java new file mode 100644 index 000000000..a9017095e --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationController.java @@ -0,0 +1,87 @@ +package org.navalplanner.web.planner; + +import java.util.List; + +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.web.common.Util; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.SuspendNotAllowedException; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Combobox; +import org.zkoss.zul.Comboitem; +import org.zkoss.zul.Window; + +/** + * Controller for allocate one calendar to a task view. + * + * @author Manuel Rego Casasnovas + */ +@org.springframework.stereotype.Component("calendarAllocationController") +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class CalendarAllocationController extends GenericForwardComposer { + + private ICalendarAllocationModel calendarAllocationModel; + + private Window window; + + private Combobox calendarCombo; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + window = (Window) comp; + } + + public void showWindow(Task task, org.zkoss.ganttz.data.Task task2) { + calendarAllocationModel.setTask(task); + + calendarCombo = (Combobox) window.getFellow("calendarCombo"); + fillCalendarComboAndMarkSelected(); + + try { + Util.reloadBindings(window); + window.doModal(); + } catch (SuspendNotAllowedException e) { + throw new RuntimeException(e); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private void fillCalendarComboAndMarkSelected() { + calendarCombo.getChildren().clear(); + BaseCalendar assignedCalendar = calendarAllocationModel + .getAssignedCalendar(); + + List calendars = calendarAllocationModel + .getBaseCalendars(); + for (BaseCalendar calendar : calendars) { + Comboitem item = new org.zkoss.zul.Comboitem(calendar.getName()); + item.setValue(calendar); + calendarCombo.appendChild(item); + if ((assignedCalendar != null) + && calendar.getId().equals(assignedCalendar.getId())) { + calendarCombo.setSelectedItem(item); + } + } + } + + public void assign(Comboitem comboitem) { + BaseCalendar calendar = (BaseCalendar) comboitem.getValue(); + calendarAllocationModel.confirmAssignCalendar(calendar); + window.setVisible(false); + } + + public void cancel() { + calendarAllocationModel.cancel(); + window.setVisible(false); + } + + public BaseCalendar getAssignedCalendar() { + return calendarAllocationModel.getAssignedCalendar(); + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationModel.java new file mode 100644 index 000000000..75bcef2c0 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/CalendarAllocationModel.java @@ -0,0 +1,54 @@ +package org.navalplanner.web.planner; + +import java.util.List; + +import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.planner.entities.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Model for UI operations related to calendar allocation popup. + * + * @author Manuel Rego Casasnovas + */ +@Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class CalendarAllocationModel implements ICalendarAllocationModel { + + @Autowired + private IBaseCalendarDAO baseCalendarDAO; + + private Task task; + + @Override + @Transactional(readOnly = true) + public List getBaseCalendars() { + return baseCalendarDAO.getBaseCalendars(); + } + + @Override + public void setTask(Task task) { + this.task = task; + } + + @Override + public void confirmAssignCalendar(BaseCalendar calendar) { + task.setCalendar(calendar); + } + + @Override + public BaseCalendar getAssignedCalendar() { + return task.getCalendar(); + } + + @Override + public void cancel() { + task = null; + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ICalendarAllocationCommand.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ICalendarAllocationCommand.java new file mode 100644 index 000000000..8f5719b3f --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ICalendarAllocationCommand.java @@ -0,0 +1,16 @@ +package org.navalplanner.web.planner; + +import org.navalplanner.business.planner.entities.TaskElement; +import org.zkoss.ganttz.extensions.ICommandOnTask; + +/** + * Contract for {@link CalendarAllocationCommand}. + * + * @author Manuel Rego Casasnovas + */ +public interface ICalendarAllocationCommand extends ICommandOnTask { + + void setCalendarAllocationController( + CalendarAllocationController calendarAllocationController); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ICalendarAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ICalendarAllocationModel.java new file mode 100644 index 000000000..51121e10c --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ICalendarAllocationModel.java @@ -0,0 +1,25 @@ +package org.navalplanner.web.planner; + +import java.util.List; + +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.planner.entities.Task; + +/** + * Contract for {@link CalendarAllocationModel}. + * + * @author Manuel Rego Casasnovas + */ +public interface ICalendarAllocationModel { + + List getBaseCalendars(); + + void setTask(Task task); + + void confirmAssignCalendar(BaseCalendar calendar); + + void cancel(); + + BaseCalendar getAssignedCalendar(); + +} 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 53d509c58..9efc85ca9 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 @@ -17,6 +17,7 @@ public interface IOrderPlanningModel { ResourceAllocationController resourceAllocationController, EditTaskController editTaskController, SplittingController splittingController, + CalendarAllocationController calendarAllocationController, IConfigurationOnTransaction onTransaction); } 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 ef7c450f6..3105429bb 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 @@ -46,6 +46,9 @@ public class OrderPlanningController implements private Planner planner; + @Autowired + private CalendarAllocationController calendarAllocationController; + public OrderPlanningController() { } @@ -53,6 +56,7 @@ public class OrderPlanningController implements public void showSchedule(Order order) { model.createConfiguration(order, resourceAllocationController, editTaskController, splittingController, + calendarAllocationController, new IConfigurationOnTransaction() { @Override @@ -73,4 +77,8 @@ public class OrderPlanningController implements return splittingController; } + public CalendarAllocationController getCalendarAllocationController() { + return calendarAllocationController; + } + } 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 cfc636928..74491f2bd 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 @@ -1,5 +1,7 @@ package org.navalplanner.web.planner; +import static org.navalplanner.web.I18nHelper._; + import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -18,8 +20,6 @@ import org.springframework.transaction.annotation.Transactional; import org.zkoss.ganttz.adapters.IStructureNavigator; import org.zkoss.ganttz.adapters.PlannerConfiguration; -import static org.navalplanner.web.I18nHelper._; - /** * @author Óscar González Fernández */ @@ -51,6 +51,7 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { ResourceAllocationController resourceAllocationController, EditTaskController editTaskController, SplittingController splittingController, + CalendarAllocationController calendarAllocationController, IConfigurationOnTransaction onTransaction) { Order orderReloaded = reload(order); if (!orderReloaded.isSomeTaskElementScheduled()) @@ -79,6 +80,11 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { editTaskCommand.setEditTaskController(editTaskController); configuration.setEditTaskCommand(editTaskCommand); + ICalendarAllocationCommand calendarAllocationCommand = getCalendarAllocationCommand(); + calendarAllocationCommand + .setCalendarAllocationController(calendarAllocationController); + configuration.addCommandOnTask(calendarAllocationCommand); + onTransaction.use(configuration); } @@ -159,6 +165,8 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel { protected abstract IEditTaskCommand getEditTaskCommand(); + protected abstract ICalendarAllocationCommand getCalendarAllocationCommand(); + private Order reload(Order order) { try { return orderDAO.find(order.getId()); diff --git a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml index 3ff7acedc..c92e99c8a 100644 --- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml +++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml @@ -22,6 +22,7 @@ + diff --git a/navalplanner-webapp/src/main/webapp/planner/order.zul b/navalplanner-webapp/src/main/webapp/planner/order.zul index 75009bf85..f4eafb5f1 100644 --- a/navalplanner-webapp/src/main/webapp/planner/order.zul +++ b/navalplanner-webapp/src/main/webapp/planner/order.zul @@ -17,6 +17,7 @@ planningController = orderPlanningController; allocationController = planningController.resourceAllocationController; splittingTaskController = planningController.splittingController; + calendarController = planningController.calendarAllocationController; ]]> @@ -138,6 +139,31 @@ + + + + +