From e1cda838c4616317ceba0390e20ecd004aa18b39 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Fri, 5 Nov 2021 12:06:46 +0100 Subject: [PATCH] Feature #22251 implemented - Make workspace file size field smart --- .classpath | 6 +- .../com.gwtplugins.gdt.eclipse.core.prefs | 2 +- .settings/org.eclipse.wst.common.component | 40 +-- CHANGELOG.md | 6 + pom.xml | 2 +- .../user/workspace/client/view/SizeUtil.java | 42 +++ .../view/grids/GxtGridFilterGroupPanel.java | 289 ++++++++---------- 7 files changed, 205 insertions(+), 182 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/view/SizeUtil.java 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