From ee71f16b57dfacb4b774a0d1333a06f11e0f526d Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 4 Sep 2009 12:40:38 +0200 Subject: [PATCH] ItEr24S10CUAsignacionCalendarioLaboralRecursoItEr23S13: Creating a new controller that could be used from other parts of the application. --- .../calendars/BaseCalendarCRUDController.java | 511 ++-------------- .../BaseCalendarEditionController.java | 564 ++++++++++++++++++ .../web/calendars/BaseCalendarModel.java | 2 +- .../src/main/webapp/calendars/_edition.zul | 56 +- .../src/main/webapp/calendars/calendars.zul | 8 +- 5 files changed, 645 insertions(+), 496 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarEditionController.java 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 552b22d44..f2cba46e2 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 @@ -2,19 +2,10 @@ package org.navalplanner.web.calendars; import static org.navalplanner.web.I18nHelper._; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.apache.commons.lang.StringUtils; -import org.joda.time.LocalDate; 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; @@ -23,28 +14,19 @@ import org.navalplanner.web.common.OnlyOneVisible; import org.navalplanner.web.common.Util; import org.navalplanner.web.common.components.CalendarHighlightedDays; import org.zkoss.zk.ui.Component; -import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; -import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; -import org.zkoss.zul.Checkbox; import org.zkoss.zul.Combobox; import org.zkoss.zul.Comboitem; -import org.zkoss.zul.Intbox; import org.zkoss.zul.Label; -import org.zkoss.zul.Listcell; -import org.zkoss.zul.Listitem; -import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.SimpleTreeNode; -import org.zkoss.zul.Tab; import org.zkoss.zul.Treecell; import org.zkoss.zul.Treeitem; import org.zkoss.zul.TreeitemRenderer; import org.zkoss.zul.Treerow; -import org.zkoss.zul.api.Datebox; import org.zkoss.zul.api.Window; /** @@ -68,19 +50,17 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { private boolean confirmingRemove = false; - private boolean creatingNewVersion = false; - private OnlyOneVisible visibility; private IMessagesForUser messagesForUser; private Component messagesContainer; - private HoursPerDayRenderer hoursPerDayRenderer = new HoursPerDayRenderer(); - private BaseCalendarsTreeitemRenderer baseCalendarsTreeitemRenderer = new BaseCalendarsTreeitemRenderer(); - private HistoryVersionsRenderer historyVersionsRenderer = new HistoryVersionsRenderer(); + private BaseCalendarEditionController createController; + + private BaseCalendarEditionController editionController; public BaseCalendar getBaseCalendar() { return baseCalendarModel.getBaseCalendar(); @@ -105,6 +85,7 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { } public void goToEditForm(BaseCalendar baseCalendar) { + assignEditionController(); baseCalendarModel.initEdit(baseCalendar); if (baseCalendarModel.isDerived()) { prepareParentCombo(); @@ -186,6 +167,7 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { } public void goToCreateForm() { + assignCreateController(); baseCalendarModel.initCreate(); setSelectedDay(new Date()); highlightDaysOnCalendar(); @@ -193,180 +175,54 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { Util.reloadBindings(createWindow); } - private OnlyOneVisible getVisibility() { - if (visibility == null) { - visibility = new OnlyOneVisible(listWindow, createWindow, - editWindow); - } - return visibility; - } - public void setSelectedDay(Date date) { baseCalendarModel.setSelectedDay(date); reloadDayInformation(); } - public Date getSelectedDay() { - Date selectedDay = baseCalendarModel.getSelectedDay(); - if (selectedDay == null) { - return new Date(); - } - return selectedDay; - } + private void assignEditionController() { + editionController = new BaseCalendarEditionController( + baseCalendarModel, editWindow, createNewVersion) { - public String getTypeOfDay() { - DayType typeOfDay = baseCalendarModel.getTypeOfDay(); - if (typeOfDay == null) { - return ""; - } - - switch (typeOfDay) { - case ANCESTOR_EXCEPTION: - return _("Derived excpetion"); - case OWN_EXCEPTION: - return _("Exception"); - case ZERO_HOURS: - return _("Not working day"); - case NORMAL: - default: - return _("Normal"); - } - } - - public Integer getHoursOfDay() { - return baseCalendarModel.getHoursOfDay(); - } - - public void createException() { - Component exceptionHoursIntbox; - if (baseCalendarModel.isEditing()) { - exceptionHoursIntbox = editWindow.getFellow("exceptionHours"); - } else { - exceptionHoursIntbox = createWindow.getFellow("exceptionHours"); - } - - Integer hours = ((Intbox) exceptionHoursIntbox).getValue(); - - if (hours < 0) { - throw new WrongValueException( - exceptionHoursIntbox, - _("Hours for an exception day should be greater or equal than zero")); - } else { - Clients.closeErrorBox(exceptionHoursIntbox); - baseCalendarModel.createException(hours); - reloadDayInformation(); - } - } - - public List getHoursPerDay() { - return Arrays.asList(Days.values()); - } - - public boolean isNotExceptional() { - return !baseCalendarModel.isExceptional(); - } - - public void removeException() { - baseCalendarModel.removeException(); - - reloadDayInformation(); - } - - public HoursPerDayRenderer getHoursPerDayRenderer() { - return hoursPerDayRenderer; - } - - public class HoursPerDayRenderer implements ListitemRenderer { - - @Override - public void render(Listitem item, Object data) throws Exception { - final Days day = (Days) data; - - Listcell labelListcell = new Listcell(); - labelListcell.appendChild(new Label(day.toString())); - item.appendChild(labelListcell); - - Listcell hoursListcell = new Listcell(); - final Intbox intBox = new Intbox(); - Intbox hoursIntbox = Util.bind(intBox, - new Util.Getter() { - - @Override - public Integer get() { - return baseCalendarModel.getHours(day); - } - }, new Util.Setter() { - - @Override - public void set(Integer value) { - try { - baseCalendarModel.setHours(day, value); - } catch (IllegalArgumentException e) { - throw new WrongValueException(intBox, e - .getMessage()); - } - } - }); - - hoursIntbox.addEventListener(Events.ON_CHANGE, new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - reloadDayInformation(); - } - - }); - - if (isDateValidFromPast()) { - hoursIntbox.setDisabled(true); - } else if (baseCalendarModel.isDerived() - && baseCalendarModel.isDefault(day)) { - hoursIntbox.setDisabled(true); + @Override + protected void goToList() { + BaseCalendarCRUDController.this.goToList(); } - hoursListcell.appendChild(hoursIntbox); - item.appendChild(hoursListcell); + }; - if (baseCalendarModel.isDerived()) { - Listcell defaultListcell = new Listcell(); - Checkbox defaultCheckbox = Util.bind(new Checkbox(), - new Util.Getter() { - - @Override - public Boolean get() { - return baseCalendarModel.isDefault(day); - } - }, new Util.Setter() { - - @Override - public void set(Boolean value) { - if (value) { - baseCalendarModel.setDefault(day); - } else { - baseCalendarModel.unsetDefault(day); - } - } - }); - defaultCheckbox.addEventListener(Events.ON_CHECK, - new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - reloadCurrentWindow(); - } - - }); - - if (isDateValidFromPast()) { - defaultCheckbox.setDisabled(true); - } - - defaultListcell.appendChild(defaultCheckbox); - item.appendChild(defaultListcell); - } + try { + editionController.doAfterCompose(editWindow); + } catch (Exception e) { + throw new RuntimeException(e); } + } + private void assignCreateController() { + createController = new BaseCalendarEditionController(baseCalendarModel, + createWindow, createNewVersion) { + + @Override + protected void goToList() { + BaseCalendarCRUDController.this.goToList(); + } + + }; + + try { + createController.doAfterCompose(createWindow); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private OnlyOneVisible getVisibility() { + if (visibility == null) { + visibility = new OnlyOneVisible(listWindow, createWindow, + editWindow); + } + return visibility; } private void reloadCurrentWindow() { @@ -388,6 +244,7 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { } public void goToCreateDerivedForm(BaseCalendar baseCalendar) { + assignCreateController(); baseCalendarModel.initCreateDerived(baseCalendar); if (baseCalendarModel.isDerived()) { prepareParentCombo(); @@ -442,17 +299,6 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { }); } - public boolean isDerived() { - return baseCalendarModel.isDerived(); - } - - public String getCalendarType() { - if (baseCalendarModel.isDerived()) { - return _("Derived"); - } - return _("Normal"); - } - public List getParentCalendars() { return baseCalendarModel.getPossibleParentCalendars(); } @@ -461,46 +307,8 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { return baseCalendarModel.isEditing(); } - public Date getDateValidFrom() { - return baseCalendarModel.getDateValidFrom(); - } - - public void setDateValidFrom(Date date) { - Component component = editWindow.getFellow("dateValidFrom"); - - try { - baseCalendarModel.setDateValidFrom(date); - } catch (IllegalArgumentException e) { - throw new WrongValueException(component, e.getMessage()); - } catch (UnsupportedOperationException e) { - throw new WrongValueException(component, e.getMessage()); - } - Clients.closeErrorBox(component); - baseCalendarModel.setSelectedDay(date); - Util.reloadBindings(editWindow); - } - - public Date getExpiringDate() { - return baseCalendarModel.getExpiringDate(); - } - - public void setExpiringDate(Date date) { - Component component = editWindow.getFellow("expiringDate"); - - try { - baseCalendarModel.setExpiringDate((new LocalDate(date)).plusDays(1) - .toDateTimeAtStartOfDay().toDate()); - } catch (IllegalArgumentException e) { - throw new WrongValueException(component, e.getMessage()); - } catch (UnsupportedOperationException e) { - throw new WrongValueException(component, e.getMessage()); - } - Clients.closeErrorBox(component); - baseCalendarModel.setSelectedDay(date); - Util.reloadBindings(editWindow); - } - public void goToCreateCopyForm(BaseCalendar baseCalendar) { + assignCreateController(); baseCalendarModel.initCreateCopy(baseCalendar); if (baseCalendarModel.isDerived()) { prepareParentCombo(); @@ -594,235 +402,12 @@ public class BaseCalendarCRUDController extends GenericForwardComposer { } - public List getHistoryVersions() { - return baseCalendarModel.getHistoryVersions(); - } - - private Map getDaysCurrentMonthByType() { - LocalDate currentDate = new LocalDate(baseCalendarModel - .getSelectedDay()); - - LocalDate minDate = currentDate.dayOfMonth().withMinimumValue(); - LocalDate maxDate = currentDate.dayOfMonth().withMaximumValue(); - - List ancestorExceptionsDays = new ArrayList(); - List ownExceptionDays = new ArrayList(); - List zeroHoursDays = new ArrayList(); - List normalDays = new ArrayList(); - - for (LocalDate date = minDate; date.compareTo(maxDate) <= 0; date = date - .plusDays(1)) { - DayType typeOfDay = baseCalendarModel.getTypeOfDay(date); - if (typeOfDay != null) { - switch (typeOfDay) { - case ANCESTOR_EXCEPTION: - ancestorExceptionsDays.add(date.getDayOfMonth()); - break; - case OWN_EXCEPTION: - ownExceptionDays.add(date.getDayOfMonth()); - break; - case ZERO_HOURS: - zeroHoursDays.add(date.getDayOfMonth()); - break; - case NORMAL: - default: - normalDays.add(date.getDayOfMonth()); - break; - } - } + public BaseCalendarEditionController getEditionController() { + if (isEditing()) { + return editionController; + } else { + return createController; } - - Map result = new HashMap(); - - result.put(DayType.ANCESTOR_EXCEPTION, StringUtils.join( - ancestorExceptionsDays, ",")); - result.put(DayType.OWN_EXCEPTION, StringUtils.join(ownExceptionDays, - ",")); - result.put(DayType.ZERO_HOURS, StringUtils.join(zeroHoursDays, ",")); - result.put(DayType.NORMAL, StringUtils.join(normalDays, ",")); - - return result; - } - - public String getAncestorExceptionDays() { - return getDaysCurrentMonthByType().get(DayType.ANCESTOR_EXCEPTION); - } - - public String getOwnExceptionDays() { - return getDaysCurrentMonthByType().get(DayType.OWN_EXCEPTION); - } - - public String getZeroHoursDays() { - return getDaysCurrentMonthByType().get(DayType.ZERO_HOURS); - } - - public void goToDate(Date date) { - setSelectedDay(date); - - ((Tab) editWindow.getFellow("dataTab")).setSelected(true); - Util.reloadBindings(editWindow); - } - - public boolean isDateValidFromPast() { - if (!isEditing()) { - return false; - } - - Date dateValidFrom = baseCalendarModel.getDateValidFrom(); - if (dateValidFrom != null) { - return isPast(dateValidFrom); - } - - return true; - } - - private boolean isPast(Date date) { - LocalDate localDate = new LocalDate(date); - LocalDate currentLocalDate = new LocalDate(); - return localDate.compareTo(currentLocalDate) <= 0; - } - - public boolean isSelectedDateFromPast() { - Date selectedDay = baseCalendarModel.getSelectedDay(); - if (selectedDay != null) { - return isPast(selectedDay); - } - - return true; - } - - public boolean isNotSelectedDateFromPast() { - return !isSelectedDateFromPast(); - } - - public HistoryVersionsRenderer getHistoryVersionsRenderer() { - return historyVersionsRenderer; - } - - public class HistoryVersionsRenderer implements ListitemRenderer { - - @Override - public void render(Listitem item, Object data) throws Exception { - CalendarData calendarData = (CalendarData) data; - - Listcell nameListcell = new Listcell(); - nameListcell.appendChild(new Label(baseCalendarModel.getName())); - item.appendChild(nameListcell); - - Listcell parentListcell = new Listcell(); - Label parentLabel = new Label(); - BaseCalendar parent = calendarData.getParent(); - if (parent != null) { - parentLabel.setValue(parent.getName()); - } - parentListcell.appendChild(parentLabel); - item.appendChild(parentListcell); - - Listcell validFromListcell = new Listcell(); - Label validFromLabel = new Label(); - final LocalDate dateValidFrom = baseCalendarModel - .getValidFrom( - calendarData); - if (dateValidFrom != null) { - validFromLabel.setValue(dateValidFrom.toString()); - } - validFromListcell.appendChild(validFromLabel); - item.appendChild(validFromListcell); - - Listcell expiringDateListcell = new Listcell(); - final LocalDate expiringDate = calendarData.getExpiringDate(); - Label expiringDateLabel = new Label(); - if (expiringDate != null) { - LocalDate date = new LocalDate(expiringDate).minusDays(1); - expiringDateLabel.setValue(date.toString()); - } - expiringDateListcell.appendChild(expiringDateLabel); - item.appendChild(expiringDateListcell); - - Listcell summaryListcell = new Listcell(); - List summary = new ArrayList(); - for (Days day : Days.values()) { - Integer hours = calendarData.getHours(day); - if (hours == null) { - summary.add("D"); - } else { - summary.add(hours.toString()); - } - } - summaryListcell.appendChild(new Label(StringUtils.join(summary, - " - "))); - item.appendChild(summaryListcell); - - Listcell buttonListcell = new Listcell(); - Button button = new Button(_("Go to this calendar")); - button.addEventListener(Events.ON_CLICK, new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - if (dateValidFrom != null) { - goToDate(dateValidFrom.toDateTimeAtStartOfDay() - .toDate()); - } else if (expiringDate != null) { - goToDate(expiringDate.minusDays(1) - .toDateTimeAtStartOfDay().toDate()); - } else { - goToDate(new Date()); - } - } - }); - buttonListcell.appendChild(button); - item.appendChild(buttonListcell); - } - - } - - public Date getDateValidFromNewVersion() { - return (new LocalDate()).plusDays(1).toDateTimeAtStartOfDay().toDate(); - } - - public void setDateValidFromNewVersion(Date date) { - // Just for ZK binding not needed - } - - public boolean isCreatingNewVersion() { - return creatingNewVersion; - } - - public void createNewVersion() { - creatingNewVersion = true; - try { - Util.reloadBindings(createNewVersion); - createNewVersion.doModal(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public void acceptCreateNewVersion() { - Component component = createNewVersion - .getFellow("dateValidFromNewVersion"); - Date date = ((Datebox) component).getValue(); - - try { - baseCalendarModel.createNewVersion(date); - } catch (IllegalArgumentException e) { - throw new WrongValueException(component, e.getMessage()); - } - - Clients.closeErrorBox(component); - creatingNewVersion = false; - Util.reloadBindings(createNewVersion); - setSelectedDay(date); - Util.reloadBindings(editWindow); - } - - public void cancelNewVersion() { - creatingNewVersion = false; - Util.reloadBindings(createNewVersion); - } - - public boolean isLastVersion() { - return baseCalendarModel.isLastVersion(); } } 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 new file mode 100644 index 000000000..25ac7ed75 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/calendars/BaseCalendarEditionController.java @@ -0,0 +1,564 @@ +package org.navalplanner.web.calendars; + +import static org.navalplanner.web.I18nHelper._; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.joda.time.LocalDate; +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; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.WrongValueException; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zk.ui.util.Clients; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Button; +import org.zkoss.zul.Checkbox; +import org.zkoss.zul.Intbox; +import org.zkoss.zul.Label; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.Tab; +import org.zkoss.zul.api.Datebox; +import org.zkoss.zul.api.Window; + +/** + * Controller for edit and create one {@link BaseCalendar}. It's separated of + * {@link BaseCalendarCRUDController} to be used from other parts of the + * application. + * + * @author Manuel Rego Casasnovas + */ +public abstract class BaseCalendarEditionController extends + GenericForwardComposer { + + private IBaseCalendarModel baseCalendarModel; + + private Window window; + + private Window createNewVersionWindow; + + private HoursPerDayRenderer hoursPerDayRenderer = new HoursPerDayRenderer(); + + private HistoryVersionsRenderer historyVersionsRenderer = new HistoryVersionsRenderer(); + + private IMessagesForUser messagesForUser; + + private Component messagesContainer; + + private boolean creatingNewVersion = false; + + public BaseCalendarEditionController(IBaseCalendarModel baseCalendarModel, + Window window, Window createNewVersionWindow) { + this.baseCalendarModel = baseCalendarModel; + this.window = window; + this.createNewVersionWindow = createNewVersionWindow; + } + + protected abstract void goToList(); + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + messagesForUser = new MessagesForUser(messagesContainer); + } + + public boolean isEditing() { + return baseCalendarModel.isEditing(); + } + + public BaseCalendar getBaseCalendar() { + return baseCalendarModel.getBaseCalendar(); + } + + public String getCalendarType() { + if (baseCalendarModel.isDerived()) { + return _("Derived"); + } + return _("Normal"); + } + + public boolean isDerived() { + return baseCalendarModel.isDerived(); + } + + public boolean isDateValidFromPast() { + if (!isEditing()) { + return false; + } + + Date dateValidFrom = baseCalendarModel.getDateValidFrom(); + if (dateValidFrom != null) { + return isPast(dateValidFrom); + } + + return true; + } + + private boolean isPast(Date date) { + LocalDate localDate = new LocalDate(date); + LocalDate currentLocalDate = new LocalDate(); + return localDate.compareTo(currentLocalDate) <= 0; + } + + public List getHoursPerDay() { + return Arrays.asList(Days.values()); + } + + public HoursPerDayRenderer getHoursPerDayRenderer() { + return hoursPerDayRenderer; + } + + public class HoursPerDayRenderer implements ListitemRenderer { + + @Override + public void render(Listitem item, Object data) throws Exception { + final Days day = (Days) data; + + Listcell labelListcell = new Listcell(); + labelListcell.appendChild(new Label(day.toString())); + item.appendChild(labelListcell); + + Listcell hoursListcell = new Listcell(); + final Intbox intBox = new Intbox(); + Intbox hoursIntbox = Util.bind(intBox, new Util.Getter() { + + @Override + public Integer get() { + return baseCalendarModel.getHours(day); + } + }, new Util.Setter() { + + @Override + public void set(Integer value) { + try { + baseCalendarModel.setHours(day, value); + } catch (IllegalArgumentException e) { + throw new WrongValueException(intBox, e.getMessage()); + } + } + }); + + hoursIntbox.addEventListener(Events.ON_CHANGE, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + reloadDayInformation(); + } + + }); + + if (isDateValidFromPast()) { + hoursIntbox.setDisabled(true); + } else if (baseCalendarModel.isDerived() + && baseCalendarModel.isDefault(day)) { + hoursIntbox.setDisabled(true); + } + + hoursListcell.appendChild(hoursIntbox); + item.appendChild(hoursListcell); + + if (baseCalendarModel.isDerived()) { + Listcell defaultListcell = new Listcell(); + Checkbox defaultCheckbox = Util.bind(new Checkbox(), + new Util.Getter() { + + @Override + public Boolean get() { + return baseCalendarModel.isDefault(day); + } + }, new Util.Setter() { + + @Override + public void set(Boolean value) { + if (value) { + baseCalendarModel.setDefault(day); + } else { + baseCalendarModel.unsetDefault(day); + } + } + }); + defaultCheckbox.addEventListener(Events.ON_CHECK, + new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + reloadCurrentWindow(); + } + + }); + + if (isDateValidFromPast()) { + defaultCheckbox.setDisabled(true); + } + + defaultListcell.appendChild(defaultCheckbox); + item.appendChild(defaultListcell); + } + } + + } + + private void reloadCurrentWindow() { + Util.reloadBindings(window); + highlightDaysOnCalendar(); + } + + private void reloadDayInformation() { + Util.reloadBindings(window.getFellow("dayInformation")); + highlightDaysOnCalendar(); + } + + private void highlightDaysOnCalendar() { + ((CalendarHighlightedDays) window.getFellow("calendarWidget")) + .highlightDays(); + } + + public Date getSelectedDay() { + Date selectedDay = baseCalendarModel.getSelectedDay(); + if (selectedDay == null) { + return new Date(); + } + return selectedDay; + } + + public void setSelectedDay(Date date) { + baseCalendarModel.setSelectedDay(date); + + reloadDayInformation(); + } + + private Map getDaysCurrentMonthByType() { + LocalDate currentDate = new LocalDate(baseCalendarModel + .getSelectedDay()); + + LocalDate minDate = currentDate.dayOfMonth().withMinimumValue(); + LocalDate maxDate = currentDate.dayOfMonth().withMaximumValue(); + + List ancestorExceptionsDays = new ArrayList(); + List ownExceptionDays = new ArrayList(); + List zeroHoursDays = new ArrayList(); + List normalDays = new ArrayList(); + + for (LocalDate date = minDate; date.compareTo(maxDate) <= 0; date = date + .plusDays(1)) { + DayType typeOfDay = baseCalendarModel.getTypeOfDay(date); + if (typeOfDay != null) { + switch (typeOfDay) { + case ANCESTOR_EXCEPTION: + ancestorExceptionsDays.add(date.getDayOfMonth()); + break; + case OWN_EXCEPTION: + ownExceptionDays.add(date.getDayOfMonth()); + break; + case ZERO_HOURS: + zeroHoursDays.add(date.getDayOfMonth()); + break; + case NORMAL: + default: + normalDays.add(date.getDayOfMonth()); + break; + } + } + } + + Map result = new HashMap(); + + result.put(DayType.ANCESTOR_EXCEPTION, StringUtils.join( + ancestorExceptionsDays, ",")); + result.put(DayType.OWN_EXCEPTION, StringUtils.join(ownExceptionDays, + ",")); + result.put(DayType.ZERO_HOURS, StringUtils.join(zeroHoursDays, ",")); + result.put(DayType.NORMAL, StringUtils.join(normalDays, ",")); + + return result; + } + + public String getAncestorExceptionDays() { + return getDaysCurrentMonthByType().get(DayType.ANCESTOR_EXCEPTION); + } + + public String getOwnExceptionDays() { + return getDaysCurrentMonthByType().get(DayType.OWN_EXCEPTION); + } + + public String getZeroHoursDays() { + return getDaysCurrentMonthByType().get(DayType.ZERO_HOURS); + } + + public String getTypeOfDay() { + DayType typeOfDay = baseCalendarModel.getTypeOfDay(); + if (typeOfDay == null) { + return ""; + } + + switch (typeOfDay) { + case ANCESTOR_EXCEPTION: + return _("Derived excpetion"); + case OWN_EXCEPTION: + return _("Exception"); + case ZERO_HOURS: + return _("Not working day"); + case NORMAL: + default: + return _("Normal"); + } + } + + public Integer getHoursOfDay() { + return baseCalendarModel.getHoursOfDay(); + } + + public boolean isSelectedDateFromPast() { + Date selectedDay = baseCalendarModel.getSelectedDay(); + if (selectedDay != null) { + return isPast(selectedDay); + } + + return true; + } + + public boolean isNotSelectedDateFromPast() { + return !isSelectedDateFromPast(); + } + + public void createException() { + Component exceptionHoursIntbox = window.getFellow("exceptionHours"); + + Integer hours = ((Intbox) exceptionHoursIntbox).getValue(); + + if (hours < 0) { + throw new WrongValueException( + exceptionHoursIntbox, + _("Hours for an exception day should be greater or equal than zero")); + } else { + Clients.closeErrorBox(exceptionHoursIntbox); + baseCalendarModel.createException(hours); + reloadDayInformation(); + } + } + + public boolean isNotExceptional() { + return !baseCalendarModel.isExceptional(); + } + + public void removeException() { + baseCalendarModel.removeException(); + + reloadDayInformation(); + } + + public Date getDateValidFrom() { + return baseCalendarModel.getDateValidFrom(); + } + + public void setDateValidFrom(Date date) { + Component component = window.getFellow("dateValidFrom"); + + try { + baseCalendarModel.setDateValidFrom(date); + } catch (IllegalArgumentException e) { + throw new WrongValueException(component, e.getMessage()); + } catch (UnsupportedOperationException e) { + throw new WrongValueException(component, e.getMessage()); + } + Clients.closeErrorBox(component); + baseCalendarModel.setSelectedDay(date); + reloadCurrentWindow(); + } + + public Date getExpiringDate() { + return baseCalendarModel.getExpiringDate(); + } + + public void setExpiringDate(Date date) { + Component component = window.getFellow("expiringDate"); + + try { + baseCalendarModel.setExpiringDate((new LocalDate(date)).plusDays(1) + .toDateTimeAtStartOfDay().toDate()); + } catch (IllegalArgumentException e) { + throw new WrongValueException(component, e.getMessage()); + } catch (UnsupportedOperationException e) { + throw new WrongValueException(component, e.getMessage()); + } + Clients.closeErrorBox(component); + baseCalendarModel.setSelectedDay(date); + reloadCurrentWindow(); + } + + public List getHistoryVersions() { + return baseCalendarModel.getHistoryVersions(); + } + + public HistoryVersionsRenderer getHistoryVersionsRenderer() { + return historyVersionsRenderer; + } + + public class HistoryVersionsRenderer implements ListitemRenderer { + + @Override + public void render(Listitem item, Object data) throws Exception { + CalendarData calendarData = (CalendarData) data; + + Listcell nameListcell = new Listcell(); + nameListcell.appendChild(new Label(baseCalendarModel.getName())); + item.appendChild(nameListcell); + + Listcell parentListcell = new Listcell(); + Label parentLabel = new Label(); + BaseCalendar parent = calendarData.getParent(); + if (parent != null) { + parentLabel.setValue(parent.getName()); + } + parentListcell.appendChild(parentLabel); + item.appendChild(parentListcell); + + Listcell validFromListcell = new Listcell(); + Label validFromLabel = new Label(); + final LocalDate dateValidFrom = baseCalendarModel + .getValidFrom(calendarData); + if (dateValidFrom != null) { + validFromLabel.setValue(dateValidFrom.toString()); + } + validFromListcell.appendChild(validFromLabel); + item.appendChild(validFromListcell); + + Listcell expiringDateListcell = new Listcell(); + final LocalDate expiringDate = calendarData.getExpiringDate(); + Label expiringDateLabel = new Label(); + if (expiringDate != null) { + LocalDate date = new LocalDate(expiringDate).minusDays(1); + expiringDateLabel.setValue(date.toString()); + } + expiringDateListcell.appendChild(expiringDateLabel); + item.appendChild(expiringDateListcell); + + Listcell summaryListcell = new Listcell(); + List summary = new ArrayList(); + for (Days day : Days.values()) { + Integer hours = calendarData.getHours(day); + if (hours == null) { + summary.add("D"); + } else { + summary.add(hours.toString()); + } + } + summaryListcell.appendChild(new Label(StringUtils.join(summary, + " - "))); + item.appendChild(summaryListcell); + + Listcell buttonListcell = new Listcell(); + Button button = new Button(_("Go to this calendar")); + button.addEventListener(Events.ON_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + if (dateValidFrom != null) { + goToDate(dateValidFrom.toDateTimeAtStartOfDay() + .toDate()); + } else if (expiringDate != null) { + goToDate(expiringDate.minusDays(1) + .toDateTimeAtStartOfDay().toDate()); + } else { + goToDate(new Date()); + } + } + }); + buttonListcell.appendChild(button); + item.appendChild(buttonListcell); + } + + } + + 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(); + } + + public void goToDate(Date date) { + setSelectedDay(date); + + ((Tab) window.getFellow("dataTab")).setSelected(true); + reloadCurrentWindow(); + } + + public boolean isCreatingNewVersion() { + return creatingNewVersion; + } + + public void createNewVersion() { + creatingNewVersion = true; + try { + Util.reloadBindings(createNewVersionWindow); + createNewVersionWindow.doModal(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void acceptCreateNewVersion() { + Component component = createNewVersionWindow + .getFellow("dateValidFromNewVersion"); + Date date = ((Datebox) component).getValue(); + + try { + baseCalendarModel.createNewVersion(date); + } catch (IllegalArgumentException e) { + throw new WrongValueException(component, e.getMessage()); + } + + Clients.closeErrorBox(component); + creatingNewVersion = false; + Util.reloadBindings(createNewVersionWindow); + setSelectedDay(date); + reloadCurrentWindow(); + } + + public void cancelNewVersion() { + creatingNewVersion = false; + Util.reloadBindings(createNewVersionWindow); + } + + public Date getDateValidFromNewVersion() { + return (new LocalDate()).plusDays(1).toDateTimeAtStartOfDay().toDate(); + } + + public void setDateValidFromNewVersion(Date date) { + // Just for ZK binding not needed + } + +} 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 e8f3d5854..2f24da7b2 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 @@ -399,7 +399,7 @@ public class BaseCalendarModel implements IBaseCalendarModel { */ @Override - @Transactional + @Transactional(rollbackFor = ValidationException.class) public void confirmSave() throws ValidationException { BaseCalendar entity = getBaseCalendar(); diff --git a/navalplanner-webapp/src/main/webapp/calendars/_edition.zul b/navalplanner-webapp/src/main/webapp/calendars/_edition.zul index e7153536b..a4a4565e7 100644 --- a/navalplanner-webapp/src/main/webapp/calendars/_edition.zul +++ b/navalplanner-webapp/src/main/webapp/calendars/_edition.zul @@ -5,7 +5,7 @@ + visible="@{controller.editionController.isEditing}" id="historyTab" /> @@ -19,16 +19,16 @@ + model="@{controller.editionController.getHoursPerDay}" + itemRenderer="@{controller.editionController.hoursPerDayRenderer}"> @@ -50,28 +50,28 @@ + value="@{controller.editionController.selectedDay,access='both'}" + ancestorExceptionDays="@{controller.editionController.ancestorExceptionDays,access='both'}" + ownExceptionDays="@{controller.editionController.ownExceptionDays,access='both'}" + zeroHoursDays="@{controller.editionController.zeroHoursDays,access='both'}" /> - +