/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* 12.10.2011 by frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.vitero.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.id.OLATResourceable;
import org.olat.core.util.StringHelper;
import org.olat.course.editor.NodeEditController;
import org.olat.group.BusinessGroup;
import org.olat.modules.vitero.manager.ViteroManager;
import org.olat.modules.vitero.manager.VmsNotAvailableException;
import org.olat.modules.vitero.model.ViteroBooking;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Description:<br>
*
* <P>
* Initial Date: 6 oct. 2011 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class ViteroBookingsEditController extends FormBasicController {
private FormLink newButton;
private FormLink occupiedRoomsLink;
private final List<BookingDisplay> bookingDisplays = new ArrayList<BookingDisplay>();
private CloseableModalController cmc;
private DialogBoxController dialogCtr;
private DialogBoxController warningGroupCtr;
private ViteroBookingEditController bookingController;
private ViteroRoomsOverviewController roomsOverviewController;
private ViteroUserToGroupController usersController;
private VelocityContainer viteroGroupVC;
private final boolean readOnly;
private final String resourceName;
private final BusinessGroup group;
private final OLATResourceable ores;
private final String subIdentifier;
@Autowired
private ViteroManager viteroManager;
public ViteroBookingsEditController(UserRequest ureq, WindowControl wControl, BusinessGroup group, OLATResourceable ores,
String subIdentifier, String resourceName, boolean readOnly) {
super(ureq, wControl, "edit");
this.group = group;
this.ores = ores;
this.readOnly = readOnly;
this.subIdentifier = subIdentifier;
this.resourceName = resourceName;
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
reloadModel();
FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons-cont", getTranslator());
formLayout.add(buttonLayout);
newButton = uifactory.addFormLink("new", buttonLayout, Link.BUTTON);
newButton.setVisible(!readOnly);
occupiedRoomsLink = uifactory.addFormLink("roomsOverview", buttonLayout, Link.BUTTON);
}
@Override
protected void doDispose() {
// nothing to dispose
}
protected void reloadModel() {
try {
bookingDisplays.clear();
List<ViteroBooking> bookings = viteroManager.getBookings(group, ores, subIdentifier);
int i=0;
for(ViteroBooking booking:bookings) {
BookingDisplay display = new BookingDisplay(booking);
if(!readOnly) {
display.setDeleteButton(uifactory.addFormLink("delete_" + i++, "delete", "delete", flc, Link.BUTTON));
display.setEditButton(uifactory.addFormLink("edit_" + i++, "edit", "edit", flc, Link.BUTTON));
}
display.setUsersButton(uifactory.addFormLink("users_" + i++, "users", "users", flc, Link.BUTTON));
display.setGroupButton(uifactory.addFormLink("group_" + i++, "group.open", "group.open", flc, Link.BUTTON));
bookingDisplays.add(display);
}
flc.contextPut("bookingDisplays", bookingDisplays);
} catch (VmsNotAvailableException e) {
showError(VmsNotAvailableException.I18N_KEY);
}
}
@Override
protected void formOK(UserRequest ureq) {
fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if (source == newButton) {
newBooking(ureq);
} else if (source == occupiedRoomsLink) {
occupiedRooms(ureq);
} else if (source instanceof FormLink) {
for(BookingDisplay display: bookingDisplays) {
if(display.getDeleteButton() == source) {
confirmDeleteBooking(ureq, display);
break;
} else if(display.getEditButton() == source) {
ViteroBooking viteroBooking = display.getMeeting();
editBooking(ureq, viteroBooking);
break;
} else if(display.getUsersButton() == source) {
ViteroBooking viteroBooking = display.getMeeting();
usersBooking(ureq, viteroBooking);
break;
} else if(display.getGroupButton() == source) {
ViteroBooking viteroBooking = display.getMeeting();
openGroup(ureq, viteroBooking);
break;
}
}
reloadModel();
}
super.formInnerEvent(ureq, source, event);
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if (source == cmc ) {
removeAsListenerAndDispose(bookingController);
removeAsListenerAndDispose(cmc);
} else if (source == bookingController) {
if(Event.DONE_EVENT.equals(event)) {
fireEvent(ureq, event);
}
cmc.deactivate();
removeAsListenerAndDispose(bookingController);
removeAsListenerAndDispose(cmc);
reloadModel();
} else if(source == dialogCtr) {
if (DialogBoxUIFactory.isOkEvent(event)) {
ViteroBooking booking = (ViteroBooking)dialogCtr.getUserObject();
deleteBooking(booking);
}
} else if (source == warningGroupCtr) {
removeAsListenerAndDispose(warningGroupCtr);
warningGroupCtr = null;
}
}
protected void openGroup(UserRequest ureq, ViteroBooking booking) {
try {
if(viteroManager.isUserOf(booking, getIdentity())) {
String url = viteroManager.getURLToGroup(ureq.getIdentity(), booking);
if(url == null) {
showError("error.sessionCodeNull");
} else {
viteroGroupVC = createVelocityContainer("opengroup");
viteroGroupVC.contextPut("groupUrl", url);
removeAsListenerAndDispose(cmc);
cmc = new CloseableModalController(getWindowControl(), translate("close"), viteroGroupVC);
listenTo(cmc);
cmc.activate();
}
} else {
String title = translate("booking.group");
String text = translate("booking.group.warning");
List<String> buttonLabels = Collections.singletonList(translate("ok"));
warningGroupCtr = activateGenericDialog(ureq, title, text, buttonLabels, warningGroupCtr);
}
} catch (VmsNotAvailableException e) {
showError(VmsNotAvailableException.I18N_KEY);
}
}
protected void occupiedRooms(UserRequest ureq) {
removeAsListenerAndDispose(bookingController);
try {
roomsOverviewController = new ViteroRoomsOverviewController(ureq, getWindowControl());
listenTo(roomsOverviewController);
removeAsListenerAndDispose(cmc);
cmc = new CloseableModalController(getWindowControl(), translate("close"), roomsOverviewController.getInitialComponent(), true, translate("roomsOverview"));
listenTo(cmc);
cmc.activate();
} catch (VmsNotAvailableException e) {
showError(VmsNotAvailableException.I18N_KEY);
}
}
protected void deleteBooking(ViteroBooking booking) {
try {
if(viteroManager.deleteBooking(booking)) {
showInfo("delete.ok");
} else {
showError("delete.nok");
}
reloadModel();
} catch (VmsNotAvailableException e) {
showError(VmsNotAvailableException.I18N_KEY);
}
}
protected void confirmDeleteBooking(UserRequest ureq, BookingDisplay bookingDisplay) {
String title = translate("delete");
String text = translate("delete.confirm");
dialogCtr = activateOkCancelDialog(ureq, title, text, dialogCtr);
dialogCtr.setUserObject(bookingDisplay.getMeeting());
}
protected void newBooking(UserRequest ureq) {
try {
ViteroBooking viteroBooking = viteroManager.createBooking(resourceName);
editBooking(ureq, viteroBooking);
} catch (VmsNotAvailableException e) {
showError(VmsNotAvailableException.I18N_KEY);
}
}
protected void editBooking(UserRequest ureq, ViteroBooking viteroBooking) {
removeAsListenerAndDispose(bookingController);
bookingController = new ViteroBookingEditController(ureq, getWindowControl(), group, ores, subIdentifier, viteroBooking);
listenTo(bookingController);
removeAsListenerAndDispose(cmc);
cmc = new CloseableModalController(getWindowControl(), translate("close"), bookingController.getInitialComponent(), true, translate("edit"));
listenTo(cmc);
cmc.activate();
}
protected void usersBooking(UserRequest ureq, ViteroBooking viteroBooking) {
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(usersController);
usersController = new ViteroUserToGroupController(ureq, getWindowControl(), group, ores, viteroBooking, readOnly);
listenTo(usersController);
String title = translate("users.title");
cmc = new CloseableModalController(getWindowControl(), translate("close"), usersController.getInitialComponent(), true, title);
listenTo(cmc);
cmc.activate();
}
public class BookingDisplay {
private final ViteroBooking meeting;
private FormLink deleteButton;
private FormLink editButton;
private FormLink usersButton;
private FormLink groupButton;
public BookingDisplay(ViteroBooking meeting) {
this.meeting = meeting;
}
public ViteroBooking getMeeting() {
return meeting;
}
public String getGroupName() {
String name = meeting.getGroupName();
if(StringHelper.containsNonWhitespace(name)) {
return name;
}
return "";
}
public Date getBegin() {
return meeting.getStart();
}
public Date getEnd() {
return meeting.getEnd();
}
public FormLink getDeleteButton() {
return deleteButton;
}
public void setDeleteButton(FormLink deleteButton) {
this.deleteButton = deleteButton;
}
public FormLink getEditButton() {
return editButton;
}
public void setEditButton(FormLink editButton) {
this.editButton = editButton;
}
public FormLink getUsersButton() {
return usersButton;
}
public void setUsersButton(FormLink usersButton) {
this.usersButton = usersButton;
}
public FormLink getGroupButton() {
return groupButton;
}
public void setGroupButton(FormLink groupButton) {
this.groupButton = groupButton;
}
}
}