From 41915d67458d21ed8d1a13727bcc185ab6c5896e Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Tue, 8 Nov 2016 14:17:41 +0000 Subject: [PATCH] Resource picker widget is almost finished git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/widgets/ckan-metadata-publisher-widget@133955 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 1 + .../client/CKanPublisherService.java | 2 +- .../ResourceCellRight.java | 4 +- .../ResourceElementBean.java | 10 ++- .../ShowMorePagerPanel.java | 1 - .../TwinColumnSelectionMainPanel.java | 89 ++++++++++--------- .../TwinColumnSelectionMainPanel.ui.xml | 12 ++- .../server/CKANPublisherServicesImpl.java | 5 +- .../server/utils/Utils.java | 3 - .../server/utils/WorkspaceUtils.java | 9 +- .../shared/ResourceBeanWrapper.java | 68 ++++++++++++-- 11 files changed, 134 insertions(+), 70 deletions(-) diff --git a/.classpath b/.classpath index 57c104b..3e9559a 100644 --- a/.classpath +++ b/.classpath @@ -20,6 +20,7 @@ + diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java index b3cb3e5..a635c94 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/CKanPublisherService.java @@ -40,7 +40,7 @@ public interface CKanPublisherService extends RemoteService { /** * Try to create such dataset starting from the information contained into the toCreate bean. * @param toCreate - * @return the sent bean full filled with the needed information + * @return the sent bean filled with the needed information */ DatasetMetadataBean createCKanDataset(DatasetMetadataBean toCreate); diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceCellRight.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceCellRight.java index c716449..056020d 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceCellRight.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceCellRight.java @@ -13,12 +13,10 @@ public class ResourceCellRight extends AbstractCell{ public void render(com.google.gwt.cell.client.Cell.Context context, ResourceElementBean value, SafeHtmlBuilder sb) { - // Do not render an object if - // - is null; - // - is still on the left side if (value == null || !value.isMovedToRight() || value.isFolder()) { return; } + sb.appendHtmlConstant("
"); sb.appendHtmlConstant(""); diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceElementBean.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceElementBean.java index fcfb952..85ada51 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceElementBean.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ResourceElementBean.java @@ -2,7 +2,6 @@ package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.TwinColumnS import java.util.List; -import com.google.gwt.core.shared.GWT; import com.google.gwt.view.client.ProvidesKey; @@ -120,14 +119,17 @@ public class ResourceElementBean implements Comparable{ @Override public boolean equals(Object o) { + boolean toReturn = false; if (o instanceof ResourceElementBean) { - return identifier == ((ResourceElementBean) o).identifier; + toReturn = identifier == ((ResourceElementBean) o).identifier; } - return false; + + return toReturn; } @Override public int compareTo(ResourceElementBean o) { - return (o == null || o.name == null) ? -1 : -o.fullPath.compareTo(fullPath); + int toReturn = (o == null || o.fullPath == null) ? -1 : -o.fullPath.compareTo(fullPath); + return toReturn; } } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ShowMorePagerPanel.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ShowMorePagerPanel.java index e7cb6a5..f2aa5dd 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ShowMorePagerPanel.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/ShowMorePagerPanel.java @@ -89,7 +89,6 @@ public class ShowMorePagerPanel extends AbstractPager{ /** * Set the number of rows by which the range is increased when the scrollbar * reaches the bottom. - * * @param incrementSize the incremental number of rows */ public void setIncrementSize(int incrementSize) { diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java index c568a06..9b4b3bc 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java @@ -5,8 +5,11 @@ import java.util.List; import java.util.Set; import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.Popover; +import com.github.gwtbootstrap.client.ui.constants.Placement; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.BorderStyle; +import com.google.gwt.dom.client.Style.Float; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -15,6 +18,7 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.CellList; import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.ListDataProvider; @@ -44,9 +48,13 @@ public class TwinColumnSelectionMainPanel extends Composite{ Button allToLeftButton; @UiField Button goRootButton; + @UiField + Popover popoverResourceSelection; + @UiField + Button resourceInfoButton; - private final String PANEL_BORDER_COLOR = "#08c"; - private final String PANEL_HEIGHT = "400px"; + private static final String PANEL_BORDER_COLOR = "#08c"; + private static final String PANEL_HEIGHT = "400px"; private ShowMorePagerPanel showMorePanelLeft = new ShowMorePagerPanel(); private ShowMorePagerPanel showMorePanelRight = new ShowMorePagerPanel(); private CellList cellListLeft; @@ -56,6 +64,9 @@ public class TwinColumnSelectionMainPanel extends Composite{ private MultiSelectionModel selectionModelRight; private MultiSelectionModel selectionModelLeft; private final List initialElements; + private final static HTML aboutHeader = new HTML("Resource Manager"); + private final static HTML aboutBody = new HTML("Move the files you want to attach to the product on the right panel below." + + " Please consider that any complex hierarchy structure you may have will be flatten."); private static TwinColumnSelectionMainPanelUiBinder uiBinder = GWT .create(TwinColumnSelectionMainPanelUiBinder.class); @@ -70,15 +81,19 @@ public class TwinColumnSelectionMainPanel extends Composite{ this.initialElements = elements; this.buttonsPanel.getElement().getStyle().setMarginTop(50, Unit.PCT); + goRootButton.getElement().getStyle().setPaddingLeft(0, Unit.PX); allToRightButton.getElement().getStyle().setMarginBottom(4, Unit.PX); toRightButton.getElement().getStyle().setMarginBottom(4, Unit.PX); toLeftButton.getElement().getStyle().setMarginBottom(4, Unit.PX); allToLeftButton.getElement().getStyle().setMarginBottom(4, Unit.PX); buttonsPanel.getElement().setAttribute("align", "center"); - + popoverResourceSelection.setPlacement(Placement.LEFT); + popoverResourceSelection.setHeading(aboutHeader.getHTML()); + popoverResourceSelection.setText(aboutBody.getHTML()); + resourceInfoButton.getElement().getStyle().setFloat(Float.RIGHT); prepareHandlers(); initLeftSidePanel(elements); - initRightSidePanel(elements); + initRightSidePanel(); } @@ -103,26 +118,22 @@ public class TwinColumnSelectionMainPanel extends Composite{ selectionModelLeft.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { Iterator selectedObjectsIterator = selectionModelLeft.getSelectedSet().iterator(); - while (selectedObjectsIterator.hasNext()) { ResourceElementBean selectedBean = (ResourceElementBean) selectedObjectsIterator.next(); if(selectedBean.isFolder()){ if(selectionModelLeft.getSelectedSet().size() == 1){ - GWT.log("Selected folder"); dataProviderLeft.setList(selectedBean.getChildren()); - dataProviderLeft.flush(); dataProviderLeft.refresh(); + dataProviderLeft.flush(); } - selectionModelLeft.setSelected(selectedBean, false); // unselect the folder + selectionModelLeft.setSelected(selectedBean, false); } } - // enable the buttons that allows to move the objects to the right enableMoveToRightButtons(selectionModelLeft.getSelectedSet()); } }); - // set the list into the provider dataProviderLeft.setList(elements); @@ -137,15 +148,12 @@ public class TwinColumnSelectionMainPanel extends Composite{ // add the list to the leftContainerPanel leftContainer.add(showMorePanelLeft); - } /** * Initialize the left side panel */ - private void initRightSidePanel(List elements) { - - GWT.log("Size is " + elements.size()); + private void initRightSidePanel() { // initialize the left side list ResourceCellRight cell = new ResourceCellRight(); @@ -153,7 +161,6 @@ public class TwinColumnSelectionMainPanel extends Composite{ // Set a key provider that provides a unique key for each object. cellListRight = new CellList(cell, ResourceElementBean.KEY_PROVIDER); cellListRight.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE); - cellListRight.setPageSize(elements.size()); // Add a selection model so we can select cells. selectionModelRight = new MultiSelectionModel(ResourceElementBean.KEY_PROVIDER); @@ -162,15 +169,10 @@ public class TwinColumnSelectionMainPanel extends Composite{ // perform an action on selection selectionModelRight.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { - // enable the buttons that allows to move the objects to the left enableMoveToLeftButtons(selectionModelRight.getSelectedSet()); } }); - - // set the list into the provider - dataProviderRight.setList(elements); - // set the cell list into the provider dataProviderRight.addDataDisplay(cellListRight); @@ -191,7 +193,11 @@ public class TwinColumnSelectionMainPanel extends Composite{ */ private void enableMoveToRightButtons(Set setselectedItemsLeft){ - if(setselectedItemsLeft.size() > 1){ + if(setselectedItemsLeft == null || setselectedItemsLeft.isEmpty()){ + allToRightButton.setEnabled(false); + toRightButton.setEnabled(false); + } + else if(setselectedItemsLeft.size() > 1){ allToRightButton.setEnabled(true); toRightButton.setEnabled(false); } @@ -207,7 +213,11 @@ public class TwinColumnSelectionMainPanel extends Composite{ */ private void enableMoveToLeftButtons(Set setselectedItemsRight){ - if(setselectedItemsRight.size() > 1){ + if(setselectedItemsRight == null || setselectedItemsRight.isEmpty()){ + allToLeftButton.setEnabled(false); + allToLeftButton.setEnabled(false); + } + else if(setselectedItemsRight.size() > 1){ allToLeftButton.setEnabled(true); toLeftButton.setEnabled(false); } @@ -275,51 +285,50 @@ public class TwinColumnSelectionMainPanel extends Composite{ } /** - * Move to right - * @param toMoveRight + * Move to right elements + * @param set the elements to move */ - private void moveToRight(Set set){ + private void moveToRight(Set setSelected){ - if(set == null) + if(setSelected == null || setSelected.isEmpty()) return; - Iterator iterator = set.iterator(); + Iterator iterator = setSelected.iterator(); while (iterator.hasNext()) { ResourceElementBean resourceElementBean = (ResourceElementBean) iterator .next(); - resourceElementBean.setMovedToRight(true); - GWT.log("To move right " + resourceElementBean); + resourceElementBean.setMovedToRight(true); + boolean contains = dataProviderRight.getList().contains(resourceElementBean); + if(!contains) + dataProviderRight.getList().add(resourceElementBean); } // refresh providers dataProviderLeft.flush(); - dataProviderLeft.refresh(); dataProviderRight.flush(); + dataProviderLeft.refresh(); dataProviderRight.refresh(); - } /** - * Move to right - * @param toMoveLeft + * Move to left elements + * @param setSelected the elements to move */ - private void moveToLeft(Set set){ + private void moveToLeft(Set setSelected){ - if(set == null) + if(setSelected == null || setSelected.isEmpty()) return; - Iterator iterator = set.iterator(); + Iterator iterator = setSelected.iterator(); while (iterator.hasNext()) { - ResourceElementBean resourceElementBean = (ResourceElementBean) iterator - .next(); + ResourceElementBean resourceElementBean = (ResourceElementBean) iterator.next(); resourceElementBean.setMovedToRight(false); - GWT.log("To move left " + resourceElementBean); } // refresh providers dataProviderLeft.flush(); - dataProviderLeft.refresh(); dataProviderRight.flush(); + dataProviderLeft.refresh(); dataProviderRight.refresh(); } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml index 70b6166..fbd6646 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml @@ -8,6 +8,11 @@ } + + + + + @@ -20,15 +25,16 @@ + enabled="false" title="Move selected file to the right" text=">" /> + title="Move selected file to the left" text="<" /> - + diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java index 394d540..38b7751 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java @@ -60,12 +60,13 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C public DataCatalogue getCatalogue(String scope){ DataCatalogue instance = null; + String scopeInWhichDiscover = null; try{ - String scopeInWhichDiscover = (scope != null && !scope.isEmpty()) ? scope : getASLSession().getScope(); + scopeInWhichDiscover = (scope != null && !scope.isEmpty()) ? scope : getASLSession().getScope(); logger.debug("Discovering ckan instance into scope " + scopeInWhichDiscover); instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover); }catch(Exception e){ - logger.error("Unable to retrieve ckan utils", e); + logger.error("Unable to retrieve ckan utils in scope " + scopeInWhichDiscover, e); } return instance; } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java index 42a8872..e0506b6 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java @@ -241,9 +241,6 @@ public class Utils { logger.debug("Organization name is " + organizationName); - // if(organizationName.equals(CKanUtilsImpl.PRODUCTION_CKAN_ORGNAME_ROOT)) - // return CKanUtilsImpl.PRODUCTION_SCOPE_ROOT; - GroupManager gm = new LiferayGroupManager(); List groups = gm.listGroups(); for (GCubeGroup gCubeGroup : groups) { diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java index 10c75e7..1e7b997 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java @@ -101,20 +101,21 @@ public class WorkspaceUtils { Workspace ws = HomeLibrary .getHomeManagerFactory() .getHomeManager() - .getHome(userName).getWorkspace(); + .getHome().getWorkspace(); WorkspaceItem originalFolder = ws.getItem(folderId); // set some info - String onlyAlphanumeric = originalFolder.getName().replaceAll("[^A-Za-z0-9.-_]", " "); // that is, remove characters different than the ones inside - bean.setTitle(onlyAlphanumeric); + String onlyAlphanumericTitle = originalFolder.getName().replaceAll("[^A-Za-z0-9.-_]", " "); // that is, remove characters different than the ones inside + // since it will (likely) be the name of the product + bean.setTitle(onlyAlphanumericTitle); bean.setDescription(originalFolder.getDescription()); // Create the folder in the catalogue Map folderItems = Utils.getGcubeItemProperties(originalFolder); bean.setCustomFields(folderItems); - // check the resources within the folder (skip subdirectories for now TODO) + // check the resources within the folder List childrenIds = new ArrayList(); for (WorkspaceItem file : originalFolder.getChildren()) { diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java index bcadd2f..906cab2 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceBeanWrapper.java @@ -17,12 +17,14 @@ public class ResourceBeanWrapper implements Serializable{ private boolean toBeAdded; private String mimeType; private String organizationNameDatasetParent; // the organization name in which the parent dataset was created - private List subResources; // a list of sub resources TODO - + private List subResources; // a list of sub resources + private ResourceBeanWrapper parentResource; + private boolean isFolder; + public ResourceBeanWrapper(){ super(); } - + /** * @param url * @param name @@ -30,9 +32,16 @@ public class ResourceBeanWrapper implements Serializable{ * @param id * @param toBeAdded * @param mimeType + * @param organizationNameDatasetParent + * @param subResources + * @param parentResource + * @param isFolder */ public ResourceBeanWrapper(String url, String name, String description, - String id, boolean toBeAdded, String mimeType, String organizationNameDatasetParent) { + String id, boolean toBeAdded, String mimeType, + String organizationNameDatasetParent, + List subResources, + ResourceBeanWrapper parentResource, boolean isFolder) { super(); this.url = url; this.name = name; @@ -41,6 +50,31 @@ public class ResourceBeanWrapper implements Serializable{ this.toBeAdded = toBeAdded; this.mimeType = mimeType; this.organizationNameDatasetParent = organizationNameDatasetParent; + this.subResources = subResources; + this.parentResource = parentResource; + this.isFolder = isFolder; + } + + /** + * Used when the user adds the resources after having created the product + * @param url + * @param name + * @param description + * @param id + * @param toAdd + * @param mimeType + * @param datasetOrg + */ + public ResourceBeanWrapper(String url, String name, String description, + String id, boolean toAdd, String mimeType, String datasetOrg) { + super(); + this.id = id; + this.url = url; + this.name = name; + this.description = description; + this.toBeAdded = toAdd; + this.mimeType = mimeType; + this.organizationNameDatasetParent = datasetOrg; } /** @@ -84,7 +118,7 @@ public class ResourceBeanWrapper implements Serializable{ public void setDescription(String description) { this.description = description; } - + /** * @return the id */ @@ -126,7 +160,7 @@ public class ResourceBeanWrapper implements Serializable{ public void setMimeType(String mimeType) { this.mimeType = mimeType; } - + /** * @return the organizationNameDatasetParent */ @@ -141,8 +175,7 @@ public class ResourceBeanWrapper implements Serializable{ String organizationNameDatasetParent) { this.organizationNameDatasetParent = organizationNameDatasetParent; } - - + public List getSubResources() { return subResources; } @@ -151,6 +184,22 @@ public class ResourceBeanWrapper implements Serializable{ this.subResources = subResources; } + public ResourceBeanWrapper getParentResource() { + return parentResource; + } + + public void setParentResource(ResourceBeanWrapper parentResource) { + this.parentResource = parentResource; + } + + public boolean isFolder() { + return isFolder; + } + + public void setFolder(boolean isFolder) { + this.isFolder = isFolder; + } + @Override public String toString() { return "ResourceBeanWrapper [url=" + url + ", name=" + name @@ -158,6 +207,7 @@ public class ResourceBeanWrapper implements Serializable{ + ", toBeAdded=" + toBeAdded + ", mimeType=" + mimeType + ", organizationNameDatasetParent=" + organizationNameDatasetParent + ", subResources=" - + subResources + "]"; + + subResources + ", parentResource=" + parentResource + + ", isFolder=" + isFolder + "]"; } }