From 373ee7fe5689d853d8992b3d4dae6b369012beb9 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Wed, 16 Jun 2021 15:53:06 +0200 Subject: [PATCH] first version of pagination is available --- .../client/CkanContentModeratorService.java | 16 +- .../CkanContentModeratorServiceAsync.java | 5 + .../client/CkanContentModeratorWidget.java | 96 ++++--- .../ContentModeratorWidgetConstants.java | 2 +- .../ui/ConentModeratorSystemBasePanel.java | 47 --- .../ui/ConentModeratorSystemBasePanel.ui.xml | 17 -- .../ui/ContentModeratorPaginatedView.java | 270 ++++++++++++++++++ .../ui/ContentModeratorSystemBaseView.java | 63 ++++ .../ui/ContentModeratorSystemPanel.java | 58 ---- .../client/ui/util/LoadingPanel.java | 38 +++ .../CkanContentModeratorServiceImpl.java | 92 +++++- .../shared/SearchedData.java | 181 ++++++++++++ 12 files changed, 711 insertions(+), 174 deletions(-) delete mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.java delete mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorPaginatedView.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemBaseView.java delete mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemPanel.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/util/LoadingPanel.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/SearchedData.java diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorService.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorService.java index 2539b48..8a0026f 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorService.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorService.java @@ -4,10 +4,12 @@ import java.util.List; import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; +import org.gcube.portlets.widgets.ckancontentmoderator.shared.SearchedData; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; +// TODO: Auto-generated Javadoc /** * The client side stub for the RPC service. * @@ -63,8 +65,20 @@ public interface CkanContentModeratorService extends RemoteService { * @param limit the limit * @param offset the offset * @return the list items for status - * @throws Exception + * @throws Exception the exception */ public List getListItemsForStatus(ItemStatus theStatus, int limit, int offset) throws Exception; + /** + * Gets the data for status. + * + * @param status the status + * @param startIndex the start index + * @param lenght the lenght + * @param serverIndex the server index + * @return the data for status + * @throws Exception + */ + SearchedData getDataForStatus(ItemStatus status, int startIndex, int lenght, int serverIndex) throws Exception; + } diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorServiceAsync.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorServiceAsync.java index 9749f66..302a143 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorServiceAsync.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorServiceAsync.java @@ -4,6 +4,7 @@ import java.util.List; import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; +import org.gcube.portlets.widgets.ckancontentmoderator.shared.SearchedData; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -70,4 +71,8 @@ public interface CkanContentModeratorServiceAsync { void getListItemsForStatus(ItemStatus theStatus, int limit, int offset, AsyncCallback> callback); + void getDataForStatus(ItemStatus status, int startIndex, int lenght, int serverIndex, + AsyncCallback asyncCallback); + + } diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidget.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidget.java index 0d94cfd..588a84e 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidget.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidget.java @@ -1,18 +1,14 @@ package org.gcube.portlets.widgets.ckancontentmoderator.client; -import java.util.List; - import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; -import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.ContentModeratorSystemPanel; -import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table.ItemsTable; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.ContentModeratorPaginatedView; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.ContentModeratorSystemBaseView; import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table.ItemsTable.DISPLAY_FIELD; -import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.view.client.ListDataProvider; /** * The Class CkanContentModeratorWidget. @@ -23,12 +19,13 @@ import com.google.gwt.view.client.ListDataProvider; */ public class CkanContentModeratorWidget { - public final CkanContentModeratorServiceAsync contentModeratorService = GWT + public final static CkanContentModeratorServiceAsync contentModeratorService = GWT .create(CkanContentModeratorService.class); - private ItemsTable itemsTable; - private ContentModeratorSystemPanel cmsPanel = new ContentModeratorSystemPanel(); +// private ItemsTable itemsTable; + private ContentModeratorSystemBaseView cmsPanel = new ContentModeratorSystemBaseView(); private Boolean isContentModeratorEnabled = null; + private ContentModeratorPaginatedView paginatedView; /** * Instantiates a new ckan content moderator widget. @@ -36,46 +33,51 @@ public class CkanContentModeratorWidget { * @param displayFields the display fields * @param sortByField the sort by field */ - public CkanContentModeratorWidget(DISPLAY_FIELD[] displayFields, DISPLAY_FIELD sortByField) { - itemsTable = new ItemsTable(null, displayFields, sortByField); - itemsTable.initTable(null, null, new ListDataProvider()); - cmsPanel.add(itemsTable.getCellTable()); + public CkanContentModeratorWidget(ItemStatus status, DISPLAY_FIELD[] displayFields, DISPLAY_FIELD sortByField) { +// itemsTable = new ItemsTable(null, displayFields, sortByField); +// itemsTable.initTable(null, null, new ListDataProvider()); +// cmsPanel.add(itemsTable.getCellTable()); + + paginatedView = new ContentModeratorPaginatedView(status, displayFields, sortByField); + //cmsPanel.addToTop(new LoadingPanel(new HTML("Loading..."))); + cmsPanel.addToCenter(paginatedView.getCellPanel()); + cmsPanel.addToBottom(paginatedView.getPagerPanel()); } - /** - * Load items for status. - * - * @param status the status - * @throws Exception the exception - */ - public void loadItemsForStatus(ItemStatus status) throws Exception { - - if (isContentModeratorEnabled == null) - throw new Exception("Please, first check if the content moderator is enabled in this context"); - - if (!isContentModeratorEnabled) - throw new Exception("Content Moderator is not enabled in this context"); - - cmsPanel.showLoading(true); - contentModeratorService.getListItemsForStatus(status, ContentModeratorWidgetConstants.ITEMS_PER_PAGE, - ContentModeratorWidgetConstants.ITEM_START_INDEX, new AsyncCallback>() { - - @Override - public void onSuccess(List result) { - cmsPanel.showLoading(false); - itemsTable.updateItems(result, true); - - } - - @Override - public void onFailure(Throwable caught) { - cmsPanel.showLoading(false); - // TODO Auto-generated method stub - - } - }); - - } +// /** +// * Load items for status. +// * +// * @param status the status +// * @throws Exception the exception +// */ +// public void loadItemsForStatus(ItemStatus status) throws Exception { +// +// if (isContentModeratorEnabled == null) +// throw new Exception("Please, first check if the content moderator is enabled in this context"); +// +// if (!isContentModeratorEnabled) +// throw new Exception("Content Moderator is not enabled in this context"); +// +// cmsPanel.showLoading(true); +// contentModeratorService.getListItemsForStatus(status, ContentModeratorWidgetConstants.ITEMS_PER_PAGE, +// ContentModeratorWidgetConstants.ITEM_START_INDEX, new AsyncCallback>() { +// +// @Override +// public void onSuccess(List result) { +// cmsPanel.showLoading(false); +// itemsTable.updateItems(result, true); +// +// } +// +// @Override +// public void onFailure(Throwable caught) { +// cmsPanel.showLoading(false); +// // TODO Auto-generated method stub +// +// } +// }); +// +// } /** * Checks if is content moderator enabled. diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ContentModeratorWidgetConstants.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ContentModeratorWidgetConstants.java index 9232803..48c8093 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ContentModeratorWidgetConstants.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ContentModeratorWidgetConstants.java @@ -11,6 +11,6 @@ public class ContentModeratorWidgetConstants { public static final String NO_DATA = "No data"; - public static int ITEMS_PER_PAGE = 20; + public static int ITEMS_PER_PAGE = 10; public static int ITEM_START_INDEX = 0; } diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.java deleted file mode 100644 index 28b53dc..0000000 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.gcube.portlets.widgets.ckancontentmoderator.client.ui; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HasText; -import com.google.gwt.user.client.ui.Widget; - -public class ConentModeratorSystemBasePanel extends Composite implements HasText { - - private static ConentModeratorSystemBasePanelUiBinder uiBinder = GWT - .create(ConentModeratorSystemBasePanelUiBinder.class); - - interface ConentModeratorSystemBasePanelUiBinder extends UiBinder { - } - - public ConentModeratorSystemBasePanel() { - initWidget(uiBinder.createAndBindUi(this)); - } - - @UiField - Button button; - - public ConentModeratorSystemBasePanel(String firstName) { - initWidget(uiBinder.createAndBindUi(this)); - button.setText(firstName); - } - - @UiHandler("button") - void onClick(ClickEvent e) { - Window.alert("Hello!"); - } - - public void setText(String text) { - button.setText(text); - } - - public String getText() { - return button.getText(); - } - -} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.ui.xml deleted file mode 100644 index 9db905d..0000000 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ConentModeratorSystemBasePanel.ui.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - .important { - font-weight: bold; - } - - - - - - - - - - \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorPaginatedView.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorPaginatedView.java new file mode 100644 index 0000000..643470a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorPaginatedView.java @@ -0,0 +1,270 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui; + +import java.util.List; + +import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; +import org.gcube.portlets.widgets.ckancontentmoderator.client.CkanContentModeratorWidget; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ContentModeratorWidgetConstants; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table.ItemsTable; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table.ItemsTable.DISPLAY_FIELD; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table.SortedCellTable; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.util.LoadingPanel; +import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; +import org.gcube.portlets.widgets.ckancontentmoderator.shared.SearchedData; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.cellview.client.SimplePager; +import com.google.gwt.user.cellview.client.SimplePager.TextLocation; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.view.client.AsyncDataProvider; +import com.google.gwt.view.client.HasData; +import com.google.gwt.view.client.Range; +import com.google.gwt.view.client.SelectionModel; +import com.google.gwt.view.client.SingleSelectionModel; + +public class ContentModeratorPaginatedView { + + private static final int ITEM_START_INDEX = ContentModeratorWidgetConstants.ITEM_START_INDEX; + + private static final int ITEMS_PER_PAGE = ContentModeratorWidgetConstants.ITEMS_PER_PAGE; + + private VerticalPanel vPanel = new VerticalPanel(); + + private FlowPanel pagerPanel = new FlowPanel(); + + private Boolean newLoading = false; + private ItemsTable itemsTable; + private MyCustomDataProvider dataProvider = new MyCustomDataProvider(); + protected Widget orginalLoadingIndicator = null; + private LoadingPanel loadingPanel = new LoadingPanel(new HTML("Loading data...")); + // private int serverStartIndex = 0; + + private ItemStatus itemStatus; + + private int serverStartIndex; + + public ContentModeratorPaginatedView(ItemStatus theStatus, DISPLAY_FIELD[] displayFields, + DISPLAY_FIELD sortByField) { + this.itemStatus = theStatus; + this.newLoading = true; + itemsTable = new ItemsTable(null, displayFields, sortByField); + itemsTable.initTable(null, null, dataProvider); + + orginalLoadingIndicator = itemsTable.getCellTable().getLoadingIndicator(); + initPagination(ITEMS_PER_PAGE); + loadNewPage(ITEM_START_INDEX, ITEMS_PER_PAGE,false); + } + + /** + * Gets the asycn data provider. + * + * @return the asycn data provider + */ + public AsyncDataProvider getAsycnDataProvider() { + return (AsyncDataProvider) getCellTable().getDataProvider(); + } + + /** + * Gets the cell tale. + * + * @return the cell tale + */ + private SortedCellTable getCellTable() { + return itemsTable.getCellTable(); + } + + /** + * Inits the pagination. + * + * @param itemsPerPage the items per page + */ + public void initPagination(int itemsPerPage) { + + SimplePager.Resources pagerResources = GWT.create(SimplePager.Resources.class); + SimplePager pager = new SimplePager(TextLocation.CENTER, pagerResources, false, 0, true); + pager.setDisplay(getCellTable()); + pager.setPageSize(itemsPerPage); + pager.getElement().getStyle().setProperty("margin", "auto"); + vPanel.add(loadingPanel); + vPanel.add(getCellTable()); + vPanel.getElement().addClassName("vPanel"); + pagerPanel.add(pager); + } + + /** + * Gets the pager panel. + * + * @return the pager panel + */ + public VerticalPanel getCellPanel() { + return vPanel; + } + + /** + * Set the panel in loading mode. + */ + protected void showLoading(boolean show) { + loadingPanel.setVisible(show); + } + + /** + * Gets the pager panel. + * + * @return the pager panel + */ + public FlowPanel getPagerPanel() { + return pagerPanel; + } + + /* + * (non-Javadoc) + * + * @see org.gcube.portlets.widgets.wsexplorer.client.view.WorkspaceExplorer# + * loadFolder(org.gcube.portlets.widgets.wsexplorer.shared.Item, boolean, int, + * int, boolean) + */ + public void loadNewPage(final int startIdx, final int limit, final boolean resetStore) { + newLoading = resetStore; + GWT.log("loading data with parameters [startIdx: "+startIdx+", limit: " + limit + ", resetStore:" + resetStore + "]"); + // showLoading(true); + + int newStartIndex = startIdx; + + if (newLoading) { + GWT.log("Cleaning all data..."); + newStartIndex = 0; + serverStartIndex = 0; + GWT.log("Store reset performed start index is: " + newStartIndex); + getAsycnDataProvider().updateRowCount(ITEMS_PER_PAGE, false); + //newLoading = false; + } + + loadItemsForStatus(itemStatus, newStartIndex, limit, serverStartIndex); + + } + + /** + * A custom {@link AsyncDataProvider}. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jul 5, 2017 + * @param the generic type + */ + public class MyCustomDataProvider extends AsyncDataProvider { + + /** + * {@link #onRangeChanged(HasData)} is called when the table requests a new + * range of data. You can push data back to the displays using + * {@link #updateRowData(int, List)}. + * + * @param display the display + */ + @Override + public void onRangeChanged(HasData display) { + + // Get the new range. + final Range range = display.getVisibleRange(); + + int start = range.getStart(); + int length = range.getLength(); + + if (newLoading) { + GWT.log("OnLoading is true.. returning"); + return; + } + try { + GWT.log("Range changed: " + start + " " + length + " visible count: " + display.getVisibleItemCount()); + // GWT.log("Server start index: " + serverStartIndex); +// int newStart = start < serverStartIndex? serverStartIndex : start; +// GWT.log("newStart index: "+newStart); + loadNewPage(start, length, false); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + + /** + * Sets the new page result. + * + * @param result the new new page result + */ + private void setNewPageResult(SearchedData result){ + + serverStartIndex = result.getServerEndIndex(); + + if(newLoading){ + getCellTable().setVisibleRangeAndClearData(new Range(result.getClientStartIndex(), ITEMS_PER_PAGE), false); + } + + SelectionModel sm = getCellTable().getSelectionModel(); + + if(sm instanceof SingleSelectionModel){ + SingleSelectionModel ssm = (SingleSelectionModel) sm; + ssm.clear(); + } + + getAsycnDataProvider().updateRowCount((int) result.getTotalItems(), true); + getAsycnDataProvider().updateRowData(result.getClientStartIndex(), result.getData()); + + if(result.getData().size()==0){ + getCellTable().setLoadingIndicator(new Label("No data")); + }else{ + getCellTable().setLoadingIndicator(orginalLoadingIndicator); + } + + //getCellTable().setVisibleRangeAndClearData(new Range(startIdx, result.getChildren()).), false); + //getAsycnDataProvider().getDataDisplays(). + GWT.log("Updating row data startIndex: "+result.getClientStartIndex() + " children size: "+result.getData().size()); + GWT.log("getAsycnDataProvider().getDataDisplays().size(): "+getCellTable().getRowCount()); + + if(result.isServerSearchFinished()){ + GWT.log("Search finished!!!"); + getAsycnDataProvider().updateRowCount(getCellTable().getRowCount(), true); + } + //getCellTable().setPageSize(result.getChildren().size()+1); + //getCellTable().setVisibleRange(startIdx, result.getChildren().size()); + //getCellTable().redraw(); + //GWT.log("cellTable size: "+getCellTable().getRowCount()); + newLoading = false; + + } + + /** + * Load items for status. + * + * @param status the status + * @param offset + * @param limit + * @throws Exception the exception + */ + private void loadItemsForStatus(ItemStatus status, int offset, int limit, int serverIndex) { + showLoading(true); + + //TODO implement new method + GWT.log("calling getDataForStatus with parameters [startIndex: "+offset+", limit: " + limit + ", serverIndex:" + serverIndex + "]"); + CkanContentModeratorWidget.contentModeratorService.getDataForStatus(status, offset, limit, serverIndex, + new AsyncCallback() { + + @Override + public void onSuccess(SearchedData result) { + showLoading(false); + setNewPageResult(result); + } + + @Override + public void onFailure(Throwable caught) { + showLoading(false); + } + }); + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemBaseView.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemBaseView.java new file mode 100644 index 0000000..bdcacc6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemBaseView.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui; + +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.Widget; + +// TODO: Auto-generated Javadoc +/** + * The Class ContentModeratorSystemBaseView. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 16, 2021 + */ +public class ContentModeratorSystemBaseView { + + private BaseViewTemplate baseViewTemplate = new BaseViewTemplate(); + private ScrollPanel centerPanel = new ScrollPanel(); + + /** + * Instantiates a new content moderator system base view. + */ + public ContentModeratorSystemBaseView() { + baseViewTemplate.addToMiddle(centerPanel); + } + + /** + * Adds the to top. + * + * @param w the w + */ + public void addToTop(Widget w) { + baseViewTemplate.addToTop(w); + } + + /** + * Adds the to center. + * + * @param w the w + */ + public void addToCenter(Widget w) { + centerPanel.add(w); + } + + + /** + * Adds the to bottom. + * + * @param w the w + */ + public void addToBottom(Widget w) { + baseViewTemplate.addToBottom(w); + } + + /** + * Gets the panel. + * + * @return the panel + */ + public Composite getPanel() { + return baseViewTemplate; + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemPanel.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemPanel.java deleted file mode 100644 index d910f16..0000000 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/ContentModeratorSystemPanel.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.gcube.portlets.widgets.ckancontentmoderator.client.ui; - -import org.gcube.portlets.widgets.ckancontentmoderator.client.resources.ContentModeratorWidgetResources; - -import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Image; -import com.google.gwt.user.client.ui.ScrollPanel; -import com.google.gwt.user.client.ui.Widget; - - -/** - * The Class ContentModeratorSystemPanel. - * - * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it - * - * Jun 15, 2021 - */ -public class ContentModeratorSystemPanel { - - - private BaseViewTemplate baseViewTemplate = new BaseViewTemplate(); - private ScrollPanel centerPanel = new ScrollPanel(); - - protected static final HorizontalPanel LOADING_PANEL = new HorizontalPanel(); - protected static final Image LOADING_IMAGE = ContentModeratorWidgetResources.getIconLoading().createImage(); - - static { - LOADING_PANEL.getElement().getStyle().setMargin(5.0, Unit.PX); -// LOADING_PANEL.setSpacing(3); - LOADING_PANEL.add(LOADING_IMAGE); - HTML loading = new HTML("Loading..."); - loading.getElement().getStyle().setPaddingLeft(5.0, Unit.PX); - LOADING_PANEL.add(loading); - } - - - - public ContentModeratorSystemPanel(){ - baseViewTemplate.addToTop(LOADING_PANEL); - baseViewTemplate.addToMiddle(centerPanel); - } - - public void showLoading(boolean show) { - LOADING_PANEL.setVisible(show); - centerPanel.setVisible(!show); - } - - public void add(Widget w){ - centerPanel.add(w); - } - - public Composite getPanel(){ - return baseViewTemplate; - } -} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/util/LoadingPanel.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/util/LoadingPanel.java new file mode 100644 index 0000000..f24341d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/util/LoadingPanel.java @@ -0,0 +1,38 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui.util; + +import org.gcube.portlets.widgets.ckancontentmoderator.client.resources.ContentModeratorWidgetResources; + +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; + + +/** + * The Class LoadingPanel. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 16, 2021 + */ +public class LoadingPanel extends HorizontalPanel { + + protected final Image LOADING_IMAGE = ContentModeratorWidgetResources.getIconLoading().createImage(); + + /** + * Instantiates a new loading panel. + * + * @param html the html + */ + public LoadingPanel(HTML html) { + this.getElement().getStyle().setMargin(5.0, Unit.PX); +// LOADING_PANEL.setSpacing(3); + this.add(LOADING_IMAGE); + if (html != null) { + HTML loadingText = new HTML("Loading..."); + loadingText.getElement().getStyle().setPaddingLeft(5.0, Unit.PX); + this.add(loadingText); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CkanContentModeratorServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CkanContentModeratorServiceImpl.java index a17d7fb..475b14d 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CkanContentModeratorServiceImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/server/CkanContentModeratorServiceImpl.java @@ -10,6 +10,7 @@ import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset; import org.gcube.portlets.widgets.ckancontentmoderator.client.CkanContentModeratorService; import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; +import org.gcube.portlets.widgets.ckancontentmoderator.shared.SearchedData; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,10 +38,19 @@ public class CkanContentModeratorServiceImpl extends RemoteServiceServlet implem } + /** + * Gets the list items for status. + * + * @param theStatus the the status + * @param offset the offset + * @param limit the limit + * @return the list items for status + * @throws Exception the exception + */ @Override - public List getListItemsForStatus(ItemStatus theStatus, int limit, int offset) throws Exception { - LOG.info("called getListItemsForStatus with [status: " + theStatus + "], [limit: " + limit + "], [offset: " - + offset + "]"); + public List getListItemsForStatus(ItemStatus theStatus, int offset, int limit) throws Exception { + LOG.info("called getListItemsForStatus with [status: " + theStatus + ", offset: " + offset + "], [limit: " + + limit + "]"); List datasetList = null; try { @@ -89,4 +99,80 @@ public class CkanContentModeratorServiceImpl extends RemoteServiceServlet implem // TODO Auto-generated method stub } + + @Override + public SearchedData getDataForStatus(ItemStatus status, int offset, int limit, int serverStartIndex) throws Exception { + LOG.info("called getDataForStatus [status: "+status+", offset: "+offset+", limit: "+limit+", serverIndex: "+serverStartIndex); + + try { + String scope = WsUtil.getCurrentScope(this.getThreadLocalRequest()); + GCubeUser user = WsUtil.getCurrentUser(this.getThreadLocalRequest()); + String token = WsUtil.getCurrentToken(scope, user.getUsername()); + ScopeProvider.instance.set(scope); + SecurityTokenProvider.instance.set(token); + //int searchStartIndex = limit < serverStartIndex? serverStartIndex : offset; + + int searchStartIndex = offset; + + CatalogueContentModeratorSystem cmsInstance = CatalogueCMSFactory.getFactory().getCMSPerScope(scope); + SearchedData searchedData = new SearchedData(offset, limit, searchStartIndex, false); + long totalItemsForStatus = cmsInstance.countListItemsForStatus(status); + LOG.info("totalItemsForStatus "+status+" are : "+totalItemsForStatus); + List listDataset = new ArrayList(); + try { + LOG.debug("getListItemsForStatus with searchStartIndex: "+searchStartIndex+", limit: "+limit); + listDataset = getListItemsForStatus(status, searchStartIndex, limit); + }catch (Exception e) { + LOG.error("Error occurred on gettin items for status: "+status,e); + } + + int listDatasetSize = listDataset.size(); + LOG.debug("Returned "+listDatasetSize+" with above parameters"); + searchedData.setData(listDataset); + searchedData.setTotalItems(totalItemsForStatus); + + if(listDatasetSize == limit || listDatasetSize==0){ + LOG.debug("Page completed returning "+listDatasetSize+ " items"); + int newOffset = searchStartIndex+offset; + searchedData.setServerSearchFinished(newOffset>totalItemsForStatus || listDatasetSize == 0); + LOG.debug("is Search finished: "+searchedData.isServerSearchFinished()); + return searchedData; + } + + /*int offsetStartIndex = searchStartIndex; + boolean pageOffsetOut = false; + while(listDatasetSize < offset && !searchedData.isServerSearchFinished() && !pageOffsetOut){ //&& SEARCH NOT ULTIMATED + LOG.debug("MyLg new WHILE Items count: "+totalItemsForStatus+" is less than limit.."); + + int newOffsetStartIndex = offsetStartIndex+limit+1; + LOG.debug("MyLg NewStartIndex is startIndex+limit: "+newOffsetStartIndex); + + //THERE ARE OTHER CHILDREN OVER NEW START INDEX + if(newOffsetStartIndex < totalItemsForStatus){ + //newLimit = limit - childrenToReturn.size(); + LOG.debug("MyLg getting items with index start: "+newOffsetStartIndex + ", limit: "+offset); + + int diff = (int) (offset - totalItemsForStatus); //How items are remaining + //int offset = 0; + LOG.debug("MyLg new search start: "+newOffsetStartIndex + ", diff: "+diff+ ", retrieved: "+listDatasetSize); + if(diff >= listDatasetSize){ + }else{ + pageOffsetOut = true; + } + offsetStartIndex = newOffsetStartIndex; + LOG.debug("MyLg items count is: "+totalItemsForStatus + " serverEndIndex: "+offsetStartIndex); + searchedData.setServerEndIndex(offsetStartIndex); + }else{ + LOG.debug("New start index (oldStartIndex+limit) is grather than total items count, search is finished"); + searchedData.setServerSearchFinished(true); + } + }*/ + LOG.debug("Returning: "+searchedData); + return searchedData; + + } catch (Exception e) { + LOG.error("Error during folder retrieving", e); + throw new Exception("Sorry, an error occurred on loading items"); + } + } } diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/SearchedData.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/SearchedData.java new file mode 100644 index 0000000..f10d8c5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/shared/SearchedData.java @@ -0,0 +1,181 @@ +/** + * + */ +package org.gcube.portlets.widgets.ckancontentmoderator.shared; + +import java.io.Serializable; +import java.util.List; + + +/** + * The Class SearchedFolder. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 16, 2021 + */ +public class SearchedData implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 6800997954077785719L; + private List data; + private int clientStartIndex = 0; + private int limit; + private int serverEndIndex = 0; + private boolean isServerSearchFinished = false; + private long totalItems; + + /** + * Instantiates a new searched folder. + */ + public SearchedData() { + } + + /** + * Instantiates a new searched data. + * + * @param clientStartIndex the client start index + * @param limit the limit + * @param serverEndIndex the server end index + * @param isServerSearchFinished the is server search finished + */ + public SearchedData(int clientStartIndex, int limit, int serverEndIndex, boolean isServerSearchFinished) { + + this.clientStartIndex = clientStartIndex; + this.limit = limit; + this.serverEndIndex = serverEndIndex; + this.isServerSearchFinished = isServerSearchFinished; + } + + /** + * Gets the data. + * + * @return the data + */ + public List getData() { + return data; + } + + /** + * Gets the client start index. + * + * @return the client start index + */ + public int getClientStartIndex() { + return clientStartIndex; + } + + /** + * Gets the limit. + * + * @return the limit + */ + public int getLimit() { + return limit; + } + + /** + * Gets the server end index. + * + * @return the server end index + */ + public int getServerEndIndex() { + return serverEndIndex; + } + + /** + * Checks if is server search finished. + * + * @return true, if is server search finished + */ + public boolean isServerSearchFinished() { + return isServerSearchFinished; + } + + /** + * Sets the data. + * + * @param data the new data + */ + public void setData(List data) { + this.data = data; + } + + /** + * Sets the client start index. + * + * @param clientStartIndex the new client start index + */ + public void setClientStartIndex(int clientStartIndex) { + this.clientStartIndex = clientStartIndex; + } + + /** + * Sets the limit. + * + * @param limit the new limit + */ + public void setLimit(int limit) { + this.limit = limit; + } + + /** + * Sets the server end index. + * + * @param serverEndIndex the new server end index + */ + public void setServerEndIndex(int serverEndIndex) { + this.serverEndIndex = serverEndIndex; + } + + /** + * Sets the server search finished. + * + * @param isServerSearchFinished the new server search finished + */ + public void setServerSearchFinished(boolean isServerSearchFinished) { + this.isServerSearchFinished = isServerSearchFinished; + } + + /** + * Gets the total items. + * + * @return the total items + */ + public long getTotalItems() { + return totalItems; + } + + /** + * Sets the total items. + * + * @param totalItems the new total items + */ + public void setTotalItems(long totalItems) { + this.totalItems = totalItems; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SearchedData [data="); + builder.append(data); + builder.append(", clientStartIndex="); + builder.append(clientStartIndex); + builder.append(", limit="); + builder.append(limit); + builder.append(", serverEndIndex="); + builder.append(serverEndIndex); + builder.append(", isServerSearchFinished="); + builder.append(isServerSearchFinished); + builder.append(", totalItems="); + builder.append(totalItems); + builder.append("]"); + return builder.toString(); + } + + + +}