/**
* <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>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.gotomeeting.ui;
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.DateChooser;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
import org.olat.core.gui.components.form.flexible.elements.TextElement;
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.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.util.StringHelper;
import org.olat.group.BusinessGroup;
import org.olat.modules.gotomeeting.GoToMeeting;
import org.olat.modules.gotomeeting.GoToMeetingManager;
import org.olat.modules.gotomeeting.GoToOrganizer;
import org.olat.modules.gotomeeting.model.GoToError;
import org.olat.repository.RepositoryEntry;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 22.03.2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class EditTrainingController extends FormBasicController {
private SingleSelection organizersEl;
private TextElement nameEl, descriptionEl;
private DateChooser startDateEl, endDateEl;
private FormLink addMeAsOrganizerButton;
private List<GoToOrganizer> availablesOrganizers;
private final String subIdent;
private final RepositoryEntry entry;
private final BusinessGroup businessGroup;
private final GoToMeeting meeting;
private CloseableModalController cmc;
private EditOrganizerController addOrganizerController;
@Autowired
private GoToMeetingManager meetingManager;
public EditTrainingController(UserRequest ureq, WindowControl wControl,
RepositoryEntry entry, String subIdent, BusinessGroup businessGroup) {
super(ureq, wControl);
this.entry = entry;
this.subIdent = subIdent;
this.businessGroup = businessGroup;
this.meeting = null;
availablesOrganizers = meetingManager.getOrganizersFor(getIdentity());
initForm(ureq);
}
public EditTrainingController(UserRequest ureq, WindowControl wControl, GoToMeeting meeting) {
super(ureq, wControl);
this.entry = null;
this.subIdent = null;
this.businessGroup = null;
this.meeting = meeting;
availablesOrganizers = meetingManager.getOrganizersFor(getIdentity());
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
boolean isOrganizer = false;
String[] organizerKeys = new String[availablesOrganizers.size()];
String[] organizerValues = new String[availablesOrganizers.size()];
for(int i=availablesOrganizers.size(); i-->0; ) {
GoToOrganizer organizer = availablesOrganizers.get(i);
organizerKeys[i] = Integer.toString(i);
String label = organizer.getName();
if(!StringHelper.containsNonWhitespace(label)) {
label = organizer.getUsername();
}
organizerValues[i] = label;
if(organizer.getOwner() != null) {
isOrganizer = true;
}
}
organizersEl = uifactory.addDropdownSingleselect("organizers", "organizers", formLayout, organizerKeys, organizerValues, null);
organizersEl.setMandatory(true);
if(meeting != null && meeting.getOrganizer() != null) {
organizersEl.setVisible(false);
isOrganizer = true;
}
if(!isOrganizer) {
addMeAsOrganizerButton = uifactory.addFormLink("add.my.account", formLayout, Link.BUTTON);
}
String name = meeting == null ? "" : meeting.getName();
nameEl = uifactory.addTextElement("training.name", "training.name", 128, name, formLayout);
nameEl.setMandatory(true);
String description = meeting == null ? "" : meeting.getDescription();
descriptionEl = uifactory.addTextAreaElement("training.description", "training.description", 2000, 8, 72, false, description, formLayout);
Date startDate = meeting == null ? null : meeting.getStartDate();
startDateEl = uifactory.addDateChooser("training.start", "training.start", startDate, formLayout);
startDateEl.setMandatory(true);
startDateEl.setDateChooserTimeEnabled(true);
Date endDate = meeting == null ? null : meeting.getEndDate();
endDateEl = uifactory.addDateChooser("training.end", "training.end", endDate, formLayout);
endDateEl.setMandatory(true);
endDateEl.setDateChooserTimeEnabled(true);
FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
formLayout.add("buttons", buttonLayout);
uifactory.addFormSubmitButton("ok", buttonLayout);
uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
}
@Override
protected void doDispose() {
//
}
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
if(meeting == null || meeting.getOrganizer() == null) {
organizersEl.clearError();
if(!organizersEl.isOneSelected()) {
organizersEl.setErrorKey("form.mandatory.hover", null);
allOk &= false;
} else {
Date start = startDateEl.getDate();
Date end = endDateEl.getDate();
String selectedKeyStr = organizersEl.getSelectedKey();
int selectedIndex = Integer.parseInt(selectedKeyStr);
GoToOrganizer organizer = availablesOrganizers.get(selectedIndex);
if(start != null && end != null && organizer != null) {
if(!meetingManager.checkOrganizerAvailability(organizer, start, end)) {
organizersEl.setErrorKey("error.organizer.overbooked", null);
allOk &= false;
}
}
}
}
nameEl.clearError();
if(!StringHelper.containsNonWhitespace(nameEl.getValue())) {
nameEl.setErrorKey("form.mandatory.hover", null);
allOk &= false;
}
startDateEl.clearError();
if(startDateEl.getDate() == null) {
startDateEl.setErrorKey("form.mandatory.hover", null);
allOk &= false;
}
endDateEl.clearError();
if(endDateEl.getDate() == null) {
endDateEl.setErrorKey("form.mandatory.hover", null);
allOk &= false;
}
if(startDateEl.getDate() != null && endDateEl.getDate() != null) {
Date start = startDateEl.getDate();
Date end = endDateEl.getDate();
if(start.compareTo(end) >= 0) {
startDateEl.setErrorKey("error.start.after.end", null);
}
}
return allOk & super.validateFormLogic(ureq);
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(addOrganizerController == source) {
if(event == Event.DONE_EVENT) {
doSetPersonalAccount();
}
cmc.deactivate();
cleanUp();
} else if(cmc == source) {
cleanUp();
}
super.event(ureq, source, event);
}
private void cleanUp() {
removeAsListenerAndDispose(addOrganizerController);
removeAsListenerAndDispose(cmc);
addOrganizerController = null;
cmc = null;
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(addMeAsOrganizerButton == source) {
doAddPersonalAccount(ureq);
}
super.formInnerEvent(ureq, source, event);
}
@Override
protected void formOK(UserRequest ureq) {
String name = nameEl.getValue();
String description = descriptionEl.getValue();
Date start = startDateEl.getDate();
Date end = endDateEl.getDate();
GoToError error = new GoToError();
if(meeting == null) {
String selectedKeyStr = organizersEl.getSelectedKey();
int selectedIndex = Integer.parseInt(selectedKeyStr);
GoToOrganizer organizer = availablesOrganizers.get(selectedIndex);
meetingManager.scheduleTraining(organizer, name, null, description, start, end, entry, subIdent, businessGroup, error);
} else {
meetingManager.updateTraining(meeting, name, description, start, end, error);
}
if(error.hasError()) {
fireEvent(ureq, new GoToErrorEvent(error));
} else {
fireEvent(ureq, Event.DONE_EVENT);
}
}
@Override
protected void formCancelled(UserRequest ureq) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
private void doAddPersonalAccount(UserRequest ureq) {
if(addOrganizerController != null) return;
addOrganizerController = new EditOrganizerController(ureq, getWindowControl(), getIdentity());
listenTo(addOrganizerController);
cmc = new CloseableModalController(getWindowControl(), translate("close"), addOrganizerController.getInitialComponent(),
true, translate("add.organizer"));
cmc.activate();
listenTo(cmc);
}
private void doSetPersonalAccount() {
availablesOrganizers = meetingManager.getOrganizersFor(getIdentity());
String selectedKey = null;
String[] organizerKeys = new String[availablesOrganizers.size()];
String[] organizerValues = new String[availablesOrganizers.size()];
for(int i=availablesOrganizers.size(); i-->0; ) {
GoToOrganizer organizer = availablesOrganizers.get(i);
organizerKeys[i] = Integer.toString(i);
organizerValues[i] = organizer.getUsername();
if(organizer.getOwner() != null) {
selectedKey = organizerKeys[i];
}
}
organizersEl.setKeysAndValues(organizerKeys, organizerValues, null);
if(selectedKey != null) {
organizersEl.select(selectedKey, true);
addMeAsOrganizerButton.setVisible(false);
}
}
}