2099: Workspace Explorer enhancements: create a new folder

Task-Url: https://support.d4science.org/issues/2099

Added event Create Folder
Added method Create Folder

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-explorer@122679 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2016-02-01 15:03:11 +00:00
parent 60f0fbc2b9
commit 7edd7191ff
9 changed files with 218 additions and 74 deletions

View File

@ -1,5 +1,5 @@
/**
*
*
*/
package org.gcube.portlets.widgets.wsexplorer.client;
@ -9,6 +9,8 @@ import org.gcube.portlets.widgets.wsexplorer.client.event.BreadcrumbClickEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.BreadcrumbClickEventHandler;
import org.gcube.portlets.widgets.wsexplorer.client.event.ClickItemEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.ClickItemEventHandler;
import org.gcube.portlets.widgets.wsexplorer.client.event.CreateFolderClickEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.CreateFolderClickEventHandler;
import org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEventHandler;
import org.gcube.portlets.widgets.wsexplorer.client.event.LoadMySpecialFolderEvent;
@ -46,16 +48,16 @@ import com.google.gwt.user.client.ui.Label;
* Jun 25, 2015
*/
public class WorkspaceExplorerController implements EventHandler {
public final static HandlerManager eventBus = new HandlerManager(null);
private WorkspaceExplorerPanel workspaceExplorerPanel;
private WorkspaceExplorer wsExplorer;
private Breadcrumbs breadcrumbs = new Breadcrumbs(eventBus);
private Navigation navigation = new Navigation(eventBus);
/**
* Instantiates a new workspace explorer controller.
*
*
* As default all items are showable and selectable
* @param heightPanel the height panel
*/
@ -65,13 +67,13 @@ public class WorkspaceExplorerController implements EventHandler {
wsExplorer = new WorkspaceExplorer(eventBus, ItemType.values(), ItemType.values());
workspaceExplorerPanel = new WorkspaceExplorerPanel(5, wsExplorer.getPanel(), breadcrumbs, navigation, heightPanel);
}
/**
* Instantiates a new workspace explorer controller.
*
*
* As default all items are showable and selectable
*
*
* @param filterCriteria the filter criteria
* @param heightPanel the height panel
*/
@ -86,12 +88,12 @@ public class WorkspaceExplorerController implements EventHandler {
* Bind events.
*/
private void bindEvents() {
eventBus.addHandler(LoadFolderEvent.TYPE, new LoadFolderEventHandler() {
@Override
public void onLoadFolder(LoadFolderEvent loadFolderEvent) {
if(loadFolderEvent.getTargetItem()!=null && loadFolderEvent.getTargetItem().isFolder()){
try {
wsExplorer.loadFolder(loadFolderEvent.getTargetItem());
@ -103,36 +105,36 @@ public class WorkspaceExplorerController implements EventHandler {
}
}
});
eventBus.addHandler(RootLoadedEvent.TYPE, new RootLoadedEventHandler() {
@Override
public void onRootLoaded(RootLoadedEvent rootLoadedEvent) {
}
});
eventBus.addHandler(BreadcrumbClickEvent.TYPE, new BreadcrumbClickEventHandler() {
@Override
public void onBreadcrumbClick(BreadcrumbClickEvent breadcrumbClickEvent) {
WorkspaceExplorerController.eventBus.fireEvent(new LoadFolderEvent(breadcrumbClickEvent.getTargetItem()));
}
});
eventBus.addHandler(LoadRootEvent.TYPE, new LoadRootEventHandler() {
@Override
public void onLoadRoot(LoadRootEvent loadRootEvent) {
wsExplorer.loadRoot();
WorkspaceExplorerConstants.workspaceNavigatorService.getItemByCategory(ItemCategory.HOME, new AsyncCallback<Item>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
breadcrumbs.clear();
}
@Override
@ -144,22 +146,22 @@ public class WorkspaceExplorerController implements EventHandler {
});
}
});
eventBus.addHandler(ClickItemEvent.TYPE, new ClickItemEventHandler() {
@Override
public void onClick(final ClickItemEvent clickItemEvent) {
Item item = clickItemEvent.getItem();
if(item!=null){
updateMoreInfo(item);
}
}
});
eventBus.addHandler(LoadMySpecialFolderEvent.TYPE, new LoadMySpecialFolderEventHandler() {
@Override
public void onLoadMySpecialFolder(LoadMySpecialFolderEvent loadMySpecialFolderEvent) {
wsExplorer.loadMySpecialFolder();
@ -179,6 +181,15 @@ public class WorkspaceExplorerController implements EventHandler {
});
}
});
eventBus.addHandler(CreateFolderClickEvent.TYPE, new CreateFolderClickEventHandler() {
@Override
public void onClick(CreateFolderClickEvent createFolderClickEvent) {
// TODO Auto-generated method stub
}
});
}
/**
@ -208,26 +219,26 @@ public class WorkspaceExplorerController implements EventHandler {
}
});
}
/**
* Clear more info.
*/
private void clearMoreInfo(){
workspaceExplorerPanel.getSouthPanel().clear();
}
/**
* Update more info.
*
* @param item the item
*/
private void updateMoreInfo(Item item){
if(item!=null){
workspaceExplorerPanel.getSouthPanel().clear();
Alert alert = new Alert();
alert.addStyleName("alert-custom");
final HorizontalPanel hp = new HorizontalPanel();
Image iconInfo = WorkspaceExplorerResources.getIconInfo().createImage();
iconInfo.getElement().getStyle().setVerticalAlign(VerticalAlign.MIDDLE);
@ -258,7 +269,7 @@ public class WorkspaceExplorerController implements EventHandler {
labelSize.setText("Size: " +result);
}
});
if(!item.isFolder()){
WorkspaceExplorerConstants.workspaceNavigatorService.getMimeType(item.getId(), new AsyncCallback<String>() {
@ -273,7 +284,7 @@ public class WorkspaceExplorerController implements EventHandler {
}
});
}
WorkspaceExplorerConstants.workspaceNavigatorService.getUserACLForFolderId(item.getId(), new AsyncCallback<String>() {
@Override
@ -290,7 +301,7 @@ public class WorkspaceExplorerController implements EventHandler {
alert.setClose(false);
workspaceExplorerPanel.getSouthPanel().add(alert); }
}
/**
* Gets the breadcrumbs.
*
@ -326,7 +337,7 @@ public class WorkspaceExplorerController implements EventHandler {
public void setSelectableTypes(ItemType[] selectableTypes) {
wsExplorer.setSelectableTypes(selectableTypes);
}
/**
* Gets the selectable types.
*
@ -365,7 +376,7 @@ public class WorkspaceExplorerController implements EventHandler {
GWT.log("item: "+item);
if (item!=null){
boolean selectable = wsExplorer.getSelectableTypes().contains(item.getType());
return (selectable)?true:false;
return selectable?true:false;
}
return false;
}

View File

@ -1,5 +1,5 @@
/**
*
*
*/
package org.gcube.portlets.widgets.wsexplorer.client;
@ -15,11 +15,11 @@ import com.google.gwt.user.client.ui.ScrollPanel;
* Jun 23, 2015
*/
public class WorkspaceExplorerPanel extends DockPanel{
public int width = 550;
// public int height = 400;
public int west_width = 150;
private ScrollPanel westPanel = new ScrollPanel();
private ScrollPanel centerScrollable = new ScrollPanel();
private ScrollPanel southPanel = new ScrollPanel();
@ -34,12 +34,12 @@ public class WorkspaceExplorerPanel extends DockPanel{
*/
public WorkspaceExplorerPanel(int splitterSize, ScrollPanel wsExplorer, Composite breadcrumbs, Composite navigation, String height) {
ensureDebugId("WorkspaceNavigatorPanel");
add(breadcrumbs, DockPanel.NORTH);
southPanel.ensureDebugId("SouthPanelWEP");
// southPanel.ensureDebugId("SouthPanelWEP");
add(southPanel, DockPanel.SOUTH);
westPanel.setWidth(west_width+"px");
westPanel.add(navigation);
add(westPanel, DockPanel.WEST);
@ -73,7 +73,4 @@ public class WorkspaceExplorerPanel extends DockPanel{
public ScrollPanel getCenterScrollable() {
return centerScrollable;
}
}
}

View File

@ -0,0 +1,36 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import com.google.gwt.event.shared.GwtEvent;
/**
* The Class CreateFolderClickEvent.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Feb 1, 2016
*/
public class CreateFolderClickEvent extends GwtEvent<CreateFolderClickEventHandler> {
public static Type<CreateFolderClickEventHandler> TYPE = new Type<CreateFolderClickEventHandler>();
/**
* Instantiates a new click item event.
*/
public CreateFolderClickEvent() {
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#getAssociatedType()
*/
@Override
public Type<CreateFolderClickEventHandler> getAssociatedType() {
return TYPE;
}
/* (non-Javadoc)
* @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler)
*/
@Override
protected void dispatch(CreateFolderClickEventHandler handler) {
handler.onClick(this);
}
}

View File

@ -0,0 +1,20 @@
package org.gcube.portlets.widgets.wsexplorer.client.event;
import com.google.gwt.event.shared.EventHandler;
/**
* The Interface ClickItemEventHandler.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jul 6, 2015
*/
public interface CreateFolderClickEventHandler extends EventHandler {
/**
* On click.
*
* @param createFolderClickEvent the more info show event
*/
void onClick(CreateFolderClickEvent createFolderClickEvent);
}

View File

@ -115,8 +115,8 @@ public interface WorkspaceExplorerService extends RemoteService {
* @throws Exception the exception
*/
String getUserACLForFolderId(String folderId) throws Exception;
/**
* Gets the readable size by item id.
*
@ -136,4 +136,18 @@ public interface WorkspaceExplorerService extends RemoteService {
List<Item> getBreadcrumbsByItemIdentifierToParentLimit(
String itemIdentifier, String parentLimit,
boolean includeItemAsParent) throws Exception;
/**
* @param nameFolder
* @param description
* @param parentId
* @param showableTypes
* @param filterCriteria
* @return
* @throws Exception
*/
Item createFolder(
String nameFolder, String description, String parentId,
List<ItemType> showableTypes, FilterCriteria filterCriteria)
throws Exception;
}

View File

@ -1,5 +1,5 @@
/**
*
*
*/
package org.gcube.portlets.widgets.wsexplorer.client.rpc;
@ -66,7 +66,7 @@ public interface WorkspaceExplorerServiceAsync {
boolean purgeEmpyFolders, FilterCriteria filterCriteria,
AsyncCallback<Item> callback);
/**
* Gets the breadcrumbs by item identifier.
*
@ -88,7 +88,7 @@ public interface WorkspaceExplorerServiceAsync {
* @return the my special folder
*/
public void getMySpecialFolder(List<ItemType> showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria, AsyncCallback<Item> asyncCallback);
/**
* Gets the item by category.
*
@ -106,7 +106,7 @@ public interface WorkspaceExplorerServiceAsync {
* @return the size by item id
*/
public void getSizeByItemId(String id, AsyncCallback<Long> asyncCallback);
/**
* Gets the readable size by item id.
@ -140,4 +140,9 @@ public interface WorkspaceExplorerServiceAsync {
String parentLimit, boolean includeItemAsParent,
AsyncCallback<List<Item>> callback);
void createFolder(
String nameFolder, String description, String parentId,
List<ItemType> showableTypes, FilterCriteria filterCriteria,
AsyncCallback<Item> callback);
}

View File

@ -1,9 +1,10 @@
/**
*
*
*/
package org.gcube.portlets.widgets.wsexplorer.client.view;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants;
import org.gcube.portlets.widgets.wsexplorer.client.event.CreateFolderClickEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.LoadMySpecialFolderEvent;
import org.gcube.portlets.widgets.wsexplorer.client.event.LoadRootEvent;
import org.gcube.portlets.widgets.wsexplorer.client.resources.WorkspaceExplorerResources;
@ -20,23 +21,30 @@ import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
/**
*
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jun 24, 2015
*/
public class Navigation extends Composite{
private static NavigationUiBinder uiBinder = GWT.create(NavigationUiBinder.class);
@UiField
FlowPanel navigation;
@UiField
NavWidget home;
@UiField
NavWidget vre_folder;
@UiField
NavWidget new_folder;
private HandlerManager eventBus;
/**
@ -47,67 +55,78 @@ public class Navigation extends Composite{
*/
interface NavigationUiBinder extends UiBinder<Widget, Navigation> {
}
/**
* @param eventbus
*
* @param eventbus
*
*/
public Navigation(HandlerManager eventBus) {
initWidget(uiBinder.createAndBindUi(this));
this.eventBus = eventBus;
getElement().getStyle().setMarginLeft(5.0, Unit.PX);
home.setActive(true);
WorkspaceExplorerConstants.workspaceNavigatorService.getItemByCategory(ItemCategory.HOME, new AsyncCallback<Item>() {
@Override
public void onSuccess(Item result) {
home.setText(result.getName());
}
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
home.setText(WorkspaceExplorerConstants.HOME_LABEL);
}
});
home.setBaseIcon(WorkspaceExplorerResources.CustomIconType.home);
home.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Navigation.this.eventBus.fireEvent(new LoadRootEvent());
}
});
vre_folder.setActive(true);
vre_folder.setBaseIcon(WorkspaceExplorerResources.CustomIconType.vre_folder);
WorkspaceExplorerConstants.workspaceNavigatorService.getItemByCategory(ItemCategory.VRE_FOLDER, new AsyncCallback<Item>() {
@Override
public void onSuccess(Item result) {
vre_folder.setText(result.getName());
}
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
vre_folder.setText(WorkspaceExplorerConstants.VRE_FOLDERS_LABEL);
}
});
vre_folder.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Navigation.this.eventBus.fireEvent(new LoadMySpecialFolderEvent());
}
});
new_folder.setActive(true);
new_folder.setBaseIcon(WorkspaceExplorerResources.CustomIconType.new_folder);
new_folder.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Navigation.this.eventBus.fireEvent(new CreateFolderClickEvent());
}
});
}
}

View File

@ -6,5 +6,7 @@
</b:NavWidget>
<b:NavWidget ui:field="vre_folder">
</b:NavWidget>
<b:NavWidget ui:field="new_folder" text="New Folder">
</b:NavWidget>
</g:FlowPanel>
</ui:UiBinder>

View File

@ -18,6 +18,8 @@ import org.gcube.common.homelibrary.home.workspace.Workspace;
import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder;
import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException;
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException;
import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException;
import org.gcube.common.homelibrary.home.workspace.folder.FolderItem;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants;
@ -596,4 +598,42 @@ public class WorkspaceExplorerServiceImpl extends RemoteServiceServlet implement
throw new Exception(e.getMessage());
}
}
@Override
public Item createFolder(String nameFolder, String description, String parentId, List<ItemType> showableTypes,FilterCriteria filterCriteria) throws Exception {
_log.trace("creating folder: "+nameFolder +" parent is null?"+parentId);
try {
if(parentId==null || parentId.isEmpty())
throw new Exception("Parent id is null or empty");
if(nameFolder == null)
nameFolder = "Empty Folder";
Workspace workspace = getWorkspace();
WorkspaceFolder wsFolder = workspace.createFolder(nameFolder, description, parentId);
Item itemFolder = null;
if(wsFolder!=null){
itemFolder = ItemBuilder.getItem(null, wsFolder, showableTypes, filterCriteria, false);
}
return itemFolder;
} catch(InsufficientPrivilegesException e){
String error = "Insufficient Privileges to create the folder";
_log.error(error, e);
throw new Exception(error);
} catch (ItemAlreadyExistException e) {
String error = "An error occurred on creating folder, " +e.getMessage();
_log.error(error, e);
throw new Exception(error);
} catch (Exception e) {
String error = "An error occurred on the sever during creating folder. Try again";
_log.error(error, e);
throw new Exception(error);
}
}
}