From a65f6c45ae283d0c46b0bfed2ad5ce0f6d94575f Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Mon, 19 Sep 2016 13:24:53 +0000 Subject: [PATCH] Managed Error cases git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/workspace-explorer-app@131489 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/WorkspaceExplorerApp.java | 50 ++++++++++++---- .../WorkspaceExplorerAppController.java | 56 +++++++++++------- .../client/WorkspaceExplorerAppMainPanel.java | 22 ++++++- .../client/WorkspaceExplorerAppPanel.java | 12 ++-- .../WorkspaceResourcesExplorerPanel.java | 11 +--- .../resources/WorkspaceExplorerResources.java | 19 ++++++ .../client/resources/e-unhappy.png | Bin 0 -> 860 bytes .../client/resources/warning.png | Bin 0 -> 3309 bytes 8 files changed, 115 insertions(+), 55 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/e-unhappy.png create mode 100644 src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/warning.png diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java index 549f5ad..fbd3b6b 100644 --- a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java @@ -7,12 +7,14 @@ package org.gcube.portlets.user.workspaceexplorerapp.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NodeList; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.Widget; /** * The Class WorkspaceExplorerApp. @@ -31,9 +33,9 @@ public class WorkspaceExplorerApp implements EntryPoint { public void onModuleLoad() { - boolean jQueryLoaded = isjQueryLoaded(); + /*boolean jQueryLoaded = isjQueryLoaded(); // GWT.log("Injected : "+Resources.RESOURCES.jquery().getText()); - GWT.log("jQueryLoaded: "+jQueryLoaded); + GWT.log("jQueryLoaded: "+jQueryLoaded);*/ /*if (!jQueryLoaded) { ScriptInjector.fromString(Resources.RESOURCES.jquery().getText()) @@ -46,6 +48,7 @@ public class WorkspaceExplorerApp implements EntryPoint { .inject();*/ appController = new WorkspaceExplorerAppController(); + mainPanel = new WorkspaceExplorerAppMainPanel(appController.getEventBus(), appController.getDisplayFields()); appController.go(this); Window.addResizeHandler(new ResizeHandler() { @@ -55,7 +58,6 @@ public class WorkspaceExplorerApp implements EntryPoint { } }); - mainPanel = new WorkspaceExplorerAppMainPanel(appController.getEventBus(), appController.getDisplayFields()); RootPanel.get(WorkspaceExplorerAppConstants.APPLICATION_DIV).add(mainPanel); // WorkspaceExplorerFoooterPanel footerPanel = new WorkspaceExplorerFoooterPanel(); @@ -82,20 +84,32 @@ public class WorkspaceExplorerApp implements EntryPoint { GWT.log("headerH " + headerH); int footerH = DOM.getElementById("footer_we").getClientHeight(); GWT.log("footerH " + footerH); - int breadcrumbsH = DOM.getElementById("breadcrumbs_we").getClientHeight(); - GWT.log("breadcrumbs_we " + breadcrumbsH); + + com.google.gwt.user.client.Element eBread = DOM.getElementById("breadcrumbs_we"); + int breadcrumbsH = 0; + if(eBread!=null){ + breadcrumbsH = eBread.getClientHeight(); + GWT.log("breadcrumbs_we " + breadcrumbsH); + } + int windowHeight = Window.getClientHeight(); GWT.log("rootHeight " + windowHeight); int diff = windowHeight - (headerH+footerH+breadcrumbsH)-10; int containerH = diff>0?diff:50; - DOM.getElementById(WorkspaceExplorerAppConstants.APPLICATION_DIV).getElementsByTagName("main").getItem(0).getStyle().setHeight(containerH, Unit.PX); -// DOM.getElementById(WorkspaceExplorerAppConstants.APPLICATION_DIV).getStyle().setHeight(containerH, Unit.PX); - GWT.log("containerH " + containerH); + NodeList listE = DOM.getElementById(WorkspaceExplorerAppConstants.APPLICATION_DIV).getElementsByTagName("main"); + + if(listE!=null && listE.getLength()>0){ + Element el = listE.getItem(0); + el.getStyle().setHeight(containerH, Unit.PX); + // DOM.getElementById(WorkspaceExplorerAppConstants.APPLICATION_DIV).getStyle().setHeight(containerH, Unit.PX); + GWT.log("containerH " + containerH); + + Element table = DOM.getElementById("data_grid_explorer"); + if(table!=null){ + int headerTableH = 0; + table.getStyle().setHeight(containerH-headerTableH, Unit.PX); + } - Element table = DOM.getElementById("data_grid_explorer"); - if(table!=null){ - int headerTableH = 0; - table.getStyle().setHeight(containerH-headerTableH, Unit.PX); } } @@ -106,6 +120,16 @@ public class WorkspaceExplorerApp implements EntryPoint { * @param workspaceExplorerAppPanel the workspace explorer app panel */ public void updateExplorerPanel(WorkspaceExplorerAppPanel workspaceExplorerAppPanel){ - mainPanel.updateMainPanel(workspaceExplorerAppPanel); + mainPanel.updateToExplorerPanel(workspaceExplorerAppPanel); + } + + + /** + * Update to error. + * + * @param widget the widget + */ + public void updateToError(Widget widget){ + mainPanel.updateToError(widget); } } diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java index ff69980..fe1f00a 100644 --- a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java @@ -4,12 +4,13 @@ package org.gcube.portlets.user.workspaceexplorerapp.client; -import gwt.material.design.client.ui.MaterialToast; - import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; +import org.gcube.portlets.user.workspaceexplorerapp.client.resources.WorkspaceExplorerResources; import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import com.github.gwtbootstrap.client.ui.Alert; +import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ContextMenuEvent; @@ -17,6 +18,7 @@ import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.RootPanel; /** @@ -27,9 +29,7 @@ import com.google.gwt.user.client.ui.RootPanel; */ public class WorkspaceExplorerAppController { -// private VerticalPanel mainPanel = new VerticalPanel(); - - private WorkspaceExplorerAppPanel mainPanel; + private WorkspaceExplorerAppPanel workspaceERP; private WorkspaceResourcesExplorerPanel wsResourcesExplorerPanel; private final HandlerManager eventBus = new HandlerManager(null); private WorkspaceExplorerApp app; @@ -56,8 +56,10 @@ public class WorkspaceExplorerAppController { //TODO CHECK FOLDER ID if(folderId==null){ - Window.alert("Folder Id not found, It is not possible to retrieve a folder without a valid id"); - //return; + String msg = "Folder Id not found, It is not possible to retrieve a folder without a valid id"; +// Window.alert("Folder Id not found, It is not possible to retrieve a folder without a valid id"); + showErrorPanel(msg); + return; } RootPanel.get().addDomHandler(new ContextMenuHandler() { @@ -69,7 +71,6 @@ public class WorkspaceExplorerAppController { } }, ContextMenuEvent.getType()); - MaterialToast.fireToast("Checking permissions..."); WorkspaceExplorerAppConstants.workspaceNavigatorService.getFolderIdFromEncrypted(folderId, new AsyncCallback() { @Override @@ -80,13 +81,15 @@ public class WorkspaceExplorerAppController { initWorkspaceExplorer(folderId); } catch (Exception e) { - Window.alert("Folder Id not valid. An occurred when converting folder id"); +// Window.alert("Folder Id not valid. An occurred when converting folder id"); + showErrorPanel("Folder Id not valid. An occurred when converting folder id"); } } @Override public void onFailure(Throwable caught) { - Window.alert(caught.getMessage()); +// Window.alert(caught.getMessage()); + showErrorPanel(caught.getMessage()); } }); } @@ -96,6 +99,23 @@ public class WorkspaceExplorerAppController { } + + /** + * Show error panel. + * + * @param message the message + */ + private void showErrorPanel(String message){ + Image error = new Image(WorkspaceExplorerResources.INSTANCE.eUnhappy().getSafeUri()); + error.getElement().getStyle().setPaddingLeft(5, Unit.PX); + Alert alert = new Alert(); + alert.setType(AlertType.ERROR); + alert.add(error); + alert.setClose(false); + alert.setHeading(message); + app.updateToError(alert); + } + /** * Inits the workspace explorer. * @@ -146,21 +166,11 @@ public class WorkspaceExplorerAppController { } }.schedule(1000);*/ - mainPanel = new WorkspaceExplorerAppPanel(wsResourcesExplorerPanel); - app.updateExplorerPanel(mainPanel); + workspaceERP = new WorkspaceExplorerAppPanel(wsResourcesExplorerPanel); + app.updateExplorerPanel(workspaceERP); } -// /** -// * Gets the main panel. -// * -// * @return the mainPanel -// */ -// public WorkspaceExplorerAppPanel getMainPanel() { -// return mainPanel; -// } - - /** * Gets the event bus. * @@ -176,6 +186,6 @@ public class WorkspaceExplorerAppController { * @return the display fields */ public DisplayField[] getDisplayFields(){ - return new DisplayField[]{DisplayField.ICON, DisplayField.NAME, DisplayField.OWNER, DisplayField.CREATION_DATE}; + return WorkspaceResourcesExplorerPanel.displayFields; } } diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java index de656cb..e459341 100644 --- a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java @@ -84,8 +84,8 @@ public class WorkspaceExplorerAppMainPanel extends Composite { * Note that depending on the widget that is used, it may be necessary to * implement HasHTML instead of HasText. * - * @param workspaceExplorerAppPanel the workspace explorer app panel * @param handlerManager the handler manager + * @param displayFields the display fields */ public WorkspaceExplorerAppMainPanel(HandlerManager handlerManager, DisplayField[] displayFields) { initWidget(uiBinder.createAndBindUi(this)); @@ -153,9 +153,27 @@ public class WorkspaceExplorerAppMainPanel extends Composite { }); } - public void updateMainPanel(WorkspaceExplorerAppPanel workspaceExplorerAppPanel){ + /** + * Update to explorer panel. + * + * @param workspaceExplorerAppPanel the workspace explorer app panel + */ + public void updateToExplorerPanel(WorkspaceExplorerAppPanel workspaceExplorerAppPanel){ explorer_main_container.clear(); explorer_main_container.add(workspaceExplorerAppPanel); } + + + /** + * Update to error. + * + * @param error the error + */ + public void updateToError(Widget error){ + explorer_main_container.clear(); + explorer_main_container.add(error); + } + + } diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java index 5cd85cf..315fab7 100644 --- a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java @@ -8,10 +8,10 @@ import com.google.gwt.user.client.ui.Widget; /** - * The Class SplitPanel. + * The Class WorkspaceExplorerAppPanel. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Jun 23, 2015 + * Sep 19, 2016 */ public class WorkspaceExplorerAppPanel extends SimplePanel{ @@ -19,15 +19,13 @@ public class WorkspaceExplorerAppPanel extends SimplePanel{ /** * Instantiates a new workspace explorer app panel. * - * @param splitterSize the splitter size - * @param navigation the navigation - * @param wsExplorer the ws explorer + * @param aPanel the a panel */ - public WorkspaceExplorerAppPanel(Widget wsExplorerPanel) { + public WorkspaceExplorerAppPanel(Widget aPanel) { ensureDebugId("WorkspaceExplorerAppPanel"); this.getElement().setId("WorkspaceExplorerAppPanel"); this.getElement().setAttribute("id","WorkspaceExplorerAppPanel"); setWidth("100%"); - add(wsExplorerPanel); + add(aPanel); } } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java index 0dc23b1..47785f6 100644 --- a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java @@ -64,7 +64,7 @@ public class WorkspaceResourcesExplorerPanel extends DockPanel implements HasWor // private ScrollPanel southPanel = new ScrollPanel(); private String folderId; private String folderName; - private DisplayField[] displayFields = new DisplayField[]{DisplayField.ICON, DisplayField.NAME, DisplayField.OWNER, DisplayField.CREATION_DATE}; + public static final DisplayField[] displayFields = new DisplayField[]{DisplayField.ICON, DisplayField.NAME, DisplayField.OWNER, DisplayField.CREATION_DATE}; /** * Instantiates a new workspace folder explorer select panel. @@ -102,15 +102,6 @@ public class WorkspaceResourcesExplorerPanel extends DockPanel implements HasWor initPanel(""); } - - /** - * @return the displayFields - */ - public DisplayField[] getDisplayFields() { - - return displayFields; - } - /** * Instantiates a new workspace explorer select panel. * diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java index ce1207b..eddce70 100644 --- a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java @@ -33,4 +33,23 @@ public interface WorkspaceExplorerResources extends ClientBundle { @Source("_32/groups_folder.png") ImageResource shared_folder(); + + /** + * Warning. + * + * @return the image resource + */ + @Source("warning.png") + ImageResource warning(); + + + + /** + * E unhappy. + * + * @return the image resource + */ + @Source("e-unhappy.png") + ImageResource eUnhappy(); + } diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/e-unhappy.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/e-unhappy.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2dfa9e6e7d518f09e145b9aa7c5d306463001e GIT binary patch literal 860 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 rzs_F35mc~R?*)KU017yo>c0m7