From cfa3484421b4cb5f591774680eadef8aae9cd350 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Tue, 15 Jun 2021 12:38:59 +0200 Subject: [PATCH] removed Materials. Moved to GWT-Bootstrap --- CHANGELOG.md | 2 +- pom.xml | 67 +-- .../CkanContentModeratorWidget.gwt.xml | 16 +- .../client/CkanContentModeratorWidget.java | 67 +-- .../CkanContentModeratorWidgetEntryPoint.java | 54 ++ .../ContentModeratorWidgetConstants.java | 16 + .../client/events/ClickItemEvent.java | 50 ++ .../client/events/ClickItemEventHandler.java | 21 + .../client/material/table/CustomizedView.java | 226 -------- .../material/table/CustomizedView.ui.xml | 14 - .../client/resources/CellTable.css | 110 ++++ .../client/resources/CellTableResources.java | 23 + .../resources/ContentModeratorIcons.java | 56 ++ .../ContentModeratorWidgetResources.java | 56 ++ .../resources/DataTableClientBundle.java | 17 - .../client/resources/cancel.png | Bin 0 -> 908 bytes .../client/resources/folder.png | Bin 0 -> 380 bytes .../client/resources/info-icon.png | Bin 0 -> 245 bytes .../client/resources/info-square.png | Bin 0 -> 325 bytes .../client/resources/info.png | Bin 0 -> 260 bytes .../client/resources/loading.gif | Bin 0 -> 8114 bytes .../client/ui/SelectionItem.java | 24 + .../ui/table/AbstractItemsCellTable.java | 202 ++++++++ .../client/ui/table/ItemsTable.java | 487 ++++++++++++++++++ .../client/ui/table/MyToolTipColumn.java | 83 +++ .../client/ui/table/SortedCellTable.java | 260 ++++++++++ .../public/content-moderator-widget.css | 25 + .../server/CatalogueBeansConverter.java | 1 + .../shared/CatalogueDataset.java | 11 + .../CkanContentModeratorWidget.gwt.xml | 15 +- 30 files changed, 1528 insertions(+), 375 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/CkanContentModeratorWidgetEntryPoint.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ContentModeratorWidgetConstants.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEvent.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/events/ClickItemEventHandler.java delete mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.java delete mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/material/table/CustomizedView.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTable.css create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/CellTableResources.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorIcons.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/ContentModeratorWidgetResources.java delete mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/DataTableClientBundle.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/cancel.png create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/folder.png create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-icon.png create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info-square.png create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/info.png create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/resources/loading.gif create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/SelectionItem.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/AbstractItemsCellTable.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/ItemsTable.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/MyToolTipColumn.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/client/ui/table/SortedCellTable.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckancontentmoderator/public/content-moderator-widget.css 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 0000000000000000000000000000000000000000..9aa895bbf38f2303b1039c96f84b204a74281936 GIT binary patch literal 908 zcmV;719SX|P)F7{~vo_uSiCN+Y%uS|>6jKEz1I0J_tJB>NecODCrDtb3ma?D3-L7LZRTjr}v)Sl0bZ!&$siO=l{!j z{^xlJ9uo}(1-VPh%8IRSw;1m0yS?}P`TqZ_BM&EzQo4Dm$J3DaLUp<1auXs+(2_~q z4Fm>*EzO5I5|f9I0PGRKc7WEnT}Pg(t9w^mXeY|QF-(WU;EX}cc0kI>g{~+VZg0PK zJs5m>A4l{7z%i$zadrJ$yEIin@Z8z%-oAkYy})lOpe_Se6+0bY6uweZN<kq9x4&0jsd_qvMY3Fu7wPup86DOK~o|vpZWeDfs`yKX8B`bra( zoShB7zoUXw07dVVKhsMoMeCI=&q<&&E&gi#^WMtEPM-io8eG8i37?%-#&c9RFzCWAxtnwm@FmQB=^Hrx3HzFs=(Mdb)q4+6UZR z37G0ELQ><9|53E}NePg#%}V2TjZ42XeeXTagRf?azGVq!wipimY7=9=1grYd5T{?Z z!T6DlR(d0C($!?DYSzRLY}CJEGF3U2B}JBSZeKpZ%nOa1%L~NV596%*63{*8%kB)} zyOpZ`#vO~0Xq!yAX94SgjkOEJGr7|mu`?YGBYQ1NihUnft2^%#*NUdyUfFa=Wt?2% ze1D6ge>y)%TP;G<7DDQs(M@opk< iJFcpK8rze4xb{EOv{#A~ISFF`0000WFkZsqLGJ(ht=89 z#hsI#D}v$wf42WH6aW2ZU}9nV#5iO9nKi1?qQPv;j10_75X=NJ2#guQ=J2unXJBLa zhs|MM7}e^}{sJ;s@j0KHor%F-mYqRQmH`Lq5GIQQ+!hO%x)_h0ll8dw*5~_9jqSNjzn7nw$9$9j)}gJ9!RsI0**L?} zX2n{Wc$N4(<;nxQlxLP-(bCJGCeh>K^7xp1&TXmwvwL|wfc7zXy85}Sb4q9e0I392 As{jB1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c4a1251a5150e23d6c0a427453eab03a7d294c02 GIT binary patch literal 325 zcmV-L0lNN)P)-@25Jle#6$nu|C&-DM3ozV)0-Ct88yYGuz;J>1U~#7rG>{@T<1r#*7uiay-Fe!t z`6~c@-|wAspTHY1@pmZT+gf|dvg|Bf*X_OcU!l%R4jR~nULJ;lq9_1p+xB<%HDssQ&>Tfk@ccNa4&90fT5IaMMntgIqIIy9 zwXmxM=Nwg4QI;jcFf1SXG$4-SB~R1zHNXvWi)q@n#wOs|_&>nC`$8tV2dt_h!Z?mg z?ws4Qv(mr?cz*<>X-d;H02pJo02gJ9IfjZNLXspTNwO)yT6+|L>qfq`&c>Kip6BNu X1a@656k}1ryO8ObC|<)WRb%k zX{}>iN7gr1@CnR!3Omzrco{O|IFHCW z)J$Qt-@x{WOM#DFlF2y1Oh8}3$#|0@r^B369AAx3Y)R7L@?KbCF19mn!fHphGfa=v zbn4oE&Svb7kv-Ay)j_7?@XEM=Drvr-Ulo|c7z-u%Sic7B5^VpYwMwGlJa-FEgujNs zM@a^Lmzs+ad`qo2o;bKzkVV7GL&2dis7=zTEX|2cB{iMFA>1N)*0Rf@KyNX4y85}S Ib4q9e00*vG{r~^~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e147426f23b581693164b7cdf22fd5f99b15c0ed GIT binary patch literal 8114 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 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 @@ - - - - - - - - + + + - +