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());
+        }
+    }
+
 }