Diverse Änderungen an ItemSearchWidget, FlatItemList und NewItemForm in Vorbereitung für die weitern Änderungen am ItemSearchWidget

FlatItemList

 * Die Länge der Liste ist nun per Config-Parameter einstellbar (war auf 20 hardcodiert)

ItemSearchFolderBrowser

 * Die Länger der Liste ist nun per Config-Parameter einstellbar (war auf 15 hardcodiert)

NewitemForm

 * Sucht jetzt im PageState nach einem SingleType - Parameter und begrenzt ggf. die Liste der CTs auf die Liste der Siblings von singleType

TextAssetBodyLabelCellRenderer

 * Dem Label des Textkörpers zum Anzeigen des TextAssets (z.B. be Artikeln) wird nun ein id="webPage" mitgegeben. Dadurch kann man auch im CC an dieser Stelle die Layouts der Webseite verwenden.

git-svn-id: https://svn.libreccm.org/ccm/trunk@649 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2010-12-15 11:11:22 +00:00
parent 30573f253d
commit c8889b9925
9 changed files with 98 additions and 79 deletions

View File

@ -442,6 +442,13 @@ public final class CMSConfig extends AbstractConfig {
private final Parameter m_itemSearchDefaultTab = new StringParameter("com.arsdigita.cms.item_search.default_tab", private final Parameter m_itemSearchDefaultTab = new StringParameter("com.arsdigita.cms.item_search.default_tab",
Parameter.REQUIRED, "browse"); Parameter.REQUIRED, "browse");
/////////////////////////////////////////////
// FolderBrowse
/////////////////////////////////////////////
private final Parameter m_folderBrowseListSize = new IntegerParameter("com.arsdigita.cms.folder_browse_list_size",
Parameter.REQUIRED, 20);
// /////////////////////////////////////////// // ///////////////////////////////////////////
// publishToFile package related parameter // publishToFile package related parameter
// /////////////////////////////////////////// // ///////////////////////////////////////////
@ -516,6 +523,8 @@ public final class CMSConfig extends AbstractConfig {
register(m_itemSearchDefaultTab); register(m_itemSearchDefaultTab);
register(m_folderBrowseListSize);
// publishToFile package related parameter // publishToFile package related parameter
// Moved to publishToFile.PublishToFileConfig as of version 6.0.2 // Moved to publishToFile.PublishToFileConfig as of version 6.0.2
// register(m_disableItemPfs); // register(m_disableItemPfs);
@ -888,4 +897,8 @@ public final class CMSConfig extends AbstractConfig {
public String getItemSearchDefaultTab() { public String getItemSearchDefaultTab() {
return (String) get(m_itemSearchDefaultTab); return (String) get(m_itemSearchDefaultTab);
} }
public Integer getFolderBrowseListSize() {
return (Integer) get(m_folderBrowseListSize);
}
} }

View File

@ -233,8 +233,13 @@ com.arsdigita.cms.item_search.default_tab.purpose=Select either "browse" or "sea
com.arsdigita.cms.item_search.default_tab.example=browse com.arsdigita.cms.item_search.default_tab.example=browse
com.arsdigita.cms.item_search.default_tab.format=[string] com.arsdigita.cms.item_search.default_tab.format=[string]
com.arsdigita.cms.item_search.xx.title= com.arsdigita.cms.folder_browse_list_size.title=List size for the folder browse widget
com.arsdigita.cms.item_search.xx.purpose= com.arsdigita.cms.folder_browse_list_size.purpose=Allows to change the number of items displayed on each page of the folder browse widget
com.arsdigita.cms.item_search.xx.example= com.arsdigita.cms.folder_browse_list_size.example=20
com.arsdigita.cms.item_search.xx.format=[string] com.arsdigita.cms.folder_browse_list_size.format=[integer]
com.arsdigita.cms.xx.title=
com.arsdigita.cms.xx.purpose=
com.arsdigita.cms.xx.example=
com.arsdigita.cms.xx.format=[string]

View File

@ -93,9 +93,6 @@ public class FlatItemList extends SegmentedPanel
private static final String PRIVILEGE = "privilege"; private static final String PRIVILEGE = "privilege";
private static final String PRIVILEGE_NAME = "prettyName"; private static final String PRIVILEGE_NAME = "prettyName";
//maximum number of items displayed in the table at a time
public static int LIST_SIZE = 20;
// The folder selectors // The folder selectors
private FolderSelectionModel m_folderSel; private FolderSelectionModel m_folderSel;
private FolderRequestLocal m_folder; private FolderRequestLocal m_folder;
@ -295,6 +292,7 @@ public class FlatItemList extends SegmentedPanel
m_editFolderSeg.add(new Label("<br/>", false)); m_editFolderSeg.add(new Label("<br/>", false));
} }
@Override
public void register(Page p) { public void register(Page p) {
super.register(p); super.register(p);

View File

@ -56,8 +56,6 @@ import com.arsdigita.persistence.FilterFactory;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Iterator;
import java.util.StringTokenizer; import java.util.StringTokenizer;
/** /**
@ -72,7 +70,7 @@ public class ItemSearchFolderBrowser extends Table {
private static final org.apache.log4j.Logger s_log = private static final org.apache.log4j.Logger s_log =
org.apache.log4j.Logger.getLogger(ItemSearchFolderBrowser.class); org.apache.log4j.Logger.getLogger(ItemSearchFolderBrowser.class);
public static final int MAX_ROWS = 15;
private static GlobalizedMessage[] s_headers = { private static GlobalizedMessage[] s_headers = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.name"),
globalize("cms.ui.folder.title"), globalize("cms.ui.folder.title"),
@ -90,7 +88,7 @@ public class ItemSearchFolderBrowser extends Table {
FolderTableModelBuilder builder = new FolderTableModelBuilder(); FolderTableModelBuilder builder = new FolderTableModelBuilder();
setModelBuilder(builder); setModelBuilder(builder);
m_paginator = new Paginator(builder, MAX_ROWS); m_paginator = new Paginator(builder, ContentSection.getConfig().getFolderBrowseListSize());
m_currentFolder = currentFolder; m_currentFolder = currentFolder;
@ -253,7 +251,7 @@ public class ItemSearchFolderBrowser extends Table {
int size = ((Integer) m_size.get(state)).intValue(); int size = ((Integer) m_size.get(state)).intValue();
return ItemSearchFolderBrowser.this.isVisible(state) return ItemSearchFolderBrowser.this.isVisible(state)
&& (size > MAX_ROWS); && (size > ContentSection.getConfig().getFolderBrowseListSize());
} }
} }
@ -319,7 +317,7 @@ public class ItemSearchFolderBrowser extends Table {
} }
private String generateJSLabel(BigDecimal id, String widget, String fill) { private String generateJSLabel(BigDecimal id, String widget, String fill) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
buffer.append(" <script language=javascript> " buffer.append(" <script language=javascript> "
+ " <!-- \n" + " <!-- \n"
+ " function fillItem" + " function fillItem"
@ -389,6 +387,7 @@ public class ItemSearchFolderBrowser extends Table {
private class FolderChanger extends TableActionAdapter { private class FolderChanger extends TableActionAdapter {
@Override
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
PageState s = e.getPageState(); PageState s = e.getPageState();
int col = e.getColumn().intValue(); int col = e.getColumn().intValue();

View File

@ -83,18 +83,15 @@ public class ItemSearchWidget extends FormSection
private class SearchFragment extends Submit { private class SearchFragment extends Submit {
private ItemSearchWidget parent; private ItemSearchWidget parent;
private ContentType contentType;
public SearchFragment(String name, public SearchFragment(String name, ItemSearchWidget parent) {
ItemSearchWidget parent,
ContentType contentType) {
super(name, "Search"); super(name, "Search");
this.parent = parent; this.parent = parent;
this.contentType = contentType;
this.setAttribute("onClick", "return " + parent.m_item.getName().replace('.', '_') + "Popup(this.form)"); this.setAttribute("onClick", "return " + parent.m_item.getName().replace('.', '_') + "Popup(this.form)");
this.setAttribute("value", "Search"); this.setAttribute("value", "Search");
} }
@Override
public boolean isVisible(PageState ps) { public boolean isVisible(PageState ps) {
return (!(parent.m_search.isSelected(ps) return (!(parent.m_search.isSelected(ps)
|| parent.m_searchComponent.hasQuery(ps)) || parent.m_searchComponent.hasQuery(ps))
@ -188,7 +185,7 @@ public class ItemSearchWidget extends FormSection
m_contentType = contentType; m_contentType = contentType;
m_item = new ItemFragment(model, this); m_item = new ItemFragment(model, this);
m_search = new SearchFragment(m_searchName, this, m_contentType); m_search = new SearchFragment(m_searchName, this);
m_clear = new ClearFragment(m_clearName, this); m_clear = new ClearFragment(m_clearName, this);
m_jsLabel = new LabelFragment("", false, this); m_jsLabel = new LabelFragment("", false, this);
m_jsLabel.addPrintListener(new PrintListener() { m_jsLabel.addPrintListener(new PrintListener() {

View File

@ -18,7 +18,6 @@
*/ */
package com.arsdigita.cms.ui.authoring; package com.arsdigita.cms.ui.authoring;
import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Form; import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
@ -34,11 +33,12 @@ import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentType; import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.ContentTypeCollection; import com.arsdigita.cms.ContentTypeCollection;
import com.arsdigita.cms.SecurityManager; import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.ui.ItemSearch;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.Kernel; import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.Party; import com.arsdigita.kernel.Party;
import com.arsdigita.kernel.permissions.PermissionDescriptor; import com.arsdigita.kernel.permissions.PermissionDescriptor;
import com.arsdigita.kernel.permissions.PermissionManager;
import com.arsdigita.kernel.permissions.PermissionService; import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor; import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
@ -58,16 +58,13 @@ import java.math.BigDecimal;
public abstract class NewItemForm extends Form { public abstract class NewItemForm extends Form {
public static final String RESOURCE_BUNDLE = public static final String RESOURCE_BUNDLE =
"com.arsdigita.cms.ui.authoring.AuthoringResources"; "com.arsdigita.cms.ui.authoring.AuthoringResources";
public static String DP_TYPE_PREFIX = public static String DP_TYPE_PREFIX =
"com.arsdigita.dp."; "com.arsdigita.dp.";
private SingleSelect m_typeWidget; private SingleSelect m_typeWidget;
private Submit m_submit; private Submit m_submit;
private Label m_emptyLabel; private Label m_emptyLabel;
private Label m_createLabel; private Label m_createLabel;
public static final String TYPE_ID = "tid"; public static final String TYPE_ID = "tid";
/** /**
@ -82,13 +79,11 @@ public abstract class NewItemForm extends Form {
panel.setWidth("2%"); panel.setWidth("2%");
panel.setBorder(0); panel.setBorder(0);
m_emptyLabel = new Label m_emptyLabel = new Label(globalize("cms.ui.authoring.no_types_registered"), false);
(globalize("cms.ui.authoring.no_types_registered"), false);
m_emptyLabel.setIdAttr("empty_label"); m_emptyLabel.setIdAttr("empty_label");
add(m_emptyLabel); add(m_emptyLabel);
m_createLabel = new Label m_createLabel = new Label(globalize("cms.ui.authoring.create_new"), false);
(globalize("cms.ui.authoring.create_new"), false);
m_createLabel.setIdAttr("create_label"); m_createLabel.setIdAttr("create_label");
add(m_createLabel); add(m_createLabel);
@ -96,68 +91,80 @@ public abstract class NewItemForm extends Form {
try { try {
m_typeWidget.addPrintListener(new PrintListener() { m_typeWidget.addPrintListener(new PrintListener() {
// Read the content section's content types and add them as options // Read the content section's content types and add them as options
public void prepare(PrintEvent e) { public void prepare(PrintEvent e) {
OptionGroup o = (OptionGroup)e.getTarget(); OptionGroup o = (OptionGroup) e.getTarget();
PageState state = e.getPageState(); PageState state = e.getPageState();
ContentSection section = getContentSection(state); ContentSection section = getContentSection(state);
ContentType parentType = null;
ContentTypeCollection typesCollection = null;
BigDecimal singleTypeID = (BigDecimal) state.getValue(new BigDecimalParameter(ItemSearch.SINGLE_TYPE_PARAM));
ContentTypeCollection c = section.getCreatableContentTypes(); if (singleTypeID != null) {
try {
parentType = new ContentType(singleTypeID);
} catch (DataObjectNotFoundException ex) {
parentType = null;
}
}
c.addOrder(ContentType.LABEL); if (parentType == null) {
typesCollection = section.getCreatableContentTypes();
} else {
typesCollection = section.getSiblingsOfContentType(parentType);
}
if(!c.isEmpty()) { typesCollection.addOrder(ContentType.LABEL);
// Add content types
while(c.next()) {
boolean list = true;
ContentType type = c.getContentType();
if (PermissionService.getDirectGrantedPermissions(type.getOID()).size() > 0) {
// chris gilbert - allow restriction of some types to certain
// users/groups. No interface to do this, but group could be
// created and permission granted in a content type loader
//
// can't permission filter the collection because most types
// will have no permissions granted. This approach involves
// a small overhead getting the count of granted permissions for
// each type (mitigated by only checking DIRECT permissions)
Party party = Kernel.getContext().getParty(); if (!typesCollection.isEmpty()) {
if (party == null) { // Add content types
party = Kernel.getPublicUser(); while (typesCollection.next()) {
} boolean list = true;
PermissionDescriptor create = new PermissionDescriptor(PrivilegeDescriptor.get(SecurityManager.CMS_NEW_ITEM), type, party ); ContentType type = typesCollection.getContentType();
list = PermissionService.checkPermission(create); if (PermissionService.getDirectGrantedPermissions(type.getOID()).size() > 0) {
// chris gilbert - allow restriction of some types to certain
// users/groups. No interface to do this, but group could be
// created and permission granted in a content type loader
//
// can't permission filter the collection because most types
// will have no permissions granted. This approach involves
// a small overhead getting the count of granted permissions for
// each type (mitigated by only checking DIRECT permissions)
Party party = Kernel.getContext().getParty();
if (party == null) {
party = Kernel.getPublicUser();
} }
if (list) { PermissionDescriptor create = new PermissionDescriptor(PrivilegeDescriptor.get(SecurityManager.CMS_NEW_ITEM), type, party);
list = PermissionService.checkPermission(create);
}
if (list) {
//for dp content type label localization //for dp content type label localization
//String t = type.getAssociatedObjectType(); //String t = type.getAssociatedObjectType();
String cn = type.getClassName(); String cn = type.getClassName();
String l = type.getLabel(); String l = type.getLabel();
if (cn.startsWith(DP_TYPE_PREFIX, 0)) { if (cn.startsWith(DP_TYPE_PREFIX, 0)) {
o.addOption(new Option o.addOption(new Option(type.getID().toString(),
(type.getID().toString(), new Label(globalize(l.replace(' ', '_')))));
new Label(globalize(l.replace(' ','_')))));
} else { } else {
o.addOption(new Option o.addOption(new Option(type.getID().toString(), type.getLabel()));
(type.getID().toString(), type.getLabel()));
} }
} }
}
c.reset();
} }
typesCollection.reset();
} }
}); }
});
} catch (java.util.TooManyListenersException e) { } catch (java.util.TooManyListenersException e) {
throw new UncheckedWrapperException("Too many listeners: " + e.getMessage(), e); throw new UncheckedWrapperException("Too many listeners: " + e.getMessage(), e);
} }
add(m_typeWidget); add(m_typeWidget);
m_submit = new Submit m_submit = new Submit("new", globalize("cms.ui.authoring.go"));
("new", globalize("cms.ui.authoring.go"));
add(m_submit); add(m_submit);
} }
@ -175,7 +182,7 @@ public abstract class NewItemForm extends Form {
// Generate XML - show/hide labels/widgets // Generate XML - show/hide labels/widgets
public void generateXML(PageState state, Element parent) { public void generateXML(PageState state, Element parent) {
if ( isVisible(state) ) { if (isVisible(state)) {
ContentSection section = getContentSection(state); ContentSection section = getContentSection(state);
ContentTypeCollection c = section.getCreatableContentTypes(); ContentTypeCollection c = section.getCreatableContentTypes();
@ -200,5 +207,4 @@ public abstract class NewItemForm extends Form {
public static GlobalizedMessage globalize(String key) { public static GlobalizedMessage globalize(String key) {
return new GlobalizedMessage(key, RESOURCE_BUNDLE); return new GlobalizedMessage(key, RESOURCE_BUNDLE);
} }
} }

View File

@ -44,16 +44,16 @@ public class TextAssetBodyLabelCellRenderer implements TableCellRenderer {
if (TextAsset.CONTENT.equals(key) && value instanceof TextAsset) { if (TextAsset.CONTENT.equals(key) && value instanceof TextAsset) {
// We have different styles for different mime types // We have different styles for different mime types
TextAsset asset = (TextAsset)value; TextAsset asset = (TextAsset)value;
label = new Label(asset.getText());
label.setIdAttr("webPage");
String type = asset.getMimeType().getMimeType() String type = asset.getMimeType().getMimeType()
.toLowerCase(); .toLowerCase();
if (type.indexOf("text/xml") > -1 || if (type.indexOf("text/xml") > -1 ||
type.indexOf("text/xsl") > -1 || type.indexOf("text/xsl") > -1 ||
type.indexOf("text/x-jsp") > -1) { type.indexOf("text/x-jsp") > -1) {
label = new Label(asset.getText());
label.setClassAttr("preformatted"); label.setClassAttr("preformatted");
label.setOutputEscaping(true); label.setOutputEscaping(true);
} else { } else {
label = new Label(asset.getText());
label.setOutputEscaping(false); label.setOutputEscaping(false);
} }
} else if (MIME_TYPE_KEY.equals(key) && value instanceof TextAsset) { } else if (MIME_TYPE_KEY.equals(key) && value instanceof TextAsset) {

View File

@ -57,11 +57,11 @@ import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.tree.TreeCellRenderer; import com.arsdigita.bebop.tree.TreeCellRenderer;
import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.Folder; import com.arsdigita.cms.Folder;
import com.arsdigita.cms.ItemCollection; import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.SecurityManager; import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.dispatcher.Utilities; import com.arsdigita.cms.dispatcher.Utilities;
import com.arsdigita.cms.ui.FlatItemList;
import com.arsdigita.cms.util.GlobalizationUtil; import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.domain.DomainObjectFactory;
@ -129,6 +129,7 @@ public class FolderManipulator extends SimpleContainer
m_targetSelector.addSubmissionListener(this); m_targetSelector.addSubmissionListener(this);
} }
@Override
public void register(Page p) { public void register(Page p) {
super.register(p); super.register(p);
p.setVisibleDefault(m_targetSelector, false); p.setVisibleDefault(m_targetSelector, false);
@ -369,6 +370,7 @@ public class FolderManipulator extends SimpleContainer
add(scs); add(scs);
} }
@Override
public void register(Page p) { public void register(Page p) {
super.register(p); super.register(p);
p.addComponentStateParam(this, m_targetSel.getStateParameter()); p.addComponentStateParam(this, m_targetSel.getStateParameter());
@ -429,7 +431,7 @@ public class FolderManipulator extends SimpleContainer
m_browser = new FolderBrowser(m_srcFolderSel); m_browser = new FolderBrowser(m_srcFolderSel);
m_paginator = new Paginator m_paginator = new Paginator
((PaginationModelBuilder)m_browser.getModelBuilder(), ((PaginationModelBuilder)m_browser.getModelBuilder(),
FlatItemList.LIST_SIZE); ContentSection.getConfig().getFolderBrowseListSize());
panel.add(m_paginator); panel.add(m_paginator);
panel.add(m_browser); panel.add(m_browser);

View File

@ -24,8 +24,6 @@ import com.arsdigita.categorization.Category;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentSection; import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentSectionCollection; import com.arsdigita.cms.ContentSectionCollection;
import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.ContentTypeCollection;
import com.arsdigita.cms.SecurityManager; import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.search.CreationDateFilterType; import com.arsdigita.cms.search.CreationDateFilterType;
import com.arsdigita.cms.search.CreationUserFilterType; import com.arsdigita.cms.search.CreationUserFilterType;
@ -124,6 +122,7 @@ public class ItemQueryComponent extends BaseQueryComponent {
} }
@Override
public boolean isVisible(PageState state) { public boolean isVisible(PageState state) {
return !ContentSection.getConfig().getHideLaunchDate() return !ContentSection.getConfig().getHideLaunchDate()
&& super.isVisible(state); && super.isVisible(state);