From b9370463b05bf77a31abd648d762970d2a9dfc06 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Mon, 13 Jul 2020 15:35:02 +0200 Subject: [PATCH] working on #19600 --- CHANGELOG.md | 4 +- .../client/AppControllerExplorer.java | 16 +- .../workspace/client/event/GetInfoEvent.java | 9 +- .../client/interfaces/EventsTypeEnum.java | 1 + .../interfaces/SubscriberInterface.java | 11 + .../view/windows/DialogEditProperties.java | 20 +- .../view/windows/DialogGetInfoBootstrap.java | 208 ++++++++++++++---- .../windows/DialogGetInfoBootstrap.ui.xml | 51 +++++ .../user/workspace/public/workspacetree.css | 24 +- 9 files changed, 285 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da49ff7..dcaf38c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [v6.31.0] [r4.25.0] - 2020-07-08 -#### Fixes +#### Enhancements -[Task #19544] update the unsharing messages in the accounting history +[#19600] revisit the "Get Info" Dialog in a modern view ## [v6.30.1] [r4.24.0] - 2020-06-25 diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java index 7993b0b..377975f 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java @@ -118,7 +118,6 @@ import org.gcube.portlets.user.workspace.client.view.tree.AsyncTreePanel; import org.gcube.portlets.user.workspace.client.view.windows.DialogAddFolderAndSmart; import org.gcube.portlets.user.workspace.client.view.windows.DialogAddFolderAndSmart.AddType; import org.gcube.portlets.user.workspace.client.view.windows.DialogAddUrl; -import org.gcube.portlets.user.workspace.client.view.windows.DialogGetInfoBootstrap; import org.gcube.portlets.user.workspace.client.view.windows.DialogGetLink; import org.gcube.portlets.user.workspace.client.view.windows.DialogGetLink.Link_Type; import org.gcube.portlets.user.workspace.client.view.windows.DialogShareLink; @@ -171,14 +170,10 @@ import com.extjs.gxt.ui.client.event.MessageBoxEvent; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.Info; import com.extjs.gxt.ui.client.widget.MessageBox; -import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.Modal; -import com.github.gwtbootstrap.client.ui.ModalFooter; import com.github.gwtbootstrap.client.ui.event.HideEvent; import com.github.gwtbootstrap.client.ui.event.HideHandler; 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.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.http.client.RequestBuilder; @@ -696,10 +691,10 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt public void onGetInfo(GetInfoEvent getInfoEvent) { //new DialogGetInfo(getInfoEvent.getSourceFile()); - FileModel fileItem = getInfoEvent.getSourceFile(); + final FileModel fileItem = getInfoEvent.getSourceFile(); if(fileItem!=null) { - final Modal modal = new Modal(true); + /*final Modal modal = new Modal(true); modal.setCloseVisible(true); modal.setTitle(fileItem.getName() + " - Details"); modal.setMaxHeigth("800px"); @@ -719,7 +714,9 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt DialogGetInfoBootstrap dlg = new DialogGetInfoBootstrap(fileItem); modal.add(dlg); modal.add(modalFooter); - modal.show(); + modal.show();*/ + + notifySubscriber(new GetInfoEvent(fileItem)); } } }); @@ -2131,6 +2128,9 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt } else if (event instanceof LoadFolderEvent) { LoadFolderEvent loadFolderEvent = (LoadFolderEvent) event; sub.loadFolder(loadFolderEvent.getTargetFolder()); + } else if (event instanceof GetInfoEvent) { + GetInfoEvent getInfoEvent = (GetInfoEvent) event; + sub.showDetails(getInfoEvent.getSourceFile()); } } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/GetInfoEvent.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/GetInfoEvent.java index 77da379..7e2697e 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/event/GetInfoEvent.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/GetInfoEvent.java @@ -1,5 +1,7 @@ package org.gcube.portlets.user.workspace.client.event; +import org.gcube.portlets.user.workspace.client.interfaces.EventsTypeEnum; +import org.gcube.portlets.user.workspace.client.interfaces.GuiEventInterface; import org.gcube.portlets.user.workspace.client.model.FileModel; import com.google.gwt.event.shared.GwtEvent; @@ -9,7 +11,7 @@ import com.google.gwt.event.shared.GwtEvent; * @author Francesco Mangiacrapa francesco.mangiacrapa{@literal @}isti.cnr.it * */ -public class GetInfoEvent extends GwtEvent { +public class GetInfoEvent extends GwtEvent implements GuiEventInterface{ public static Type TYPE = new Type(); private FileModel targetFile = null; @@ -32,4 +34,9 @@ public class GetInfoEvent extends GwtEvent { public FileModel getSourceFile() { return targetFile; } + + @Override + public EventsTypeEnum getKey() { + return EventsTypeEnum.GET_DETAILS_FOR_ITEM; + } } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/EventsTypeEnum.java b/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/EventsTypeEnum.java index 10b8892..af1ec47 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/EventsTypeEnum.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/EventsTypeEnum.java @@ -35,5 +35,6 @@ public enum EventsTypeEnum UPDATE_WORKSPACE_SIZE, ADD_ADMINISTRATOR_EVENT, FILE_VERSIONING_HISTORY_EVENT, + GET_DETAILS_FOR_ITEM, LOAD_FOLDER_EVENT; } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java b/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java index 7e50191..414e660 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java @@ -10,6 +10,7 @@ import org.gcube.portlets.user.workspace.client.model.FolderModel; import org.gcube.portlets.user.workspace.shared.WorkspaceTrashOperation; +// TODO: Auto-generated Javadoc // Implements this interface to receive events by tree async /** * The Interface SubscriberInterface. @@ -196,5 +197,15 @@ public interface SubscriberInterface { * @param folderTarget the folder target */ void loadFolder(FileModel folderTarget); + + + + /** + * Show details. + * + * @param fileModel the file model + */ + void showDetails(FileModel fileModel); + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogEditProperties.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogEditProperties.java index 1b4e7c4..f880474 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogEditProperties.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogEditProperties.java @@ -19,6 +19,7 @@ import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.form.TextField; import com.extjs.gxt.ui.client.widget.layout.FormLayout; +import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -30,8 +31,8 @@ import com.google.gwt.user.client.rpc.AsyncCallback; public class DialogEditProperties extends Dialog { private FileModel item; - private int widthDialog = 450; - private int heigthDialog = 300; + private int widthDialog = 800; + private int heigthDialog = 400; private Command commad; private List> fields; private FormLayout layout; @@ -49,8 +50,8 @@ public class DialogEditProperties extends Dialog { this.commad = command; layout = new FormLayout(); - layout.setLabelWidth(90); - layout.setDefaultWidth(300); + layout.setLabelWidth(200); + layout.setDefaultWidth(550); setLayout(layout); setHeading("Edit Properties: " + item.getName()); @@ -71,6 +72,15 @@ public class DialogEditProperties extends Dialog { saveProperties(true); } }); + + //SET TOGGLE BUTTON GRID VIEW + /*Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + setZIndex(99999); + } + });*/ } /* @@ -143,8 +153,10 @@ public class DialogEditProperties extends Dialog { fields = new ArrayList>(result.size()); for (String key : result.keySet()) { TextField field = new TextField(); + GWT.log("Adding field: "+key); field.setFieldLabel(key); field.setValue(result.get(key)); + field.setReadOnly(false); add(field); fields.add(field); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java index b148c6a..c00e127 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java @@ -1,10 +1,13 @@ package org.gcube.portlets.user.workspace.client.view.windows; +import java.util.Date; import java.util.List; import java.util.Map; import org.gcube.portlets.user.workspace.client.AppControllerExplorer; +import org.gcube.portlets.user.workspace.client.ConstantsExplorer; import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum; +import org.gcube.portlets.user.workspace.client.model.FileGridModel; import org.gcube.portlets.user.workspace.client.model.FileModel; import com.github.gwtbootstrap.client.ui.Button; @@ -12,12 +15,14 @@ import com.github.gwtbootstrap.client.ui.ControlGroup; import com.github.gwtbootstrap.client.ui.Label; import com.github.gwtbootstrap.client.ui.TextArea; import com.github.gwtbootstrap.client.ui.constants.LabelType; +import com.github.gwtbootstrap.client.ui.constants.ResizeType; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; +import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Command; @@ -34,17 +39,24 @@ public class DialogGetInfoBootstrap extends Composite { interface DialogGetInfoBootstrapUiBinder extends UiBinder { } + + public static final String EMPTY = "empty"; + + private final NumberFormat number = ConstantsExplorer.numberFormatterKB; public DialogGetInfoBootstrap() { initWidget(uiBinder.createAndBindUi(this)); } - public static final String UNKNOWN = "unknown"; - + public static final String NOT_AVAILABLE = "n.a."; + private Map gCubeProperties; @UiField HorizontalPanel hpItemType; + + @UiField + HorizontalPanel hpHeaderDetails; @UiField HTML txtName; @@ -61,6 +73,9 @@ public class DialogGetInfoBootstrap extends Composite { @UiField HTML txtIsPublic; + @UiField + HTML txtMimeType; + @UiField ControlGroup cgThreddsSynched; @@ -75,26 +90,31 @@ public class DialogGetInfoBootstrap extends Composite { @UiField TextArea txtAreaDescription; - + + @UiField + HTML txtOwner; + + @UiField + HTML txtCreated; + + @UiField + HTML txtLastMofication; + + @UiField + HTML txtSize; + + @UiField + HTML txtShared; + @UiField Button buttonUpdateDescription; - + @UiField Button buttonUpdateGcubeProperties; private FileModel fileModel; - + /* - * TextField txtType = new TextField(); private - * TextField txtCategory = new TextField(); private - * TextField txtOwner = new TextField(); private - * TextField txtLastMofication = new TextField(); private - * TextField txtCreated = new TextField(); private - * TextField txtSize = new TextField(); private - * TextField txtLocation = new TextField(); private - * TextField txtIsPublic = new TextField(); private - * TextField txtThreddsSynched = new TextField(); private - * TextField txtShared = new TextField(); // private TextArea * textAreaSharedWith = new TextArea(); private Html htmlUsersWidget = new * Html(); private Html htmlPropertiesWidget = new Html(); private final * NumberFormat number = ConstantsExplorer.numberFormatterKB; // private @@ -105,6 +125,8 @@ public class DialogGetInfoBootstrap extends Composite { public DialogGetInfoBootstrap(final FileModel fileModel) { initWidget(uiBinder.createAndBindUi(this)); this.fileModel = fileModel; + + hpHeaderDetails.add(new HTML("Details")); hpItemType.add(fileModel.getIcon()); Label labelItemType = new Label(); @@ -116,9 +138,9 @@ public class DialogGetInfoBootstrap extends Composite { if (typeEnum != null) { label = typeEnum.getLabel(); label = label.replace("External ", ""); - - //loading gcube properties - if(typeEnum.equals(GXTFolderItemTypeEnum.GCUBE_ITEM)) + + // loading gcube properties + if (typeEnum.equals(GXTFolderItemTypeEnum.GCUBE_ITEM)) loadGcubeItemProperties(); } else { @@ -146,46 +168,68 @@ public class DialogGetInfoBootstrap extends Composite { txtThreddsSynched.setVisible(true); htmlSetValue(txtThreddsSynched, fileModel.getSynchedThreddsStatus() + ""); txtThreddsSynched.setHTML(fileModel.getSynchedThreddsStatus() + ""); - } } + //mimetype + htmlSetValue(txtMimeType, fileModel.getType()); + txtAreaDescription.setResize(ResizeType.VERTICAL); + if (fileModel.isDirectory()) { txtAreaDescription.setValue(fileModel.getDescription()); // add(txtAreaDescription); } else loadDescription(fileModel.getIdentifier()); + //owner + htmlSetValue(txtOwner, fileModel.getOwnerFullName()); + //creation date + loadCreationDate(fileModel.getIdentifier()); + + if(fileModel instanceof FileGridModel) { + FileGridModel fileGridModel = ((FileGridModel) fileModel); + //last update + htmlSetValue(txtLastMofication, fileGridModel.getLastModification().toString()); + //size + htmlSetValue(txtSize, getFormattedSize(fileGridModel.getSize())); + }else { + loadLastModificationDate(fileModel.getIdentifier()); + loadSize(fileModel.getIdentifier()); + + } + + htmlSetValue(txtShared, fileModel.isShared()+""); + addHandlers(); } private void addHandlers() { - + txtAreaDescription.addKeyPressHandler(new KeyPressHandler() { - + @Override public void onKeyPress(KeyPressEvent event) { - - GWT.log(event.getUnicodeCharCode()+""); - - if(event.getUnicodeCharCode()==13) { + + GWT.log(event.getUnicodeCharCode() + ""); + + if (event.getUnicodeCharCode() == 13) { txtAreaDescription.setReadOnly(true); Window.alert("Updating description"); } - + } }); - + buttonUpdateDescription.addClickHandler(new ClickHandler() { - + @Override public void onClick(ClickEvent event) { txtAreaDescription.setReadOnly(false); txtAreaDescription.setFocus(true); } }); - + final Command cmdReloadProperties = new Command() { @Override @@ -193,17 +237,15 @@ public class DialogGetInfoBootstrap extends Composite { loadGcubeItemProperties(); } }; - + buttonUpdateGcubeProperties.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - DialogEditProperties editProperties = new DialogEditProperties(fileModel, cmdReloadProperties); - editProperties.setProperties(gCubeProperties); - editProperties.setZIndex(99999); + final DialogEditProperties editProperties = new DialogEditProperties(fileModel, cmdReloadProperties); editProperties.show(); - + editProperties.setProperties(gCubeProperties); } }); } @@ -211,10 +253,23 @@ public class DialogGetInfoBootstrap extends Composite { private void htmlSetValue(HTML field, String value) { if (value == null || value.isEmpty()) - field.setHTML(UNKNOWN); + field.setHTML(NOT_AVAILABLE); else field.setHTML(value); } + + private String getFormattedSize(long value) { + + if (value > 0) { + double kb = value / 1024; + if (kb < 1) + kb = 1; + return number.format(kb); + } else if (value == 0) { + return EMPTY; + } else + return ""; + } private void loadLocation(String itemId) { @@ -226,7 +281,7 @@ public class DialogGetInfoBootstrap extends Composite { public void onFailure(Throwable caught) { GWT.log("failure get list parents by item identifier " + caught); removePlaceHolder(txtLocation); - txtLocation.setHTML(UNKNOWN); + txtLocation.setHTML(NOT_AVAILABLE); // txtLocation.set(false); } @@ -249,6 +304,77 @@ public class DialogGetInfoBootstrap extends Composite { }); } + + private void loadSize(final String itemId) { + GWT.log("Load size"); + setPlaceholder(txtSize, "loading..."); + AppControllerExplorer.rpcWorkspaceService.loadSizeByItemId(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + GWT.log("an error occured in load creation date by Id " + itemId + " " + caught.getMessage()); + removePlaceHolder(txtSize); + + } + + @Override + public void onSuccess(Long result) { + GWT.log("Loaded size=" + result); + removePlaceHolder(txtSize); + if(result!=null) + htmlSetValue(txtSize, getFormattedSize(result)); + else + htmlSetValue(txtSize, null); + } + }); + } + + private void loadCreationDate(final String itemId) { + + setPlaceholder(txtCreated, "loading..."); + AppControllerExplorer.rpcWorkspaceService.getItemCreationDateById(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + GWT.log("an error occured in load creation date by Id " + itemId + " " + caught.getMessage()); + removePlaceHolder(txtCreated); + } + + @Override + public void onSuccess(Date result) { + removePlaceHolder(txtCreated); + if (result != null) + htmlSetValue(txtCreated, result.toString()); + else + htmlSetValue(txtCreated, null); + + } + }); + } + + private void loadLastModificationDate(final String itemId) { + + setPlaceholder(txtLastMofication, "loading..."); + AppControllerExplorer.rpcWorkspaceService.loadLastModificationDateById(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + GWT.log("an error occured in loadLastModificationDateById " + itemId + " " + caught.getMessage()); + removePlaceHolder(txtLastMofication); + } + + @Override + public void onSuccess(Date result) { + removePlaceHolder(txtLastMofication); + if (result != null) + htmlSetValue(txtLastMofication, result.toString()); + else + htmlSetValue(txtLastMofication, null); + + } + }); + + } /** * @param identifier @@ -286,13 +412,13 @@ public class DialogGetInfoBootstrap extends Composite { @Override public void onSuccess(Map result) { txtAreaGcubeProperties.setText(""); - GWT.log("Gcube Item Properties: "+result); + GWT.log("Gcube Item Properties: " + result); gCubeProperties = result; // unmask(); - if(result!=null && result.size()>0) { + if (result != null && result.size() > 0) { for (String key : result.keySet()) { String text = txtAreaGcubeProperties.getText(); - text+=key+"="+result.get(key)+";\n"; + text += key + "=" + result.get(key) + ";\n"; txtAreaGcubeProperties.setText(text); } cgGcubeProperties.setVisible(true); @@ -303,11 +429,11 @@ public class DialogGetInfoBootstrap extends Composite { public void onFailure(Throwable caught) { // unmask(); cgGcubeProperties.setVisible(false); - GWT.log("an error occured in loadGcubeItemProperties " + fileModel.getIdentifier() + " " + caught.getMessage()); + GWT.log("an error occured in loadGcubeItemProperties " + fileModel.getIdentifier() + " " + + caught.getMessage()); } }); } - private void setPlaceholder(HTML html, String placeholder) { html.setHTML(placeholder); diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.ui.xml b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.ui.xml index 027cbd4..2df0b1a 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.ui.xml +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.ui.xml @@ -13,6 +13,9 @@ } + + @@ -56,6 +59,14 @@ + + Type + + + + + @@ -93,6 +104,46 @@ + + Owner + + + + + + + Created + + + + + + + Last Mofication + + + + + + + Size + + + + + + + Shared + + + + + diff --git a/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css b/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css index b3ce1cd..a68a1e9 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css +++ b/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css @@ -316,7 +316,7 @@ table.userssuggest th { width: 80px !important; text-align: center !important; padding-right: 10px !important; - color: #5f6368; + color: #959595; } .my-control-group-get-info .add-on { @@ -333,17 +333,35 @@ table.userssuggest th { } .my-control-group-get-info .gwt-TextArea { - width: 350px; + width: 250px; height: 60px; } .item-type-style { + margin-top: 10px; + margin-left: 10px; margin-bottom: 10px; - background-color: #fcfcfc !important; padding-top: 5px; padding-bottom: 5px; } +.item-type-style td { + height: 30px; +} + + +.item-type-style td:first-child { + width: 30px; + padding-left: 5px; +} + .item-type-style td { vertical-align: middle !important; +} + +.item-details-header .gwt-HTML { + font-size: 20px; + font-family: Roboto, Arial, serif !important; + color: #777; + margin: 15px; } \ No newline at end of file