Skip to content
Snippets Groups Projects
Commit 2829c1bc authored by srosse's avatar srosse
Browse files

OO-5018: ask participant to BigBlueButton meeting for recording consent

parent d5135545
No related branches found
No related tags found
No related merge requests found
Showing
with 133 additions and 41 deletions
...@@ -39,6 +39,8 @@ public interface FormLink extends FormItem { ...@@ -39,6 +39,8 @@ public interface FormLink extends FormItem {
public boolean isNewWindowAfterDispatchUrl(); public boolean isNewWindowAfterDispatchUrl();
public boolean isNewWindowWithSubmit();
/** /**
* Specify if the link open a new window. This is not equivalent to the * Specify if the link open a new window. This is not equivalent to the
* method setUrl to open the link in a new window with Ctrl + click. The * method setUrl to open the link in a new window with Ctrl + click. The
...@@ -54,8 +56,9 @@ public interface FormLink extends FormItem { ...@@ -54,8 +56,9 @@ public interface FormLink extends FormItem {
* @param openInNewWindow Open a new window * @param openInNewWindow Open a new window
* @param afterDispatchUrl true if the URL will be send after the * @param afterDispatchUrl true if the URL will be send after the
* link is clicked with a JS command. * link is clicked with a JS command.
* @param withSubmit Form is submitted by the button
*/ */
public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl); public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl, boolean withSubmit);
public boolean isPopup(); public boolean isPopup();
......
...@@ -29,12 +29,12 @@ import java.io.IOException; ...@@ -29,12 +29,12 @@ import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import org.apache.logging.log4j.Logger;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.StringOutput;
import org.olat.core.logging.OLATRuntimeException; import org.olat.core.logging.OLATRuntimeException;
import org.apache.logging.log4j.Logger;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
/** /**
...@@ -135,8 +135,8 @@ public class FormJSHelper { ...@@ -135,8 +135,8 @@ public class FormJSHelper {
* @param pairs Additional name value pairs send by the link * @param pairs Additional name value pairs send by the link
* @return * @return
*/ */
public static String getXHRFnCallFor(FormItem item, boolean dirtyCheck, boolean pushState, NameValuePair... pairs) { public static String getXHRFnCallFor(FormItem item, boolean dirtyCheck, boolean pushState, boolean submit, NameValuePair... pairs) {
return getXHRFnCallFor(item.getRootForm(), item.getFormDispatchId(), 1, dirtyCheck, pushState, false, pairs); return getXHRFnCallFor(item.getRootForm(), item.getFormDispatchId(), 1, dirtyCheck, pushState, submit, pairs);
} }
/** /**
......
...@@ -67,6 +67,7 @@ public class FormLinkImpl extends FormItemImpl implements FormLink { ...@@ -67,6 +67,7 @@ public class FormLinkImpl extends FormItemImpl implements FormLink {
private boolean ownDirtyFormWarning = false; private boolean ownDirtyFormWarning = false;
private boolean newWindow; private boolean newWindow;
private boolean newWindowAfterDispatchUrl; private boolean newWindowAfterDispatchUrl;
private boolean newWindowWithSubmit;
private LinkPopupSettings popup; private LinkPopupSettings popup;
private String iconLeftCSS; private String iconLeftCSS;
private String iconRightCSS; private String iconRightCSS;
...@@ -149,8 +150,14 @@ public class FormLinkImpl extends FormItemImpl implements FormLink { ...@@ -149,8 +150,14 @@ public class FormLinkImpl extends FormItemImpl implements FormLink {
} }
@Override @Override
public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl) { public boolean isNewWindowWithSubmit() {
return newWindowWithSubmit;
}
@Override
public void setNewWindow(boolean openInNewWindow, boolean afterDispatchUrl, boolean withSubmit) {
newWindow = openInNewWindow; newWindow = openInNewWindow;
newWindowWithSubmit = withSubmit;
newWindowAfterDispatchUrl = afterDispatchUrl; newWindowAfterDispatchUrl = afterDispatchUrl;
if(component != null) { if(component != null) {
component.setNewWindow(openInNewWindow, afterDispatchUrl); component.setNewWindow(openInNewWindow, afterDispatchUrl);
......
...@@ -362,7 +362,8 @@ public class LinkRenderer extends DefaultComponentRenderer { ...@@ -362,7 +362,8 @@ public class LinkRenderer extends DefaultComponentRenderer {
boolean hasUrl = StringHelper.containsNonWhitespace(link.getUrl()); boolean hasUrl = StringHelper.containsNonWhitespace(link.getUrl());
String href = hasUrl ? link.getUrl() : "javascript:;"; String href = hasUrl ? link.getUrl() : "javascript:;";
sb.append("href=\"").append(href).append("\" onclick=\"") sb.append("href=\"").append(href).append("\" onclick=\"")
.append(FormJSHelper.getXHRFnCallFor(flexiLink, false, false, new NameValuePair("oo-opennewwindow-oo", "true"))) .append(FormJSHelper.getXHRFnCallFor(flexiLink, false, false, flexiLink.isNewWindowWithSubmit(),
new NameValuePair("oo-opennewwindow-oo", "true")))
.append("; return false;\""); .append("; return false;\"");
} else { } else {
String dispatchUri = flexiLink.getFormDispatchId(); String dispatchUri = flexiLink.getFormDispatchId();
......
...@@ -641,7 +641,7 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe ...@@ -641,7 +641,7 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe
sb.append("<li class='o_assessmentitem'>"); sb.append("<li class='o_assessmentitem'>");
sb.append("<button type='button' "); sb.append("<button type='button' ");
String key = itemNode.getKey().toString(); String key = itemNode.getKey().toString();
sb.onClickKeyEnter(FormJSHelper.getXHRFnCallFor(component.getQtiItem(), true, true, sb.onClickKeyEnter(FormJSHelper.getXHRFnCallFor(component.getQtiItem(), true, true, false,
new NameValuePair("cid", Event.reviewItem.name()), new NameValuePair("item", key))) new NameValuePair("cid", Event.reviewItem.name()), new NameValuePair("item", key)))
.append(" class='btn btn-default' ").append(" disabled", !reviewable).append("><span class='questionTitle'>") .append(" class='btn btn-default' ").append(" disabled", !reviewable).append("><span class='questionTitle'>")
.append(StringHelper.escapeHtml(itemNode.getSectionPartTitle())).append("</span>"); .append(StringHelper.escapeHtml(itemNode.getSectionPartTitle())).append("</span>");
......
...@@ -432,7 +432,7 @@ public abstract class AppointmentListController extends FormBasicController impl ...@@ -432,7 +432,7 @@ public abstract class AppointmentListController extends FormBasicController impl
name = name + " "; name = name + " ";
link.setI18nKey(name); link.setI18nKey(name);
link.setIconLeftCSS("o_icon o_icon_lg o_vc_icon"); link.setIconLeftCSS("o_icon o_icon_lg o_vc_icon");
link.setNewWindow(true, true); link.setNewWindow(true, true, false);
link.setUserObject(recording); link.setUserObject(recording);
recordingLinks.add(link); recordingLinks.add(link);
} }
......
...@@ -25,11 +25,13 @@ import org.olat.core.gui.UserRequest; ...@@ -25,11 +25,13 @@ import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem; 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.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.elements.TextElement; 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.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormEvent; 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.form.flexible.impl.FormLayoutContainer;
import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.util.KeyValues;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
...@@ -76,6 +78,7 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem ...@@ -76,6 +78,7 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
private TextElement nameEl; private TextElement nameEl;
private FormLink joinButton; private FormLink joinButton;
private MultipleSelectionElement acknowledgeRecordingEl;
private boolean readOnly = false; private boolean readOnly = false;
private boolean moderatorStartMeeting; private boolean moderatorStartMeeting;
...@@ -146,6 +149,12 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem ...@@ -146,6 +149,12 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
joinButton.setElementCssClass("o_sel_bbb_guest_join"); joinButton.setElementCssClass("o_sel_bbb_guest_join");
joinButton.setVisible(!end); joinButton.setVisible(!end);
joinButton.setTextReasonForDisabling(translate("warning.no.access")); joinButton.setTextReasonForDisabling(translate("warning.no.access"));
KeyValues acknowledgeKeyValue = new KeyValues();
acknowledgeKeyValue.add(KeyValues.entry("agree", translate("meeting.acknowledge.recording.agree")));
acknowledgeRecordingEl = uifactory.addCheckboxesHorizontal("meeting.acknowledge.recording", null, formLayout,
acknowledgeKeyValue.keys(), acknowledgeKeyValue.values());
acknowledgeRecordingEl.setVisible(!end && BigBlueButtonUIHelper.isRecord(meeting));
} }
private void reloadButtonsAndStatus() { private void reloadButtonsAndStatus() {
...@@ -182,6 +191,7 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem ...@@ -182,6 +191,7 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
} }
// update button style to indicate that the user must now press to start // update button style to indicate that the user must now press to start
joinButton.setPrimary(joinButton.isEnabled()); joinButton.setPrimary(joinButton.isEnabled());
acknowledgeRecordingEl.setVisible(joinButton.isEnabled() && BigBlueButtonUIHelper.isRecord(meeting));
} }
...@@ -277,6 +287,13 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem ...@@ -277,6 +287,13 @@ public class BigBlueButtonGuestJoinController extends FormBasicController implem
allOk &= false; allOk &= false;
} }
acknowledgeRecordingEl.clearError();
if(acknowledgeRecordingEl.isVisible()
&& acknowledgeRecordingEl.isEnabled() && !acknowledgeRecordingEl.isAtLeastSelected(1)) {
acknowledgeRecordingEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
return allOk; return allOk;
} }
......
...@@ -26,11 +26,11 @@ import java.util.TimerTask; ...@@ -26,11 +26,11 @@ import java.util.TimerTask;
import org.olat.core.commons.services.taskexecutor.TaskExecutorManager; import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.form.flexible.FormItem; 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.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController; 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.FormEvent;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
...@@ -40,9 +40,8 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable ...@@ -40,9 +40,8 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer;
import org.olat.core.gui.components.link.ExternalLink;
import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.util.KeyValues;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
...@@ -50,8 +49,6 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowC ...@@ -50,8 +49,6 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowC
import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.gui.control.winmgr.CommandFactory; import org.olat.core.gui.control.winmgr.CommandFactory;
import org.olat.core.gui.media.MediaResource;
import org.olat.core.gui.media.RedirectMediaResource;
import org.olat.core.helpers.Settings; import org.olat.core.helpers.Settings;
import org.olat.core.id.OLATResourceable; import org.olat.core.id.OLATResourceable;
import org.olat.core.util.Formatter; import org.olat.core.util.Formatter;
...@@ -91,8 +88,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -91,8 +88,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
private final boolean moderatorStartMeeting; private final boolean moderatorStartMeeting;
private final OLATResourceable meetingOres; private final OLATResourceable meetingOres;
private Link joinButton; private FormLink joinButton;
private ExternalLink guestJoinButton; private FormLink guestJoinButton;
private MultipleSelectionElement acknowledgeRecordingEl;
private FlexiTableElement tableEl; private FlexiTableElement tableEl;
private BigBlueButtonRecordingTableModel recordingTableModel; private BigBlueButtonRecordingTableModel recordingTableModel;
...@@ -167,19 +165,22 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -167,19 +165,22 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
} }
} }
joinButton = LinkFactory.createButtonLarge("meeting.join.button", flc.getFormItemComponent(), this); joinButton = uifactory.addFormLink("meeting.join.button", translate("meeting.join.button"), null,
formLayout, Link.BUTTON | Link.NONTRANSLATED);
joinButton.setElementCssClass("o_sel_bbb_join"); joinButton.setElementCssClass("o_sel_bbb_join");
joinButton.setTarget("_blank"); joinButton.setNewWindow(true, true, true);
joinButton.setVisible(!ended && !guest); joinButton.setVisible(!ended && !guest);
joinButton.setTextReasonForDisabling(translate("warning.no.access")); joinButton.setTextReasonForDisabling(translate("warning.no.access"));
String url = Settings.getServerContextPathURI() + "/bigbluebutton/" + meeting.getIdentifier(); guestJoinButton = uifactory.addFormLink("meeting.guest.join.button", formLayout, Link.BUTTON);
guestJoinButton = LinkFactory.createExternalLink("meeting.guest.join.button", "meeting.guest.join.button", url);
guestJoinButton.setElementCssClass("btn btn-lg btn-default o_sel_bbb_guest_join"); guestJoinButton.setElementCssClass("btn btn-lg btn-default o_sel_bbb_guest_join");
guestJoinButton.setName(translate("meeting.guest.join.button")); guestJoinButton.setNewWindow(true, true, true);
guestJoinButton.setTarget("_blank");
guestJoinButton.setVisible(!ended && guest); guestJoinButton.setVisible(!ended && guest);
flc.getFormItemComponent().put("meeting.guest.join.button", guestJoinButton);
KeyValues acknowledgeKeyValue = new KeyValues();
acknowledgeKeyValue.add(KeyValues.entry("agree", translate("meeting.acknowledge.recording.agree")));
acknowledgeRecordingEl = uifactory.addCheckboxesHorizontal("meeting.acknowledge.recording", null, formLayout,
acknowledgeKeyValue.keys(), acknowledgeKeyValue.values());
} }
private void initRecordings(FormItemContainer formLayout) { private void initRecordings(FormItemContainer formLayout) {
...@@ -303,9 +304,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -303,9 +304,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
if(moderator || administrator) { if(moderator || administrator) {
flc.contextPut("notStarted", Boolean.FALSE); flc.contextPut("notStarted", Boolean.FALSE);
if(!running && moderatorStartMeeting) { if(!running && moderatorStartMeeting) {
joinButton.setCustomDisplayText(translate("meeting.start.button")); joinButton.setI18nKey(translate("meeting.start.button"));
} else { } else {
joinButton.setCustomDisplayText(translate("meeting.join.button")); joinButton.setI18nKey(translate("meeting.join.button"));
} }
} else if(!running && moderatorStartMeeting) { } else if(!running && moderatorStartMeeting) {
flc.contextPut("notStarted", Boolean.TRUE); flc.contextPut("notStarted", Boolean.TRUE);
...@@ -327,6 +328,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -327,6 +328,9 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
guestJoinButton.setElementCssClass("btn btn-lg btn-default o_sel_bbb_guest_join"); guestJoinButton.setElementCssClass("btn btn-lg btn-default o_sel_bbb_guest_join");
} }
joinButton.setPrimary(joinButton.isEnabled()); joinButton.setPrimary(joinButton.isEnabled());
acknowledgeRecordingEl.setVisible(BigBlueButtonUIHelper.isRecord(meeting)
&& ((joinButton.isVisible() && joinButton.isEnabled())
|| (guestJoinButton.isEnabled() && guestJoinButton.isVisible())));
} }
@Override @Override
...@@ -344,14 +348,6 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -344,14 +348,6 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
} }
} }
@Override
public void event(UserRequest ureq, Component source, Event event) {
if(joinButton == source) {
doJoin(ureq);
}
super.event(ureq, source, event);
}
@Override @Override
protected void event(UserRequest ureq, Controller source, Event event) { protected void event(UserRequest ureq, Controller source, Event event) {
if(confirmDeleteRecordingDialog == source) { if(confirmDeleteRecordingDialog == source) {
...@@ -381,9 +377,29 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -381,9 +377,29 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
publishCtrl = null; publishCtrl = null;
} }
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = super.validateFormLogic(ureq);
if(acknowledgeRecordingEl != null) {
acknowledgeRecordingEl.clearError();
if(acknowledgeRecordingEl.isVisible()
&& acknowledgeRecordingEl.isEnabled() && !acknowledgeRecordingEl.isAtLeastSelected(1)) {
acknowledgeRecordingEl.setErrorKey("form.legende.mandatory", null);
allOk &= false;
}
}
return allOk;
}
@Override @Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(tableEl == source) { if(joinButton == source) {
doJoin(ureq);
} else if(this.guestJoinButton == source) {
doGuestJoin(ureq);
} else if(tableEl == source) {
if(event instanceof SelectionEvent) { if(event instanceof SelectionEvent) {
SelectionEvent se = (SelectionEvent)event; SelectionEvent se = (SelectionEvent)event;
if("delete".equals(se.getCommand())) { if("delete".equals(se.getCommand())) {
...@@ -415,12 +431,28 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -415,12 +431,28 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
listenTo(publishCalloutCtrl); listenTo(publishCalloutCtrl);
publishCalloutCtrl.activate(); publishCalloutCtrl.activate();
} }
private void doGuestJoin(UserRequest ureq) {
if(!validateFormLogic(ureq)) {
getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
return;
}
String meetingUrl = Settings.getServerContextPathURI() + "/bigbluebutton/" + meeting.getIdentifier();
getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowRedirectTo(meetingUrl));
}
private void doJoin(UserRequest ureq) { private void doJoin(UserRequest ureq) {
if(!validateFormLogic(ureq)) {
getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
return;
}
meeting = bigBlueButtonManager.getMeeting(meeting); meeting = bigBlueButtonManager.getMeeting(meeting);
if(meeting == null) { if(meeting == null) {
showWarning("warning.no.meeting"); showWarning("warning.no.meeting");
fireEvent(ureq, Event.BACK_EVENT); fireEvent(ureq, Event.BACK_EVENT);
getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
return; return;
} }
...@@ -436,16 +468,16 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen ...@@ -436,16 +468,16 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen
BigBlueButtonAttendeeRoles role = guest ? BigBlueButtonAttendeeRoles.guest : BigBlueButtonAttendeeRoles.viewer; BigBlueButtonAttendeeRoles role = guest ? BigBlueButtonAttendeeRoles.guest : BigBlueButtonAttendeeRoles.viewer;
meetingUrl = bigBlueButtonManager.join(meeting, getIdentity(), null, role, Boolean.TRUE, errors); meetingUrl = bigBlueButtonManager.join(meeting, getIdentity(), null, role, Boolean.TRUE, errors);
} }
redirectTo(ureq, meetingUrl, errors); redirectTo(meetingUrl, errors);
} }
private void redirectTo(UserRequest ureq, String meetingUrl, BigBlueButtonErrors errors) { private void redirectTo(String meetingUrl, BigBlueButtonErrors errors) {
if(errors.hasErrors()) { if(errors.hasErrors()) {
getWindowControl().setError(BigBlueButtonErrorHelper.formatErrors(getTranslator(), errors)); getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
} else if(StringHelper.containsNonWhitespace(meetingUrl)) { } else if(StringHelper.containsNonWhitespace(meetingUrl)) {
MediaResource redirect = new RedirectMediaResource(meetingUrl); getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowRedirectTo(meetingUrl));
ureq.getDispatchResult().setResultingMediaResource(redirect);
} else { } else {
getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowCancelRedirectTo());
showWarning("warning.no.access"); showWarning("warning.no.access");
} }
} }
......
...@@ -240,6 +240,12 @@ public class BigBlueButtonUIHelper { ...@@ -240,6 +240,12 @@ public class BigBlueButtonUIHelper {
return followupTime; return followupTime;
} }
public static boolean isRecord(BigBlueButtonMeeting meeting) {
return meeting != null && meeting.getTemplate() != null
&& meeting.getTemplate().getRecord() != null
&& meeting.getTemplate().getRecord().booleanValue();
}
private static BigBlueButtonManager getBigBlueButtonManager() { private static BigBlueButtonManager getBigBlueButtonManager() {
return CoreSpringFactory.getImpl(BigBlueButtonManager.class); return CoreSpringFactory.getImpl(BigBlueButtonManager.class);
} }
......
...@@ -31,6 +31,18 @@ ...@@ -31,6 +31,18 @@
</div> </div>
#end #end
</div> </div>
#if($r.visible("meeting.acknowledge.recording"))
<div class="o_warning">
<h4>$r.translate("meeting.acknowledge.recording.explain.title")</h4>
<p>$r.translate("meeting.acknowledge.recording.explain")</p>
$r.render("meeting.acknowledge.recording")
#if($f.hasError("meeting.acknowledge.recording"))
$r.render("meeting.acknowledge.recording_ERROR")
#end
</div>
#end
<div class=o_button_group> <div class=o_button_group>
$r.render("meeting.join.button") $r.render("meeting.join.button")
</div> </div>
......
...@@ -34,10 +34,18 @@ ...@@ -34,10 +34,18 @@
<div class="o_block_large o_info">$r.translate("meeting.create.intro")</div> <div class="o_block_large o_info">$r.translate("meeting.create.intro")</div>
#end #end
<div class="o_button_group"> #if($r.visible("meeting.acknowledge.recording"))
#if($r.available("meeting.start.button") && $r.visible("meeting.start.button")) <div class="o_warning">
$r.render("meeting.start.button") <h4>$r.translate("meeting.acknowledge.recording.explain.title")</h4>
<p>$r.translate("meeting.acknowledge.recording.explain")</p>
$r.render("meeting.acknowledge.recording")
#if($f.hasError("meeting.acknowledge.recording"))
$r.render("meeting.acknowledge.recording_ERROR")
#end
</div>
#end #end
<div class="o_button_group">
#if($r.available("meeting.join.button") && $r.visible("meeting.join.button")) #if($r.available("meeting.join.button") && $r.visible("meeting.join.button"))
$r.render("meeting.join.button") $r.render("meeting.join.button")
#end #end
......
...@@ -62,6 +62,9 @@ filter.all.instances=Alle OpenOlats ...@@ -62,6 +62,9 @@ filter.all.instances=Alle OpenOlats
filter.this.instance=Dieses OpenOlat filter.this.instance=Dieses OpenOlat
layout.standard=Standard layout.standard=Standard
layout.webcam=Webcam Termin layout.webcam=Webcam Termin
meeting.acknowledge.recording.agree=Ich bin einverstanden
meeting.acknowledge.recording.explain=Dieses Meeting mit allen Video-, Audio-, Chat-Nachrichten- und Whiteboard-Anmerkungen wird aufgezeichnet und kann nach dem Meeting ver\u00F6ffentlicht werden.
meeting.acknowledge.recording.explain.title=Aufzeichnungen
meeting.create.intro=Der Online-Termin wurde vom Betreuer noch nicht er\u00f6ffnet. Teilnehmer k\u00f6nnen den Raum noch nicht betreten. meeting.create.intro=Der Online-Termin wurde vom Betreuer noch nicht er\u00f6ffnet. Teilnehmer k\u00f6nnen den Raum noch nicht betreten.
meeting.creator=Erstellt durch meeting.creator=Erstellt durch
meeting.day=Datum des Meetings meeting.day=Datum des Meetings
......
...@@ -62,6 +62,9 @@ filter.all.instances=All OpenOlats ...@@ -62,6 +62,9 @@ filter.all.instances=All OpenOlats
filter.this.instance=This OpenOlat filter.this.instance=This OpenOlat
layout.standard=Standard layout.standard=Standard
layout.webcam=Webcam meeting layout.webcam=Webcam meeting
meeting.acknowledge.recording.agree=I agree
meeting.acknowledge.recording.explain=This meeting including all video, audio, chat message and whiteboard annotations will be recorded and can be published after the meeting.
meeting.acknowledge.recording.explain.title=Meeting recording
meeting.create.intro=The meeting has not yet been started by the coach. Participants are not able to enter the classroom. meeting.create.intro=The meeting has not yet been started by the coach. Participants are not able to enter the classroom.
meeting.creator=Creator meeting.creator=Creator
meeting.day=Date of the meeting meeting.day=Date of the meeting
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment