From 81f102c6f89760009c4589ce3bc76db5c62e53ad Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Mon, 4 Apr 2022 14:28:59 +0200 Subject: [PATCH] Improved UX. Added reload action and updated Ckan iFrame --- .../CkanContentModeratorWidgetController.java | 28 +++++- ...FramePanel.java => CkanShowItemFrame.java} | 98 ++++++++++++++----- .../client/ui/CkanShowItemFrame.ui.xml | 21 ++++ .../client/ui/MainTabPanel.java | 4 +- .../client/ui/table/ItemsTable.java | 64 ++++++++++-- .../server/CatalogueBeansConverter.java | 1 + .../shared/CatalogueDataset.java | 12 +++ 7 files changed, 191 insertions(+), 37 deletions(-) rename src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/{CkanInternalFramePanel.java => CkanShowItemFrame.java} (56%) create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.ui.xml diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetController.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetController.java index fdd5c59..d2d8e91 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetController.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetController.java @@ -1,5 +1,6 @@ package org.gcube.portlets.widgets.ckancontentmoderator.client; +import java.util.HashMap; import java.util.List; import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; @@ -20,7 +21,7 @@ import org.gcube.portlets.widgets.ckancontentmoderator.client.events.ShowMessage import org.gcube.portlets.widgets.ckancontentmoderator.client.events.ShowMessageEventHandler; import org.gcube.portlets.widgets.ckancontentmoderator.client.events.TableRangeViewChangedEvent; import org.gcube.portlets.widgets.ckancontentmoderator.client.events.TableRangeViewChangedEventHandler; -import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.CkanInternalFramePanel; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.CkanShowItemFrame; import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.ContentModeratorToolbar; import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.HomeView; import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.MainTabPanel; @@ -55,6 +56,8 @@ public class CkanContentModeratorWidgetController { public final static HandlerManager eventBus = new HandlerManager(null); private HomeView howeView; + + private HashMap mapOfItemsTabDisplayed = new HashMap(); /** * Instantiates a new ckan content moderator widget. @@ -94,7 +97,8 @@ public class CkanContentModeratorWidgetController { howeView.setVisibleUpdateStatusAction(false); } - + //If an action updated the item status we reloading it + reloadItemsDisplayedInTab(); } } }); @@ -109,9 +113,14 @@ public class CkanContentModeratorWidgetController { for (T t : items) { CatalogueDataset clickedDataset = (CatalogueDataset) t; - CkanInternalFramePanel cfp = new CkanInternalFramePanel(eventBus); - cfp.instanceFrame(clickedDataset.getUrl()); - mainTabPanel.addTab(clickedDataset.getTitle(), cfp); + CkanShowItemFrame csif = new CkanShowItemFrame(eventBus); + csif.instanceFrame(clickedDataset.getUrl()); + mainTabPanel.addTab(clickedDataset.getTitle(), csif); + mapOfItemsTabDisplayed.put(clickedDataset.getUrl(), csif); + +// CkanInternalFramePanel cfp = new CkanInternalFramePanel(eventBus); +// cfp.instanceFrame(clickedDataset.getUrl()); +// mainTabPanel.addTab(clickedDataset.getTitle(), cfp); } } @@ -163,6 +172,7 @@ public class CkanContentModeratorWidgetController { @Override public void onClick(CloseAllTabsEvent closeAllTabsEvent) { mainTabPanel.closeTabs(); + mapOfItemsTabDisplayed.clear(); } }); @@ -196,6 +206,14 @@ public class CkanContentModeratorWidgetController { } }); } + + private void reloadItemsDisplayedInTab() { + + for (String datasetURL : mapOfItemsTabDisplayed.keySet()) { + CkanShowItemFrame showItemFrame = mapOfItemsTabDisplayed.get(datasetURL); + showItemFrame.reloadPage(); + } + } private void showMessage(String msg, AlertType alertType) { diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanInternalFramePanel.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.java similarity index 56% rename from src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanInternalFramePanel.java rename to src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.java index b4d5375..60eb2ff 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanInternalFramePanel.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.java @@ -1,33 +1,40 @@ -/** - * - */ package org.gcube.portlets.widgets.ckancontentmoderator.client.ui; import org.gcube.portlets.widgets.ckancontentmoderator.client.events.IFrameInstanciedEvent; import org.gcube.portlets.widgets.ckancontentmoderator.client.events.IFrameInstanciedEvent.OPERATION; import org.gcube.portlets.widgets.ckancontentmoderator.client.resources.ContentModeratorWidgetResources; -import com.google.gwt.core.shared.GWT; +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.constants.IconType; +import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Display; 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.LoadEvent; import com.google.gwt.event.dom.client.LoadHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.http.client.URL; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Random; -import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Frame; +import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.NamedFrame; +import com.google.gwt.user.client.ui.Widget; /** - * The Class CkanInternalFramePanel. + * The Class CkanShowItemFrame. * * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * - * Feb 25, 2022 + * Apr 4, 2022 */ -public class CkanInternalFramePanel extends FlowPanel { +public class CkanShowItemFrame extends Composite { + + private static CkanShowItemFrameUiBinder uiBinder = GWT.create(CkanShowItemFrameUiBinder.class); private NamedFrame namedFrame; private HandlerManager eventBus; @@ -35,32 +42,54 @@ public class CkanInternalFramePanel extends FlowPanel { private String messageToSend; private String iFrameRandomName; + @UiField + Button button_reload; + + @UiField + HTMLPanel panel_container; + +// @UiField +// AlertBlock alertBlockNav; + + private String datasetURL; + /** - * Instantiates a new ckan namedFrame panel. + * The Interface CkanShowItemFrameUiBinder. * - * @param eventBus the event bus + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Apr 4, 2022 */ - public CkanInternalFramePanel(HandlerManager eventBus) { - this.eventBus = eventBus; - addLoading(); + interface CkanShowItemFrameUiBinder extends UiBinder { } /** - * Prints the. + * Instantiates a new ckan show item frame. * - * @param msg the msg + * @param eventBus the event bus */ - private static native void print(String msg)/*-{ - console.log(msg); - }-*/; + public CkanShowItemFrame(HandlerManager eventBus) { + initWidget(uiBinder.createAndBindUi(this)); + this.eventBus = eventBus; +// alertBlockNav.setType(AlertType.INFO); + button_reload.setIcon(IconType.ROTATE_RIGHT); + button_reload.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + reloadPage(); + } + }); + } /** - * Instance namedFrame. + * Instance frame. * * @param datasetURL the dataset URL - * @return the namedFrame + * @return the frame */ public Frame instanceFrame(String datasetURL) { + this.datasetURL = datasetURL; GWT.log("Instancing new IFRAME with uri: " + datasetURL); addLoading(); String urlEncoded = URL.encode(datasetURL); @@ -78,14 +107,15 @@ public class CkanInternalFramePanel extends FlowPanel { @Override public void onLoad(LoadEvent arg0) { - CkanInternalFramePanel.this.remove(loading); + removeLoading(); eventBus.fireEvent(new IFrameInstanciedEvent(namedFrame, OPERATION.ONLOAD)); } }); - add(namedFrame); + panel_container.add(namedFrame); namedFrame.setVisible(true); eventBus.fireEvent(new IFrameInstanciedEvent(namedFrame, OPERATION.INIT)); return namedFrame; + } /** @@ -101,8 +131,30 @@ public class CkanInternalFramePanel extends FlowPanel { * add loading image. */ private void addLoading() { - this.add(loading); + panel_container.add(loading); loading.getElement().getStyle().setProperty("margin", "auto"); loading.getElement().getStyle().setDisplay(Display.BLOCK); + button_reload.setEnabled(false); } + + /** + * Removes the loading. + */ + private void removeLoading() { + try { + panel_container.remove(loading); + button_reload.setEnabled(true); + } catch (Exception e) { + + } + } + + /** + * Reload page. + */ + public void reloadPage() { + panel_container.clear(); + instanceFrame(datasetURL); + } + } diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.ui.xml new file mode 100644 index 0000000..3356a1a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/CkanShowItemFrame.ui.xml @@ -0,0 +1,21 @@ + + + + .important { + font-weight: bold; + } + + .asBar { + background-color: none !important; + } + + + + Reload + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/MainTabPanel.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/MainTabPanel.java index cbdce73..7a2f3aa 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/MainTabPanel.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/MainTabPanel.java @@ -78,9 +78,9 @@ public class MainTabPanel extends Composite { public Tab addTab(String heading, Widget w) { final Tab tab = new Tab(); - if (w instanceof CkanInternalFramePanel) { + if (w instanceof CkanShowItemFrame) { tab.setCustomIconStyle("icon-rotate-right icon-spin"); - CkanInternalFramePanel ckanFramePanel = (CkanInternalFramePanel) w; + CkanShowItemFrame ckanFramePanel = (CkanShowItemFrame) w; ckanFramePanel.getFrame().addLoadHandler(new LoadHandler() { @Override diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/ItemsTable.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/ItemsTable.java index 021189d..93afa31 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/ItemsTable.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/ItemsTable.java @@ -68,11 +68,12 @@ public class ItemsTable extends AbstractItemsCellTab * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 1, 2016 */ public static enum DISPLAY_FIELD { - NAME, TITLE, AUTHOR, CREATED, TYPE + NAME, TITLE, AUTHOR, CREATED, TYPE, LAST_UPDATE }; private List displayFields; - private Column dateColumn; + private Column createdColumn; + private Column lastUpdateColumn; private DISPLAY_FIELD startSortByColumn; private boolean isAsyncronusTable; @@ -243,7 +244,7 @@ public class ItemsTable extends AbstractItemsCellTab if (this.displayFields.contains(DISPLAY_FIELD.CREATED)) { DateCell date = new DateCell(dtformat); - dateColumn = new Column(date) { + createdColumn = new Column(date) { @Override public Date getValue(T object) { @@ -253,7 +254,7 @@ public class ItemsTable extends AbstractItemsCellTab return new Date(((CatalogueDataset) object).getCreated()); } }; - sortedCellTable.addColumn(dateColumn, "Created", true); + sortedCellTable.addColumn(createdColumn, "Created", true); if (!isAsyncronusTable) { Comparator c = new Comparator() { @@ -277,7 +278,49 @@ public class ItemsTable extends AbstractItemsCellTab } }; GWT.log("date colum sortable"); - sortedCellTable.setComparator(dateColumn, c); + sortedCellTable.setComparator(createdColumn, c); + } + + } + + if (this.displayFields.contains(DISPLAY_FIELD.LAST_UPDATE)) { + + DateCell date = new DateCell(dtformat); + lastUpdateColumn = new Column(date) { + + @Override + public Date getValue(T object) { + if (object == null) + return null; + + return new Date(((CatalogueDataset) object).getLastUpdate()); + } + }; + sortedCellTable.addColumn(lastUpdateColumn, "Last Update", true); + + if (!isAsyncronusTable) { + Comparator c = new Comparator() { + @Override + public int compare(T o1, T o2) { + if (o1 == null || o1.getCreated() == 0) + return -1; + + if (o2 == null || o2.getCreated() == 0) + return 1; + + Date d1 = new Date(((CatalogueDataset) o1).getLastUpdate()); + Date d2 = new Date(((CatalogueDataset) o2).getLastUpdate()); + + // GWT.log(d1.toString() + "is after "+d2.toString() +" ? "+d2.after(d1)); + + if (d1.after(d2)) + return 1; + else + return -1; + } + }; + GWT.log("date colum sortable"); + sortedCellTable.setComparator(lastUpdateColumn, c); } } @@ -359,8 +402,15 @@ public class ItemsTable extends AbstractItemsCellTab break; case CREATED: if (this.displayFields.contains(DISPLAY_FIELD.CREATED)) { - sortedCellTable.setDefaultSortOrder(dateColumn, false); // sorts ascending on first click - sortedCellTable.setInitialSortColumn(dateColumn); + sortedCellTable.setDefaultSortOrder(createdColumn, false); // sorts ascending on first click + sortedCellTable.setInitialSortColumn(createdColumn); + GWT.log("sortedCellTable: " + sortedCellTable); + } + break; + case LAST_UPDATE: + if (this.displayFields.contains(DISPLAY_FIELD.LAST_UPDATE)) { + sortedCellTable.setDefaultSortOrder(lastUpdateColumn, false); // sorts ascending on first click + sortedCellTable.setInitialSortColumn(lastUpdateColumn); GWT.log("sortedCellTable: " + sortedCellTable); } break; diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CatalogueBeansConverter.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CatalogueBeansConverter.java index 83ca2b2..62bbf0a 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CatalogueBeansConverter.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CatalogueBeansConverter.java @@ -50,6 +50,7 @@ public class CatalogueBeansConverter { //here is always null myDataset.setUrl(t.getUrl()); myDataset.setCreated(t.getMetadataCreated().getTime()); + myDataset.setLastUpdate(t.getMetadataModified().getTime()); return myDataset; } }; diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/CatalogueDataset.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/CatalogueDataset.java index 4c70371..d3110e5 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/CatalogueDataset.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/CatalogueDataset.java @@ -35,6 +35,7 @@ public class CatalogueDataset implements Serializable, IsSerializable { private String extra_ItemURL; private String extra_SystemType; private long created; + private long lastUpdate; /** * Instantiates a new ckan dataset base. @@ -158,6 +159,15 @@ public class CatalogueDataset implements Serializable, IsSerializable { this.created = created; } + public void setLastUpdate(long time) { + this.lastUpdate = time; + + } + + public long getLastUpdate() { + return lastUpdate; + } + public String getExtra_ItemURL() { return extra_ItemURL; } @@ -209,6 +219,8 @@ public class CatalogueDataset implements Serializable, IsSerializable { builder.append(extra_SystemType); builder.append(", created="); builder.append(created); + builder.append(", lastUpdate="); + builder.append(lastUpdate); builder.append("]"); return builder.toString(); }