diff --git a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListController.java b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListController.java index c0f861b9b39f1d904459104ace67c600fc0d3dff..9efe0e7c586f7b34cec6cb3cdbbd0ea79e4508bd 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListController.java +++ b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListController.java @@ -25,8 +25,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.Windows; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; @@ -43,9 +43,14 @@ 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.controller.BasicController; -import org.olat.core.gui.control.creator.ControllerCreator; +import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; +import org.olat.core.gui.control.generic.dtabs.DTab; +import org.olat.core.gui.control.generic.dtabs.DTabs; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.UserConstants; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.ContextEntry; import org.olat.core.util.coordinate.CoordinatorManager; @@ -59,6 +64,8 @@ import org.olat.course.properties.CoursePropertyManager; import org.olat.course.run.userview.NodeEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; +import org.olat.user.HomePageConfigManager; +import org.olat.user.HomePageConfigManagerImpl; import org.olat.user.UserInfoMainController; /** @@ -69,6 +76,7 @@ import org.olat.user.UserInfoMainController; public class ProjectListController extends BasicController implements GenericEventListener { + private static final String OPEN_IDENTITY_CMD = "openID"; // List commands private static final String TABLE_ACTION_SHOW_DETAIL = "cmd.show.detail"; private static final String TABLE_ACTION_ACCOUNT_MANAGER = "cmd.account.manager"; @@ -94,6 +102,7 @@ public class ProjectListController extends BasicController implements GenericEve private int numberOfEventInTable = 0; private int nbrSelectedProjects; private boolean isParticipantInAnyProject; + private CloseableCalloutWindowController calloutCtrl; /** @@ -207,6 +216,13 @@ public class ProjectListController extends BasicController implements GenericEve projectController = new ProjectController(ureq, this.getWindowControl(), userCourseEnv, nodeEvaluation, project, true, moduleConfig); projectController.addControllerListener(this); mainPanel.pushContent(projectController.getInitialComponent()); + } else if (event.getCommand().equals(OPEN_IDENTITY_CMD)){ + Link link = (Link) source; + if (calloutCtrl!=null) { + calloutCtrl.deactivate(); + calloutCtrl = null; + } + openUserInPopup(ureq, (Identity) link.getUserObject()); } } @@ -244,7 +260,7 @@ public class ProjectListController extends BasicController implements GenericEve if ( te.getActionId().equals(TABLE_ACTION_SHOW_DETAIL)) { activateProjectController(currentProject, urequest); } else if ( te.getActionId().equals(TABLE_ACTION_ACCOUNT_MANAGER)) { - activateUserController(currentProject, urequest); + activateUserController(currentProject, urequest, te); } else if ( te.getActionId().equals(TABLE_ACTION_SELECT)) { handleEnrollAction(urequest, currentProject); } else if ( te.getActionId().equals(TABLE_ACTION_CANCEL_SELECT)) { @@ -298,22 +314,55 @@ public class ProjectListController extends BasicController implements GenericEve } - private void activateUserController(final Project projectAt, UserRequest urequest) { + private void activateUserController(final Project projectAt, UserRequest urequest, TableEvent tableEvent) { if (projectAt.getProjectLeaders().isEmpty()) { this.showInfo("show.info.no.project.leader"); - } else if (projectAt.getProjectLeaders().size() > 0) { - // Open visiting card in new popup - ControllerCreator ctrlCreator = new ControllerCreator() { - public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, projectAt.getProjectLeaders().get(0)); - } - }; - // wrap the content controller into a full header layout - ControllerCreator layoutCtrlr = BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(urequest, ctrlCreator); - this.openInNewBrowserWindow(urequest, layoutCtrlr); + } else if (projectAt.getProjectLeaders().size() > 1) { + VelocityContainer identityVC = createVelocityContainer("identityCallout"); + List<Identity> allIdents = projectAt.getProjectLeaders(); + ArrayList<Link> identLinks = new ArrayList<Link>(allIdents.size()); + for (Identity identity : allIdents) { + String last = identity.getUser().getProperty(UserConstants.LASTNAME, getLocale()); + String first = identity.getUser().getProperty(UserConstants.FIRSTNAME, getLocale()); + String linkName = last + " " + first; + + Link idLink = LinkFactory.createCustomLink(linkName, OPEN_IDENTITY_CMD, linkName, Link.NONTRANSLATED, identityVC, this); + idLink.setUserObject(identity); + identLinks.add(idLink); + } + identityVC.contextPut("identLinks", identLinks); + + int row = tableEvent.getRowId(); + String targetDomID = ProjectManagerColumnRenderer.PROJECTMANAGER_COLUMN_ROW_IDENT + row; + String title = translate("projectlist.callout.title", projectAt.getTitle()); + + calloutCtrl = new CloseableCalloutWindowController(urequest, getWindowControl(), identityVC, targetDomID, title, true, null); + calloutCtrl.activate(); + listenTo(calloutCtrl); + } else if (projectAt.getProjectLeaders().size() == 1) { + // no callout, if its only one user + Identity leader = projectAt.getProjectLeaders().get(0); + openUserInPopup(urequest, leader); } } + private void openUserInPopup(UserRequest ureq, final Identity ident){ + // did not work to open as popup based on ureq! -> open as tab in same window + HomePageConfigManager hpcm = HomePageConfigManagerImpl.getInstance(); + OLATResourceable ores = hpcm.loadConfigFor(ident.getName()); + DTabs dts = (DTabs) Windows.getWindows(ureq).getWindow(ureq).getAttribute("DTabs"); + DTab dt = dts.getDTab(ores); + if (dt == null) { + // does not yet exist -> create and add + dt = dts.createDTab(ores, ident.getName()); + if (dt == null) return; + UserInfoMainController uimc = new UserInfoMainController(ureq, dt.getWindowControl(), ident); + dt.setController(uimc); + dts.addDTab(dt); + } + dts.activate(ureq, dt, null); + } + private void activateProjectController(Project project, UserRequest urequest) { removeAsListenerAndDispose(projectController); @@ -344,8 +393,27 @@ public class ProjectListController extends BasicController implements GenericEve int dataColumn = 0; tableController.addColumnDescriptor(new DefaultColumnDescriptor("projectlist.tableheader.title", dataColumn++, TABLE_ACTION_SHOW_DETAIL, ureq.getLocale())); - DefaultColumnDescriptor projectManagerDescriptor = new DefaultColumnDescriptor("projectlist.tableheader.account.manager", dataColumn++, TABLE_ACTION_ACCOUNT_MANAGER, ureq.getLocale()); - projectManagerDescriptor.setIsPopUpWindowAction( true, "height=600, width=900, location=no, menubar=no, resizable=yes, status=no, scrollbars=yes, toolbar=no"); + + CustomRenderColumnDescriptor projectManagerDescriptor = new CustomRenderColumnDescriptor("projectlist.tableheader.account.manager", dataColumn++, TABLE_ACTION_ACCOUNT_MANAGER, ureq.getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, new ProjectManagerColumnRenderer()){ + + /** + * @see org.olat.core.gui.components.table.DefaultColumnDescriptor#compareTo(int, int) + */ + @Override + public int compareTo(int rowa, int rowb) { + return super.compareTo(rowa, rowb); + } + + /** + * @see org.olat.core.gui.components.table.CustomRenderColumnDescriptor#renderValue(org.olat.core.gui.render.StringOutput, int, org.olat.core.gui.render.Renderer) + */ + @Override + public void renderValue(StringOutput sb, int row, Renderer renderer) { + Object val = getModelData(row); + String rowSt = Integer.toString(row); // to get info about row in Renderer! + getCustomCellRenderer().render(sb, renderer, val, getLocale(), getAlignment(), rowSt); + } + }; tableController.addColumnDescriptor(projectManagerDescriptor); // Custom-Fields List<CustomField> customFieldList = moduleConfig.getCustomFields(); diff --git a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListTableModel.java b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListTableModel.java index bc5480d3792fc6370bfca3c34e3ba08fe376496f..8ce59f49834e0dfd2a22d1b773886a9b5ae4806c 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListTableModel.java +++ b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectListTableModel.java @@ -29,7 +29,6 @@ import org.olat.basesecurity.BaseSecurityManager; import org.olat.core.gui.components.table.DefaultTableDataModel; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; -import org.olat.core.id.UserConstants; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.course.nodes.projectbroker.datamodel.CustomField; @@ -106,17 +105,12 @@ public class ProjectListTableModel extends DefaultTableDataModel { if (identities.isEmpty()) { return "-"; } else { - // Get last added identity - Object[] identityAndDate = identities.get(identities.size() - 1); - String last = ((Identity)identityAndDate[0]).getUser().getProperty(UserConstants.LASTNAME, getLocale()); - String first= ((Identity)identityAndDate[0]).getUser().getProperty(UserConstants.FIRSTNAME, getLocale()); - String showName = last + " " + first; - if (identities.size() == 1) { - return showName; - } else { - // more than one projectleader => show ... - return showName + ", ..."; + // return all proj-leaders + ArrayList<Identity> allIdents = new ArrayList<Identity>(); + for (Object[] idobj : identities) { + allIdents.add((Identity)idobj[0]); } + return allIdents; } } else if (col == (numberOfCustomFieldInTable + numberOfEventInTable + 2)) { return ProjectBrokerManagerFactory.getProjectBrokerManager().getStateFor(project,identity,moduleConfig); diff --git a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectManagerColumnRenderer.java b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectManagerColumnRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..9845c763a7789fe06f6d3ef3bb300d69a27d08a1 --- /dev/null +++ b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/ProjectManagerColumnRenderer.java @@ -0,0 +1,74 @@ +/** +* 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. +* <p> +*/ +package org.olat.course.nodes.projectbroker; + +import java.util.ArrayList; +import java.util.Locale; + +import org.olat.core.gui.components.table.CustomCellRenderer; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.id.Identity; +import org.olat.core.id.UserConstants; + +/** + * Description:<br> + * wrapper for multiple identities in one cell. + * needed to code the row-id into the cell for later callout-opening. + * + * <P> + * Initial Date: 01.04.2011 <br> + * @author Roman Haag, roman.haag@frentix.com, http://www.frentix.com + */ +public class ProjectManagerColumnRenderer implements CustomCellRenderer { + + public static final String PROJECTMANAGER_COLUMN_ROW_IDENT = "pmrow"; + + /** + * @see org.olat.core.gui.components.table.CustomCellRenderer#render(org.olat.core.gui.render.StringOutput, org.olat.core.gui.render.Renderer, java.lang.Object, java.util.Locale, int, java.lang.String) + */ + @Override + public void render(StringOutput sb, Renderer renderer, Object val, Locale locale, int alignment, String action) { + if (val instanceof ArrayList){ + @SuppressWarnings("unchecked") + ArrayList<Identity> allIdents = (ArrayList<Identity>) val; + Integer row = Integer.parseInt(action); + StringBuilder buf = new StringBuilder(); + + if (renderer!=null) { + // if no renderer is set, then we assume it's a table export - in which case we don't want the htmls (<b>) + sb.append("<span class=\"projmgrrowcontent\""); + sb.append("id=\"" + PROJECTMANAGER_COLUMN_ROW_IDENT + row + "\">"); + } + + for (Identity identity : allIdents) { + String last = identity.getUser().getProperty(UserConstants.LASTNAME, locale); + String first= identity.getUser().getProperty(UserConstants.FIRSTNAME, locale); + buf.append(last).append(" ").append(first).append(", "); + } + sb.append(buf.substring(0, buf.length() - 2)); + + if (renderer!=null) { + sb.append("</span>"); + } + } + } +} diff --git a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_content/identityCallout.html b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_content/identityCallout.html new file mode 100644 index 0000000000000000000000000000000000000000..eca0461f7fbea7a840f0b61811fd495404898a26 --- /dev/null +++ b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_content/identityCallout.html @@ -0,0 +1,6 @@ +$r.translate("projectlist.callout.intro") +<ul> +#foreach($identityLink in $identLinks) + <li>$r.render($identityLink.componentName)</li> +#end +</ul> \ No newline at end of file diff --git a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties index 0b4f4f06c7f326a303315e5afa7027fdc5a98d84..9a0c510c6b67d7a07f0b5becfec97fad5181a107 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties +++ b/olat3/webapp/WEB-INF/src/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties @@ -32,6 +32,9 @@ tab.project.folder=Ordner tab.project.members=Teilnehmerverwaltung tab.project.details.inline=Inline Edit Beschreibung +projectlist.callout.title=$:projectlist.tableheader.account.manager für {0} +projectlist.callout.intro=Klicken Sie auf den Benutzer für weitere Informationen zu diesem. + detailsform.title.label=Titel detailsform.projectleaders.label=Verantwortlich detailsform.description.label=Beschreibung