diff --git a/.classpath b/.classpath index cd156eb..061d6eb 100644 --- a/.classpath +++ b/.classpath @@ -1,12 +1,12 @@ - + - + @@ -39,5 +39,5 @@ - + diff --git a/pom.xml b/pom.xml index 89f8155..5c405ea 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ org.gcube.portlets.user join-vre war - 3.4.0-SNAPSHOT + 3.5.0-SNAPSHOT gCube Join VRE Portlet Display the available VRE to Join 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 6e0241b..0026a81 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 @@ -17,8 +17,20 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("JoinService") public interface JoinService extends RemoteService { + Boolean isTabbedPanel(); + LinkedHashMap> getVREs(); + LinkedHashMap> getPortalSitesMappedToVRE(String tabName); + + LinkedHashMap> getVREsByOrganisation(String organisationName); + + LinkedHashMap> getVREsByCategory(String categoryName); + + ArrayList getAllOrganisations(); + + ArrayList getAllCategories(); + String joinVRE(Long vreId); VRE getSelectedVRE(Long vreId); 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 d866062..e63908b 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 @@ -31,4 +31,17 @@ public interface JoinServiceAsync { void readInvite(String inviteId, long siteId, AsyncCallback callback); void getTermsOfUse(long siteId, AsyncCallback callback); + + void isTabbedPanel(AsyncCallback callback); + + void getPortalSitesMappedToVRE(String tabName, AsyncCallback>> callback); + + void getVREsByOrganisation(String organisationName, + AsyncCallback>> callback); + + void getAllOrganisations(AsyncCallback> callback); + + void getAllCategories(AsyncCallback> callback); + + void getVREsByCategory(String categoryName, AsyncCallback>> callback); } diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/JoinVRE.java b/src/main/java/org/gcube/portlets/user/joinvre/client/JoinVRE.java index 95365f8..795d0db 100644 --- a/src/main/java/org/gcube/portlets/user/joinvre/client/JoinVRE.java +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/JoinVRE.java @@ -1,17 +1,27 @@ package org.gcube.portlets.user.joinvre.client; +import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import org.gcube.portlets.user.joinvre.client.responsive.ResponsivePanel; +import org.gcube.portlets.user.joinvre.client.ui.LoadingPanel; import org.gcube.portlets.user.joinvre.shared.VRE; +import org.gcube.portlets.user.joinvre.shared.VRECategory; +import com.github.gwtbootstrap.client.ui.DropdownTab; +import com.github.gwtbootstrap.client.ui.Tab; +import com.github.gwtbootstrap.client.ui.TabPanel; +import com.github.gwtbootstrap.client.ui.resources.Bootstrap.Tabs; import com.google.gwt.core.client.EntryPoint; 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.user.client.Window; import com.google.gwt.user.client.Window.Location; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.VerticalPanel; /** * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it @@ -19,8 +29,20 @@ import com.google.gwt.user.client.ui.RootPanel; public class JoinVRE implements EntryPoint { Logger logger = Logger.getLogger(JoinVRE.class.getName()); public static final String GET_OID_PARAMETER = "siteId"; + public static final String ORGANISATIONS_LABEL = "Organisations"; + public static final String CATEGORIES_LABEL = "Categories"; + private final JoinServiceAsync joinService = GWT.create(JoinService.class); + + private VerticalPanel mainPanel = new VerticalPanel(); + + private TabPanel mainTabPanel = new TabPanel(Tabs.ABOVE); + private Tab productsPane = new Tab(); + private Tab portfolioPane = new Tab(); + + private boolean portfolioLoaded = false; + public void onModuleLoad() { checkIsReferral(); } @@ -79,10 +101,88 @@ public class JoinVRE implements EntryPoint { } } private ResponsivePanel displayVREs() { - ResponsivePanel toReturn = new ResponsivePanel(); - RootPanel.get("JoinVRE-Container").add(toReturn); + final ResponsivePanel toReturn = new ResponsivePanel(); + mainPanel.setWidth("100%"); + mainPanel.add(toReturn); + joinService.isTabbedPanel(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) {} + + @Override + public void onSuccess(Boolean result) { + if (result) { + GWT.log("TabbedPanel"); + showTabs(toReturn); + } + + } + }); + RootPanel.get("JoinVRE-Container").add(mainPanel); return toReturn; + } + + private void showTabs(ResponsivePanel rp) { + + productsPane.setHeading("Products"); + productsPane.add(rp); + productsPane.setActive(true); + + portfolioPane.setHeading("Portfolio"); + portfolioPane.add(new LoadingPanel()); + + mainTabPanel.add(productsPane); + mainTabPanel.add(portfolioPane); + + mainTabPanel.selectTab(0); + mainPanel.clear(); + mainPanel.add(mainTabPanel); + + addCategoriesTab(mainTabPanel); + + portfolioPane.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (!portfolioLoaded) { + final ResponsivePanel rpPort = new ResponsivePanel("Portfolio"); + portfolioPane.clear(); + portfolioPane.add(rpPort); + portfolioLoaded = true; + } + } + }); + } + + private void addCategoriesTab(final TabPanel mainTabPanel) { + joinService.getAllCategories(new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + } + @Override + public void onSuccess(ArrayList result) { + if (result.size() > 0) { + final DropdownTab dropdownCategoriesTab = new DropdownTab(CATEGORIES_LABEL); + for (String catName : result) { + final String categoryName = catName; + + final Tab tab2Add = new Tab(); + tab2Add.setHeading(categoryName); + dropdownCategoriesTab.add(tab2Add); + + tab2Add.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + tab2Add.clear(); + tab2Add.add(new ResponsivePanel(new VRECategory(1L, categoryName, ""))); + } + }); + } + mainTabPanel.add(dropdownCategoriesTab); + } + } + }); + } + /** * check if it has to show just one feed * @return 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 34f82b8..2b89b78 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 @@ -24,7 +24,6 @@ public class ResponsivePanel extends Composite { private final JoinServiceAsync joinService = GWT.create(JoinService.class); public static final String loading = GWT.getModuleBaseURL() + "../images/vre-loader.gif"; - private Row mainPanel = new Row(); private ArrayList myThumbnails = new ArrayList(); public ResponsivePanel() { @@ -32,36 +31,69 @@ public class ResponsivePanel extends Composite { joinService.getVREs(new AsyncCallback>>() { @Override public void onSuccess(LinkedHashMap> categories) { - mainPanel.clear(); - if (categories == null || categories.isEmpty()) { - showError("Ops, something went wrong"); - } - else { - for (VRECategory cat : categories.keySet()) { - GWT.log("cat: " + cat.getName()); - PageHeader header = new PageHeader(); - header.setText(cat.getName()); - if (cat.getDescription() == null || cat.getDescription().compareTo("") == 0 || cat.getDescription().compareTo("empty") == 0 ) - header.setSubtext(""); - else - header.setSubtext(cat.getDescription()); - mainPanel.add(header); - mainPanel.add(getVREThumbnails(categories, cat)); - - } - } + populatePanel(categories); } - @Override public void onFailure(Throwable caught) { showError("Sorry, looks like something is broken with the server connection"); - } - }); initWidget(mainPanel); } + public ResponsivePanel(String tabName) { + GWT.log("ResponsivePanel()"); + joinService.getPortalSitesMappedToVRE(tabName, new AsyncCallback>>() { + @Override + public void onSuccess(LinkedHashMap> categories) { + populatePanel(categories); + } + @Override + public void onFailure(Throwable caught) { + showError("Sorry, looks like something is broken with the server connection"); + } + }); + initWidget(mainPanel); + } + + public ResponsivePanel(VRECategory category) { + GWT.log("ResponsivePanel()"); + joinService.getVREsByCategory(category.getName(), new AsyncCallback>>() { + @Override + public void onSuccess(LinkedHashMap> categories) { + populatePanel(categories); + } + @Override + public void onFailure(Throwable caught) { + showError("Sorry, looks like something is broken with the server connection"); + } + }); + initWidget(mainPanel); + } + + private void populatePanel(LinkedHashMap> categories) { + mainPanel.clear(); + if (categories == null || categories.isEmpty()) { + showError("Ops, something went wrong"); + } + else { + for (VRECategory cat : categories.keySet()) { + GWT.log("cat: " + cat.getName()); + PageHeader header = new PageHeader(); + header.setText(cat.getName()); + if (cat.getDescription() == null || cat.getDescription().compareTo("") == 0 || cat.getDescription().compareTo("empty") == 0 ) + header.setSubtext(""); + else + header.setSubtext(cat.getDescription()); + if (categories.get(cat).size() > 0) { + mainPanel.add(header); + mainPanel.add(getVREThumbnails(categories, cat)); + } + } + } + } + + private Thumbnails getVREThumbnails(LinkedHashMap> categories, VRECategory category) { ArrayList vres = categories.get(category); Thumbnails toReturn = new Thumbnails(); @@ -105,6 +137,7 @@ public class ResponsivePanel extends Composite { } } } + } diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPanel.java b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPanel.java new file mode 100644 index 0000000..436fe2b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPanel.java @@ -0,0 +1,19 @@ +package org.gcube.portlets.user.joinvre.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class LoadingPanel extends Composite { + + private static LoadingPanelUiBinder uiBinder = GWT.create(LoadingPanelUiBinder.class); + + interface LoadingPanelUiBinder extends UiBinder { + } + + public LoadingPanel() { + initWidget(uiBinder.createAndBindUi(this)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPanel.ui.xml b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPanel.ui.xml new file mode 100644 index 0000000..509337b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/joinvre/client/ui/LoadingPanel.ui.xml @@ -0,0 +1,14 @@ + + + + .center { + text-align: center; + color: #999; + } + + + Loading, just a moment ... + + + \ 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 0bf469a..666a8f9 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 @@ -60,6 +60,17 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService private static Log _log = LogFactoryUtil.getLog(JoinServiceImpl.class); private static DatabookStore store; public static final String PREFIX_PUBLIC_URL = "/web"; + //tell whether the + public static final String TABBED_LAYOUT_ATTRIBUTE = "TabbedLayout"; + public static final String TAB_NAMES_ATTRIBUTE = "TabName"; + + public static final String ALLVRES_SESSION_ATTRIBUTE = "ALLVRES_SESSION"; + + private static GroupManager groupsManager; + + public void init() { + groupsManager = new LiferayGroupManager(); + } /** * * @return true if you're running into the portal, false if in development @@ -110,7 +121,7 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService TermsOfUse tou = new TermsOfUseImpl(); try { - long groupId = new LiferayGroupManager().getGroup(siteId).getGroupId(); + long groupId = groupsManager.getGroup(siteId).getGroupId(); ToU terms = tou.getToUGroup(groupId); return terms.getContent(); } @@ -123,28 +134,172 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService return null; } } + public Boolean isTabbedPanel() { + if (isWithinPortal()) { + _log.info("check if isTabbedPanel "); + Object tabbedLayoutObj = null; + try { + long currentSiteGroupId = getSiteFromServletRequest(getThreadLocalRequest()).getGroupId(); + tabbedLayoutObj = groupsManager.readCustomAttr(currentSiteGroupId, TABBED_LAYOUT_ATTRIBUTE); + + getTabNames(); + + } catch (Exception e1) { + e1.printStackTrace(); + return false; + } + Boolean isTabbedLayout = false; + if (tabbedLayoutObj != null) { + isTabbedLayout = (Boolean) tabbedLayoutObj; + } + return isTabbedLayout; + } + else + return true; + } /** * - * @param session the Asl Session - * @param withinPortal true when is on Liferay portal - * @return the users belonging to the current organization (scope) + * @return the list containing the names of the Tabs to show in the correct order. + * @throws Exception */ + private List getTabNames() throws Exception { + List toReturn = new ArrayList(); + long currentSiteGroupId = getSiteFromServletRequest(getThreadLocalRequest()).getGroupId(); + Group site = GroupLocalServiceUtil.getGroup(currentSiteGroupId); + String[] values = (String[]) site.getExpandoBridge().getAttributeDefault(TAB_NAMES_ATTRIBUTE); + for (int i = 0; i < values.length; i++) { + toReturn.add(values[i]); + } + return toReturn; + } + + //first method called to get VREs and their categories @Override public LinkedHashMap> getVREs() { LinkedHashMap> toReturn = new LinkedHashMap>(); - - try { + try { if (isWithinPortal()) { - toReturn = getPortalSitesMappedToVRE(); + if (isTabbedPanel()) { + String firstTabName = getTabNames().get(0); + _log.debug("\n\n ****isTabbedLayout isTabbedLayout, first TabName= "+firstTabName); + return getPortalSitesMappedToVRE(firstTabName); + } else { + toReturn = getPortalSitesMappedToVRE(); + setVREsInSession(toReturn); + } } else { - toReturn = getFakePortalVREs(); } + toReturn = getFakePortalVREs(); + } } catch (Exception e) { _log.error("Error getting VREs", e); } - - return toReturn; } + + /** + * + * @param tabName + * @return the list of VREs given a tabName + */ + @Override + public LinkedHashMap> getPortalSitesMappedToVRE(String tabName) { + LinkedHashMap> tabVREs = new LinkedHashMap>(); + try { + LinkedHashMap> allVREs = getPortalSitesMappedToVRE(); + setVREsInSession(allVREs); + + for (VRECategory cat : allVREs.keySet()) { + ArrayList toAdd = new ArrayList(); + tabVREs.put(cat, toAdd); + for (VRE vre : allVREs.get(cat)) { + String[] vreTabNames = (String[]) groupsManager.readCustomAttr(vre.getId(), TAB_NAMES_ATTRIBUTE); + String vreTabName = vreTabNames[0]; + if (tabName.equals(vreTabName)) { + toAdd.add(vre); + _log.debug("Added " + vre.getName() + " as it belongs to " + vreTabName); + } + } + } + } + catch (Exception e) { + _log.error("Error getting VREs", e); + } + return tabVREs; + } + /** + * @param organisationName + * @return the list of VREs given a organisation Name + */ + @Override + public LinkedHashMap> getVREsByOrganisation(String organisationName) { + + //TODO: + LinkedHashMap> toReturn = new LinkedHashMap>(); + return toReturn; + } + + /** + * @param categoryName + * @return the list of VREs given a category Name + */ + @Override + public LinkedHashMap> getVREsByCategory(String categoryName) { + _log.debug("getVREsByCategory: " + categoryName); + LinkedHashMap> toReturn = new LinkedHashMap>(); + try { + LinkedHashMap> temp = null; + if (getVREsFromSession() == null) { + temp = getPortalSitesMappedToVRE(); + setVREsInSession(temp); + _log.debug("getVREsByCategory looking in session not successful, asking to DB ... " + categoryName); + } else { + temp = getVREsFromSession(); + _log.debug("getVREsByCategory looking in session " + categoryName); + } + for (VRECategory cat : temp.keySet()) { + if (cat.getName().equals(categoryName)) { + toReturn.put(cat, temp.get(cat)); + _log.debug("getVREsByCategory foudn match, returning " + cat.getName()); + return toReturn; + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + return toReturn; + } + + @Override + public ArrayList getAllOrganisations() { + // TODO Auto-generated method stub + return null; + } + + @Override + public ArrayList getAllCategories() { + ArrayList toReturn = new ArrayList<>(); + if (isWithinPortal()) { + try { + long currentSiteGroupId = getSiteFromServletRequest(getThreadLocalRequest()).getGroupId(); + List currentSiteVGroups = groupsManager.getVirtualGroups(currentSiteGroupId); + + for (VirtualGroup vg : currentSiteVGroups) { + toReturn.add(vg.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + else { + LinkedHashMap> fakes = getFakePortalVREs(); + for (VRECategory cat : fakes.keySet()) { + toReturn.add(cat.getName()); + } + } + return toReturn; + } + /** * * @return the Virtual groups with their VREs in the order estabilished in the LR Control Panel @@ -152,11 +307,10 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService * @throws PortalException */ public LinkedHashMap> getPortalSitesMappedToVRE() throws Exception { - GroupManager gm = new LiferayGroupManager(); LinkedHashMap> toReturn = new LinkedHashMap>(); long currentSiteGroupId = getSiteFromServletRequest(getThreadLocalRequest()).getGroupId(); - List currentSiteVGroups = gm.getVirtualGroups(currentSiteGroupId); + List currentSiteVGroups = groupsManager.getVirtualGroups(currentSiteGroupId); for (VirtualGroup vg : currentSiteVGroups) { ArrayList toCreate = new ArrayList(); @@ -164,7 +318,7 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService toReturn.put(cat, toCreate); } - GCubeGroup rootGroupVO = gm.getRootVO(); + GCubeGroup rootGroupVO = groupsManager.getRootVO(); try { _log.debug("root: " + rootGroupVO.getGroupName() ); @@ -177,7 +331,7 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService List currUserGroups = new ArrayList(); GCubeUser currUser = pContext.getCurrentUser(getThreadLocalRequest()); if (currUser != null) { - currUserGroups = gm.listGroupsByUser(currUser.getUserId()); + currUserGroups = groupsManager.listGroupsByUser(currUser.getUserId()); } //for each root sub organizations (VO) @@ -188,11 +342,11 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService String vreDescription = vreSite.getDescription(); long logoId = vreSite.getLogoId(); - String vreLogoURL = gm.getGroupLogoURL(logoId); - String groupName = gm.getInfrastructureScope(vreSite.getGroupId()); + String vreLogoURL = groupsManager.getGroupLogoURL(logoId); + String groupName = groupsManager.getInfrastructureScope(vreSite.getGroupId()); String friendlyURL = GCubePortalConstants.PREFIX_GROUP_URL+vreSite.getFriendlyURL(); - List vreGroups = gm.getVirtualGroups(vreID); + List vreGroups = groupsManager.getVirtualGroups(vreID); for (VirtualGroup vreGroup : vreGroups) { for (VRECategory vre : toReturn.keySet()) { if (vre.getName().compareTo(vreGroup.getName())==0) { @@ -284,6 +438,9 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService vres.add(new VRE(1, "devVRE7", "devVRE VRE description", "", "http://placehold.it/200x200", "/group/devVRE", UserBelonging.NOT_BELONGING, VreMembershipType.PRIVATE)); vres.add(new VRE(2, "devmod76", "devmode VRE description", "", "http://placehold.it/200x200", "/group/devmode", UserBelonging.NOT_BELONGING)); toReturn.put(devsecCategory, vres); + + setVREsInSession(toReturn); + return toReturn; } @@ -491,4 +648,16 @@ public class JoinServiceImpl extends RemoteServiceServlet implements JoinService return null; } + @SuppressWarnings("unchecked") + private LinkedHashMap> getVREsFromSession() { + if (getThreadLocalRequest().getSession().getAttribute(ALLVRES_SESSION_ATTRIBUTE) == null) + return null; + else + return (LinkedHashMap>) getThreadLocalRequest().getSession().getAttribute(ALLVRES_SESSION_ATTRIBUTE); + } + @SuppressWarnings("unchecked") + private void setVREsInSession(LinkedHashMap> allVREs) { + getThreadLocalRequest().getSession().setAttribute(ALLVRES_SESSION_ATTRIBUTE, allVREs); + } + } 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 bcecc3d..ff2d6c4 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 @@ -1,17 +1,15 @@ - - - + + - diff --git a/src/main/webapp/explore.css b/src/main/webapp/explore.css index 85c5175..c0bdbd9 100644 --- a/src/main/webapp/explore.css +++ b/src/main/webapp/explore.css @@ -2,6 +2,15 @@ body { border: 5px solid white; } +ul.dropdown-menu > li { + font-size: 1.1em !important; +} + +.nav-tabs > li > a { + font-size: 2em !important; + padding-left: 10px; +} + @media only screen and (min-width: 800px) { .aui .row-fluid .span3 { width: 19% !important;