diff --git a/.classpath b/.classpath
index 138a2cb..a5da9cf 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,6 @@
-
+
@@ -22,7 +22,7 @@
-
+
@@ -35,5 +35,5 @@
-
+
diff --git a/.settings/com.gwtplugins.gdt.eclipse.core.prefs b/.settings/com.gwtplugins.gdt.eclipse.core.prefs
index 0e13e06..917caea 100644
--- a/.settings/com.gwtplugins.gdt.eclipse.core.prefs
+++ b/.settings/com.gwtplugins.gdt.eclipse.core.prefs
@@ -1,4 +1,4 @@
eclipse.preferences.version=1
-lastWarOutDir=/home/francescomangiacrapa/git/workspace/target/workspace-6.27.1-SNAPSHOT
+lastWarOutDir=/home/francescomangiacrapa/git/workspace/target/workspace-6.28.0-SNAPSHOT
warSrcDir=src/main/webapp
warSrcDirIsOutput=false
diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component
index bd6dc80..15e577e 100644
--- a/.settings/org.eclipse.wst.common.component
+++ b/.settings/org.eclipse.wst.common.component
@@ -1,5 +1,5 @@
-
+
@@ -18,8 +18,10 @@
-
-
+
+
+
+
@@ -39,7 +41,8 @@
-
+
+
@@ -59,7 +62,8 @@
-
+
+
@@ -79,7 +83,8 @@
-
+
+
@@ -98,22 +103,18 @@
-
+
+
-
+
uses
-
- uses
-
-
- uses
-
-
+
+
@@ -133,7 +134,8 @@
-
+
+
@@ -153,7 +155,8 @@
-
+
+
@@ -173,7 +176,8 @@
-
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e8a87d7..376d427 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,12 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [v6.28.0-SNAPSHOT] - 2021-11-05
+
+#### Enhancements
+
+* [#22251] Make workspace file size field smart
+
## [v6.27.1] - 2021-06-22
[#21575] Including ws-tree bug fix
diff --git a/pom.xml b/pom.xml
index 3c89b83..7512280 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
org.gcube.portlets.user
workspace
war
- 6.27.1
+ 6.28.0-SNAPSHOT
gCube Workspace Portlet
gCube Workspace Portlet is a web-gui to manage the gCube workspace, a collaborative area where users can exchange and organize information objects (workspace items) according to their specific needs.
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/SizeUtil.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/SizeUtil.java
new file mode 100644
index 0000000..6ab3bb5
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/SizeUtil.java
@@ -0,0 +1,42 @@
+package org.gcube.portlets.user.workspace.client.view;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.i18n.client.NumberFormat;
+
+/**
+ * The Class SizeUtil.
+ *
+ * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
+ *
+ * Nov 5, 2021
+ */
+public class SizeUtil {
+
+ public static final NumberFormat numberFormat = NumberFormat.getFormat("#,##0.#");
+
+ /**
+ * Readable file size.
+ *
+ * @param size the size
+ * @return the string
+ */
+ public static String readableFileSize(long size) {
+ GWT.log("Converting size: "+size);
+ // -1 should be the size of a folder
+ if (size == -1)
+ return "";
+ // in some cases the size returned by SHUB is negative,
+ // so reporting as 1B to user
+ if (size < 0)
+ return "1 byte";
+
+ if (size == 0)
+ return "0 byte";
+
+ final String[] units = new String[] { "bytes", "kB", "MB", "GB", "TB" };
+ int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
+
+ return numberFormat.format(size / Math.pow(1024, digitGroups)) +" " +units[digitGroups];
+
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/grids/GxtGridFilterGroupPanel.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/grids/GxtGridFilterGroupPanel.java
index cf0822c..9fb0cbf 100644
--- a/src/main/java/org/gcube/portlets/user/workspace/client/view/grids/GxtGridFilterGroupPanel.java
+++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/grids/GxtGridFilterGroupPanel.java
@@ -5,7 +5,6 @@ import java.util.Arrays;
import java.util.List;
import org.gcube.portlets.user.workspace.client.AppController;
-import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent;
import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent.DownloadType;
import org.gcube.portlets.user.workspace.client.event.ImagePreviewEvent;
@@ -18,6 +17,7 @@ import org.gcube.portlets.user.workspace.client.gridevent.StoreGridChangedEvent;
import org.gcube.portlets.user.workspace.client.model.FileGridModel;
import org.gcube.portlets.user.workspace.client.model.FileModel;
import org.gcube.portlets.user.workspace.client.model.GroupingStoreModel;
+import org.gcube.portlets.user.workspace.client.view.SizeUtil;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.ModelData;
@@ -50,28 +50,24 @@ import com.extjs.gxt.ui.client.widget.grid.filters.StringFilter;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Random;
-
/**
* The Class GxtGridFilterGroupPanel.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa{@literal @}isti.cnr.it
- * Nov 17, 2015
+ * Nov 17, 2015
*/
public class GxtGridFilterGroupPanel extends LayoutContainer {
private ContentPanel cp = new ContentPanel();
-// private ListStore store = ListStoreModel.getInstance().getStore();
private GroupingStore store = GroupingStoreModel.getInstance().getStore();
private FileGridModel currentItemSelected = null;
private FileModel currentFolderView = null;
private GroupingView view = new GroupingView();
private boolean groupingEnabled = false;
- private NumberFormat number = ConstantsExplorer.numberFormatterKB;
- private final Grid grid;
- private ColumnModel cm = null;
+ private final Grid grid;
+ private ColumnModel cm = null;
/**
* Instantiates a new gxt grid filter group panel.
@@ -80,23 +76,21 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*/
public GxtGridFilterGroupPanel(boolean group) {
// setLayout(new FitLayout());
- setId("GxtGridFilterGroupPanel "+Random.nextInt());
+ setId("GxtGridFilterGroupPanel " + Random.nextInt());
ColumnConfig icon = new ColumnConfig(FileModel.ICON, "", 60);
icon.setSortable(false);
ColumnConfig name = new ColumnConfig(FileGridModel.NAME, FileGridModel.NAME, 280);
ColumnConfig type = new ColumnConfig(FileGridModel.TYPE, FileGridModel.TYPE, 60);
ColumnConfig lastUpdate = new ColumnConfig(FileGridModel.LASTMODIFIED, "Last Update", 90);
lastUpdate.setDateTimeFormat(DateTimeFormat.getFormat("dd MMM hh:mm aaa yyyy"));
- ColumnConfig category = new ColumnConfig(FileModel.HUMAN_REDABLE_CATEGORY, FileModel.HUMAN_REDABLE_CATEGORY, 100);
+ ColumnConfig category = new ColumnConfig(FileModel.HUMAN_REDABLE_CATEGORY, FileModel.HUMAN_REDABLE_CATEGORY,
+ 100);
ColumnConfig size = new ColumnConfig(FileGridModel.SIZE, FileGridModel.SIZE, 45);
ColumnConfig ownerFullName = new ColumnConfig(FileGridModel.OWNERFULLNAME, FileGridModel.OWNER, 90);
-
size.setEditor(new CellEditor(new NumberField()));
-
-
- if(group)
+ if (group)
cm = new ColumnModel(Arrays.asList(icon, name, ownerFullName, type, lastUpdate, size, category));
else
cm = new ColumnModel(Arrays.asList(icon, name, ownerFullName, type, lastUpdate, size));
@@ -110,50 +104,46 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
grid = new Grid(store, columnModel);
grid.getView().setAutoFill(true);
- view.setShowGroupedColumn(false);
- view.setForceFit(true);
- grid.setView(view);
- view.setEmptyText(FileGridModel.EMPTY);
+ view.setShowGroupedColumn(false);
+ view.setForceFit(true);
+ grid.setView(view);
+ view.setEmptyText(FileGridModel.EMPTY);
- if(group){
- store.groupBy(FileGridModel.HUMAN_REDABLE_CATEGORY);
- groupingEnabled = true;
- }
+ if (group) {
+ store.groupBy(FileGridModel.HUMAN_REDABLE_CATEGORY);
+ groupingEnabled = true;
+ }
- GridCellRenderer folderRender = new GridCellRenderer() {
+ GridCellRenderer folderRender = new GridCellRenderer() {
@Override
- public String render(FileGridModel model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) {
- String val = model.get(property);
- if(val==null || val.isEmpty())
- return "";
-
- return "" + val + "";
+ public String render(FileGridModel model, String property, ColumnData config, int rowIndex, int colIndex,
+ ListStore store, Grid grid) {
+ String val = model.get(property);
+ if (val == null || val.isEmpty())
+ return "";
+
+ return ""
+ + val + "";
}
- };
-
- GridCellRenderer kbRender = new GridCellRenderer() {
- @Override
- public String render(FileGridModel model, String property, ColumnData config,
- int rowIndex, int colIndex, ListStore store, Grid grid) {
-
- long value = (Long) model.get(property);
-
- if(value!=-1){
- double kb = value/1024;
- if(kb<1)
- kb=1;
- return "" + number.format(kb) + "";
-
- }
+ };
- return "";
- }
- };
-
- size.setRenderer(kbRender);
- type.setRenderer(folderRender);
+ GridCellRenderer kbRender = new GridCellRenderer() {
+ @Override
+ public String render(FileGridModel model, String property, ColumnData config, int rowIndex, int colIndex,
+ ListStore store, Grid grid) {
+
+ long value = (Long) model.get(property);
+//
+ if (value != -1) {
+ String theSize = SizeUtil.readableFileSize(value);
+ return "" + theSize + "";
+ }
+ return "";
+ }
+ };
- //setAlphanumericStoreSorter(grid);
+ size.setRenderer(kbRender);
+ type.setRenderer(folderRender);
GridFilters filters = new GridFilters();
filters.setLocal(true);
@@ -186,17 +176,16 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
ModelData target = se.getSelectedItem();
- if(target!=null){
+ if (target != null) {
currentItemSelected = (FileGridModel) target;
boolean isMultiselection = false;
- if(se.getSelection()!=null && se.getSelection().size()>1)
+ if (se.getSelection() != null && se.getSelection().size() > 1)
isMultiselection = true;
AppController.getEventBus().fireEvent(new GridElementSelectedEvent(target, isMultiselection));
- }
- else{
+ } else {
currentItemSelected = null;
AppController.getEventBus().fireEvent(new GridElementUnSelectedEvent());
}
@@ -204,7 +193,6 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
}
});
-
grid.addListener(Events.RowDoubleClick, new Listener() {
@Override
@@ -212,39 +200,40 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
FileGridModel fileModel = grid.getSelectionModel().getSelectedItem();
- if(fileModel!=null)
+ if (fileModel != null)
fireEventByFileModelType(fileModel);
- // if(fileModel.isDirectory())
- // AppController.getEventBus().fireEvent(new DoubleClickElementSelectedEvent(fileModel));
+ // if(fileModel.isDirectory())
+ // AppController.getEventBus().fireEvent(new
+ // DoubleClickElementSelectedEvent(fileModel));
}
- });
-
+ });
- grid.setContextMenu(null); //add context menu null - ignore browse event right click
+ grid.setContextMenu(null); // add context menu null - ignore browse event right click
- grid.addListener(Events.OnContextMenu, new Listener>(){
+ grid.addListener(Events.OnContextMenu, new Listener>() {
@Override
- public void handleEvent(GridEvent be)
- {
+ public void handleEvent(GridEvent be) {
- if(be.isRightClick()){
+ if (be.isRightClick()) {
- List selection = grid.getSelectionModel().getSelection();
- if(selection!=null && selection.size()>0){
+ List selection = grid.getSelectionModel().getSelection();
+ if (selection != null && selection.size() > 0) {
// if(grid.getSelectionModel().getSelection().size()>1){
// new InfoDisplay("Info", "The context menu is not available if multi-select is active");
// return;
// }
- List selected = new ArrayList(selection.size());
- for (FileGridModel fileGridModel : selection) {
- selected.add(fileGridModel);
+ List selected = new ArrayList(selection.size());
+ for (FileGridModel fileGridModel : selection) {
+ selected.add(fileGridModel);
}
- //List selectedItems = grid.getSelectionModel().getSelectedItems();
- AppController.getEventBus().fireEvent(new OpenContextMenuTreeEvent(selected, be.getClientX(), be.getClientY()));
- }
- }
+ // List selectedItems =
+ // grid.getSelectionModel().getSelectedItems();
+ AppController.getEventBus()
+ .fireEvent(new OpenContextMenuTreeEvent(selected, be.getClientX(), be.getClientY()));
+ }
+ }
}
});
@@ -281,7 +270,7 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
if (groupingStore != null) {
groupingStore.groupBy(FileGridModel.HUMAN_REDABLE_CATEGORY);
}
- this.groupingEnabled = true;
+ this.groupingEnabled = true;
}
}
@@ -290,19 +279,18 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*
* @param target the target
*/
- private void fireEventByFileModelType(FileModel target){
+ private void fireEventByFileModelType(FileModel target) {
- if(target.isDirectory()){
+ if (target.isDirectory()) {
AppController.getEventBus().fireEvent(new DoubleClickElementSelectedEvent(target));
return;
}
-
- switch(target.getGXTFolderItemType()){
+ switch (target.getGXTFolderItemType()) {
case EXTERNAL_IMAGE:
case IMAGE_DOCUMENT:
- AppController.getEventBus().fireEvent(new ImagePreviewEvent(target,0, 0));
+ AppController.getEventBus().fireEvent(new ImagePreviewEvent(target, 0, 0));
break;
case EXTERNAL_FILE:
case EXTERNAL_PDF_FILE:
@@ -311,7 +299,8 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
case URL_DOCUMENT:
case EXTERNAL_RESOURCE_LINK:
- AppController.getEventBus().fireEvent(new FileDownloadEvent(target.getIdentifier(), target.getName(), DownloadType.SHOW, target.isDirectory() || target.isVreFolder(), null));
+ AppController.getEventBus().fireEvent(new FileDownloadEvent(target.getIdentifier(), target.getName(),
+ DownloadType.SHOW, target.isDirectory() || target.isVreFolder(), null));
break;
case EXTERNAL_URL:
AppController.getEventBus().fireEvent(new ShowUrlEvent(target));
@@ -327,27 +316,26 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
}
-
/**
* Reset store.
*/
- private void resetStore(){
+ private void resetStore() {
store.removeAll();
}
-
/**
* Update store.
*
* @param result the result
* @return true, if successful
*/
- public boolean updateStore(List result){
+ public boolean updateStore(List result) {
resetStore();
- if(result!= null && result.size()>0){
- for(FileGridModel file: result){
- //GWT.log("File: "+file.getName() + " has sync: "+file.getSynchedThreddsStatus());
+ if (result != null && result.size() > 0) {
+ for (FileGridModel file : result) {
+ // GWT.log("File: "+file.getName() + " has sync:
+ // "+file.getSynchedThreddsStatus());
file.setIcon();
}
store.add(result);
@@ -356,16 +344,15 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
return false;
}
-
/**
* Adds the to store.
*
* @param result the result
* @return true, if successful
*/
- public boolean addToStore(FileGridModel result){
+ public boolean addToStore(FileGridModel result) {
- if(result!= null){
+ if (result != null) {
result.setIcon();
store.add(result);
return true;
@@ -378,7 +365,7 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*
* @return the selected item
*/
- public FileGridModel getSelectedItem(){
+ public FileGridModel getSelectedItem() {
return currentItemSelected;
}
@@ -388,7 +375,7 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*
* @return the selected items
*/
- public List getSelectedItems(){
+ public List getSelectedItems() {
return grid.getSelectionModel().getSelection();
}
@@ -398,9 +385,9 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*
* @return the ids selected items
*/
- public List getIdsSelectedItems(){
+ public List getIdsSelectedItems() {
- if(grid.getSelectionModel().getSelection()!=null){
+ if (grid.getSelectionModel().getSelection() != null) {
List ids = new ArrayList();
for (FileModel file : grid.getSelectionModel().getSelection()) {
@@ -421,22 +408,18 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*/
public boolean deleteItem(String identifier) {
- FileGridModel fileTarget = getFileGridModelByIdentifier(identifier);
+ FileGridModel fileTarget = getFileGridModelByIdentifier(identifier);
- if(fileTarget!=null){
+ if (fileTarget != null) {
Record record = store.getRecord(fileTarget);
store.remove((FileGridModel) record.getModel());
return true;
- }
- else
- System.out.println("Delete Error: file target with " + identifier + " identifier not exist in store" );
+ } else
+ System.out.println("Delete Error: file target with " + identifier + " identifier not exist in store");
return false;
}
-
-
-
/**
* Gets the current folder view.
*
@@ -446,7 +429,6 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
return currentFolderView;
}
-
/**
* Sets the current folder view.
*
@@ -456,35 +438,32 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
this.currentFolderView = currentFolderView;
}
-
/**
* Rename item.//
*
* @param itemIdentifier the item identifier
- * @param newName the new name
- * @param extension the extension
+ * @param newName the new name
+ * @param extension the extension
* @return true, if successful
*/
public boolean renameItem(String itemIdentifier, String newName, String extension) {
- if(itemIdentifier!=null){
- FileGridModel fileTarget = getFileGridModelByIdentifier(itemIdentifier);
- if(fileTarget!=null){
+ if (itemIdentifier != null) {
+ FileGridModel fileTarget = getFileGridModelByIdentifier(itemIdentifier);
+ if (fileTarget != null) {
Record record = store.getRecord(fileTarget);
- if(record!=null){
- if(extension!= null)
- record.set(FileGridModel.NAME, newName+extension);
+ if (record != null) {
+ if (extension != null)
+ record.set(FileGridModel.NAME, newName + extension);
else
record.set(FileGridModel.NAME, newName);
return true;
}
- }
- else
- System.out.println("Record Error: file target not exist in store" );
- }
- else
- System.out.println("Rename Error: file target is null" );
+ } else
+ System.out.println("Record Error: file target not exist in store");
+ } else
+ System.out.println("Rename Error: file target is null");
return false;
@@ -496,7 +475,7 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
* @param id the id
* @return the file grid model by identifier
*/
- public FileGridModel getFileGridModelByIdentifier(String id){
+ public FileGridModel getFileGridModelByIdentifier(String id) {
return store.findModel(FileGridModel.IDENTIFIER, id);
}
@@ -506,13 +485,13 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
* @param id the id
* @return true, if successful
*/
- public boolean selectItemByFileModelId(String id){
+ public boolean selectItemByFileModelId(String id) {
- if(id!=null && !id.isEmpty()){
+ if (id != null && !id.isEmpty()) {
FileGridModel fileModel = getFileGridModelByIdentifier(id);
- if(fileModel!=null){
+ if (fileModel != null) {
grid.getSelectionModel().select(fileModel, true);
return true;
}
@@ -521,29 +500,27 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
return false;
}
-
/**
* Gets the store.
*
* @return the store
*/
- public GroupingStore getStore(){
+ public GroupingStore getStore() {
return store;
}
/**
- * Sets the border as on search.
- *percentulae in java
+ * Sets the border as on search. percentulae in java
+ *
* @param bool the new border as on search
*/
- public void setBorderAsOnSearch(boolean bool){
+ public void setBorderAsOnSearch(boolean bool) {
- if(this.cp.getElement("body")!=null){
+ if (this.cp.getElement("body") != null) {
- if(bool){
+ if (bool) {
this.cp.getElement("body").getStyle().setBorderColor("#32CD32");
- }
- else
+ } else
this.cp.getElement("body").getStyle().setBorderColor("#99BBE8");
}
@@ -552,9 +529,9 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
/**
* Adds the data changed store listener.
*/
- private void addDataChangedStoreListener(){
+ private void addDataChangedStoreListener() {
- store.addListener(Store.Add, new Listener>(){
+ store.addListener(Store.Add, new Listener>() {
@Override
public void handleEvent(StoreEvent be) {
@@ -563,7 +540,7 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
}
});
- store.addListener(Store.Remove, new Listener>(){
+ store.addListener(Store.Remove, new Listener>() {
@Override
public void handleEvent(StoreEvent be) {
@@ -572,7 +549,7 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
}
});
- store.addListener(Store.Clear, new Listener>(){
+ store.addListener(Store.Clear, new Listener>() {
@Override
public void handleEvent(StoreEvent be) {
@@ -588,9 +565,9 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
*
* @return -1 if store is null. The size otherwise
*/
- private int storeSize(){
+ private int storeSize() {
- if(store!=null && store.getModels()!=null){
+ if (store != null && store.getModels() != null) {
return store.getModels().size();
}
@@ -600,40 +577,34 @@ public class GxtGridFilterGroupPanel extends LayoutContainer {
/**
* Refresh size.
*
- * @param width the width
+ * @param width the width
* @param height the height
*/
public void refreshSize(String width, String height) {
-// if(this.isRendered()){
-// GWT.log("refresh size grid "+height);
-// this.setHeight(height);
-// }
- GWT.log("refresh size grid "+width +"; heigth: "+height);
+ GWT.log("refresh size grid " + width + "; heigth: " + height);
this.setSize(width, height);
cp.setSize(width, height);
grid.setWidth(width);
int theWidth = Integer.parseInt(width.replace("px", ""));
- GWT.log("theWidth is "+theWidth);
- for (int i=1; i