Removed depcrecated packages com.arsdigita.cms.ui.authoring.article, com.arsdigita.cms.ui.authoring.event, com.arsdigita.cms.ui.authoring.multipartarticle and com.arsdigita.cms.ui.authoring.news from ccm-cms
parent
70e723f4d6
commit
282fbfe815
|
|
@ -41,7 +41,6 @@ import com.arsdigita.cms.CMS;
|
|||
import org.librecms.contentsection.ContentSection;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.CreationSelector;
|
||||
import com.arsdigita.cms.ui.authoring.news.NewItemForm;
|
||||
import com.arsdigita.cms.ui.folder.FolderCreateForm;
|
||||
import com.arsdigita.cms.ui.folder.FolderEditorForm;
|
||||
import com.arsdigita.cms.ui.folder.FolderManipulator;
|
||||
|
|
@ -51,7 +50,6 @@ import com.arsdigita.cms.ui.folder.FolderSelectionModel;
|
|||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import com.arsdigita.toolbox.ui.ActionGroup;
|
||||
import com.arsdigita.ui.CcmObjectSelectionModel;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
|
|
@ -84,8 +82,6 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
|||
|
||||
private final FolderRequestLocal folderRequestLocal;
|
||||
|
||||
private final NewItemForm newItemForm;
|
||||
|
||||
private final SingleSelectionModel<Long> typeSelectionModel;
|
||||
|
||||
private final CreationSelector creationSelector;
|
||||
|
|
@ -177,10 +173,6 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
|||
editFolderAction.addActionListener(this);
|
||||
browseActions.addAction(editFolderAction);
|
||||
|
||||
newItemForm = new SectionNewItemForm("newItem");
|
||||
newItemForm.addProcessListener(this);
|
||||
browseActions.addAction(newItemForm);
|
||||
|
||||
permissionsSegment = addSegment();
|
||||
permissionsSegment.setIdAttr("folder-permissions");
|
||||
|
||||
|
|
@ -283,7 +275,6 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
|||
}
|
||||
|
||||
createFolderAction.setVisible(state, newItem);
|
||||
newItemForm.setVisible(state, newItem);
|
||||
|
||||
final boolean editItem = permissionChecker.isPermitted(
|
||||
ItemPrivileges.EDIT, folder);
|
||||
|
|
@ -350,11 +341,7 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
|||
public void process(final FormSectionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final Object source = event.getSource();
|
||||
if (source == newItemForm) {
|
||||
final Long typeID = newItemForm.getTypeID(state);
|
||||
typeSelectionModel.setSelectedKey(state, typeID);
|
||||
newItemMode(state);
|
||||
} else if (source == folderCreator || source == folderEditor) {
|
||||
if (source == folderCreator || source == folderEditor) {
|
||||
browseMode(state);
|
||||
} else if (source == folderManipulator.getItemView()) {
|
||||
// Hide everything except for the browseSeg
|
||||
|
|
@ -439,19 +426,6 @@ public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
|||
// }
|
||||
}
|
||||
|
||||
private static class SectionNewItemForm extends NewItemForm {
|
||||
|
||||
public SectionNewItemForm(final String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContentSection getContentSection(final PageState state) {
|
||||
return CMS.getContext().getContentSection();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the GlobalizedMessage using a CMS Class targetBundle.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,109 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.article;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Authoring step to edit the simple attributes of the Article content type (and
|
||||
* its subclasses). The attributes edited are 'name', 'title', 'article date',
|
||||
* 'location', 'lead', and 'article type'. This authoring step replaces the
|
||||
* {@code com.arsdigita.ui.authoring.PageEdit} step for this type.
|
||||
*/
|
||||
public class ArticlePropertiesStep extends GenericArticlePropertiesStep {
|
||||
|
||||
/**
|
||||
* The name of the editing sheet added to this step
|
||||
*/
|
||||
public final static String EDIT_SHEET_NAME = "edit";
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
public ArticlePropertiesStep(final ItemSelectionModel itemModel,
|
||||
final AuthoringKitWizard parent,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemModel, parent, selectedLanguageParam);
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createEditSheet(final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final BasicPageForm editSheet = new ArticlePropertyForm(
|
||||
itemModel,
|
||||
this,
|
||||
selectedLanguageParam);
|
||||
add(EDIT_SHEET_NAME,
|
||||
new GlobalizedMessage("cms.ui.edit", CmsConstants.CMS_BUNDLE),
|
||||
new WorkflowLockedComponentAccess(editSheet, itemModel),
|
||||
editSheet.getSaveCancelSection().getCancelButton());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setDisplayComponent(
|
||||
final ItemSelectionModel itemModel) {
|
||||
setDisplayComponent(getArticlePropertySheet(itemModel,
|
||||
selectedLanguageParam));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a component that displays the properties of the Article specified
|
||||
* by the ItemSelectionModel passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
* @pre itemModel != null
|
||||
* @return A component to display the state of the basic properties of the
|
||||
* release
|
||||
*/
|
||||
public static Component getArticlePropertySheet(
|
||||
final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final DomainObjectPropertySheet sheet
|
||||
= (DomainObjectPropertySheet) getGenericArticlePropertySheet(
|
||||
itemModel,
|
||||
selectedLanguageParam);
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.lead",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"description");
|
||||
|
||||
return sheet;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,193 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.article;
|
||||
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.form.TextArea;
|
||||
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
||||
import com.arsdigita.bebop.parameters.ParameterModel;
|
||||
import com.arsdigita.bebop.parameters.StringInRangeValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.librecms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.Article;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Form to edit the basic properties of an article. This form can be extended to
|
||||
* create forms for Article subclasses.
|
||||
*/
|
||||
public class ArticlePropertyForm extends GenericArticlePropertyForm
|
||||
implements FormProcessListener, FormInitListener, FormSubmissionListener {
|
||||
|
||||
public static final String LEAD = "lead";
|
||||
|
||||
private final ArticlePropertiesStep propertiesStep;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the Article object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use to obtain the
|
||||
* Article to work on
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public ArticlePropertyForm(final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
this(itemModel, null, selectedLanguageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the Article object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use to obtain the
|
||||
* Article to work on
|
||||
* @param propertiesStep The ArticlePropertiesStep which controls
|
||||
* this form.
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public ArticlePropertyForm(
|
||||
final ItemSelectionModel itemModel,
|
||||
final ArticlePropertiesStep propertiesStep,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemModel, propertiesStep, selectedLanguageParam);
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
this.propertiesStep = propertiesStep;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
addSubmissionListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds widgets to the form.
|
||||
*/
|
||||
@Override
|
||||
protected void addWidgets() {
|
||||
super.addWidgets();
|
||||
|
||||
ParameterModel leadParam = new StringParameter(LEAD);
|
||||
if (CMSConfig.getConfig().isMandatoryDescriptions()) {
|
||||
leadParam.addParameterListener(
|
||||
new NotEmptyValidationListener(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.description_missing",
|
||||
CmsConstants.CMS_BUNDLE)));
|
||||
}
|
||||
leadParam
|
||||
.addParameterListener(new StringInRangeValidationListener(0,
|
||||
1000));
|
||||
TextArea lead = new TextArea(leadParam);
|
||||
lead.setLabel(new GlobalizedMessage("cms.contenttypes.ui.lead",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
lead.setHint(new GlobalizedMessage("cms.contenttypes.ui.lead_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
lead.setCols(40);
|
||||
lead.setRows(5);
|
||||
add(lead);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate(final FormSectionEvent event) throws
|
||||
FormProcessException {
|
||||
super.validate(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Form initialisation hook. Fills widgets with data.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) {
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
final Article article = (Article) super.initBasicWidgets(event);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
data.put(LEAD, article.getDescription().getValue(selectedLocale));
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels streamlined editing.
|
||||
*/
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event) {
|
||||
if (propertiesStep != null && getSaveCancelSection().getCancelButton()
|
||||
.isSelected(event.getPageState())) {
|
||||
propertiesStep.cancelStreamlinedCreation(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Form processing hook. Saves Event object.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void process(final FormSectionEvent event) {
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final Article article = (Article) super.processBasicWidgets(event);
|
||||
|
||||
// save only if save button was pressed
|
||||
if (article != null
|
||||
&& getSaveCancelSection().getSaveButton()
|
||||
.isSelected(event.getPageState())) {
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
article
|
||||
.getDescription()
|
||||
.putValue(selectedLocale, (String) data.get(LEAD));
|
||||
|
||||
final ContentItemRepository itemRepo = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ContentItemRepository.class);
|
||||
itemRepo.save(article);
|
||||
}
|
||||
if (propertiesStep != null) {
|
||||
propertiesStep.maybeForwardToNextStep(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,159 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.article;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.SingleSelect;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.cms.ui.authoring.TextBody;
|
||||
|
||||
import org.librecms.contenttypes.Article;
|
||||
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Displays the current text body of the article and allows the user to edit it,
|
||||
* by uploading a file or entering text in a text box.
|
||||
*
|
||||
* The {@link com.arsdigita.bebop.PropertySheet} class is often used as the
|
||||
* display component in the default authoring kit steps of this class.
|
||||
*
|
||||
* @author Stanislav Freidin (sfreidin@arsdigita.com)
|
||||
* @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ArticleTextBody extends TextBody {
|
||||
|
||||
private final AuthoringKitWizard authoringKitWizard;
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
/**
|
||||
* Construct a new GenericArticleBody component
|
||||
*
|
||||
* @param itemSelectionModel The {@link ItemSelectionModel} which will be
|
||||
* responsible for loading the current item
|
||||
*
|
||||
* @param authoringKitWizard The parent wizard which contains the form.
|
||||
* The form may use the wizard's methods, such
|
||||
* as stepForward and stepBack, in its process
|
||||
* listener.
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public ArticleTextBody(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemSelectionModel, selectedLanguageParam);
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
this.authoringKitWizard = authoringKitWizard;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
// Rest the component when it is hidden
|
||||
authoringKitWizard
|
||||
.getList()
|
||||
.addActionListener(event -> reset(event.getPageState()));
|
||||
|
||||
// Set the right component access on the forms
|
||||
final Component uploadComponent = getComponent(FILE_UPLOAD);
|
||||
if (uploadComponent != null) {
|
||||
setComponentAccess(FILE_UPLOAD,
|
||||
new WorkflowLockedComponentAccess(
|
||||
uploadComponent, itemSelectionModel));
|
||||
}
|
||||
final Component textEntryComponent = getComponent(TEXT_ENTRY);
|
||||
setComponentAccess(TEXT_ENTRY,
|
||||
new WorkflowLockedComponentAccess(
|
||||
textEntryComponent, itemSelectionModel));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the options for the mime type select widget of
|
||||
* <code>GenericArticleForm</code> and sets the default mime type.
|
||||
*
|
||||
* @param mimeSelect
|
||||
*/
|
||||
@Override
|
||||
protected void setMimeTypeOptions(final SingleSelect mimeSelect) {
|
||||
mimeSelect.addOption(new Option("text/html", "HTML Text"));
|
||||
mimeSelect.setOptionSelected("text/html");
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the text for the currently selected locale.
|
||||
*
|
||||
* @param state the current page state
|
||||
* @param text the new text for the currently selected locale
|
||||
*/
|
||||
@Override
|
||||
protected void updateText(final PageState state,
|
||||
final String text) {
|
||||
|
||||
final Article article = getSelectedArticle(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
article.getText().putValue(selectedLocale, text);
|
||||
|
||||
final ContentItemRepository itemRepo = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ContentItemRepository.class);
|
||||
itemRepo.save(article);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current {@link Article}
|
||||
*
|
||||
* @param state The current page state.
|
||||
*
|
||||
* @return The currently selected article.
|
||||
*/
|
||||
protected Article getSelectedArticle(final PageState state) {
|
||||
|
||||
return (Article) itemSelectionModel.getSelectedObject(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTextPropertyName() {
|
||||
return "text";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(final PageState state) {
|
||||
|
||||
final Article article = getSelectedArticle(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
return article.getText().getValue(selectedLocale);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,152 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.article;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.librecms.CMSConfig;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Authoring step to edit the simple attributes of the GenericArticle content
|
||||
* type (and its subclasses). The attributes edited are 'name', 'title',
|
||||
* 'article date', 'location', and 'article type'. This authoring step replaces
|
||||
* the {@code com.arsdigita.ui.authoring.PageEdit} step for this type.
|
||||
*/
|
||||
public class GenericArticlePropertiesStep extends SimpleEditStep {
|
||||
|
||||
/**
|
||||
* The name of the editing sheet added to this step
|
||||
*/
|
||||
public static final String EDIT_SHEET_NAME = "edit";
|
||||
|
||||
private DomainObjectPropertySheet domainObjectPropertySheet;
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
public GenericArticlePropertiesStep(
|
||||
final ItemSelectionModel itemModel,
|
||||
final AuthoringKitWizard parent,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemModel, parent, selectedLanguageParam);
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
setDefaultEditKey(EDIT_SHEET_NAME);
|
||||
createEditSheet(itemModel, selectedLanguageParam);
|
||||
|
||||
setDisplayComponent(itemModel);
|
||||
}
|
||||
|
||||
protected void createEditSheet(final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final BasicPageForm editSheet = new GenericArticlePropertyForm(
|
||||
itemModel,
|
||||
this,
|
||||
selectedLanguageParam);
|
||||
add(EDIT_SHEET_NAME,
|
||||
new GlobalizedMessage("cms.ui.edit", CmsConstants.CMS_BUNDLE),
|
||||
new WorkflowLockedComponentAccess(editSheet, itemModel),
|
||||
editSheet.getSaveCancelSection().getCancelButton());
|
||||
}
|
||||
|
||||
protected void setDisplayComponent(final ItemSelectionModel itemModel) {
|
||||
setDisplayComponent(getGenericArticlePropertySheet(
|
||||
itemModel,
|
||||
selectedLanguageParam));
|
||||
}
|
||||
|
||||
protected StringParameter getSelectedLanguageParam() {
|
||||
return selectedLanguageParam;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a component that displays the properties of the Article specified
|
||||
* by the ItemSelectionModel passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
* @pre itemModel != null
|
||||
* @return A component to display the state of the basic properties of the
|
||||
* release
|
||||
*/
|
||||
public static Component getGenericArticlePropertySheet(
|
||||
final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(
|
||||
itemModel,
|
||||
false,
|
||||
selectedLanguageParam);
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.title",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"title");
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.name",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"name");
|
||||
if (!CMSConfig.getConfig().isHideLaunchDate()) {
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.launch_date",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"launchDate",
|
||||
new DomainObjectPropertySheet.AttributeFormatter() {
|
||||
|
||||
@Override
|
||||
public String format(final Object item,
|
||||
final String attribute,
|
||||
final PageState state) {
|
||||
final ContentItem page = (ContentItem) item;
|
||||
if (page.getLaunchDate() != null) {
|
||||
return DateFormat
|
||||
.getDateInstance(DateFormat.LONG)
|
||||
.format(page.getLaunchDate());
|
||||
} else {
|
||||
return (String) new GlobalizedMessage(
|
||||
"cms.ui.unknown",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
return sheet;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,148 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.article;
|
||||
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.librecms.contenttypes.Article;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
|
||||
/**
|
||||
* Form to edit the basic properties of an article. This form can be extended to
|
||||
* create forms for Article subclasses.
|
||||
*/
|
||||
public class GenericArticlePropertyForm extends BasicPageForm
|
||||
implements FormProcessListener, FormInitListener, FormSubmissionListener {
|
||||
|
||||
private GenericArticlePropertiesStep propertiesStep;
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the Article object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use to obtain the Article to
|
||||
* work on
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public GenericArticlePropertyForm(
|
||||
final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
this(itemModel, null, selectedLanguageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the GenericArticle object specified by the
|
||||
* item selection model passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use to obtain the
|
||||
* GenericArticle to work on
|
||||
* @param step The GenericArticlePropertiesStep which controls this
|
||||
* form.
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public GenericArticlePropertyForm(
|
||||
final ItemSelectionModel itemModel,
|
||||
final GenericArticlePropertiesStep step,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(ID, itemModel, selectedLanguageParam);
|
||||
propertiesStep = step;
|
||||
addSubmissionListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds widgets to the form.
|
||||
*/
|
||||
@Override
|
||||
protected void addWidgets() {
|
||||
super.addWidgets();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
super.validate(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Form initialisation hook. Fills widgets with data.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) {
|
||||
// Do some initialization hook stuff
|
||||
final FormData data = event.getFormData();
|
||||
final Article article = (Article) super.initBasicWidgets(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels streamlined editing.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event) {
|
||||
if (propertiesStep != null
|
||||
&& getSaveCancelSection().getCancelButton().isSelected(event
|
||||
.getPageState())) {
|
||||
propertiesStep.cancelStreamlinedCreation(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Form processing hook. Saves Event object.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void process(final FormSectionEvent event) {
|
||||
|
||||
final Article article = (Article) super.processBasicWidgets(event);
|
||||
|
||||
// save only if save button was pressed
|
||||
if (article != null
|
||||
&& getSaveCancelSection().getSaveButton().isSelected(event
|
||||
.getPageState())) {
|
||||
|
||||
final ContentItemRepository itemRepo = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ContentItemRepository.class);
|
||||
|
||||
itemRepo.save(article);
|
||||
}
|
||||
if (propertiesStep != null) {
|
||||
propertiesStep.maybeForwardToNextStep(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,290 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.event;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.librecms.contenttypes.Event;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ToolboxConstants;
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contenttypes.EventConfig;
|
||||
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.IntrospectionException;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.PropertyDescriptor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.text.DateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Authoring step to view/edit the simple attributes of the Event content type
|
||||
* (and its subclasses).
|
||||
*
|
||||
* The attributes edited are {@code name}, {@code title}, {@code lead},
|
||||
* {@code startdate}, {@code starttime}, {@code end date},
|
||||
* {@code endtime},{@code event date} (literal description of date),
|
||||
* {@code location}, {@code main contributor} {@code event type},
|
||||
* {@code map link}, and {@code cost}.
|
||||
*
|
||||
* This authoring step replaces the {@code com.arsdigita.ui.authoring.PageEdit}
|
||||
* step for this type.
|
||||
*/
|
||||
public class EventPropertiesStep extends SimpleEditStep {
|
||||
|
||||
/**
|
||||
* The name of the editing sheet added to this step
|
||||
*/
|
||||
public static String EDIT_SHEET_NAME = "edit";
|
||||
|
||||
/**
|
||||
*
|
||||
* @param itemSelectionModel
|
||||
* @param authoringKitWizard
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public EventPropertiesStep(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemSelectionModel, authoringKitWizard, selectedLanguageParam);
|
||||
|
||||
setDefaultEditKey(EDIT_SHEET_NAME);
|
||||
BasicPageForm editSheet;
|
||||
|
||||
editSheet = new EventPropertyForm(itemSelectionModel,
|
||||
this,
|
||||
selectedLanguageParam);
|
||||
add(EDIT_SHEET_NAME,
|
||||
new GlobalizedMessage("cms.ui.edit", CmsConstants.CMS_BUNDLE),
|
||||
new WorkflowLockedComponentAccess(editSheet, itemSelectionModel),
|
||||
editSheet.getSaveCancelSection().getCancelButton());
|
||||
|
||||
setDisplayComponent(getEventPropertySheet(itemSelectionModel,
|
||||
selectedLanguageParam));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a component that displays the properties of the Event specified
|
||||
* by the ItemSelectionModel passed in.
|
||||
*
|
||||
* @param itemSelectionModel The ItemSelectionModel to use
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
* @return A component to display the state of the basic properties of the
|
||||
* release
|
||||
*
|
||||
*/
|
||||
public static Component getEventPropertySheet(
|
||||
final ItemSelectionModel itemSelectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(
|
||||
itemSelectionModel,
|
||||
false,
|
||||
selectedLanguageParam);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(ConfigurationManager.class);
|
||||
final EventConfig eventConfig = confManager
|
||||
.findConfiguration(EventConfig.class);
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.title",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"title");
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.name",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"name");
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.event.lead",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"description");
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.event.start_time",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"startDate",
|
||||
new DateTimeAttributeFormatter());
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.event.end_time",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"endDate",
|
||||
new DateTimeAttributeFormatter());
|
||||
if (!eventConfig.isHideDateDescription()) {
|
||||
sheet.add(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.date_description",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"eventDate");
|
||||
}
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.event.location",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"location");
|
||||
|
||||
if (!eventConfig.isHideMainContributor()) {
|
||||
sheet.add(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.main_contributor",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"mainContributor");
|
||||
}
|
||||
if (!eventConfig.isHideEventType()) {
|
||||
sheet.add(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.event_type",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"eventType");
|
||||
}
|
||||
if (!eventConfig.isHideLinkToMap()) {
|
||||
sheet.add(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.link_to_map",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"mapLink");
|
||||
}
|
||||
if (!eventConfig.isHideCost()) {
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.event.cost",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"cost");
|
||||
}
|
||||
return sheet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private class which implements an AttributeFormatter interface for date
|
||||
* values. Its format(...) class returns a string representation for either
|
||||
* a false or a true value.
|
||||
*/
|
||||
private static class DateTimeAttributeFormatter
|
||||
implements DomainObjectPropertySheet.AttributeFormatter {
|
||||
|
||||
/**
|
||||
* Constructor, does nothing.
|
||||
*/
|
||||
public DateTimeAttributeFormatter() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Formatter for the value of an attribute.
|
||||
*
|
||||
* It currently relays on the prerequisite that the passed in property
|
||||
* attribute is in fact a date property. No type checking yet!
|
||||
*
|
||||
* Note: the format method has to be executed at each page request. Take
|
||||
* care to properly adjust globalization and localization here!
|
||||
*
|
||||
* @param obj Object containing the attribute to format.
|
||||
* @param attribute Name of the attribute to retrieve and format
|
||||
* @param state PageState of the request
|
||||
*
|
||||
* @return A String representation of the retrieved boolean attribute of
|
||||
* the domain object.
|
||||
*/
|
||||
@Override
|
||||
public String format(final Object obj,
|
||||
final String attribute,
|
||||
final PageState state) {
|
||||
|
||||
if (obj != null && obj instanceof Event) {
|
||||
|
||||
final BeanInfo beanInfo;
|
||||
try {
|
||||
beanInfo = Introspector.getBeanInfo(Event.class);
|
||||
} catch (IntrospectionException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
final Optional<PropertyDescriptor> propertyDescriptor = Arrays
|
||||
.stream(beanInfo.getPropertyDescriptors())
|
||||
.filter(current -> attribute.equals(current.getName()))
|
||||
.findAny();
|
||||
|
||||
if (propertyDescriptor.isPresent()) {
|
||||
|
||||
final GlobalizationHelper globalizationHelper = CdiUtil
|
||||
.createCdiUtil().findBean(GlobalizationHelper.class);
|
||||
|
||||
final Method readMethod = propertyDescriptor
|
||||
.get()
|
||||
.getReadMethod();
|
||||
|
||||
final Object result;
|
||||
try {
|
||||
result = readMethod.invoke(obj);
|
||||
} catch (IllegalAccessException
|
||||
| IllegalArgumentException
|
||||
| InvocationTargetException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
|
||||
if (result == null) {
|
||||
return (String) new GlobalizedMessage(
|
||||
"toolbox.ui.na", ToolboxConstants.TOOLBOX_BUNDLE)
|
||||
.localize();
|
||||
} else if (result instanceof Date) {
|
||||
return DateFormat
|
||||
.getDateTimeInstance(
|
||||
DateFormat.LONG,
|
||||
DateFormat.SHORT,
|
||||
globalizationHelper.getNegotiatedLocale())
|
||||
.format((Date) result);
|
||||
} else {
|
||||
throw new IllegalArgumentException(String
|
||||
.format(
|
||||
"Value is not an instance of \"%s\" but is an "
|
||||
+ "instance of \"%s\".",
|
||||
Date.class.getName(),
|
||||
result.getClass().getName()));
|
||||
}
|
||||
|
||||
} else {
|
||||
return (String) new GlobalizedMessage(
|
||||
"toolbox.ui.na",
|
||||
ToolboxConstants.TOOLBOX_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
return (String) new GlobalizedMessage(
|
||||
"toolbox.ui.na",
|
||||
ToolboxConstants.TOOLBOX_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,596 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.event;
|
||||
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.form.TextArea;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.form.Time;
|
||||
import com.arsdigita.bebop.parameters.DateParameter;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.bebop.parameters.ParameterModel;
|
||||
import com.arsdigita.bebop.parameters.StringInRangeValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.parameters.TimeParameter;
|
||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.librecms.contenttypes.Event;
|
||||
|
||||
import com.arsdigita.cms.ui.CMSDHTMLEditor;
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.EventConfig;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Form to edit the basic properties of an {@link Event} object.
|
||||
*
|
||||
* Used by {@link EventPropertiesStep} authoring kit step.
|
||||
*
|
||||
* This form can be extended to create forms for Event subclasses.
|
||||
*
|
||||
*/
|
||||
public class EventPropertyForm
|
||||
extends BasicPageForm
|
||||
implements FormProcessListener,
|
||||
FormInitListener,
|
||||
FormSubmissionListener {
|
||||
|
||||
private final static Logger LOGGER = LogManager
|
||||
.getLogger(EventPropertyForm.class);
|
||||
|
||||
/**
|
||||
* Name of this form
|
||||
*/
|
||||
public static final String ID = "event_edit";
|
||||
|
||||
private EventPropertiesStep eventPropertiesStep;
|
||||
/**
|
||||
* event date parameter name
|
||||
*/
|
||||
public static final String START_DATE = "startDate";
|
||||
public static final String END_DATE = "endDate";
|
||||
public static final String START_TIME = "startTime";
|
||||
public static final String END_TIME = "endTime";
|
||||
public static final String EVENT_DATE = "eventDate";
|
||||
/**
|
||||
* location parameter name
|
||||
*/
|
||||
public static final String LOCATION = "location";
|
||||
/**
|
||||
* lead parameter name
|
||||
*/
|
||||
public static final String LEAD = "lead";
|
||||
/**
|
||||
* Main contributor parameter name
|
||||
*/
|
||||
public static final String MAIN_CONTRIBUTOR = "main_contributor";
|
||||
/**
|
||||
* Event type parameter name
|
||||
*/
|
||||
public static final String EVENT_TYPE = "event_type";
|
||||
/**
|
||||
* Map link parameter name
|
||||
*/
|
||||
public static final String MAP_LINK = "map_link";
|
||||
/**
|
||||
* cost parameter name
|
||||
*/
|
||||
public static final String COST = "cost";
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
/* DateWidgets have to be accessible later on */
|
||||
private com.arsdigita.bebop.form.Date startDateField;
|
||||
private com.arsdigita.bebop.form.Date endDateField;
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the Event object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemSelectionModel The ItemSelectionModel to use to obtain the
|
||||
* Event to work on
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
*/
|
||||
public EventPropertyForm(final ItemSelectionModel itemSelectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
this(itemSelectionModel, null, selectedLanguageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the Event object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemSelectionModel The ItemSelectionModel to use to obtain the
|
||||
* Event to work on
|
||||
* @param eventPropertiesStep The EventPropertiesStep which controls this
|
||||
* form.
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
*/
|
||||
public EventPropertyForm(final ItemSelectionModel itemSelectionModel,
|
||||
final EventPropertiesStep eventPropertiesStep,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(ID, itemSelectionModel, selectedLanguageParam);
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
this.eventPropertiesStep = eventPropertiesStep;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
addSubmissionListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds widgets to the form.
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
protected void addWidgets() {
|
||||
|
||||
super.addWidgets();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(ConfigurationManager.class);
|
||||
final EventConfig eventConfig = confManager
|
||||
.findConfiguration(EventConfig.class);
|
||||
|
||||
/* Summary (lead) */
|
||||
final ParameterModel leadParam = new StringParameter(LEAD);
|
||||
if (!eventConfig.isLeadTextOptional()) {
|
||||
leadParam.addParameterListener(new NotNullValidationListener());
|
||||
}
|
||||
final TextArea lead = new TextArea(leadParam);
|
||||
lead.setLabel(new GlobalizedMessage("cms.contenttypes.ui.event.lead",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
lead.setCols(50);
|
||||
lead.setRows(5);
|
||||
add(lead);
|
||||
|
||||
/* Start date and time */
|
||||
final ParameterModel eventStartDateParam = new DateParameter(START_DATE);
|
||||
eventStartDateParam
|
||||
.addParameterListener(new NotNullValidationListener());
|
||||
// Use bebop date instead of java.util.date
|
||||
startDateField = new com.arsdigita.bebop.form.Date(eventStartDateParam);
|
||||
startDateField.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.start_date",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
// Set the upper und lower boundary of the year select box
|
||||
startDateField
|
||||
.setYearRange(
|
||||
eventConfig.getStartYear(),
|
||||
GregorianCalendar.getInstance().get(Calendar.YEAR)
|
||||
+ eventConfig.getEndYearDelta());
|
||||
add(startDateField);
|
||||
|
||||
final ParameterModel eventStartTimeParam = new TimeParameter(START_TIME);
|
||||
if (!eventConfig.isStartTimeOptional()) {
|
||||
eventStartTimeParam.addParameterListener(
|
||||
new NotNullValidationListener());
|
||||
}
|
||||
final Time startTime = new Time(eventStartTimeParam);
|
||||
startTime
|
||||
.setLabel(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.start_time",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
add(startTime);
|
||||
|
||||
/* End date and time */
|
||||
final ParameterModel eventEndDateParam = new DateParameter(END_DATE);
|
||||
// Use bebop date instead of java.util.date
|
||||
endDateField = new com.arsdigita.bebop.form.Date(eventEndDateParam);
|
||||
endDateField
|
||||
.setLabel(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.end_date",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
endDateField
|
||||
.setHint(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.end_date_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
endDateField
|
||||
.setYearRange(eventConfig.getStartYear(),
|
||||
GregorianCalendar.getInstance().get(Calendar.YEAR)
|
||||
+ eventConfig.getEndYearDelta());
|
||||
add(endDateField);
|
||||
|
||||
final ParameterModel eventEndTimeParam = new TimeParameter(END_TIME);
|
||||
final Time endTime = new Time(eventEndTimeParam);
|
||||
endTime
|
||||
.setLabel(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.end_time",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
endTime
|
||||
.setHint(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.end_time_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
add(endTime);
|
||||
|
||||
|
||||
/* optional additional / literal date description */
|
||||
if (!eventConfig.isHideDateDescription()) {
|
||||
final ParameterModel eventDateParam
|
||||
= new StringParameter(EVENT_DATE);
|
||||
if (eventConfig.isUseHtmlDateDescription()) {
|
||||
CMSDHTMLEditor eventDate = new CMSDHTMLEditor(eventDateParam);
|
||||
eventDate.setLabel(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.date_description",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
eventDate.setHint(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.date_description_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
eventDate.setCols(40);
|
||||
eventDate.setRows(8);
|
||||
add(eventDate);
|
||||
} else {
|
||||
eventDateParam.addParameterListener(
|
||||
new StringInRangeValidationListener(0, 100));
|
||||
TextArea eventDate = new TextArea(eventDateParam);
|
||||
eventDate
|
||||
.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.date_description",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
eventDate.setHint(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.date_description_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
eventDate.setCols(50);
|
||||
eventDate.setRows(2);
|
||||
add(eventDate);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* extensive description of location */
|
||||
final ParameterModel locationParam = new StringParameter(LOCATION);
|
||||
final CMSDHTMLEditor location = new CMSDHTMLEditor(locationParam);
|
||||
location
|
||||
.setLabel(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.event.location",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
location
|
||||
.setHint(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.location_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
location.setCols(40);
|
||||
location.setRows(8);
|
||||
add(location);
|
||||
|
||||
|
||||
/* optional: main contributor */
|
||||
if (!eventConfig.isHideMainContributor()) {
|
||||
final ParameterModel mainContributorParam
|
||||
= new StringParameter(MAIN_CONTRIBUTOR);
|
||||
final CMSDHTMLEditor mainContributor
|
||||
= new CMSDHTMLEditor(mainContributorParam);
|
||||
mainContributor.setLabel(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.main_contributor",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
mainContributor.setHint(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.main_contributor_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
mainContributor.setCols(40);
|
||||
mainContributor.setRows(10);
|
||||
add(mainContributor);
|
||||
}
|
||||
|
||||
|
||||
/* optional: event type */
|
||||
if (!eventConfig.isHideEventType()) {
|
||||
final ParameterModel eventTypeParam
|
||||
= new StringParameter(EVENT_TYPE);
|
||||
final TextField eventType = new TextField(eventTypeParam);
|
||||
eventType.setLabel(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.event_type",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
eventType.setHint(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.event_type_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
eventType.setSize(30);
|
||||
eventType.setMaxLength(30);
|
||||
add(eventType);
|
||||
}
|
||||
|
||||
|
||||
/* optional: link to map */
|
||||
if (!eventConfig.isHideLinkToMap()) {
|
||||
final ParameterModel mapLinkParam = new StringParameter(MAP_LINK);
|
||||
final TextArea mapLink = new TextArea(mapLinkParam);
|
||||
mapLink.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.link_to_map",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
mapLink.setHint(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.link_to_map_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
mapLink.setCols(40);
|
||||
mapLink.setRows(2);
|
||||
add(mapLink);
|
||||
}
|
||||
|
||||
|
||||
/* optional: costs */
|
||||
if (!eventConfig.isHideCost()) {
|
||||
final ParameterModel costParam = new TrimmedStringParameter(COST);
|
||||
final TextField cost = new TextField(costParam);
|
||||
cost.setLabel(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.cost",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
cost.setHint(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.cost_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
cost.setSize(30);
|
||||
cost.setMaxLength(30);
|
||||
add(cost);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param event
|
||||
*
|
||||
* @throws FormProcessException
|
||||
*/
|
||||
@Override
|
||||
public void validate(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
super.validate(event);
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
java.util.Date startDate = data.getDate(START_DATE);
|
||||
java.util.Date endDate = data.getDate(END_DATE);
|
||||
|
||||
if (endDate != null) {
|
||||
if (startDate == null || startDate.compareTo(endDate) > 0) {
|
||||
throw new FormProcessException(
|
||||
"End date must be after start date",
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.event.end_date_after_start_date",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Form initialisation hook. Fills widgets with data.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) {
|
||||
// Do some initialization hook stuff
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
final Event item = (Event) super.initBasicWidgets(event);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(ConfigurationManager.class);
|
||||
final EventConfig eventConfig = confManager
|
||||
.findConfiguration(EventConfig.class);
|
||||
|
||||
// Start date should always be set
|
||||
final java.util.Date startDate;
|
||||
if (item.getStartDate() == null) {
|
||||
// new Date is initialised to current time
|
||||
startDate = new java.util.Date();
|
||||
} else {
|
||||
startDate = item.getStartDate();
|
||||
}
|
||||
startDateField.addYear(startDate);
|
||||
|
||||
// End date can be null
|
||||
final java.util.Date endDate;
|
||||
if (item.getEndDate() == null) {
|
||||
// new Date is initialised to current time
|
||||
endDate = new java.util.Date();
|
||||
} else {
|
||||
endDate = item.getEndDate();
|
||||
}
|
||||
endDateField.addYear(endDate);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
data.put(LEAD, item.getDescription().getValue(selectedLocale));
|
||||
data.put(START_DATE, startDate);
|
||||
data.put(START_TIME, startDate);
|
||||
data.put(END_DATE, endDate);
|
||||
data.put(END_TIME, endDate);
|
||||
if (!eventConfig.isHideDateDescription()) {
|
||||
data.put(EVENT_DATE,
|
||||
item.getEventDate().getValue(selectedLocale));
|
||||
}
|
||||
data.put(LOCATION, item.getLocation().getValue(selectedLocale));
|
||||
if (!eventConfig.isHideMainContributor()) {
|
||||
data.put(MAIN_CONTRIBUTOR,
|
||||
item.getMainContributor().getValue(selectedLocale));
|
||||
}
|
||||
if (!eventConfig.isHideEventType()) {
|
||||
data.put(EVENT_TYPE,
|
||||
item.getEventType().getValue(selectedLocale));
|
||||
}
|
||||
if (!eventConfig.isHideLinkToMap()) {
|
||||
data.put(MAP_LINK, item.getMapLink());
|
||||
}
|
||||
if (!eventConfig.isHideCost()) {
|
||||
data.put(COST,
|
||||
item.getCost().getValue(selectedLocale));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels streamlined editing.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event) {
|
||||
if (eventPropertiesStep != null
|
||||
&& getSaveCancelSection()
|
||||
.getCancelButton()
|
||||
.isSelected(event.getPageState())) {
|
||||
eventPropertiesStep.cancelStreamlinedCreation(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Form processing hook. Saves Event object.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void process(final FormSectionEvent event) {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
|
||||
final Event item = (Event) super.processBasicWidgets(event);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(ConfigurationManager.class);
|
||||
final EventConfig eventConfig = confManager
|
||||
.findConfiguration(EventConfig.class);
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
// save only if save button was pressed
|
||||
if (item != null
|
||||
&& getSaveCancelSection().getSaveButton().isSelected(state)) {
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
final java.util.Date startDate = (java.util.Date) data
|
||||
.get(START_DATE);
|
||||
final java.util.Date startTime = (java.util.Date) data
|
||||
.get(START_TIME);
|
||||
final java.util.Date endDate = (java.util.Date) data.get(END_DATE);
|
||||
final java.util.Date endTime = (java.util.Date) data.get(END_TIME);
|
||||
|
||||
final Calendar startDateCal = Calendar.getInstance();
|
||||
final Calendar startTimeCal = Calendar.getInstance();
|
||||
final Calendar endDateCal = Calendar.getInstance();
|
||||
final Calendar endTimeCal = Calendar.getInstance();
|
||||
startDateCal.setTime(startDate);
|
||||
startTimeCal.setTime(startTime);
|
||||
endDateCal.setTime(endDate);
|
||||
endTimeCal.setTime(endTime);
|
||||
|
||||
final int startYear = startDateCal.get(Calendar.YEAR);
|
||||
final int startMonth = startDateCal.get(Calendar.MONTH);
|
||||
final int startDay = startDateCal.get(Calendar.DAY_OF_MONTH);
|
||||
final int startHour = startTimeCal.get(Calendar.HOUR_OF_DAY);
|
||||
final int startMinute = startTimeCal.get(Calendar.MINUTE);
|
||||
|
||||
final int endYear = endDateCal.get(Calendar.YEAR);
|
||||
final int endMonth = endDateCal.get(Calendar.MONTH);
|
||||
final int endDay = endDateCal.get(Calendar.DAY_OF_MONTH);
|
||||
final int endHour = endTimeCal.get(Calendar.HOUR_OF_DAY);
|
||||
final int endMinute = endTimeCal.get(Calendar.MINUTE);
|
||||
|
||||
final Calendar startDateTimeCal = Calendar.getInstance();
|
||||
final Calendar endDateTimeCal = Calendar.getInstance();
|
||||
|
||||
startDateTimeCal.set(Calendar.YEAR, startYear);
|
||||
startDateTimeCal.set(Calendar.MONTH, startMonth);
|
||||
startDateTimeCal.set(Calendar.DAY_OF_MONTH, startDay);
|
||||
startDateTimeCal.set(Calendar.HOUR_OF_DAY, startHour);
|
||||
startDateTimeCal.set(Calendar.MINUTE, startMinute);
|
||||
|
||||
endDateTimeCal.set(Calendar.YEAR, endYear);
|
||||
endDateTimeCal.set(Calendar.MONTH, endMonth);
|
||||
endDateTimeCal.set(Calendar.DAY_OF_MONTH, endDay);
|
||||
endDateTimeCal.set(Calendar.HOUR_OF_DAY, endHour);
|
||||
endDateTimeCal.set(Calendar.MINUTE, endMinute);
|
||||
|
||||
final java.util.Date startDateTime = startDateTimeCal.getTime();
|
||||
final java.util.Date endDateTime = endDateTimeCal.getTime();
|
||||
|
||||
item.setStartDate(startDateTime);
|
||||
item.setEndDate(endDateTime);
|
||||
//date_description
|
||||
if (!eventConfig.isHideDateDescription()) {
|
||||
item.getEventDate().putValue(selectedLocale,
|
||||
(String) data.get(EVENT_DATE));
|
||||
}
|
||||
|
||||
if (!eventConfig.isHideMainContributor()) {
|
||||
item
|
||||
.getMainContributor()
|
||||
.putValue(selectedLocale,
|
||||
(String) data.get(MAIN_CONTRIBUTOR));
|
||||
}
|
||||
if (!eventConfig.isHideEventType()) {
|
||||
item
|
||||
.getEventType()
|
||||
.putValue(selectedLocale,
|
||||
(String) data.get(EVENT_TYPE));
|
||||
}
|
||||
if (!eventConfig.isHideLinkToMap()) {
|
||||
item.setMapLink((String) data.get(MAP_LINK));
|
||||
}
|
||||
item.getLocation().putValue(selectedLocale,
|
||||
(String) data.get(LOCATION));
|
||||
item.getDescription().putValue(selectedLocale,
|
||||
(String) data.get(LEAD));
|
||||
if (!eventConfig.isHideCost()) {
|
||||
item.getCost().putValue(selectedLocale,
|
||||
(String) data.get(COST));
|
||||
}
|
||||
|
||||
final ContentItemRepository itemRepo = cdiUtil
|
||||
.findBean(ContentItemRepository.class);
|
||||
|
||||
itemRepo.save(item);
|
||||
}
|
||||
if (eventPropertiesStep != null) {
|
||||
eventPropertiesStep.maybeForwardToNextStep(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,127 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.event;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.SingleSelect;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.cms.ui.authoring.TextBody;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.Event;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import static com.arsdigita.cms.ui.authoring.TextBody.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class EventTextBody extends TextBody {
|
||||
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
public EventTextBody(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemSelectionModel, selectedLanguageParam);
|
||||
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
// Rest the component when it is hidden
|
||||
authoringKitWizard
|
||||
.getList()
|
||||
.addActionListener(event -> reset(event.getPageState()));
|
||||
|
||||
// Set the right component access on the forms
|
||||
final Component uploadComponent = getComponent(FILE_UPLOAD);
|
||||
if (uploadComponent != null) {
|
||||
setComponentAccess(FILE_UPLOAD,
|
||||
new WorkflowLockedComponentAccess(
|
||||
uploadComponent, itemSelectionModel));
|
||||
}
|
||||
final Component textEntryComponent = getComponent(TEXT_ENTRY);
|
||||
setComponentAccess(TEXT_ENTRY,
|
||||
new WorkflowLockedComponentAccess(
|
||||
textEntryComponent, itemSelectionModel));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the options for the mime type select widget of
|
||||
* <code>GenericArticleForm</code> and sets the default mime type.
|
||||
*
|
||||
* @param mimeSelect
|
||||
*/
|
||||
@Override
|
||||
protected void setMimeTypeOptions(final SingleSelect mimeSelect) {
|
||||
mimeSelect.addOption(new Option("text/html", "HTML Text"));
|
||||
mimeSelect.setOptionSelected("text/html");
|
||||
}
|
||||
|
||||
protected Event getSelectedEvent(final PageState state) {
|
||||
|
||||
return (Event) itemSelectionModel.getSelectedItem(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTextPropertyName() {
|
||||
|
||||
return "text";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(final PageState state) {
|
||||
|
||||
final Event event = getSelectedEvent(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
return event.getText().getValue(selectedLocale);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateText(final PageState state, final String text) {
|
||||
|
||||
final Event event = getSelectedEvent(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
event.getText().putValue(selectedLocale, text);
|
||||
final ContentItemRepository itemRepo = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ContentItemRepository.class);
|
||||
itemRepo.save(event);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,181 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.event.FormValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.ApplyWorkflowFormSection;
|
||||
import com.arsdigita.cms.ui.authoring.CreationComponent;
|
||||
import com.arsdigita.cms.ui.authoring.CreationSelector;
|
||||
import com.arsdigita.cms.ui.authoring.LanguageWidget;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import org.librecms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.Folder;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* A form which will create a MultiPartArticle or one of its subclasses.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsidigita.com">Dave Turner</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class MultiPartArticleCreateForm
|
||||
extends MultiPartArticleForm
|
||||
implements FormInitListener,
|
||||
FormProcessListener,
|
||||
FormSubmissionListener,
|
||||
FormValidationListener,
|
||||
CreationComponent {
|
||||
|
||||
private final CreationSelector creationSelector;
|
||||
private ApplyWorkflowFormSection workflowSection;
|
||||
|
||||
public MultiPartArticleCreateForm(
|
||||
final ItemSelectionModel itemSelectionModel,
|
||||
final CreationSelector creationSelector,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super("MultiPartArticleCreate",
|
||||
itemSelectionModel,
|
||||
selectedLanguageParam);
|
||||
|
||||
this.creationSelector = creationSelector;
|
||||
workflowSection.setCreationSelector(creationSelector);
|
||||
workflowSection.setContentType(itemSelectionModel.getContentType());
|
||||
addSubmissionListener(this);
|
||||
getSaveCancelSection()
|
||||
.getSaveButton()
|
||||
.setButtonLabel(new GlobalizedMessage("cms.ui.create",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addWidgets() {
|
||||
workflowSection = new ApplyWorkflowFormSection();
|
||||
add(workflowSection, ColumnPanel.INSERT);
|
||||
add(new Label(new GlobalizedMessage("cms.ui.language.field",
|
||||
CmsConstants.CMS_BUNDLE)));
|
||||
add(new LanguageWidget(LANGUAGE));
|
||||
super.addWidgets();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the ApplyWorkflowFormSection associated with this
|
||||
* CreationComponent.
|
||||
*
|
||||
* @return the ApplyWorkflowFormSection associated with this
|
||||
* CreationComponent.
|
||||
*/
|
||||
@Override
|
||||
public ApplyWorkflowFormSection getWorkflowSection() {
|
||||
return workflowSection;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) throws FormProcessException {
|
||||
// this is currently a no-op
|
||||
}
|
||||
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (getSaveCancelSection().getCancelButton().isSelected(state)) {
|
||||
creationSelector.redirectBack(state);
|
||||
throw new FormProcessException(
|
||||
"Submission cancelled",
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.submission_cancelled",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final Folder folder = creationSelector.getFolder(event.getPageState());
|
||||
if (!validateNameUniqueness(folder, event)) {
|
||||
throw new FormProcessException(
|
||||
"An item with this name already exists",
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle."
|
||||
+ "an_item_with_this_name_already_exists",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
final ContentSection section = creationSelector.getContentSection(state);
|
||||
final Folder folder = creationSelector.getFolder(state);
|
||||
|
||||
final Locale locale = new Locale((String) data.get(LANGUAGE));
|
||||
|
||||
final MultiPartArticle article = createArticle(state,
|
||||
(String) data.get(NAME),
|
||||
section,
|
||||
folder,
|
||||
locale);
|
||||
article.getTitle().putValue(locale, (String) data.get(TITLE));
|
||||
if (!CMSConfig.getConfig().isHideLaunchDate()) {
|
||||
article.setLaunchDate((Date) data.get(LAUNCH_DATE));
|
||||
}
|
||||
article
|
||||
.getSummary()
|
||||
.putValue(locale, (String) data.get(SUMMARY));
|
||||
|
||||
workflowSection.applyWorkflow(state, article);
|
||||
|
||||
final CdiUtil cdiUtil =CdiUtil.createCdiUtil();
|
||||
final ContentItemRepository itemRepo = cdiUtil
|
||||
.findBean(ContentItemRepository.class);
|
||||
itemRepo.save(article);
|
||||
|
||||
creationSelector.editItem(state, article);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.librecms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
|
||||
/**
|
||||
* A MultiPartArticle editing component.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class MultiPartArticleEdit extends SimpleEditStep {
|
||||
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param itemSelectionModel the ItemSelectionModel which holds the
|
||||
* current MutliPartArticle
|
||||
* @param authoringKitWizard the parent wizard which contains the form
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public MultiPartArticleEdit(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemSelectionModel, authoringKitWizard, selectedLanguageParam);
|
||||
|
||||
setDefaultEditKey("edit");
|
||||
final MultiPartArticleForm form = new MultiPartArticleEditForm(
|
||||
itemSelectionModel,
|
||||
this,
|
||||
selectedLanguageParam);
|
||||
add("edit",
|
||||
new GlobalizedMessage("cms.ui.edit",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
new WorkflowLockedComponentAccess(form, itemSelectionModel),
|
||||
form.getSaveCancelSection().getCancelButton()
|
||||
);
|
||||
|
||||
setDisplayComponent(getMultiPartArticlePropertiesSheet(
|
||||
itemSelectionModel,
|
||||
selectedLanguageParam));
|
||||
}
|
||||
|
||||
public Component getMultiPartArticlePropertiesSheet(
|
||||
final ItemSelectionModel itemSelectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(
|
||||
itemSelectionModel,
|
||||
false,
|
||||
selectedLanguageParam);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(ConfigurationManager.class);
|
||||
final CMSConfig cmsConfig = confManager
|
||||
.findConfiguration(CMSConfig.class);
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.title",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"title");
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.name",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"name");
|
||||
if (!cmsConfig.isHideLaunchDate()) {
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.launch_date",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"launchDate",
|
||||
new LaunchDateAttributeFormatter());
|
||||
}
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.summary",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"summary");
|
||||
|
||||
return sheet;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,178 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import org.librecms.contentsection.Folder;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemManager;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.FolderManager;
|
||||
import org.librecms.contentsection.FolderRepository;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Worker class to create the multipart article's edit form.
|
||||
*
|
||||
*/
|
||||
public class MultiPartArticleEditForm extends MultiPartArticleForm
|
||||
implements FormSubmissionListener {
|
||||
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
private final SimpleEditStep editStep;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param itemSelectionModel
|
||||
* @param editStep
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public MultiPartArticleEditForm(final ItemSelectionModel itemSelectionModel,
|
||||
final SimpleEditStep editStep,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super("MultiPartArticleEditForm",
|
||||
itemSelectionModel,
|
||||
selectedLanguageParam);
|
||||
|
||||
addSubmissionListener(this);
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
this.editStep = editStep;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) throws FormProcessException {
|
||||
super.initBasicWidgets(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels streamlined editing.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event) {
|
||||
|
||||
if (getSaveCancelSection()
|
||||
.getCancelButton()
|
||||
.isSelected(event.getPageState())) {
|
||||
editStep.cancelStreamlinedCreation(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final MultiPartArticle article = super.processBasicWidgets(event);
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
// final MultiPartArticle article = (MultiPartArticle) itemSelectionModel
|
||||
// .getSelectedObject(state);
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ContentItemRepository itemRepo = cdiUtil
|
||||
.findBean(ContentItemRepository.class);
|
||||
itemRepo.save(article);
|
||||
|
||||
editStep.maybeForwardToNextStep(event.getPageState());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final FormData data = event.getFormData();
|
||||
|
||||
final MultiPartArticle article = (MultiPartArticle) itemSelectionModel
|
||||
.getSelectedObject(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
final String newName = (String) data.get(MultiPartArticleForm.NAME);
|
||||
final MultiPartArticleFormController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleFormController.class);
|
||||
final String oldName = controller.getName(article, selectedLocale);
|
||||
|
||||
final boolean valid;
|
||||
if (newName.equalsIgnoreCase(oldName)) {
|
||||
valid = true;
|
||||
} else {
|
||||
final Optional<Folder> folder = controller.getArticleFolder(article);
|
||||
if (folder.isPresent()) {
|
||||
valid = validateNameUniqueness(folder.get(), event);
|
||||
} else {
|
||||
valid = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
throw new FormProcessException(
|
||||
"An item with name already exists",
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.an_item_with_name_already_exists",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
}
|
||||
|
||||
private Folder getParentFolder(final MultiPartArticle article) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final FolderRepository folderRepo = cdiUtil
|
||||
.findBean(FolderRepository.class);
|
||||
final FolderManager folderManager = cdiUtil
|
||||
.findBean(FolderManager.class);
|
||||
|
||||
final ContentItemManager itemManager = cdiUtil
|
||||
.findBean(ContentItemManager.class);
|
||||
|
||||
final Optional<Folder> folder = itemManager.getItemFolder(article);
|
||||
|
||||
if (folder.isPresent()) {
|
||||
return folder.get();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,359 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Embedded;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.FormSection;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormValidationListener;
|
||||
import com.arsdigita.bebop.form.TextArea;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.parameters.DateParameter;
|
||||
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.bebop.parameters.ParameterModel;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||
import com.arsdigita.bebop.parameters.URLTokenValidationListener;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.web.Web;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.librecms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemManager;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.Folder;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
/**
|
||||
* A form for editing MultiPartArticle and subclasses.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public abstract class MultiPartArticleForm
|
||||
extends FormSection
|
||||
implements FormInitListener,
|
||||
FormProcessListener,
|
||||
FormValidationListener {
|
||||
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
private SaveCancelSection saveCancelSection;
|
||||
/**
|
||||
* Constant property, placeholder for a JavaScript element.
|
||||
*/
|
||||
private final Embedded m_script = new Embedded(
|
||||
String.format(""
|
||||
+ "<script language=\"javascript\" "
|
||||
+ " src=\"%s/javascript/manipulate-input.js\">"
|
||||
+ "</script>",
|
||||
Web.getWebappContextPath()),
|
||||
false);
|
||||
|
||||
public static final String NAME = "name";
|
||||
public static final String TITLE = "title";
|
||||
public static final String SUMMARY = "summary";
|
||||
public static final String LAUNCH_DATE = "launch_date";
|
||||
public static final String LANGUAGE = "language";
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
MultiPartArticleForm.class);
|
||||
|
||||
public MultiPartArticleForm(final String formName,
|
||||
final ItemSelectionModel itemSelectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(new ColumnPanel(2));
|
||||
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
ColumnPanel panel = (ColumnPanel) getPanel();
|
||||
panel.setBorder(false);
|
||||
panel.setPadColor("#FFFFFF");
|
||||
panel.setColumnWidth(1, "20%");
|
||||
panel.setColumnWidth(2, "80%");
|
||||
panel.setWidth("100%");
|
||||
|
||||
addWidgets();
|
||||
|
||||
addSaveCancelSection();
|
||||
|
||||
addInitListener(this);
|
||||
addProcessListener(this);
|
||||
addValidationListener(this);
|
||||
}
|
||||
|
||||
public void addSaveCancelSection() {
|
||||
saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||
}
|
||||
|
||||
public SaveCancelSection getSaveCancelSection() {
|
||||
return saveCancelSection;
|
||||
}
|
||||
|
||||
protected void addWidgets() {
|
||||
|
||||
// add(new Label(GlobalizationUtil
|
||||
// .globalize("cms.contenttypes.ui.title")));
|
||||
final TextField titleWidget = new TextField(new TrimmedStringParameter(
|
||||
TITLE));
|
||||
titleWidget.setLabel(new GlobalizedMessage("cms.contenttypes.ui.title",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
titleWidget.addValidationListener(new NotNullValidationListener());
|
||||
titleWidget.setOnFocus(String.format(
|
||||
"if (this.form.%s.value == '') { "
|
||||
+ " defaulting = true; this.form.%s.value = urlize(this.value); }",
|
||||
NAME, NAME));
|
||||
titleWidget.setOnKeyUp(String.format(
|
||||
"if (defaulting) { this.form.%s.value = urlize(this.value) }",
|
||||
NAME));
|
||||
add(titleWidget);
|
||||
|
||||
//add(new Label(GlobalizationUtil
|
||||
// .globalize("cms.contenttypes.ui.name")));
|
||||
final TextField nameWidget = new TextField(new TrimmedStringParameter(
|
||||
NAME));
|
||||
nameWidget.setLabel(new GlobalizedMessage("cms.contenttypes.ui.name",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
nameWidget.addValidationListener(new NotNullValidationListener());
|
||||
nameWidget.addValidationListener(new URLTokenValidationListener());
|
||||
nameWidget.setOnFocus("defaulting = false");
|
||||
nameWidget.setOnBlur(String.format(
|
||||
"if (this.value == '') { "
|
||||
+ "defaulting = true; this.value = urlize(this.form.%s.value) "
|
||||
+ "}",
|
||||
TITLE));
|
||||
add(nameWidget);
|
||||
|
||||
if (!CMSConfig.getConfig().isHideLaunchDate()) {
|
||||
//add(new Label(GlobalizationUtil
|
||||
// .globalize("cms.ui.authoring.page_launch_date")));
|
||||
final ParameterModel launchDateParam
|
||||
= new DateParameter(LAUNCH_DATE);
|
||||
com.arsdigita.bebop.form.Date launchDate
|
||||
= new com.arsdigita.bebop.form.Date(
|
||||
launchDateParam);
|
||||
if (CMSConfig.getConfig().isRequireLaunchDate()) {
|
||||
launchDate.addValidationListener(new NotNullValidationListener(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.no_launch_date",
|
||||
CmsConstants.CMS_BUNDLE)));
|
||||
// if launch date is required, help user by suggesting today's date
|
||||
launchDateParam.setDefaultValue(new Date());
|
||||
}
|
||||
launchDate.setLabel(new GlobalizedMessage(
|
||||
"cms.ui.authoring.page_launch_date",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
add(launchDate);
|
||||
}
|
||||
|
||||
//add(new Label(GlobalizationUtil
|
||||
// .globalize("cms.contenttypes.ui.summary")));
|
||||
final TextArea summaryWidget = new TextArea(
|
||||
new TrimmedStringParameter(SUMMARY));
|
||||
if (CMSConfig.getConfig().isMandatoryDescriptions()) {
|
||||
summaryWidget
|
||||
.addValidationListener(new NotEmptyValidationListener(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.description_missing",
|
||||
CmsConstants.CMS_BUNDLE)));
|
||||
}
|
||||
summaryWidget.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.summary",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
summaryWidget.setRows(5);
|
||||
summaryWidget.setCols(30);
|
||||
summaryWidget.setHint(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.summary_hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
add(summaryWidget);
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract void init(final FormSectionEvent event)
|
||||
throws FormProcessException;
|
||||
|
||||
@Override
|
||||
public abstract void process(final FormSectionEvent event)
|
||||
throws FormProcessException;
|
||||
|
||||
@Override
|
||||
public abstract void validate(final FormSectionEvent event)
|
||||
throws FormProcessException;
|
||||
|
||||
/**
|
||||
* Utility method to initialise the name/title/summary widgets.
|
||||
*
|
||||
* @param event
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public MultiPartArticle initBasicWidgets(final FormSectionEvent event) {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
final MultiPartArticle article = (MultiPartArticle) itemSelectionModel
|
||||
.getSelectedObject(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
final MultiPartArticleFormController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleFormController.class);
|
||||
|
||||
if (article != null) {
|
||||
data.put(NAME, controller.getName(article, selectedLocale));
|
||||
data.put(TITLE, controller.getTitle(article, selectedLocale));
|
||||
if (!CMSConfig.getConfig().isHideLaunchDate()) {
|
||||
data.put(LAUNCH_DATE, article.getLaunchDate());
|
||||
}
|
||||
data.put(SUMMARY, controller.getSummary(article, selectedLocale));
|
||||
}
|
||||
|
||||
return article;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to process the name/title/summary widgets.
|
||||
*
|
||||
* @param event
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public MultiPartArticle processBasicWidgets(final FormSectionEvent event) {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
final MultiPartArticle article = (MultiPartArticle) itemSelectionModel
|
||||
.getSelectedObject(state);
|
||||
|
||||
if (article != null) {
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
article.getName().putValue(selectedLocale,
|
||||
(String) data.get(NAME));
|
||||
article.getTitle().putValue(selectedLocale,
|
||||
(String) data.get(TITLE));
|
||||
if (!CMSConfig.getConfig().isHideLaunchDate()) {
|
||||
article.setLaunchDate((Date) data.get(LAUNCH_DATE));
|
||||
}
|
||||
article.getSummary().putValue(selectedLocale,
|
||||
(String) data.get(SUMMARY));
|
||||
}
|
||||
|
||||
return article;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the name of an item is unique within a folder.
|
||||
*
|
||||
* @param folder the folder in which to check
|
||||
* @param event the FormSectionEvent which was passed to the validation
|
||||
* listener
|
||||
*
|
||||
* @return true if the name is not null and unique, false otherwise
|
||||
*/
|
||||
public boolean validateNameUniqueness(final Folder folder,
|
||||
final FormSectionEvent event) {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
final String name = (String) data.get(NAME);
|
||||
|
||||
if (name != null) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ContentItemRepository itemRepo = cdiUtil
|
||||
.findBean(ContentItemRepository.class);
|
||||
|
||||
final long result = itemRepo.countByNameInFolder(folder, name);
|
||||
|
||||
return result == 0;
|
||||
}
|
||||
|
||||
// false if name == null
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to create a new MultiPartArticle and update the selected
|
||||
* model. This can be called in the process method of a ProcessListener.
|
||||
*
|
||||
* @param state the current page state
|
||||
* @param name
|
||||
* @param section
|
||||
* @param folder
|
||||
* @param locale Initial locale of the article.
|
||||
*
|
||||
* @return the new content item (or a proper subclass)
|
||||
*
|
||||
* @throws com.arsdigita.bebop.FormProcessException
|
||||
*/
|
||||
public MultiPartArticle createArticle(final PageState state,
|
||||
final String name,
|
||||
final ContentSection section,
|
||||
final Folder folder,
|
||||
final Locale locale)
|
||||
throws FormProcessException {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ContentItemManager itemManager = cdiUtil
|
||||
.findBean(ContentItemManager.class);
|
||||
|
||||
final MultiPartArticle article = itemManager
|
||||
.createContentItem(name,
|
||||
section,
|
||||
folder,
|
||||
MultiPartArticle.class,
|
||||
locale);
|
||||
|
||||
if (itemSelectionModel.getSelectedKey(state) == null) {
|
||||
itemSelectionModel.setSelectedKey(state, article.getObjectId());
|
||||
}
|
||||
|
||||
return article;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateXML(final PageState state, final Element parent) {
|
||||
|
||||
m_script.generateXML(state, parent);
|
||||
super.generateXML(state, parent);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentItemManager;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.Folder;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
public class MultiPartArticleFormController {
|
||||
|
||||
@Inject
|
||||
private ContentItemRepository itemRepo;
|
||||
|
||||
@Inject
|
||||
private ContentItemManager itemManager;
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected Optional<Folder> getArticleFolder(final MultiPartArticle article) {
|
||||
|
||||
final Optional<ContentItem> mpa = itemRepo.findById(
|
||||
article.getObjectId()
|
||||
);
|
||||
|
||||
if (mpa.isPresent()) {
|
||||
return itemManager.getItemFolder(mpa.get());
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String getName(
|
||||
final MultiPartArticle fromMpa, final Locale forLocale
|
||||
) {
|
||||
Objects.requireNonNull(fromMpa);
|
||||
Objects.requireNonNull(forLocale);
|
||||
final MultiPartArticle mpa = itemRepo
|
||||
.findById(fromMpa.getObjectId(), MultiPartArticle.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No MultiPartArticle with ID %d available",
|
||||
fromMpa.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
return mpa.getName().getValue(forLocale);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String getTitle(
|
||||
final MultiPartArticle fromMpa, final Locale forLocale
|
||||
) {
|
||||
Objects.requireNonNull(fromMpa);
|
||||
Objects.requireNonNull(forLocale);
|
||||
final MultiPartArticle mpa = itemRepo
|
||||
.findById(fromMpa.getObjectId(), MultiPartArticle.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No MultiPartArticle with ID %d available",
|
||||
fromMpa.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
return mpa.getTitle().getValue(forLocale);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String getSummary(
|
||||
final MultiPartArticle fromMpa, final Locale forLocale
|
||||
) {
|
||||
Objects.requireNonNull(fromMpa);
|
||||
Objects.requireNonNull(forLocale);
|
||||
final MultiPartArticle mpa = itemRepo
|
||||
.findById(fromMpa.getObjectId(), MultiPartArticle.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No MultiPartArticle with ID %d available",
|
||||
fromMpa.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
return mpa.getSummary().getValue(forLocale);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,209 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionManager;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
class MultiPartArticleSectionStepController {
|
||||
|
||||
@Inject
|
||||
private ContentItemRepository itemRepo;
|
||||
|
||||
@Inject
|
||||
private MultiPartArticleSectionRepository sectionRepo;
|
||||
|
||||
@Inject
|
||||
private MultiPartArticleSectionManager sectionManager;
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected List<MultiPartArticleSection> retrieveSections(
|
||||
final MultiPartArticle forArticle) {
|
||||
|
||||
final MultiPartArticle article = itemRepo
|
||||
.findById(forArticle.getObjectId(),
|
||||
MultiPartArticle.class)
|
||||
.orElseThrow(() -> new IllegalArgumentException(String
|
||||
.format("No MultiPartArticle with ID %d in the database.",
|
||||
forArticle.getObjectId())));
|
||||
|
||||
//Ensure that the sections are loaded
|
||||
return article
|
||||
.getSections()
|
||||
.stream()
|
||||
.sorted((section1, section2) -> {
|
||||
return Integer.compare(section1.getRank(), section2.getRank());
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected void addSection(final MultiPartArticle article,
|
||||
final MultiPartArticleSection section) {
|
||||
|
||||
final MultiPartArticle theArticle = itemRepo
|
||||
.findById(article.getObjectId(),
|
||||
MultiPartArticle.class)
|
||||
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||
"No MultiPartArticle with ID %d in the database.",
|
||||
article.getObjectId())));
|
||||
|
||||
sectionManager.addSectionToMultiPartArticle(section, theArticle);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected void removeSection(final MultiPartArticle article,
|
||||
final MultiPartArticleSection section) {
|
||||
|
||||
final MultiPartArticle theArticle = itemRepo
|
||||
.findById(article.getObjectId(),
|
||||
MultiPartArticle.class)
|
||||
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||
"No MultiPartArticle with ID %d in the database.",
|
||||
article.getObjectId())));
|
||||
|
||||
final MultiPartArticleSection theSection = sectionRepo
|
||||
.findById(section.getSectionId())
|
||||
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||
"No MultiPartArticleSection with ID %d in the database.",
|
||||
section.getSectionId())));
|
||||
|
||||
sectionManager.removeSectionFromMultiPartArticle(theSection,
|
||||
theArticle);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected void moveToFirst(final MultiPartArticle article,
|
||||
final MultiPartArticleSection section) {
|
||||
|
||||
final MultiPartArticle theArticle = itemRepo
|
||||
.findById(article.getObjectId(),
|
||||
MultiPartArticle.class)
|
||||
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||
"No MultiPartArticle with ID %d in the database.",
|
||||
article.getObjectId())));
|
||||
|
||||
final MultiPartArticleSection theSection = sectionRepo
|
||||
.findById(section.getSectionId())
|
||||
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||
"No MultiPartArticleSection with ID %d in the database.",
|
||||
section.getSectionId())));
|
||||
|
||||
sectionManager.moveToFirst(theArticle, theSection);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected void moveAfter(final MultiPartArticle article,
|
||||
final MultiPartArticleSection section,
|
||||
final MultiPartArticleSection after) {
|
||||
|
||||
final MultiPartArticle theArticle = itemRepo
|
||||
.findById(article.getObjectId(),
|
||||
MultiPartArticle.class)
|
||||
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||
"No MultiPartArticle with ID %d in the database.",
|
||||
article.getObjectId())));
|
||||
|
||||
sectionManager.moveSectionAfter(theArticle, section, after);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String getSectionTitle(
|
||||
final MultiPartArticleSection ofSection, final Locale forLocale
|
||||
) {
|
||||
Objects.requireNonNull(ofSection);
|
||||
Objects.requireNonNull(forLocale);
|
||||
|
||||
final MultiPartArticleSection section = sectionRepo
|
||||
.findById(ofSection.getSectionId())
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No section with ID %d available.", ofSection
|
||||
.getSectionId()
|
||||
)
|
||||
)
|
||||
);
|
||||
return section.getTitle().getValue(forLocale);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public String getSectionText(
|
||||
final MultiPartArticleSection ofSection, final Locale forLocale
|
||||
) {
|
||||
Objects.requireNonNull(ofSection);
|
||||
Objects.requireNonNull(forLocale);
|
||||
|
||||
final MultiPartArticleSection section = sectionRepo
|
||||
.findById(ofSection.getSectionId())
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No section with ID %d available.", ofSection
|
||||
.getSectionId()
|
||||
)
|
||||
)
|
||||
);
|
||||
return section.getText().getValue(forLocale);
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public void updateSection(
|
||||
final MultiPartArticleSection section,
|
||||
final String title,
|
||||
final String text,
|
||||
final boolean pageBreak,
|
||||
final Locale locale
|
||||
) {
|
||||
Objects.requireNonNull(section);
|
||||
Objects.requireNonNull(locale);
|
||||
|
||||
final MultiPartArticleSection update = sectionRepo
|
||||
.findById(section.getSectionId())
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No section with ID %d available.",
|
||||
section.getSectionId()
|
||||
)
|
||||
)
|
||||
);
|
||||
update.getTitle().putValue(locale, title);
|
||||
update.getText().putValue(locale, title);
|
||||
update.setPageBreak(pageBreak);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,403 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Container;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SingleSelectionModel;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.ResettableContainer;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Authoring kit step to manage the sections of a MultiPartArticle. Process is
|
||||
* implemented with three main components that manipulate the currently selected
|
||||
* MultiPartArticle and sections. The visibility of these components is managed
|
||||
* by this class.
|
||||
*
|
||||
* Note: This class was originally called {@code MultiPartArticleViewSections}.
|
||||
* Starting with version 7.0.0 all authoring step classes should end with
|
||||
* {@code Step} to make them easily identifiable.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class MultiPartArticleSectionsStep extends ResettableContainer {
|
||||
|
||||
/* id keys for each editing panel */
|
||||
public static final String SECTION_TABLE = "sec_tbl";
|
||||
public static final String SECTION_EDIT = "sec_edt";
|
||||
public static final String SECTION_PREVIEW = "sec_prv";
|
||||
public static final String SECTION_DELETE = "sec_del";
|
||||
|
||||
public static final String DATA_TABLE = "dataTable";
|
||||
public static final String ACTION_LINK = "actionLink";
|
||||
|
||||
private final AuthoringKitWizard authoringKitWizard;
|
||||
private final ItemSelectionModel selectedArticleModel;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
private SectionSelectionModel<MultiPartArticleSection> selectedSectionModel;
|
||||
private SectionSelectionModel<MultiPartArticleSection> moveSectionModel;
|
||||
private LongParameter moveSectionParam;
|
||||
|
||||
private SectionTable sectionTable;
|
||||
private SectionEditForm sectionEditForm;
|
||||
private SectionPreviewPanel sectionPreviewPanel;
|
||||
private SectionDeleteForm sectionDeleteForm;
|
||||
|
||||
private ActionLink beginLink;
|
||||
private Label moveSectionLabel;
|
||||
|
||||
private final String typeIdStr;
|
||||
|
||||
public MultiPartArticleSectionsStep(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super();
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.authoringKitWizard = authoringKitWizard;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
typeIdStr = authoringKitWizard
|
||||
.getContentType()
|
||||
.getContentItemClass()
|
||||
.getName();
|
||||
|
||||
addWidgets();
|
||||
}
|
||||
|
||||
private void addWidgets() {
|
||||
// create the components and set default visibility
|
||||
add(buildSectionTable(), true);
|
||||
add(buildSectionEdit(), false);
|
||||
add(buildSectionDelete(), false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a {@link Container} to hold a {@link SectionTable} and a link to
|
||||
* add a new {@link MultiPartArticleSection}.
|
||||
*
|
||||
* @return A {@link Container} for the table of sections.
|
||||
*/
|
||||
protected Container buildSectionTable() {
|
||||
|
||||
final ColumnPanel panel = new ColumnPanel(1);
|
||||
panel.setKey(SECTION_TABLE + typeIdStr);
|
||||
panel.setBorderColor("#FFFFFF");
|
||||
panel.setPadColor("#FFFFFF");
|
||||
|
||||
moveSectionParam = new LongParameter("moveSection");
|
||||
moveSectionModel = new SectionSelectionModel<>(moveSectionParam);
|
||||
|
||||
sectionTable = new SectionTable(selectedArticleModel,
|
||||
moveSectionModel,
|
||||
selectedLanguageParam);
|
||||
sectionTable.setClassAttr(DATA_TABLE);
|
||||
|
||||
// selected section is based on the selection in the SectionTable
|
||||
@SuppressWarnings("unchecked")
|
||||
final SingleSelectionModel<Long> rowSelectionModel = sectionTable
|
||||
.getRowSelectionModel();
|
||||
selectedSectionModel = new SectionSelectionModel<>(
|
||||
MultiPartArticleSection.class, rowSelectionModel);
|
||||
|
||||
sectionTable.setSectionModel(selectedSectionModel);
|
||||
|
||||
final Label emptyView = new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.no_sections_yet",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
sectionTable.setEmptyView(emptyView);
|
||||
|
||||
moveSectionLabel = new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section.title",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
moveSectionLabel.addPrintListener(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
final Label target = (Label) event.getTarget();
|
||||
|
||||
if (moveSectionModel.getSelectedKey(state) != null) {
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
final MultiPartArticleSectionStepController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
final Object[] parameterObj = {
|
||||
controller.getSectionTitle(
|
||||
moveSectionModel
|
||||
.getSelectedSection(state),
|
||||
selectedLocale
|
||||
)
|
||||
};
|
||||
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.move_section_name",
|
||||
CmsConstants.CMS_BUNDLE,
|
||||
parameterObj));
|
||||
}
|
||||
});
|
||||
panel.add(moveSectionLabel, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||
|
||||
beginLink = new ActionLink(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.move_to_beginning",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
panel.add(beginLink);
|
||||
|
||||
beginLink.addActionListener(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
final MultiPartArticle article
|
||||
= (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedObject(state);
|
||||
final MultiPartArticleSection section = moveSectionModel
|
||||
.getSelectedSection(state);
|
||||
|
||||
final MultiPartArticleSectionStepController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
controller.moveToFirst(article, section);
|
||||
});
|
||||
|
||||
moveSectionModel.addChangeListener(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (moveSectionModel.getSelectedKey(state) == null) {
|
||||
beginLink.setVisible(state, false);
|
||||
moveSectionLabel.setVisible(state, false);
|
||||
} else {
|
||||
beginLink.setVisible(state, true);
|
||||
moveSectionLabel.setVisible(state, true);
|
||||
|
||||
// final Locale selectedLocale = SelectedLanguageUtil
|
||||
// .selectedLocale(state, selectedLanguageParam);
|
||||
//
|
||||
// final Object[] parameterObj = {
|
||||
// moveSectionModel
|
||||
// .getSelectedSection(state)
|
||||
// .getTitle()
|
||||
// .getValue(selectedLocale)
|
||||
// };
|
||||
//
|
||||
// moveSectionLabel
|
||||
// .setLabel(new GlobalizedMessage(
|
||||
// "cms.contenttypes.ui.mparticle.move_section_name",
|
||||
// CmsConstants.CMS_BUNDLE,
|
||||
// parameterObj),
|
||||
// state);
|
||||
}
|
||||
});
|
||||
|
||||
// handle clicks to preview or delete a Section
|
||||
sectionTable.addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final TableColumn column = sectionTable
|
||||
.getColumnModel()
|
||||
.get(event.getColumn()
|
||||
.intValue());
|
||||
|
||||
if (column.getModelIndex() == SectionTable.COL_INDEX_DELETE) {
|
||||
onlyShowComponent(state, SECTION_DELETE + typeIdStr);
|
||||
} else if (column.getModelIndex() == SectionTable.COL_INDEX_EDIT) {
|
||||
onlyShowComponent(state, SECTION_EDIT + typeIdStr);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
panel.add(sectionTable);
|
||||
panel.add(buildAddLink());
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a container to hold a SectionEditForm and a link to return to the
|
||||
* section list.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected Container buildSectionEdit() {
|
||||
|
||||
final ColumnPanel panel = new ColumnPanel(1);
|
||||
panel.setKey(SECTION_EDIT + typeIdStr);
|
||||
panel.setBorderColor("#FFFFFF");
|
||||
panel.setPadColor("#FFFFFF");
|
||||
|
||||
// display an appropriate title
|
||||
panel.add(new Label(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
final Label target = (Label) event.getTarget();
|
||||
|
||||
if (selectedSectionModel.getSelectedKey(state) == null) {
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.add_section",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
} else {
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.edit_section",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
}));
|
||||
|
||||
sectionEditForm = new SectionEditForm(selectedArticleModel,
|
||||
selectedSectionModel,
|
||||
this,
|
||||
selectedLanguageParam);
|
||||
|
||||
panel.add(sectionEditForm);
|
||||
panel.add(buildViewAllLink());
|
||||
panel.add(buildAddLink());
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a container to hold the component to confirm deletion of a
|
||||
* section.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected Container buildSectionDelete() {
|
||||
|
||||
final ColumnPanel panel = new ColumnPanel(1);
|
||||
panel.setKey(SECTION_DELETE + typeIdStr);
|
||||
panel.setBorderColor("#FFFFFF");
|
||||
panel.setPadColor("#FFFFFF");
|
||||
|
||||
panel.add(new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.delete_section",
|
||||
CmsConstants.CMS_BUNDLE)));
|
||||
sectionDeleteForm = new SectionDeleteForm(selectedArticleModel,
|
||||
selectedSectionModel,
|
||||
selectedLanguageParam);
|
||||
sectionDeleteForm.addSubmissionListener(event -> {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
onlyShowComponent(state, SECTION_TABLE + typeIdStr);
|
||||
});
|
||||
|
||||
panel.add(sectionDeleteForm);
|
||||
panel.add(buildViewAllLink());
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to create a link to display the section list.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected ActionLink buildViewAllLink() {
|
||||
final ActionLink viewAllLink = new ActionLink(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.view_all_sections",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
viewAllLink.setClassAttr(ACTION_LINK);
|
||||
viewAllLink.addActionListener(event -> {
|
||||
onlyShowComponent(event.getPageState(),
|
||||
SECTION_TABLE + typeIdStr);
|
||||
});
|
||||
|
||||
return viewAllLink;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to create a link to display the section list.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected ActionLink buildAddLink() {
|
||||
final ActionLink addLink = new ActionLink(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.add_new_section",
|
||||
CmsConstants.CMS_BUNDLE)) {
|
||||
|
||||
@Override
|
||||
public boolean isVisible(final PageState state) {
|
||||
|
||||
final PermissionChecker permissionChecker = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(PermissionChecker.class);
|
||||
final ContentItem item = selectedArticleModel
|
||||
.getSelectedItem(state);
|
||||
|
||||
return super.isVisible(state)
|
||||
&& permissionChecker.isPermitted(ItemPrivileges.EDIT,
|
||||
item);
|
||||
}
|
||||
|
||||
};
|
||||
addLink.setClassAttr(ACTION_LINK);
|
||||
addLink.addActionListener(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
selectedSectionModel.clearSelection(state);
|
||||
onlyShowComponent(state, SECTION_EDIT + typeIdStr);
|
||||
});
|
||||
|
||||
return addLink;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
|
||||
super.register(page);
|
||||
|
||||
page.addGlobalStateParam(moveSectionParam);
|
||||
page.setVisibleDefault(beginLink, false);
|
||||
page.setVisibleDefault(moveSectionLabel, false);
|
||||
}
|
||||
|
||||
public String getTypeIDStr() {
|
||||
return typeIdStr;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,162 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* A form to confirm deletion of a single section of a MultiPartArticle.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SectionDeleteForm extends Form
|
||||
implements FormInitListener, FormSubmissionListener, FormProcessListener {
|
||||
|
||||
private final static Logger LOGGER = LogManager
|
||||
.getLogger(SectionDeleteForm.class.getName());
|
||||
|
||||
private final ItemSelectionModel selectedArticleModel;
|
||||
private final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel;
|
||||
private final SaveCancelSection saveCancelSection;
|
||||
private final Label sectionNameLabel;
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
public SectionDeleteForm(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super("SectionDeleteForm", new ColumnPanel(2));
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.selectedSectionModel = selectedSectionModel;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
final ColumnPanel panel = (ColumnPanel) super.getPanel();
|
||||
panel.setBorder(false);
|
||||
panel.setPadColor("#FFFFFF");
|
||||
panel.setColumnWidth(1, "20%");
|
||||
panel.setColumnWidth(2, "80%");
|
||||
panel.setWidth("100%");
|
||||
|
||||
sectionNameLabel = new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_name"));
|
||||
super.add(sectionNameLabel, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||
|
||||
saveCancelSection = new SaveCancelSection();
|
||||
saveCancelSection
|
||||
.getSaveButton()
|
||||
.setButtonLabel(new GlobalizedMessage("cms.ui.delete",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
super.add(saveCancelSection, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||
|
||||
super.addInitListener(this);
|
||||
super.addSubmissionListener(this);
|
||||
super.addProcessListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final MultiPartArticleSection section = selectedSectionModel
|
||||
.getSelectedSection(state);
|
||||
|
||||
if (section == null) {
|
||||
LOGGER.error("No section selected");
|
||||
} else {
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
final MultiPartArticleSectionStepController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
sectionNameLabel.setLabel(
|
||||
controller.getSectionTitle(section, selectedLocale),
|
||||
state
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (saveCancelSection
|
||||
.getCancelButton()
|
||||
.isSelected(state)) {
|
||||
|
||||
throw new FormProcessException(
|
||||
"Submission cancelled",
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.submission_cancelled",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final MultiPartArticle article = (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedObject(state);
|
||||
final MultiPartArticleSection section = selectedSectionModel
|
||||
.getSelectedSection(state);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionStepController controller = cdiUtil
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
controller.removeSection(article, section);
|
||||
|
||||
LOGGER.info("section {} deleted",
|
||||
selectedSectionModel.getSelectedKey(state));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,340 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.form.CheckboxGroup;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import com.arsdigita.cms.ui.CMSDHTMLEditor;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Form to edit an ArticleSection for a MultiPartArticle.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SectionEditForm extends Form {
|
||||
|
||||
public static final String TITLE = "title";
|
||||
public static final String TEXT = "text";
|
||||
public static final String IMAGE = "image";
|
||||
public static final String PAGE_BREAK = "pageBreak";
|
||||
|
||||
private static final String TEXT_PARAM = "textParam";
|
||||
private static final String IMAGE_PARAM = "imageParam";
|
||||
|
||||
private final ItemSelectionModel selectedArticleModel;
|
||||
private final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
private MultiPartArticleSectionsStep sectionsStep;
|
||||
|
||||
private SaveCancelSection saveCancelSection;
|
||||
|
||||
public SectionEditForm(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
this(selectedArticleModel,
|
||||
selectedSectionModel,
|
||||
null,
|
||||
selectedLanguageParam);
|
||||
}
|
||||
|
||||
public SectionEditForm(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel,
|
||||
final MultiPartArticleSectionsStep sectionsStep,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super("SectionEditForm", new ColumnPanel(2));
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.selectedSectionModel = selectedSectionModel;
|
||||
this.sectionsStep = sectionsStep;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
super.setMethod(Form.POST);
|
||||
super.setEncType("multipart/form-data");
|
||||
|
||||
final ColumnPanel panel = (ColumnPanel) super.getPanel();
|
||||
panel.setBorder(false);
|
||||
panel.setPadColor("#FFFFFF");
|
||||
panel.setColumnWidth(1, "20%");
|
||||
panel.setColumnWidth(2, "80%");
|
||||
panel.setWidth("100%");
|
||||
|
||||
addWidgets();
|
||||
saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||
|
||||
addInitListener(new SectionInitListener());
|
||||
addSubmissionListener(new SectionSubmissionListener());
|
||||
addProcessListener(new SectionProcessListener());
|
||||
}
|
||||
|
||||
public SaveCancelSection getSaveCancelSection() {
|
||||
return saveCancelSection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add form widgets for a Section.
|
||||
*/
|
||||
private void addWidgets() {
|
||||
|
||||
final TextField titleWidget = new TextField(
|
||||
new TrimmedStringParameter(TITLE));
|
||||
titleWidget.addValidationListener(new NotNullValidationListener());
|
||||
titleWidget.setLabel(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.mparticle.section.title",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
add(titleWidget);
|
||||
|
||||
final CMSDHTMLEditor textWidget = new CMSDHTMLEditor(
|
||||
new TrimmedStringParameter(TEXT));
|
||||
textWidget.setLabel(
|
||||
new GlobalizedMessage("cms.contenttypes.ui.mparticle.section.text",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
textWidget.setRows(40);
|
||||
textWidget.setCols(70);
|
||||
textWidget.setWrap(CMSDHTMLEditor.SOFT);
|
||||
add(textWidget, ColumnPanel.LEFT | ColumnPanel.FULL_WIDTH);
|
||||
|
||||
final CheckboxGroup pageBreak = new CheckboxGroup(PAGE_BREAK);
|
||||
pageBreak.addOption(
|
||||
new Option("true",
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section.create_break",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
add(pageBreak);
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to create a Section from the form data supplied.
|
||||
*
|
||||
* @param event
|
||||
* @param article
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected MultiPartArticleSection createSection(final FormSectionEvent event,
|
||||
final MultiPartArticle article) {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final FormData data = event.getFormData();
|
||||
|
||||
final MultiPartArticleSection section = new MultiPartArticleSection();
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
section.getTitle().putValue(selectedLocale, (String) data.get(TITLE));
|
||||
|
||||
return section;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise the form. If there is a selected section, ie. this is an
|
||||
* 'edit' step rather than a 'create new' step, load the data into the form
|
||||
* fields.
|
||||
*/
|
||||
private class SectionInitListener implements FormInitListener {
|
||||
|
||||
@Override
|
||||
public void init(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final FormData data = event.getFormData();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionRepository sectionRepo = cdiUtil
|
||||
.findBean(MultiPartArticleSectionRepository.class);
|
||||
|
||||
if (selectedSectionModel.getSelectedKey(state) != null) {
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
final MultiPartArticleSectionStepController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
final MultiPartArticleSection section = selectedSectionModel
|
||||
.getSelectedSection(state);
|
||||
|
||||
data.put(
|
||||
TITLE, controller.getSectionTitle(section, selectedLocale)
|
||||
);
|
||||
data.put(
|
||||
TEXT, controller.getSectionText(section, selectedLocale)
|
||||
);
|
||||
|
||||
if (section.isPageBreak()) {
|
||||
data.put(PAGE_BREAK, new Object[]{"true"});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Called on form submission. Check to see if the user clicked the cancel
|
||||
* button. If they did, don't continue with the form.
|
||||
*/
|
||||
private class SectionSubmissionListener implements FormSubmissionListener {
|
||||
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (saveCancelSection
|
||||
.getCancelButton()
|
||||
.isSelected(state)
|
||||
&& sectionsStep != null) {
|
||||
|
||||
sectionsStep.onlyShowComponent(
|
||||
state,
|
||||
MultiPartArticleSectionsStep.SECTION_TABLE
|
||||
+ sectionsStep.getTypeIDStr());
|
||||
|
||||
throw new FormProcessException(
|
||||
"Submission cancelled",
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.submission_cancelled",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after form has been validated. Create the new ArticleSection and
|
||||
* assign it to the current MultiPartArticle.
|
||||
*/
|
||||
private class SectionProcessListener implements FormProcessListener {
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final FormData data = event.getFormData();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionStepController controller = cdiUtil
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
final MultiPartArticleSectionRepository sectionRepo = cdiUtil
|
||||
.findBean(MultiPartArticleSectionRepository.class);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
final MultiPartArticle article
|
||||
= (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedItem(state);
|
||||
|
||||
// get the selected section to update or create a new one
|
||||
final MultiPartArticleSection section;
|
||||
if (selectedSectionModel.getSelectedKey(state) == null) {
|
||||
section = new MultiPartArticleSection();
|
||||
|
||||
} else {
|
||||
section = selectedSectionModel.getSelectedSection(state);
|
||||
}
|
||||
|
||||
// section.getTitle().putValue(selectedLocale,
|
||||
// (String) data.get(TITLE));
|
||||
final Object[] pageBreakVal = (Object[]) data.get(PAGE_BREAK);
|
||||
final boolean pageBreak;
|
||||
if (pageBreakVal == null
|
||||
|| pageBreakVal.length == 0
|
||||
|| !"true".equals(pageBreakVal[0])) {
|
||||
pageBreak = false;
|
||||
} else {
|
||||
pageBreak = true;
|
||||
}
|
||||
// section.setPageBreak(pageBreak);
|
||||
|
||||
final String text;
|
||||
if (data.get(TEXT) == null) {
|
||||
text = "";
|
||||
} else {
|
||||
text = (String) data.get(TEXT);
|
||||
}
|
||||
// section.getText().putValue(selectedLocale, text);
|
||||
|
||||
// sectionRepo.save(section);
|
||||
if (selectedSectionModel.getSelectedKey(state) == null) {
|
||||
section.getTitle().putValue(selectedLocale,
|
||||
(String) data.get(TITLE));
|
||||
section.setPageBreak(pageBreak);
|
||||
section.getText().putValue(selectedLocale, text);
|
||||
|
||||
controller.addSection(article, section);
|
||||
} else {
|
||||
controller.updateSection(
|
||||
section,
|
||||
(String) data.get(TITLE),
|
||||
text,
|
||||
pageBreak,
|
||||
selectedLocale
|
||||
);
|
||||
}
|
||||
|
||||
if (sectionsStep != null) {
|
||||
sectionsStep
|
||||
.onlyShowComponent(state,
|
||||
MultiPartArticleSectionsStep.SECTION_TABLE
|
||||
+ sectionsStep.getTypeIDStr());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
|
||||
public class SectionPreviewPanel extends BoxPanel
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -1,168 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SingleSelectionModel;
|
||||
import com.arsdigita.bebop.event.ChangeListener;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.bebop.parameters.ParameterModel;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
||||
|
||||
/**
|
||||
* A {@link SingleSelectionModel} implementation for
|
||||
* {@link MultiPartArticleSection}s.
|
||||
*
|
||||
* @param <T>
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SectionSelectionModel<T extends MultiPartArticleSection>
|
||||
implements SingleSelectionModel<Long> {
|
||||
|
||||
private final Class<T> clazz;
|
||||
private final SingleSelectionModel<Long> model;
|
||||
|
||||
public SectionSelectionModel(final LongParameter parameter) {
|
||||
this(MultiPartArticleSection.class.getName(), parameter);
|
||||
}
|
||||
|
||||
public SectionSelectionModel(final String parameterName) {
|
||||
this(MultiPartArticleSection.class.getName(),
|
||||
new LongParameter(parameterName));
|
||||
}
|
||||
|
||||
public SectionSelectionModel(final Class<T> clazz,
|
||||
final String parameterName) {
|
||||
this(clazz, new LongParameter(parameterName));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public SectionSelectionModel(final String className,
|
||||
final String parameterName) {
|
||||
|
||||
try {
|
||||
clazz = (Class<T>) Class.forName(className);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
|
||||
model = new ParameterSingleSelectionModel<>(
|
||||
new LongParameter(parameterName));
|
||||
}
|
||||
|
||||
public SectionSelectionModel(final Class<T> clazz,
|
||||
final LongParameter parameter) {
|
||||
this(clazz, new ParameterSingleSelectionModel<>(parameter));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public SectionSelectionModel(final String className,
|
||||
final LongParameter parameter) {
|
||||
|
||||
try {
|
||||
clazz = (Class<T>) Class.forName(className);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
model = new ParameterSingleSelectionModel<>(parameter);
|
||||
}
|
||||
|
||||
public SectionSelectionModel(final Class<T> clazz,
|
||||
final SingleSelectionModel<Long> model) {
|
||||
this.clazz = clazz;
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public SectionSelectionModel(final String className,
|
||||
final SingleSelectionModel<Long> model) {
|
||||
|
||||
try {
|
||||
clazz = (Class<T>) Class.forName(className);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected(final PageState state) {
|
||||
return model.isSelected(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getSelectedKey(final PageState state) {
|
||||
final Object key = model.getSelectedKey(state);
|
||||
if (key == null) {
|
||||
return null;
|
||||
} else if (key instanceof Long) {
|
||||
return (Long) key;
|
||||
} else if (key instanceof String) {
|
||||
return Long.parseLong((String) key);
|
||||
} else {
|
||||
return Long.parseLong(key.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedKey(final PageState state, final Long key) {
|
||||
model.setSelectedKey(state, key);
|
||||
}
|
||||
|
||||
public T getSelectedSection(final PageState state) {
|
||||
final Long key = getSelectedKey(state);
|
||||
final MultiPartArticleSectionRepository sectionRepo = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleSectionRepository.class);
|
||||
@SuppressWarnings("unchecked")
|
||||
final T object = (T) sectionRepo.findById(key).get();
|
||||
return object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearSelection(final PageState state) {
|
||||
|
||||
model.clearSelection(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addChangeListener(final ChangeListener changeListener) {
|
||||
|
||||
model.addChangeListener(changeListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeChangeListener(final ChangeListener changeListener) {
|
||||
|
||||
model.removeChangeListener(changeListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParameterModel getStateParameter() {
|
||||
|
||||
return model.getStateParameter();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,285 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A table that displays the sections for the currently selected
|
||||
* MultiPartArticle.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SectionTable extends Table {
|
||||
|
||||
/**
|
||||
* Index of the title column
|
||||
*/
|
||||
public static final int COL_INDEX_TITLE = 0;
|
||||
/**
|
||||
* Index of the page break column
|
||||
*/
|
||||
public static final int COL_PAGE_BREAK = 1;
|
||||
/**
|
||||
* Index of the edit column.
|
||||
*/
|
||||
public static final int COL_INDEX_EDIT = 2;
|
||||
/**
|
||||
* Index of the move column
|
||||
*/
|
||||
public static final int COL_INDEX_MOVE = 3;
|
||||
/**
|
||||
* Index of the delete column
|
||||
*/
|
||||
public static final int COL_INDEX_DELETE = 4;
|
||||
|
||||
private ItemSelectionModel selectedArticleModel;
|
||||
private SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel;
|
||||
private SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel;
|
||||
|
||||
/**
|
||||
* Constructor. Create an instance of this class.
|
||||
*
|
||||
* @param selectedArticleModel a selection model that returns the
|
||||
* MultiPartArticle which holds the sections to
|
||||
* display.
|
||||
* @param moveSectionModel
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public SectionTable(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super();
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.moveSectionModel = moveSectionModel;
|
||||
|
||||
final TableColumnModel model = getColumnModel();
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_TITLE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_section",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_PAGE_BREAK,
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_page_break",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_EDIT,
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_edit",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_MOVE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_move",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_DELETE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_delete",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
|
||||
model.get(COL_INDEX_EDIT).setCellRenderer(new SectionTableCellRenderer(true));
|
||||
model.get(COL_INDEX_MOVE).setCellRenderer(new SectionTableCellRenderer(true));
|
||||
model.get(COL_INDEX_DELETE).setCellRenderer(new SectionTableCellRenderer(true));
|
||||
|
||||
super.setModelBuilder(
|
||||
new SectionTableModelBuilder(selectedArticleModel,
|
||||
moveSectionModel,
|
||||
selectedLanguageParam));
|
||||
|
||||
super.addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final TableColumn column = getColumnModel()
|
||||
.get(event.getColumn());
|
||||
|
||||
if (column.getModelIndex() == COL_INDEX_MOVE) {
|
||||
|
||||
if (moveSectionModel.getSelectedKey(state) == null) {
|
||||
moveSectionModel.setSelectedKey(
|
||||
state,
|
||||
selectedSectionModel.getSelectedKey(state));
|
||||
} else {
|
||||
final MultiPartArticle article
|
||||
= (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedObject(state);
|
||||
|
||||
final Long sectionId = moveSectionModel
|
||||
.getSelectedKey(state);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionRepository sectionRepo
|
||||
= cdiUtil
|
||||
.findBean(
|
||||
MultiPartArticleSectionRepository.class);
|
||||
final MultiPartArticleSectionStepController controller
|
||||
= cdiUtil
|
||||
.findBean(
|
||||
MultiPartArticleSectionStepController.class);
|
||||
final MultiPartArticleSection section = sectionRepo
|
||||
.findById(sectionId)
|
||||
.orElseThrow(() -> new IllegalArgumentException(
|
||||
String
|
||||
.format(
|
||||
"No MultiPartArticleSection with ID %d in "
|
||||
+ "the database.",
|
||||
sectionId)));
|
||||
|
||||
final Long destId = Long
|
||||
.parseLong((String) event.getRowKey());
|
||||
final MultiPartArticleSection destSection = sectionRepo
|
||||
.findById(destId)
|
||||
.orElseThrow(() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No MultiPartArticleSection with ID %d in "
|
||||
+ "the database.",
|
||||
destId)));
|
||||
|
||||
controller.moveAfter(article, section, destSection);
|
||||
|
||||
// // if sect is lower in rank than the dest
|
||||
// // then move below is default behavior
|
||||
// int rank = destSection.getRank();
|
||||
// if (section.getRank() > rank) {
|
||||
// // otherwise, add one to get "move below"
|
||||
// rank++;
|
||||
// }
|
||||
//
|
||||
// section.setRank(rank);
|
||||
// sectionRepo.save(section);
|
||||
moveSectionModel.setSelectedKey(state, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
public void setSectionModel(
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel) {
|
||||
|
||||
Objects.requireNonNull(selectedSectionModel);
|
||||
|
||||
this.selectedSectionModel = selectedSectionModel;
|
||||
}
|
||||
|
||||
private class SectionTableCellRenderer
|
||||
extends LockableImpl
|
||||
implements TableCellRenderer {
|
||||
|
||||
private boolean active;
|
||||
|
||||
public SectionTableCellRenderer() {
|
||||
this(false);
|
||||
}
|
||||
|
||||
public SectionTableCellRenderer(final boolean active) {
|
||||
this.active = active;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil
|
||||
.findBean(PermissionChecker.class);
|
||||
|
||||
final ContentItem article = selectedArticleModel.getSelectedObject(
|
||||
state);
|
||||
|
||||
boolean createLink = active
|
||||
&& permissionChecker
|
||||
.isPermitted(ItemPrivileges.EDIT, article);
|
||||
|
||||
final Component ret;
|
||||
if (value instanceof Label) {
|
||||
if (createLink) {
|
||||
ret = new ControlLink((Component) value);
|
||||
} else {
|
||||
ret = (Component) value;
|
||||
}
|
||||
} else if (value instanceof String) {
|
||||
// Backwards compatibility, should be removed asap!
|
||||
if (createLink) {
|
||||
ret = new ControlLink(value.toString());
|
||||
} else {
|
||||
ret = new Text(value.toString());
|
||||
}
|
||||
} else {
|
||||
ret = new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_not_defined",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
false);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,168 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
class SectionTableModel implements TableModel {
|
||||
|
||||
private final TableColumnModel columnModel;
|
||||
private final SectionTable sectionTable;
|
||||
private final PageState pageState;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
private final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel;
|
||||
|
||||
private final Iterator<MultiPartArticleSection> iterator;
|
||||
private MultiPartArticleSection currentSection;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param sectionTable
|
||||
* @param pageState
|
||||
* @param article
|
||||
* @param moveSectionModel
|
||||
*/
|
||||
public SectionTableModel(
|
||||
final Table sectionTable,
|
||||
final PageState pageState,
|
||||
final StringParameter selectedLanguageParam,
|
||||
final MultiPartArticle article,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel) {
|
||||
|
||||
this.pageState = pageState;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
this.sectionTable = (SectionTable) sectionTable;
|
||||
this.moveSectionModel = moveSectionModel;
|
||||
|
||||
columnModel = sectionTable.getColumnModel();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionStepController controller = cdiUtil
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
final List<MultiPartArticleSection> sections = controller
|
||||
.retrieveSections(article);
|
||||
iterator = sections.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of columns this TableModel has.
|
||||
*/
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return columnModel.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Move to the next row and return true if the model is now positioned on a
|
||||
* valid row.
|
||||
*/
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
currentSection = iterator.next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the data element for the given column and the current row.
|
||||
*/
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
|
||||
if (columnModel == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final MultiPartArticleSectionStepController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
switch (columnIndex) {
|
||||
case SectionTable.COL_INDEX_TITLE:
|
||||
return controller.getSectionTitle(
|
||||
currentSection,
|
||||
SelectedLanguageUtil.selectedLocale(
|
||||
pageState, selectedLanguageParam
|
||||
)
|
||||
)
|
||||
;
|
||||
case SectionTable.COL_PAGE_BREAK:
|
||||
if (currentSection.isPageBreak()) {
|
||||
return new Label(
|
||||
new GlobalizedMessage("cms.ui.yes",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
} else {
|
||||
return new Label(
|
||||
new GlobalizedMessage("cms.ui.no",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
case SectionTable.COL_INDEX_EDIT:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_edit",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
case SectionTable.COL_INDEX_DELETE:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_delete",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
case SectionTable.COL_INDEX_MOVE:
|
||||
if (moveSectionModel.getSelectedKey(pageState) == null) {
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_move",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
} else {
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_move_below",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the key for the given column and the current row.
|
||||
*/
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return currentSection.getSectionId();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.multipartarticle;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
/**
|
||||
* The model builder to generate a suitable model for the SectionTable
|
||||
*/
|
||||
class SectionTableModelBuilder extends LockableImpl implements TableModelBuilder {
|
||||
|
||||
private final ItemSelectionModel selectedArticleModel;
|
||||
private final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel;
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
/**
|
||||
* Private class constructor.
|
||||
*
|
||||
* @param selectedArticleModel
|
||||
* @param moveSectionModel
|
||||
*/
|
||||
public SectionTableModelBuilder(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.moveSectionModel = moveSectionModel;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param table
|
||||
* @param state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
MultiPartArticle article
|
||||
= (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedObject(state);
|
||||
return new SectionTableModel(table,
|
||||
state,
|
||||
selectedLanguageParam,
|
||||
article,
|
||||
moveSectionModel);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,207 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.news;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.OptionGroup;
|
||||
import com.arsdigita.bebop.form.SingleSelect;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.cms.ui.ItemSearch;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentType;
|
||||
import org.librecms.contentsection.ContentTypeRepository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.TooManyListenersException;
|
||||
|
||||
import org.librecms.contenttypes.ContentTypeInfo;
|
||||
import org.librecms.contenttypes.ContentTypesManager;
|
||||
|
||||
/**
|
||||
* A form element which displays a select box of all content types available
|
||||
* under the given content section, and forwards to the item creation UI when
|
||||
* the user selects a content type to instantiate.
|
||||
*
|
||||
* @author Stanislav Freidin (sfreidin@arsdigtia.com)
|
||||
* @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public abstract class NewItemForm extends Form {
|
||||
|
||||
public static final String TYPE_ID = "tid";
|
||||
|
||||
private final SingleSelect typeSelect;
|
||||
private final Submit submit;
|
||||
private final Label emptyLabel;
|
||||
private final Label createLabel;
|
||||
|
||||
public NewItemForm(final String name) {
|
||||
this(name, BoxPanel.HORIZONTAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new NewItemForm. It sets a vertical BoxPanel as the component
|
||||
* container.
|
||||
*
|
||||
* @param name the name attribute of the form.
|
||||
* @param orientation
|
||||
*/
|
||||
public NewItemForm(final String name, final int orientation) {
|
||||
|
||||
super(name, new BoxPanel(BoxPanel.VERTICAL));
|
||||
setIdAttr("new_item_form");
|
||||
|
||||
final BoxPanel panel = new BoxPanel(orientation);
|
||||
panel.setWidth("2%");
|
||||
panel.setBorder(0);
|
||||
|
||||
// create and add an "empty" component
|
||||
emptyLabel = new Label(
|
||||
new GlobalizedMessage("cms.ui.authoring.no_types_registered",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
false);
|
||||
emptyLabel.setIdAttr("empty_label");
|
||||
panel.add(emptyLabel);
|
||||
|
||||
createLabel = new Label(
|
||||
new GlobalizedMessage("cms.ui.authoring.create_new",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
false);
|
||||
createLabel.setIdAttr("create_label");
|
||||
panel.add(createLabel);
|
||||
|
||||
typeSelect = new SingleSelect(new LongParameter(TYPE_ID),
|
||||
OptionGroup.SortMode.ALPHABETICAL_ASCENDING);
|
||||
try {
|
||||
typeSelect.addPrintListener(new PrintListener() {
|
||||
|
||||
// Read the content section's content types and add them as options
|
||||
@Override
|
||||
public void prepare(final PrintEvent event) {
|
||||
final OptionGroup target = (OptionGroup) event
|
||||
.getTarget();
|
||||
target.clearOptions();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
// gather the content types of this section into a list
|
||||
final ContentSection section = getContentSection(state);
|
||||
// final ContentType parentType;
|
||||
final List<ContentType> typesCollection;
|
||||
final Long singleTypeID = (Long) state.getValue(
|
||||
new LongParameter(ItemSearch.SINGLE_TYPE_PARAM));
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final NewItemFormController controller = cdiUtil.findBean(
|
||||
NewItemFormController.class);
|
||||
final ContentTypeRepository typeRepo = cdiUtil.findBean(
|
||||
ContentTypeRepository.class);
|
||||
final ContentTypesManager typesManager = cdiUtil.findBean(
|
||||
ContentTypesManager.class);
|
||||
final PermissionChecker permissionChecker = cdiUtil
|
||||
.findBean(PermissionChecker.class);
|
||||
|
||||
typesCollection = controller.getContentTypes(section);
|
||||
|
||||
for (final ContentType type : typesCollection) {
|
||||
final ContentTypeInfo typeInfo = typesManager
|
||||
.getContentTypeInfo(type.getContentItemClass());
|
||||
final String value = Long.toString(type.getObjectId());
|
||||
final Label label = new Label(
|
||||
new GlobalizedMessage(typeInfo.getLabelKey(),
|
||||
typeInfo.getLabelBundle()));
|
||||
target.addOption(
|
||||
new Option(value, label));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
} catch (TooManyListenersException ex) {
|
||||
throw new UncheckedWrapperException("Too many listeners.", ex);
|
||||
}
|
||||
|
||||
panel.add(typeSelect);
|
||||
|
||||
submit = new Submit("new",
|
||||
new GlobalizedMessage("cms.ui.authoring.go",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
panel.add(submit);
|
||||
|
||||
add(panel);
|
||||
}
|
||||
|
||||
public abstract ContentSection getContentSection(PageState state);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Long getTypeID(final PageState state) {
|
||||
return (Long) typeSelect.getValue(state);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public final SingleSelect getTypeSelect() {
|
||||
return typeSelect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate XML - show/hide labels/widgets
|
||||
*
|
||||
* @param state
|
||||
* @param parent
|
||||
*/
|
||||
@Override
|
||||
public void generateXML(final PageState state, final Element parent) {
|
||||
|
||||
if (isVisible(state)) {
|
||||
final ContentSection section = getContentSection(state);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final NewItemFormController controller = cdiUtil.findBean(
|
||||
NewItemFormController.class);
|
||||
boolean isEmpty = !controller.hasContentTypes(section);
|
||||
|
||||
createLabel.setVisible(state, !isEmpty);
|
||||
typeSelect.setVisible(state, !isEmpty);
|
||||
submit.setVisible(state, !isEmpty);
|
||||
emptyLabel.setVisible(state, isEmpty);
|
||||
|
||||
super.generateXML(state, parent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.news;
|
||||
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentSectionRepository;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.TypedQuery;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.libreccm.security.Role;
|
||||
import org.libreccm.security.RoleRepository;
|
||||
import org.libreccm.security.Shiro;
|
||||
import org.libreccm.security.User;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.ContentType;
|
||||
import org.librecms.contentsection.ContentTypeRepository;
|
||||
import org.librecms.contenttypes.News;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Controller class for the {@link NewItemForm}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
class NewItemFormController {
|
||||
|
||||
@Inject
|
||||
private EntityManager entityManager;
|
||||
|
||||
@Inject
|
||||
private Shiro shiro;
|
||||
|
||||
@Inject
|
||||
private PermissionChecker permissionChecker;
|
||||
|
||||
@Inject
|
||||
private RoleRepository roleRepo;
|
||||
|
||||
@Inject
|
||||
private ContentSectionRepository sectionRepo;
|
||||
|
||||
@Inject
|
||||
private ContentTypeRepository typeRepo;
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected boolean hasContentTypes(final ContentSection section) {
|
||||
Objects.requireNonNull(section, "Can't work with null for the section.");
|
||||
|
||||
final Optional<User> user = shiro.getUser();
|
||||
if (!user.isPresent()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final List<Role> roles = user.get().getRoleMemberships().stream()
|
||||
.map(membership -> membership.getRole())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
final TypedQuery<Boolean> query = entityManager.createNamedQuery(
|
||||
"ContentSection.hasUsableContentTypes", Boolean.class);
|
||||
query.setParameter("section", section);
|
||||
query.setParameter("roles", roles);
|
||||
query.setParameter("isSysAdmin", permissionChecker.isPermitted("*"));
|
||||
|
||||
return query.getSingleResult();
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected List<ContentType> getContentTypes(final ContentSection section) {
|
||||
Objects.requireNonNull(section);
|
||||
|
||||
final Optional<User> user = shiro.getUser();
|
||||
if (!user.isPresent()) {
|
||||
return Collections.EMPTY_LIST;
|
||||
}
|
||||
|
||||
final List<Role> roles = user.get().getRoleMemberships().stream()
|
||||
.map(membership -> membership.getRole())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
final TypedQuery<ContentType> query = entityManager.createNamedQuery(
|
||||
"ContentSection.findUsableContentTypes",
|
||||
ContentType.class);
|
||||
query.setParameter("section", section);
|
||||
query.setParameter("roles", roles);
|
||||
query.setParameter("isSysAdmin", permissionChecker.isPermitted("*"));
|
||||
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,121 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.news;
|
||||
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.News;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class NewsController {
|
||||
|
||||
@Inject
|
||||
private ContentItemRepository itemRepo;
|
||||
|
||||
@Transactional
|
||||
protected String getDescription(
|
||||
final News fromNews, final Locale forLocale
|
||||
) {
|
||||
Objects.requireNonNull(fromNews);
|
||||
final News news = itemRepo
|
||||
.findById(fromNews.getObjectId(), News.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No News with ID %d available.", fromNews.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
return news.getDescription().getValue(forLocale);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
protected String getText(final News fromNews, final Locale forLocale) {
|
||||
Objects.requireNonNull(fromNews);
|
||||
final News news = itemRepo
|
||||
.findById(fromNews.getObjectId(), News.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No News with ID %d available",
|
||||
fromNews.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
return news.getText().getValue(forLocale);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
protected void updateText(
|
||||
final News ofNews,
|
||||
final Locale forLocale,
|
||||
final String text
|
||||
) {
|
||||
Objects.requireNonNull(ofNews);
|
||||
final News news = itemRepo
|
||||
.findById(ofNews.getObjectId(), News.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No News with ID %d available",
|
||||
ofNews.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
news.getText().putValue(forLocale, text);
|
||||
itemRepo.save(news);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
protected void update(
|
||||
final News news,
|
||||
final Date releaseDate,
|
||||
final Locale locale,
|
||||
final String description
|
||||
) {
|
||||
Objects.requireNonNull(news);
|
||||
final News update = itemRepo
|
||||
.findById(news.getObjectId(), News.class)
|
||||
.orElseThrow(
|
||||
() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No News with ID %d available",
|
||||
news.getObjectId()
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
update.setReleaseDate(releaseDate);
|
||||
update.getDescription().putValue(locale, description);
|
||||
itemRepo.save(update);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,218 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.news;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.librecms.contenttypes.News;
|
||||
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.IntrospectionException;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.PropertyDescriptor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.text.DateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Authoring step to edit the simple attributes of the News content type (and
|
||||
* its subclasses). The attributes edited are {@code name}, {@code title},
|
||||
* {@code lead} and {@code item date}. This authoring step replaces the
|
||||
* {@link com.arsdigita.ui.authoring.PageEdit} step for this type.
|
||||
*
|
||||
* @see com.arsdigita.cms.contenttypes.NewsItem
|
||||
*
|
||||
*/
|
||||
public class NewsPropertiesStep extends SimpleEditStep {
|
||||
|
||||
/**
|
||||
* The name of the editing sheet added to this step
|
||||
*/
|
||||
public static String EDIT_SHEET_NAME = "edit";
|
||||
|
||||
public NewsPropertiesStep(final ItemSelectionModel itemModel,
|
||||
final AuthoringKitWizard parent,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemModel, parent, selectedLanguageParam);
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
setDefaultEditKey(EDIT_SHEET_NAME);
|
||||
BasicPageForm editSheet;
|
||||
|
||||
editSheet = new NewsPropertyForm(itemModel, this, selectedLanguageParam);
|
||||
add(EDIT_SHEET_NAME,
|
||||
new GlobalizedMessage("cms.ui.edit", CmsConstants.CMS_BUNDLE),
|
||||
new WorkflowLockedComponentAccess(editSheet, itemModel),
|
||||
editSheet.getSaveCancelSection().getCancelButton());
|
||||
|
||||
setDisplayComponent(getNewsDomainObjectPropertySheet(
|
||||
itemModel,
|
||||
selectedLanguageParam));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a component that displays the properties of the NewsItem
|
||||
* specified by the ItemSelectionModel passed in.
|
||||
*
|
||||
* @param itemModel The ItemSelectionModel to use
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
* @pre itemModel != null
|
||||
* @return A component to display the state of the basic properties of the
|
||||
* item
|
||||
*
|
||||
*/
|
||||
public static Component getNewsDomainObjectPropertySheet(
|
||||
final ItemSelectionModel itemModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
final DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(
|
||||
itemModel,
|
||||
false,
|
||||
selectedLanguageParam);
|
||||
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.title",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"title");
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.name",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"name");
|
||||
sheet.add(new GlobalizedMessage("cms.contenttypes.ui.newsitem.lead",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"description");
|
||||
|
||||
// Show news item on homepage?
|
||||
sheet.add(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.newsitem.date",
|
||||
CmsConstants.CMS_BUNDLE),
|
||||
"releaseDate",
|
||||
new NewsItemDateAttributeFormatter());
|
||||
|
||||
return sheet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private class which implements an AttributeFormatter interface for
|
||||
* NewsItem's date values. Its format(...) class returns a string
|
||||
* representation for either a false or a true value.
|
||||
*/
|
||||
private static class NewsItemDateAttributeFormatter
|
||||
implements DomainObjectPropertySheet.AttributeFormatter {
|
||||
|
||||
/**
|
||||
* Constructor, does nothing.
|
||||
*/
|
||||
public NewsItemDateAttributeFormatter() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Formatter for the value of an attribute.
|
||||
*
|
||||
* It currently relays on the prerequisite that the passed in property
|
||||
* attribute is in fact a date property. No type checking yet!
|
||||
*
|
||||
* Note: the format method has to be executed at each page request. Take
|
||||
* care to properly adjust globalization and localization here!
|
||||
*
|
||||
* @param obj Object containing the attribute to format.
|
||||
* @param attribute Name of the attribute to retrieve and format
|
||||
* @param state PageState of the request
|
||||
*
|
||||
* @return A String representation of the retrieved boolean attribute of
|
||||
* the domain object.
|
||||
*/
|
||||
public String format(final Object obj,
|
||||
final String attribute,
|
||||
final PageState state) {
|
||||
|
||||
if (obj != null && obj instanceof News) {
|
||||
|
||||
final News newsItem = (News) obj;
|
||||
final BeanInfo beanInfo;
|
||||
try {
|
||||
beanInfo = Introspector.getBeanInfo(obj.getClass());
|
||||
} catch (IntrospectionException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
final Optional<PropertyDescriptor> propertyDescriptor = Arrays
|
||||
.stream(beanInfo.getPropertyDescriptors())
|
||||
.filter(current -> attribute.equals(current.getName()))
|
||||
.findAny();
|
||||
|
||||
if (propertyDescriptor.isPresent()) {
|
||||
final GlobalizationHelper globalizationHelper = CdiUtil
|
||||
.createCdiUtil().findBean(GlobalizationHelper.class);
|
||||
|
||||
final Method readMethod = propertyDescriptor
|
||||
.get()
|
||||
.getReadMethod();
|
||||
|
||||
final Object result;
|
||||
try {
|
||||
result = readMethod.invoke(obj);
|
||||
} catch (IllegalAccessException
|
||||
| IllegalArgumentException
|
||||
| InvocationTargetException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
|
||||
return DateFormat
|
||||
.getDateInstance(
|
||||
DateFormat.LONG,
|
||||
globalizationHelper.getNegotiatedLocale())
|
||||
.format(result);
|
||||
|
||||
} else {
|
||||
return (String) new GlobalizedMessage(
|
||||
"cms.ui.unknown",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
|
||||
} else {
|
||||
return (String) new GlobalizedMessage("cms.ui.unknown",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,239 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring.news;
|
||||
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.form.TextArea;
|
||||
import com.arsdigita.bebop.parameters.DateParameter;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.bebop.parameters.ParameterModel;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.librecms.contenttypes.News;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.BasicPageForm;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.NewsConfig;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Form to edit the basic properties of a {@link News} item. These are name,
|
||||
* title, item date and reference code. Used by {@link NewsPropertiesStep}
|
||||
* authoring kit step.
|
||||
*
|
||||
* This form can be extended to create forms for NewsItem subclasses.
|
||||
*
|
||||
*/
|
||||
public class NewsPropertyForm extends BasicPageForm
|
||||
implements FormProcessListener, FormInitListener, FormSubmissionListener {
|
||||
|
||||
private NewsPropertiesStep propertiesStep;
|
||||
/**
|
||||
* lead parameter name
|
||||
*/
|
||||
public static final String LEAD = "lead";
|
||||
/**
|
||||
* Item date parameter name
|
||||
*/
|
||||
public static final String NEWS_DATE = "news_date";
|
||||
public static final String IS_HOMEPAGE = "isHomepage";
|
||||
/**
|
||||
* Name of this form
|
||||
*/
|
||||
public static final String ID = "news_item_edit";
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
private com.arsdigita.bebop.form.Date releaseDateSelector;
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the NewsItem object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemSelectionModel The ItemSelectionModel to use to obtain the
|
||||
* NewsItem to work on
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public NewsPropertyForm(final ItemSelectionModel itemSelectionModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
this(itemSelectionModel, null, selectedLanguageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new form to edit the NewsItem object specified by the item
|
||||
* selection model passed in.
|
||||
*
|
||||
* @param itemSelectionModel The ItemSelectionModel to use to obtain the
|
||||
* NewsItem to work on
|
||||
* @param propertiesStep The NewsPropertiesStep which controls this
|
||||
* form.
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public NewsPropertyForm(final ItemSelectionModel itemSelectionModel,
|
||||
final NewsPropertiesStep propertiesStep,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(ID, itemSelectionModel, selectedLanguageParam);
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
this.propertiesStep = propertiesStep;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
addSubmissionListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds widgets to the form.
|
||||
*/
|
||||
@Override
|
||||
protected void addWidgets() {
|
||||
|
||||
super.addWidgets();
|
||||
|
||||
final ParameterModel leadParam = new StringParameter(LEAD);
|
||||
final TextArea lead = new TextArea(leadParam);
|
||||
lead.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.newsitem.lead",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
lead.setCols(50);
|
||||
lead.setRows(5);
|
||||
add(lead);
|
||||
|
||||
final ConfigurationManager confManager = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ConfigurationManager.class);
|
||||
final NewsConfig newsConfig = confManager
|
||||
.findConfiguration(NewsConfig.class);
|
||||
|
||||
final int startYear = newsConfig.getStartYear();
|
||||
final int endYearDelta = newsConfig.getEndYearDelta();
|
||||
final int currentYear = GregorianCalendar
|
||||
.getInstance()
|
||||
.get(Calendar.YEAR);
|
||||
final int endYear = currentYear + endYearDelta;
|
||||
|
||||
final ParameterModel newsDateParam = new DateParameter(NEWS_DATE);
|
||||
newsDateParam.addParameterListener(new NotNullValidationListener());
|
||||
releaseDateSelector = new com.arsdigita.bebop.form.Date(newsDateParam);
|
||||
releaseDateSelector.setYearRange(startYear, endYear);
|
||||
releaseDateSelector.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.newsitem.date",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
add(releaseDateSelector);
|
||||
}
|
||||
|
||||
/**
|
||||
* Form initialisation hook. Fills widgets with data.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) {
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
final News item = (News) super.initBasicWidgets(event);
|
||||
|
||||
// set a default item date, if none set
|
||||
final java.util.Date releaseDate;
|
||||
if (item.getReleaseDate() == null) {
|
||||
// new Date is initialised to current time
|
||||
releaseDate = new java.util.Date();
|
||||
} else {
|
||||
releaseDate = item.getReleaseDate();
|
||||
}
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
releaseDateSelector.addYear(releaseDate);
|
||||
data.put(NEWS_DATE, releaseDate);
|
||||
final NewsController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(NewsController.class);
|
||||
data.put(LEAD, controller.getDescription(item, selectedLocale));
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels streamlined editing.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event) {
|
||||
if (propertiesStep != null
|
||||
&& getSaveCancelSection()
|
||||
.getCancelButton()
|
||||
.isSelected(event.getPageState())) {
|
||||
propertiesStep.cancelStreamlinedCreation(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Form processing hook. Saves NewsItem object.
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void process(final FormSectionEvent event) {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final News item = (News) super.processBasicWidgets(event);
|
||||
|
||||
// save only if save button was newsed
|
||||
if (item != null
|
||||
&& getSaveCancelSection()
|
||||
.getSaveButton()
|
||||
.isSelected(event.getPageState())) {
|
||||
|
||||
final NewsController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(NewsController.class);
|
||||
|
||||
final Date releaseDate = (java.util.Date) data.get(NEWS_DATE);
|
||||
final String description = (String) data.get(LEAD);
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
controller.update(item, releaseDate, selectedLocale, description);
|
||||
}
|
||||
if (propertiesStep != null) {
|
||||
propertiesStep.maybeForwardToNextStep(event.getPageState());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,109 +0,0 @@
|
|||
package com.arsdigita.cms.ui.authoring.news;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.SingleSelect;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
|
||||
import com.arsdigita.cms.ui.authoring.TextBody;
|
||||
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contenttypes.News;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import static com.arsdigita.cms.ui.authoring.TextBody.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class NewsTextBody extends TextBody {
|
||||
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
public NewsTextBody(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(itemSelectionModel, selectedLanguageParam);
|
||||
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
this.selectedLanguageParam = selectedLanguageParam;
|
||||
|
||||
// Rest the component when it is hidden
|
||||
authoringKitWizard
|
||||
.getList()
|
||||
.addActionListener(event -> reset(event.getPageState()));
|
||||
|
||||
// Set the right component access on the forms
|
||||
final Component uploadComponent = getComponent(FILE_UPLOAD);
|
||||
if (uploadComponent != null) {
|
||||
setComponentAccess(FILE_UPLOAD,
|
||||
new WorkflowLockedComponentAccess(
|
||||
uploadComponent, itemSelectionModel));
|
||||
}
|
||||
final Component textEntryComponent = getComponent(TEXT_ENTRY);
|
||||
setComponentAccess(TEXT_ENTRY,
|
||||
new WorkflowLockedComponentAccess(
|
||||
textEntryComponent, itemSelectionModel));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the options for the mime type select widget of
|
||||
* <code>GenericArticleForm</code> and sets the default mime type.
|
||||
*
|
||||
* @param mimeSelect
|
||||
*/
|
||||
@Override
|
||||
protected void setMimeTypeOptions(final SingleSelect mimeSelect) {
|
||||
mimeSelect.addOption(new Option("text/html", "HTML Text"));
|
||||
mimeSelect.setOptionSelected("text/html");
|
||||
}
|
||||
|
||||
protected News getSelectedNews(final PageState state) {
|
||||
|
||||
return (News) itemSelectionModel.getSelectedItem(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTextPropertyName() {
|
||||
return "text";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(final PageState state) {
|
||||
|
||||
final News news = getSelectedNews(state);
|
||||
|
||||
final NewsController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(NewsController.class);
|
||||
return controller.getText(
|
||||
news,
|
||||
SelectedLanguageUtil.selectedLocale(state, selectedLanguageParam)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateText(final PageState state, final String text) {
|
||||
|
||||
final News news = getSelectedNews(state);
|
||||
|
||||
final Locale selectedLocale = SelectedLanguageUtil
|
||||
.selectedLocale(state, selectedLanguageParam);
|
||||
|
||||
final NewsController controller = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(NewsController.class);
|
||||
controller.updateText(news, selectedLocale, text);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -18,9 +18,6 @@
|
|||
*/
|
||||
package org.librecms.contenttypes;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.article.ArticlePropertiesStep;
|
||||
import com.arsdigita.cms.ui.authoring.article.ArticleTextBody;
|
||||
import com.arsdigita.cms.ui.authoring.PageCreateForm;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
|
@ -34,7 +31,6 @@ import javax.persistence.Table;
|
|||
|
||||
import org.hibernate.envers.Audited;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import static org.librecms.CmsConstants.*;
|
||||
|
||||
|
|
@ -55,26 +51,6 @@ import javax.xml.bind.annotation.XmlRootElement;
|
|||
@Table(name = "ARTICLES", schema = DB_SCHEMA)
|
||||
@ContentTypeDescription(labelBundle = "org.librecms.contenttypes.Article",
|
||||
descriptionBundle = "org.librecms.contenttypes.Article")
|
||||
@AuthoringKit(
|
||||
createComponent = PageCreateForm.class,
|
||||
steps = {
|
||||
@AuthoringStep(
|
||||
component = ArticlePropertiesStep.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.basic_properties.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.basic_properties"
|
||||
+ ".description",
|
||||
order = 1),
|
||||
@AuthoringStep(
|
||||
component = ArticleTextBody.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.body_text.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.body_text.description",
|
||||
order = 2
|
||||
)
|
||||
})
|
||||
@MvcAuthoringKit(
|
||||
createStep = MvcArticleCreateStep.class,
|
||||
authoringSteps = {
|
||||
|
|
|
|||
|
|
@ -18,9 +18,6 @@
|
|||
*/
|
||||
package org.librecms.contenttypes;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.event.EventPropertiesStep;
|
||||
import com.arsdigita.cms.ui.authoring.event.EventTextBody;
|
||||
import com.arsdigita.cms.ui.contenttypes.EventCreateForm;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
|
@ -39,7 +36,6 @@ import javax.persistence.TemporalType;
|
|||
import org.hibernate.envers.Audited;
|
||||
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.ui.contentsections.documents.MvcAuthoringKit;
|
||||
|
|
@ -58,27 +54,6 @@ import static org.librecms.CmsConstants.DB_SCHEMA;
|
|||
@Table(name = "EVENTS", schema = DB_SCHEMA)
|
||||
@ContentTypeDescription(labelBundle = "org.librecms.contenttypes.Event",
|
||||
descriptionBundle = "org.librecms.contenttypes.Event")
|
||||
@AuthoringKit(
|
||||
createComponent = EventCreateForm.class,
|
||||
steps = {
|
||||
@AuthoringStep(
|
||||
component = EventPropertiesStep.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.basic_properties.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.basic_properties"
|
||||
+ ".description",
|
||||
order = 1
|
||||
),
|
||||
@AuthoringStep(
|
||||
component = EventTextBody.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.body_text.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.body_text.description",
|
||||
order = 2
|
||||
)
|
||||
})
|
||||
@MvcAuthoringKit(
|
||||
createStep = MvcEventCreateStep.class,
|
||||
authoringSteps = {
|
||||
|
|
|
|||
|
|
@ -18,13 +18,9 @@
|
|||
*/
|
||||
package org.librecms.contenttypes;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.multipartarticle.MultiPartArticleCreateForm;
|
||||
import com.arsdigita.cms.ui.authoring.multipartarticle.MultiPartArticleEdit;
|
||||
import com.arsdigita.cms.ui.authoring.multipartarticle.MultiPartArticleSectionsStep;
|
||||
|
||||
import org.hibernate.envers.Audited;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.ui.contentsections.documents.MvcAuthoringKit;
|
||||
import org.librecms.ui.contenttypes.mpa.MvcMpaCreateStep;
|
||||
|
|
@ -59,28 +55,6 @@ import static org.librecms.CmsConstants.*;
|
|||
labelBundle = "org.librecms.contenttypes.MultiPartArticle",
|
||||
descriptionBundle = "org.librecms.contenttypes.MultiPartArticle"
|
||||
)
|
||||
@AuthoringKit(
|
||||
createComponent = MultiPartArticleCreateForm.class,
|
||||
steps = {
|
||||
@AuthoringStep(
|
||||
component = MultiPartArticleEdit.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.basic_properties.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.basic_properties"
|
||||
+ ".description",
|
||||
order = 1
|
||||
),
|
||||
@AuthoringStep(
|
||||
component = MultiPartArticleSectionsStep.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "mparticle.authoring.body_text.label",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "mparticle.authoring.body_text.description",
|
||||
order = 2
|
||||
)
|
||||
}
|
||||
)
|
||||
@MvcAuthoringKit(
|
||||
createStep = MvcMpaCreateStep.class,
|
||||
authoringSteps = {
|
||||
|
|
|
|||
|
|
@ -18,13 +18,9 @@
|
|||
*/
|
||||
package org.librecms.contenttypes;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.news.NewsPropertiesStep;
|
||||
import com.arsdigita.cms.ui.authoring.news.NewsTextBody;
|
||||
import com.arsdigita.cms.ui.contenttypes.NewsCreateForm;
|
||||
|
||||
import org.hibernate.envers.Audited;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.ui.contentsections.documents.MvcAuthoringKit;
|
||||
import org.librecms.ui.contenttypes.news.MvcNewsCreateStep;
|
||||
|
|
@ -57,27 +53,6 @@ import static org.librecms.CmsConstants.*;
|
|||
@Table(name = "NEWS", schema = DB_SCHEMA)
|
||||
@ContentTypeDescription(labelBundle = "org.librecms.contenttypes.News",
|
||||
descriptionBundle = "org.librecms.contenttypes.News")
|
||||
@AuthoringKit(
|
||||
createComponent = NewsCreateForm.class,
|
||||
steps = {
|
||||
@AuthoringStep(
|
||||
component = NewsPropertiesStep.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.basic_properties.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.basic_properties"
|
||||
+ ".description",
|
||||
order = 1)
|
||||
,
|
||||
@AuthoringStep(
|
||||
component = NewsTextBody.class,
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "cms.contenttypes.shared.body_text.title",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "cms.contenttypes.shared.body_text.description",
|
||||
order = 2
|
||||
)
|
||||
})
|
||||
@MvcAuthoringKit(
|
||||
createStep = MvcNewsCreateStep.class,
|
||||
authoringSteps = {
|
||||
|
|
|
|||
Loading…
Reference in New Issue