From e2412449188c5fa91efae4cbc1285666ff73b442 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 4 Sep 2009 12:40:40 +0200 Subject: [PATCH] ItEr24S10CUAsignacionCalendarioLaboralRecursoItEr23S13: Making a lot of changes to adapt the new controller to be used from the edit resource view. --- .../calendars/BaseCalendarCRUDController.java | 25 ++- .../BaseCalendarEditionController.java | 25 +-- .../web/calendars/BaseCalendarModel.java | 17 +- .../web/calendars/IBaseCalendarModel.java | 4 + .../web/calendars/ResourceCalendarModel.java | 26 ++++ .../web/resources/worker/IWorkerModel.java | 8 + .../worker/WorkerCRUDController.java | 146 +++++++++++++++++- .../web/resources/worker/WorkerModel.java | 62 +++++++- .../webapp/calendars/_createNewVersion.zul | 17 ++ .../src/main/webapp/calendars/_edition.zul | 56 +++---- .../src/main/webapp/calendars/_list.zul | 6 +- .../src/main/webapp/calendars/calendars.zul | 27 +--- .../webapp/resources/worker/_calendar.zul | 48 ++++++ .../main/webapp/resources/worker/_edition.zul | 5 + .../resources/WorkerCRUDControllerTest.java | 5 +- 15 files changed, 392 insertions(+), 85 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java create mode 100644 navalplanner-webapp/src/main/webapp/calendars/_createNewVersion.zul create mode 100644 navalplanner-webapp/src/main/webapp/resources/worker/_calendar.zul diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java index c55c9728a..1b1e12fe3 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarCRUDController.java @@ -67,7 +67,7 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); messagesForUser = new MessagesForUser(messagesContainer); - comp.setVariable("controller", this, true); + comp.setVariable("calendarController", this, true); getVisibility().showOnly(listWindow); } @@ -180,10 +180,20 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { baseCalendarModel, editWindow, createNewVersion) { @Override - protected void goToList() { + public void goToList() { BaseCalendarCRUDController.this.goToList(); } + @Override + public void cancel() { + BaseCalendarCRUDController.this.cancel(); + } + + @Override + public void save() { + BaseCalendarCRUDController.this.save(); + } + }; try { @@ -198,9 +208,18 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { createWindow, createNewVersion) { @Override - protected void goToList() { + public void goToList() { BaseCalendarCRUDController.this.goToList(); } + @Override + public void cancel() { + BaseCalendarCRUDController.this.cancel(); + } + + @Override + public void save() { + BaseCalendarCRUDController.this.save(); + } }; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarEditionController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarEditionController.java index e08620aeb..6be7cf364 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarEditionController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarEditionController.java @@ -15,9 +15,7 @@ import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.CalendarData; import org.navalplanner.business.calendars.entities.BaseCalendar.DayType; import org.navalplanner.business.calendars.entities.CalendarData.Days; -import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.web.common.IMessagesForUser; -import org.navalplanner.web.common.Level; import org.navalplanner.web.common.MessagesForUser; import org.navalplanner.web.common.Util; import org.navalplanner.web.common.components.CalendarHighlightedDays; @@ -74,7 +72,11 @@ public abstract class BaseCalendarEditionController extends this.createNewVersionWindow = createNewVersionWindow; } - protected abstract void goToList(); + public abstract void goToList(); + + public abstract void save(); + + public abstract void cancel(); @Override public void doAfterCompose(Component comp) throws Exception { @@ -530,23 +532,6 @@ public abstract class BaseCalendarEditionController extends } - public void save() { - try { - baseCalendarModel.confirmSave(); - messagesForUser.showMessage(Level.INFO, _( - "Base calendar \"{0}\" saved", baseCalendarModel - .getBaseCalendar().getName())); - goToList(); - } catch (ValidationException e) { - messagesForUser.showInvalidValues(e); - } - } - - public void cancel() { - baseCalendarModel.cancel(); - goToList(); - } - public boolean isLastVersion() { return baseCalendarModel.isLastVersion(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java index 2f24da7b2..fe5327fbf 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarModel.java @@ -18,6 +18,7 @@ import org.navalplanner.business.calendars.entities.CalendarData.Days; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -31,16 +32,17 @@ import org.springframework.transaction.annotation.Transactional; */ @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) +@Qualifier("main") public class BaseCalendarModel implements IBaseCalendarModel { /** * Conversation state */ - private BaseCalendar baseCalendar; + protected BaseCalendar baseCalendar; private Date selectedDate; - private boolean editing = false; + protected boolean editing = false; private ClassValidator baseCalendarValidator = new ClassValidator( BaseCalendar.class); @@ -401,10 +403,15 @@ public class BaseCalendarModel implements IBaseCalendarModel { @Override @Transactional(rollbackFor = ValidationException.class) public void confirmSave() throws ValidationException { - BaseCalendar entity = getBaseCalendar(); + checkInvalidValuesCalendar(getBaseCalendar()); + baseCalendarDAO.save(getBaseCalendar()); + } + @Override + public void checkInvalidValuesCalendar(BaseCalendar entity) + throws ValidationException { InvalidValue[] invalidValues = baseCalendarValidator - .getInvalidValues(entity); + .getInvalidValues(entity); if (invalidValues.length > 0) { throw new ValidationException(invalidValues); } @@ -416,8 +423,6 @@ public class BaseCalendarModel implements IBaseCalendarModel { throw new ValidationException(invalidValues2, _("Could not save new calendar")); } - - baseCalendarDAO.save(getBaseCalendar()); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java index 982912a44..717ad33a0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/IBaseCalendarModel.java @@ -46,6 +46,8 @@ public interface IBaseCalendarModel { List getBaseCalendars(); + void checkInvalidValuesCalendar(BaseCalendar entity) + throws ValidationException; /* * Initial conversation steps @@ -133,4 +135,6 @@ public interface IBaseCalendarModel { void cancel(); + + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java new file mode 100644 index 000000000..5c541a9e1 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/ResourceCalendarModel.java @@ -0,0 +1,26 @@ +package org.navalplanner.web.calendars; + +import org.navalplanner.business.calendars.entities.ResourceCalendar; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +/** + * Model for UI operations related to {@link ResourceCalendar}. + * + * @author Manuel Rego Casasnovas + */ +@Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +@Qualifier("subclass") +public class ResourceCalendarModel extends BaseCalendarModel implements + IBaseCalendarModel { + + @Override + public void initCreate() { + editing = false; + this.baseCalendar = ResourceCalendar.create(); + } + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java index e2e942e8c..b4f1db6e9 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/IWorkerModel.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.ResourceCalendar; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.CriterionSatisfaction; @@ -94,4 +96,10 @@ public interface IWorkerModel { void setWorker(Worker worker); Set getSetOfResourcesSatisfying(ICriterion criterion); + + List getBaseCalendars(); + + void setCalendar(ResourceCalendar resourceCalendar); + + ResourceCalendar getCalendar(); } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java index ff35ece33..8a6d31651 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerCRUDController.java @@ -3,12 +3,17 @@ package org.navalplanner.web.resources.worker; import static org.navalplanner.web.I18nHelper._; import static org.navalplanner.web.common.ConcurrentModificationDetector.addAutomaticHandlingOfConcurrentModification; +import java.util.Date; import java.util.List; import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.ResourceCalendar; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.entities.CriterionSatisfaction; import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.web.calendars.BaseCalendarEditionController; +import org.navalplanner.web.calendars.IBaseCalendarModel; import org.navalplanner.web.common.IMessagesForUser; import org.navalplanner.web.common.Level; import org.navalplanner.web.common.MessagesForUser; @@ -18,6 +23,8 @@ import org.navalplanner.web.common.entrypoints.IURLHandlerRegistry; import org.navalplanner.web.common.entrypoints.URLHandler; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Combobox; +import org.zkoss.zul.Radio; import org.zkoss.zul.api.Window; /** @@ -59,13 +66,22 @@ public class WorkerCRUDController extends GenericForwardComposer implements private IWorkerCRUDControllerEntryPoints workerCRUD; + private Window editCalendarWindow; + + private BaseCalendarEditionController baseCalendarEditionController; + + private IBaseCalendarModel resourceCalendarModel; + + private Window createNewVersionWindow; + public WorkerCRUDController() { } public WorkerCRUDController(Window createWindow, Window listWindow, Window editWindow, Window workRelationshipsWindow, Window addWorkRelationshipWindow, - Window editWorkRelationshipWindow, IWorkerModel workerModel, + Window editWorkRelationshipWindow, Window editCalendarWindow, + IWorkerModel workerModel, IMessagesForUser messages, IWorkerCRUDControllerEntryPoints workerCRUD) { this.createWindow = createWindow; @@ -77,6 +93,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements this.workerModel = workerModel; this.messages = messages; this.workerCRUD = workerCRUD; + this.editCalendarWindow = editCalendarWindow; } public Worker getWorker() { @@ -95,6 +112,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements public void save() { try { + baseCalendarEditionController.save(); workerModel.save(); goToList(); Util.reloadBindings(listWindow); @@ -118,11 +136,17 @@ public class WorkerCRUDController extends GenericForwardComposer implements public void goToEditForm(Worker worker) { getBookmarker().goToEditForm(worker); workerModel.prepareEditFor(worker); + if (isCalendarNotNull()) { + editCalendar(); + } getVisibility().showOnly(editWindow); Util.reloadBindings(editWindow); } public void goToEditForm() { + if (isCalendarNotNull()) { + editCalendar(); + } getVisibility().showOnly(editWindow); Util.reloadBindings(editWindow); } @@ -181,6 +205,45 @@ public class WorkerCRUDController extends GenericForwardComposer implements .getRedirectorFor(IWorkerCRUDControllerEntryPoints.class); handler.registerListener(this, page); getVisibility().showOnly(listWindow); + + editCalendarWindow = (Window) getCurrentWindow() + .getFellow("editCalendarWindow"); + createNewVersionWindow = (Window) getCurrentWindow() + .getFellow("createNewVersion"); + baseCalendarEditionController = new BaseCalendarEditionController( + resourceCalendarModel, editCalendarWindow, + createNewVersionWindow) { + + @Override + public void goToList() { + workerModel + .setCalendar((ResourceCalendar) resourceCalendarModel + .getBaseCalendar()); + reloadCurrentWindow(); + } + + @Override + public void cancel() { + resourceCalendarModel.cancel(); + workerModel.setCalendar(null); + reloadCurrentWindow(); + } + + @Override + public void save() { + workerModel + .setCalendar((ResourceCalendar) resourceCalendarModel + .getBaseCalendar()); + reloadCurrentWindow(); + } + + }; + editCalendarWindow.setVariable("calendarController", this, true); + createNewVersionWindow.setVariable("calendarController", this, true); + } + + public BaseCalendarEditionController getEditionController() { + return baseCalendarEditionController; } private void setupWorkRelationshipController( @@ -218,4 +281,85 @@ public class WorkerCRUDController extends GenericForwardComposer implements return workerCRUD; } + public List getBaseCalendars() { + return workerModel.getBaseCalendars(); + } + + public void calendarChecked(Radio radio) { + Combobox comboboxDerived = (Combobox) radio + .getFellow("createDerivedCalendar"); + Combobox comboboxCopy = (Combobox) radio + .getFellow("createCopyCalendar"); + + String selectedId = radio.getId(); + if (selectedId.equals("createFromScratch")) { + comboboxDerived.setDisabled(true); + comboboxCopy.setDisabled(true); + } else if (selectedId.equals("createDerived")) { + comboboxDerived.setDisabled(false); + comboboxCopy.setDisabled(true); + } else if (selectedId.equals("createCopy")) { + comboboxDerived.setDisabled(true); + comboboxCopy.setDisabled(false); + } + } + + public boolean isCalendarNull() { + if (workerModel.getCalendar() != null) { + return false; + } + return true; + } + + public boolean isCalendarNotNull() { + return !isCalendarNull(); + } + + public void createCalendar() { + // FIXME create different kind of calendars depending on user selection + + resourceCalendarModel.initCreate(); + workerModel.setCalendar((ResourceCalendar) resourceCalendarModel + .getBaseCalendar()); + try { + baseCalendarEditionController.doAfterCompose(editCalendarWindow); + } catch (Exception e) { + throw new RuntimeException(e); + } + + baseCalendarEditionController.setSelectedDay(new Date()); + Util.reloadBindings(editCalendarWindow); + Util.reloadBindings(createNewVersionWindow); + reloadCurrentWindow(); + } + + public void editCalendar() { + resourceCalendarModel.initEdit(workerModel.getCalendar()); + try { + baseCalendarEditionController.doAfterCompose(editCalendarWindow); + } catch (Exception e) { + throw new RuntimeException(e); + } + + baseCalendarEditionController.setSelectedDay(new Date()); + Util.reloadBindings(editCalendarWindow); + Util.reloadBindings(createNewVersionWindow); + } + + public BaseCalendarEditionController getBaseCalendarEditionController() { + return baseCalendarEditionController; + } + + private void reloadCurrentWindow() { + Util.reloadBindings(getCurrentWindow()); + } + + private Window getCurrentWindow() { + if (workerModel.isCreating()) { + return createWindow; + } else { + return editWindow; + } + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java index 70db69530..d7201ffc2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java @@ -1,5 +1,7 @@ package org.navalplanner.web.resources.worker; +import static org.navalplanner.web.I18nHelper._; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -13,6 +15,10 @@ import java.util.Set; import org.apache.commons.lang.Validate; import org.hibernate.validator.ClassValidator; import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.calendars.daos.IBaseCalendarDAO; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.CalendarData; +import org.navalplanner.business.calendars.entities.ResourceCalendar; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.resources.daos.ICriterionDAO; @@ -26,14 +32,14 @@ import org.navalplanner.business.resources.entities.Interval; import org.navalplanner.business.resources.entities.PredefinedCriterionTypes; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.web.calendars.IBaseCalendarModel; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import static org.navalplanner.web.I18nHelper._; - /** * Model for worker
* @author Óscar González Fernández @@ -46,6 +52,9 @@ public class WorkerModel implements IWorkerModel { @Autowired private IResourceDAO resourceDAO; + @Autowired + private IBaseCalendarDAO baseCalendarDAO; + private final ICriterionType[] laboralRelatedTypes = { PredefinedCriterionTypes.LEAVE, PredefinedCriterionTypes.WORK_RELATIONSHIP }; @@ -56,6 +65,13 @@ public class WorkerModel implements IWorkerModel { private IMultipleCriterionActiveAssigner localizationsAssigner; + private ClassValidator baseCalendarValidator = new ClassValidator( + BaseCalendar.class); + + @Autowired + @Qualifier("subclass") + private IBaseCalendarModel baseCalendarModel; + @Autowired public WorkerModel(IResourceDAO resourceDAO, ICriterionDAO criterionDAO) { @@ -69,6 +85,9 @@ public class WorkerModel implements IWorkerModel { @Override @Transactional public void save() throws ValidationException { + if (worker.getCalendar() != null) { + baseCalendarModel.checkInvalidValuesCalendar(worker.getCalendar()); + } InvalidValue[] invalidValues = workerValidator .getInvalidValues(getWorker()); if (invalidValues.length > 0) { @@ -108,6 +127,7 @@ public class WorkerModel implements IWorkerModel { try { this.worker = (Worker) resourceDAO.find(worker.getId()); forceLoadSatisfactions(this.worker); + forceLoadCalendar(this.worker); localizationsAssigner = new MultipleCriterionActiveAssigner( criterionDAO, this.worker, PredefinedCriterionTypes.LOCATION_GROUP); @@ -124,6 +144,22 @@ public class WorkerModel implements IWorkerModel { } } + private void forceLoadCalendar(Worker worker) { + if (worker.getCalendar() != null) { + forceLoadCalendar(worker.getCalendar()); + } + } + + private void forceLoadCalendar(BaseCalendar baseCalendar) { + for (CalendarData calendarData : baseCalendar.getCalendarDataVersions()) { + calendarData.getHoursPerDay().size(); + if (calendarData.getParent() != null) { + forceLoadCalendar(calendarData.getParent()); + } + } + baseCalendar.getExceptions().size(); + } + @Override @Transactional(readOnly = true) public AddingSatisfactionResult addSatisfaction(ICriterionType type, @@ -409,4 +445,26 @@ public class WorkerModel implements IWorkerModel { } return result; } + + @Override + @Transactional(readOnly = true) + public List getBaseCalendars() { + return baseCalendarDAO.getBaseCalendars(); + } + + @Override + public void setCalendar(ResourceCalendar resourceCalendar) { + if (worker != null) { + worker.setCalendar(resourceCalendar); + } + } + + @Override + public ResourceCalendar getCalendar() { + if (worker != null) { + return worker.getCalendar(); + } + return null; + } + } diff --git a/navalplanner-webapp/src/main/webapp/calendars/_createNewVersion.zul b/navalplanner-webapp/src/main/webapp/calendars/_createNewVersion.zul new file mode 100644 index 000000000..efb8cd3d9 --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/calendars/_createNewVersion.zul @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/calendars/calendars.zul b/navalplanner-webapp/src/main/webapp/calendars/calendars.zul index fac06e8e7..e7a8076b6 100644 --- a/navalplanner-webapp/src/main/webapp/calendars/calendars.zul +++ b/navalplanner-webapp/src/main/webapp/calendars/calendars.zul @@ -9,6 +9,7 @@ + - + arg0="@{calendarController.baseCalendar.name}"/>