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 512b8e236a CAUSEWAY-3794: moves responsibility to provide pagesize 
choices to table model
512b8e236a is described below

commit 512b8e236a4016323e4b61c879b9b5a281b02e00
Author: Andi Huber <[email protected]>
AuthorDate: Wed Jun 26 07:32:15 2024 +0200

    CAUSEWAY-3794: moves responsibility to provide pagesize choices to table
    model
---
 .../wicket/model/src/main/java/module-info.java    |  1 +
 .../itemreuse/ReuseIfRowIndexEqualsStrategy.java   | 18 ++++---
 .../wicket/model/pagesize/PagesizeChoice.java      | 56 ++++++++++++++++++++++
 .../ui/components/table/CausewayAjaxDataTable.java | 55 ---------------------
 .../table/DataTableWithPagesAndFilter.java         | 30 ++++++++++++
 .../table/nav/pagesize/PagesizeChooser.java        | 53 +++++---------------
 6 files changed, 108 insertions(+), 105 deletions(-)

diff --git a/viewers/wicket/model/src/main/java/module-info.java 
b/viewers/wicket/model/src/main/java/module-info.java
index bdd5c1e153..5932b784f9 100644
--- a/viewers/wicket/model/src/main/java/module-info.java
+++ b/viewers/wicket/model/src/main/java/module-info.java
@@ -28,6 +28,7 @@ module org.apache.causeway.viewer.wicket.model {
     exports org.apache.causeway.viewer.wicket.model.links;
     exports org.apache.causeway.viewer.wicket.model.models.interaction.act;
     exports org.apache.causeway.viewer.wicket.model.models.interaction;
+    exports org.apache.causeway.viewer.wicket.model.pagesize;
     exports org.apache.causeway.viewer.wicket.model.util;
     exports org.apache.causeway.viewer.wicket.model.mementos;
     exports org.apache.causeway.viewer.wicket.model.models.interaction.coll;
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/itemreuse/ReuseIfRowIndexEqualsStrategy.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/itemreuse/ReuseIfRowIndexEqualsStrategy.java
index b299c7868d..9c4a12c3ea 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/itemreuse/ReuseIfRowIndexEqualsStrategy.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/itemreuse/ReuseIfRowIndexEqualsStrategy.java
@@ -19,6 +19,7 @@
 package org.apache.causeway.viewer.wicket.model.itemreuse;
 
 import java.util.Iterator;
+import java.util.Optional;
 import java.util.TreeMap;
 
 import org.apache.wicket.markup.repeater.IItemFactory;
@@ -68,12 +69,9 @@ public class ReuseIfRowIndexEqualsStrategy implements 
IItemReuseStrategy {
             @Override
             public Item<T> next() {
                 final IModel<T> model = newModels.next();
-                final Item<T> oldItem = itemByRowIndex.getItem(model);
-
-                final Item<T> item = (oldItem == null)
-                    ? factory.newItem(index, model)
-                    : withIndex(oldItem, index);
-
+                final Item<T> item = itemByRowIndex.getItem(model)
+                        .map(oldItem->withIndex(index, oldItem))
+                        .orElseGet(()->factory.newItem(index, model));
                 index++;
                 return item;
             }
@@ -87,7 +85,7 @@ public class ReuseIfRowIndexEqualsStrategy implements 
IItemReuseStrategy {
 
     // -- HELPER
 
-    private static <T> Item<T> withIndex(final Item<T> item, final int index) {
+    private static <T> Item<T> withIndex(final int index, final Item<T> item) {
         item.setIndex(index);
         return item;
     }
@@ -102,11 +100,11 @@ public class ReuseIfRowIndexEqualsStrategy implements 
IItemReuseStrategy {
             }
         }
 
-        Item<T> getItem(final IModel<T> model) {
+        Optional<Item<T>> getItem(final IModel<T> model) {
             final int rowIndex = rowIndex(model);
             return rowIndex > -1
-                 ? get(rowIndex)
-                 : null;
+                 ? Optional.ofNullable(get(rowIndex))
+                 : Optional.empty();
         }
 
         private static int rowIndex(final IModel<?> model) {
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/pagesize/PagesizeChoice.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/pagesize/PagesizeChoice.java
new file mode 100644
index 0000000000..2b25ba4b1b
--- /dev/null
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/pagesize/PagesizeChoice.java
@@ -0,0 +1,56 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.wicket.model.pagesize;
+
+import java.io.Serializable;
+
[email protected]
+public class PagesizeChoice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    final String title;
+    final long itemsPerPage;
+    final String cssClass = ""; // for future use
+}
+
+//@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());
+//    }
+//}
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/CausewayAjaxDataTable.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/CausewayAjaxDataTable.java
index 8cf908c30e..a2fd9b9c09 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/CausewayAjaxDataTable.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/CausewayAjaxDataTable.java
@@ -100,59 +100,4 @@ public class CausewayAjaxDataTable extends 
DataTableWithPagesAndFilter<DataRow,
         return rowElement.getSpecification().getCssClass(rowElement);
     }
 
-//    private static Iterator<Item<DataRow>> itemReuseStrategy(
-//            final IItemFactory<DataRow> factory,
-//            final Iterator<IModel<DataRow>> newModels,
-//            final Iterator<Item<DataRow>> existingItems) {
-//
-//        val itemByRowIndex = _Maps.<Integer, Item<DataRow>>newHashMap();
-//        existingItems.forEachRemaining(item->{
-//            val model = item.getModel();
-//            if(model instanceof DataRowWkt) {
-//                val dataRowWkt = (DataRowWkt)item.getModel();
-//                itemByRowIndex.put(dataRowWkt.getRowIndex(), item);
-//            }
-//        });
-//
-//        return new Iterator<Item<DataRow>>() {
-//            private int index = 0;
-//
-//            @Override
-//            public boolean hasNext() {
-//                return newModels.hasNext();
-//            }
-//
-//            @Override
-//            public Item<DataRow> next() {
-//                final DataRowWkt newModel = (DataRowWkt)newModels.next();
-//                final Item<DataRow> oldItem = 
itemByRowIndex.get(newModel.getRowIndex());
-//
-//                final IModel<DataRow> model2 = oldItem != null
-//                        ? oldItem.getModel()
-//                        : newModel;
-//                return factory.newItem(index++, model2);
-//            }
-//
-//            @Override
-//            public void remove() {
-//                throw new UnsupportedOperationException();
-//            }
-//
-//        };
-//
-//    }
-//
-//    @SuppressWarnings("unused")
-//    private static <T> Iterator<Item<T>> itemReuseStrategyWithCast(
-//            final IItemFactory<T> factory,
-//            final Iterator<IModel<T>> newModels,
-//            final Iterator<Item<T>> existingItems) {
-//        return _Casts.uncheckedCast(itemReuseStrategy(
-//                _Casts.uncheckedCast(factory),
-//                _Casts.uncheckedCast(newModels),
-//                _Casts.uncheckedCast(existingItems)));
-//    }
-
-
-
 }
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 9556f149ca..80ade331ea 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
@@ -26,12 +26,16 @@ import 
org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import 
org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LambdaModel;
 
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.primitives._Longs;
 import org.apache.causeway.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
+import org.apache.causeway.viewer.wicket.model.pagesize.PagesizeChoice;
 import 
org.apache.causeway.viewer.wicket.ui.components.table.internal._TableUtils;
+import 
org.apache.causeway.viewer.wicket.ui.components.table.nav.pagesize.PagesizeChooser;
 
 public abstract class DataTableWithPagesAndFilter<T, S> extends DataTable<T, 
S> {
     private static final long serialVersionUID = 1L;
@@ -93,6 +97,8 @@ public abstract class DataTableWithPagesAndFilter<T, S> 
extends DataTable<T, S>
         honorPageNumberHint();
     }
 
+    // -- FILTER
+
     public void setSearchArg(final String value) {
         
if(_Strings.nullToEmpty(this.searchArg).equals(_Strings.nullToEmpty(value))) 
return;
         this.searchArg = value;
@@ -100,6 +106,30 @@ public abstract class DataTableWithPagesAndFilter<T, S> 
extends DataTable<T, S>
         _TableUtils.interactive(this).getSearchArgument().setValue(searchArg);
     }
 
+    // -- PAGESIZE
+
+    /** Used by the {@link PagesizeChooser}, to indicate the currently set 
page-size. */
+    public IModel<String> getEntriesPerPageAsLiteral() {
+        return LambdaModel.of(()->
+            String.format("%s", getItemsPerPage()<=1000
+                    ? "" + getItemsPerPage()
+                    : "All"));
+    }
+
+    /**
+     * Used by the {@link PagesizeChooser}, to offer page-size choices to the 
end user.
+     * (Typically a drop-down select.)
+     */
+    public List<PagesizeChoice> getPagesizeChoices() {
+        var choices = List.of(
+                new PagesizeChoice("All", Long.MAX_VALUE),
+                new PagesizeChoice("10", 10L),
+                new PagesizeChoice("25", 25L),
+                new PagesizeChoice("100", 100L),
+                new PagesizeChoice("1000", 1000L));
+        return choices;
+    }
+
     // -- HELPER
 
     private final void honorPageSizeHint() {
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 1b582e0776..b37a82023a 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,15 +18,12 @@
  */
 package org.apache.causeway.viewer.wicket.ui.components.table.nav.pagesize;
 
-import java.io.Serializable;
-import java.util.List;
-
 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.model.pagesize.PagesizeChoice;
 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;
@@ -62,55 +59,31 @@ public class PagesizeChooser extends Panel {
 
     private void buildGui() {
 
-        Wkt.labelAdd(this, ID_ENTRIES_PER_PAGE_LABEL, ()->
-                String.format("%s", table.getItemsPerPage()<=1000
-                        ? "" + table.getItemsPerPage()
-                        : "All"));
+        Wkt.labelAdd(this, ID_ENTRIES_PER_PAGE_LABEL, 
table.getEntriesPerPageAsLiteral());
 
-        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));
+        var choices = table.getPagesizeChoices();
 
         Wkt.listViewAdd(this, ID_PAGESIZE_CHOICES, choices, item->{
             var link = Wkt.linkAdd(item, ID_PAGESIZE_CHOICE, target->{
-                var linkItem = item.getModelObject();
-                table.setItemsPerPage(linkItem.getItemsPerPage());
+                var pagesizeChoice = item.getModelObject();
+                table.setItemsPerPage(pagesizeChoice.getItemsPerPage());
                 table.setPageSizeHintAndBroadcast(target);
                 target.add(table);
             });
             // add title and icon to the link
-            LinkEntry.addIconAndTitle(item, link);
+            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());
-        }
+    static void addIconAndTitle(
+            final @NonNull ListItem<PagesizeChoice> item,
+            final @NonNull MarkupContainer link) {
+        WktLinks.listItemAsDropdownLink(item, link,
+                ID_VIEW_ITEM_TITLE, 
pagesizeChoice->Model.of(pagesizeChoice.getTitle()),
+                ID_VIEW_ITEM_ICON, 
pagesizeChoice->Model.of(pagesizeChoice.getCssClass()),
+                null);
     }
 
 }

Reply via email to