CCM NG: Content Center Category Tab (not finished yet)

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5167 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-12-12 18:33:09 +00:00
parent 439efa2e73
commit 85a5ace44a
5 changed files with 207 additions and 116 deletions

View File

@ -48,7 +48,9 @@ import org.apache.logging.log4j.Logger;
import org.libreccm.categorization.Categorization; import org.libreccm.categorization.Categorization;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryRepository; import org.libreccm.categorization.CategoryRepository;
import org.libreccm.categorization.Domain;
import org.libreccm.categorization.DomainOwnership; import org.libreccm.categorization.DomainOwnership;
import org.libreccm.categorization.DomainRepository;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.UnexpectedErrorException; import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
@ -60,39 +62,45 @@ import org.librecms.contentsection.privileges.AdminPrivileges;
* *
* @author Justin Ross <jross@redhat.com> * @author Justin Ross <jross@redhat.com>
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a> * @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public final class CategoryAdminPane extends BaseAdminPane { public final class CategoryAdminPane extends BaseAdminPane<String> {
private static final Logger LOGGER = LogManager
.getLogger(CategoryAdminPane.class);
public static final String CONTEXT_SELECTED = "sel_context"; public static final String CONTEXT_SELECTED = "sel_context";
private static final String DEFAULT_USE_CONTEXT = "<default>"; // private static final String DEFAULT_USE_CONTEXT = "<default>";
private static final Logger LOGGER = LogManager.getLogger(
CategoryAdminPane.class); private final SingleSelectionModel<String> selectedCategorySystem;
private final SingleSelectionModel m_contextModel; private final SingleSelectionModel<String> selectedCategory;
private final Tree m_categoryTree;
private final SingleSelectionModel m_model; private final Tree categoryTree;
private final CategoryRequestLocal m_parent;
private final CategoryRequestLocal m_category; private final CategoryRequestLocal parentCategoryRequestLocal;
private final CategoryRequestLocal categoryRequestLocal;
public CategoryAdminPane() { public CategoryAdminPane() {
super(); super();
m_contextModel = new UseContextSelectionModel(new StringParameter( selectedCategorySystem = new UseContextSelectionModel(
CONTEXT_SELECTED)); new StringParameter(
CONTEXT_SELECTED));
// Left column // Left column
// Use context section // Use context section
List list = new List(new CategoryUseContextModelBuilder()); List list = new List(new CategoryUseContextModelBuilder());
list.setSelectionModel(m_contextModel); list.setSelectionModel(selectedCategorySystem);
list.addChangeListener(new ContextSelectionListener()); list.addChangeListener(new ContextSelectionListener());
/* Category tree section */ /* Category tree section */
m_categoryTree = new BaseTree(new CategoryTreeModelBuilder( categoryTree = new BaseTree(new CategoryTreeModelBuilder(
m_contextModel)); selectedCategorySystem));
m_categoryTree.addChangeListener(new SelectionListener()); categoryTree.addChangeListener(new SelectionListener());
m_model = m_categoryTree.getSelectionModel(); selectedCategory = categoryTree.getSelectionModel();
setSelectionModel(m_model); super.setSelectionModel(selectedCategory);
setSelector(m_categoryTree); setSelector(categoryTree);
/* setup use context form */ /* setup use context form */
final Section contextSection = new Section(); final Section contextSection = new Section();
@ -108,41 +116,43 @@ public final class CategoryAdminPane extends BaseAdminPane {
if (permissionChecker.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES)) { if (permissionChecker.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES)) {
ActionLink addContextAction = new ActionLink(new Label(gz( ActionLink addContextAction = new ActionLink(new Label(gz(
"cms.ui.category.add_use_context"))); "cms.ui.category.add_use_context")));
Form addContextForm = new AddUseContextForm(m_contextModel); Form addContextForm = new AddUseContextForm(selectedCategorySystem);
getBody().add(addContextForm); getBody().add(addContextForm);
getBody().connect(addContextAction, addContextForm); getBody().connect(addContextAction, addContextForm);
contextGroup.addAction(new VisibilityComponent(addContextAction, contextGroup
AdminPrivileges.ADMINISTER_CATEGORIES)); .addAction(new VisibilityComponent(addContextAction,
AdminPrivileges.ADMINISTER_CATEGORIES));
} }
final Section categorySection = new Section(); final Section categorySection = new Section();
categorySection.setHeading(new Label(gz("cms.ui.categories"))); categorySection.setHeading(new Label(gz("cms.ui.categories")));
ActionGroup categoryGroup = new ActionGroup(); ActionGroup categoryGroup = new ActionGroup();
categorySection.setBody(categoryGroup); categorySection.setBody(categoryGroup);
categoryGroup.setSubject(m_categoryTree); categoryGroup.setSubject(categoryTree);
final SimpleContainer leftContainer = new SimpleContainer(); final SimpleContainer leftContainer = new SimpleContainer();
leftContainer.add(contextSection); leftContainer.add(contextSection);
leftContainer.add(categorySection); leftContainer.add(categorySection);
setLeft(leftContainer); setLeft(leftContainer);
m_parent = new ParentRequestLocal(); parentCategoryRequestLocal = new ParentRequestLocal();
m_category = new SelectionRequestLocal(); categoryRequestLocal = new SelectionRequestLocal();
setAdd(gz("cms.ui.category.add"), setAdd(gz("cms.ui.category.add"),
new CategoryAddForm(m_category, m_model)); new CategoryAddForm(categoryRequestLocal, selectedCategory));
setEdit(gz("cms.ui.category.edit"), setEdit(gz("cms.ui.category.edit"),
new CategoryEditForm(m_parent, m_category)); new CategoryEditForm(parentCategoryRequestLocal,
categoryRequestLocal));
setDelete(new DeleteLink(new Label(gz("cms.ui.category.delete"))), setDelete(new DeleteLink(new Label(gz("cms.ui.category.delete"))),
new DeleteForm( new DeleteForm(
new SimpleContainer())); new SimpleContainer()));
setIntroPane(new Label(gz("cms.ui.category.intro"))); setIntroPane(new Label(gz("cms.ui.category.intro")));
setItemPane(new CategoryItemPane(m_model, setItemPane(new CategoryItemPane(selectedCategory,
m_contextModel, selectedCategorySystem,
m_category, categoryRequestLocal,
getAddLink(), getAddLink(),
getEditLink(), getEditLink(),
getDeleteLink())); getDeleteLink()));
@ -165,7 +175,8 @@ public final class CategoryAdminPane extends BaseAdminPane {
} }
@Override @Override
public void generateXML(PageState state, Element parent) { public void generateXML(final PageState state, final Element parent) {
if (!isVisible(state)) { if (!isVisible(state)) {
return; return;
} }
@ -185,45 +196,47 @@ public final class CategoryAdminPane extends BaseAdminPane {
private final class DeleteForm extends BaseDeleteForm { private final class DeleteForm extends BaseDeleteForm {
DeleteForm(SimpleContainer prompt) { DeleteForm(final SimpleContainer prompt) {
super(prompt); super(prompt);
prompt.add(new Label(gz("cms.ui.category.delete_prompt"))); prompt.add(new Label(gz("cms.ui.category.delete_prompt")));
Label catLabel = new Label(); Label catLabel = new Label();
catLabel.addPrintListener(pe -> { catLabel.addPrintListener(pe -> {
Label label = (Label) pe.getTarget(); Label label = (Label) pe.getTarget();
Category cat = m_category.getCategory(pe.getPageState()); Category cat = categoryRequestLocal.getCategory(pe
.getPageState());
java.util.List<Category> descendants = cat.getSubCategories(); java.util.List<Category> descendants = cat.getSubCategories();
java.util.List<Categorization> catObjects = cat.getObjects(); java.util.List<Categorization> catObjects = cat.getObjects();
StringBuffer sb = new StringBuffer(" "); final StringBuilder builder = new StringBuilder(" ");
if (descendants.size() > 0) { if (descendants.size() > 0) {
sb.append("This category has "); builder.append("This category has ");
sb.append(descendants.size()); builder.append(descendants.size());
sb.append(" descendant category(ies). "); builder.append(" descendant category(ies). ");
} }
if (catObjects.size() > 0) { if (catObjects.size() > 0) {
sb.append("It has ").append(catObjects.size()); builder.append("It has ").append(catObjects.size());
sb.append(" descendant object(s). "); builder.append(" descendant object(s). ");
} }
if (descendants.size() > 0 || catObjects.size() > 0) { if (descendants.size() > 0 || catObjects.size() > 0) {
sb.append( builder.append(
"Descendants will be orphaned, if this category is removed."); "Descendants will be orphaned, if this category is removed.");
} }
label.setLabel(gz(sb.toString())); label.setLabel(gz(builder.toString()));
}); });
prompt.add(catLabel); prompt.add(catLabel);
} }
@Override @Override
public final void process(final FormSectionEvent e) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = e.getPageState(); final PageState state = event.getPageState();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean( final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class); PermissionChecker.class);
final CategoryRepository repository = cdiUtil.findBean( final CategoryRepository repository = cdiUtil.findBean(
CategoryRepository.class); CategoryRepository.class);
final Category category = m_category.getCategory(state); final Category category = categoryRequestLocal.getCategory(state);
if (category == null) { if (category == null) {
return; return;
} }
@ -246,7 +259,7 @@ public final class CategoryAdminPane extends BaseAdminPane {
// m_contextModel.setSelectedKey(state, DEFAULT_USE_CONTEXT); // m_contextModel.setSelectedKey(state, DEFAULT_USE_CONTEXT);
// } else { // } else {
Category parent = category.getParentCategory(); Category parent = category.getParentCategory();
m_model.setSelectedKey(state, parent.getUniqueId()); selectedCategory.setSelectedKey(state, parent.getUniqueId());
// } // }
//category.deleteCategoryAndOrphan(); //category.deleteCategoryAndOrphan();
@ -259,7 +272,7 @@ public final class CategoryAdminPane extends BaseAdminPane {
@Override @Override
protected final Object initialValue(final PageState state) { protected final Object initialValue(final PageState state) {
final String id = m_model.getSelectedKey(state).toString(); final String id = selectedCategory.getSelectedKey(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryRepository repository = cdiUtil.findBean( final CategoryRepository repository = cdiUtil.findBean(
CategoryRepository.class); CategoryRepository.class);
@ -276,7 +289,7 @@ public final class CategoryAdminPane extends BaseAdminPane {
@Override @Override
protected final Object initialValue(final PageState state) { protected final Object initialValue(final PageState state) {
return m_category.getCategory(state).getParentCategory(); return categoryRequestLocal.getCategory(state).getParentCategory();
} }
} }
@ -297,20 +310,31 @@ public final class CategoryAdminPane extends BaseAdminPane {
// } // }
// //
// } // }
private class UseContextSelectionModel extends ParameterSingleSelectionModel { private class UseContextSelectionModel
extends ParameterSingleSelectionModel<String> {
public UseContextSelectionModel(ParameterModel m) { public UseContextSelectionModel(final ParameterModel parameterModel) {
super(m); super(parameterModel);
} }
@Override @Override
public Object getSelectedKey(final PageState state) { public String getSelectedKey(final PageState state) {
Object val = super.getSelectedKey(state); String val = super.getSelectedKey(state);
if (val == null if (val == null
|| ((CharSequence) val).length() == 0) { || val.isEmpty()
|| val.matches("\\s*")) {
final ContentSection section = CMS
.getContext()
.getContentSection();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryAdminController controller = cdiUtil
.findBean(CategoryAdminController.class);
final Domain categorySystem = controller
.retrieveDomains(section).get(0).getDomain();
val = Long.toString(categorySystem.getObjectId());
val = DEFAULT_USE_CONTEXT;
state.setValue(getStateParameter(), val); state.setValue(getStateParameter(), val);
fireStateChanged(state); fireStateChanged(state);
} }
@ -321,13 +345,16 @@ public final class CategoryAdminPane extends BaseAdminPane {
public String getUseContext(final PageState state) { public String getUseContext(final PageState state) {
String selected = (String) m_contextModel.getSelectedKey(state); final String selected = selectedCategorySystem.getSelectedKey(state);
if (DEFAULT_USE_CONTEXT.equals(selected)) { return selected;
return null; // if (DEFAULT_USE_CONTEXT.equals(selected)) {
} else { //
return selected; //
} //
// return (DEFAULT_USE_CONTEXT).equals(selected) ? (String) null : selected; // return null;
// } else {
// return selected;
// }
} }
private class ContextSelectionListener implements ChangeListener { private class ContextSelectionListener implements ChangeListener {
@ -342,40 +369,64 @@ public final class CategoryAdminPane extends BaseAdminPane {
getBody().reset(state); getBody().reset(state);
if (m_contextModel.isSelected(state)) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final Category root;
final String rootCategoryId = (String) m_contextModel if (selectedCategorySystem.isSelected(state)) {
final String categorySystemIdStr = selectedCategorySystem
.getSelectedKey(state); .getSelectedKey(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryRepository categoryRepo = cdiUtil
.findBean(CategoryRepository.class);
final Category root;
if (DEFAULT_USE_CONTEXT.equals(rootCategoryId)) {
final ContentSection section = CMS
.getContext()
.getContentSection();
final CategoryAdminController controller = CdiUtil final DomainRepository domainRepo = cdiUtil
.createCdiUtil() .findBean(DomainRepository.class);
.findBean(CategoryAdminController.class); final Domain categorySystem = domainRepo
final java.util.List<DomainOwnership> ownerships .findById(Long.parseLong(categorySystemIdStr))
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No Domain with ID %s in the database.",
categorySystemIdStr)));
root = categorySystem.getRoot();
// final String rootCategoryId = selectedCategorySystem
// .getSelectedKey(state);
//
//
// final Category root;
// if (DEFAULT_USE_CONTEXT.equals(rootCategoryId)) {
// final ContentSection section = CMS
// .getContext()
// .getContentSection();
//
// final CategoryAdminController controller = CdiUtil
// .createCdiUtil()
// .findBean(CategoryAdminController.class);
// final java.util.List<DomainOwnership> ownerships
// = controller
// .retrieveDomains(section);
// root = ownerships.get(0).getDomain().getRoot();
// } else {
// root = categoryRepo
// .findById(Long.parseLong(rootCategoryId))
// .orElseThrow(() -> new UnexpectedErrorException(String
// .format("No Category with ID %s in the database.",
// rootCategoryId)));
// }
} else {
final ContentSection section = CMS
.getContext()
.getContentSection();
final CategoryAdminController controller = CdiUtil
.createCdiUtil()
.findBean(CategoryAdminController.class);
final java.util.List<DomainOwnership> ownerships
= controller = controller
.retrieveDomains(section); .retrieveDomains(section);
root = ownerships.get(0).getDomain().getRoot(); root = ownerships.get(0).getDomain().getRoot();
} else {
root = categoryRepo
.findById(Long.parseLong(rootCategoryId))
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No Category with ID %s in the database.",
rootCategoryId)));
}
if (root != null) {
m_model.setSelectedKey(state, root.getUniqueId());
m_categoryTree.reset(state);
}
} }
if (m_model.isSelected(state)) {
if (root != null) {
selectedCategory.setSelectedKey(state, root.getUniqueId());
categoryTree.reset(state);
}
if (selectedCategory.isSelected(state)) {
LOGGER.debug("The selection model is selected; displaying " LOGGER.debug("The selection model is selected; displaying "
+ "the item pane"); + "the item pane");

View File

@ -27,11 +27,11 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryRepository;
import org.libreccm.categorization.CategoryTreeModelLite; import org.libreccm.categorization.CategoryTreeModelLite;
import org.libreccm.categorization.Domain;
import org.libreccm.categorization.DomainOwnership; import org.libreccm.categorization.DomainOwnership;
import org.libreccm.categorization.DomainRepository;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.UnexpectedErrorException;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
/** /**
@ -43,17 +43,18 @@ import org.librecms.contentsection.ContentSection;
class CategoryTreeModelBuilder extends LockableImpl class CategoryTreeModelBuilder extends LockableImpl
implements TreeModelBuilder { implements TreeModelBuilder {
private static String DEFAULT_USE_CONTEXT = "<default>"; // private static String DEFAULT_USE_CONTEXT = "<default>";
private final SingleSelectionModel<String> selectedCategorySystem;
private SingleSelectionModel m_contextModel = null;
public CategoryTreeModelBuilder() { public CategoryTreeModelBuilder() {
this(null); this(null);
} }
public CategoryTreeModelBuilder(SingleSelectionModel contextModel) { public CategoryTreeModelBuilder(
final SingleSelectionModel<String> selectedCategorySystem) {
super(); super();
m_contextModel = contextModel; this.selectedCategorySystem = selectedCategorySystem;
} }
@Override @Override
@ -61,11 +62,9 @@ class CategoryTreeModelBuilder extends LockableImpl
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final Category root; final Category root;
if (DEFAULT_USE_CONTEXT.equals(m_contextModel.getSelectedKey(state))) {
final ContentSection section = CMS
.getContext()
.getContentSection();
if (selectedCategorySystem.getSelectedKey(state) == null) {
final ContentSection section =CMS.getContext().getContentSection();
final CategoryAdminController controller = cdiUtil final CategoryAdminController controller = cdiUtil
.findBean(CategoryAdminController.class); .findBean(CategoryAdminController.class);
final java.util.List<DomainOwnership> ownerships final java.util.List<DomainOwnership> ownerships
@ -73,16 +72,40 @@ class CategoryTreeModelBuilder extends LockableImpl
.retrieveDomains(section); .retrieveDomains(section);
root = ownerships.get(0).getDomain().getRoot(); root = ownerships.get(0).getDomain().getRoot();
} else { } else {
final CategoryRepository categoryRepo = cdiUtil final DomainRepository domainRepo = cdiUtil
.findBean(CategoryRepository.class); .findBean(DomainRepository.class);
root = categoryRepo final Domain categorySystem = domainRepo
.findById(Long.parseLong((String) m_contextModel .findById(Long.parseLong(selectedCategorySystem
.getSelectedKey(state))) .getSelectedKey(state)))
.orElseThrow(() -> new UnexpectedErrorException(String .orElseThrow(() -> new IllegalArgumentException(String
.format("No Category with ID %s in the database.", .format("No Domain with ID %s in the database.",
m_contextModel.getSelectedKey(state)))); selectedCategorySystem.getSelectedKey(state))));
root = categorySystem.getRoot();
} }
// if (DEFAULT_USE_CONTEXT.equals(selectedCategorySystem.getSelectedKey(
// state))) {
// final ContentSection section = CMS
// .getContext()
// .getContentSection();
//
// final CategoryAdminController controller = cdiUtil
// .findBean(CategoryAdminController.class);
// final java.util.List<DomainOwnership> ownerships
// = controller
// .retrieveDomains(section);
// root = ownerships.get(0).getDomain().getRoot();
// } else {
// final CategoryRepository categoryRepo = cdiUtil
// .findBean(CategoryRepository.class);
// root = categoryRepo
// .findById(Long.parseLong((String) m_contextModel
// .getSelectedKey(state)))
// .orElseThrow(() -> new UnexpectedErrorException(String
// .format("No Category with ID %s in the database.",
// m_contextModel.getSelectedKey(state))));
// }
return new CategoryTreeModelLite(root); return new CategoryTreeModelLite(root);
} }

View File

@ -23,8 +23,11 @@ import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.list.AbstractListModelBuilder; import com.arsdigita.bebop.list.AbstractListModelBuilder;
import com.arsdigita.bebop.list.ListModel; import com.arsdigita.bebop.list.ListModel;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import org.libreccm.categorization.Domain;
import org.libreccm.categorization.DomainOwnership; import org.libreccm.categorization.DomainOwnership;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import java.util.Iterator; import java.util.Iterator;
@ -37,8 +40,6 @@ import java.util.Iterator;
*/ */
class CategoryUseContextModelBuilder extends AbstractListModelBuilder { class CategoryUseContextModelBuilder extends AbstractListModelBuilder {
private static String DEFAULT_USE_CONTEXT = "<default>";
@Override @Override
public final ListModel makeModel(final List list, final PageState state) { public final ListModel makeModel(final List list, final PageState state) {
return new Model(); return new Model();
@ -74,12 +75,28 @@ class CategoryUseContextModelBuilder extends AbstractListModelBuilder {
@Override @Override
public Object getElement() { public Object getElement() {
return current.getDomain().getRoot(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final GlobalizationHelper globalizationHelper = cdiUtil
.findBean(GlobalizationHelper.class);
final Domain categorySystem = current.getDomain();
if (categorySystem
.getTitle()
.hasValue(globalizationHelper.getNegotiatedLocale())) {
return globalizationHelper
.getValueFromLocalizedString(current.getDomain().getTitle());
} else {
return categorySystem.getDomainKey();
}
} }
@Override @Override
public String getKey() { public String getKey() {
return current.getContext() != null ? current.getContext() : DEFAULT_USE_CONTEXT;
return Long.toString(current.getDomain().getObjectId());
} }
} }
} }

View File

@ -106,8 +106,8 @@ cms.ui.category.templates=Category templates
cms.ui.category.templates.assigned=Assigned templates cms.ui.category.templates.assigned=Assigned templates
cms.ui.category.there_are_no_items_in_this_category=There are no items in this category cms.ui.category.there_are_no_items_in_this_category=There are no items in this category
cms.ui.category.url=URL cms.ui.category.url=URL
cms.ui.category.use_context=Use Context cms.ui.category.use_context=Category system
cms.ui.category.use_contexts=Use Contexts cms.ui.category.use_contexts=Category systems
cms.ui.category.use_context_must_be_unique=Use context must be unique within a Content Section. cms.ui.category.use_context_must_be_unique=Use context must be unique within a Content Section.
cms.ui.category.view_index_item=View index item cms.ui.category.view_index_item=View index item
cms.ui.category.assign_select_missing="Please select a category to assign" cms.ui.category.assign_select_missing="Please select a category to assign"

View File

@ -105,8 +105,8 @@ cms.ui.category.templates=Kategorievorlage
cms.ui.category.templates.assigned=Zugewiesene Vorlagen cms.ui.category.templates.assigned=Zugewiesene Vorlagen
cms.ui.category.there_are_no_items_in_this_category=Es gibt keine Elemente in dieser Kategorie cms.ui.category.there_are_no_items_in_this_category=Es gibt keine Elemente in dieser Kategorie
cms.ui.category.url=URL cms.ui.category.url=URL
cms.ui.category.use_context=Use Context cms.ui.category.use_context=Kategoriensystem
cms.ui.category.use_contexts=Use Contexts cms.ui.category.use_contexts=Kategoriensysteme
cms.ui.category.use_context_must_be_unique=Use Context muss innerhalb einer Content Section unique sein. cms.ui.category.use_context_must_be_unique=Use Context muss innerhalb einer Content Section unique sein.
cms.ui.category.view_index_item=Index Element anzeigen cms.ui.category.view_index_item=Index Element anzeigen