/* * Copyright 2012-2013 PrimeFaces Extensions. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * $Id$ */ package org.primefaces.extensions.showcase.controller.timeline; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import javax.annotation.PostConstruct; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import javax.faces.context.FacesContext; import org.primefaces.extensions.component.timeline.TimelineUpdater; import org.primefaces.extensions.event.timeline.TimelineAddEvent; import org.primefaces.extensions.event.timeline.TimelineModificationEvent; import org.primefaces.extensions.model.timeline.TimelineEvent; import org.primefaces.extensions.model.timeline.TimelineModel; import org.primefaces.extensions.showcase.model.timeline.Booking; import org.primefaces.extensions.showcase.model.timeline.RoomCategory; /** * EditServerTimelineController * * @author Oleg Varaksin / last modified by $Author: $ * @version $Revision: 1.0 $ */ @ManagedBean @ViewScoped public class EditServerTimelineController implements Serializable { private TimelineModel model; private TimelineEvent event; // current event to be changed, edited, deleted or added private long zoomMax; private Date start; private Date end; private TimeZone timeZone = TimeZone.getTimeZone("Europe/Madrid"); @PostConstruct protected void initialize() { // initial zooming is ca. one month to avoid hiding of event details (due to wide time range of events) zoomMax = 1000L * 60 * 60 * 24 * 30; // set initial start / end dates for the axis of the timeline (just for testing) Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(2013, Calendar.FEBRUARY, 9, 0, 0, 0); start = cal.getTime(); cal.set(2013, Calendar.MARCH, 10, 0, 0, 0); end = cal.getTime(); // create timeline model model = new TimelineModel(); // Server-side dates should be in UTC. They will be converted to a local dates in UI according to provided TimeZone. // Submitted local dates in UI are converted back to UTC, so that server receives all dates in UTC again. cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(2013, Calendar.JANUARY, 2, 0, 0, 0); model.add(new TimelineEvent(new Booking(211, RoomCategory.DELUXE, "(0034) 987-111", "One day booking"), cal.getTime())); cal.set(2013, Calendar.JANUARY, 26, 0, 0, 0); Date begin = cal.getTime(); cal.set(2013, Calendar.JANUARY, 28, 23, 59, 59); Date end = cal.getTime(); model.add(new TimelineEvent(new Booking(202, RoomCategory.EXECUTIVE_SUITE, "(0034) 987-333", "Three day booking"), begin, end)); cal.set(2013, Calendar.FEBRUARY, 10, 0, 0, 0); begin = cal.getTime(); cal.set(2013, Calendar.FEBRUARY, 15, 23, 59, 59); end = cal.getTime(); model.add(new TimelineEvent(new Booking(150, RoomCategory.STANDARD, "(0034) 987-222", "Six day booking"), begin, end)); cal.set(2013, Calendar.FEBRUARY, 23, 0, 0, 0); begin = cal.getTime(); cal.set(2013, Calendar.FEBRUARY, 27, 23, 59, 59); end = cal.getTime(); model.add(new TimelineEvent(new Booking(178, RoomCategory.STANDARD, "(0034) 987-555", "Five day booking"), begin, end)); cal = Calendar.getInstance(); cal.set(2013, Calendar.MARCH, 6, 0, 0, 0); model.add(new TimelineEvent(new Booking(101, RoomCategory.SUPERIOR, "(0034) 987-999", "One day booking"), cal.getTime())); cal.set(2013, Calendar.MARCH, 19, 0, 0, 0); begin = cal.getTime(); cal.set(2013, Calendar.MARCH, 22, 23, 59, 59); end = cal.getTime(); model.add(new TimelineEvent(new Booking(80, RoomCategory.JUNIOR, "(0034) 987-444", "Four day booking"), begin, end)); cal.set(2013, Calendar.APRIL, 3, 0, 0, 0); begin = cal.getTime(); cal.set(2013, Calendar.APRIL, 4, 23, 59, 59); end = cal.getTime(); model.add(new TimelineEvent(new Booking(96, RoomCategory.DELUXE, "(0034) 987-777", "Two day booking"), begin, end)); cal.set(2013, Calendar.APRIL, 22, 0, 0, 0); begin = cal.getTime(); cal.set(2013, Calendar.MAY, 1, 23, 59, 59); end = cal.getTime(); model.add(new TimelineEvent(new Booking(80, RoomCategory.JUNIOR, "(0034) 987-444", "Ten day booking"), begin, end)); } public void onChange(TimelineModificationEvent e) { // get clone of the TimelineEvent to be changed with new start / end dates event = e.getTimelineEvent(); // update booking in DB... // if everything was ok, no UI update is required. Only the model should be updated model.update(event); FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "The booking dates " + getRoom() + " have been updated", null); FacesContext.getCurrentInstance().addMessage(null, msg); // otherwise (if DB operation failed) a rollback can be done with the same response as follows: // TimelineEvent oldEvent = model.getEvent(model.getIndex(event)); // TimelineUpdater timelineUpdater = TimelineUpdater.getCurrentInstance(":mainForm:timeline"); // model.update(oldEvent, timelineUpdater); } public void onEdit(TimelineModificationEvent e) { // get clone of the TimelineEvent to be edited event = e.getTimelineEvent(); } public void onAdd(TimelineAddEvent e) { // get TimelineEvent to be added event = new TimelineEvent(new Booking(), e.getStartDate(), e.getEndDate(), true, e.getGroup()); // add the new event to the model in case if user will close or cancel the "Add dialog" // without to update details of the new event. Note: the event is already added in UI. model.add(event); } public void onDelete(TimelineModificationEvent e) { // get clone of the TimelineEvent to be deleted event = e.getTimelineEvent(); } public void delete() { // delete booking in DB... // if everything was ok, delete the TimelineEvent in the model and update UI with the same response. // otherwise no server-side delete is necessary (see timelineWdgt.cancelDelete() in the p:ajax onstart). // we assume, delete in DB was successful TimelineUpdater timelineUpdater = TimelineUpdater.getCurrentInstance(":mainForm:timeline"); model.delete(event, timelineUpdater); FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "The booking " + getRoom() + " has been deleted", null); FacesContext.getCurrentInstance().addMessage(null, msg); } public void saveDetails() { // save the updated booking in DB... // if everything was ok, update the TimelineEvent in the model and update UI with the same response. // otherwise no server-side update is necessary because UI is already up-to-date. // we assume, save in DB was successful TimelineUpdater timelineUpdater = TimelineUpdater.getCurrentInstance(":mainForm:timeline"); model.update(event, timelineUpdater); FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "The booking details " + getRoom() + " have been saved", null); FacesContext.getCurrentInstance().addMessage(null, msg); } public TimelineModel getModel() { return model; } public TimelineEvent getEvent() { return event; } public void setEvent(TimelineEvent event) { this.event = event; } public long getZoomMax() { return zoomMax; } public Date getStart() { return start; } public Date getEnd() { return end; } public TimeZone getTimeZone() { return timeZone; } public String getDeleteMessage() { Integer room = ((Booking) event.getData()).getRoomNumber(); if (room == null) { return "Do you really want to delete the new booking?"; } return "Do you really want to delete the booking for the room " + room + "?"; } public String getRoom() { Integer room = ((Booking) event.getData()).getRoomNumber(); if (room == null) { return "(new booking)"; } else { return "(room " + room + ")"; } } }