You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2024/06/21 16:31:16 UTC
(causeway) branch 3794.table.pagesize.sel updated: CAUSEWAY-3794: wire up page-size choice with hinting system
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 3794.table.pagesize.sel
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/3794.table.pagesize.sel by this push:
new 5da95e88a0 CAUSEWAY-3794: wire up page-size choice with hinting system
5da95e88a0 is described below
commit 5da95e88a0bec8c512b2722870c76911a998e784
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 21 18:31:12 2024 +0200
CAUSEWAY-3794: wire up page-size choice with hinting system
---
.../table/DataTableWithPagesAndFilter.java | 33 ++++++++++--
.../table/head/HeadersToolbarAbstract.java | 10 ++--
.../ui/components/table/head/OrderByBorder.java | 8 +--
.../table/nav/CausewayAjaxNavigationToolbar.java | 9 +++-
.../table/nav/pagesize/PagesizeChooser.html | 10 +++-
.../table/nav/pagesize/PagesizeChooser.java | 59 ++++++++++++++++++++--
6 files changed, 111 insertions(+), 18 deletions(-)
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/DataTableWithPagesAndFilter.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/DataTableWithPagesAndFilter.java
index adf59228c4..cdbf47f370 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/DataTableWithPagesAndFilter.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/DataTableWithPagesAndFilter.java
@@ -35,6 +35,7 @@ public abstract class DataTableWithPagesAndFilter<T, S> extends DataTable<T, S>
private static final long serialVersionUID = 1L;
private static final String UIHINT_PAGE_NUMBER = "pageNumber";
+ private static final String UIHINT_PAGE_SIZE = "pageSize";
protected DataTableWithPagesAndFilter(
final String id,
@@ -58,25 +59,43 @@ public abstract class DataTableWithPagesAndFilter<T, S> extends DataTable<T, S>
uiHintContainer.setHint(this, order.name(), property);
}
+ public final void setPageSizeHintAndBroadcast(final AjaxRequestTarget target) {
+ final UiHintContainer uiHintContainer = getUiHintContainer();
+ if(uiHintContainer == null) return;
+
+ uiHintContainer.setHint(this, UIHINT_PAGE_SIZE, "" + getCurrentPage());
+ }
+
public final void setPageNumberHintAndBroadcast(final AjaxRequestTarget target) {
final UiHintContainer uiHintContainer = getUiHintContainer();
- if(uiHintContainer == null) {
- return;
- }
+ if(uiHintContainer == null) return;
+
uiHintContainer.setHint(this, UIHINT_PAGE_NUMBER, "" + getCurrentPage());
}
@Override
protected void onConfigure() {
super.onConfigure();
+ honorPageSizeHint();
honorPageNumberHint();
}
// -- HELPER
+ private final void honorPageSizeHint() {
+ var uiHintContainer = getUiHintContainer();
+ if(uiHintContainer == null) return;
+
+ parsePageSize(uiHintContainer.getHint(this, UIHINT_PAGE_SIZE))
+ .ifPresent(this::setItemsPerPage);
+ uiHintContainer.setHint(this, UIHINT_PAGE_SIZE, "" + getCurrentPage());
+ // don't broadcast (no AjaxRequestTarget, still configuring initial setup)
+ }
+
private final void honorPageNumberHint() {
var uiHintContainer = getUiHintContainer();
if(uiHintContainer == null) return;
+
parseZeroBasedPageNr(uiHintContainer.getHint(this, UIHINT_PAGE_NUMBER))
.ifPresent(this::setCurrentPage);
uiHintContainer.setHint(this, UIHINT_PAGE_NUMBER, "" + getCurrentPage());
@@ -87,6 +106,13 @@ public abstract class DataTableWithPagesAndFilter<T, S> extends DataTable<T, S>
return UiHintContainer.Util.hintContainerOf(this, UiObjectWkt.class);
}
+ private OptionalLong parsePageSize(final String string) {
+ final long pageSize = _Longs.parseLong(string, 10).orElse(-1);
+ return pageSize>=1L
+ ? OptionalLong.of(pageSize)
+ : OptionalLong.empty();
+ }
+
private OptionalLong parseZeroBasedPageNr(final String string) {
final long zeroBasedPageNr = _Longs.parseLong(string, 10).orElse(-1);
return zeroBasedPageNr>=0L
@@ -94,4 +120,5 @@ public abstract class DataTableWithPagesAndFilter<T, S> extends DataTable<T, S>
: OptionalLong.empty();
}
+
}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
index 3f21827d1e..3a1cb26930 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
@@ -42,6 +42,7 @@ import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.string.Strings;
+import org.apache.causeway.commons.internal.base._Casts;
import org.apache.causeway.core.config.CausewayConfiguration;
import org.apache.causeway.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.TitleColumn;
import org.apache.causeway.viewer.wicket.ui.components.table.CausewayAjaxDataTable;
@@ -111,7 +112,9 @@ abstract class HeadersToolbarAbstract<S> extends AbstractToolbar {
final IColumn<T, S> column = item.getModelObject();
WebMarkupContainer header;
- if (!isDecoratedWithDataTablesNet() && column.isSortable()) {
+ if (!isDecoratedWithDataTablesNet()
+ && column.isSortable()) {
+
header = newSortableHeader("header", column.getSortProperty(), stateLocator);
if (column instanceof IStyledColumn) {
@@ -146,8 +149,9 @@ abstract class HeadersToolbarAbstract<S> extends AbstractToolbar {
}
private boolean isDecoratedWithDataTablesNet() {
- return getTable() instanceof CausewayAjaxDataTable
- && ((CausewayAjaxDataTable) getTable()).isDecoratedWithDataTablesNet();
+ return _Casts.castTo(CausewayAjaxDataTable.class, getTable())
+ .map(CausewayAjaxDataTable::isDecoratedWithDataTablesNet)
+ .orElse(false);
}
private final boolean useIndicatorForSortableColumn;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/OrderByBorder.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/OrderByBorder.java
index 9885b4e59d..7683fb2fc5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/OrderByBorder.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/OrderByBorder.java
@@ -53,9 +53,7 @@ class OrderByBorder<T> extends AjaxFallbackOrderByBorder<T> {
target.add(dataTable);
final UiHintContainer uiHintContainer = getUiHintContainer();
- if(uiHintContainer == null) {
- return;
- }
+ if(uiHintContainer == null) return;
final ISortState<T> state = stateLocator.getSortState();
final SortOrder order = state.getPropertySortOrder(sortProperty);
@@ -71,7 +69,9 @@ class OrderByBorder<T> extends AjaxFallbackOrderByBorder<T> {
dataTable.setCurrentPage(0);
}
- public UiHintContainer getUiHintContainer() {
+ // -- HELPER
+
+ private UiHintContainer getUiHintContainer() {
return UiHintContainer.Util.hintContainerOf(dataTable);
}
}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/CausewayAjaxNavigationToolbar.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/CausewayAjaxNavigationToolbar.java
index 26e4eaa17a..8cdb7e3ec4 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/CausewayAjaxNavigationToolbar.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/CausewayAjaxNavigationToolbar.java
@@ -29,6 +29,7 @@ import org.apache.causeway.viewer.wicket.model.models.HasCommonContext;
import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
import org.apache.causeway.viewer.wicket.model.timetaken.TimeTakenModel;
import org.apache.causeway.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ToggleboxColumn;
+import org.apache.causeway.viewer.wicket.ui.components.table.DataTableWithPagesAndFilter;
import org.apache.causeway.viewer.wicket.ui.components.table.internal._TableUtils;
import org.apache.causeway.viewer.wicket.ui.components.table.nav.pagesize.PagesizeChooser;
import org.apache.causeway.viewer.wicket.ui.components.table.nav.paging.CausewayAjaxPagingNavigator;
@@ -39,14 +40,14 @@ implements HasCommonContext {
private static final long serialVersionUID = 1L;
private static final String NAVIGATOR_CONTAINER_ID = "span";
-
private static final String ID_PAGESIZE_CHOOSER = "pagesizeChooser";
private static final String ID_SHOW_ALL = "showAll";
private static final String HINT_KEY_SHOW_ALL = "showAll";
+
private final ToggleboxColumn toggleboxColumn;
public CausewayAjaxNavigationToolbar(
- final DataTable<?, ?> table,
+ final DataTableWithPagesAndFilter<?, ?> table,
final ToggleboxColumn toggleboxColumn) {
super(table);
@@ -65,6 +66,10 @@ implements HasCommonContext {
honorShowAllHints();
}
+ @Override
+ protected DataTableWithPagesAndFilter<?, ?> getTable() {
+ return (DataTableWithPagesAndFilter<?, ?>) super.getTable();
+ }
// -- HELPER
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.html b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.html
index 9296ac4d4d..bfbb7f1b67 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.html
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.html
@@ -26,7 +26,15 @@
</a>
<ul class="dropdown-menu" role="menu">
<li wicket:id="pagesizeChoices">
- <a class="dropdown-item" tabindex="-1" wicket:id="pagesizeChoice"></a>
+<!-- <a class="dropdown-item" tabindex="-1" wicket:id="pagesizeChoice"></a>-->
+
+ <!-- link entry -->
+ <a href="#" wicket:id="pagesizeChoice" class="dropdown-item">
+ <span wicket:id="viewItemIcon" class="ViewLinkItem"></span>
+ <span wicket:id="viewItemTitle" class="ViewLinkItemTitle">[link title]</span>
+ <!-- <i wicket:id="viewItemCheckmark" class="fa-solid fa-check"></i> -->
+ </a>
+
</li>
</ul>
</div>
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.java
index 252fcedf6a..e2c7eb736f 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/nav/pagesize/PagesizeChooser.java
@@ -18,14 +18,21 @@
*/
package org.apache.causeway.viewer.wicket.ui.components.table.nav.pagesize;
+import java.io.Serializable;
import java.util.List;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.causeway.viewer.wicket.ui.components.table.DataTableWithPagesAndFilter;
import org.apache.causeway.viewer.wicket.ui.util.Wkt;
+import org.apache.causeway.viewer.wicket.ui.util.WktLinks;
import lombok.Getter;
+import lombok.NonNull;
public class PagesizeChooser extends Panel {
private static final long serialVersionUID = 1L;
@@ -33,10 +40,14 @@ public class PagesizeChooser extends Panel {
private static final String ID_PAGESIZE_CHOICE = "pagesizeChoice";
private static final String ID_PAGESIZE_CHOICES = "pagesizeChoices";
+ private static final String ID_VIEW_ITEM_TITLE = "viewItemTitle";
+ private static final String ID_VIEW_ITEM_ICON = "viewItemIcon";
+ private static final String ID_VIEW_ITEM_CHECKMARK = "viewItemCheckmark"; // indicator for the selected item
+
@Getter
- final DataTable<?, ?> table;
+ final DataTableWithPagesAndFilter<?, ?> table;
- public PagesizeChooser(final String id, final DataTable<?, ?> table) {
+ public PagesizeChooser(final String id, final DataTableWithPagesAndFilter<?, ?> table) {
super(id);
this.table = table;
}
@@ -50,12 +61,50 @@ public class PagesizeChooser extends Panel {
// -- HELPER
private void buildGui() {
- List<String> choices = List.of("10", "25", "100", "1000", "All");
+ var choices = List.of(
+ new LinkEntry("10", 10L),
+ new LinkEntry("25", 25L),
+ new LinkEntry("100", 100L),
+ new LinkEntry("1000", 1000L),
+ new LinkEntry("All", Long.MAX_VALUE));
Wkt.listViewAdd(this, ID_PAGESIZE_CHOICES, choices, item->{
- Wkt.add(item, Wkt.label(ID_PAGESIZE_CHOICE, item.getModelObject()));
+ var link = Wkt.linkAdd(item, ID_PAGESIZE_CHOICE, target->{
+ var linkItem = item.getModelObject();
+ table.setItemsPerPage(linkItem.getItemsPerPage());
+ table.setPageSizeHintAndBroadcast(target);
+ target.add(table);
+ });
+ // add title and icon to the link
+ LinkEntry.addIconAndTitle(item, link);
+ Wkt.ajaxEnable(link);
});
}
+ @lombok.Value
+ static class LinkEntry implements Serializable {
+ private static final long serialVersionUID = 1L;
+ // -- CONSTRUCTION
+ final String title;
+ final long itemsPerPage;
+ final String cssClass = ""; // for future use
+ // -- UTILITY
+ static void addIconAndTitle(
+ final @NonNull ListItem<LinkEntry> item,
+ final @NonNull MarkupContainer link) {
+ WktLinks.listItemAsDropdownLink(item, link,
+ ID_VIEW_ITEM_TITLE, LinkEntry::nameFor,
+ ID_VIEW_ITEM_ICON, LinkEntry::cssClassFor,
+ null);
+ }
+ // -- HELPER
+ private static IModel<String> nameFor(final LinkEntry linkEntry) {
+ return Model.of(linkEntry.getTitle());
+ }
+ private static IModel<String> cssClassFor(final LinkEntry linkEntry) {
+ return Model.of(linkEntry.getCssClass());
+ }
+ }
+
}