CCM NG/ccm-cms: Next part of migration of the FolderBrowser
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4560 8810af33-2d31-482b-a856-94f89814c4dfccm-docs
parent
1dd30646b3
commit
aeca80a4ce
|
|
@ -8,3 +8,4 @@ ccmRealm = org.libreccm.security.CcmShiroRealm
|
||||||
ccmRealm.credentialsMatcher = $passwordMatcher
|
ccmRealm.credentialsMatcher = $passwordMatcher
|
||||||
|
|
||||||
securityManager.realms = $ccmRealm
|
securityManager.realms = $ccmRealm
|
||||||
|
securityManager.rememberMeManager.cipherKey = p5h/Aphy0gfV+XThbEPqSG4iQNh2fTNH9ZEkSBAt/Ok=
|
||||||
|
|
@ -92,7 +92,7 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||||
// private final ActionLink m_setHomeFolderAction;
|
// private final ActionLink m_setHomeFolderAction;
|
||||||
// private final ActionLink m_removeHomeFolderAction;
|
// private final ActionLink m_removeHomeFolderAction;
|
||||||
private final ActionLink createFolderAction;
|
private final ActionLink createFolderAction;
|
||||||
private final ActionLink togglePrivateAction;
|
// private final ActionLink togglePrivateAction;
|
||||||
// private final Label m_homeFolderLabel;
|
// private final Label m_homeFolderLabel;
|
||||||
private final Segment browseSegment;
|
private final Segment browseSegment;
|
||||||
private final Segment newItemSegment;
|
private final Segment newItemSegment;
|
||||||
|
|
@ -245,28 +245,28 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||||
permissionActions.setSubject(permissionsPane);
|
permissionActions.setSubject(permissionsPane);
|
||||||
|
|
||||||
// An action
|
// An action
|
||||||
togglePrivateAction = new ActionLink(new Label(new PrintListener() {
|
// togglePrivateAction = new ActionLink(new Label(new PrintListener() {
|
||||||
|
//
|
||||||
@Override
|
// @Override
|
||||||
public void prepare(final PrintEvent event) {
|
// public void prepare(final PrintEvent event) {
|
||||||
final PageState state = event.getPageState();
|
// final PageState state = event.getPageState();
|
||||||
final Label target = (Label) event.getTarget();
|
// final Label target = (Label) event.getTarget();
|
||||||
final Folder currentFolder = folderRequestLocal.getFolder(state);
|
// final Folder currentFolder = folderRequestLocal.getFolder(state);
|
||||||
// ACSObject parent = currentFolder.getParent();
|
// // ACSObject parent = currentFolder.getParent();
|
||||||
|
//
|
||||||
// if (context == null) {
|
//// if (context == null) {
|
||||||
target.setLabel(new GlobalizedMessage(
|
// target.setLabel(new GlobalizedMessage(
|
||||||
"cms.ui.restore_default_permissions",
|
// "cms.ui.restore_default_permissions",
|
||||||
CmsConstants.CMS_BUNDLE));
|
// CmsConstants.CMS_BUNDLE));
|
||||||
// } else {
|
//// } else {
|
||||||
// target.setLabel(GlobalizationUtil
|
//// target.setLabel(GlobalizationUtil
|
||||||
// .globalize("cms.ui.use_custom_permissions"));
|
//// .globalize("cms.ui.use_custom_permissions"));
|
||||||
|
//// }
|
||||||
// }
|
// }
|
||||||
}
|
//
|
||||||
|
// }));
|
||||||
}));
|
// togglePrivateAction.addActionListener(this);
|
||||||
togglePrivateAction.addActionListener(this);
|
// permissionActions.addAction(togglePrivateAction);
|
||||||
permissionActions.addAction(togglePrivateAction);
|
|
||||||
|
|
||||||
// The 'new item' segment
|
// The 'new item' segment
|
||||||
newItemSegment.addHeader(new Label(globalize("cms.ui.new_item")));
|
newItemSegment.addHeader(new Label(globalize("cms.ui.new_item")));
|
||||||
|
|
@ -305,12 +305,13 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||||
super.register(page);
|
super.register(page);
|
||||||
|
|
||||||
page.setVisibleDefault(chooseLabel, false);
|
page.setVisibleDefault(chooseLabel, false);
|
||||||
|
// page.setVisibleDefault(browseSegment, true);
|
||||||
page.setVisibleDefault(newItemSegment, false);
|
page.setVisibleDefault(newItemSegment, false);
|
||||||
page.setVisibleDefault(newFolderSegment, false);
|
page.setVisibleDefault(newFolderSegment, false);
|
||||||
page.setVisibleDefault(editFolderSegment, false);
|
page.setVisibleDefault(editFolderSegment, false);
|
||||||
|
|
||||||
page
|
page.addComponentStateParam(this,
|
||||||
.addComponentStateParam(this, typeSelectionModel.getStateParameter());
|
typeSelectionModel.getStateParameter());
|
||||||
|
|
||||||
page.addActionListener(new ActionListener() {
|
page.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
|
@ -348,20 +349,15 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||||
browseMode(state);
|
browseMode(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
browseSegment.setVisible(state, true);
|
createFolderAction.setVisible(state, newItem);
|
||||||
|
newItemForm.setVisible(state, newItem);
|
||||||
// newItemSegment.setVisible(state, newItem);
|
|
||||||
// newFolderSegment.setVisible(state, newItem);
|
|
||||||
//newItemForm.setVisible(state, newItem);
|
|
||||||
|
|
||||||
|
|
||||||
final boolean editItem = permissionChecker.isPermitted(
|
final boolean editItem = permissionChecker.isPermitted(
|
||||||
ItemPrivileges.EDIT, folder);
|
ItemPrivileges.EDIT, folder);
|
||||||
|
|
||||||
editFolderAction.setVisible(state, editItem);
|
editFolderAction.setVisible(state, editItem);
|
||||||
chooseLabel.setVisible(state, editItem);
|
// chooseLabel.setVisible(state, editItem);
|
||||||
editFolderSegment.setVisible(state, editItem);
|
// editFolderSegment.setVisible(state, editItem);
|
||||||
|
|
||||||
|
|
||||||
if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) {
|
if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) {
|
||||||
permissionsSegment.setVisible(state, true);
|
permissionsSegment.setVisible(state, true);
|
||||||
|
|
@ -457,9 +453,10 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||||
} else if (source == editFolderAction) {
|
} else if (source == editFolderAction) {
|
||||||
permissionsSegment.setVisible(state, false);
|
permissionsSegment.setVisible(state, false);
|
||||||
editFolderSegment.setVisible(state, true);
|
editFolderSegment.setVisible(state, true);
|
||||||
} else if (source == togglePrivateAction) {
|
|
||||||
togglePermissions(state);
|
|
||||||
}
|
}
|
||||||
|
// else if (source == togglePrivateAction) {
|
||||||
|
// togglePermissions(state);
|
||||||
|
// }
|
||||||
// } else if (source == m_setHomeFolderAction) {
|
// } else if (source == m_setHomeFolderAction) {
|
||||||
// User user = Web.getWebContext().getUser();
|
// User user = Web.getWebContext().getUser();
|
||||||
// Folder folder = m_folder.getFolder(state);
|
// Folder folder = m_folder.getFolder(state);
|
||||||
|
|
@ -505,15 +502,15 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||||
return permissionsPane;
|
return permissionsPane;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPermissionLinkVis(PageState state) {
|
public void setPermissionLinkVis(final PageState state) {
|
||||||
final Folder currentFolder = folderRequestLocal.getFolder(state);
|
// final Folder currentFolder = folderRequestLocal.getFolder(state);
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
// final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||||
PermissionChecker.class);
|
// PermissionChecker.class);
|
||||||
if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
|
// if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
|
||||||
currentFolder)) {
|
// currentFolder)) {
|
||||||
togglePrivateAction.setVisible(state, false);
|
// togglePrivateAction.setVisible(state, false);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SectionNewItemForm extends NewItemForm {
|
private static class SectionNewItemForm extends NewItemForm {
|
||||||
|
|
|
||||||
|
|
@ -76,10 +76,12 @@ import org.librecms.contentsection.ContentItemManager;
|
||||||
import org.librecms.contentsection.ContentItemRepository;
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
import org.librecms.contentsection.ContentSection;
|
import org.librecms.contentsection.ContentSection;
|
||||||
import org.librecms.contentsection.ContentSectionManager;
|
import org.librecms.contentsection.ContentSectionManager;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||||
import org.librecms.dispatcher.ItemResolver;
|
import org.librecms.dispatcher.ItemResolver;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Browse folders and items. If the user clicks on a folder, the folder
|
* Browse folders and items. If the user clicks on a folder, the folder
|
||||||
|
|
@ -262,6 +264,18 @@ public class FolderBrowser extends Table {
|
||||||
return m_folderSize;
|
return m_folderSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Paginator getPaginator() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getFilter(final PageState state) {
|
||||||
|
return (String) state.getValue(m_filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getAtoZfilter(final PageState state) {
|
||||||
|
return (String) state.getValue(m_aToZfilter);
|
||||||
|
}
|
||||||
|
|
||||||
private class FolderTableModelBuilder
|
private class FolderTableModelBuilder
|
||||||
extends AbstractTableModelBuilder
|
extends AbstractTableModelBuilder
|
||||||
implements PaginationModelBuilder,
|
implements PaginationModelBuilder,
|
||||||
|
|
@ -269,9 +283,10 @@ public class FolderBrowser extends Table {
|
||||||
|
|
||||||
private final FolderSelectionModel folderModel;
|
private final FolderSelectionModel folderModel;
|
||||||
private final FolderBrowser folderBrowser;
|
private final FolderBrowser folderBrowser;
|
||||||
private final ContentItemRepository itemRepo;
|
// private final ContentItemRepository itemRepo;
|
||||||
private final ConfigurationManager confManager;
|
// private final ConfigurationManager confManager;
|
||||||
private final ContentSectionManager sectionManager;
|
// private final ContentSectionManager sectionManager;
|
||||||
|
final FolderBrowserController controller;
|
||||||
|
|
||||||
public FolderTableModelBuilder(final FolderSelectionModel folderModel) {
|
public FolderTableModelBuilder(final FolderSelectionModel folderModel) {
|
||||||
this(folderModel, null);
|
this(folderModel, null);
|
||||||
|
|
@ -282,99 +297,54 @@ public class FolderBrowser extends Table {
|
||||||
this.folderModel = folderModel;
|
this.folderModel = folderModel;
|
||||||
this.folderBrowser = folderBrowser;
|
this.folderBrowser = folderBrowser;
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
itemRepo = cdiUtil.findBean(ContentItemRepository.class);
|
controller = cdiUtil.findBean(FolderBrowserController.class);
|
||||||
confManager = cdiUtil.findBean(ConfigurationManager.class);
|
// itemRepo = cdiUtil.findBean(ContentItemRepository.class);
|
||||||
sectionManager = cdiUtil.findBean(ContentSectionManager.class);
|
// confManager = cdiUtil.findBean(ConfigurationManager.class);
|
||||||
|
// sectionManager = cdiUtil.findBean(ContentSectionManager.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TableModel makeModel(final Table table, final PageState state) {
|
public TableModel makeModel(final Table table, final PageState state) {
|
||||||
|
final FolderSelectionModel folderSelectionModel
|
||||||
|
= getFolderSelectionModel();
|
||||||
|
final Folder folder = folderSelectionModel.getSelectedObject(state);
|
||||||
|
if (folder == null) {
|
||||||
|
return Table.EMPTY_MODEL;
|
||||||
|
} else {
|
||||||
|
table.getRowSelectionModel().clearSelection(state);
|
||||||
|
final List<Folder> subFolders = folder.getSubFolders();
|
||||||
|
final List<ContentItem> items = folder.getObjects()
|
||||||
|
.stream()
|
||||||
|
.map(categorization -> categorization.getCategorizedObject())
|
||||||
|
.filter(object -> object instanceof ContentItem)
|
||||||
|
.map(object -> (ContentItem) object)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
final List<CcmObject> objects = new ArrayList<>();
|
||||||
|
objects.addAll(subFolders);
|
||||||
|
objects.addAll(items);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getTotalSize(final Paginator paginator,
|
public int getTotalSize(final Paginator paginator,
|
||||||
final PageState state) {
|
final PageState state) {
|
||||||
final Category folder = (Category) folderModel.getSelectedObject(
|
throw new UnsupportedOperationException();
|
||||||
state);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
SELECT c.categorizedObject FROM Categorization c "
|
|
||||||
+ "WHERE c.category = :folder "
|
|
||||||
+ "AND TYPE(c.categorizedObject) IN ContentItem"
|
|
||||||
+ "AND (LOWER(c.categorizationObject.displayName) LIKE CONCAT(LOWER(:name), '%') "
|
|
||||||
44+ "OR LOWER(c.categorizedObject.name.value) LIKE CONCAT(:name), '%')
|
|
||||||
*/
|
|
||||||
final CriteriaBuilder criteriaBuilder = itemRepo.
|
|
||||||
getCriteriaBuilder();
|
|
||||||
final CriteriaQuery<ContentItem> query = criteriaBuilder.
|
|
||||||
createQuery(ContentItem.class);
|
|
||||||
final Root<Categorization> root = query.from(Categorization.class);
|
|
||||||
final Root<ContentItem> itemRoot = query.from(ContentItem.class);
|
|
||||||
//final List<Predicate> predicates = new ArrayList<>();
|
|
||||||
final Predicate categoryPredicate = criteriaBuilder.equal(
|
|
||||||
root.get("Categorization.category"), folder);
|
|
||||||
final Predicate typePredicate = criteriaBuilder.equal(
|
|
||||||
itemRoot.type(), ContentItem.class);
|
|
||||||
final List<Predicate> filters = new ArrayList<>();
|
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
|
||||||
KernelConfig.class);
|
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
|
||||||
if (state.getValue(m_aToZfilter) != null) {
|
|
||||||
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
|
|
||||||
root.get("Categorization.categorizedObject.displayName")),
|
|
||||||
String.format("%s%%",
|
|
||||||
((String) state.
|
|
||||||
getValue(
|
|
||||||
m_aToZfilter)).
|
|
||||||
toLowerCase(
|
|
||||||
defaultLocale))));
|
|
||||||
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
|
|
||||||
root.get("Categorization.categoriziedObject.name.value")),
|
|
||||||
String.format("%s%%",
|
|
||||||
(String) state.
|
|
||||||
getValue(
|
|
||||||
m_aToZfilter))
|
|
||||||
.toLowerCase(defaultLocale)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.getValue(m_filter) != null) {
|
|
||||||
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
|
|
||||||
root.get("Categorization.categorizedObject.displayName")),
|
|
||||||
String.format("%s%%",
|
|
||||||
((String) state.
|
|
||||||
getValue(
|
|
||||||
m_filter)))));
|
|
||||||
filters.add(criteriaBuilder.like(criteriaBuilder.lower(
|
|
||||||
root.get("Categorization.categorizedObject.name.value")),
|
|
||||||
String.format("%s%%",
|
|
||||||
((String) state.
|
|
||||||
getValue(
|
|
||||||
m_filter)))));
|
|
||||||
}
|
|
||||||
|
|
||||||
final Predicate filtersPredicate = criteriaBuilder.or(filters.
|
|
||||||
toArray(new Predicate[filters.size()]));
|
|
||||||
final Predicate predicates = criteriaBuilder.and(categoryPredicate,
|
|
||||||
typePredicate,
|
|
||||||
filtersPredicate);
|
|
||||||
|
|
||||||
query.where(predicates).select(itemRoot);
|
|
||||||
|
|
||||||
return itemRepo.executeCriteriaQuery(query.where(predicates).select(
|
|
||||||
itemRoot)).size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(final PageState state) {
|
public boolean isVisible(final PageState state) {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
return folderBrowser != null && folderBrowser.isVisible(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getFolderSize(final PageState state) {
|
public long getFolderSize(final PageState state) {
|
||||||
return itemRepo.countItemsInFolder((Category) folderModel.
|
throw new UnsupportedOperationException();
|
||||||
getSelectedObject(state));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -382,21 +352,23 @@ public class FolderBrowser extends Table {
|
||||||
private class HeaderCellRenderer
|
private class HeaderCellRenderer
|
||||||
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer {
|
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer {
|
||||||
|
|
||||||
private String m_key;
|
private final String headerKey;
|
||||||
|
|
||||||
public HeaderCellRenderer(String key) {
|
public HeaderCellRenderer(final String headerKey) {
|
||||||
super(true);
|
super(true);
|
||||||
m_key = key;
|
this.headerKey = headerKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Component getComponent(final Table table, final PageState state,
|
public Component getComponent(final Table table, final PageState state,
|
||||||
Object value,
|
final Object value,
|
||||||
boolean isSelected, Object key,
|
boolean isSelected,
|
||||||
int row, int column) {
|
final Object key,
|
||||||
|
final int row,
|
||||||
|
final int column) {
|
||||||
String headerName = (String) ((GlobalizedMessage) value).localize();
|
String headerName = (String) ((GlobalizedMessage) value).localize();
|
||||||
String sortKey = (String) state.getValue(m_sortType);
|
String sortKey = (String) state.getValue(m_sortType);
|
||||||
final boolean isCurrentKey = sortKey.equals(m_key);
|
final boolean isCurrentKey = sortKey.equals(key);
|
||||||
final String currentSortDirection = (String) state.getValue(
|
final String currentSortDirection = (String) state.getValue(
|
||||||
m_sortDirection);
|
m_sortDirection);
|
||||||
String imageURLStub;
|
String imageURLStub;
|
||||||
|
|
@ -422,7 +394,7 @@ public class FolderBrowser extends Table {
|
||||||
}
|
}
|
||||||
ps.setControlEvent(table,
|
ps.setControlEvent(table,
|
||||||
sortDirectionAction,
|
sortDirectionAction,
|
||||||
m_key);
|
headerKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,300 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package com.arsdigita.cms.ui.folder;
|
||||||
|
|
||||||
|
import com.arsdigita.kernel.KernelConfig;
|
||||||
|
|
||||||
|
import org.libreccm.configuration.ConfigurationManager;
|
||||||
|
import org.libreccm.core.CcmObject;
|
||||||
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
|
import org.libreccm.l10n.LocalizedString;
|
||||||
|
import org.librecms.contentsection.ContentItem;
|
||||||
|
import org.librecms.contentsection.ContentItemL10NManager;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.TypedQuery;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class FolderBrowserController {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ConfigurationManager confManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private GlobalizationHelper globalizationHelper;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentItemL10NManager itemL10NManager;
|
||||||
|
|
||||||
|
private Locale defaultLocale;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
private void init() {
|
||||||
|
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||||
|
KernelConfig.class);
|
||||||
|
defaultLocale = kernelConfig.getDefaultLocale();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long countSubFolders(final Folder folder) {
|
||||||
|
return countSubFolders(folder, "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
public long countSubFolders(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
final TypedQuery<Long> query = entityManager.createNamedQuery(
|
||||||
|
"Folder.countSubFolders", Long.class);
|
||||||
|
query.setParameter("folder", folder);
|
||||||
|
query.setParameter("term", filterTerm);
|
||||||
|
|
||||||
|
return query.getSingleResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long countItems(final Folder folder) {
|
||||||
|
return countItems(folder, "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
public long countItems(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
final TypedQuery<Long> query = entityManager.createNamedQuery(
|
||||||
|
"Folder.countItems", Long.class);
|
||||||
|
query.setParameter("folder", folder);
|
||||||
|
query.setParameter("term", filterTerm);
|
||||||
|
|
||||||
|
return query.getSingleResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Folder> findSubFolders(final Folder folder) {
|
||||||
|
return findSubFolders(folder, "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Folder> findSubFolders(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
final TypedQuery<Folder> query = entityManager.createNamedQuery(
|
||||||
|
"Folder.findSubFolders", Folder.class);
|
||||||
|
query.setParameter("folder", folder);
|
||||||
|
query.setParameter("term", filterTerm);
|
||||||
|
|
||||||
|
return query.getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ContentItem> findItems(final Folder folder) {
|
||||||
|
return findItems(folder, "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ContentItem> findItems(final Folder folder,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
return findItems(folder, "%", first, maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ContentItem> findItems(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
return findItems(folder, filterTerm, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ContentItem> findItems(final Folder folder,
|
||||||
|
final String filterTerm,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
final TypedQuery<ContentItem> query = entityManager.createNamedQuery(
|
||||||
|
"Folder.findItems", ContentItem.class);
|
||||||
|
query.setParameter("folder", folder);
|
||||||
|
query.setParameter("term", filterTerm);
|
||||||
|
if (first > 0 && maxResults > 0) {
|
||||||
|
query.setFirstResult(first);
|
||||||
|
query.setMaxResults(maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
return query.getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CcmObject> findObjects(final Folder folder) {
|
||||||
|
return findObjects(folder, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CcmObject> findObjects(final Folder folder,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
return findObjects(folder, "%", first, maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CcmObject> findObjects(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
return findObjects(folder, filterTerm, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CcmObject> findObjects(final Folder folder,
|
||||||
|
final String filterTerm,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
final TypedQuery<CcmObject> query = entityManager.createNamedQuery(
|
||||||
|
"Folder.findObjects", CcmObject.class);
|
||||||
|
query.setParameter("folder", folder);
|
||||||
|
query.setParameter(filterTerm, filterTerm);
|
||||||
|
|
||||||
|
if (first > 0 && maxResults > 0) {
|
||||||
|
query.setFirstResult(first);
|
||||||
|
query.setMaxResults(maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
return query.getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int countObjects(final Folder folder) {
|
||||||
|
return countObjects(folder, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int countObjects(final Folder folder,
|
||||||
|
final int frist,
|
||||||
|
final int maxResults) {
|
||||||
|
return countObjects(folder, "%", frist, maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int countObjects(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
return countObjects(folder, filterTerm, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int countObjects(final Folder folder,
|
||||||
|
final String filterTerm,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
final TypedQuery<Integer> query = entityManager.createNamedQuery(
|
||||||
|
"Folder.countObjects", Integer.class);
|
||||||
|
query.setParameter("folder", folder);
|
||||||
|
query.setParameter(filterTerm, filterTerm);
|
||||||
|
|
||||||
|
if (first > 0 && maxResults > 0) {
|
||||||
|
query.setFirstResult(first);
|
||||||
|
query.setMaxResults(maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
return query.getSingleResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder) {
|
||||||
|
final List<CcmObject> objects = findObjects(folder);
|
||||||
|
|
||||||
|
return objects.stream()
|
||||||
|
.map(object -> buildRow(object))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder,
|
||||||
|
final String filterTerm) {
|
||||||
|
final List<CcmObject> objects = findObjects(folder,
|
||||||
|
filterTerm);
|
||||||
|
|
||||||
|
return objects.stream()
|
||||||
|
.map(object -> buildRow(object))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
final List<CcmObject> objects = findObjects(folder, first, maxResults);
|
||||||
|
|
||||||
|
return objects.stream()
|
||||||
|
.map(object -> buildRow(object))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
protected List<FolderBrowserTableRow> getObjectRows(final Folder folder,
|
||||||
|
final String filterTerm,
|
||||||
|
final int first,
|
||||||
|
final int maxResults) {
|
||||||
|
final List<CcmObject> objects = findObjects(folder,
|
||||||
|
filterTerm,
|
||||||
|
first,
|
||||||
|
maxResults);
|
||||||
|
|
||||||
|
return objects.stream()
|
||||||
|
.map(object -> buildRow(object))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private FolderBrowserTableRow buildRow(final CcmObject object) {
|
||||||
|
final FolderBrowserTableRow row = new FolderBrowserTableRow();
|
||||||
|
|
||||||
|
if (object instanceof Folder) {
|
||||||
|
final Folder folder = (Folder) object;
|
||||||
|
row.setObjectId(folder.getObjectId());
|
||||||
|
row.setObjectUuid(folder.getUuid());
|
||||||
|
row.setName(folder.getName());
|
||||||
|
row.setLanguages(Collections.emptyList());
|
||||||
|
if (folder.getTitle().hasValue(globalizationHelper
|
||||||
|
.getNegotiatedLocale())) {
|
||||||
|
row.setTitle(folder.getTitle().getValue(globalizationHelper
|
||||||
|
.getNegotiatedLocale()));
|
||||||
|
} else {
|
||||||
|
row.setTitle(folder.getTitle().getValue(defaultLocale));
|
||||||
|
}
|
||||||
|
} else if (object instanceof ContentItem) {
|
||||||
|
final ContentItem item = (ContentItem) object;
|
||||||
|
row.setObjectId(item.getObjectId());
|
||||||
|
row.setObjectUuid(item.getItemUuid());
|
||||||
|
row.setName(item.getName().getValue(defaultLocale));
|
||||||
|
final List<Locale> languages = new ArrayList<>(itemL10NManager
|
||||||
|
.availableLanguages(item));
|
||||||
|
languages.sort((lang1, lang2) -> lang1.toString().compareTo(
|
||||||
|
lang2.toString()));
|
||||||
|
row.setLanguages(languages);
|
||||||
|
if (item.getTitle().hasValue(globalizationHelper
|
||||||
|
.getNegotiatedLocale())) {
|
||||||
|
row.setTitle(item.getTitle().getValue(globalizationHelper
|
||||||
|
.getNegotiatedLocale()));
|
||||||
|
} else {
|
||||||
|
row.setTitle(item.getTitle().getValue(defaultLocale));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
row.setObjectId(object.getObjectId());
|
||||||
|
row.setObjectUuid(object.getUuid());
|
||||||
|
row.setName("???");
|
||||||
|
row.setLanguages(Collections.emptyList());
|
||||||
|
final LocalizedString title = new LocalizedString();
|
||||||
|
title.addValue(globalizationHelper.getNegotiatedLocale(), "???");
|
||||||
|
}
|
||||||
|
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package com.arsdigita.cms.ui.folder;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
class FolderBrowserFilterFormModelBuilder
|
||||||
|
implements FolderManipulator.FilterFormModelBuilder{
|
||||||
|
|
||||||
|
private final FolderBrowser folderBrowser;
|
||||||
|
|
||||||
|
public FolderBrowserFilterFormModelBuilder(final FolderBrowser folderBrowser) {
|
||||||
|
this.folderBrowser = folderBrowser;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFolderSize(final PageState state) {
|
||||||
|
final FolderSelectionModel folderSelectionModel = folderBrowser
|
||||||
|
.getFolderSelectionModel();
|
||||||
|
final Folder folder = folderSelectionModel.getSelectedObject(state);
|
||||||
|
if (folder == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
folderBrowser.getRowSelectionModel().clearSelection(state);
|
||||||
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final FolderBrowserController controller = cdiUtil.findBean(
|
||||||
|
FolderBrowserController.class);
|
||||||
|
final String filter = folderBrowser.getFilter(state);
|
||||||
|
final String atozFilter = folderBrowser.getAtoZfilter(state);
|
||||||
|
|
||||||
|
final String filterTerm;
|
||||||
|
if (filter != null && !filter.trim().isEmpty()) {
|
||||||
|
filterTerm = filter.trim();
|
||||||
|
} else if (atozFilter != null && !atozFilter.trim().isEmpty()) {
|
||||||
|
filterTerm = atozFilter.trim();
|
||||||
|
} else {
|
||||||
|
filterTerm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterTerm == null) {
|
||||||
|
return controller.countObjects(folder);
|
||||||
|
} else {
|
||||||
|
return controller.countObjects(folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package com.arsdigita.cms.ui.folder;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.PaginationModelBuilder;
|
||||||
|
import com.arsdigita.bebop.Paginator;
|
||||||
|
import com.arsdigita.bebop.Table;
|
||||||
|
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
class FolderBrowserPaginationModelBuilder implements PaginationModelBuilder {
|
||||||
|
|
||||||
|
private final FolderBrowser folderBrowser;
|
||||||
|
|
||||||
|
public FolderBrowserPaginationModelBuilder(final FolderBrowser folderBrowser) {
|
||||||
|
this.folderBrowser = folderBrowser;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getTotalSize(final Paginator paginator,
|
||||||
|
final PageState state) {
|
||||||
|
final FolderSelectionModel folderSelectionModel = folderBrowser
|
||||||
|
.getFolderSelectionModel();
|
||||||
|
final Folder folder = folderSelectionModel.getSelectedObject(state);
|
||||||
|
if (folder == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
folderBrowser.getRowSelectionModel().clearSelection(state);
|
||||||
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final FolderBrowserController controller = cdiUtil.findBean(
|
||||||
|
FolderBrowserController.class);
|
||||||
|
final String filter = folderBrowser.getFilter(state);
|
||||||
|
final String atozFilter = folderBrowser.getAtoZfilter(state);
|
||||||
|
final int first = paginator.getFirst(state);
|
||||||
|
final int pageSize = paginator.getPageSize(state);
|
||||||
|
|
||||||
|
final String filterTerm;
|
||||||
|
if (filter != null && !filter.trim().isEmpty()) {
|
||||||
|
filterTerm = filter.trim();
|
||||||
|
} else if (atozFilter != null && !atozFilter.trim().isEmpty()) {
|
||||||
|
filterTerm = atozFilter.trim();
|
||||||
|
} else {
|
||||||
|
filterTerm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterTerm == null) {
|
||||||
|
return controller.countObjects(folder, first, pageSize);
|
||||||
|
} else {
|
||||||
|
return controller.countObjects(folder, filter, first, pageSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisible(final PageState state) {
|
||||||
|
return folderBrowser != null && folderBrowser.isVisible(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package com.arsdigita.cms.ui.folder;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.table.TableModel;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table model for the {@link FolderBrowser}.
|
||||||
|
*
|
||||||
|
* @see {FolderBrowserTableModelBuilder}
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
class FolderBrowserTableModel implements TableModel {
|
||||||
|
|
||||||
|
private static final int COL_NAME = 0;
|
||||||
|
private static final int COL_LANGUAGES = 1;
|
||||||
|
private static final int COL_TITLE = 2;
|
||||||
|
private static final int COL_TYPE = 3;
|
||||||
|
private static final int COL_CREATION_DATE = 4;
|
||||||
|
private static final int COL_LAST_MODIFIED = 5;
|
||||||
|
private static final int COL_DELETEABLE = 6;
|
||||||
|
|
||||||
|
private final Iterator<FolderBrowserTableRow> iterator;
|
||||||
|
private FolderBrowserTableRow currentRow;
|
||||||
|
|
||||||
|
public FolderBrowserTableModel(final List<FolderBrowserTableRow> rows) {
|
||||||
|
iterator = rows.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getColumnCount() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
if (iterator.hasNext()) {
|
||||||
|
currentRow = iterator.next();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getElementAt(final int columnIndex) {
|
||||||
|
switch(columnIndex) {
|
||||||
|
case COL_NAME:
|
||||||
|
return currentRow.getName();
|
||||||
|
case COL_LANGUAGES:
|
||||||
|
return currentRow.getLanguages();
|
||||||
|
case COL_TITLE:
|
||||||
|
return currentRow.getTitle();
|
||||||
|
case COL_TYPE:
|
||||||
|
return currentRow.getType();
|
||||||
|
case COL_CREATION_DATE:
|
||||||
|
return currentRow.getCreated();
|
||||||
|
case COL_LAST_MODIFIED:
|
||||||
|
return currentRow.getLastModified();
|
||||||
|
case COL_DELETEABLE:
|
||||||
|
return currentRow.isDeletable();
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException(String.format(
|
||||||
|
"Illegal column index %d.", columnIndex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getKeyAt(final int columnIndex) {
|
||||||
|
return currentRow.getObjectId();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package com.arsdigita.cms.ui.folder;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.Paginator;
|
||||||
|
import com.arsdigita.bebop.Table;
|
||||||
|
import com.arsdigita.bebop.table.TableModel;
|
||||||
|
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.librecms.contentsection.ContentItem;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
class FolderBrowserTableModelBuilder extends LockableImpl
|
||||||
|
implements TableModelBuilder {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableModel makeModel(final Table table,
|
||||||
|
final PageState state) {
|
||||||
|
if (!(table instanceof FolderBrowser)) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"The FolderBrowserTableModelBuilder can be used for the FolderBrowser.");
|
||||||
|
}
|
||||||
|
final FolderBrowser folderBrowser = (FolderBrowser) table;
|
||||||
|
final FolderSelectionModel folderSelectionModel = folderBrowser
|
||||||
|
.getFolderSelectionModel();
|
||||||
|
final Folder folder = folderSelectionModel.getSelectedObject(state);
|
||||||
|
if (folder == null) {
|
||||||
|
return Table.EMPTY_MODEL;
|
||||||
|
} else {
|
||||||
|
folderBrowser.getRowSelectionModel().clearSelection(state);
|
||||||
|
final Paginator paginator = folderBrowser.getPaginator();
|
||||||
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final FolderBrowserController controller = cdiUtil.findBean(
|
||||||
|
FolderBrowserController.class);
|
||||||
|
final String filter = folderBrowser.getFilter(state);
|
||||||
|
final String atozFilter = folderBrowser.getAtoZfilter(state);
|
||||||
|
final int first = paginator.getFirst(state);
|
||||||
|
final int pageSize = paginator.getPageSize(state);
|
||||||
|
|
||||||
|
final String filterTerm;
|
||||||
|
if (filter != null && !filter.trim().isEmpty()) {
|
||||||
|
filterTerm = filter.trim();
|
||||||
|
} else if (atozFilter != null && !atozFilter.trim().isEmpty()) {
|
||||||
|
filterTerm = atozFilter.trim();
|
||||||
|
} else {
|
||||||
|
filterTerm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<FolderBrowserTableRow> rows;
|
||||||
|
if (filterTerm == null) {
|
||||||
|
rows = controller.getObjectRows(folder, first, pageSize);
|
||||||
|
} else {
|
||||||
|
rows = controller.getObjectRows(folder, filter, first, pageSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return new FolderBrowserTableModel(rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package com.arsdigita.cms.ui.folder;
|
||||||
|
|
||||||
|
import org.libreccm.l10n.LocalizedString;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
class FolderBrowserTableRow {
|
||||||
|
|
||||||
|
private long objectId;
|
||||||
|
private String objectUuid;
|
||||||
|
private String name;
|
||||||
|
private List<Locale> languages;
|
||||||
|
private String title;
|
||||||
|
private String type;
|
||||||
|
private Date created;
|
||||||
|
private Date lastModified;
|
||||||
|
private boolean deletable;
|
||||||
|
|
||||||
|
public long getObjectId() {
|
||||||
|
return objectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setObjectId(final long objectId) {
|
||||||
|
this.objectId = objectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getObjectUuid() {
|
||||||
|
return objectUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setObjectUuid(final String objectUuid) {
|
||||||
|
this.objectUuid = objectUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Locale> getLanguages() {
|
||||||
|
return Collections.unmodifiableList(languages);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setLanguages(final List<Locale> languages) {
|
||||||
|
this.languages = languages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setTitle(final String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setType(final String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCreated() {
|
||||||
|
return new Date(created.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setCreated(final Date created) {
|
||||||
|
this.created = new Date(created.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getLastModified() {
|
||||||
|
return new Date(lastModified.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setLastModified(final Date lastModified) {
|
||||||
|
this.lastModified = new Date(lastModified.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDeletable() {
|
||||||
|
return deletable;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDeletable(final boolean deletable) {
|
||||||
|
this.deletable = deletable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -25,6 +25,7 @@ import javax.persistence.Table;
|
||||||
|
|
||||||
import org.libreccm.categorization.Category;
|
import org.libreccm.categorization.Category;
|
||||||
import org.libreccm.core.CcmObject;
|
import org.libreccm.core.CcmObject;
|
||||||
|
import org.librecms.CmsConstants;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
@ -59,6 +60,79 @@ import static org.librecms.CmsConstants.*;
|
||||||
@NamedQuery(
|
@NamedQuery(
|
||||||
name = "Folder.findByName",
|
name = "Folder.findByName",
|
||||||
query = "SELECT f FROM Folder f WHERE f.name = :name")
|
query = "SELECT f FROM Folder f WHERE f.name = :name")
|
||||||
|
,
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Folder.findSubFolders",
|
||||||
|
query = "SELECT f FROM Folder f WHERE f.parentCategory = :parent "
|
||||||
|
+ "AND LOWER(f.name) LIKE :term "
|
||||||
|
+ "ORDER BY f.name"
|
||||||
|
)
|
||||||
|
,
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Folder.countSubFolders",
|
||||||
|
query
|
||||||
|
= "SELECT COUNT(f) FROM Folder f WHERE f.parentCategory = :parent "
|
||||||
|
+ "AND LOWER(f.name) LIKE :term"
|
||||||
|
)
|
||||||
|
,
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Folder.findItems",
|
||||||
|
query = "SELECT c.categorizedObject "
|
||||||
|
+ "FROM Categorization c "
|
||||||
|
+ "WHERE c.category = :folder "
|
||||||
|
+ "AND TYPE(c.categorizedObject) IN ContentItem "
|
||||||
|
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
|
||||||
|
+ "AND c.version = "
|
||||||
|
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
|
||||||
|
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
|
||||||
|
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term) "
|
||||||
|
+ "ORDER BY c.categorizedObject.name")
|
||||||
|
,
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Folder.countItems",
|
||||||
|
query = "SELECT COUNT(c).categorizedObject "
|
||||||
|
+ "FROM Categorization c "
|
||||||
|
+ "WHERE c.category = :folder "
|
||||||
|
+ "AND Type(c.categorizedObject) IN ContentItem "
|
||||||
|
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
|
||||||
|
+ "AND c.version = "
|
||||||
|
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
|
||||||
|
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
|
||||||
|
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term)")
|
||||||
|
,
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Folder.findObjects",
|
||||||
|
query = "SELECT o FROM CcmObject o "
|
||||||
|
+ "WHERE o IN (SELECT f FROM Folder f "
|
||||||
|
+ "WHERE f.parentCategory = :parent "
|
||||||
|
+ "AND lower(f.name) LIKE :term) "
|
||||||
|
+ "OR o IN (SELECT c.categorizedObject "
|
||||||
|
+ "FROM Categorization c "
|
||||||
|
+ "WHERE c.category = :folder "
|
||||||
|
+ "AND TYPE(c.categorizedObject) IN ContentItem "
|
||||||
|
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
|
||||||
|
+ "AND c.version = "
|
||||||
|
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
|
||||||
|
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
|
||||||
|
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term)) "
|
||||||
|
+ "ORDER BY o.displayName")
|
||||||
|
,
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Folder.countObjects",
|
||||||
|
query = "SELECT COUNT(o) FROM CcmObject o "
|
||||||
|
+ "WHERE o IN (SELECT f FROM Folder f "
|
||||||
|
+ "WHERE f.parentCategory = :parent "
|
||||||
|
+ "AND lower(f.name) LIKE :term) "
|
||||||
|
+ "OR o IN (SELECT c.categorizedObject "
|
||||||
|
+ "FROM Categorization c "
|
||||||
|
+ "WHERE c.category = :folder "
|
||||||
|
+ "AND TYPE(c.categorizedObject) IN ContentItem "
|
||||||
|
+ "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' "
|
||||||
|
+ "AND c.version = "
|
||||||
|
+ "org.librecms.contentsection.ContentItemVersion.DRAFT"
|
||||||
|
+ "AND (LOWER(c.categorizedObject.displayName) LIKE :term "
|
||||||
|
+ "OR LOWER(c.categorizedObject.name.value) LIKE :term)) "
|
||||||
|
+ "ORDER BY o.displayName")
|
||||||
})
|
})
|
||||||
public class Folder extends Category implements Serializable {
|
public class Folder extends Category implements Serializable {
|
||||||
|
|
||||||
|
|
@ -115,7 +189,6 @@ public class Folder extends Category implements Serializable {
|
||||||
// return (Folder) getParentCategory();
|
// return (Folder) getParentCategory();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int hash = super.hashCode();
|
int hash = super.hashCode();
|
||||||
|
|
|
||||||
|
|
@ -250,32 +250,32 @@ public class SegmentedPanel extends SimpleContainer
|
||||||
add(c);
|
add(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public boolean isVisible(final PageState state) {
|
// public boolean isVisible(final PageState state) {
|
||||||
boolean result = super.isVisible(state);
|
// boolean result = super.isVisible(state);
|
||||||
|
//
|
||||||
if (m_header != null) {
|
// if (m_header != null) {
|
||||||
result = result && m_header.isVisible(state);
|
// result = result && m_header.isVisible(state);
|
||||||
|
//
|
||||||
final Iterator children = m_header.children();
|
// final Iterator children = m_header.children();
|
||||||
while (children.hasNext()) {
|
// while (children.hasNext()) {
|
||||||
final Component component = (Component) children.next();
|
// final Component component = (Component) children.next();
|
||||||
result = result && component.isVisible(state);
|
// result = result && component.isVisible(state);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (m_body != null) {
|
// if (m_body != null) {
|
||||||
result = result && m_body.isVisible(state);
|
// result = result && m_body.isVisible(state);
|
||||||
|
//
|
||||||
final Iterator children = m_body.children();
|
// final Iterator children = m_body.children();
|
||||||
while (children.hasNext()) {
|
// while (children.hasNext()) {
|
||||||
final Component component = (Component) children.next();
|
// final Component component = (Component) children.next();
|
||||||
result = result && component.isVisible(state);
|
// result = result && component.isVisible(state);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return result;
|
// return result;
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate the XML for this segment
|
* Generate the XML for this segment
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue