/* * Copyright (C) 2010 - 2012 Interactive Media Management * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package dk.i2m.converge.jsf.beans; import dk.i2m.converge.core.calendar.Event; import dk.i2m.converge.core.security.SystemPrivilege; import dk.i2m.converge.core.security.UserAccount; import dk.i2m.converge.core.workflow.Outlet; import dk.i2m.converge.ejb.facades.*; import dk.i2m.converge.jsf.components.tags.DialogAssignment; import dk.i2m.converge.core.utils.CalendarUtils; import dk.i2m.jsf.JsfUtils; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; import javax.ejb.EJB; import javax.faces.application.FacesMessage; import javax.faces.event.ActionEvent; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; /** * Backing bean for {@code Calendar.jspx}. * * @author Allan Lykke Christensen */ public class Calendar { enum CalendarView { YEAR, MONTH, WEEK, DAY, UPCOMING } @EJB private CalendarFacadeLocal calendarFacade; @EJB private UserFacadeLocal userFacade; @EJB private OutletFacadeLocal outletFacade; @EJB private WorkflowFacadeLocal workflowFacade; @EJB private NewsItemFacadeLocal newsItemFacade; private DialogAssignment dialogAssignment; private DataModel schedule = new ListDataModel(new ArrayList()); private Event selectedEvent = null; private java.util.Calendar selectedDate = java.util.Calendar.getInstance(); private String title = ""; private CalendarView view = CalendarView.DAY; @PostConstruct public void onInit() { onRefreshSchedule(null); } /** * Action handler for refreshing the schedule. * * @param event * Event that invoked the handler */ public void onRefreshSchedule(ActionEvent event) { switch (view) { case YEAR: onShowYear(event); break; case MONTH: onShowMonth(event); break; case WEEK: onShowWeek(event); break; case DAY: onShowDay(event); break; case UPCOMING: onShowUpcoming(event); break; } } /** * Action handler for preparing the creation of a new event. * * @param event * Event that invoked the handler */ public void onNewEvent(ActionEvent event) { this.selectedEvent = new Event(); this.selectedEvent.setOriginator(getUserAccount()); if (selectedDate != null) { this.selectedEvent.setStartDate((java.util.Calendar) selectedDate.clone()); this.selectedEvent.setEndDate((java.util.Calendar) selectedDate.clone()); } else { this.selectedEvent.setStartDate(java.util.Calendar.getInstance()); this.selectedEvent.setEndDate(java.util.Calendar.getInstance()); } } public void onSelectDate(ActionEvent event) { onRefreshSchedule(event); } /** * Action handler for adding the new event to the shared calendar. * * @param event * Event that invoked the handler */ public void onSaveEvent(ActionEvent event) { String msg; if (isEditMode()) { this.selectedEvent = calendarFacade.update(selectedEvent); msg = "Calendar_EVENT_MSG_UPDATED"; } else { this.selectedEvent = calendarFacade.create(this.selectedEvent); msg = "Calendar_EVENT_MSG_CREATED"; } JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(), msg); onRefreshSchedule(event); } /** * Action handler for deleting a selected event. * * @param event * Event that invoked the handler */ public void onDeleteEvent(ActionEvent event) { calendarFacade.delete(selectedEvent.getId()); onRefreshSchedule(event); JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(), "Calendar_EVENT_MSG_DELETED"); } /** * Event handler for showing events in the selected year. * * @param event * Event that invoked the handler */ public void onShowYear(ActionEvent event) { this.view = CalendarView.YEAR; this.title = JsfUtils.getMessage(Bundle.i18n.name(), "Calendar_BY_YEAR", new Object[]{selectedDate.getTime()}); java.util.Calendar startDate = CalendarUtils.getFirstDayOfYear(selectedDate); startDate.setTimeZone(getUserAccount().getTimeZone()); java.util.Calendar endDate = CalendarUtils.getLastDayOfYear(selectedDate); endDate.setTimeZone(getUserAccount().getTimeZone()); List<Event> events = calendarFacade.findByDate(startDate, endDate); this.schedule.setWrappedData(events); } public void onShowMonth(ActionEvent event) { this.view = CalendarView.MONTH; this.title = JsfUtils.getResourceBundle(Bundle.i18n.name()).getString("Calendar_BY_MONTH"); this.title = MessageFormat.format(this.title, selectedDate.getTime()); java.util.Calendar startDate = CalendarUtils.getFirstDayOfMonth(selectedDate); startDate.setTimeZone(getUserAccount().getTimeZone()); java.util.Calendar endDate = CalendarUtils.getLastDayOfMonth(selectedDate); endDate.setTimeZone(getUserAccount().getTimeZone()); List<Event> events = calendarFacade.findByDate(startDate, endDate); this.schedule.setWrappedData(events); } public void onShowWeek(ActionEvent event) { this.view = CalendarView.WEEK; this.title = JsfUtils.getResourceBundle(Bundle.i18n.name()).getString("Calendar_BY_WEEK"); java.util.Calendar startDate = CalendarUtils.getFirstDayOfWeek(selectedDate); startDate.setTimeZone(getUserAccount().getTimeZone()); java.util.Calendar endDate = CalendarUtils.getLastDayOfWeek(selectedDate); endDate.setTimeZone(getUserAccount().getTimeZone()); this.title = MessageFormat.format(this.title, startDate.getTime(), endDate.getTime()); List<Event> events = calendarFacade.findByDate(startDate, endDate); this.schedule.setWrappedData(events); } public void onShowDay(ActionEvent event) { this.view = CalendarView.DAY; this.title = JsfUtils.getResourceBundle(Bundle.i18n.name()).getString("Calendar_BY_DAY"); java.util.Calendar startDate = CalendarUtils.getStartOfDay(selectedDate); startDate.setTimeZone(getUserAccount().getTimeZone()); java.util.Calendar endDate = CalendarUtils.getEndOfDay(selectedDate); endDate.setTimeZone(getUserAccount().getTimeZone()); this.title = MessageFormat.format(this.title, startDate.getTime(), endDate.getTime()); List<Event> events = calendarFacade.findByDate(startDate, endDate); this.schedule.setWrappedData(events); } public void onShowUpcoming(ActionEvent event) { this.view = CalendarView.UPCOMING; this.title = JsfUtils.getResourceBundle(Bundle.i18n.name()).getString("Calendar_BY_UPCOMING"); List<Event> events = calendarFacade.findUpcoming(); this.schedule.setWrappedData(events); } public void onNewAssignment(ActionEvent event) { dialogAssignment = new DialogAssignment(outletFacade, workflowFacade, userFacade, newsItemFacade, calendarFacade, getOutlets()); dialogAssignment.showStoryTab(); dialogAssignment.getAssignment().setAssigned(true); dialogAssignment.getAssignment().setAssignedBy(getUserAccount()); dialogAssignment.getAssignment().setOutlet(getUserAccount().getDefaultOutlet()); if (dialogAssignment.getAssignment().getOutlet() == null) { if (!getOutlets().isEmpty()) { dialogAssignment.getAssignment().setOutlet(getOutlets().iterator().next()); } } dialogAssignment.onChangeOutlet(null); dialogAssignment.getAssignment().setEvent(selectedEvent); String msg = JsfUtils.getResourceBundle(Bundle.i18n.name()).getString("Calendar_COVER_X_EVENT"); dialogAssignment.getAssignment().setTitle(MessageFormat.format(msg, selectedEvent.getSummary())); if (selectedDate != null) { dialogAssignment.getAssignment().setDeadline(selectedDate); dialogAssignment.getAssignment().getDeadline().setTimeZone(getUserAccount().getTimeZone()); dialogAssignment.getAssignment().getDeadline().set(java.util.Calendar.HOUR_OF_DAY, 15); dialogAssignment.getAssignment().getDeadline().set(java.util.Calendar.MINUTE, 0); dialogAssignment.getAssignment().getDeadline().set(java.util.Calendar.SECOND, 0); } else { dialogAssignment.getAssignment().setDeadline(java.util.Calendar.getInstance()); dialogAssignment.getAssignment().getDeadline().setTimeZone(getUserAccount().getTimeZone()); dialogAssignment.getAssignment().getDeadline().set(java.util.Calendar.HOUR_OF_DAY, 15); dialogAssignment.getAssignment().getDeadline().set(java.util.Calendar.MINUTE, 0); dialogAssignment.getAssignment().getDeadline().set(java.util.Calendar.SECOND, 0); } } /** * Gets the schedule of upcoming events. * * @return {@link DataModel} containing the registered events */ public DataModel getSchedule() { return this.schedule; } public Event getSelectedEvent() { return selectedEvent; } public void setSelectedEvent(Event event) { this.selectedEvent = event; } public java.util.Calendar getSelectedDate() { return selectedDate; } public void setSelectedDate(java.util.Calendar selectedDate) { this.selectedDate = selectedDate; } public String getTitle() { return JsfUtils.getMessage(Bundle.i18n.name(), "Calendar_EVENTS", new Object[]{title}); } public void setTitle(String title) { this.title = title; } public boolean isAddMode() { if (selectedEvent == null || selectedEvent.getId() == null) { return true; } else { return false; } } public boolean isEditMode() { return !isAddMode(); } /** * Gets a {@link List} of the {@link Outlet}s where the current user has * outlet planning privileges. * * @return {@link List} of the {@link Outlet}s where the current user has * outlet planning privileges */ public List<Outlet> getOutlets() { UserAccount currentUser = (UserAccount) JsfUtils.getValueOfValueExpression("#{userSession.user}"); return currentUser.getPrivilegedOutlets(SystemPrivilege.OUTLET_PLANNING); } public DialogAssignment getDialogAssignment() { return dialogAssignment; } public void setDialogAssignment(DialogAssignment dialogAssignment) { this.dialogAssignment = dialogAssignment; } private UserAccount getUserAccount() { final String valueExpression = "#{userSession.user}"; return (UserAccount) JsfUtils.getValueOfValueExpression(valueExpression); } }