From 495e43c7f59c77cee64eaa0626e8469b5afc61ee Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 2 Jul 2014 09:47:35 +0200
Subject: [PATCH] OO-990: better update after changes on repository entries,
 small fixes

---
 .../OverviewBusinessGroupListController.java  |  71 +++++++-----
 .../olat/repository/RepositoryManager.java    |   5 +-
 .../ui/author/AuthorListController.java       |  23 +++-
 .../AuthoringEntryDetailsController.java      |   6 +
 .../author/OverviewAuthoringController.java   |  69 ++++++-----
 .../OverviewRepositoryListController.java     | 107 +++++++++---------
 .../RepositoryEntryDetailsController.java     |   9 ++
 .../ProfileAndHomePageEditController.java     |   6 +-
 8 files changed, 178 insertions(+), 118 deletions(-)

diff --git a/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java
index 1f32ec93c16..22e000c0e33 100644
--- a/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/OverviewBusinessGroupListController.java
@@ -120,6 +120,17 @@ public class OverviewBusinessGroupListController extends BasicController impleme
 			}
 		}
 	}
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(favoritGroupsCtrl);
+		removeAsListenerAndDispose(myGroupsCtrl);
+		removeAsListenerAndDispose(openGroupsCtrl);
+		removeAsListenerAndDispose(searchGroupsCtrl);
+		favoritGroupsCtrl = null;
+		myGroupsCtrl = null;
+		openGroupsCtrl = null;
+		searchGroupsCtrl = null;
+	}
 
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
@@ -152,13 +163,14 @@ public class OverviewBusinessGroupListController extends BasicController impleme
 	}
 
 	private FavoritBusinessGroupListController updateMarkedGroups(UserRequest ureq) {
-		if(favoritGroupsCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			favoritGroupsCtrl = new FavoritBusinessGroupListController(ureq, bwControl);
-			listenTo(favoritGroupsCtrl);
-		}
+		cleanUp();
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		favoritGroupsCtrl = new FavoritBusinessGroupListController(ureq, bwControl);
+		listenTo(favoritGroupsCtrl);
+		
 		favoritGroupsCtrl.doDefaultSearch();
 		mainVC.put("groupList", favoritGroupsCtrl.getInitialComponent());
 		addToHistory(ureq, favoritGroupsCtrl);
@@ -166,13 +178,14 @@ public class OverviewBusinessGroupListController extends BasicController impleme
 	}
 	
 	private BusinessGroupListController updateMyGroups(UserRequest ureq) {
-		if(myGroupsCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("AllGroups", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			myGroupsCtrl = new BusinessGroupListController(ureq, bwControl);
-			listenTo(myGroupsCtrl);
-		}
+		cleanUp();
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("AllGroups", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		myGroupsCtrl = new BusinessGroupListController(ureq, bwControl);
+		listenTo(myGroupsCtrl);
+
 		myGroupsCtrl.doDefaultSearch();
 		mainVC.put("groupList", myGroupsCtrl.getInitialComponent());
 		addToHistory(ureq, myGroupsCtrl);
@@ -180,13 +193,14 @@ public class OverviewBusinessGroupListController extends BasicController impleme
 	}
 	
 	private OpenBusinessGroupListController updateOpenGroups(UserRequest ureq) {
-		if(openGroupsCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("OwnedGroups", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			openGroupsCtrl = new OpenBusinessGroupListController(ureq, bwControl);
-			listenTo(openGroupsCtrl);
-		}
+		cleanUp();
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("OwnedGroups", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		openGroupsCtrl = new OpenBusinessGroupListController(ureq, bwControl);
+		listenTo(openGroupsCtrl);
+
 		openGroupsCtrl.doDefaultSearch();
 		mainVC.put("groupList", openGroupsCtrl.getInitialComponent());
 		addToHistory(ureq, openGroupsCtrl);
@@ -194,13 +208,14 @@ public class OverviewBusinessGroupListController extends BasicController impleme
 	}
 	
 	private SearchBusinessGroupListController updateSearch(UserRequest ureq) {
-		if(searchGroupsCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			searchGroupsCtrl = new SearchBusinessGroupListController(ureq, bwControl);
-			listenTo(searchGroupsCtrl);
-		}
+		cleanUp();
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		searchGroupsCtrl = new SearchBusinessGroupListController(ureq, bwControl);
+		listenTo(searchGroupsCtrl);
+
 		mainVC.put("groupList", searchGroupsCtrl.getInitialComponent());
 		addToHistory(ureq, searchGroupsCtrl);
 		return searchGroupsCtrl;
diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index 85856652ca2..66f51aabc81 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -1684,7 +1684,7 @@ public class RepositoryManager extends BasicManager {
 	
 	public List<RepositoryEntryLight> getParticipantRepositoryEntry(IdentityRef identity, int maxResults, RepositoryEntryOrder... orderby) {
 		StringBuilder sb = new StringBuilder(200);
-		sb.append("select v from repoentrylight as v ")
+		sb.append("select distinct v from repoentrylight as v ")
 		  .append(" inner join fetch v.olatResource as res ")
 		  .append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
@@ -1699,8 +1699,7 @@ public class RepositoryManager extends BasicManager {
 			query.setMaxResults(maxResults);
 		}
 
-		List<RepositoryEntryLight> repoEntries = query.getResultList();
-		return repoEntries;
+		return query.getResultList();
 	}
 	
 	public List<RepositoryEntryLight> getTutorRepositoryEntry(IdentityRef identity, int maxResults, RepositoryEntryOrder... orderby) {
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
index 0789593140f..abfb40f4702 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
@@ -55,6 +55,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlex
 import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
+import org.olat.core.gui.components.stack.PopEvent;
 import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
 import org.olat.core.gui.control.Controller;
@@ -117,6 +118,8 @@ public class AuthorListController extends FormBasicController implements Activat
 	private Link importLink;
 	private Dropdown createDropdown;
 	private FormLink addOwnersButton;
+	//only used as marker for dirty, model cannot load specific rows
+	private final List<Integer> dirtyRows = new ArrayList<>();
 	
 	@Autowired
 	private MarkManager markManager;
@@ -283,6 +286,11 @@ public class AuthorListController extends FormBasicController implements Activat
 			if(handler != null) {
 				doCreate(ureq, handler);
 			}
+		} else if(event instanceof PopEvent) {
+			PopEvent pop = (PopEvent)event;
+			if(pop.getController() == detailsCtrl) {
+				reloadDirtyRows();
+			}
 		}
 		super.event(ureq, source, event);
 	}
@@ -321,9 +329,6 @@ public class AuthorListController extends FormBasicController implements Activat
 				SearchEvent se = (SearchEvent)event;
 				doSearch(se);
 			} else if(event == Event.CANCELLED_EVENT) {
-				System.out.println();
-				//removeSearchParameters();
-				
 				searchParams.setResourceTypes(null);
 				searchParams.setIdAndRefs(null);
 				searchParams.setAuthor(null);
@@ -335,6 +340,11 @@ public class AuthorListController extends FormBasicController implements Activat
 				OpenEvent oe = (OpenEvent)event;
 				RepositoryEntryRef repoEntryKey = oe.getRepositoryEntry();
 				doOpenDetails(ureq, repoEntryKey);
+			} else if (event == Event.CHANGED_EVENT || event == Event.DONE_EVENT) {
+				dirtyRows.add(new Integer(-1));
+				/*
+				System.out.println("Mark as dirty");
+				*/
 			}
 		} else if(userSearchCtr == source) {
 			@SuppressWarnings("unchecked")
@@ -419,6 +429,13 @@ public class AuthorListController extends FormBasicController implements Activat
 		//do not update the 
 	}
 	
+	protected void reloadDirtyRows() {
+		if(dirtyRows.size() > 0) {
+			tableEl.reloadData();
+			dirtyRows.clear();
+		}
+	}
+	
 	private AuthoringEntryDetailsController doOpenDetails(UserRequest ureq, RepositoryEntryRef ref) {
 		stackPanel.popUpToRootController(ureq);
 
diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java
index 86f11a91a4a..0e07f8c97ea 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java
@@ -159,6 +159,10 @@ public class AuthoringEntryDetailsController extends RepositoryEntryDetailsContr
 		}
 	}
 	
+	public RepositoryEntryRef getRef() {
+		return entry;
+	}
+	
 	
 	private void initToolbar(UserRequest ureq) {
 		// init handler details
@@ -462,7 +466,9 @@ public class AuthoringEntryDetailsController extends RepositoryEntryDetailsContr
 			if (event == Event.CHANGED_EVENT || event == Event.DONE_EVENT) {
 				// RepositoryEntry changed
 				entry = repositoryService.loadByKey(entry.getKey());
+				flc.contextPut("v", entry);
 				updateView(ureq, flc);
+				fireEvent(ureq, event);
 			}
 		} else if (deleteDialogCtrl == source){
 			if (DialogBoxUIFactory.isYesEvent(event)){
diff --git a/src/main/java/org/olat/repository/ui/author/OverviewAuthoringController.java b/src/main/java/org/olat/repository/ui/author/OverviewAuthoringController.java
index 25b7600d819..89f88b2c8cb 100644
--- a/src/main/java/org/olat/repository/ui/author/OverviewAuthoringController.java
+++ b/src/main/java/org/olat/repository/ui/author/OverviewAuthoringController.java
@@ -136,20 +136,29 @@ public class OverviewAuthoringController extends BasicController implements Acti
 			}
 		}
 	}
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(markedCtrl);
+		removeAsListenerAndDispose(myEntriesCtrl);
+		removeAsListenerAndDispose(searchEntriesCtrl);
+		markedCtrl = null;
+		myEntriesCtrl = null;
+		searchEntriesCtrl = null;
+	}
 
 	private AuthorListController doOpenMark(UserRequest ureq) {
-		if(markedCtrl == null) {
-			SearchAuthorRepositoryEntryViewParams searchParams
-				= new SearchAuthorRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles());
-			searchParams.setMarked(Boolean.TRUE);
-			searchParams.setOwnedResourcesOnly(false);
+		cleanUp();
+		
+		SearchAuthorRepositoryEntryViewParams searchParams
+			= new SearchAuthorRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles());
+		searchParams.setMarked(Boolean.TRUE);
+		searchParams.setOwnedResourcesOnly(false);
 
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			markedCtrl = new AuthorListController(ureq, bwControl, "search.mark", searchParams, false);
-			listenTo(markedCtrl);
-		}
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		markedCtrl = new AuthorListController(ureq, bwControl, "search.mark", searchParams, false);
+		listenTo(markedCtrl);
 		
 		addToHistory(ureq, markedCtrl);
 		mainVC.put("segmentCmp", markedCtrl.getStackPanel());
@@ -157,17 +166,17 @@ public class OverviewAuthoringController extends BasicController implements Acti
 	}
 	
 	private AuthorListController doOpenMyEntries(UserRequest ureq) {
-		if(myEntriesCtrl == null) {
-			SearchAuthorRepositoryEntryViewParams searchParams
-				= new SearchAuthorRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles());
-			searchParams.setOwnedResourcesOnly(true);
+		cleanUp();
 
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("My", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			myEntriesCtrl = new AuthorListController(ureq, bwControl, "search.my", searchParams, false);
-			listenTo(myEntriesCtrl);
-		}
+		SearchAuthorRepositoryEntryViewParams searchParams
+			= new SearchAuthorRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles());
+		searchParams.setOwnedResourcesOnly(true);
+
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("My", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		myEntriesCtrl = new AuthorListController(ureq, bwControl, "search.my", searchParams, false);
+		listenTo(myEntriesCtrl);
 
 		addToHistory(ureq, myEntriesCtrl);
 		mainVC.put("segmentCmp", myEntriesCtrl.getStackPanel());
@@ -175,16 +184,16 @@ public class OverviewAuthoringController extends BasicController implements Acti
 	}
 	
 	private AuthorListController doSearchEntries(UserRequest ureq) {
-		if(searchEntriesCtrl == null) {
-			SearchAuthorRepositoryEntryViewParams searchParams
-				= new SearchAuthorRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles());
-			searchParams.setOwnedResourcesOnly(false);
+		cleanUp();
 
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			searchEntriesCtrl = new AuthorListController(ureq, bwControl, "search.generic", searchParams, true);
-		}
+		SearchAuthorRepositoryEntryViewParams searchParams
+			= new SearchAuthorRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles());
+		searchParams.setOwnedResourcesOnly(false);
+
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		searchEntriesCtrl = new AuthorListController(ureq, bwControl, "search.generic", searchParams, true);
 		
 		addToHistory(ureq, searchEntriesCtrl);
 		mainVC.put("segmentCmp", searchEntriesCtrl.getStackPanel());
diff --git a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
index 63ebc253a00..f7496d1bf35 100644
--- a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
@@ -179,19 +179,19 @@ public class OverviewRepositoryListController extends BasicController implements
 	}
 	
 	private RepositoryEntryListController doOpenMark(UserRequest ureq) {
-		if(markedCtrl == null) {
-			SearchMyRepositoryEntryViewParams searchParams
-				= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
-			searchParams.setMarked(Boolean.TRUE);
+		cleanUp();
+		
+		SearchMyRepositoryEntryViewParams searchParams
+			= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
+		searchParams.setMarked(Boolean.TRUE);
 
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			markedStackPanel = new BreadcrumbedStackedPanel("mrkstack", getTranslator(), this);
-			markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, true, false, "marked", markedStackPanel);
-			markedStackPanel.pushController(translate("search.mark"), markedCtrl);
-			listenTo(markedCtrl);
-		}
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Favorits", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		markedStackPanel = new BreadcrumbedStackedPanel("mrkstack", getTranslator(), this);
+		markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, true, false, "marked", markedStackPanel);
+		markedStackPanel.pushController(translate("search.mark"), markedCtrl);
+		listenTo(markedCtrl);
 
 		addToHistory(ureq, markedCtrl);
 		mainVC.put("segmentCmp", markedStackPanel);
@@ -199,43 +199,44 @@ public class OverviewRepositoryListController extends BasicController implements
 	}
 	
 	private RepositoryEntryListController doOpenMyCourses(UserRequest ureq) {
-		if(myCoursesCtrl == null) {
-			SearchMyRepositoryEntryViewParams searchParams
-				= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
-			searchParams.setMembershipMandatory(true);
+		cleanUp();
+	
+		SearchMyRepositoryEntryViewParams searchParams
+			= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
+		searchParams.setMembershipMandatory(true);
+
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("My", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		myCoursesStackPanel = new BreadcrumbedStackedPanel("mystack", getTranslator(), this);
+		myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, true, false, "my", myCoursesStackPanel);
+		myCoursesStackPanel.pushController(translate("search.mycourses.student"), myCoursesCtrl);
+		listenTo(myCoursesCtrl);
 
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("My", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			myCoursesStackPanel = new BreadcrumbedStackedPanel("mystack", getTranslator(), this);
-			myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, true, false, "my", myCoursesStackPanel);
-			myCoursesStackPanel.pushController(translate("search.mycourses.student"), myCoursesCtrl);
-			listenTo(myCoursesCtrl);
-		}
-		
 		addToHistory(ureq, myCoursesCtrl);
 		mainVC.put("segmentCmp", myCoursesStackPanel);
 		return myCoursesCtrl;
 	}
 	
 	private CatalogNodeController doOpenCatalog(UserRequest ureq) {
-		if(!repositoryModule.isCatalogEnabled() || !repositoryModule.isCatalogBrowsingEnabled()) return null;
-		
-		if(catalogCtrl == null) {
-			List<CatalogEntry> entries = catalogManager.getRootCatalogEntries();
-			CatalogEntry rootEntry = null;
-			if(entries.size() > 0) {
-				rootEntry = entries.get(0);
-			}
-			
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Catalog", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			catalogStackPanel = new BreadcrumbedStackedPanel("catstack", getTranslator(), this);
-			catalogCtrl = new CatalogNodeController(ureq, bwControl, rootEntry, catalogStackPanel, false);
-			catalogStackPanel.pushController(translate("search.catalog"), catalogCtrl);
-			listenTo(catalogCtrl);
+		if(!repositoryModule.isCatalogEnabled() || !repositoryModule.isCatalogBrowsingEnabled()) {
+			return null;
+		}
+		cleanUp();
+
+		List<CatalogEntry> entries = catalogManager.getRootCatalogEntries();
+		CatalogEntry rootEntry = null;
+		if(entries.size() > 0) {
+			rootEntry = entries.get(0);
 		}
+		
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Catalog", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		catalogStackPanel = new BreadcrumbedStackedPanel("catstack", getTranslator(), this);
+		catalogCtrl = new CatalogNodeController(ureq, bwControl, rootEntry, catalogStackPanel, false);
+		catalogStackPanel.pushController(translate("search.catalog"), catalogCtrl);
+		listenTo(catalogCtrl);
 
 		addToHistory(ureq, catalogCtrl);
 		mainVC.put("segmentCmp", catalogStackPanel);
@@ -243,19 +244,19 @@ public class OverviewRepositoryListController extends BasicController implements
 	}
 	
 	private RepositoryEntryListController doOpenSearchCourses(UserRequest ureq) {
-		if(searchCoursesCtrl == null) {
-			SearchMyRepositoryEntryViewParams searchParams
-				= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
-			searchParams.setMembershipMandatory(false);
+		cleanUp();
 
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
-			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
-			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-			searchCoursesStackPanel = new BreadcrumbedStackedPanel("search", getTranslator(), this);
-			searchCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, false, true, "my-search", searchCoursesStackPanel);
-			searchCoursesStackPanel.pushController(translate("search.mycourses.student"), searchCoursesCtrl);
-			listenTo(searchCoursesCtrl);
-		}
+		SearchMyRepositoryEntryViewParams searchParams
+			= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
+		searchParams.setMembershipMandatory(false);
+
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		searchCoursesStackPanel = new BreadcrumbedStackedPanel("search", getTranslator(), this);
+		searchCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, false, true, "my-search", searchCoursesStackPanel);
+		searchCoursesStackPanel.pushController(translate("search.mycourses.student"), searchCoursesCtrl);
+		listenTo(searchCoursesCtrl);
 		
 		addToHistory(ureq, searchCoursesCtrl);
 		mainVC.put("segmentCmp", searchCoursesStackPanel);
diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryDetailsController.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryDetailsController.java
index 19cdf8ff6a0..a648a1c840a 100644
--- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryDetailsController.java
+++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryDetailsController.java
@@ -105,6 +105,7 @@ public class RepositoryEntryDetailsController extends FormBasicController {
 	
 	protected RepositoryEntry entry;
 	protected RepositoryEntryRow row;
+	private Integer index;
 
 	@Autowired
 	protected UserRatingsDAO userRatingsDao;
@@ -158,6 +159,14 @@ public class RepositoryEntryDetailsController extends FormBasicController {
 		initForm(ureq);
 	}
 	
+	public Integer getIndex() {
+		return index;
+	}
+
+	public void setIndex(Integer index) {
+		this.index = index;
+	}
+
 	private void setText(String text, String key, FormLayoutContainer layoutCont) {
 		if(!StringHelper.containsNonWhitespace(text)) return;
 		text = StringHelper.xssScan(text);
diff --git a/src/main/java/org/olat/user/ProfileAndHomePageEditController.java b/src/main/java/org/olat/user/ProfileAndHomePageEditController.java
index aed02babd54..bbf871e11c7 100644
--- a/src/main/java/org/olat/user/ProfileAndHomePageEditController.java
+++ b/src/main/java/org/olat/user/ProfileAndHomePageEditController.java
@@ -90,6 +90,8 @@ public class ProfileAndHomePageEditController extends BasicController implements
 		segmentView.addSegment(homePageLink, false);
 
 		putInitialPanel(myContent);
+		
+		doOpenProfile(ureq);
 	}
 
 	@Override
@@ -150,7 +152,9 @@ public class ProfileAndHomePageEditController extends BasicController implements
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
 		if(entries == null || entries.isEmpty()) {
-			doOpenProfile(ureq);
+			if(profileFormController == null) {
+				doOpenProfile(ureq);
+			}
 		}
 	}
 
-- 
GitLab