diff --git a/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig.java b/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig.java index 6d4fd8099..68a13a90e 100755 --- a/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig.java +++ b/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig.java @@ -151,6 +151,8 @@ public final class ContentSectionConfig extends AbstractConfig { private final Parameter m_deleteWorkflowNotificationsWhenSent; private final Parameter m_hasContactsAuthoringStep; private final Parameter m_categoryTreeOrdering; + private final Parameter m_hideTextAssetUploadFile; + private final Parameter m_allowContentCreateInSectionListing; /** * Do not instantiate this class directly. @@ -397,6 +399,15 @@ public final class ContentSectionConfig extends AbstractConfig { ("com.arsdigita.cms.has_contacts_authoring_step", Parameter.REQUIRED, new Boolean(false)); + m_hideTextAssetUploadFile = new BooleanParameter( + "com.arsdigita.cms.hide_text_asset_upload_file", + Parameter.REQUIRED, + new Boolean(false)); + + m_allowContentCreateInSectionListing = new BooleanParameter( + "com.arsdigita.cms.allow_content_create_in_section_listing", + Parameter.REQUIRED, + new Boolean(true)); register(m_templateRootPath); register(m_defaultItemTemplatePath); @@ -445,6 +456,8 @@ public final class ContentSectionConfig extends AbstractConfig { register(m_deleteWorkflowNotificationsWhenSent); register(m_categoryTreeOrdering); register(m_hasContactsAuthoringStep); + register(m_hideTextAssetUploadFile); + register(m_allowContentCreateInSectionListing); loadInfo(); } @@ -806,5 +819,12 @@ public final class ContentSectionConfig extends AbstractConfig { public boolean getHasContactsAuthoringStep() { return ((Boolean) get(m_hasContactsAuthoringStep)).booleanValue(); } - + + public final boolean getHideTextAssetUploadFile() { + return ((Boolean) get(m_hideTextAssetUploadFile)).booleanValue(); + } + + public final boolean getAllowContentCreateInSectionListing() { + return ((Boolean) get(m_allowContentCreateInSectionListing)).booleanValue(); + } } diff --git a/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig_parameter.properties b/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig_parameter.properties index 871ae5902..348ed9630 100755 --- a/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig_parameter.properties +++ b/ccm-cms/src/com/arsdigita/cms/ContentSectionConfig_parameter.properties @@ -232,3 +232,13 @@ com.arsdigita.cms.has_contacts_authoring_step.title=Contacts for content items com.arsdigita.cms.has_contacts_authoring_step.purpose=Allows you to add a Contact authoring step to all items com.arsdigita.cms.has_contacts_authoring_step.example=false com.arsdigita.cms.has_contacts_authoring_step.format=[boolean] + +com.arsdigita.cms.hide_text_asset_upload_file.title=Hide upload file link for text assets +com.arsdigita.cms.hide_text_asset_upload_file.purpose=Hide the upload file link in the editing of a text asset +com.arsdigita.cms.hide_text_asset_upload_file.example=false +com.arsdigita.cms.hide_text_asset_upload_file.format=[boolean] + +com.arsdigita.cms.allow_content_create_in_section_listing.title=Allow content creation in section listing +com.arsdigita.cms.allow_content_create_in_section_listing.purpose=Allows you to turn off the ability to create content in the section listing +com.arsdigita.cms.allow_content_create_in_section_listing.example=true +com.arsdigita.cms.allow_content_create_in_section_listing.format=[boolean] diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ContentSectionContainer.java b/ccm-cms/src/com/arsdigita/cms/ui/ContentSectionContainer.java index dddb6f025..cc02bd8f9 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/ContentSectionContainer.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ContentSectionContainer.java @@ -19,6 +19,8 @@ package com.arsdigita.cms.ui; +import java.math.BigDecimal; + import com.arsdigita.bebop.Component; import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.Label; @@ -55,8 +57,6 @@ import com.arsdigita.util.Assert; import com.arsdigita.util.LockableImpl; import com.arsdigita.web.Web; -import java.math.BigDecimal; - /** * Displays all the content sections in table, with links to the admin * and public pages. Also displays a form for each content section to @@ -107,15 +107,15 @@ public class ContentSectionContainer extends CMSContainer { m_typeSel = typeSel; m_sectionSel = sectionSel; - m_formContainer = new FormContainer(); - add(m_formContainer); + m_formContainer = new FormContainer(); + add(m_formContainer); m_table = new ContentSectionTable(); add(m_table); } public void register(Page p) { super.register(p); - p.setVisibleDefault(m_formContainer, false); + p.setVisibleDefault(m_formContainer, false); } private class FormContainer extends CMSContainer { @@ -208,7 +208,7 @@ public class ContentSectionContainer extends CMSContainer { * @pre ( state != null && id != null ) **/ public void setSectionId(PageState state, BigDecimal id) { - Assert.assertNotNull(id); + Assert.exists(id); m_sectionIDParamWidget.setValue(state, id); } @@ -226,7 +226,7 @@ public class ContentSectionContainer extends CMSContainer { **/ public ContentSection getContentSection(PageState state) { BigDecimal id = getContentSectionID(state); - Assert.assertNotNull(id); + Assert.exists(id); ContentSection section; try { section = new ContentSection(id); @@ -435,7 +435,8 @@ public class ContentSectionContainer extends CMSContainer { // If the user has no access, return an empty Label SecurityManager sm = new SecurityManager(section); - if (! sm.canAccess(state.getRequest(), SecurityManager.NEW_ITEM, folder)) { + if (! sm.canAccess(state.getRequest(), SecurityManager.NEW_ITEM, folder) + || !ContentSection.getConfig().getAllowContentCreateInSectionListing()) { return new Label(" ", false); } else { // set the value of the sectionIdParameter in the form diff --git a/ccm-cms/src/com/arsdigita/cms/ui/authoring/BasicItemForm.java b/ccm-cms/src/com/arsdigita/cms/ui/authoring/BasicItemForm.java index a18771a7e..4ed151079 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/authoring/BasicItemForm.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/authoring/BasicItemForm.java @@ -168,7 +168,8 @@ public abstract class BasicItemForm extends FormSection nameWidget.setOnBlur( "if (this.value == '') " + "{ defaulting = true; this.value = urlize(this.form." + TITLE + - ".value) }" + ".value) } " + + " else { this.value = urlize(this.value); }" ); add(nameWidget); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextAssetBody.java b/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextAssetBody.java index f0cace149..df474055d 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextAssetBody.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextAssetBody.java @@ -50,6 +50,7 @@ import com.arsdigita.bebop.parameters.NotNullValidationListener; import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.cms.Asset; import com.arsdigita.cms.ContentSection; +import com.arsdigita.cms.ContentSectionConfig; import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.TextAsset; import com.arsdigita.cms.ui.CMSDHTMLEditor; @@ -101,6 +102,11 @@ public abstract class TextAssetBody extends SecurityPropertyEditor private StringParameter m_streamlinedCreationParam; private static final String STREAMLINED = "_streamlined"; private static final String STREAMLINED_DONE = "1"; + + private static final ContentSectionConfig s_config = new ContentSectionConfig(); + static { + s_config.load(); + } /** * Construct a new TextPageBody component @@ -128,10 +134,12 @@ public abstract class TextAssetBody extends SecurityPropertyEditor new StringParameter(parent == null ? "item" : parent.getContentType().getAssociatedObjectType() + "_body_done"); - PageFileForm f = getPageFileForm(); - addFileWidgets(f); - add(FILE_UPLOAD, "Upload a file", f, - f.getSaveCancelSection().getCancelButton()); + if (!s_config.getHideTextAssetUploadFile()) { + PageFileForm f = getPageFileForm(); + addFileWidgets(f); + add(FILE_UPLOAD, "Upload a file", f, + f.getSaveCancelSection().getCancelButton()); + } PageTextForm t = new PageTextForm(); addTextWidgets(t); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextPageBody.java b/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextPageBody.java index adb44aa76..e48a071e5 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextPageBody.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/authoring/TextPageBody.java @@ -78,8 +78,10 @@ public class TextPageBody extends TextAssetBody { // Set the right component access on the forms Component f = getComponent(FILE_UPLOAD); - setComponentAccess(FILE_UPLOAD, - new WorkflowLockedComponentAccess(f, itemModel)); + if (f != null) { + setComponentAccess(FILE_UPLOAD, + new WorkflowLockedComponentAccess(f, itemModel)); + } Component t = getComponent(TEXT_ENTRY); setComponentAccess(TEXT_ENTRY, new WorkflowLockedComponentAccess(t, itemModel)); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/category/BaseCategoryForm.java b/ccm-cms/src/com/arsdigita/cms/ui/category/BaseCategoryForm.java index 4687ae198..06be016ca 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/category/BaseCategoryForm.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/category/BaseCategoryForm.java @@ -130,7 +130,8 @@ class BaseCategoryForm extends BaseForm { m_url.setOnFocus("defaulting = false"); m_url.setOnBlur("if (this.value == '') " + "{ defaulting = true; this.value = urlize(this.form." + NAME + - ".value) }"); + ".value) } " + + "else { this.value = urlize(this.value); }"); addField(gz("cms.ui.category.url"),m_url); addAction(new Finish()); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryItemPane.java b/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryItemPane.java index a88433d7f..a6764783c 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryItemPane.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryItemPane.java @@ -35,6 +35,7 @@ import com.arsdigita.bebop.form.Submit; import com.arsdigita.categorization.CategorizationConfig; import com.arsdigita.categorization.CategorizedCollection; import com.arsdigita.categorization.Category; +import com.arsdigita.categorization.CategoryCollection; import com.arsdigita.categorization.CategoryNotFoundException; import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentItem; @@ -55,7 +56,6 @@ import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.OID; import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.PropertyList; -import com.arsdigita.toolbox.ui.PropertyList.Property; import com.arsdigita.toolbox.ui.Section; import com.arsdigita.util.Assert; import com.arsdigita.web.Web; @@ -267,10 +267,23 @@ class CategoryItemPane extends BaseItemPane { final Category category = m_category.getCategory(state); final ACSObject item = category.getDirectIndexObject(); - String itemTitle = ""; + String itemTitle = "None"; if (item != null) { itemTitle = item.getDisplayName(); + } else if (!category.ignoreParentIndexItem() + && category.getParentCategoryCount() > 0) + { + Category ancestor = findParentCategoryWithNonInheritedIndexItem(category); + if (ancestor != null) { + if (ancestor.getIndexObject() != null) { + itemTitle = ancestor.getIndexObject().getDisplayName(); + } + itemTitle += " (Inherited from " + + ancestor.getDisplayName() + ")"; + } else { + // The complete hierarchy is set to inherit. + // Just leave the itemTitle as None. } props.add(new Property(gz("cms.ui.name"), @@ -293,6 +306,27 @@ class CategoryItemPane extends BaseItemPane { return props; } } + } + + // Loop over the parents and recurse up the hierarchy the find the first + // parent with an explicit index item ignoreParentIndexItem is true. + private Category findParentCategoryWithNonInheritedIndexItem(Category c) { + if (c.getParentCategoryCount() == 0) { + return null; + } + CategoryCollection parents = c.getParents(); + while (parents.next()) { + Category p = parents.getCategory(); + if (p.getDirectIndexObject() != null || p.ignoreParentIndexItem()) { + return p; + } + // Try the parents of this parent. + Category gp = findParentCategoryWithNonInheritedIndexItem(p); + if (gp != null) { + return gp; + } + } + return null; } // Quasimodo: BEGIN diff --git a/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryLocalizationForm.java b/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryLocalizationForm.java index 28c979602..e2d1daf37 100644 --- a/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryLocalizationForm.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/category/CategoryLocalizationForm.java @@ -147,7 +147,8 @@ public class CategoryLocalizationForm extends BaseForm { m_url.setOnFocus("defaulting = false"); m_url.setOnBlur("if (this.value == '') " + "{ defaulting = true; this.value = urlize(this.form." + NAME + - ".value) }"); + ".value) } " + + "else { this.value = urlize(this.value); }"); addField(gz("cms.ui.category.url"),m_url); addAction(new Finish()); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/category/IndexItemSelectionForm.java b/ccm-cms/src/com/arsdigita/cms/ui/category/IndexItemSelectionForm.java index 190e936d2..894edf8df 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/category/IndexItemSelectionForm.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/category/IndexItemSelectionForm.java @@ -88,57 +88,53 @@ public class IndexItemSelectionForm extends CMSForm { m_options = new RadioGroup(new StringParameter("items")); try { m_options.addPrintListener(new PrintListener() { - public void prepare(PrintEvent event) { - RadioGroup group = (RadioGroup)event.getTarget(); - PageState state = event.getPageState(); - Category category = getCategory(event.getPageState()); - CategorizedCollection children = category.getObjects - (ContentItem.BASE_DATA_OBJECT_TYPE); + public void prepare(PrintEvent event) { + RadioGroup group = (RadioGroup)event.getTarget(); + PageState state = event.getPageState(); + Category category = getCategory(event.getPageState()); + CategorizedCollection children = category.getObjects + (ContentItem.BASE_DATA_OBJECT_TYPE); - boolean valueSet = false; + // option for NO index Object + group.addOption(new Option(NONE_OPTION_VALUE, + new Label(NONE_OPTION_VALUE))); - // option for NO index Object - group.addOption(new Option(NONE_OPTION_VALUE, - new Label(NONE_OPTION_VALUE))); - - while (children.next()) { - ACSObject item = - (ACSObject) children.getDomainObject(); - - if ((item instanceof ContentItem) && - ((ContentItem) item).getVersion().equals(ContentItem.DRAFT)) { - - group.addOption - (new Option(item.getID().toString(), - ((ContentItem)item).getName())); - } - } - // get currently selected item - ACSObject indexItem = - category.getDirectIndexObject(); - if (indexItem != null && indexItem instanceof ContentItem) { - group.setValue - (state, - ((ContentItem)indexItem) - .getWorkingVersion() - .getID().toString()); - valueSet = true; - } - else{ - group.setValue(state, NONE_OPTION_VALUE); - valueSet = true; - } - - if (category.getParentCategoryCount() > 0) { - group.addOption - (new Option(NULL_OPTION_VALUE, new Label - ("Inherit Index from Parent Categoy"))); - if (!valueSet) { - group.setValue(state, NULL_OPTION_VALUE); - } - } - } - }); + // option for inheriting from the parent category + if (category.getParentCategoryCount() > 0) { + group.addOption + (new Option(NULL_OPTION_VALUE, + new Label("Inherit Index from Parent Category"))); + } + + while (children.next()) { + ACSObject item = + (ACSObject) children.getDomainObject(); + + if ((item instanceof ContentItem) && + ((ContentItem) item).getVersion().equals(ContentItem.DRAFT)) + { + group.addOption + (new Option(item.getID().toString(), + ((ContentItem)item).getName())); + } + } + // get currently selected item + ACSObject indexItem = category.getDirectIndexObject(); + if (indexItem != null && indexItem instanceof ContentItem) { + group.setValue(state, ((ContentItem) indexItem) + .getWorkingVersion() + .getID().toString()); + } else { + String value = NONE_OPTION_VALUE; + if (!category.ignoreParentIndexItem() + && category.getParentCategoryCount() > 0) + { + value = NULL_OPTION_VALUE; + } + group.setValue(state, value); + } + } + }); } catch (java.util.TooManyListenersException e) { s_log.error("Error adding init listener to Radio Group", e); throw new UncheckedWrapperException(e); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBaseForm.java b/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBaseForm.java index a0c3438eb..f61ad2378 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBaseForm.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBaseForm.java @@ -67,6 +67,8 @@ abstract class FolderBaseForm extends CMSForm { "if (this.value == '') {" + " defaulting = true;" + " this.value = urlize(this.form." + TITLE + ".value)" + + "} else {" + + " this.value = urlize(this.value);" + "}"; private Label m_script = new Label("", false); diff --git a/ccm-cms/src/com/arsdigita/cms/ui/templates/TemplateBody.java b/ccm-cms/src/com/arsdigita/cms/ui/templates/TemplateBody.java index 2145221bd..e127f8b0b 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/templates/TemplateBody.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/templates/TemplateBody.java @@ -91,8 +91,10 @@ public class TemplateBody extends TextAssetBody { // Set the right component access on the forms - // FIXME: Update this for templating permissions ! Component f = getComponent(FILE_UPLOAD); - setComponentAccess(FILE_UPLOAD, - new WorkflowLockedComponentAccess(f, itemModel)); + if (f != null) { + setComponentAccess(FILE_UPLOAD, + new WorkflowLockedComponentAccess(f, itemModel)); + } Component t = getComponent(TEXT_ENTRY); setComponentAccess(TEXT_ENTRY, new WorkflowLockedComponentAccess(t, itemModel));