From 81482c578fcab4ba3d47f633c2b4e1deef1e3a74 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 15 Feb 2022 20:06:07 +0100 Subject: [PATCH] Item list(s) are now configurable using page properties --- .../librecms/pages/models/ItemListModel.java | 173 +++++++++++------- 1 file changed, 110 insertions(+), 63 deletions(-) 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 08f8a7325..bb16c7c1c 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 @@ -59,6 +59,8 @@ import org.librecms.contentsection.privileges.ItemPrivileges; import com.arsdigita.kernel.KernelConfig; +import java.util.Arrays; + /** * * @author Jens Pelzetter @@ -67,6 +69,24 @@ import com.arsdigita.kernel.KernelConfig; @Named("CmsPagesItemListModel") public class ItemListModel { + private static final String ITEM_LIST_SETTINGS_PREFIX = "itemlist"; + + private static final String LIMIT_TO_TYPE_SETTING = "limitToType"; + + private static final String LIST_ORDER_SETTING = "listOrder"; + + private static final String PAGE_SIZE_SETTING = "pageSize"; + + private static final boolean DESCENDING_DEFAULT = false; + + private static final String LIMIT_TO_TYPE_DEFAULT = ContentItem.class + .getName(); + + private static final List LIST_ORDER_DEFAULT = List + .of("displayName"); + + private static final int PAGE_SIZE_DEFAULT = 20; + @Inject private CategoryModel categoryModel; @@ -100,62 +120,12 @@ public class ItemListModel { @Inject private Shiro shiro; + @Inject + private PagePropertiesModel pagePropertiesModel; + @Inject private PageUrlModel pageUrlModel; - private boolean descending; - - private String limitToType; - - private List listOrder; - - private int pageSize; - - private List itemList; - - public ItemListModel() { - descending = false; - limitToType = ContentItem.class.getName(); - listOrder = List.of("displayName"); - pageSize = 20; - } - - public boolean isDescending() { - return descending; - } - - public void setDescending(final boolean descending) { - this.descending = descending; - } - - public String getLimitToType() { - return limitToType; - } - - public void setLimitToType(final String limitToType) { - this.limitToType = limitToType; - } - - public List getListOrder() { - return Collections.unmodifiableList(listOrder); - } - - public void setListOrder(final List listOrder) { - this.listOrder = new ArrayList<>(listOrder); - } - - public int getPageSize() { - return pageSize; - } - - public void setPageSize(final int pageSize) { - this.pageSize = pageSize; - } - - public int getFirstItem() { - return getOffset(pageSize); - } - @Transactional(Transactional.TxType.REQUIRED) public int getListSize() { return getItems().size(); @@ -163,9 +133,16 @@ public class ItemListModel { @Transactional(Transactional.TxType.REQUIRED) public List getItems() { -// if (itemList == null) { + return getItems(""); + } + + @Transactional(Transactional.TxType.REQUIRED) + public List getItems( + final String listName + ) { + return Collections.unmodifiableList( buildList( - buildLimitToType(limitToType), + buildLimitToType(getLimitToTypeSetting(listName)), collectCategories( categoryRepository .findById(categoryModel.getCategory().getCategoryId()) @@ -180,15 +157,13 @@ public class ItemListModel { ) ) ), - listOrder, - pageSize - ); -// } - - return Collections.unmodifiableList(itemList); + getListOrderSetting(listName), + getPageSizeSetting(listName) + ) + ); } - private void buildList( + private List buildList( final Class limitToType, final List categories, final List listOrder, @@ -228,7 +203,7 @@ public class ItemListModel { .collect(Collectors.toList()) ); - itemList = entityManager + return entityManager .createQuery(criteriaQuery) .getResultList() .stream() @@ -402,6 +377,78 @@ public class ItemListModel { } } + private String getLimitToTypeSetting(final String listName) { + return Optional + .ofNullable( + pagePropertiesModel + .getProperties() + .get( + buildSettingKey( + listName, + LIMIT_TO_TYPE_SETTING + ) + ) + ) + .orElse(LIMIT_TO_TYPE_DEFAULT); + } + + private List getListOrderSetting(final String listName) { + return Optional + .ofNullable( + pagePropertiesModel + .getProperties() + .get( + buildSettingKey( + listName, + LIST_ORDER_SETTING + ) + ) + ) + .map(value -> value.split(",")) + .map( + values -> Arrays + .asList(values) + .stream() + .map(String::strip) + .collect(Collectors.toList()) + ) + .orElse(LIST_ORDER_DEFAULT); + } + + private int getPageSizeSetting(final String listName) { + return Optional + .ofNullable( + pagePropertiesModel + .getProperties() + .get( + buildSettingKey( + listName, + PAGE_SIZE_SETTING + ) + ) + ) + .filter(value -> value.matches("\\d+")) + .map(value -> Integer.parseUnsignedInt(value)) + .orElse(PAGE_SIZE_DEFAULT); + } + + private String buildSettingKey( + final String listName, + final String settingKey + ) { + return List + .of( + ITEM_LIST_SETTINGS_PREFIX, + listName, + settingKey + ) + .stream() + .filter(token -> token != null && !token.isBlank()) + .collect( + Collectors.joining(".") + ); + } + private AbstractContentItemListItemModel buildListItemModel( final ContentItem contentItem ) {