diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java index eb4266e..6cc6231 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java @@ -131,8 +131,9 @@ public class CkanEventHandlerManager { @Override public void onShowOrganizations( ShowUserOrganizationsEvent showUserDatasetsEvent) { - String request = getCkanRequest("/dashboard/organizations", null); - panel.instanceCkanFrame(request); + + panel.showOrganizations(); + } }); eventBus.addHandler( @@ -213,9 +214,6 @@ public class CkanEventHandlerManager { return ckan.buildURI(); } - - - private static native void logutWindow(String uri, boolean timeout)/*-{ var newWindow = window.open(uri, '_blank', 'width=50,height=50'); newWindow.onload = function() { diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java index 67a7cef..9247806 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java @@ -1,5 +1,7 @@ package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client; +import java.util.Map; + import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanRole; @@ -22,6 +24,12 @@ public interface GcubeCkanDataCatalogService extends RemoteService { CkanRole getMyRole() throws Exception; String getUser(); + + /** + * Retrieve the list of organizations to whom the user belongs and their urls + * @return + */ + Map getCkanOrganizationsNamesAndUrlsForUser(); void logoutFromCkan(); diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java index 37a3e32..01b8f4e 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java @@ -3,6 +3,8 @@ */ package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client; +import java.util.Map; + import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanRole; @@ -36,4 +38,8 @@ public interface GcubeCkanDataCatalogServiceAsync { void logoutURIFromCkan(AsyncCallback callback); + + void getCkanOrganizationsNamesAndUrlsForUser( + AsyncCallback> callback); + } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java index 8fb90bd..975afd0 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java @@ -82,6 +82,7 @@ public class CkanFramePanel extends FlowPanel{ } }); add(frame); + frame.setVisible(true); eventBus.fireEvent(new IFrameInstanciedEvent()); return frame; } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java new file mode 100644 index 0000000..0161fc6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java @@ -0,0 +1,106 @@ +package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.view; + +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.Paragraph; +import com.github.gwtbootstrap.client.ui.base.ListItem; +import com.github.gwtbootstrap.client.ui.base.UnorderedList; +import com.github.gwtbootstrap.client.ui.constants.ButtonType; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; + +/** + * The ckan panel that shows the user organizations + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class CkanOrganizationsPanel extends VerticalPanel{ + + private Map organizations; + private GCubeCkanDataCatalogPanel father; + + public CkanOrganizationsPanel( + GCubeCkanDataCatalogPanel gCubeCkanDataCatalogPanel) { + father = gCubeCkanDataCatalogPanel; + } + + /** + * Set the organizations to show + * @param result + */ + public void setOrganizations(Map result) { + + HorizontalPanel hPanel = new HorizontalPanel(); + hPanel.setStyleName("horizontal-panel-organizations"); + VerticalPanel vPanel = new VerticalPanel(); + + hPanel.add(vPanel); + add(hPanel); + + this.organizations = result; + + //generate the list of organizations + if(result == null || result.isEmpty()){ + + Paragraph p = new Paragraph("You are not a member of any organizations."); + p.setStyleName("no-organizations-found-paragraph"); + p.getElement().getStyle().setColor("#aaaaaa"); + vPanel.add(p); + + }else{ + + UnorderedList list = new UnorderedList(); + Iterator> iterator = organizations.entrySet().iterator(); + + while (iterator.hasNext()) { + final Map.Entry entry = (Map.Entry) iterator + .next(); + + Button b = new Button(); + b.setType(ButtonType.LINK); + b.setText(entry.getKey()); + b.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + + String request = getCkanRequest(entry.getValue(), null); + father.instanceCkanFrame(request); + + } + }); + + ListItem item = new ListItem(b); + list.add(item); + } + + list.addStyleName("list-panel-organizations-style"); + vPanel.add(list); + } + setWidth("100%"); + setStyleName("my-organizations-container-style"); + } + + /** + * Request the correct url to the ckan connector + * @param pathInfo + * @param query + * @return + */ + private String getCkanRequest(String pathInfo, String query){ + CkanConnectorAccessPoint ckan = new CkanConnectorAccessPoint(father.getBaseURLCKANConnector()); + ckan.addGubeToken(father.getGcubeTokenValueToCKANConnector()); + pathInfo = CkanConnectorAccessPoint.checkNullString(pathInfo); + query = CkanConnectorAccessPoint.checkNullString(query); + ckan.addPathInfo(pathInfo); + ckan.addQueryString(query); + return ckan.buildURI(); + } + +} diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java index 8ccc874..b03c79c 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java @@ -3,6 +3,8 @@ */ package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.view; +import java.util.Map; + import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GCubeCkanDataCatalog; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.resource.CkanPortletResources; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; @@ -18,6 +20,7 @@ import com.google.gwt.user.client.ui.Frame; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.VerticalPanel; /** @@ -28,15 +31,15 @@ import com.google.gwt.user.client.ui.ScrollPanel; */ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ - private CkanMetadataManagementPanel managementPanel; private ScrollPanel centerScrollable = new ScrollPanel(); private CkanFramePanel ckanFramePanel; + private CkanOrganizationsPanel ckanOrganizationsPanel; private Image loading = new Image(CkanPortletResources.ICONS.loading()); private RootPanel rootPanel; private HandlerManager eventBus; private CkanConnectorAccessPoint ckanAccessPoint; - + /** * Instantiates a new g cube ckan data catalog panel. * @@ -48,6 +51,7 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ this.eventBus = eventManager; ckanFramePanel = new CkanFramePanel(eventBus); managementPanel = new CkanMetadataManagementPanel(eventBus); + ckanOrganizationsPanel = new CkanOrganizationsPanel(this); initPanel(); String pathParameter = Window.Location.getParameter(GCubeCkanDataCatalog.GET_PATH_PARAMETER); String queryParameter = Window.Location.getParameter(GCubeCkanDataCatalog.GET_QUERY_PARAMETER); @@ -67,6 +71,21 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ Window.alert("Sorry, An error occurred during contacting Gcube Ckan Data Catalogue!"); } }); + + // RETRIEVE USER'S ORGANIZATIONS + GCubeCkanDataCatalog.service.getCkanOrganizationsNamesAndUrlsForUser(new AsyncCallback>() { + + @Override + public void onSuccess(Map result) { + + if(result != null) + ckanOrganizationsPanel.setOrganizations(result); + } + + @Override + public void onFailure(Throwable caught) { + } + }); //MANAGE CKAN MANAGEMENT PANEL ACCORDING TO MY ROLE @@ -157,6 +176,8 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ */ public Frame instanceCkanFrame(String ckanUrlConnector){ + ckanFramePanel.setVisible(true); + ckanOrganizationsPanel.setVisible(false); return ckanFramePanel.instanceFrame(ckanUrlConnector); } @@ -167,7 +188,12 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ private void initPanel() { setTopPanelVisible(false); addToTop(managementPanel); - centerScrollable.add(ckanFramePanel); + VerticalPanel containerIntoScrollPanel = new VerticalPanel(); + containerIntoScrollPanel.setWidth("100%"); + containerIntoScrollPanel.add(ckanFramePanel); + containerIntoScrollPanel.add(ckanOrganizationsPanel); + centerScrollable.add(containerIntoScrollPanel); + ckanOrganizationsPanel.setVisible(false); addToMiddle(centerScrollable); } @@ -225,4 +251,13 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ return ckanAccessPoint.getPathInfoParameter(); } + /** + * Show the organizations panel + */ + public void showOrganizations() { + + ckanOrganizationsPanel.setVisible(true); + ckanFramePanel.setVisible(false); + + } } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java index 80e8c0e..c78f275 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,6 +39,7 @@ import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import eu.trentorise.opendata.jackan.model.CkanOrganization; import eu.trentorise.opendata.traceprov.internal.org.apache.commons.io.IOUtils; /** * The server side implementation of the RPC service. @@ -465,6 +467,42 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } } + @Override + public Map getCkanOrganizationsNamesAndUrlsForUser() { + + HttpSession httpSession = this.getThreadLocalRequest().getSession(); + ASLSession session = getASLSession(httpSession); + String username = session.getUsername(); + + Map toReturn = new HashMap<>(); + + if(!SessionUtil.isIntoPortal()){ + + logger.warn("You are not into the portal"); + // toReturn.put("testVRE", "random"); + // toReturn.put("testVRE2", "random"); + // toReturn.put("testVRE3", "random"); + // toReturn.put("testVRE4", "random"); + // toReturn.put("testVRE5", "random"); + + } + + if(username.equals(TEST_USER)) + return toReturn; + else{ + + List organizations = instance.getOrganizationsByUser(username); + + for (CkanOrganization ckanOrganization : organizations) { + toReturn.put(ckanOrganization.getTitle(), "/organization/" + ckanOrganization.getName()); + } + + logger.debug("List of organizations to return for user " + username + " is " + toReturn); + } + + return toReturn; + } + /* public static void main(String[] args) { diff --git a/src/main/webapp/GCubeCkanDataCatalog.css b/src/main/webapp/GCubeCkanDataCatalog.css index 478c263..0c4f405 100644 --- a/src/main/webapp/GCubeCkanDataCatalog.css +++ b/src/main/webapp/GCubeCkanDataCatalog.css @@ -49,4 +49,49 @@ h1 { .modal { top: 2% !important; +} + +/** My Organizations panel **/ +.my-organizations-container-style { + background-repeat: repeat !important; + background-attachment: scroll !important; + background-position: 0% 0% !important; + background-clip: border-box !important; + background-origin: padding-box !important; + background-size: auto auto !important; + width: 100% !important; + height: 100% !important; + background: #eeeeee + url("https://ckan-d-d4s.d4science.org/base/images/bg.png") !important; +} + +.horizontal-panel-organizations { + margin-right: auto !important; + margin-left: auto !important; + background-color: white !important; + width: 70% !important; + margin-top: 2% !important; + margin-bottom: 10% ! important; + zoom: 1 !important; + background-color: #FFF !important; + border: 1px solid #cccccc !important; + -webkit-border-radius: 4px !important; + -moz-border-radius: 4px !important; + border-radius: 4px !important; + -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05) !important; + -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05) !important; + box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05) !important; + position: relative !important; + background-color: #fff !important; + padding-left: 5% !important !important; +} + +.list-panel-organizations-style { + padding: 30px !important; +} + +.no-organizations-found-paragraph { + padding: 30px !important; + color: #aaaaaa !important; + font-style: italic !important; } \ No newline at end of file