CCM NG/ccm-cms: BrowsePane: Changing current folder using the folder on the left now works.

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4581 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-02-17 16:43:49 +00:00
parent 502c0e0416
commit 3f59f81984
11 changed files with 108 additions and 62 deletions

View File

@ -20,6 +20,7 @@ package com.arsdigita.cms.ui;
import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Resettable; import com.arsdigita.bebop.Resettable;
@ -37,14 +38,21 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ui.folder.FolderRequestLocal; import com.arsdigita.cms.ui.folder.FolderRequestLocal;
import com.arsdigita.cms.ui.folder.FolderSelectionModel; import com.arsdigita.cms.ui.folder.FolderSelectionModel;
import com.arsdigita.cms.ui.folder.FolderTreeModelBuilder; import com.arsdigita.cms.ui.folder.FolderTreeModelBuilder;
import com.arsdigita.cms.ui.folder.FolderTreeModelController;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.LayoutPanel; import com.arsdigita.toolbox.ui.LayoutPanel;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
import org.librecms.dispatcher.ItemResolver;
import java.util.List;
/** /**
* A pane that contains a folder tree on the left and a folder manipulator on * A pane that contains a folder tree on the left and a folder manipulator on
@ -66,29 +74,6 @@ public class BrowsePane extends LayoutPanel implements Resettable {
/* The folder tree displayed on the left side / left column */ /* The folder tree displayed on the left side / left column */
tree = new BaseTree(new FolderTreeModelBuilder()); tree = new BaseTree(new FolderTreeModelBuilder());
tree.setCellRenderer(new TreeCellRenderer() {
@Override
public Component getComponent(final Tree tree,
final PageState state,
final Object value,
final boolean isSelected,
final boolean isExpanded,
final boolean isLeaf,
final Object key) {
if (value instanceof Folder) {
final Folder folder = (Folder) value;
if (folder.getParentCategory() == null) {
return new Text("/");
} else {
return new Text(folder.getName());
}
} else {
return new Text(value.toString());
}
}
});
selectionModel = tree.getSelectionModel(); selectionModel = tree.getSelectionModel();
folderModel = new FolderSelectionModel(selectionModel); folderModel = new FolderSelectionModel(selectionModel);
folderRequestLocal = new FolderRequestLocal(folderModel); folderRequestLocal = new FolderRequestLocal(folderModel);
@ -216,27 +201,33 @@ public class BrowsePane extends LayoutPanel implements Resettable {
if (!root.equals(folderRequestLocal.getFolder(state))) { if (!root.equals(folderRequestLocal.getFolder(state))) {
// Expand the ancestor nodes of the currently // Expand the ancestor nodes of the currently
// selected node. // selected node.
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderTreeModelController controller = cdiUtil.findBean(
FolderTreeModelController.class);
final List<Long> ancestorIds = controller.findAncestorIds(
folderRequestLocal.getFolder(state));
ancestorIds.forEach(id -> tree.expand(id.toString(), state));
CcmObject object = folderRequestLocal.getFolder(state); // CcmObject object = folderRequestLocal.getFolder(state);
//
while (object != null) { // while (object != null) {
if (object instanceof Category) { // if (object instanceof Category) {
final Category category = (Category) object; // final Category category = (Category) object;
//
if (category.getParentCategory() != null) { // if (category.getParentCategory() != null) {
final Category result = category.getParentCategory(); // final Category result = category.getParentCategory();
object = result; // object = result;
tree.expand( // tree.expand(
((Long) object.getObjectId()).toString(), // ((Long) object.getObjectId()).toString(),
state); // state);
} else { // } else {
object = null; // object = null;
} // }
//
} else { // } else {
object = null; // object = null;
} // }
} // }
} }
} }

View File

@ -53,8 +53,6 @@ import org.libreccm.categorization.Category;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemManager;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager; import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.privileges.ItemPrivileges; import org.librecms.contentsection.privileges.ItemPrivileges;

View File

@ -36,8 +36,9 @@ class FolderPathListModel implements ListModel {
private Folder currentFolder; private Folder currentFolder;
public FolderPathListModel(final Folder folder) { public FolderPathListModel(final Folder folder) {
pathFolders = CdiUtil.createCdiUtil().findBean(FolderManager.class) final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
.getParentFolders(folder).iterator(); final FolderManager folderManager = cdiUtil.findBean(FolderManager.class);
pathFolders = folderManager.getParentFolders(folder).iterator();
} }
@Override @Override

View File

@ -34,9 +34,11 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -190,9 +192,21 @@ public class FolderTreeModelBuilder extends LockableImpl
@Override @Override
public Object getElement() { public Object getElement() {
return folder; final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final GlobalizationHelper globalizationHelper = cdiUtil.findBean(
GlobalizationHelper.class);
final Locale locale = globalizationHelper.getNegotiatedLocale();
if (folder.getTitle().hasValue(locale)) {
return folder.getTitle().getValue(locale);
} else {
final String value = folder.getTitle().getValue();
if (value == null) {
return folder.getName();
} else {
return value;
}
}
} }
} }
/*private class NewFolderBrowserIterator implements Iterator { /*private class NewFolderBrowserIterator implements Iterator {

View File

@ -20,11 +20,15 @@ package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.tree.TreeNode; import com.arsdigita.bebop.tree.TreeNode;
import org.libreccm.categorization.Category;
import org.libreccm.core.UnexpectedErrorException;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
import org.librecms.contentsection.FolderRepository; import org.librecms.contentsection.FolderRepository;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
@ -47,10 +51,9 @@ public class FolderTreeModelController {
"Can't get current folder from null."); "Can't get current folder from null.");
} }
final Folder current = (Folder) node.getElement(); // final Folder current = (Folder) node.getElement();
final Optional<Folder> folder = folderRepo
final Optional<Folder> folder = folderRepo.findById(current .findById((long) node.getKey());
.getObjectId());
if (folder.isPresent()) { if (folder.isPresent()) {
return folder.get(); return folder.get();
} else { } else {
@ -71,4 +74,26 @@ public class FolderTreeModelController {
return getCurrentFolder(node).getSubFolders(); return getCurrentFolder(node).getSubFolders();
} }
@Transactional(Transactional.TxType.REQUIRED)
public List<Long> findAncestorIds(final Folder folder) {
Objects.requireNonNull(folder,
"Can't find ids of the ancestors of folder null.");
final Optional<Folder> theFolder = folderRepo.findById(folder
.getObjectId());
if (!theFolder.isPresent()) {
throw new UnexpectedErrorException(String.format(
"The folder %s was not found in the database, but it should be there.",
Objects.toString(folder)));
}
final List<Long> ancestorIds = new ArrayList<>();
Category current = theFolder.get();
while(current != null) {
ancestorIds.add(current.getObjectId());
current = current.getParentCategory();
}
return ancestorIds;
}
} }

View File

@ -40,8 +40,12 @@ import org.librecms.contenttypes.News;
import org.librecms.dispatcher.MultilingualItemResolver; import org.librecms.dispatcher.MultilingualItemResolver;
import java.util.Arrays; import java.util.Arrays;
import org.librecms.contentsection.privileges.TypePrivileges; import org.librecms.contentsection.privileges.TypePrivileges;
import java.util.Locale;
/** /**
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
@ -121,11 +125,13 @@ public class ContentSectionSetup extends AbstractCcmApplicationSetup {
rootFolder.setUuid(UUID.randomUUID().toString()); rootFolder.setUuid(UUID.randomUUID().toString());
rootFolder.setUniqueId(rootFolder.getUuid()); rootFolder.setUniqueId(rootFolder.getUuid());
rootFolder.setName(String.format("%s_" + ROOT, sectionName)); rootFolder.setName(String.format("%s_" + ROOT, sectionName));
rootFolder.getTitle().addValue(Locale.ROOT, "/");
rootFolder.setType(FolderType.DOCUMENTS_FOLDER); rootFolder.setType(FolderType.DOCUMENTS_FOLDER);
rootFolder.setSection(section); rootFolder.setSection(section);
final Folder rootAssetFolder = new Folder(); final Folder rootAssetFolder = new Folder();
rootAssetFolder.setName(String.format("%s_" + ASSETS, sectionName)); rootAssetFolder.setName(String.format("%s_" + ASSETS, sectionName));
rootAssetFolder.getTitle().addValue(Locale.ROOT, "/");
rootAssetFolder.setUuid(UUID.randomUUID().toString()); rootAssetFolder.setUuid(UUID.randomUUID().toString());
rootAssetFolder.setUniqueId(rootAssetFolder.getUuid()); rootAssetFolder.setUniqueId(rootAssetFolder.getUuid());
rootAssetFolder.setType(FolderType.ASSETS_FOLDER); rootAssetFolder.setType(FolderType.ASSETS_FOLDER);

View File

@ -23,10 +23,12 @@ import com.arsdigita.kernel.KernelConfig;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryManager; import org.libreccm.categorization.CategoryManager;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.UnexpectedErrorException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
@ -108,8 +110,16 @@ public class FolderManager {
HAS_LIVE_ITEMS HAS_LIVE_ITEMS
} }
@Transactional(Transactional.TxType.REQUIRED)
public Optional<Folder> getParentFolder(final Folder folder) { public Optional<Folder> getParentFolder(final Folder folder) {
final Category parentCategory = folder.getParentCategory(); Objects.requireNonNull(folder);
final Optional<Folder> theFolder = folderRepo.findById(folder.getObjectId());
if (!theFolder.isPresent()) {
throw new UnexpectedErrorException(String.format(
"The folder %s should be in the database but is not.",
Objects.toString(folder)));
}
final Category parentCategory = theFolder.get().getParentCategory();
if (parentCategory == null) { if (parentCategory == null) {
return Optional.empty(); return Optional.empty();
} else { } else {
@ -461,6 +471,7 @@ public class FolderManager {
* *
* @return * @return
*/ */
@Transactional(Transactional.TxType.REQUIRED)
public List<Folder> getParentFolders(final Folder folder) { public List<Folder> getParentFolders(final Folder folder) {
if (folder == null) { if (folder == null) {

View File

@ -355,7 +355,7 @@ public class Category extends CcmObject implements Serializable, Portable {
hash = 23 * hash + (enabled ? 1 : 0); hash = 23 * hash + (enabled ? 1 : 0);
hash = 23 * hash + (visible ? 1 : 0); hash = 23 * hash + (visible ? 1 : 0);
hash = 23 * hash + (abstractCategory ? 1 : 0); hash = 23 * hash + (abstractCategory ? 1 : 0);
hash = 23 * hash + Objects.hashCode(parentCategory); // hash = 23 * hash + Objects.hashCode(parentCategory);
hash = 23 * hash + (int) (categoryOrder ^ (categoryOrder >>> 32)); hash = 23 * hash + (int) (categoryOrder ^ (categoryOrder >>> 32));
return hash; return hash;
} }
@ -402,9 +402,9 @@ public class Category extends CcmObject implements Serializable, Portable {
if (abstractCategory != other.isAbstractCategory()) { if (abstractCategory != other.isAbstractCategory()) {
return false; return false;
} }
if (!Objects.equals(parentCategory, other.getParentCategory())) { // if (!Objects.equals(parentCategory, other.getParentCategory())) {
return false; // return false;
} // }
return categoryOrder == other.getCategoryOrder(); return categoryOrder == other.getCategoryOrder();
} }