diff --git a/CHANGELOG.md b/CHANGELOG.md index 0647d79..6319e44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,6 @@ 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). -## [v0.1.0-SNAPSHOT] - 2021-05-06 +## [v0.2.0-SNAPSHOT] - 2021-06-15 First Release diff --git a/pom.xml b/pom.xml index b2c95e3..155b122 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ org.gcube.portlets.widgets ckan-content-moderator-widget jar - 0.1.0-SNAPSHOT + 0.2.0-SNAPSHOT gCube Ckan Content Moderator Widget @@ -68,18 +68,19 @@ - - javax.servlet - javax.servlet-api - 3.1.0 - provided - - - xml-apis - xml-apis - 1.4.01 - provided - + + + + + + + + + + + + + com.google.gwt gwt-user @@ -102,34 +103,6 @@ gwt-bootstrap 2.3.2.0 - - com.github.gwtmaterialdesign - gwt-material-jquery - ${gwt-material.version} - - - - - - - - - - com.github.gwtmaterialdesign - gwt-material-table - ${gwt-material.version} - - - com.github.gwtmaterialdesign - gwt-material-addins - ${gwt-material.version} - - - - com.github.gwtmaterialdesign - gwt-material-themes - ${gwt-material.version} - org.gcube.core @@ -148,18 +121,6 @@ compile - - - - - - - - - - - - org.gcube.datacatalogue catalogue-util-library diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml index 26c0278..4fdac16 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml @@ -3,22 +3,16 @@ - - - - - - - - + + + - + 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 9d0a257..73188d4 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 @@ -3,63 +3,44 @@ 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.material.table.CustomizedView; -import org.gcube.portlets.widgets.ckancontentmoderator.client.resources.DataTableClientBundle; +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.shared.CatalogueDataset; -import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.StyleInjector; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.RootPanel; /** * Entry point classes define onModuleLoad(). */ -public class CkanContentModeratorWidget implements EntryPoint { - /** - * The message displayed to the user when the server cannot be reached or - * returns an error. - */ - private static final String SERVER_ERROR = "An error occurred while " - + "attempting to contact the server. Please check your network " + "connection and try again."; - - /** - * Create a remote service proxy to talk to the server-side Greeting service. - */ - private final CkanContentModeratorServiceAsync greetingService = GWT.create(CkanContentModeratorService.class); - - /** - * This is the entry point method. - */ - public void onModuleLoad() { - /*StyleInjector.inject(DataTableClientBundle.INSTANCE.dataTable().getText()); - -// MaterialDataTable table = new MaterialDataTable(); -// table.getTableTitle().setText("Customers"); -// List users = new ArrayList(); -// users.add("Pippo"); -// table.setRowData(0, users); - - final CustomizedView cvTable = new CustomizedView(); - RootPanel.get().add(cvTable); -// table.getView().refresh(); - - greetingService.getListItemsForStatus(ItemStatus.PENDING, 20, 0, new AsyncCallback>() { +public class CkanContentModeratorWidget { + public final CkanContentModeratorServiceAsync contentModeratorService = GWT.create(CkanContentModeratorService.class); + + ItemsTable itemsTable; + + CkanContentModeratorWidget(DISPLAY_FIELD[] displayFields, DISPLAY_FIELD sortByField){ + itemsTable = new ItemsTable(null, displayFields, sortByField); + } + + + public void loadItemsForStatus(ItemStatus status){ + + + contentModeratorService.getListItemsForStatus(status, ContentModeratorWidgetConstants.ITEMS_PER_PAGE, ContentModeratorWidgetConstants.ITEM_START_INDEX, new AsyncCallback>() { + @Override public void onSuccess(List result) { - cvTable.setData(result); - + itemsTable.updateItems(result, true); + } - + @Override public void onFailure(Throwable caught) { - Window.alert(caught.getMessage()); - + // TODO Auto-generated method stub + } - });*/ + }); + } - } diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetEntryPoint.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetEntryPoint.java new file mode 100644 index 0000000..3f4a68d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetEntryPoint.java @@ -0,0 +1,54 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; + +/** + * Entry point classes define onModuleLoad(). + */ +public class CkanContentModeratorWidgetEntryPoint implements EntryPoint { + /** + * The message displayed to the user when the server cannot be reached or + * returns an error. + */ + private static final String SERVER_ERROR = "An error occurred while " + + "attempting to contact the server. Please check your network " + "connection and try again."; + + /** + * Create a remote service proxy to talk to the server-side Greeting service. + */ + private final CkanContentModeratorServiceAsync greetingService = GWT.create(CkanContentModeratorService.class); + + /** + * This is the entry point method. + */ + public void onModuleLoad() { + /*StyleInjector.inject(DataTableClientBundle.INSTANCE.dataTable().getText()); + +// MaterialDataTable table = new MaterialDataTable(); +// table.getTableTitle().setText("Customers"); +// List users = new ArrayList(); +// users.add("Pippo"); +// table.setRowData(0, users); + + final CustomizedView cvTable = new CustomizedView(); + RootPanel.get().add(cvTable); +// table.getView().refresh(); + + greetingService.getListItemsForStatus(ItemStatus.PENDING, 20, 0, new AsyncCallback>() { + + @Override + public void onSuccess(List result) { + cvTable.setData(result); + + } + + @Override + public void onFailure(Throwable caught) { + Window.alert(caught.getMessage()); + + } + });*/ + } + +} 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 new file mode 100644 index 0000000..48c8093 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ContentModeratorWidgetConstants.java @@ -0,0 +1,16 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client; + +/** + * The Class ContentModeratorWidgetConstants. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + */ +public class ContentModeratorWidgetConstants { + + public static final String NO_DATA = "No data"; + + 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/events/ClickItemEvent.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEvent.java new file mode 100644 index 0000000..6bb0a89 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEvent.java @@ -0,0 +1,50 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.events; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class ClickItemEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 6, 2015 + */ +public class ClickItemEvent extends GwtEvent { + public static Type TYPE = new Type(); + private T item; + + + /** + * Instantiates a new click item event. + * + * @param item the item + */ + public ClickItemEvent(T item) { + this.item = item; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(ClickItemEventHandler handler) { + handler.onClick(this); + } + + /** + * Gets the item. + * + * @return the item + */ + public T getItem() { + return item; + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEventHandler.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEventHandler.java new file mode 100644 index 0000000..756baed --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEventHandler.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.events; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface ClickItemEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 6, 2015 + */ +public interface ClickItemEventHandler extends EventHandler { + + /** + * On click. + * + * @param the generic type + * @param moreInfoShowEvent the more info show event + */ + void onClick(ClickItemEvent moreInfoShowEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.java deleted file mode 100644 index 84c184d..0000000 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.java +++ /dev/null @@ -1,226 +0,0 @@ -package org.gcube.portlets.widgets.ckancontentmoderator.client.material.table; - -import java.util.List; - -import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; - -import gwt.material.design.client.data.events.ColumnSortHandler; -import gwt.material.design.client.data.events.RowSelectEvent; -import gwt.material.design.client.data.events.RowSelectHandler; -import gwt.material.design.client.ui.table.MaterialDataTable; - -public class CustomizedView extends Composite { - - interface CustomizedViewUiBinder extends UiBinder { - } - private static CustomizedViewUiBinder uiBinder = GWT.create(CustomizedViewUiBinder.class); - - private List users; - - @UiField - MaterialDataTable table; - - - public CustomizedView() { - initWidget(uiBinder.createAndBindUi(this)); - setupTable(); - } - - - public void setupTable() { -// MaterialIcon icon = new MaterialIcon(); -// icon.setPadding(4); -// icon.setIconType(IconType.ADD_CIRCLE_OUTLINE); -// -// icon.addClickHandler(new ClickHandler() { -// -// @Override -// public void onClick(ClickEvent event) { -// users.add(0, new DataGenerator().generateUsers(1).get(0)); -// setData(users); -// -// } -// }); -// table.setWaves(null); -// table.setUseStickyHeader(false); - //table.getScaffolding().getToolPanel().add(icon); - -// MaterialIcon delete = new MaterialIcon(); -// delete.setPadding(4); -// delete.setIconType(IconType.DELETE); -// table.getScaffolding().getToolPanel().add(delete); -// -// delete.addClickHandler(new ClickHandler() { -// -// @Override -// public void onClick(ClickEvent event) { -// User user = table.getView().getSelectedRowModels(true).get(0); -// users.remove(user); -// setData(users); -// -// } -// }); - -// table.addColumn("Image", new WidgetColumn() { -// @Override -// public MaterialPanel getValue(User object) { -// MaterialPanel panel = new MaterialPanel(); -// MaterialImage image = new MaterialImage(); -// // image.setUrl(object.getImage()); -// image.setWidth("32px"); -// image.setHeight("32px"); -// image.setCircle(true); -// panel.add(image); -// return panel; -// } -// }); - - table.addColumn("Title", new gwt.material.design.client.ui.table.cell.TextColumn() { - @Override - public String getValue(CatalogueDataset object) { - return object.getTitle(); - } - - @Override - public boolean sortable() { - return true; - } - }); - -// table.addColumn("Option", new WidgetColumn() { -// @Override -// public MaterialListBox getValue(User object) { -// MaterialListBox listBox = new MaterialListBox(); -// listBox.addItem("Option 1"); -// listBox.addItem("Option 2"); -// listBox.addItem("Option 3"); -// return listBox; -// } -// }).width(200); - - table.addColumn("Author", new gwt.material.design.client.ui.table.cell.TextColumn() { - @Override - public String getValue(CatalogueDataset object) { - return object.getAuthor(); - } - @Override - public boolean sortable() { - return true; - } - }); - - table.addRowSelectHandler(new RowSelectHandler() { - - @Override - public void onRowSelect(RowSelectEvent event) { - log("RowSelectEvent", event.getModel().getName() + ": " + event.isSelected()); - - } - }); - - table.addColumnSortHandler(new ColumnSortHandler() { - - @Override - public void onColumnSort(gwt.material.design.client.data.events.ColumnSortEvent event) { - log("ColumnSortEvent", - "Sorted: " + event.getSortContext().getSortDir() + ", columnIndex: " + event.getColumnIndex()); - table.getView().refresh(); - - } - }); - - /* - * // Add category opened handler, called when a category is opened. - * table.addCategoryOpenedHandler(event -> { log("CategoryOpenedEvent", - * "Category Opened: " + event.getName()); }); - * - * // Add category closed handler, called when a category is closed. - * table.addCategoryClosedHandler(event -> { log("CategoryClosedEvent", - * "Category Closed: " + event.getName()); }); - * - * // Add a row double click handler, called when a row is double clicked. - * table.addRowDoubleClickHandler(event -> { log("RowDoubleClickEvent", - * "Row Double Clicked: " + event.getModel().getName() + ", x:" + - * event.getMouseEvent().getPageX() + ", y: " + - * event.getMouseEvent().getPageY()); }); - * - * // Configure the tables long press duration configuration. // The short press - * is when a click is held less than this duration. - * table.setLongPressDuration(400); - * - * // Add a row long press handler, called when a row is long pressed. - * table.addRowLongPressHandler(event -> { log("RowLongPressEvent", - * "Row Long Pressed: " + event.getModel().getName() + ", x:" + - * event.getMouseEvent().getPageX() + ", y: " + - * event.getMouseEvent().getPageY()); }); - * - * // Add a row short press handler, called when a row is short pressed. - * table.addRowShortPressHandler(event -> { log("RowShortPressEvent", - * "Row Short Pressed: " + event.getModel().getName() + ", x:" + - * event.getMouseEvent().getPageX() + ", y: " + - * event.getMouseEvent().getPageY()); }); - * - * // Add rendered handler, called when 'setRowData' calls finish rendering. // - * Guaranteed to only be called once from the data set render, ignoring sort - * renders and refreshView renders. table.addRenderedHandler(e -> { - * log("RenderedEvent", "Table Rendered"); }); - * - * // Add components rendered handler, Called each time when components are - * rendered, // which includes sorting renders and refreshView() renders. - * table.addComponentsRenderedHandler(e -> { log("ComponentsRenderedEvent", - * "Data Table Components Rendered"); }); - */ - } - - protected void log(String eventName, String description) { - GWT.log(description); - } - - - public void setData(List users) { - this.users = users; - // Customized Table Scaffolding elements - table.getTableTitle().setText("Customers"); - table.setRowData(0, users); - table.getView().refresh(); - } - -// @Override -// public void setupOptions() { -// // Table Name -// tableName.addKeyUpHandler(event -> table.getTableTitle().setText(tableName.getValue())); -// -// // Selection Type -// selectionType.add(SelectionType.NONE); -// selectionType.add(SelectionType.SINGLE); -// selectionType.add(SelectionType.MULTIPLE); -// selectionType.addValueChangeHandler(event -> table.setSelectionType(event.getValue())); -// selectionType.setValue(SelectionType.SINGLE, true); -// // Density -// } -// -// @UiHandler("stickyHeader") -// void stickyHeader(ValueChangeEvent event) { -// table.setUseStickyHeader(event.getValue()); -// } -// -// @UiHandler("striped") -// void striped(ValueChangeEvent event) { -// if (event.getValue()) { -// table.getScaffolding().getTable().addStyleName("striped"); -// } else { -// table.getScaffolding().getTable().removeStyleName("striped"); -// } -// } - - public void reload() { - table.getView().setRedraw(true); - table.getView().refresh(); - } -} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.ui.xml deleted file mode 100644 index 899c663..0000000 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.ui.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTable.css b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTable.css new file mode 100644 index 0000000..c0939d4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTable.css @@ -0,0 +1,110 @@ +@def selectionBorderWidth 1px ; .cellTableWidget { + +} + +.cellTableFirstColumn { + +} + +.cellTableLastColumn { + +} + +.cellTableFooter { + +} + +.cellTableHeader { +} + +.cellTableCell { + +} + +.cellTableFirstColumnFooter { + +} + +.cellTableFirstColumnHeader { + +} + +.cellTableLastColumnFooter { + +} + +.cellTableLastColumnHeader { + +} + +.cellTableSortableHeader { + +} + +.cellTableSortableHeader:hover { + +} + +.cellTableSortedHeaderAscending { + +} + +.cellTableSortedHeaderDescending { + +} + +.cellTableEvenRow { + +} + +.cellTableEvenRowCell { + +} + +.cellTableOddRow { + +} + +.cellTableOddRowCell { + +} + +.cellTableHoveredRow { + background: #D9EDF7 !important; + cursor: pointer; +} + +.cellTableHoveredRowCell { + background: #D9EDF7 !important; + cursor: pointer; +} + +.cellTableKeyboardSelectedRow, .cellTableKeyboardSelectedRow td, .cellTableKeyboardSelectedRow th { + background: #3A87AD !important; +} + +.cellTableSelectedRow, .cellTableSelectedRow td, .cellTableSelectedRow th + { + /* background: #D9EDF7 !important; */ + /* color: white !important; */ + /* height: auto; */ + /* overflow: auto; */ + +} + +.cellTableSelectedRowCell, .cellTableSelectedRow td.cellTableSelectedRowCell { + background: #3A87AD !important; +} + +.cellTableKeyboardSelectedRowCell, .cellTableKeyboardSelectedRow td.cellTableKeyboardSelectedRowCell{ + background: #3A87AD !important; +} + +.cellTableKeyboardSelectedCell, .cellTableKeyboardSelectedRow td.cellTableKeyboardSelectedCell{ + background: #3A87AD !important; + color: white !important; +} + +.cellTableLoading { + margin: 30px; +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTableResources.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTableResources.java new file mode 100644 index 0000000..36eb66c --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTableResources.java @@ -0,0 +1,23 @@ +/** + * + */ +package org.gcube.portlets.widgets.ckancontentmoderator.client.resources; + +import com.github.gwtbootstrap.client.ui.CellTable; +import com.github.gwtbootstrap.client.ui.CellTable.Resources; +import com.google.gwt.core.shared.GWT; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 23, 2015 + */ +public interface CellTableResources extends Resources { + + public CellTableResources INSTANCE = GWT.create(CellTableResources.class); + + // The styles used in this widget. + @Override + @Source("CellTable.css") + CellTable.Style cellTableStyle(); +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorIcons.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorIcons.java new file mode 100644 index 0000000..a24b08f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorIcons.java @@ -0,0 +1,56 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.resources; + +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; + +/** + * The Interface WorkspaceExplorerIcons. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + */ +public interface ContentModeratorIcons extends ClientBundle { + + /** + * Cancel. + * + * @return the image resource + */ + @Source("cancel.png") + ImageResource cancel(); + + /** + * Loading. + * + * @return the image resource + */ + @Source("loading.gif") + ImageResource loading(); + + /** + * Our sample image icon. Makes the image resource for the gwt-compiler's css + * composer accessible + * + * @return the image resource + */ + @Source("loading.gif") + ImageResource logo(); + + /** + * Info. + * + * @return the image resource + */ + @Source("info-icon.png") + ImageResource info(); + + /** + * Info square. + * + * @return the image resource + */ + + @Source("info-square.png") + ImageResource infoSquare(); +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorWidgetResources.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorWidgetResources.java new file mode 100644 index 0000000..9763cc6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorWidgetResources.java @@ -0,0 +1,56 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * The Class ContentModeratorWidgetResources. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + */ +public class ContentModeratorWidgetResources { + + public static final ContentModeratorIcons ICONS = GWT.create(ContentModeratorIcons.class); + + /** + * Gets the icon cancel. + * + * @return the icon cancel + */ + public static AbstractImagePrototype getIconCancel() { + + return AbstractImagePrototype.create(ICONS.cancel()); + } + + /** + * Gets the icon loading. + * + * @return the icon loading + */ + public static AbstractImagePrototype getIconLoading() { + + return AbstractImagePrototype.create(ICONS.loading()); + } + + /** + * Gets the icon info. + * + * @return the icon info + */ + public static AbstractImagePrototype getIconInfo() { + + return AbstractImagePrototype.create(ICONS.info()); + } + + /** + * Gets the icon info square. + * + * @return the icon info square + */ + public static AbstractImagePrototype getIconInfoSquare() { + + return AbstractImagePrototype.create(ICONS.infoSquare()); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/DataTableClientBundle.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/DataTableClientBundle.java deleted file mode 100644 index e3ae05f..0000000 --- a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/DataTableClientBundle.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.gcube.portlets.widgets.ckancontentmoderator.client.resources; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.TextResource; - -/** - * Client Bundle for Icon Morph component - * @author kevzlou7979 - */ -public interface DataTableClientBundle extends ClientBundle { - - DataTableClientBundle INSTANCE = GWT.create(DataTableClientBundle.class); - - @Source("css/data-table.css") - TextResource dataTable(); -} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/cancel.png b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/cancel.png new file mode 100644 index 0000000..9aa895b Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/cancel.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/folder.png b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/folder.png new file mode 100644 index 0000000..db75e8d Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/folder.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-icon.png b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-icon.png new file mode 100644 index 0000000..ad1e096 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-icon.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-square.png b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-square.png new file mode 100644 index 0000000..c4a1251 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-square.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info.png b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info.png new file mode 100644 index 0000000..145ed1d Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/loading.gif b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/loading.gif new file mode 100644 index 0000000..e147426 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/loading.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/SelectionItem.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/SelectionItem.java new file mode 100644 index 0000000..1a17752 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/SelectionItem.java @@ -0,0 +1,24 @@ +/** + * + */ +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui; + + + +/** + * The Interface SelectionItem. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Apr 28, 2016 + */ +public interface SelectionItem { + + /** + * Gets the selected item. + * + * @param the generic type + * @return the selected item + */ + T getSelectedItem(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/AbstractItemsCellTable.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/AbstractItemsCellTable.java new file mode 100644 index 0000000..8cf51a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/AbstractItemsCellTable.java @@ -0,0 +1,202 @@ +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table; + +import java.util.List; + +import org.gcube.portlets.widgets.ckancontentmoderator.client.events.ClickItemEvent; + +import com.github.gwtbootstrap.client.ui.Pagination; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.dom.client.Style.BorderStyle; +import com.google.gwt.event.dom.client.ContextMenuEvent; +import com.google.gwt.event.dom.client.ContextMenuHandler; +import com.google.gwt.event.dom.client.DoubleClickEvent; +import com.google.gwt.event.dom.client.DoubleClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; +import com.google.gwt.user.cellview.client.SimplePager; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.MenuBar; +import com.google.gwt.user.client.ui.MenuItem; +import com.google.gwt.view.client.AbstractDataProvider; +import com.google.gwt.view.client.AsyncDataProvider; +import com.google.gwt.view.client.ListDataProvider; +import com.google.gwt.view.client.SelectionChangeEvent; +import com.google.gwt.view.client.SelectionChangeEvent.Handler; +import com.google.gwt.view.client.SingleSelectionModel; + +/** + * The Class AbstractItemsCellTable. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jul 11, 2017 + * @param the generic type + */ +public abstract class AbstractItemsCellTable { + + protected SortedCellTable sortedCellTable; + protected T itemContextMenu = null; + protected boolean fireEventOnClick = true; + protected SingleSelectionModel ssm; + protected HandlerManager eventBus; + + /** + * Inits the table. + * + * @param pager the pager + * @param pagination the pagination + * @param dataProvider the data provider + */ + public abstract void initTable(final SimplePager pager, final Pagination pagination, + AbstractDataProvider dataProvider); + + /** + * Inits the abstract table. + * + * @param eventBus the event bus + * @param fireOnClick the fire on click + * @param dataProvider the data provider + * @param pageSize the page size + */ + protected void initAbstractTable(HandlerManager eventBus, boolean fireOnClick, AbstractDataProvider dataProvider, + int pageSize) { + this.eventBus = eventBus; + this.fireEventOnClick = fireOnClick; + sortedCellTable = new SortedCellTable(pageSize, dataProvider); + sortedCellTable.addStyleName("table-cms-widget"); +// cellTable.getElement().getStyle().setOverflow(Overflow.HIDDEN); + sortedCellTable.addStyleName("table-cms-widget-vertical-middle"); + sortedCellTable.setStriped(true); + sortedCellTable.setCondensed(true); + sortedCellTable.setWidth("100%", true); +// dataProvider.addDataDisplay(sortedCellTable); +// initTable(cellTable, null, null); + sortedCellTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); + + ssm = new SingleSelectionModel(); + sortedCellTable.setSelectionModel(ssm); + ssm.addSelectionChangeHandler(new Handler() { + @Override + public void onSelectionChange(final SelectionChangeEvent event) { + final T selectedObject = ssm.getSelectedObject(); + if (selectedObject != null) { + GWT.log("Clicked: " + selectedObject); +// selectedItem(selectedObject); + if (fireEventOnClick) + AbstractItemsCellTable.this.eventBus.fireEvent(new ClickItemEvent(selectedObject)); + } + } + }); + + sortedCellTable.addDomHandler(new DoubleClickHandler() { + + @Override + public void onDoubleClick(final DoubleClickEvent event) { + T selected = ssm.getSelectedObject(); + if (selected != null) { + GWT.log("Double Click: " + selected); + // AbstractItemsCellTable.this.eventBus.fireEvent(new + // org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEvent(selected)); + } + } + }, DoubleClickEvent.getType()); + + MenuBar options = new MenuBar(true); + ScheduledCommand openCommand = new ScheduledCommand() { + + @Override + public void execute() { + GWT.log("Context menu shown: " + itemContextMenu); + // AbstractItemsCellTable.this.eventBus.fireEvent(new + // org.gcube.portlets.widgets.wsexplorer.client.event.LoadFolderEvent(itemContextMenu)); + } + }; + + MenuItem openItem = new MenuItem("Open", openCommand); + options.addItem(openItem); + final DialogBox menuWrapper = new DialogBox(true); + menuWrapper.getElement().getStyle().setBorderStyle(BorderStyle.NONE); + menuWrapper.getElement().getStyle().setZIndex(10000); + menuWrapper.add(options); + sortedCellTable.sinkEvents(Event.ONCONTEXTMENU); + + sortedCellTable.addHandler(new ContextMenuHandler() { + @Override + public void onContextMenu(ContextMenuEvent event) { + } + }, ContextMenuEvent.getType()); + + } + + /** + * Update items. + * + * @param items the items + * @param removeOldItems the remove old items + */ + public void updateItems(List items, boolean removeOldItems) { + + if (removeOldItems) { +// dataProvider.getList().clear(); + ssm.clear(); + } + + sortedCellTable.setList(items); +// dataProvider.flush(); +// dataProvider.refresh(); + + sortedCellTable.setPageSize(items.size() + 1); + sortedCellTable.redraw(); + } + + /** + * Gets the cell tables. + * + * @return the cell tables + */ + public SortedCellTable getCellTable() { + return sortedCellTable; + } + + /** + * Checks if is fire event on click. + * + * @return the fireEventOnClick + */ + public boolean isFireEventOnClick() { + + return fireEventOnClick; + } + + /** + * @param fireEventOnClick the fireEventOnClick to set + */ + public void setFireEventOnClick(boolean fireEventOnClick) { + + this.fireEventOnClick = fireEventOnClick; + } + + /** + * Adds the items. + * + * @param items the items + */ + public void addItems(List items) { + + AbstractDataProvider dataProvider = sortedCellTable.getDataProvider(); + + if (dataProvider instanceof ListDataProvider) { + List ldp = ((ListDataProvider) dataProvider).getList(); + for (int i = 0; i < items.size(); i++) { + ldp.add(i, items.get(i)); + } + + sortedCellTable.setPageSize(items.size() + 1); + sortedCellTable.redraw(); + } else if (dataProvider instanceof AsyncDataProvider) { + + // TODO ??? + + } + } +} 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 new file mode 100644 index 0000000..b46799d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/ItemsTable.java @@ -0,0 +1,487 @@ +/** + * + */ +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import org.gcube.portlets.widgets.ckancontentmoderator.client.ContentModeratorWidgetConstants; +import org.gcube.portlets.widgets.ckancontentmoderator.client.resources.ContentModeratorWidgetResources; +import org.gcube.portlets.widgets.ckancontentmoderator.client.ui.SelectionItem; +import org.gcube.portlets.widgets.ckancontentmoderator.shared.CatalogueDataset; + +import com.github.gwtbootstrap.client.ui.Pagination; +import com.google.gwt.cell.client.ButtonCell; +import com.google.gwt.cell.client.DateCell; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.user.cellview.client.Column; +import com.google.gwt.user.cellview.client.ColumnSortEvent; +import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo; +import com.google.gwt.user.cellview.client.SimplePager; +import com.google.gwt.user.cellview.client.TextColumn; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.view.client.AbstractDataProvider; +import com.google.gwt.view.client.ListDataProvider; + +// TODO: Auto-generated Javadoc +/** + * The Class ItemsTable. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + * @param the generic type + */ +public class ItemsTable extends AbstractItemsCellTable implements SelectionItem { + + // private Column icon; + private TextColumn type; + private TextColumn name; + private TextColumn title; + private TextColumn author; + public DateTimeFormat dtformat = DateTimeFormat.getFormat("dd MMM hh:mm aaa yyyy"); + public ImageResource info = ContentModeratorWidgetResources.ICONS.infoSquare(); + + private AbstractDataProvider dataProvider; + + /** + * The Enum DISPLAY_FIELD. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 1, 2016 + */ + public static enum DISPLAY_FIELD { + TYPE, NAME, TITLE, AUTHOR, CREATED + }; + + private List displayFields; + private Column dateColumn; + // private List displayProperties; + // private boolean showGcubeItemsInfo; + private DISPLAY_FIELD startSortByColumn; + private boolean isAsyncronusTable; + + + /** + * Instantiates a new items table. + * + * @param eventBus the event bus + * @param fields the fields + * @param startSortByColumn the start sort by column + */ + public ItemsTable(HandlerManager eventBus, DISPLAY_FIELD[] fields, + DISPLAY_FIELD startSortByColumn) { + this.eventBus = eventBus; + this.startSortByColumn = startSortByColumn; + setDisplayFields(fields); + } + + /** + * Update items. + * + * @param items the items + * @param removeOldItems the remove old items + */ + /* + * (non-Javadoc) + * + * @see + * org.gcube.portlets.widgets.wsexplorer.client.view.grid.AbstractItemsCellTable + * #updateItems(java.util.List, boolean) + */ + public void updateItems(List items, boolean removeOldItems) { + super.updateItems(items, removeOldItems); + } + + /** + * Adds the items. + * + * @param items the items + */ + public void addItems(List items) { + super.addItems(items); + } + + /** + * Inits the table. + * + * @param pager the pager + * @param pagination the pagination + * @param dataProvider the data provider + */ + /* + * (non-Javadoc) + * + * @see org.gcube.portlets.admin.gcubereleases.client.view.AbstractPackageTable# + * initTable(com.google.gwt.user.cellview.client.AbstractCellTable, + * com.google.gwt.user.cellview.client.SimplePager, + * com.github.gwtbootstrap.client.ui.Pagination) + */ + @Override + public void initTable(final SimplePager pager, final Pagination pagination, AbstractDataProvider dataProvider) { + this.dataProvider = dataProvider; + initAbstractTable(eventBus, fireEventOnClick, dataProvider, ContentModeratorWidgetConstants.ITEMS_PER_PAGE); + this.dataProvider.addDataDisplay(sortedCellTable); + + // this.isAsyncronusTable = dataProvider instanceof + // AbstractDataProvider?true:false; + this.isAsyncronusTable = dataProvider instanceof ListDataProvider ? false : true; + + // sortedCellTable.setEmptyTableWidget(new + // Label(WorkspaceExplorerConstants.WORKSPACE_FOLDER_EMPTY_MESSAGE)); + setEmptyTableMessage(ContentModeratorWidgetConstants.NO_DATA); + + if (this.displayFields.contains(DISPLAY_FIELD.TYPE)) { + + // NAME + type = new TextColumn() { + @Override + public String getValue(T object) { + if (object == null) + return ""; + return ((CatalogueDataset) object).getType(); + } + + // ADDING TOOLTIP + @Override + public void render(com.google.gwt.cell.client.Cell.Context context, T object, SafeHtmlBuilder sb) { + if (object == null) + return; + sb.appendHtmlConstant("
"); + super.render(context, object, sb); + sb.appendHtmlConstant("
"); + }; + }; + + sortedCellTable.addColumn(name, "Type", true); + + if (!isAsyncronusTable) { + Comparator c = new Comparator() { + @Override + public int compare(T o1, T o2) { + return ((CatalogueDataset) o1).getType().compareTo(((CatalogueDataset) o2).getType()); + } + }; + + sortedCellTable.setComparator(type, c); + } + + } + +// if (this.displayFields.contains(DISPLAY_FIELD.ICON)) { +// // ICONS +// ImageResourceCell iconResourceCell = new ImageResourceCell() { +// public Set getConsumedEvents() { +// HashSet events = new HashSet(); +// events.add("click"); +// return events; +// } +// }; +// +// icon = new Column(iconResourceCell) { +// @Override +// public ImageResource getValue(T dataObj) { +// return Util.getImage(dataObj); +// } +// +// /* +// * (non-Javadoc) +// * +// * @see +// * com.google.gwt.user.cellview.client.Column#render(com.google.gwt.cell.client. +// * Cell.Context, java.lang.Object, +// * com.google.gwt.safehtml.shared.SafeHtmlBuilder) +// */ +// @Override +// public void render(Context context, T object, SafeHtmlBuilder sb) { +// super.render(context, object, sb); +// +// } +// }; +//// icon.setSortable(false); +// sortedCellTable.addColumn(icon, "", false); +// sortedCellTable.setColumnWidth(icon, 32.0, Unit.PX); +// } + + if (this.displayFields.contains(DISPLAY_FIELD.NAME)) { + + // NAME + name = new TextColumn() { + @Override + public String getValue(T object) { + if (object == null) + return ""; + return ((CatalogueDataset) object).getName(); + } + + // ADDING TOOLTIP + @Override + public void render(com.google.gwt.cell.client.Cell.Context context, T object, SafeHtmlBuilder sb) { + if (object == null) + return; + sb.appendHtmlConstant("
"); + super.render(context, object, sb); + sb.appendHtmlConstant("
"); + }; + }; + + sortedCellTable.addColumn(name, "Name", true); + + if (!isAsyncronusTable) { + Comparator c = new Comparator() { + @Override + public int compare(T o1, T o2) { + return ((CatalogueDataset) o1).getName().compareTo(((CatalogueDataset) o2).getName()); + } + }; + + sortedCellTable.setComparator(name, c); + } + + } + + if (this.displayFields.contains(DISPLAY_FIELD.TITLE)) { + + title = new TextColumn() { + @Override + public String getValue(T object) { + if (object == null) + return ""; + return ((CatalogueDataset) object).getTitle() != null ? ((CatalogueDataset) object).getTitle() : ""; + } + }; + + sortedCellTable.addColumn(title, "Title", true); + + if (!isAsyncronusTable) { + Comparator c = new Comparator() { + @Override + public int compare(T o1, T o2) { + return ((CatalogueDataset) o1).getTitle().compareTo(((CatalogueDataset) o2).getTitle()); + } + }; + sortedCellTable.setComparator(title, c); + } + + } + + if (this.displayFields.contains(DISPLAY_FIELD.AUTHOR)) { + + author = new TextColumn() { + @Override + public String getValue(T object) { + if (object == null) + return ""; + return ((CatalogueDataset) object).getAuthor() != null ? ((CatalogueDataset) object).getAuthor() + : ""; + } + }; + + sortedCellTable.addColumn(author, "Title", true); + + if (!isAsyncronusTable) { + Comparator c = new Comparator() { + @Override + public int compare(T o1, T o2) { + return ((CatalogueDataset) o1).getAuthor().compareTo(((CatalogueDataset) o2).getAuthor()); + } + }; + sortedCellTable.setComparator(author, c); + } + + } + + if (this.displayFields.contains(DISPLAY_FIELD.AUTHOR)) { + + DateCell date = new DateCell(dtformat); + dateColumn = new Column(date) { + + @Override + public Date getValue(T object) { + if (object == null) + return null; + + return new Date(((CatalogueDataset) object).getCreated()); + } + }; + sortedCellTable.addColumn(dateColumn, "Created", 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).getCreated()); + Date d2 = new Date(((CatalogueDataset) o2).getCreated()); + + // 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(dateColumn, c); + } + + } + + GWT.log("startSortByColumn: " + startSortByColumn); + + if (startSortByColumn != null) + switch (startSortByColumn) { + case NAME: + if (this.displayFields.contains(DISPLAY_FIELD.NAME)) { + sortedCellTable.setInitialSortColumn(name); + } + break; + case TITLE: + if (this.displayFields.contains(DISPLAY_FIELD.TITLE)) { + sortedCellTable.setInitialSortColumn(title); + } + break; + case AUTHOR: + if (this.displayFields.contains(DISPLAY_FIELD.AUTHOR)) { + sortedCellTable.setDefaultSortOrder(dateColumn, false); // sorts ascending on first click + sortedCellTable.setInitialSortColumn(dateColumn); + GWT.log("sortedCellTable: " + sortedCellTable); + } + break; + default: + break; + } + + /* + * final SingleSelectionModel selectionModel = new + * SingleSelectionModel(); selectionModel.addSelectionChangeHandler(new + * Handler() { + * + * @Override public void onSelectionChange(SelectionChangeEvent event) { } }); + */ + } + + /** + * Displays the appropriate sorted icon in the header of the column for the + * given index. + * + * @param columnIndex of the column to mark as sorted + * @param ascending true for ascending icon, false + * for descending icon + */ + public void setSortedColumn(int columnIndex, boolean ascending) { + GWT.log("Column index: " + columnIndex); + GWT.log("ascending: " + ascending); + Column column = sortedCellTable.getColumn(columnIndex); + if (column != null && column.isSortable()) { + ColumnSortInfo info = sortedCellTable.getColumnSortList().push(column); +// ColumnSortEvent.fire(cellTable, cellTable.getColumnSortList()); + GWT.log("info.isAscending(): " + info.isAscending()); + if (info.isAscending() != ascending) { + sortedCellTable.getColumnSortList().push(column); + ColumnSortEvent.fire(sortedCellTable, sortedCellTable.getColumnSortList()); + } + } + } + + /** + * Sets the display fields. + * + * @param fields the new display fields + */ + public void setDisplayFields(DISPLAY_FIELD[] fields) { + this.displayFields = fields != null && fields.length > 0 ? Arrays.asList(fields) + : Arrays.asList(DISPLAY_FIELD.values()); + } + + /** + * Reset columns table. + */ + public void reInitColumnsTable() { + int count = sortedCellTable.getColumnCount(); + for (int i = 0; i < count; i++) { + sortedCellTable.removeColumn(0); + } + initTable(null, null, dataProvider); + } + + /** + * Gets the display fields. + * + * @return the displayFields + */ + public List getDisplayFields() { + return displayFields; + } + + /** + * The Class ButtonImageCell. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 1, 2016 + */ + public class ButtonImageCell extends ButtonCell { + + /** + * Render. + * + * @param context the context + * @param value the value + * @param sb the sb + */ + /* + * (non-Javadoc) + * + * @see + * com.google.gwt.cell.client.AbstractSafeHtmlCell#render(com.google.gwt.cell. + * client.Cell.Context, java.lang.Object, + * com.google.gwt.safehtml.shared.SafeHtmlBuilder) + */ + @Override + public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) { + SafeHtml html = SafeHtmlUtils.fromTrustedString(new Image(value).toString()); + sb.append(html); + } + } + + /** + * Gets the selected item. + * + * @return the selected item + */ + /* + * (non-Javadoc) + * + * @see org.gcube.portlets.widgets.wsexplorer.client.notification. + * SelectionItemHandler#getSelectionItem() + */ + @Override + public T getSelectedItem() { + return ssm.getSelectedObject(); + } + + /** + * Sets the empty table message. + * + * @param msg the new empty table message + */ + public void setEmptyTableMessage(String msg) { + msg = msg != null ? msg : ContentModeratorWidgetConstants.NO_DATA; + if (sortedCellTable != null) + sortedCellTable.setEmptyTableWidget(new Label(msg)); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/MyToolTipColumn.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/MyToolTipColumn.java new file mode 100644 index 0000000..92e359b --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/MyToolTipColumn.java @@ -0,0 +1,83 @@ +/** + * + */ + +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table; + +import com.google.gwt.cell.client.Cell; +import com.google.gwt.cell.client.Cell.Context; +import com.google.gwt.core.client.GWT; +import com.google.gwt.safehtml.client.SafeHtmlTemplates; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.cellview.client.Column; + +// TODO: Auto-generated Javadoc +/** + * The Class MyToolTipColumn. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + * @param the generic type + * @param the generic type + */ +public abstract class MyToolTipColumn extends Column { + + /** + * The Interface Templates. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + */ + interface Templates extends SafeHtmlTemplates { + + /** + * Start tool tip. + * + * @param toolTipText the tool tip text + * @return the safe html + */ + @Template("
") + SafeHtml startToolTip(String toolTipText); + + /** + * End tool tip. + * + * @return the safe html + */ + @Template("
") + SafeHtml endToolTip(); + } + + private static final Templates TEMPLATES = GWT.create(Templates.class); + private final String toolTipText; + + /** + * Instantiates a new my tool tip column. + * + * @param cell the cell + * @param toolTipText the tool tip text + */ + public MyToolTipColumn(final Cell cell, final String toolTipText) { + + super(cell); + this.toolTipText = toolTipText; + } + + /** + * Render. + * + * @param context the context + * @param object the object + * @param sb the sb + */ + @Override + public void render(final Context context, final T object, final SafeHtmlBuilder sb) { + + sb.append(TEMPLATES.startToolTip(toolTipText)); + super.render(context, object, sb); + sb.append(TEMPLATES.endToolTip()); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/SortedCellTable.java b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/SortedCellTable.java new file mode 100644 index 0000000..951a137 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/SortedCellTable.java @@ -0,0 +1,260 @@ +/** + * + */ + +package org.gcube.portlets.widgets.ckancontentmoderator.client.ui.table; + +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portlets.widgets.ckancontentmoderator.client.resources.CellTableResources; + +import com.github.gwtbootstrap.client.ui.CellTable; +import com.google.gwt.user.cellview.client.Column; +import com.google.gwt.user.cellview.client.ColumnSortEvent; +import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; +import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo; +import com.google.gwt.user.cellview.client.Header; +import com.google.gwt.view.client.AbstractDataProvider; +import com.google.gwt.view.client.ListDataProvider; + + +/** + * The Class SortedCellTable. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Jun 15, 2021 + * @param the generic type + */ +public class SortedCellTable extends CellTable { + + /** + * To keep track of the currently sorted column + */ + private Column currentlySortedColumn; + /** + * Tells us which way to sort a column initially + */ + private Map, Boolean> defaultSortOrderMap = new HashMap, Boolean>(); + /** + * Comparators associated with their columns + */ + private Map, Comparator> comparators = new HashMap, Comparator>(); + /** + * Column to sort when the data provider's list is refreshed using + * {@link SortedCellTable#setList(List)} + */ + private Column initialSortColumn; + /** + * Data provider we will attach to this table + */ + private AbstractDataProvider dataProvider; + + /** + * Special column sorting handler that will allow us to do more controlled + * sorting + */ + private ListHandler columnSortHandler; + + + /** + * Instantiates a new sorted cell table. + * + * @param pageSize the page size + * @param dataProv the data prov + */ + public SortedCellTable(int pageSize, AbstractDataProvider dataProv) { + super(1,CellTableResources.INSTANCE); + this.dataProvider = dataProv; + + if(this.dataProvider instanceof ListDataProvider){ + columnSortHandler = new ListHandler(((ListDataProvider) this.dataProvider).getList()) { + + @Override + public void onColumnSort(ColumnSortEvent event) { + + @SuppressWarnings("unchecked") + Column column = (Column) event.getColumn(); + if (column == null) { + return; + } + if (column.equals(currentlySortedColumn)) { + // Default behavior + super.onColumnSort(event); + } + else { + // Initial sort; look up which direction we need + final Comparator comparator = comparators.get(column); + if (comparator == null) { + return; + } + Boolean ascending = defaultSortOrderMap.get(column); + if (ascending == null || ascending) { + // Default behavior + super.onColumnSort(event); + } + else { + // Sort the column descending + Collections.sort(getList(), new Comparator() { + + public int compare(T o1, T o2) { + + return -comparator.compare(o1, o2); + } + }); + // Set the proper arrow in the header + getColumnSortList().push(new ColumnSortInfo(column, false)); + } + currentlySortedColumn = column; + } + } + + @Override + public void setComparator(Column column, Comparator comparator) { + + comparators.put(column, comparator); + super.setComparator(column, comparator); + } + }; + + addColumnSortHandler(columnSortHandler); + } + + + } + + /** + * Adds a column to the table and sets its sortable state. + * + * @param column the column + * @param headerName the header name + * @param sortable the sortable + */ + public void addColumn(Column column, String headerName, boolean sortable) { + + addColumn(column, headerName); + column.setSortable(sortable); + if (sortable) { + defaultSortOrderMap.put(column, true); + } + } + + /** + * Adds the column. + * + * @param column the column + * @param headerName the header name + */ + /* (non-Javadoc) + * @see com.google.gwt.user.cellview.client.AbstractCellTable#addColumn(com.google.gwt.user.cellview.client.Column, java.lang.String) + */ + public void addColumn(Column column, String headerName) { + + super.addColumn(column, headerName); + } + + /** + * Adds a column to the table and sets its sortable state. + * + * @param column the column + * @param header the header + * @param sortable the sortable + */ + public void addColumn(Column column, Header header, boolean sortable) { + + addColumn(column, header); + column.setSortable(sortable); + if (sortable) { + defaultSortOrderMap.put(column, true); + } + } + + /** + * Sets the column to sort when the data list is reset using + * {@link SortedCellTable#setList(List)}. + * + * @param column the column + */ + public void setInitialSortColumn(Column column) { + + initialSortColumn = column; + } + + /** + * Sets a comparator to use when sorting the given column. + * + * @param column the column + * @param comparator the comparator + */ + public void setComparator(Column column, Comparator comparator) { + + columnSortHandler.setComparator(column, comparator); + } + + /** + * Sets the sort order to use when this column is clicked and it was not + * previously sorted. + * + * @param column the column + * @param ascending the ascending + */ + public void setDefaultSortOrder(Column column, boolean ascending) { + + defaultSortOrderMap.put(column, ascending); + } + + /** + * Sets the table's data provider list and sorts the table based on the + * column given in {@link SortedCellTable#setInitialSortColumn(Column)}. + * + * @param list the new list + */ + public void setList(List list) { + + if(dataProvider instanceof ListDataProvider){ + List myData = ((ListDataProvider) dataProvider).getList(); + myData.clear(); + if (list != null) { + /*for (T t : list) { + dataProvider.getList().add(t); + }*/ + myData.addAll(list); + } + // Do a first-time sort based on which column was set in + // setInitialSortColumn() + if (initialSortColumn != null) { + Collections.sort(myData, new Comparator() { + + @Override + public int compare(T o1, T o2) { + + return (defaultSortOrderMap.get(initialSortColumn) ? 1 : -1) * comparators.get(initialSortColumn).compare(o1, o2); + } + }); + // Might as well get the little arrow on the header to make it + // official + getColumnSortList().push( + new ColumnSortInfo( + initialSortColumn, + defaultSortOrderMap.get(initialSortColumn))); + + currentlySortedColumn = initialSortColumn; + } + } + } + + + /** + * Gets the data provider. + * + * @return the data provider + */ + public AbstractDataProvider getDataProvider() { + + return dataProvider; + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/public/content-moderator-widget.css b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/public/content-moderator-widget.css new file mode 100644 index 0000000..e6acdcf --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/public/content-moderator-widget.css @@ -0,0 +1,25 @@ +@charset "UTF-8"; + +/*** TABLE ***/ +.table-cms-widget { + word-wrap: break-word; +} + +.table-cms-widget td, th { + overflow: hidden !important; +} + +.table-cms-widget th { + text-align: center !important; +} + +.table-cms-widget-vertical-middle td, th { + height: 50%; + vertical-align: middle !important; +} + +/***** WS EXPLORER DOCK PANEL - CENTER FLOW PANEL *****/ +.we-dock-center-panel { + overflow-y: auto !important; + /* border: 1px solid #DDD; */ +} \ No newline at end of file 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 d244184..8929790 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 @@ -35,6 +35,7 @@ public class CatalogueBeansConverter { myDataset.setTitle(t.getTitle()); myDataset.setType(t.getType()); myDataset.setUrl(t.getUrl()); + myDataset.setCreated(t.getMetadataCreated().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 06d9de7..3cbec96 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 url; private String version; private String ckanDatasetURL; + private long created; /** * Instantiates a new ckan dataset base. @@ -161,6 +162,14 @@ public class CatalogueDataset implements Serializable, IsSerializable { public void setCkanDatasetURL(String ckanDatasetURL) { this.ckanDatasetURL = ckanDatasetURL; } + + public void setCreated(long creationTime) { + this.created = creationTime; + } + + public long getCreated() { + return created; + } @Override public String toString() { @@ -195,6 +204,8 @@ public class CatalogueDataset implements Serializable, IsSerializable { builder.append(version); builder.append(", ckanDatasetURL="); builder.append(ckanDatasetURL); + builder.append(", created="); + builder.append(created); builder.append("]"); return builder.toString(); } diff --git a/src/main/resources/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml b/src/main/resources/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml index 00b14f8..4fdac16 100644 --- a/src/main/resources/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml +++ b/src/main/resources/org/gcube/portlets/widgets/ckancontentmoderator/CkanContentModeratorWidget.gwt.xml @@ -3,21 +3,16 @@ - - - - - - - - + + + - +