ItEr24S10CUAsignacionCalendarioLaboralRecursoItEr23S13: Creating a new controller that could be used from other parts of the application.

This commit is contained in:
Manuel Rego Casasnovas 2009-09-04 12:40:38 +02:00 committed by Óscar González Fernández
parent bac872a4a6
commit ee71f16b57
5 changed files with 645 additions and 496 deletions

View file

@ -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<Days> 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<Integer>() {
@Override
public Integer get() {
return baseCalendarModel.getHours(day);
}
}, new Util.Setter<Integer>() {
@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<Boolean>() {
@Override
public Boolean get() {
return baseCalendarModel.isDefault(day);
}
}, new Util.Setter<Boolean>() {
@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<BaseCalendar> 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<CalendarData> getHistoryVersions() {
return baseCalendarModel.getHistoryVersions();
}
private Map<DayType, String> getDaysCurrentMonthByType() {
LocalDate currentDate = new LocalDate(baseCalendarModel
.getSelectedDay());
LocalDate minDate = currentDate.dayOfMonth().withMinimumValue();
LocalDate maxDate = currentDate.dayOfMonth().withMaximumValue();
List<Integer> ancestorExceptionsDays = new ArrayList<Integer>();
List<Integer> ownExceptionDays = new ArrayList<Integer>();
List<Integer> zeroHoursDays = new ArrayList<Integer>();
List<Integer> normalDays = new ArrayList<Integer>();
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<DayType, String> result = new HashMap<DayType, String>();
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<String> summary = new ArrayList<String>();
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();
}
}

View file

@ -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 <mrego@igalia.com>
*/
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<Days> 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<Integer>() {
@Override
public Integer get() {
return baseCalendarModel.getHours(day);
}
}, new Util.Setter<Integer>() {
@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<Boolean>() {
@Override
public Boolean get() {
return baseCalendarModel.isDefault(day);
}
}, new Util.Setter<Boolean>() {
@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<DayType, String> getDaysCurrentMonthByType() {
LocalDate currentDate = new LocalDate(baseCalendarModel
.getSelectedDay());
LocalDate minDate = currentDate.dayOfMonth().withMinimumValue();
LocalDate maxDate = currentDate.dayOfMonth().withMaximumValue();
List<Integer> ancestorExceptionsDays = new ArrayList<Integer>();
List<Integer> ownExceptionDays = new ArrayList<Integer>();
List<Integer> zeroHoursDays = new ArrayList<Integer>();
List<Integer> normalDays = new ArrayList<Integer>();
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<DayType, String> result = new HashMap<DayType, String>();
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<CalendarData> 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<String> summary = new ArrayList<String>();
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
}
}

View file

@ -399,7 +399,7 @@ public class BaseCalendarModel implements IBaseCalendarModel {
*/
@Override
@Transactional
@Transactional(rollbackFor = ValidationException.class)
public void confirmSave() throws ValidationException {
BaseCalendar entity = getBaseCalendar();

View file

@ -5,7 +5,7 @@
<tabs>
<tab label="${i18n:_('Data')}" id="dataTab" />
<tab label="${i18n:_('History')}"
visible="@{controller.isEditing}" id="historyTab" />
visible="@{controller.editionController.isEditing}" id="historyTab" />
</tabs>
<tabpanels>
@ -19,16 +19,16 @@
<hbox>
<label value="${i18n:_('Name')}" />
<textbox value="@{controller.baseCalendar.name}" />
<textbox value="@{controller.editionController.baseCalendar.name}" />
</hbox>
<hbox>
<label value="${i18n:_('Type')}" />
<vbox>
<label value="@{controller.calendarType}" />
<label value="@{controller.editionController.calendarType}" />
<combobox id="parentCalendars"
visible="@{controller.isDerived}"
disabled="@{controller.isDateValidFromPast}" >
visible="@{controller.editionController.isDerived}"
disabled="@{controller.editionController.isDateValidFromPast}">
<comboitem self="@{each='baseCalnedar'}" value="@{baseCalnedar}"
label="@{baseCalnedar.name}" />
</combobox>
@ -36,8 +36,8 @@
</hbox>
<listbox id="hoursPerDay"
model="@{controller.getHoursPerDay}"
itemRenderer="@{controller.hoursPerDayRenderer}">
model="@{controller.editionController.getHoursPerDay}"
itemRenderer="@{controller.editionController.hoursPerDayRenderer}">
<listhead>
<listheader label="${i18n:_('Day of week')}" />
<listheader label="${i18n:_('Hours')}" />
@ -50,28 +50,28 @@
<vbox id="dayInformation">
<calendarhighlighteddays id="calendarWidget"
value="@{controller.selectedDay,access='both'}"
ancestorExceptionDays="@{controller.ancestorExceptionDays,access='both'}"
ownExceptionDays="@{controller.ownExceptionDays,access='both'}"
zeroHoursDays="@{controller.zeroHoursDays,access='both'}" />
value="@{controller.editionController.selectedDay,access='both'}"
ancestorExceptionDays="@{controller.editionController.ancestorExceptionDays,access='both'}"
ownExceptionDays="@{controller.editionController.ownExceptionDays,access='both'}"
zeroHoursDays="@{controller.editionController.zeroHoursDays,access='both'}" />
<hbox>
<label value="${i18n:_('Type of day')}" />
<label value="@{controller.typeOfDay}" />
<label value="@{controller.editionController.typeOfDay}" />
</hbox>
<hbox>
<label value="${i18n:_('Hours of day')}" />
<label value="@{controller.hoursOfDay}" />
<label value="@{controller.editionController.hoursOfDay}" />
</hbox>
<hbox visible="@{controller.isNotSelectedDateFromPast}">
<hbox visible="@{controller.editionController.isNotSelectedDateFromPast}">
<vbox>
<button label="${i18n:_('Create exception')}"
onClick="controller.createException();" />
<button disabled="@{controller.isNotExceptional}"
onClick="controller.editionController.createException();" />
<button disabled="@{controller.editionController.isNotExceptional}"
label="${i18n:_('Remove exception')}"
onClick="controller.removeException();" />
onClick="controller.editionController.removeException();" />
</vbox>
<intbox id="exceptionHours" value="0" />
</hbox>
@ -79,23 +79,23 @@
</hbox>
<hbox visible="@{controller.isEditing}">
<hbox visible="@{controller.editionController.isEditing}">
<label value="${i18n:_('Valid from')}" />
<datebox id="dateValidFrom" value="@{controller.dateValidFrom}"
disabled="@{controller.isDateValidFromPast}" />
<datebox id="dateValidFrom" value="@{controller.editionController.dateValidFrom}"
disabled="@{controller.editionController.isDateValidFromPast}" />
<label value="${i18n:_('to')}" />
<datebox id="expiringDate" value="@{controller.expiringDate}"
disabled="@{controller.isLastVersion}" />
<datebox id="expiringDate" value="@{controller.editionController.expiringDate}"
disabled="@{controller.editionController.isLastVersion}" />
</hbox>
<hbox>
<button onClick="controller.save();"
<button onClick="controller.editionController.save();"
label="${arg.save_button_label}" />
<button onClick="controller.cancel();"
<button onClick="controller.editionController.cancel();"
label="${arg.cancel_button_label}" />
<button onClick="controller.createNewVersion();"
<button onClick="controller.editionController.createNewVersion();"
label="${i18n:_('Create new version')}"
visible="@{controller.isEditing}" />
visible="@{controller.editionController.isEditing}" />
</hbox>
</vbox>
@ -104,8 +104,8 @@
<tabpanel>
<listbox model="@{controller.historyVersions}"
itemRenderer="@{controller.historyVersionsRenderer}">
<listbox model="@{controller.editionController.historyVersions}"
itemRenderer="@{controller.editionController.historyVersionsRenderer}">
<listhead>
<listheader label="${i18n:_('Name')}" />
<listheader label="${i18n:_('Parent')}" />

View file

@ -37,20 +37,20 @@
</hbox>
</vbox>
</window>
<window visible="@{controller.creatingNewVersion}"
<window visible="@{controller.editionController.creatingNewVersion}"
id="createNewVersion" title="${i18n:_('Create new version')}" >
<vbox>
<label value="${i18n:_('Select the date from which the new version will be valid')}" />
<hbox>
<label value="${i18n:_('Valid from')}" />
<datebox id="dateValidFromNewVersion"
value="@{controller.dateValidFromNewVersion}"/>
value="@{controller.editionController.dateValidFromNewVersion}"/>
</hbox>
<hbox>
<button label="${i18n:_('Create')}"
onClick="controller.acceptCreateNewVersion();" />
onClick="controller.editionController.acceptCreateNewVersion();" />
<button label="${i18n:_('Cancel')}"
onClick="controller.cancelNewVersion();" />
onClick="controller.editionController.cancelNewVersion();" />
</hbox>
</vbox>
</window>