diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java index 413a3057c4526363213d149dd695ccb7c67224dc..95484d6320dc3ddd11cab44257dd55788b696f59 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework; import com.extjs.gxt.ui.client.widget.Component; +import com.google.gwt.user.client.Window; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext; @@ -63,8 +64,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script. import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script.ScriptRegistrationForm; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyGrid; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyRegistrationForm; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp.WebAppComponent; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp.WebAppUrl; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.LoggingConsole; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebApp; /** * Creates and provides GUI modules/components (such as sample browser). @@ -1654,4 +1658,46 @@ public final class ComponentProvider }; } + + public AbstractTabItemFactory createWebApp(final WebApp webApp) + { + return new AbstractTabItemFactory() + { + @Override + public ITabItem create() + { + WebAppUrl url = + new WebAppUrl(Window.Location.getProtocol(), Window.Location.getHost(), + webApp.getCode(), viewContext.getModel().getSessionContext() + .getSessionID()); + return createRegistrationTab(getTabTitle(), + DatabaseModificationAwareComponent + .wrapUnaware(new WebAppComponent(url))); + } + + @Override + public String getId() + { + return WebAppComponent.getId(webApp.getCode()); + } + + @Override + public HelpPageIdentifier getHelpPageIdentifier() + { + return new HelpPageIdentifier(HelpPageDomain.WEB_APP, HelpPageAction.VIEW); + } + + @Override + public String getTabTitle() + { + return webApp.getLabel(); + } + + @Override + public String tryGetLink() + { + return null; + } + }; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java index 2e52fac178f8d5602de8a33978c4943d7b23634a..a899e5375809dbfff396f824e27dc526fd278c92 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java @@ -38,7 +38,7 @@ public class HelpPageIdentifier public static enum HelpPageDomain { // base domains (as in menu) - EXPERIMENT, SAMPLE, DATA_SET, MATERIAL, ADMINISTRATION, SEARCH, + EXPERIMENT, SAMPLE, DATA_SET, MATERIAL, ADMINISTRATION, SEARCH, WEB_APP, // entity types EXPERIMENT_TYPE(EXPERIMENT), SAMPLE_TYPE(SAMPLE), DATA_SET_TYPE(DATA_SET), MATERIAL_TYPE( diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java index 47c2d1e368bf16014b2cdbbcef0ba30750e3b633..8ec867cd3d7734f07b84283339e8938e289084a2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java @@ -119,7 +119,8 @@ public class TopMenu extends LayoutContainer toolBar.add(new BrowseMenu(viewContext, componentProvider)); toolBar.add(new NewMenu(viewContext, componentProvider)); toolBar.add(new ImportMenu(viewContext, componentProvider)); - toolBar.add(new ModulesMenu(viewContext, viewContext.getClientPluginFactoryProvider())); + toolBar.add(new ModulesMenu(viewContext, viewContext.getClientPluginFactoryProvider(), + componentProvider)); toolBar.add(new FillToolItem()); toolBar.add(new SearchWidget(viewContext)); toolBar.add(new SeparatorToolItem()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java index 79ceff936c333df9100b7b497eac92146265cff2..50fa0d34a5fbcd4a996cb86dac8c8419a9e1d7bb 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java @@ -16,18 +16,27 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.modules; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.extjs.gxt.ui.client.widget.menu.Menu; import com.extjs.gxt.ui.client.widget.menu.MenuItem; import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem; import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu; import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem; import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactoryProvider; import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule; import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModuleInitializationObserver; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp.WebAppSortingAndCodeComparator; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebApp; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebAppContext; /** * Modules top menu. @@ -37,10 +46,18 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess public class ModulesMenu extends TopMenuItem implements IModuleInitializationObserver { - public ModulesMenu(IMessageProvider messageProvider, - IClientPluginFactoryProvider clientPluginFactoryProvider) + private IViewContext<?> viewContext; + + private ComponentProvider componentProvider; + + public ModulesMenu(IViewContext<?> viewContext, + IClientPluginFactoryProvider clientPluginFactoryProvider, + ComponentProvider componentProvider) { - super(messageProvider.getMessage(Dict.MENU_MODULES)); + super(viewContext.getMessage(Dict.MENU_MODULES)); + + this.viewContext = viewContext; + this.componentProvider = componentProvider; setId(TopMenu.ID + "_MODULES"); Menu submenu = new Menu(); @@ -64,10 +81,42 @@ public class ModulesMenu extends TopMenuItem implements IModuleInitializationObs submenu.add(menuItem); } } - simplifyIfNecessary(this); - if (submenu.getItemCount() > 0) + } + + void addWebAppsItems() + { + List<WebApp> webApps = new ArrayList<WebApp>(); + + for (WebApp webApp : getViewContext().getModel().getApplicationInfo().getWebapps()) { - show(); + if (webApp.matchesContext(WebAppContext.MODULES_MENU)) + { + webApps.add(webApp); + } + } + + Collections.sort(webApps, new WebAppSortingAndCodeComparator()); + + Menu submenu = getMenu(); + for (final WebApp webApp : webApps) + { + IActionMenuItem actionMenuItem = new IActionMenuItem() + { + @Override + public String getMenuText(IMessageProvider messageProvider) + { + return webApp.getLabel(); + } + + @Override + public String getMenuId() + { + return TopMenu.ID + "_" + webApp.getCode(); + } + }; + + submenu.add(new ActionMenu(actionMenuItem, viewContext, componentProvider + .createWebApp(webApp))); } } @@ -92,6 +141,19 @@ public class ModulesMenu extends TopMenuItem implements IModuleInitializationObs public void notify(List<IModule> successfullyInitializedModules) { addModuleItems(successfullyInitializedModules); + addWebAppsItems(); + + simplifyIfNecessary(this); + + if (getMenu().getItemCount() > 0) + { + show(); + } + } + + private IViewContext<?> getViewContext() + { + return viewContext; } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java index 82f2850c9c103454e8e05cf82d9c0222e096de7d..0958b926bbedb91edb82df341234af5d5fc941dc 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java @@ -473,6 +473,7 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends webApp.getCode(), getSessionId()); url.setEntityKind(entity.getEntityKind()); url.setEntityType(entity.getEntityType()); + url.setEntityIdentifier(entity.getIdentifier()); url.setEntityPermId(entity.getPermId()); return new WebAppComponent(url); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java index fb9c0b93f3c9d39192224fe315ba58b08ffd73f1..9d7df130f823d07a0711a2d1e7df76530306dd87 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java @@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp import com.extjs.gxt.ui.client.widget.WidgetComponent; import com.google.gwt.user.client.ui.Frame; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; + /** * Component that displays a web application in an IFRAME. * @@ -27,8 +29,15 @@ import com.google.gwt.user.client.ui.Frame; public class WebAppComponent extends WidgetComponent { + private static final String ID_PREFIX = GenericConstants.ID_PREFIX + "webapp_"; + public WebAppComponent(WebAppUrl url) { super(new Frame(url.toString())); } + + public static String getId(String webAppCode) + { + return ID_PREFIX + webAppCode; + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java index 6fa4b40dba43ee9aecfd0e169d7948ad36f47c8c..ac386c118f909abaac31a0fd7d64a1a2d17311ef 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java @@ -52,7 +52,9 @@ public class WebAppUrl builder.setProtocol(openbisProtocol); builder.setHost(openbisHost); - builder.setPath(webAppCode); + // TODO remove the hardcoded part after development is finished + builder.setPath("ch.systemsx.cisd.openbis.plugin.screening.OpenBIS/resources/applications/" + + webAppCode + "/html"); builder.setParameter(WebAppUrlParameter.SESSION_ID.getName(), sessionId); } @@ -72,6 +74,14 @@ public class WebAppUrl } } + public void setEntityIdentifier(String entityIdentifier) + { + if (entityIdentifier != null) + { + builder.setParameter(WebAppUrlParameter.ENTITY_IDENTIFIER.getName(), entityIdentifier); + } + } + public void setEntityPermId(String entityPermId) { if (entityPermId != null) @@ -85,5 +95,4 @@ public class WebAppUrl { return builder.buildString(); } - } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java index 551fd183d7e20121c35fed00032a681c3e9b1a05..ad8f65a7574a888f773ad51f78c60cda183f7983 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java @@ -25,7 +25,7 @@ public enum WebAppUrlParameter { SESSION_ID("session-id"), ENTITY_KIND("entity-kind"), ENTITY_TYPE("entity-type"), - ENTITY_PERM_ID("entity-perm-id"); + ENTITY_IDENTIFIER("entity-identifier"), ENTITY_PERM_ID("entity-perm-id"); private final String name; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java index beac2d089454bb37b5e3aebe8fc02ea65ed17a91..7c1bbbba5044080336556b063e413e11b6b615e1 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java @@ -24,7 +24,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; public enum WebAppContext { - QUERIES_MENU("queries-menu"), EXPERIMENT_DETAILS_VIEW("experiment-details-view"), + MODULES_MENU("modules-menu"), EXPERIMENT_DETAILS_VIEW("experiment-details-view"), SAMPLE_DETAILS_VIEW("sample-details-view"), DATA_SET_DETAILS_VIEW("data-set-details-view"), MATERIAL_DETAILS_VIEW("material-details-view"); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js index e35025bfb4377979b4dfef992b07bb0153ace058..9e14d8d90e94584b5825433399b4bb3a1c258fa2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js +++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js @@ -341,3 +341,39 @@ actionDeferrer.prototype.dependencyCompleted = function(key) { } } +function openbisWebAppContext(){ + this.sessionId = this.getParameter("session-id"); + this.entityKind = this.getParameter("entity-kind"); + this.entityType = this.getParameter("entity-type"); + this.entityIdentifier = this.getParameter("entity-identifier"); + this.entityPermId = this.getParameter("entity-perm-id"); +} + +openbisWebAppContext.prototype.getSessionId = function(){ + return this.sessionId; +} + +openbisWebAppContext.prototype.getEntityKind = function(){ + return this.entityKind; +} + +openbisWebAppContext.prototype.getEntityType = function(){ + return this.entityType; +} + +openbisWebAppContext.prototype.getEntityIdentifier = function(){ + return this.entityIdentifier; +} + +openbisWebAppContext.prototype.getEntityPermId = function(){ + return this.entityPermId; +} + +openbisWebAppContext.prototype.getParameter = function(parameterName){ + var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)')); + if(match){ + return decodeURIComponent(match[1]); + }else{ + return null; + } +} diff --git a/openbis/source/javascript/openbis.js b/openbis/source/javascript/openbis.js index 466a18a5abf580c2e6d07f818e06b7da877d03c6..f5a686c3ced032d78e7eab28a69b468b54563ab4 100644 --- a/openbis/source/javascript/openbis.js +++ b/openbis/source/javascript/openbis.js @@ -395,3 +395,40 @@ openbis.prototype.listPlateImageReferences = function(dataSetIdentifier, wellPos success: action }); } + +function openbisWebAppContext(){ + this.sessionId = this.getParameter("session-id"); + this.entityKind = this.getParameter("entity-kind"); + this.entityType = this.getParameter("entity-type"); + this.entityIdentifier = this.getParameter("entity-identifier"); + this.entityPermId = this.getParameter("entity-perm-id"); +} + +openbisWebAppContext.prototype.getSessionId = function(){ + return this.sessionId; +} + +openbisWebAppContext.prototype.getEntityKind = function(){ + return this.entityKind; +} + +openbisWebAppContext.prototype.getEntityType = function(){ + return this.entityType; +} + +openbisWebAppContext.prototype.getEntityIdentifier = function(){ + return this.entityIdentifier; +} + +openbisWebAppContext.prototype.getEntityPermId = function(){ + return this.entityPermId; +} + +openbisWebAppContext.prototype.getParameter = function(parameterName){ + var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)')); + if(match){ + return decodeURIComponent(match[1]); + }else{ + return null; + } +}