From 300e020a9504734df4158fdfe9a9890ea5cc4548 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Thu, 3 Sep 2015 16:54:24 +0000 Subject: [PATCH] show the virualgroups in the order selected in the Liferay control Panel interface git-svn-id: https://svn.research-infrastructures.eu/d4science/gcube/trunk/portlets/user/join-vre@118897 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../user/joinvre/client/JoinService.java | 2 +- .../user/joinvre/client/JoinServiceAsync.java | 2 +- .../user/joinvre/client/panels/Relevance.java | 12 -- .../client/responsive/ResponsivePanel.java | 7 +- .../client/responsive/VreThumbnail.ui.xml | 20 -- .../user/joinvre/client/ui/DisplayVRE.java | 172 ------------------ .../user/joinvre/client/ui/DisplayVRE.ui.xml | 34 ---- .../user/joinvre/client/ui/InfoDialog.java | 67 ------- .../user/joinvre/client/ui/LoadingPopUp.java | 53 ------ .../{responsive => ui}/VreThumbnail.java | 8 +- .../joinvre/client/ui/VreThumbnail.ui.xml | 31 ++++ .../user/joinvre/server/JoinServiceImpl.java | 74 +++++--- .../portlets/user/joinvre/JoinVRE.gwt.xml | 5 +- src/main/webapp/JoinVRE.css | 12 ++ src/main/webapp/images/logoBlue.png | Bin 0 -> 17339 bytes 15 files changed, 98 insertions(+), 401 deletions(-) delete mode 100644 src/main/java/org/gcube/portlets/user/joinvre/client/panels/Relevance.java delete mode 100644 src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.ui.xml delete mode 100644 src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.java delete mode 100644 src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.ui.xml delete mode 100755 src/main/java/org/gcube/portlets/user/joinvre/client/ui/InfoDialog.java delete mode 100755 src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPopUp.java rename src/main/java/org/gcube/portlets/user/joinvre/client/{responsive => ui}/VreThumbnail.java (89%) create mode 100644 src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.ui.xml create mode 100644 src/main/webapp/images/logoBlue.png diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/JoinService.java b/src/main/java/org/gcube/portlets/user/joinvre/client/JoinService.java index 0c00b4b..2f67d4a 100644 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/JoinService.java +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/JoinService.java @@ -1,8 +1,8 @@ package org.gcube.portlets.user.joinvre.client; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.TreeMap; import org.gcube.portlets.user.joinvre.shared.VRE; import org.gcube.portlets.user.joinvre.shared.VRECategory; diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/JoinServiceAsync.java b/src/main/java/org/gcube/portlets/user/joinvre/client/JoinServiceAsync.java index 746bf56..9967867 100644 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/JoinServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/JoinServiceAsync.java @@ -1,8 +1,8 @@ package org.gcube.portlets.user.joinvre.client; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.TreeMap; import org.gcube.portlets.user.joinvre.shared.VRE; import org.gcube.portlets.user.joinvre.shared.VRECategory; diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/panels/Relevance.java b/src/main/java/org/gcube/portlets/user/joinvre/client/panels/Relevance.java deleted file mode 100644 index 6a27cf4..0000000 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/panels/Relevance.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * - */ -package org.gcube.portlets.user.joinvre.client.panels; - -/** - * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ - * - */ -public enum Relevance { - Must_Have, Recommended, Exclusive, Demonstrative -} diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/ResponsivePanel.java b/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/ResponsivePanel.java index 126a43f..a0176b8 100644 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/ResponsivePanel.java +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/ResponsivePanel.java @@ -1,19 +1,16 @@ package org.gcube.portlets.user.joinvre.client.responsive; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.TreeMap; import org.gcube.portlets.user.joinvre.client.JoinService; import org.gcube.portlets.user.joinvre.client.JoinServiceAsync; +import org.gcube.portlets.user.joinvre.client.ui.VreThumbnail; import org.gcube.portlets.user.joinvre.shared.VRE; import org.gcube.portlets.user.joinvre.shared.VRECategory; -import com.github.gwtbootstrap.client.ui.Column; -import com.github.gwtbootstrap.client.ui.Image; import com.github.gwtbootstrap.client.ui.PageHeader; -import com.github.gwtbootstrap.client.ui.Row; -import com.github.gwtbootstrap.client.ui.ThumbnailLink; import com.github.gwtbootstrap.client.ui.Thumbnails; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.ui.xml b/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.ui.xml deleted file mode 100644 index a052d0a..0000000 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.ui.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - .important { - font-weight: bold; - } - - - - - - - - - Info - - - - \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.java b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.java deleted file mode 100644 index d57e3a8..0000000 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.gcube.portlets.user.joinvre.client.ui; - -import static com.google.gwt.query.client.GQuery.$; -import static com.google.gwt.query.client.css.CSS.WIDTH; -import static com.google.gwt.query.client.GQuery.window; -import java.util.List; - -import org.gcube.portlets.user.gcubewidgets.client.elements.Div; -import org.gcube.portlets.user.joinvre.client.JoinService; -import org.gcube.portlets.user.joinvre.client.JoinServiceAsync; -import org.gcube.portlets.user.joinvre.shared.VRE; -import org.gcube.portlets.user.joinvre.shared.VRECategory; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Element; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.query.client.Function; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.Image; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.Widget; - -/** - * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it - * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ - */ -public class DisplayVRE extends Composite { - - interface DisplayVREUiBinder extends UiBinder {} - - private static DisplayVREUiBinder uiBinder = GWT.create(DisplayVREUiBinder.class); - - private final JoinServiceAsync joinService = GWT.create(JoinService.class); - - public static final String vreDefaultImage = GWT.getModuleBaseURL() + "../images/vre-default.png"; - public static final String loadingImage = GWT.getModuleBaseURL() + "../images/vre-image-loader.gif"; - - public static LoadingPopUp loadingPopUp = new LoadingPopUp(false, true, loadingImage); - - public static final String REQUEST_ACCESS = "Request Access"; - public static final String FREE_ACCESS = "Free Access"; - - - - @UiField HTMLPanel mainPanel; - @UiField Image vreImage; - @UiField Label vreName; - @UiField HTMLPanel vreCategories; - @UiField Div vreDesc; - @UiField Button joinButton; - @UiField Button closeButton; - - public DisplayVRE(final VRE vre) { - Widget widget = uiBinder.createAndBindUi(this); - vreImage.setUrl(loadingImage); - closeButton.setText("Collapse"); - vreDesc.setHTML(vre.getDescription()); - - if(vre.getImageURL().compareTo("")!=0){ - vreImage.setUrl(vre.getImageURL()); - }else{ - vreImage.setUrl(vreDefaultImage); - } - - final String name = vre.getName(); - ClickHandler descriptionHandler = new ClickHandler(){ - @Override - public void onClick(ClickEvent event) { - if ($(mainPanel).css(WIDTH).compareTo("160px") == 0) - show(); - else - collapse(); - - } - }; - closeButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - collapse(); - } - }); - - vreImage.setTitle("Click to see details"); - vreImage.addClickHandler(descriptionHandler); - - vreName.setTitle(name); - vreName.setText(name); - vreName.addClickHandler(descriptionHandler); - - List categories = null; - for(int i=0; i() { - - @Override - public void onFailure(Throwable caught) { - loadingPopUp.hide(); - String error = "Error"; - String errorDescription = "Error while trying to join to" - + name + " VRE. Please Try again later. " - + "If the problem persist contact system administrator"; - final InfoDialog infoDialog = new InfoDialog(error, errorDescription); - infoDialog.show(); - } - - @Override - public void onSuccess(Boolean result) { - loadingPopUp.hide(); - Window.open("/group/data-e-infrastructure-gateway/join-new?orgid="+vre.getId(), "_self", ""); - } - - }); - } - }); - - - initWidget(widget); - } - - private void show() { - $(mainPanel).animate("width:'927px'", 120, new Function(){ - public void f(Element e){ - $(vreDesc).fadeIn(); - $(closeButton).fadeIn(); - $(window).scrollTo(0, mainPanel.getAbsoluteTop()-310); - } - }); - vreImage.setTitle("Click to collapse"); - } - private void collapse() { - $(closeButton).fadeOut(); - $(vreDesc).fadeOut(new Function(){ - public void f(Element e){ - $(mainPanel).animate("width:'160px'", 150); - } - }); - vreImage.setTitle("Click to see details"); - } - - public void showError(String message) { - Window.alert("Failure: " + message); - vreImage.setSize("100px", "100px"); - vreImage.setUrl(vreDefaultImage); - } - - - -} diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.ui.xml b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.ui.xml deleted file mode 100644 index cf6d243..0000000 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/DisplayVRE.ui.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - -
-
- -
-
- - - -
-
- -
- -
- -
-
- - - -
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/InfoDialog.java b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/InfoDialog.java deleted file mode 100755 index 57e2946..0000000 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/InfoDialog.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.gcube.portlets.user.joinvre.client.ui; - -import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog; - -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.ScrollPanel; -import com.google.gwt.user.client.ui.VerticalPanel; - - -/** - * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it - * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ - */ -public class InfoDialog extends GCubeDialog { - private ScrollPanel scroller = new ScrollPanel(); - private VerticalPanel main_panel = null; - - public InfoDialog(String title, String content) { - - // PopupPanel's constructor takes 'auto-hide' as its boolean parameter. - // If this is set, the panel closes itself automatically when the user - // clicks outside of it. - super(true); - super.setText(title); - main_panel = new VerticalPanel(); - main_panel.addStyleName("bgBlank p8 font_family font_12"); - - if (content == null || content.equals("")) - content = "We're sorry, there is no available description yet"; - - scroller.add(new HTML(content)); - - // PopupPanel is a SimplePanel, so you have to set it's widget property to - // whatever you want its contents to be. - Button close = new Button("Close"); - close.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - hide(); - } - }); - main_panel.add(scroller); - main_panel.add(new HTML("
")); - main_panel.add(close); - scroller.setPixelSize(550, 300); - main_panel.setPixelSize(550, 350); - setWidget(main_panel); - } - - public void show() { - super.show(); - center(); -// int left = (Window.getClientWidth() - getOffsetWidth()) / 2 + getBodyScrollLeft(); -// int top = (Window.getClientHeight() - getOffsetHeight()) / 2 + getBodyScrollTop(); -// setPopupPosition(left, top); - } - - private native int getBodyScrollLeft() /*-{ - return $doc.body.scrollLeft; - }-*/; - - private native int getBodyScrollTop() /*-{ - return $doc.body.scrollTop; - }-*/; -} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPopUp.java b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPopUp.java deleted file mode 100755 index 77875cf..0000000 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPopUp.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.gcube.portlets.user.joinvre.client.ui; - -import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.DockPanel; -import com.google.gwt.user.client.ui.HTML; - -/** - * - */ -public class LoadingPopUp extends DialogBox { - - private static LoadingPopUp singleton = null; - private boolean hidden = true; - private String loading_image = ""; - - public static LoadingPopUp get() { - return singleton; - } - - public LoadingPopUp(boolean autoHide, boolean modal, String loading_image) { - super(autoHide, modal); - this.loading_image = loading_image; - HTML msg = new HTML(setToDisplay(), true); - DockPanel dock = new DockPanel(); - dock.setSpacing(0); - dock.add(msg, DockPanel.NORTH); - dock.setPixelSize(msg.getOffsetWidth(), msg.getOffsetHeight()); - setWidget(dock); - if (singleton == null) singleton = this; - } - - protected String setToDisplay() { - return - "
"+ - ""+ - ""+ - "
"+ - ""+ - "
" ; - } - public void hide() { - super.hide(); - this.hidden = true; - } - public void show() { - super.show(); - this.hidden = false; - } - public boolean isHidden() { - return this.hidden; - } -} - diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.java b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.java similarity index 89% rename from src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.java rename to src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.java index f49497b..852a140 100644 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/responsive/VreThumbnail.java +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.java @@ -1,9 +1,7 @@ -package org.gcube.portlets.user.joinvre.client.responsive; +package org.gcube.portlets.user.joinvre.client.ui; import org.gcube.portlets.user.joinvre.client.JoinService; import org.gcube.portlets.user.joinvre.client.JoinServiceAsync; -import org.gcube.portlets.user.joinvre.client.ui.InfoDialog; -import org.gcube.portlets.user.joinvre.client.ui.InfoPanel; import org.gcube.portlets.user.joinvre.shared.VRE; import com.github.gwtbootstrap.client.ui.Button; @@ -12,7 +10,6 @@ import com.github.gwtbootstrap.client.ui.Image; import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; @@ -52,8 +49,6 @@ public class VreThumbnail extends Composite { joinButton.setText("Enter this VRE"); } vreImage.setUrl(vre.getImageURL()); - vreImage.setWidth("180px"); - } @UiHandler("joinButton") @@ -61,7 +56,6 @@ public class VreThumbnail extends Composite { joinService.joinVRE(myVre.getId(), new AsyncCallback() { @Override public void onFailure(Throwable caught) { - String error = "Error"; String errorDescription = "Error while trying to join to" + myVre.getName() + " VRE. Please Try again later. " + "If the problem persist contact system administrator"; diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.ui.xml b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.ui.xml new file mode 100644 index 0000000..7ca1d43 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/VreThumbnail.ui.xml @@ -0,0 +1,31 @@ + + + + .imageContainer { + height: 180px; + text-align: center; + } + + .image { + width: 180px; + position: relative; + top: 50%; + -ms-transform: translateY(-50%); + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + } + + + + + + + + + + Info + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/joinvre/server/JoinServiceImpl.java b/src/main/java/org/gcube/portlets/user/joinvre/server/JoinServiceImpl.java index 3e46b9c..9382ad6 100644 --- a/src/main/java/org/gcube/portlets/user/joinvre/server/JoinServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/joinvre/server/JoinServiceImpl.java @@ -4,8 +4,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Properties; @@ -17,13 +17,10 @@ import org.gcube.application.framework.core.session.SessionManager; import org.gcube.portal.custom.communitymanager.OrganizationsUtil; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portlets.user.joinvre.client.JoinService; -import org.gcube.portlets.user.joinvre.client.panels.Relevance; import org.gcube.portlets.user.joinvre.shared.UserBelonging; import org.gcube.portlets.user.joinvre.shared.VRE; import org.gcube.portlets.user.joinvre.shared.VRECategory; -import java.util.HashMap; - import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; @@ -40,8 +37,8 @@ import com.liferay.portal.security.permission.PermissionThreadLocal; import com.liferay.portal.service.OrganizationLocalServiceUtil; import com.liferay.portal.service.UserLocalServiceUtil; import com.liferay.portal.theme.ThemeDisplay; -import com.liferay.portlet.asset.model.AssetCategory; -import com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil; +import com.liferay.portlet.expando.model.ExpandoBridge; +import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil; /** * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it @@ -103,7 +100,7 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService if (isWithinPortal()) { toReturn = getPortalOrganizationMappedToVRE(); } else { - VRECategory devsecCategory = new VRECategory(1, "Development", "designed to apply Data Mining techniques to biological data. " + VRECategory devsecCategory = new VRECategory(1, "Z_Development", "designed to apply Data Mining techniques to biological data. " + "The algorithms are executed in a distributed fashion on the e-Infrastructure nodes or on local multi-core machines."); ArrayList vres = new ArrayList(); @@ -139,12 +136,12 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService devsecCategory = new VRECategory(2, "Sailing", "Sailing prod desc"); vres = new ArrayList(); - vres.add(new VRE(1, "PerformanceEvaluationInAquaculture", "devVRE VRE description", "", "http://placehold.it/200x200", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); - vres.add(new VRE(2, "devmode", "devmode VRE description", "", "http://placehold.it/200x200", "/group/devmode", UserBelonging.NOT_BELONGING, true)); - vres.add(new VRE(1, "StrategicInvestmentAnalysis", "devVRE VRE description", "", "http://placehold.it/200x200", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); - vres.add(new VRE(2, "devmode2", "devmode VRE description", "", "http://placehold.it/200x200", "/group/devmode", UserBelonging.NOT_BELONGING, true)); - vres.add(new VRE(1, "devVR3E", "devVRE VRE description", "", "http://placehold.it/200x200", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); - vres.add(new VRE(2, "devmode3", "devmode VRE description", "", "http://placehold.it/200x200", "/group/devmode", UserBelonging.NOT_BELONGING, true)); + vres.add(new VRE(1, "PerformanceEvaluationInAquaculture", "devVRE VRE description", "http://placehold.it/200x100", "http://placehold.it/200x100", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); + vres.add(new VRE(2, "devmode", "devmode VRE description", "http://placehold.it/200x100", "https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97100&w=200&h=100", "/group/devmode", UserBelonging.NOT_BELONGING, true)); + vres.add(new VRE(1, "StrategicInvestmentAnalysis", "devVRE VRE description", "", "https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97100&w=200&h=100", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); + vres.add(new VRE(2, "devmode2", "devmode VRE description", "http://placehold.it/200x100", "", "/group/devmode", UserBelonging.NOT_BELONGING, true)); + vres.add(new VRE(1, "devVR3E", "devVRE VRE description", "http://placehold.it/200x200", "aaaa", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); + vres.add(new VRE(2, "devmode3", "devmode VRE description", "http://placehold.it/200x200", "", "/group/devmode", UserBelonging.NOT_BELONGING, true)); vres.add(new VRE(1, "devVRE4", "devVRE VRE description", "", "http://placehold.it/200x200", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); vres.add(new VRE(2, "devmode4", "devmode VRE description", "", "http://placehold.it/200x200", "/group/devmode", UserBelonging.NOT_BELONGING, true)); vres.add(new VRE(1, "devVRE5", "devVRE VRE description", "", "http://placehold.it/200x200", "/group/devVRE", UserBelonging.NOT_BELONGING, false)); @@ -174,6 +171,18 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService private static final String REQUEST_BASED_GROUP = "Requestbasedgroup"; + public List getVirtualGroups() throws PortalException, SystemException { + try { + ExpandoBridge expandoBridge = ExpandoBridgeFactoryUtil.getExpandoBridge(OrganizationsUtil.getCompany().getCompanyId(), Organization.class.getName()); + String[] groups = (String[]) expandoBridge.getAttributeDefault("Virtualgroup"); + return Arrays.asList(groups); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public boolean requireAccessGrant(Organization organization) throws PortalException, SystemException { try { long companyId = OrganizationsUtil.getCompany().getCompanyId(); @@ -210,8 +219,7 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService _log.warn(String.format("Attribute %s not initialized.", CATEGORY)); return null; } else { - String[] values = (String[]) organization.getExpandoBridge().getAttribute(CATEGORY); - System.out.println("RITORNA QUESTO -> " + values.toString()); + String[] values = (String[]) organization.getExpandoBridge().getAttribute(CATEGORY); return values[0]; } } catch (Exception e) { @@ -221,10 +229,22 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService } + public LinkedHashMap> getPortalOrganizationMappedToVRE() throws SystemException, PortalException { LinkedHashMap> toReturn = new LinkedHashMap>(); - + //before iterating the actual groups create the virtualGroups in the correct order + List virtualGroups = getVirtualGroups(); + for (String vg : virtualGroups) { + String[] splits = vg.split("\\|"); + String gName = splits[0]; + String gDescription = splits[1]; + ArrayList toCreate = new ArrayList(); + VRECategory cat = new VRECategory(1L, gName, gDescription); + toReturn.put(cat, toCreate); + } + + //start of iteration of the actual groups List organizations = OrganizationLocalServiceUtil.getOrganizations(0, OrganizationLocalServiceUtil.getOrganizationsCount()); Organization rootOrganization = null; for (Organization organization : organizations) { @@ -264,29 +284,33 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService boolean requireAccessGrant = requireAccessGrant(vreOrganization); _log.debug(String.format("VRE preferences : %s", vreOrganization.getPreferences())); + String catName = getCategory(vreOrganization); String[] splits = catName.split("\\|"); catName = splits[0]; - String description = splits[1]; + VRECategory toLookFor = null; for (VRECategory vre : toReturn.keySet()) { if (vre.getName().compareTo(catName)==0) toLookFor = vre; } - System.out.println("\ngetCategory() ->" + catName); + _log.debug("\ngetCategory() ->" + catName); if (toLookFor != null) { ArrayList toUpdate = toReturn.get(toLookFor); toUpdate.add(new VRE(vreID,vreName, vreDescription, vreLogoURL, groupName,friendlyURL, UserBelonging.NOT_BELONGING, requireAccessGrant)); - } else { - ArrayList toCreate = new ArrayList(); - toCreate.add(new VRE(vreID,vreName, vreDescription, vreLogoURL, groupName,friendlyURL, UserBelonging.NOT_BELONGING, requireAccessGrant)); - VRECategory cat = new VRECategory(1L, catName, description); - toReturn.put(cat, toCreate); - } + } + + + } } - + + //sort the vres in the groups + for (VRECategory cat : toReturn.keySet()) { + ArrayList toSort = toReturn.get(cat); + Collections.sort(toSort); + } return toReturn; } diff --git a/src/main/resources/org/gcube/portlets/user/joinvre/JoinVRE.gwt.xml b/src/main/resources/org/gcube/portlets/user/joinvre/JoinVRE.gwt.xml index 0471e0c..71ff8d7 100644 --- a/src/main/resources/org/gcube/portlets/user/joinvre/JoinVRE.gwt.xml +++ b/src/main/resources/org/gcube/portlets/user/joinvre/JoinVRE.gwt.xml @@ -4,10 +4,7 @@ - - - - + diff --git a/src/main/webapp/JoinVRE.css b/src/main/webapp/JoinVRE.css index 38e56ff..8b6d71a 100644 --- a/src/main/webapp/JoinVRE.css +++ b/src/main/webapp/JoinVRE.css @@ -1,3 +1,15 @@ body { padding-top: 0px !important; +} + +h1 { + font-size:30px !important; +} + +h1 small { + font-size:22px !important; +} + +#wrapper { + width: 1220px !important; } \ No newline at end of file diff --git a/src/main/webapp/images/logoBlue.png b/src/main/webapp/images/logoBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..952dd2256412a1b2bdcc64de6ffa7a3a5bbc431a GIT binary patch literal 17339 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 literal 0 HcmV?d00001