From 0f0535fbc81fbc545512b26d36ba2f3bb682f21f Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Wed, 1 Jul 2020 08:44:12 +0200
Subject: [PATCH] OO-4774: open group/folder in a new window in vitero edit
 bookings panel

---
 .../vitero/ui/ViteroBookingsController.java   |  8 +-
 .../ui/ViteroBookingsEditController.java      | 77 +++++++++++--------
 .../olat/modules/vitero/ui/_content/edit.html | 10 +--
 3 files changed, 56 insertions(+), 39 deletions(-)

diff --git a/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsController.java b/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsController.java
index 54ec7bc6779..caabf2cad88 100644
--- a/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsController.java
+++ b/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsController.java
@@ -79,10 +79,10 @@ public class ViteroBookingsController extends BasicController {
 		tableConfig.setTableEmptyMessage(translate("table.empty"));
 		tableConfig.setSortingEnabled(true);
 		tableCtr = new TableController(tableConfig, ureq, wControl, getTranslator());
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("group.name", ViteroBookingDataModel.Column.name.ordinal(), null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("booking.begin", ViteroBookingDataModel.Column.begin.ordinal(), null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("booking.end", ViteroBookingDataModel.Column.end.ordinal(), null, ureq.getLocale()));
-		tableCtr.addColumnDescriptor(new OpenGroupColumnDescriptor("booking.group", ViteroBookingDataModel.Column.group.ordinal(), ureq.getLocale(), getTranslator()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("group.name", ViteroBookingDataModel.Column.name.ordinal(), null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("booking.begin", ViteroBookingDataModel.Column.begin.ordinal(), null, getLocale()));
+		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("booking.end", ViteroBookingDataModel.Column.end.ordinal(), null, getLocale()));
+		tableCtr.addColumnDescriptor(new OpenGroupColumnDescriptor("booking.group", ViteroBookingDataModel.Column.group.ordinal(), getLocale(), getTranslator()));
 
 		if(!readOnly) {
 			StartColumnDescriptor startRoom = new StartColumnDescriptor("start", "start", ureq.getLocale(), viteroManager, getTranslator());
diff --git a/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsEditController.java b/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsEditController.java
index 56e84b79585..583a6c0e606 100644
--- a/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsEditController.java
+++ b/src/main/java/org/olat/modules/vitero/ui/ViteroBookingsEditController.java
@@ -20,11 +20,11 @@
 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.Component;
 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;
@@ -32,13 +32,15 @@ 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.components.link.LinkFactory;
 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.gui.media.MediaResource;
+import org.olat.core.gui.media.RedirectMediaResource;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.StringHelper;
 import org.olat.course.editor.NodeEditController;
@@ -69,13 +71,14 @@ public class ViteroBookingsEditController extends FormBasicController {
 	private ViteroBookingEditController bookingController;
 	private ViteroRoomsOverviewController roomsOverviewController;
 	private ViteroUserToGroupController usersController;
-	private VelocityContainer viteroGroupVC;
-	
+
+	private int count = 0;
 	private final boolean readOnly;
 	private final String resourceName;
 	private final BusinessGroup group;
 	private final OLATResourceable ores;
 	private final String subIdentifier;
+	
 	@Autowired
 	private ViteroManager viteroManager;
 
@@ -112,15 +115,8 @@ public class ViteroBookingsEditController extends FormBasicController {
 		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));
+				BookingDisplay display = forgeDisplay(booking);
 				bookingDisplays.add(display);
 			}
 			flc.contextPut("bookingDisplays", bookingDisplays);
@@ -128,6 +124,37 @@ public class ViteroBookingsEditController extends FormBasicController {
 			showError(VmsNotAvailableException.I18N_KEY);
 		}
 	}
+	
+	private BookingDisplay forgeDisplay(ViteroBooking booking) {
+		BookingDisplay display = new BookingDisplay(booking);
+		if(!readOnly) {
+			display.setDeleteButton(uifactory.addFormLink("delete_" + count++, "delete", "delete", flc, Link.BUTTON));
+			display.setEditButton(uifactory.addFormLink("edit_" + count++, "edit", "edit", flc, Link.BUTTON));
+		}
+		display.setUsersButton(uifactory.addFormLink("users_" + count++, "users", "users", flc, Link.BUTTON));
+		
+		FormLink groupButton = uifactory.addFormLink("group_" + count++, "group.open", "group.open", flc, Link.BUTTON);
+		groupButton.getComponent().setTarget("_blank");
+		
+		String linkId = "group_" + count++;
+		Link groupLink = LinkFactory.createLink(linkId, linkId, "group.open", "group.open", getTranslator(), flc.getFormItemComponent(), this, Link.BUTTON);
+		groupLink.setTarget("_blank");
+		groupLink.setUserObject(display);
+		display.setGroupButton(groupLink);
+		return display;
+	}
+
+	@Override
+	public void event(UserRequest ureq, Component source, Event event) {
+		if(source instanceof Link) {
+			Link link = (Link)source;
+			if("group.open".equals(link.getCommand()) && link.getUserObject() instanceof BookingDisplay) {
+				BookingDisplay bookingDisplay = (BookingDisplay)link.getUserObject();
+				openGroup(ureq, bookingDisplay.getMeeting());
+			}
+		}
+		super.event(ureq, source, event);
+	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
@@ -153,10 +180,6 @@ public class ViteroBookingsEditController extends FormBasicController {
 					ViteroBooking viteroBooking = display.getMeeting();
 					usersBooking(ureq, viteroBooking);
 					break;
-				} else if(display.getGroupButton() == source) {
-					ViteroBooking viteroBooking = display.getMeeting();
-					openGroup(ureq, viteroBooking);
-					break;
 				}
 			}
 			reloadModel();
@@ -195,18 +218,12 @@ public class ViteroBookingsEditController extends FormBasicController {
 				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();
+					MediaResource redirect = new RedirectMediaResource(url);
+					ureq.getDispatchResult().setResultingMediaResource(redirect);
 				}
 			} 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);
+				showWarning("booking.group.warning");
+
 			}
 		} catch (VmsNotAvailableException e) {
 			showError(VmsNotAvailableException.I18N_KEY);
@@ -214,7 +231,7 @@ public class ViteroBookingsEditController extends FormBasicController {
 	}
 	
 	protected void occupiedRooms(UserRequest ureq) {
-		removeAsListenerAndDispose(bookingController);
+		removeAsListenerAndDispose(roomsOverviewController);
 
 		try {
 			roomsOverviewController = new ViteroRoomsOverviewController(ureq, getWindowControl());			
@@ -288,7 +305,7 @@ public class ViteroBookingsEditController extends FormBasicController {
 		private FormLink deleteButton;
 		private FormLink editButton;
 		private FormLink usersButton;
-		private FormLink groupButton;
+		private Link groupButton;
 		
 		public BookingDisplay(ViteroBooking meeting) {
 			this.meeting = meeting;
@@ -338,11 +355,11 @@ public class ViteroBookingsEditController extends FormBasicController {
 			this.usersButton = usersButton;
 		}
 
-		public FormLink getGroupButton() {
+		public Link getGroupButton() {
 			return groupButton;
 		}
 
-		public void setGroupButton(FormLink groupButton) {
+		public void setGroupButton(Link groupButton) {
 			this.groupButton = groupButton;
 		}
 	}
diff --git a/src/main/java/org/olat/modules/vitero/ui/_content/edit.html b/src/main/java/org/olat/modules/vitero/ui/_content/edit.html
index d2e4c4fc96a..fc7f14faadf 100644
--- a/src/main/java/org/olat/modules/vitero/ui/_content/edit.html
+++ b/src/main/java/org/olat/modules/vitero/ui/_content/edit.html
@@ -5,10 +5,10 @@
 	<table class="table">
 		<thead>
 			<tr>
-				<th>$r.translate("group.name")</th>
-				<th>$r.translate("booking.begin")</th>
-				<th>$r.translate("booking.end")</th>
-				<th colspan="4"></th>
+				<th scope="col">$r.translate("group.name")</th>
+				<th scope="col">$r.translate("booking.begin")</th>
+				<th scope="col">$r.translate("booking.end")</th>
+				<th scope="col" colspan="4"></th>
 			</tr>
 		</thead>
 		<tbody>
@@ -19,7 +19,7 @@
 				<td>$r.formatDateAndTime($bookingDisplay.end)</td>
 				<td>$r.render($bookingDisplay.editButton.component.componentName)</td>
 				<td>$r.render($bookingDisplay.usersButton.component.componentName)</td>
-				<td>$r.render($bookingDisplay.groupButton.component.componentName)</td>
+				<td>$r.render($bookingDisplay.groupButton.componentName)</td>
 				<td>$r.render($bookingDisplay.deleteButton.component.componentName)</td>
 			</tr>
 		#end
-- 
GitLab