From d36d7a279ae439792f0382036579ccecaa249d28 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 7 Aug 2014 17:20:00 +0200
Subject: [PATCH] OO-984: make the thumbnail in "my courses" list clickable

---
 .../form/flexible/FormDecorator.java          | 88 -------------------
 .../components/form/flexible/impl/Form.java   |  4 +
 ...mDecoratorImpl.java => FormDecorator.java} | 15 +++-
 .../form/flexible/impl/FormItemImpl.java      |  3 +-
 .../flexible/impl/FormLayoutContainer.java    |  2 +-
 .../table/FlexiTableCustomRenderer.java       |  3 +
 .../ui/list/CatalogNodeController.java        | 10 ++-
 .../list/RepositoryEntryListController.java   | 21 +++++
 .../repository/ui/list/_content/row_1.html    |  4 +-
 9 files changed, 52 insertions(+), 98 deletions(-)
 delete mode 100644 src/main/java/org/olat/core/gui/components/form/flexible/FormDecorator.java
 rename src/main/java/org/olat/core/gui/components/form/flexible/impl/{FormDecoratorImpl.java => FormDecorator.java} (91%)

diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/FormDecorator.java b/src/main/java/org/olat/core/gui/components/form/flexible/FormDecorator.java
deleted file mode 100644
index 7bd2000b918..00000000000
--- a/src/main/java/org/olat/core/gui/components/form/flexible/FormDecorator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
-* OLAT - Online Learning and Training<br>
-* http://www.olat.org
-* <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
-* <p>
-* http://www.apache.org/licenses/LICENSE-2.0
-* <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>
-* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
-* University of Zurich, Switzerland.
-* <hr>
-* <a href="http://www.openolat.org">
-* OpenOLAT - Online Learning and Training</a><br>
-* This file has been modified by the OpenOLAT community. Changes are licensed
-* under the Apache 2.0 license as the original file.
-*/
-package org.olat.core.gui.components.form.flexible;
-/**
- * 
- * @author patrickb
- *
- */
-public interface FormDecorator {
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean hasError(String formItemName);
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean hasExample(String formItemName);
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean hasLabel(String formItemName);
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean isMandatory(String formItemName);
-	
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean isVisible(String formItemName);
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean isEnabled(String formItemName);
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public String getItemId(String formItemName);
-
-	/**
-	 * 
-	 * @param formItemName
-	 * @return
-	 */
-	public boolean isSpacerElement(String formItemName);
-}
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
index 5fdc3ec4353..4ddd5c6f489 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
@@ -523,6 +523,10 @@ public class Form extends LogDelegator {
 	ComponentCollection getFormLayout() {
 		return (ComponentCollection) formLayout.getComponent();
 	}
+	
+	FormItemContainer getFormItemContainer() {
+		return formLayout;
+	}
 
 	public Component getInitialComponent() {
 		return formWrapperComponent;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecoratorImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java
similarity index 91%
rename from src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecoratorImpl.java
rename to src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java
index 22dbbf5636c..412684fefb8 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecoratorImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java
@@ -27,7 +27,6 @@ package org.olat.core.gui.components.form.flexible.impl;
 
 import java.util.Map;
 
-import org.olat.core.gui.components.form.flexible.FormDecorator;
 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.SpacerElement;
@@ -42,11 +41,15 @@ import org.olat.core.util.StringHelper;
  * 
  * @author patrickb
  */
-public class FormDecoratorImpl implements FormDecorator {
+public class FormDecorator {
 
 	private final FormItemContainer container;
+	
+	public FormDecorator(Form theForm) {
+		this.container = theForm.getFormItemContainer();
+	}
 
-	public FormDecoratorImpl(FormItemContainer container) {
+	public FormDecorator(FormItemContainer container) {
 		this.container = container;
 	}
 	
@@ -121,6 +124,12 @@ public class FormDecoratorImpl implements FormDecorator {
 			return (item instanceof SpacerElement);
 	}
 	
+	public String ffXHREvent(String key, String value) {
+		Form theForm = container.getRootForm();
+		String elementId = "o_fi" + container.getComponent().getDispatchID();
+		return FormJSHelper.getXHRFnCallFor(theForm, elementId, 1, new NameValuePair(key, value));
+	}
+	
 	public String getContainerCssClass() {
 		if (container != null && StringHelper.containsNonWhitespace(container.getElementCssClass())) {
 			return " " + container.getElementCssClass();
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java
index 59beb195dc3..a67ef4fd603 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java
@@ -474,8 +474,7 @@ public abstract class FormItemImpl implements FormItem, InlineElement {
 			return;
 		}
 		//before/ after pattern
-		int action = getRootForm().getAction();
-		switch (action) {
+		switch (getRootForm().getAction()) {
 			case FormEvent.ONCLICK:
 				getRootForm().fireFormEvent(ureq, new FormEvent("ONCLICK", this, FormEvent.ONCLICK));
 				break;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java
index 2eb4e7bc1f7..1f4c1a09b43 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java
@@ -122,7 +122,7 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain
 		}
 		translator = formTranslator;
 		// add the form decorator for the $f.hasError("ddd") etc.
-		formLayoutContainer.contextPut("f", new FormDecoratorImpl(this));
+		formLayoutContainer.contextPut("f", new FormDecorator(this));
 		// this container manages the form items, the GUI form item componentes are
 		// managed in the associated velocitycontainer
 		formComponentsNames = new ArrayList<String>(5);
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
index 6665ca5ef46..12015ae60de 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
@@ -23,6 +23,7 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.form.flexible.FormItem;
+import org.olat.core.gui.components.form.flexible.impl.FormDecorator;
 import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.render.RenderResult;
@@ -92,6 +93,7 @@ class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements Com
 
 		FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
 		VelocityContainer container = ftE.getRowRenderer();
+		container.contextPut("f", new FormDecorator(ftE.getRootForm()));
 
 		FlexiTableDataModel<?> dataModel = ftE.getTableDataModel();
 		Object rowObject = ftE.getTableDataModel().getObject(row);
@@ -127,6 +129,7 @@ class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements Com
 
 		container.getHTMLRendererSingleton().render(renderer, sb, container, ubu, translator, renderResult, null);
 		container.contextRemove("row");
+		container.contextRemove("f");
 
 		sb.append("</div>");
 	}
diff --git a/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java b/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java
index 255510eab8e..da4fd9c0e86 100644
--- a/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java
+++ b/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java
@@ -160,9 +160,13 @@ public class CatalogNodeController extends BasicController implements Activateab
 		} else if("img_select".equals(event.getCommand())) {
 			String node = ureq.getParameter("node");
 			if(StringHelper.isLong(node)) {
-				Long categoryNodeKey = new Long(node);
-				CatalogEntry entry = catalogManager.getCatalogNodeByKey(categoryNodeKey);
-				selectCatalogEntry(ureq, entry);
+				try {
+					Long categoryNodeKey = new Long(node);
+					CatalogEntry entry = catalogManager.getCatalogNodeByKey(categoryNodeKey);
+					selectCatalogEntry(ureq, entry);
+				} catch (NumberFormatException e) {
+					logWarn("Not a valid long: " + node, e);
+				}
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
index ed050383e06..ce42dbed61a 100644
--- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
@@ -318,6 +318,27 @@ public class RepositoryEntryListController extends FormBasicController
 				doFilter(selectedFilters);
 				flc.setDirty(true);
 			}
+		} else if(source == mainForm.getInitialComponent()) {
+			if("ONCLICK".equals(event.getCommand())) {
+				String rowKeyStr = ureq.getParameter("select_row");
+				if(StringHelper.isLong(rowKeyStr)) {
+					try {
+						Long rowKey = new Long(rowKeyStr);
+						List<RepositoryEntryRow> rows = model.getObjects();
+						for(RepositoryEntryRow row:rows) {
+							if(row.getKey().equals(rowKey)) {
+								if (row.isMember()) {
+									doOpen(ureq, row);					
+								} else {
+									doOpenDetails(ureq, row);
+								}
+							}
+						}
+					} catch (NumberFormatException e) {
+						logWarn("Not a valid long: " + rowKeyStr, e);
+					}
+				}
+			}
 		}
 		super.event(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/repository/ui/list/_content/row_1.html b/src/main/java/org/olat/repository/ui/list/_content/row_1.html
index ee840d406ca..d3a3c1251c4 100644
--- a/src/main/java/org/olat/repository/ui/list/_content/row_1.html
+++ b/src/main/java/org/olat/repository/ui/list/_content/row_1.html
@@ -1,10 +1,12 @@
 <div #if($row.selected) class="o_selected" #end>
 	<div class="o_visual">
+		<a href="javascript:${f.ffXHREvent("select_row","$row.key")}">
 		#if($row.isThumbnailAvailable())
 			<img src="${row.getThumbnailRelPath()}" />
 		#else
 			<div class="o_visual_not_available"></div>
-		#end	
+		#end
+		</a>	
 	</div>
 	<div class="o_meta o_withEllipsis">
 		<div class="o_go_xs visible-xs">
-- 
GitLab