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