diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/ItemListModel.java b/ccm-cms/src/main/java/org/librecms/pages/models/ItemListModel.java index bb16c7c1c..f30c827a6 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/models/ItemListModel.java +++ b/ccm-cms/src/main/java/org/librecms/pages/models/ItemListModel.java @@ -60,6 +60,7 @@ import org.librecms.contentsection.privileges.ItemPrivileges; import com.arsdigita.kernel.KernelConfig; import java.util.Arrays; +import java.util.stream.Stream; /** * @@ -87,6 +88,8 @@ public class ItemListModel { private static final int PAGE_SIZE_DEFAULT = 20; + private static final String PAGE_PARAM_NAME = "page"; + @Inject private CategoryModel categoryModel; @@ -158,7 +161,8 @@ public class ItemListModel { ) ), getListOrderSetting(listName), - getPageSizeSetting(listName) + getPageSizeSetting(listName), + getOffset(listName, getPageSizeSetting(listName)) ) ); } @@ -167,7 +171,8 @@ public class ItemListModel { final Class limitToType, final List categories, final List listOrder, - final int pageSize + final int pageSize, + final int offset ) { final CriteriaBuilder criteriaBuilder = entityManager .getCriteriaBuilder(); @@ -212,7 +217,7 @@ public class ItemListModel { item, globalizationHelper.getNegotiatedLocale() ) ) - .skip(getOffset(pageSize)) + .skip(offset) .limit(pageSize) .map(this::buildListItemModel) .collect(Collectors.toList()); @@ -362,16 +367,36 @@ public class ItemListModel { } } - private int getOffset(final int pageSize) { - if (pageUrlModel.getQueryParameters().containsKey("page")) { - final String value = pageUrlModel.getQueryParameters().get("page"); - if (value.matches("\\d*")) { - final int page = Integer.valueOf(value); + private int getOffset(final String listName, final int pageSize) { + final String pageParamName = Stream + .of(listName, PAGE_PARAM_NAME) + .filter(token -> token != null && !token.isBlank()) + .collect( + Collectors.joining(".") + ); - return page * pageSize; - } else { - return 0; - } + if (pageUrlModel.getQueryParameters().containsKey(pageParamName)) { + return calculateOffset(pageParamName, pageSize); + } else if (pageUrlModel.getQueryParameters().containsKey(PAGE_PARAM_NAME)) { + return calculateOffset(PAGE_PARAM_NAME, pageSize); + } else { + return 0; + } + } + + private int calculateOffset( + final String pageParamName, + final int pageSize + ) { + return parsePageParam(pageParamName) * pageSize; + } + + private int parsePageParam(final String pageParamName) { + final String value = pageUrlModel + .getQueryParameters() + .get(pageParamName); + if (value.matches("\\d+")) { + return Integer.parseUnsignedInt(value); } else { return 0; } @@ -436,13 +461,12 @@ public class ItemListModel { final String listName, final String settingKey ) { - return List + return Stream .of( ITEM_LIST_SETTINGS_PREFIX, listName, settingKey ) - .stream() .filter(token -> token != null && !token.isBlank()) .collect( Collectors.joining(".")