diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorAddForm.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorAddForm.java new file mode 100644 index 0000000..1a6816f --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorAddForm.java @@ -0,0 +1,281 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.Text; +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.CheckboxGroup; +import com.arsdigita.bebop.form.Option; +import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.ui.assets.AssetSearchWidget; +import com.arsdigita.cms.ui.assets.ItemSearchWidget; +import com.arsdigita.cms.ui.authoring.BasicItemForm; +import com.arsdigita.cms.ui.authoring.SimpleEditStep; +import com.arsdigita.globalization.GlobalizedMessage; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.libreccm.cdi.utils.CdiUtil; +import org.librecms.assets.Person; +import org.scientificcms.publications.Publication; +import org.scientificcms.publications.SciPublicationsConfig; +import org.scientificcms.publications.SciPublicationsConstants; +import org.scientificcms.publications.contenttypes.PublicationItem; + +import java.util.Objects; + +/** + * + * @author Jens Pelzetter + */ +public class PublicationAuthorAddForm + extends BasicItemForm + implements FormProcessListener, FormInitListener, FormSubmissionListener { + + private static final Logger LOGGER = LogManager.getLogger( + PublicationAuthorAddForm.class + ); + + private final static String AUTHOR_SEARCH = "authors"; + + private final static SciPublicationsConfig CONFIG = SciPublicationsConfig + .getConfig(); + + private PublicationPropertiesStep step; + + private AssetSearchWidget authorSearchWidget; + + private final ItemSelectionModel itemModel; + + private final SimpleEditStep editStep; + + private Text selectedAuthorLabel; + + private CheckboxGroup isEditor; + + public PublicationAuthorAddForm( + final ItemSelectionModel itemModel, + final SimpleEditStep editStep, + final StringParameter selectedLanguageParam + ) { + super("AuthorsEntryForm", itemModel, selectedLanguageParam); + this.itemModel = itemModel; + this.editStep = editStep; + addSubmissionListener(this); + } + + @Override + protected void addWidgets() { + + authorSearchWidget = new AssetSearchWidget( + AUTHOR_SEARCH, Person.class + ); + authorSearchWidget.setLabel( + new GlobalizedMessage( + "publications.ui.authors.selectAuthor", + SciPublicationsConstants.BUNDLE + ) + ); + add(authorSearchWidget); + + selectedAuthorLabel = new Text(); + add(selectedAuthorLabel); + + isEditor = new CheckboxGroup("isEditorGroup"); + isEditor.addOption( + new Option( + SciPublicationsController.AUTHORSHIP_IS_EDITOR, + new Label( + new GlobalizedMessage( + "publications.ui.authors.author.is_editor", + SciPublicationsConstants.BUNDLE + ) + ) + ) + ); + add(isEditor); + } + + @Override + public void init(final FormSectionEvent event) throws FormProcessException { + + final FormData formData = event.getFormData(); + final PageState state = event.getPageState(); + + final Person author; + final Boolean editor; + + author = ((PublicationAuthorsPropertyStep) editStep).getSelectedAuthor(); + editor = ((PublicationAuthorsPropertyStep) editStep) + .isSelectedAuthorEditor(); + + if (author == null) { + LOGGER.warn("No author selected."); + + authorSearchWidget.setVisible(state, true); + selectedAuthorLabel.setVisible(state, false); + } else { + LOGGER.warn( + String.format( + "Author is here: %s", Objects.toString(author) + ) + ); + + formData.put(AUTHOR_SEARCH, author); + if ((editor != null) && editor) { + isEditor.setValue( + state, + new String[]{ + SciPublicationsController.AUTHORSHIP_IS_EDITOR + } + ); + } else { + isEditor.setValue(state, null); + } + + authorSearchWidget.setVisible(state, false); + selectedAuthorLabel.setText( + String.format("%s, %s", + author.getPersonName().getSurname(), + author.getPersonName().getGivenName() + ) + ); + selectedAuthorLabel.setVisible(state, true); + } + + setVisible(state, true); + } + + @Override + public void process(final FormSectionEvent event) + throws FormProcessException { + + final FormData formData = event.getFormData(); + final PageState state = event.getPageState(); + + final PublicationItem item = (PublicationItem) itemModel + .getSelectedItem(state); + final Publication publication = item.getPublication(); + + if (getSaveCancelSection().getSaveButton().isSelected(state)) { + + final Person author = ((PublicationAuthorsPropertyStep) editStep) + .getSelectedAuthor(); + + final Boolean editor; + if (isEditor.getValue(state) == null) { + editor = Boolean.FALSE; + } else { + editor = Boolean.TRUE; + } + + final SciPublicationsController controller = CdiUtil + .createCdiUtil() + .findBean(SciPublicationsController.class); + if (author == null) { + final Person authorToAdd = (Person) formData.get( + AUTHOR_SEARCH + ); + + controller.addAuthor( + publication.getPublicationId(), + authorToAdd.getObjectId(), + editor + ); + } else { + + controller.updateAuthorship(publication.getPublicationId(), + author.getObjectId(), + editor); + + ((PublicationAuthorsPropertyStep) editStep) + .setSelectedAuthor(null); + ((PublicationAuthorsPropertyStep) editStep) + .setSelectedAuthorEditor(null); + + } + } + + init(event); + } + + @Override + public void submitted(final FormSectionEvent fse) throws + FormProcessException { + if (getSaveCancelSection().getCancelButton() + .isSelected(fse.getPageState())) { + ((PublicationAuthorsPropertyStep) editStep) + .setSelectedAuthor(null); + ((PublicationAuthorsPropertyStep) editStep) + .setSelectedAuthorEditor(null); + + init(fse); + } + } + + @Override + public void validate(final FormSectionEvent event) + throws FormProcessException { + + final PageState state = event.getPageState(); + final FormData formData = event.getFormData(); + boolean editing = false; //Are we editing the association + + if ((((PublicationAuthorsPropertyStep) editStep) + .getSelectedAuthor() == null) + && (formData.get(AUTHOR_SEARCH) == null)) { + formData.addError( + new GlobalizedMessage( + "publications.ui.authors.selectAuthor.no_author_selected", + SciPublicationsConstants.BUNDLE + ) + ); + return; + } + + final PublicationItem item + = (PublicationItem) getItemSelectionModel() + .getSelectedObject(state); + final Person author; + if (formData.get(AUTHOR_SEARCH) == null) { + author = ((PublicationAuthorsPropertyStep) editStep) + .getSelectedAuthor(); + editing = true; + } else { + author = (Person) formData.get(AUTHOR_SEARCH); + } + + if (!editing) { + + final SciPublicationsController controller = CdiUtil + .createCdiUtil() + .findBean(SciPublicationsController.class); + + final boolean hasAuthor = controller.hasAuthor( + item.getPublication().getPublicationId(), + author.getObjectId() + ); + + if (hasAuthor) { + formData.addError( + new GlobalizedMessage( + "publications.ui.authors.selectAuthor.already_added", + SciPublicationsConstants.BUNDLE + ) + ); + } + } + } + +} diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsPropertyStep.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsPropertyStep.java new file mode 100644 index 0000000..0ad034c --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsPropertyStep.java @@ -0,0 +1,81 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.ui.authoring.AuthoringKitWizard; +import com.arsdigita.cms.ui.authoring.BasicItemForm; +import com.arsdigita.cms.ui.authoring.SimpleEditStep; +import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess; +import com.arsdigita.globalization.GlobalizedMessage; + +import org.librecms.assets.Person; +import org.scientificcms.publications.SciPublicationsConstants; + +/** + * + * @author Jens Pelzetter + */ +public class PublicationAuthorsPropertyStep extends SimpleEditStep { + + public static final String ADD_AUTHOR_SHEET_NAME = "addAuthor"; + + private Person selectedAuthor; + + private Boolean selectedAuthorEditor; + + public PublicationAuthorsPropertyStep( + final ItemSelectionModel itemModel, + final AuthoringKitWizard parent, + final StringParameter selectedLanguageParam + ) { + this(itemModel, parent, selectedLanguageParam, null); + } + + public PublicationAuthorsPropertyStep( + final ItemSelectionModel itemModel, + final AuthoringKitWizard authoringKitWizard, + final StringParameter selectedLanguageParameter, + final String prefix + ) { + super(itemModel, authoringKitWizard, selectedLanguageParameter, prefix); + + final BasicItemForm addAuthorSheet = new PublicationAuthorAddForm( + itemModel, this, selectedLanguageParameter + ); + add(ADD_AUTHOR_SHEET_NAME, + new GlobalizedMessage( + "publications.ui.authors.add_author", + SciPublicationsConstants.BUNDLE + ), + new WorkflowLockedComponentAccess(addAuthorSheet, itemModel), + addAuthorSheet.getSaveCancelSection().getCancelButton()); + + final PublicationAuthorsTable authorsTable = new PublicationAuthorsTable( + itemModel, this); + setDisplayComponent(authorsTable); + } + + protected Person getSelectedAuthor() { + return selectedAuthor; + } + + protected Boolean isSelectedAuthorEditor() { + return selectedAuthorEditor; + } + + protected void setSelectedAuthor(final Person selectedAuthor) { + this.selectedAuthor = selectedAuthor; + } + + protected void setSelectedAuthorEditor(final Boolean selectedAuthorEditor) { + this.selectedAuthorEditor = selectedAuthorEditor; + } + + + +} diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationPropertiesStep.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationPropertiesStep.java new file mode 100644 index 0000000..1d4ccf8 --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationPropertiesStep.java @@ -0,0 +1,259 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.Component; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.SegmentedPanel; +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.authoring.SimpleEditStep; +import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess; +import com.arsdigita.domain.DomainService; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.toolbox.ui.DomainObjectPropertySheet; + +import org.arsdigita.cms.CMSConfig; +import org.librecms.CmsConstants; +import org.librecms.contentsection.ContentItem; +import org.scientificcms.publications.SciPublicationsConfig; +import org.scientificcms.publications.SciPublicationsConstants; + +import java.text.DateFormat; + +/** + * + * @author Jens Pelzetter + */ +public class PublicationPropertiesStep extends SimpleEditStep { + + public static final String EDIT_SHEET_NAME = "edit"; + + private final SegmentedPanel segmentedPanel; + + private final StringParameter selectedLangParameter; + + public PublicationPropertiesStep( + final ItemSelectionModel itemModel, + final AuthoringKitWizard parent, + final StringParameter selectedLangParameter + ) { + super(itemModel, parent, selectedLangParameter); + + segmentedPanel = new SegmentedPanel(); + setDefaultEditKey(EDIT_SHEET_NAME); + + addBasicProperties(itemModel, parent); + addSteps(itemModel, parent); + + this.selectedLangParameter = selectedLangParameter; + + setDisplayComponent(segmentedPanel); + } + + public static Component getPublicationPropertySheet( + final ItemSelectionModel itemModel, + final StringParameter selectedLanguageParam + ) { + final DomainObjectPropertySheet sheet = new DomainObjectPropertySheet( + itemModel, + false, + selectedLanguageParam + ); + + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.name", + SciPublicationsConstants.BUNDLE + ), + SciPublicationsController.NAME + ); + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.title", + SciPublicationsConstants.BUNDLE), + SciPublicationsController.TITLE + ); + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.year_of_publication", + SciPublicationsConstants.BUNDLE + ), + SciPublicationsController.YEAR_OF_PUBLICATION + ); + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.short_desc", + SciPublicationsConstants.BUNDLE + ), + SciPublicationsController.SHORT_DESCRIPTION + ); + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.abstract", + SciPublicationsConstants.BUNDLE + ), + SciPublicationsController.ABSTRACT + ); + //new PreFormattedTextFormatter()); + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.misc", + SciPublicationsConstants.BUNDLE + ), + SciPublicationsController.MISC + ); + + final SciPublicationsConfig config = SciPublicationsConfig.getConfig(); + if (config.isFirstPublishedPropertyEnabled()) { + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.first_published", + SciPublicationsConstants.BUNDLE), + SciPublicationsController.YEAR_FIRST_PUBLISHED + ); + } + + if (config.isLanguagePropertyEnabled()) { + sheet.add( + new GlobalizedMessage( + "publications.ui.publication.language_of_publication", + SciPublicationsConstants.BUNDLE + ), + SciPublicationsController.LANGUAGE_OF_PUBLICATION + ); + } + + if (!CMSConfig.getConfig().isHideLaunchDate()) { + sheet.add(new GlobalizedMessage("cms.contenttypes.ui.launch_date", + CmsConstants.CMS_BUNDLE), + SciPublicationsController.LAUNCH_DATE, + 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; + } + + protected SegmentedPanel getSegmentedPanel() { + return segmentedPanel; + } + + protected void addBasicProperties(final ItemSelectionModel itemModel, + final AuthoringKitWizard parent) { + + SimpleEditStep basicProperties = new SimpleEditStep( + itemModel, + parent, + selectedLangParameter, + EDIT_SHEET_NAME + ); + + final BasicPageForm editBasicSheet = new PublicationPropertyForm( + itemModel, + this, + selectedLangParameter + ); + basicProperties.add( + EDIT_SHEET_NAME, + new GlobalizedMessage( + "publications.ui.publication.edit_basic_sheet", + SciPublicationsConstants.BUNDLE + ), + new WorkflowLockedComponentAccess(editBasicSheet, itemModel), + editBasicSheet.getSaveCancelSection().getCancelButton()); + + basicProperties.setDisplayComponent( + getPublicationPropertySheet(itemModel, selectedLangParameter) + ); + + segmentedPanel.addSegment( + new Label(new GlobalizedMessage( + "publications.ui.publication.basic_properties", + SciPublicationsConstants.BUNDLE) + ), + basicProperties); + } + + protected void addSteps(ItemSelectionModel itemModel, + AuthoringKitWizard parent) { + addStep( + new PublicationAuthorsPropertyStep( + itemModel, parent, selectedLangParameter), + new GlobalizedMessage( + "publications.ui.publication.authors", + SciPublicationsConstants.BUNDLE + ) + ); + if (isSeriesStepEnabled()) { + addStep( + new PublicationSeriesPropertyStep( + itemModel, parent, selectedLangParameter), + new GlobalizedMessage( + "publications.ui.publication.series", + SciPublicationsConstants.BUNDLE + ) + ); + } + } + + protected void addStep(final SimpleEditStep step, + final GlobalizedMessage label + ) { + segmentedPanel.addSegment(new Label(label), step); + } + + protected boolean isSeriesStepEnabled() { + return true; + } + + protected static class PreFormattedTextFormatter + extends DomainService + implements DomainObjectPropertySheet.AttributeFormatter { + + public PreFormattedTextFormatter() { + super(); + } + + @Override + public String format(final Object obj, + final String attribute, + final PageState state) { + + final String str = (String) get(obj, attribute); + if ((str == null) || str.trim().isEmpty()) { + return (String) new GlobalizedMessage( + "cms.ui.unknown", CmsConstants.CMS_BUNDLE + ).localize(); + } else { + return String.format("
%s
", str); + } + } + + } + +} diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationPropertyForm.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationPropertyForm.java new file mode 100644 index 0000000..ee39a7a --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationPropertyForm.java @@ -0,0 +1,338 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.Text; +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.PrintEvent; +import com.arsdigita.bebop.event.PrintListener; +import com.arsdigita.bebop.form.Option; +import com.arsdigita.bebop.form.SingleSelect; +import com.arsdigita.bebop.form.TextArea; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.bebop.parameters.IntegerParameter; +import com.arsdigita.bebop.parameters.ParameterModel; +import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.cms.ItemSelectionModel; +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 org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.l10n.GlobalizationHelper; +import org.scientificcms.publications.Publication; +import org.scientificcms.publications.SciPublicationsConfig; +import org.scientificcms.publications.SciPublicationsConstants; +import org.scientificcms.publications.contenttypes.PublicationItem; + +import java.text.Collator; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * + * @author Jens Pelzetter + */ +public class PublicationPropertyForm + extends BasicPageForm + implements FormProcessListener, FormInitListener, FormSubmissionListener { + + private static final Logger LOGGER = LogManager.getLogger( + PublicationPropertyForm.class + ); + + public static final String ID = "Publication_edit"; + + private final static SciPublicationsConfig CONFIG = SciPublicationsConfig + .getConfig(); + + private PublicationPropertiesStep step; + + private final StringParameter selectedLanguageParam; + + public PublicationPropertyForm(final ItemSelectionModel itemModel, + final StringParameter selectedLangParam) { + + this(itemModel, null, selectedLangParam); + } + + public PublicationPropertyForm(final ItemSelectionModel itemModel, + final PublicationPropertiesStep step, + final StringParameter selectedLangParam) { + + super(ID, itemModel, selectedLangParam); + this.step = step; + this.selectedLanguageParam = selectedLangParam; + addSubmissionListener(this); + } + + @Override + protected void addWidgets() { + + super.addWidgets(); + + final ParameterModel yearOfPublicationParam = new IntegerParameter( + "yearOfPublication" + ); + final TextField yearOfPublication + = new TextField(yearOfPublicationParam); + yearOfPublication.setMaxLength(4); + yearOfPublication.setLabel( + new GlobalizedMessage( + "publications.ui.publication.year_of_publication", + SciPublicationsConstants.BUNDLE + ) + ); + add(yearOfPublication); + + final ParameterModel firstPublishedParam = new IntegerParameter( + SciPublicationsController.YEAR_FIRST_PUBLISHED); + final TextField firstPublished = new TextField(firstPublishedParam); + firstPublished.setLabel( + new GlobalizedMessage( + "publications.ui.publication.first_published", + SciPublicationsConstants.BUNDLE + ) + ); + add(firstPublished); + final ParameterModel langParam = new StringParameter( + SciPublicationsController.LANGUAGE_OF_PUBLICATION + ); + final SingleSelect lang = new SingleSelect(langParam); + final Locale[] locales = Locale.getAvailableLocales(); + lang.addOption(new Option("", new Text(""))); + Arrays.sort(locales, new Comparator() { + + @Override + public int compare(final Locale locale1, + final Locale locale2) { + final GlobalizationHelper globalizationHelper = CdiUtil + .createCdiUtil() + .findBean(GlobalizationHelper.class); + final Locale negLocale = globalizationHelper + .getNegotiatedLocale(); + final Collator collator = Collator + .getInstance(negLocale); + + return collator.compare(locale1 + .getDisplayName(negLocale), + locale2 + .getDisplayName(negLocale)); + } + + }); + + for (Locale locale : locales) { + final Locale currentLocale = locale; + + final Label optionLabel = new Label(new PrintListener() { + + @Override + public void prepare(final PrintEvent event) { + final Label target = (Label) event.getTarget(); + final GlobalizationHelper globalizationHelper = CdiUtil + .createCdiUtil() + .findBean(GlobalizationHelper.class); + target.setLabel( + currentLocale.getDisplayName( + globalizationHelper.getNegotiatedLocale() + ) + ); + } + + }); + lang.addOption(new Option(locale.toString(), optionLabel)); + } + lang.setLabel( + new GlobalizedMessage( + "publications.ui.publication.language", + SciPublicationsConstants.BUNDLE + ) + ); + add(lang); + + final ParameterModel abstractParam = new StringParameter( + SciPublicationsController.ABSTRACT + ); + final TextArea abstractArea; + if (CONFIG.isAbstractHtmlEnabled()) { + abstractArea = new CMSDHTMLEditor(abstractParam); + } else { + abstractArea = new TextArea(abstractParam); + } + abstractArea.setCols(60); + abstractArea.setRows(18); + abstractArea.setLabel( + new GlobalizedMessage( + "publications.ui.publication.abstract", + SciPublicationsConstants.BUNDLE + ) + ); + add(abstractArea); + + final ParameterModel shortDescParam = new StringParameter( + SciPublicationsController.SHORT_DESCRIPTION + ); + final TextArea shortDesc; + if (CONFIG.isShortDescriptionHtmlEnabled()) { + shortDesc = new CMSDHTMLEditor(shortDescParam); + } else { + shortDesc = new TextArea(shortDescParam); + } + shortDesc.setLabel( + new GlobalizedMessage( + "publications.ui.publication.short_description", + SciPublicationsConstants.BUNDLE + ) + ); + shortDesc.setCols(60); + shortDesc.setRows(10); + add(shortDesc); + + final ParameterModel miscParam = new StringParameter( + SciPublicationsController.MISC + ); + final TextArea misc; + if (CONFIG.isMiscHtmlEnabled()) { + misc = new CMSDHTMLEditor(miscParam); + } else { + misc = new TextArea(miscParam); + } + misc.setLabel( + new GlobalizedMessage( + "publications.ui.publication.misc", + SciPublicationsConstants.BUNDLE + ) + ); + misc.setCols(60); + misc.setRows(18); + add(misc); + } + + @Override + public void init(final FormSectionEvent event) throws FormProcessException { + + final FormData data = event.getFormData(); + final PublicationItem item = (PublicationItem) super + .initBasicWidgets(event); + + final PageState state = event.getPageState(); + + final Locale selectedLanguage = SelectedLanguageUtil + .selectedLocale(state, selectedLanguageParam); + + data.put(SciPublicationsController.YEAR_OF_PUBLICATION, + item.getPublication().getYearOfPublication()); + data.put(SciPublicationsController.YEAR_FIRST_PUBLISHED, + item.getPublication().getYearFirstPublished()); + data.put(SciPublicationsController.LANGUAGE_OF_PUBLICATION, + item.getPublication().getLanguageOfPublication()); + data.put( + SciPublicationsController.ABSTRACT, + item.getPublication().getPublicationAbstract().getValue( + selectedLanguage + ) + ); + data.put( + SciPublicationsController.SHORT_DESCRIPTION, + item.getPublication().getShortDescription().getValue( + selectedLanguage + ) + ); + data.put( + SciPublicationsController.MISC, + item.getPublication().getMisc().getValue(selectedLanguage) + ); + } + + @Override + public void process(FormSectionEvent event) throws FormProcessException { + + final FormData formData = event.getFormData(); + final PageState state = event.getPageState(); + final PublicationItem item = (PublicationItem) super + .processBasicWidgets(event); + + if ((item != null) + && getSaveCancelSection().getSaveButton().isSelected(state)) { + + final Map data = new HashMap<>(); + + data.put( + SciPublicationsController.YEAR_OF_PUBLICATION, + formData.get(SciPublicationsController.YEAR_OF_PUBLICATION) + ); + data.put( + SciPublicationsController.YEAR_FIRST_PUBLISHED, + formData.get(SciPublicationsController.YEAR_FIRST_PUBLISHED + ) + ); + data.put( + SciPublicationsController.LANGUAGE_OF_PUBLICATION, + new Locale( + (String) formData.get( + SciPublicationsController.LANGUAGE_OF_PUBLICATION + ) + ) + ); + data.put( + SciPublicationsController.ABSTRACT, + formData.get(SciPublicationsController.ABSTRACT) + ); + data.put( + SciPublicationsController.SHORT_DESCRIPTION, + formData.get(SciPublicationsController.SHORT_DESCRIPTION) + ); + data.put( + SciPublicationsController.MISC, + formData.get(SciPublicationsController.MISC) + ); + + final Locale selectedLocale = SelectedLanguageUtil.selectedLocale( + state, selectedLanguageParam + ); + + final SciPublicationsController controller = CdiUtil + .createCdiUtil() + .findBean(SciPublicationsController.class); + controller.savePublication(item.getPublication().getPublicationId(), + selectedLocale, + data); + } + } + + @Override + public void submitted(final FormSectionEvent event) + throws FormProcessException { + + if ((step != null) && getSaveCancelSection().getCancelButton(). + isSelected(event.getPageState())) { + step.cancelStreamlinedCreation(event.getPageState()); + } + } + + @Override + protected GlobalizedMessage getTitleLabel() { + return new GlobalizedMessage( + "publications.ui.publication.title", + SciPublicationsConstants.BUNDLE + ); + } + +} diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesPropertyStep.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesPropertyStep.java new file mode 100644 index 0000000..ccfa3a8 --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesPropertyStep.java @@ -0,0 +1,58 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.ui.authoring.AuthoringKitWizard; +import com.arsdigita.cms.ui.authoring.BasicItemForm; +import com.arsdigita.cms.ui.authoring.SimpleEditStep; +import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess; +import com.arsdigita.globalization.GlobalizedMessage; + +import org.scientificcms.publications.SciPublicationsConstants; + +/** + * + * @author Jens Pelzetter + */ +public class PublicationSeriesPropertyStep extends SimpleEditStep { + + private static final String ADD_SERIES_SHEET_NAME = "addSeries"; + + public PublicationSeriesPropertyStep( + final ItemSelectionModel itemModel, + final AuthoringKitWizard parent, + final StringParameter selectedLanguageParameter) { + this(itemModel, parent, selectedLanguageParameter, null); + } + + public PublicationSeriesPropertyStep( + final ItemSelectionModel itemModel, + final AuthoringKitWizard parent, + final StringParameter selectedLanguageParameter, + final String prefix + ) { + super(itemModel, parent, selectedLanguageParameter, prefix); + + final BasicItemForm addSeriesSheet = new PublicationSeriesAddForm( + itemModel, selectedLanguageParameter + ); + add(ADD_SERIES_SHEET_NAME, + new GlobalizedMessage( + "publications.ui.series.add_series", + SciPublicationsConstants.BUNDLE + ), + new WorkflowLockedComponentAccess(addSeriesSheet, itemModel), + addSeriesSheet.getSaveCancelSection().getCancelButton()); + + final PublicationSeriesTable seriesTable = new PublicationSeriesTable( + itemModel + ); + setDisplayComponent(seriesTable); + } + +} diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java new file mode 100644 index 0000000..e02f621 --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java @@ -0,0 +1,381 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arsdigita.cms.contenttypes.ui; + +import org.librecms.assets.Person; +import org.librecms.assets.PersonRepository; +import org.scientificcms.publications.Authorship; +import org.scientificcms.publications.Publication; +import org.scientificcms.publications.PublicationManager; +import org.scientificcms.publications.PublicationRepository; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +class SciPublicationsController implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final String NAME = "name"; + + public static final String TITLE = "title"; + + public static final String YEAR_OF_PUBLICATION = "yearOfPublication"; + + public static final String SHORT_DESCRIPTION = "shortDescription"; + + public static final String ABSTRACT = "abstract"; + + public static final String MISC = "misc"; + + public static final String YEAR_FIRST_PUBLISHED = "yearFirstPublished"; + + public static final String LANGUAGE_OF_PUBLICATION = "languageOfPublication"; + + public static final String LAUNCH_DATE = "launchDate"; + + public static final String AUTHORSHIP_ID = "authorshipId"; + + public static final String AUTHOR_NAME = "authorName"; + + public static final String AUTHORSHIP_IS_EDITOR = "isEditor"; + + public static final String AUTHORSHIP_ORDER = "order"; + + @Inject + private PersonRepository personRepository; + + @Inject + private PublicationManager publicationManager; + + @Inject + private PublicationRepository publicationRepository; + + @Transactional(Transactional.TxType.REQUIRED) + public void savePublication(final long publicationId, + final Locale selectedLocale, + final Map data) { + + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final Integer yearOfPublication = (Integer) data.get( + YEAR_OF_PUBLICATION + ); + final Integer yearFirstPublished = (Integer) data.get( + YEAR_FIRST_PUBLISHED + ); + final Locale languageOfPublication = (Locale) data.get( + LANGUAGE_OF_PUBLICATION + ); + final String publicationAbstract = (String) data.get(ABSTRACT); + final String shortDescription = (String) data.get(SHORT_DESCRIPTION); + final String misc = (String) data.get(MISC); + + publication.setYearOfPublication(yearOfPublication); + publication.setYearFirstPublished(yearFirstPublished); + publication.setLanguageOfPublication(languageOfPublication); + publication.getShortDescription().addValue(selectedLocale, + shortDescription); + publication.getPublicationAbstract().addValue(selectedLocale, + publicationAbstract); + publication.getMisc().addValue(selectedLocale, misc); + + publicationRepository.save(publication); + } + + @Transactional(Transactional.TxType.REQUIRED) + public List> getAuthors(final long publicationId) { + + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + return publication + .getAuthorships() + .stream() + .map(this::buildAuthorshipEntry) + .collect(Collectors.toList()); + } + + private Map buildAuthorshipEntry( + final Authorship authorship + ) { + Objects.requireNonNull(authorship); + + final Map result = new HashMap<>(); + result.put(AUTHORSHIP_ID, authorship.getAuthorshipId()); + result.put( + AUTHOR_NAME, + String.format( + "%s, %s", + authorship.getAuthor().getPersonName().getSurname(), + authorship.getAuthor().getPersonName().getGivenName() + ) + ); + result.put(AUTHORSHIP_IS_EDITOR, authorship.isEditor()); + result.put(AUTHORSHIP_ORDER, authorship.getAuthorOrder()); + + return result; + } + + @Transactional(Transactional.TxType.REQUIRED) + public Optional findAuthorship( + final long publicationId, final Object key + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final long authorshipId = (long) key; + + return publication + .getAuthorships() + .stream() + .filter(authorship -> authorship.getAuthorshipId() == authorshipId) + .findAny(); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void addAuthor( + final long publicationId, final long authorId, final boolean isEditor + ) { + + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final Person author = personRepository + .findById(authorId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format("No Person with ID %d found.", + authorId) + ) + ); + + publicationManager.addAuthor(author, publication, isEditor); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void updateAuthorship( + final long publicationId, final long authorId, final boolean isEditor + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final Person author = personRepository + .findById(authorId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format("No Person with ID %d found.", + authorId) + ) + ); + + final Optional authorship = publication + .getAuthorships() + .stream() + .filter(current -> filterAuthorship(current, publication, author)) + .findAny(); + + if (authorship.isPresent()) { + + authorship.get().setEditor(isEditor); + publicationRepository.save(publication); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + public void removeAuthor( + final long publicationId, final long authorshipId + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final Optional authorship = publication + .getAuthorships() + .stream() + .filter(current -> current.getAuthorshipId() == authorshipId) + .findAny(); + + if (authorship.isPresent()) { + publicationManager.removeAuthor( + authorship.get().getAuthor(), + publication + ); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + public boolean hasAuthor(final long publicationId, final long authorId) { + + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final Person author = personRepository + .findById(authorId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format("No Person with ID %d found.", + authorId) + ) + ); + + return publication + .getAuthorships() + .stream() + .anyMatch( + current -> filterAuthorship(current, publication, author) + ); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void swapWithPrevAuthorship( + final long publicationId, final long authorshipId + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final List authorships = publication.getAuthorships(); + Authorship authorship = null; + int index = -1; + for (int i = 0; i < authorships.size(); i++) { + + if (authorships.get(i).getAuthorshipId() == authorshipId) { + authorship = authorships.get(i); + index = i; + break; + } + } + + if (index > 0 && authorship != null) { + final long order = authorship.getAuthorOrder(); + final Authorship prevAuthorship = authorships.get(index - 1); + final long prevOrder = prevAuthorship.getAuthorOrder(); + + authorship.setAuthorOrder(prevOrder); + prevAuthorship.setAuthorOrder(order); + + publicationRepository.save(publication); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + public void swapWithNextAuthorship( + final long publicationId, final long authorshipId + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final List authorships = publication.getAuthorships(); + Authorship authorship = null; + int index = -1; + for (int i = 0; i < authorships.size(); i++) { + + if (authorships.get(i).getAuthorshipId() == authorshipId) { + authorship = authorships.get(i); + index = i; + break; + } + } + + if (index < authorships.size() && authorship != null) { + final long order = authorship.getAuthorOrder(); + final Authorship nextAuthorship = authorships.get(index + 1); + final long nextOrder = nextAuthorship.getAuthorOrder(); + + authorship.setAuthorOrder(nextOrder); + nextAuthorship.setAuthorOrder(order); + + publicationRepository.save(publication); + } + } + + private boolean filterAuthorship(final Authorship authorship, + final Publication publication, + final Person author) { + + return authorship.getPublication().equals(publication) + && authorship.getAuthor().equals(author); + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConfig.java b/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConfig.java new file mode 100644 index 0000000..bc46fc4 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConfig.java @@ -0,0 +1,92 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.scientificcms.publications; + +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.configuration.Configuration; +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.configuration.Setting; + +/** + * + * @author Jens Pelzetter + */ +@Configuration +public class SciPublicationsConfig { + + @Setting + private boolean firstPublishedPropertyEnabled = false; + + @Setting + private boolean languagePropertyEnabled = false; + + @Setting + private boolean abstractHtmlEnabled = true; + + @Setting + private boolean shortDescriptionHtmlEnabled = true; + + @Setting + private boolean miscHtmlEnabled = true; + + public SciPublicationsConfig() { + super(); + } + + public static SciPublicationsConfig getConfig() { + final ConfigurationManager confManager = CdiUtil + .createCdiUtil() + .findBean(ConfigurationManager.class); + return confManager.findConfiguration(SciPublicationsConfig.class); + } + + public boolean isFirstPublishedPropertyEnabled() { + return firstPublishedPropertyEnabled; + } + + public void setFirstPublishedPropertyEnabled( + final boolean firstPublishedPropertyEnabled + ) { + this.firstPublishedPropertyEnabled = firstPublishedPropertyEnabled; + } + + public boolean isLanguagePropertyEnabled() { + return languagePropertyEnabled; + } + + public void setLanguagePropertyEnabled( + final boolean languagePropertyEnabled + ) { + this.languagePropertyEnabled = languagePropertyEnabled; + } + + public boolean isAbstractHtmlEnabled() { + return abstractHtmlEnabled; + } + + public void setAbstractHtmlEnabled(final boolean abstractHtmlEnabled) { + this.abstractHtmlEnabled = abstractHtmlEnabled; + } + + public boolean isMiscHtmlEnabled() { + return miscHtmlEnabled; + } + + public void setMiscHtmlEnabled(final boolean miscHtmlEnabled) { + this.miscHtmlEnabled = miscHtmlEnabled; + } + + public boolean isShortDescriptionHtmlEnabled() { + return shortDescriptionHtmlEnabled; + } + + public void setShortDescriptionHtmlEnabled( + final boolean shortDescriptionHtmlEnabled + ) { + this.shortDescriptionHtmlEnabled = shortDescriptionHtmlEnabled; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConstants.java b/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConstants.java index e9a1f47..2f6d596 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConstants.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/SciPublicationsConstants.java @@ -10,7 +10,10 @@ package org.scientificcms.publications; * @author Jens Pelzetter */ public class SciPublicationsConstants { - + public static final String DB_SCHEMA = "SCI_PUBLICATIONS"; - + + public static final String BUNDLE + = "org.scientificcms.publications.PublicationResources"; + } diff --git a/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectController.java b/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectController.java index 41c7576..6cfcdf9 100644 --- a/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectController.java +++ b/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectController.java @@ -341,8 +341,8 @@ class SciProjectController { } private Map buildMembershipEntry( - final Membership membership) { - + final Membership membership + ) { Objects.requireNonNull(membership); final Map result = new HashMap<>(); @@ -401,8 +401,9 @@ class SciProjectController { .findById(memberId) .orElseThrow( () -> new IllegalArgumentException( - String.format("No Person with ID %d found.", - memberId) + String.format( + "No Person with ID %d found.", + memberId) ) ); @@ -435,8 +436,9 @@ class SciProjectController { ) ); - final MembershipStatus membershipStatus = MembershipStatus - .valueOf(status); + final MembershipStatus membershipStatus = MembershipStatus.valueOf( + status + ); final Optional membership = project .getMembers() @@ -469,15 +471,14 @@ class SciProjectController { .stream() .filter(current -> current.getMembershipId() == membershipId) .findAny(); - + if (membership.isPresent()) { projectMananger.removeMember(membership.get().getMember(), project); } } @Transactional(Transactional.TxType.REQUIRED) - public boolean hasMember(final long projectId, - final long memberId) { + public boolean hasMember(final long projectId, final long memberId) { final SciProject project = projectRepository .findById(projectId, SciProject.class) @@ -724,7 +725,7 @@ class SciProjectController { } } - if (index > 0 && sponsoring != null) { + if (index < sponsoringList.size() && sponsoring != null) { final long order = sponsoring.getOrder(); final Sponsoring nextSponsoring = sponsoringList.get(index + 1); final long nextOrder = nextSponsoring.getOrder(); @@ -776,8 +777,10 @@ class SciProjectController { .findById(projectId, SciProject.class) .orElseThrow( () -> new IllegalArgumentException( - String.format("No SciProject with ID %d found.", - projectId)) + String.format( + "No SciProject with ID %d found.", projectId + ) + ) ); final Date begin = (Date) data.get(SciProjectUiConstants.BEGIN); diff --git a/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectPropertyForm.java b/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectPropertyForm.java index 9e9adf9..5e64437 100644 --- a/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectPropertyForm.java +++ b/sci-types-project/src/main/java/com/arsdigita/cms/contenttypes/ui/SciProjectPropertyForm.java @@ -26,6 +26,7 @@ import org.libreccm.cdi.utils.CdiUtil; import org.scientificcms.contenttypes.sciproject.SciProject; import org.scientificcms.contenttypes.sciproject.SciProjectConstants; +import java.time.ZoneId; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -88,8 +89,27 @@ public class SciProjectPropertyForm final FormData data = event.getFormData(); final SciProject project = (SciProject) super.initBasicWidgets(event); - throw new UnsupportedOperationException("ToDo"); - + data.put( + SciProjectUiConstants.BEGIN, + java.util.Date.from( + project.getBegin().atStartOfDay().atZone( + ZoneId.systemDefault()).toInstant() + ) + ); + data.put( + SciProjectUiConstants.END, + java.util.Date.from( + project.getEnd().atStartOfDay().atZone( + ZoneId.systemDefault()).toInstant() + ) + ); + final Locale selectedLangauge = SelectedLanguageUtil.selectedLocale( + event.getPageState(), selectedLanguageParameter + ); + data.put( + SciProjectUiConstants.PROJECT_SHORT_DESCRIPTION, + project.getShortDescription().getValue(selectedLangauge) + ); } @Override