From 87780f49dcfb1034c77470213a142e8092ec70a5 Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 17 Feb 2017 16:43:49 +0000 Subject: [PATCH] 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 --- .../java/com/arsdigita/cms/ui/BrowsePane.java | 79 ++++++++----------- .../cms/ui/folder/FolderBrowser.java | 2 - .../cms/ui/folder/FolderPathListModel.java | 5 +- .../cms/ui/folder/FolderTreeModelBuilder.java | 18 ++++- .../ui/folder/FolderTreeModelController.java | 33 +++++++- .../contentsection/ContentSectionSetup.java | 6 ++ .../contentsection/FolderManager.java | 13 ++- .../org/librecms/CmsResources.properties | 2 +- .../org/librecms/CmsResources_de.properties | 2 +- .../org/librecms/CmsResources_fr.properties | 2 +- .../org/libreccm/categorization/Category.java | 8 +- 11 files changed, 108 insertions(+), 62 deletions(-) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/BrowsePane.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/BrowsePane.java index dc76afa79..04d0a60cd 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/BrowsePane.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/BrowsePane.java @@ -20,6 +20,7 @@ package com.arsdigita.cms.ui; import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.Link; import com.arsdigita.bebop.Page; import com.arsdigita.bebop.PageState; 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.FolderSelectionModel; import com.arsdigita.cms.ui.folder.FolderTreeModelBuilder; +import com.arsdigita.cms.ui.folder.FolderTreeModelController; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.toolbox.ui.LayoutPanel; import com.arsdigita.util.Assert; import org.libreccm.categorization.Category; +import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.core.CcmObject; import org.librecms.CmsConstants; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionManager; 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 @@ -66,29 +74,6 @@ public class BrowsePane extends LayoutPanel implements Resettable { /* The folder tree displayed on the left side / left column */ 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(); folderModel = new FolderSelectionModel(selectionModel); folderRequestLocal = new FolderRequestLocal(folderModel); @@ -216,27 +201,33 @@ public class BrowsePane extends LayoutPanel implements Resettable { if (!root.equals(folderRequestLocal.getFolder(state))) { // Expand the ancestor nodes of the currently // selected node. - - CcmObject object = folderRequestLocal.getFolder(state); - - while (object != null) { - if (object instanceof Category) { - final Category category = (Category) object; - - if (category.getParentCategory() != null) { - final Category result = category.getParentCategory(); - object = result; - tree.expand( - ((Long) object.getObjectId()).toString(), - state); - } else { - object = null; - } - - } else { - object = null; - } - } + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final FolderTreeModelController controller = cdiUtil.findBean( + FolderTreeModelController.class); + final List ancestorIds = controller.findAncestorIds( + folderRequestLocal.getFolder(state)); + ancestorIds.forEach(id -> tree.expand(id.toString(), state)); + +// CcmObject object = folderRequestLocal.getFolder(state); +// +// while (object != null) { +// if (object instanceof Category) { +// final Category category = (Category) object; +// +// if (category.getParentCategory() != null) { +// final Category result = category.getParentCategory(); +// object = result; +// tree.expand( +// ((Long) object.getObjectId()).toString(), +// state); +// } else { +// object = null; +// } +// +// } else { +// object = null; +// } +// } } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java index 595de89d4..a7126f6f6 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowser.java @@ -53,8 +53,6 @@ import org.libreccm.categorization.Category; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.security.PermissionChecker; import org.librecms.CmsConstants; -import org.librecms.contentsection.ContentItem; -import org.librecms.contentsection.ContentItemManager; import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSectionManager; import org.librecms.contentsection.privileges.ItemPrivileges; diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java index b0b888d2b..c903352b6 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java @@ -36,8 +36,9 @@ class FolderPathListModel implements ListModel { private Folder currentFolder; public FolderPathListModel(final Folder folder) { - pathFolders = CdiUtil.createCdiUtil().findBean(FolderManager.class) - .getParentFolders(folder).iterator(); + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final FolderManager folderManager = cdiUtil.findBean(FolderManager.class); + pathFolders = folderManager.getParentFolders(folder).iterator(); } @Override diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java index b65d981a8..6f39dbb6e 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java @@ -34,9 +34,11 @@ import java.util.Collections; import java.util.Iterator; import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.l10n.GlobalizationHelper; import org.librecms.contentsection.Folder; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; /** @@ -190,9 +192,21 @@ public class FolderTreeModelBuilder extends LockableImpl @Override 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 { diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java index e3da4068d..fe7fa02d0 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java @@ -20,11 +20,15 @@ package com.arsdigita.cms.ui.folder; 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.FolderRepository; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.Optional; import javax.enterprise.context.RequestScoped; @@ -47,10 +51,9 @@ public class FolderTreeModelController { "Can't get current folder from null."); } - final Folder current = (Folder) node.getElement(); - - final Optional folder = folderRepo.findById(current - .getObjectId()); +// final Folder current = (Folder) node.getElement(); + final Optional folder = folderRepo + .findById((long) node.getKey()); if (folder.isPresent()) { return folder.get(); } else { @@ -71,4 +74,26 @@ public class FolderTreeModelController { return getCurrentFolder(node).getSubFolders(); } + @Transactional(Transactional.TxType.REQUIRED) + public List findAncestorIds(final Folder folder) { + Objects.requireNonNull(folder, + "Can't find ids of the ancestors of folder null."); + + final Optional 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 ancestorIds = new ArrayList<>(); + Category current = theFolder.get(); + while(current != null) { + ancestorIds.add(current.getObjectId()); + current = current.getParentCategory(); + } + + return ancestorIds; + } + } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionSetup.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionSetup.java index 7aab54f9f..159cf40ed 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionSetup.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentSectionSetup.java @@ -40,8 +40,12 @@ import org.librecms.contenttypes.News; import org.librecms.dispatcher.MultilingualItemResolver; import java.util.Arrays; + import org.librecms.contentsection.privileges.TypePrivileges; +import java.util.Locale; + + /** * * @author Jens Pelzetter @@ -121,11 +125,13 @@ public class ContentSectionSetup extends AbstractCcmApplicationSetup { rootFolder.setUuid(UUID.randomUUID().toString()); rootFolder.setUniqueId(rootFolder.getUuid()); rootFolder.setName(String.format("%s_" + ROOT, sectionName)); + rootFolder.getTitle().addValue(Locale.ROOT, "/"); rootFolder.setType(FolderType.DOCUMENTS_FOLDER); rootFolder.setSection(section); final Folder rootAssetFolder = new Folder(); rootAssetFolder.setName(String.format("%s_" + ASSETS, sectionName)); + rootAssetFolder.getTitle().addValue(Locale.ROOT, "/"); rootAssetFolder.setUuid(UUID.randomUUID().toString()); rootAssetFolder.setUniqueId(rootAssetFolder.getUuid()); rootAssetFolder.setType(FolderType.ASSETS_FOLDER); diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/FolderManager.java b/ccm-cms/src/main/java/org/librecms/contentsection/FolderManager.java index 62b5604f2..60b838493 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/FolderManager.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/FolderManager.java @@ -23,10 +23,12 @@ import com.arsdigita.kernel.KernelConfig; import org.libreccm.categorization.Category; import org.libreccm.categorization.CategoryManager; import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.core.UnexpectedErrorException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import javax.enterprise.context.RequestScoped; @@ -108,8 +110,16 @@ public class FolderManager { HAS_LIVE_ITEMS } + @Transactional(Transactional.TxType.REQUIRED) public Optional getParentFolder(final Folder folder) { - final Category parentCategory = folder.getParentCategory(); + Objects.requireNonNull(folder); + final Optional 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) { return Optional.empty(); } else { @@ -461,6 +471,7 @@ public class FolderManager { * * @return */ + @Transactional(Transactional.TxType.REQUIRED) public List getParentFolders(final Folder folder) { if (folder == null) { diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties index 0209b9054..aaa9bbc5d 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties @@ -112,7 +112,7 @@ cms.ui.category.use_context_must_be_unique=Use context must be unique within a C cms.ui.category.view_index_item=View index item cms.ui.authoring.no_types_registered=No types registered -cms.ui.contents_of=Contents of +cms.ui.contents_of=Contents of cms.ui.new_folder=Create new folder cms.ui.edit_folder=Rename the current folder cms.ui.authoring.create_new=Create new diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties index 0855fbd0e..6e9a74ab5 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties @@ -111,7 +111,7 @@ cms.ui.category.use_context_must_be_unique=Use Context muss innerhalb einer Cont cms.ui.category.view_index_item=Index Element anzeigen cms.ui.authoring.no_types_registered=Keine Typen registiert -cms.ui.contents_of=Inhalt von +cms.ui.contents_of=Inhalt von cms.ui.new_folder=Neuen Ordner erstellen cms.ui.edit_folder=Aktuellen Ordner umbenennen cms.ui.authoring.create_new=Neuer Inhalt diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties index c8ede8383..b1598074b 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties @@ -80,7 +80,7 @@ cms.ui.permissions.table.actions.remove_all=Remove all permissions cms.ui.permissions.table.actions.remove_all.confirm=Are you sure to remove all permissions for this role from the current object? cms.ui.permissions.table.remove_all.header=Remove all cms.ui.authoring.no_types_registered=No types registered -cms.ui.contents_of=Contents of +cms.ui.contents_of=Contents of cms.ui.new_folder=Create new folder cms.ui.edit_folder=Rename the current folder cms.ui.authoring.create_new=Create new diff --git a/ccm-core/src/main/java/org/libreccm/categorization/Category.java b/ccm-core/src/main/java/org/libreccm/categorization/Category.java index 53fed12a3..4452732af 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/Category.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/Category.java @@ -355,7 +355,7 @@ public class Category extends CcmObject implements Serializable, Portable { hash = 23 * hash + (enabled ? 1 : 0); hash = 23 * hash + (visible ? 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)); return hash; } @@ -402,9 +402,9 @@ public class Category extends CcmObject implements Serializable, Portable { if (abstractCategory != other.isAbstractCategory()) { return false; } - if (!Objects.equals(parentCategory, other.getParentCategory())) { - return false; - } +// if (!Objects.equals(parentCategory, other.getParentCategory())) { +// return false; +// } return categoryOrder == other.getCategoryOrder(); }