diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java b/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java index 8e65f8a..a54cc5f 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java @@ -1,8 +1,3 @@ -/* - * 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.hibernate.envers.Audited; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/assets/ProceedingsAsset.java b/sci-publications/src/main/java/org/scientificcms/publications/assets/ProceedingsAsset.java index 03aeb6b..722f938 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/assets/ProceedingsAsset.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/assets/ProceedingsAsset.java @@ -1,15 +1,13 @@ -/* - * 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.assets; import org.hibernate.envers.Audited; import org.librecms.assets.AssetType; import org.librecms.contentsection.Asset; +import org.librecms.ui.contentsections.assets.MvcAssetEditKit; import org.scientificcms.publications.Proceedings; import org.scientificcms.publications.SciPublicationsConstants; +import org.scientificcms.publications.ui.assets.ProceedingsAssetCreateStep; +import org.scientificcms.publications.ui.assets.ProceedingsAssetEditStep; import java.util.Objects; @@ -34,6 +32,10 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; descriptionBundle = SciPublicationsConstants.BUNDLE, descriptionKey = "proceedings.description" ) +@MvcAssetEditKit( + createStep = ProceedingsAssetCreateStep.class, + editStep = ProceedingsAssetEditStep.class +) public class ProceedingsAsset extends Asset { private static final long serialVersionUID = 1L; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/CollectedVolumeAssetEditStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/CollectedVolumeAssetEditStep.java index c7789fb..a50a0f6 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/CollectedVolumeAssetEditStep.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/CollectedVolumeAssetEditStep.java @@ -105,9 +105,6 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { @Inject private PublisherManager publisherManager; - @Inject - private PublisherRepository publisherRepo; - @Inject private CollectedVolumeAssetEditStepModel editStepModel; @@ -204,27 +201,6 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { } } - protected CollectedVolumeAsset getCollectedVolumeAsset() { - return (CollectedVolumeAsset) getAsset(); - } - - protected CollectedVolume getCollectedVolume() { - return getCollectedVolumeAsset().getCollectedVolume(); - } - - private CmsEditorLocaleVariantRow buildVariantRow( - final Map.Entry entry - ) { - final CmsEditorLocaleVariantRow variant - = new CmsEditorLocaleVariantRow(); - variant.setLocale(entry.getKey().toString()); - variant.setWordCount( - new StringTokenizer(entry.getValue()).countTokens() - ); - - return variant; - } - @GET @Path("/") @AuthorizationRequired @@ -553,6 +529,7 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { } else { authorResult = Optional.of(result.get(0)); } + break; } } @@ -565,8 +542,8 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { } final Person author = authorResult.get(); - final boolean editor = "true".equals(editorParam) - || "on".equals(editorParam); + final boolean editor = "true".equalsIgnoreCase(editorParam) + || "on".equalsIgnoreCase(editorParam); publicationManager.addAuthor(author, getCollectedVolume(), editor); return buildRedirectPathForStep(); @@ -618,8 +595,8 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { final Authorship authorship = authorshipResult.get(); authorship.setEditor( - "true".equals(editorParam) - || "on".equals(editorParam) + "true".equalsIgnoreCase(editorParam) + || "on".equalsIgnoreCase(editorParam) ); publicationRepo.save(collectedVolume); @@ -793,6 +770,14 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { } } + protected CollectedVolumeAsset getCollectedVolumeAsset() { + return (CollectedVolumeAsset) getAsset(); + } + + protected CollectedVolume getCollectedVolume() { + return getCollectedVolumeAsset().getCollectedVolume(); + } + private String showAuthorNotFound( final String sectionIdentifier, final String assetPath, @@ -820,6 +805,19 @@ public class CollectedVolumeAssetEditStep extends AbstractMvcAssetEditStep { return showStep(sectionIdentifier, assetPath); } + private CmsEditorLocaleVariantRow buildVariantRow( + final Map.Entry entry + ) { + final CmsEditorLocaleVariantRow variant + = new CmsEditorLocaleVariantRow(); + variant.setLocale(entry.getKey().toString()); + variant.setWordCount( + new StringTokenizer(entry.getValue()).countTokens() + ); + + return variant; + } + private AuthorsTableRow buildAuthorsTableRow(final Authorship authorship) { final AuthorsTableRow row = new AuthorsTableRow(); row.setAuthorName( diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetAuthors.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetAuthors.java new file mode 100644 index 0000000..13f2ee8 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetAuthors.java @@ -0,0 +1,108 @@ +package org.scientificcms.publications.ui.assets; + +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetRepository; +import org.librecms.contentsection.ContentSection; +import org.librecms.ui.contentsections.ContentSectionsUi; +import org.librecms.ui.contentsections.assets.MvcAssetEditSteps; +import org.scientificcms.publications.Authorship; +import org.scientificcms.publications.Proceedings; +import org.scientificcms.publications.PublicationRepository; +import org.scientificcms.publications.assets.ProceedingsAsset; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.Consumes; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAssetEditSteps.PATH_PREFIX + "proceedings-edit-authors") +public class ProceedingsAssetAuthors { + + @Inject + private AssetRepository assetRepo; + + @Inject + private ContentSectionsUi sectionsUi; + + @Inject + private PublicationRepository publicationRepo; + + @POST + @Path("/save-order") + @Consumes(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public Response saveOrder( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + final List order + ) { + final ContentSection section = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException( + String.format( + "ContentSection %s not found.", + sectionIdentifier + ) + ) + ); + + final Asset asset = assetRepo + .findByPath(section, assetPath) + .orElseThrow( + () -> new NotFoundException( + String.format( + "Asset %s not found.", + assetPath + ) + ) + ); + + if (!(asset instanceof ProceedingsAsset)) { + throw new NotFoundException( + String.format( + "No ProceedingsAsset for path %s in section %s.", + assetPath, + section.getLabel() + ) + ); + } + + final Map orderMap = new HashMap<>(); + for (int i = 0; i < order.size(); i++) { + orderMap.put(Long.parseLong(order.get(i)), (long) i); + } + + final ProceedingsAsset proceedingsAsset = (ProceedingsAsset) asset; + final Proceedings proceedings = proceedingsAsset.getProceedings(); + for(final Authorship authorship : proceedings.getAuthorships()) { + authorship.setAuthorOrder( + orderMap.get( + authorship.getAuthorshipId() + ) + ); + } + + publicationRepo.save(proceedings); + + return Response.ok().build(); + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetCreateStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetCreateStep.java new file mode 100644 index 0000000..d818f11 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetCreateStep.java @@ -0,0 +1,131 @@ +package org.scientificcms.publications.ui.assets; + +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.ui.contentsections.assets.AbstractMvcAssetCreateStep; +import org.scientificcms.publications.Proceedings; +import org.scientificcms.publications.PublicationRepository; +import org.scientificcms.publications.assets.ProceedingsAsset; +import org.scientificcms.publications.ui.SciPublicationsUiConstants; + +import java.util.Locale; +import java.util.Map; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciCmsProceedingsAssetCreateStep") +public class ProceedingsAssetCreateStep + extends AbstractMvcAssetCreateStep { + + private static final String FORM_PARAMS_YEAR_OF_PUBLICATION + = "yearOfPublication"; + + private static final String FORM_PARAMS_SHORT_DESCRIPTION + = "shortDescription"; + + private int yearOfPublication; + + private String shortDescription; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private PublicationRepository publicationRepo; + + @Override + public String showCreateStep() { + return "org/scientificcms/assets/proceedings/ui/create-proceedings.xhtml"; + } + + @Override + public String getLabel() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("proceedings.label"); + } + + @Override + public String getDescription() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("proceedings.description"); + } + + @Override + public String getBundle() { + return SciPublicationsUiConstants.BUNDLE; + } + + @Override + public Class getAssetClass() { + return ProceedingsAsset.class; + } + + public int getYearOfPublication() { + return yearOfPublication; + } + + public String getShortDescription() { + return shortDescription; + } + + @Override + @Transactional(Transactional.TxType.REQUIRED) + protected String setAssetProperties( + final ProceedingsAsset proceedingsAsset, + final Map formParams + ) { + final Proceedings proceedings = new Proceedings(); + final Locale locale = new Locale(getInitialLocale()); + proceedings.getTitle().putValue( + locale, + proceedingsAsset.getTitle().getValue(locale) + ); + + shortDescription = Optional + .ofNullable(formParams.get(FORM_PARAMS_SHORT_DESCRIPTION)) + .filter(value -> value.length > 0) + .map(value -> value[0]) + .filter(value -> !value.isBlank()) + .orElse(null); + + if (shortDescription != null) { + proceedings.getShortDescription().putValue( + locale, + shortDescription + ); + } + + final String yearOfPublicationParam = Optional + .ofNullable(formParams.get(FORM_PARAMS_YEAR_OF_PUBLICATION)) + .filter(value -> value.length > 0) + .map(value -> value[0]) + .filter(value -> value.matches("\\d*")) + .orElse(null); + if (yearOfPublicationParam != null) { + proceedings.setYearOfPublication( + Integer.parseInt(yearOfPublicationParam) + ); + } + + publicationRepo.save(proceedings); + + proceedingsAsset.setProceedings(proceedings); + + return String.format( + "redirect:/%s/assets/%s/%s/@proceedings-edit", + getContentSectionLabel(), + getFolderPath(), + getName() + ); + } +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetEditStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetEditStep.java new file mode 100644 index 0000000..50c50ae --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetEditStep.java @@ -0,0 +1,1017 @@ +package org.scientificcms.publications.ui.assets; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.ui.BaseUrl; +import org.librecms.assets.Organization; +import org.librecms.assets.Person; +import org.librecms.assets.PersonRepository; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetRepository; +import org.librecms.ui.contentsections.AssetPermissionsChecker; +import org.librecms.ui.contentsections.ContentSectionNotFoundException; +import org.librecms.ui.contentsections.assets.AbstractMvcAssetEditStep; +import org.librecms.ui.contentsections.assets.AssetNotFoundException; +import org.librecms.ui.contentsections.assets.AssetStepsDefaultMessagesBundle; +import org.librecms.ui.contentsections.assets.AssetUi; +import org.librecms.ui.contentsections.assets.MvcAssetEditStep; +import org.librecms.ui.contentsections.assets.MvcAssetEditStepDef; +import org.librecms.ui.contentsections.assets.MvcAssetEditSteps; +import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow; +import org.scientificcms.publications.Authorship; +import org.scientificcms.publications.Proceedings; +import org.scientificcms.publications.PublicationManager; +import org.scientificcms.publications.PublicationRepository; +import org.scientificcms.publications.Publisher; +import org.scientificcms.publications.PublisherManager; +import org.scientificcms.publications.assets.ProceedingsAsset; +import org.scientificcms.publications.assets.PublisherAsset; +import org.scientificcms.publications.ui.SciPublicationsUiConstants; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.servlet.http.HttpServletRequest; +import javax.transaction.Transactional; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAssetEditSteps.PATH_PREFIX + "proceedings-edit") +@Controller +@MvcAssetEditStepDef( + bundle = SciPublicationsUiConstants.BUNDLE, + descriptionKey = "proceedings.editstep.description", + labelKey = "proceedings.editstep.label", + supportedAssetType = ProceedingsAsset.class +) +public class ProceedingsAssetEditStep extends AbstractMvcAssetEditStep { + + @Inject + private AssetPermissionsChecker assetPermissionsChecker; + + @Inject + private AssetStepsDefaultMessagesBundle messageBundle; + + @Inject + private AssetRepository assetRepo; + + @Inject + private AssetUi assetUi; + + @Inject + private BaseUrl baseUrl; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private HttpServletRequest request; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private PersonRepository personRepo; + + @Inject + private PublicationManager publicationManager; + + @Inject + private PublicationRepository publicationRepo; + + @Inject + private PublisherManager publisherManager; + + @Inject + private ProceedingsAssetEditStepModel editStepModel; + + @Override + public Class getStepClass() { + return ProceedingsAssetEditStep.class; + } + + @Override + @Transactional(Transactional.TxType.REQUIRED) + protected void init() throws ContentSectionNotFoundException, + AssetNotFoundException { + super.init(); + + if (getAsset() instanceof ProceedingsAsset) { + final Proceedings proceedings = getProceedings(); + + editStepModel.setBaseUrl(baseUrl.getBaseUrl(request)); + + editStepModel.setNumberOfVolumes(proceedings.getNumberOfVolumes()); + if (proceedings.getPublisher() != null) { + editStepModel.setPublisherName( + proceedings.getPublisher().getName() + ); + editStepModel.setPublisherPlace( + proceedings.getPublisher().getPlace() + ); + editStepModel.setPublisherUuid( + proceedings.getPublisher().getUuid() + ); + } + + editStepModel.setAuthors( + proceedings + .getAuthorships() + .stream() + .map(this::buildAuthorsTableRow) + .collect(Collectors.toList()) + ); + + editStepModel.setShortDescriptionValues( + proceedings + .getShortDescription() + .getValues() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toString(), + entry -> entry.getValue() + ) + ) + ); + + final Set shortDescriptionLocales = proceedings + .getShortDescription() + .getAvailableLocales(); + editStepModel.setUnusedShortDescriptionLocales( + globalizationHelper + .getAvailableLocales() + .stream() + .filter(locale -> !shortDescriptionLocales.contains(locale)) + .map(Locale::toString) + .collect(Collectors.toList()) + ); + + editStepModel.setShortDescriptionVariants( + proceedings + .getShortDescription() + .getValues() + .entrySet() + .stream() + .map(this::buildVariantRow) + .collect(Collectors.toList()) + ); + + editStepModel.setVolume(proceedings.getVolume()); + editStepModel.setYearOfPublication( + proceedings.getYearOfPublication() + ); + + editStepModel.setNameOfConference( + proceedings.getNameOfConference() + ); + editStepModel.setPlaceOfConference( + proceedings.getPlaceOfConference() + ); + if (proceedings.getStartDate() != null) { + editStepModel.setStartDate( + DateTimeFormatter.ISO_DATE.format( + proceedings.getStartDate() + ) + ); + } + if (proceedings.getEndDate() != null) { + editStepModel.setEndDate( + DateTimeFormatter.ISO_DATE.format( + proceedings.getEndDate() + ) + ); + } + + if (proceedings.getOrganizer() != null) { + editStepModel.setOrganizerName( + proceedings.getOrganizer().getName() + ); + editStepModel.setOrganzierUuid( + proceedings.getOrganizer().getUuid() + ); + } + } else { + throw new AssetNotFoundException( + assetUi.showAssetNotFound( + getContentSection(), getAssetPath() + ), + String.format( + "No ProceedingsAsset for path %s found in section %s.", + getAssetPath(), + getContentSection().getLabel() + ) + ); + } + } + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String showStep( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + return "org/scientificcms/assets/proceedings/ui/edit-proceedings.xhtml"; + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/properties") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String updateProperties( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @FormParam("yearOfPublication") + final String yearOfPublicationParam, + @FormParam("volume") + final String volumeParam, + @FormParam("numberOfVolumes") + final String numberOfVolumesParam, + @FormParam("nameOfConference") + final String nameOfConference, + @FormParam("placeOfConference") + final String placeOfConference, + @FormParam("startDate") + final String startDateParam, + @FormParam("endDate") + final String endDateParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Proceedings proceedings = getProceedings(); + + proceedings.setYearOfPublication( + Optional + .ofNullable(yearOfPublicationParam) + .filter(param -> !param.isBlank()) + .map(Integer::parseInt) + .orElse(null) + ); + + proceedings.setVolume( + Optional + .ofNullable(volumeParam) + .filter(param -> !param.isBlank()) + .map(Integer::parseInt) + .orElse(null) + ); + + proceedings.setNumberOfVolumes( + Optional + .ofNullable(numberOfVolumesParam) + .filter(param -> !param.isBlank()) + .map(Integer::parseInt) + .orElse(null) + ); + + proceedings.setNameOfConference( + Optional + .ofNullable(nameOfConference) + .filter(param -> !param.isBlank()) + .orElse(null) + ); + + proceedings.setPlaceOfConference( + Optional + .ofNullable(placeOfConference) + .filter(param -> !param.isBlank()) + .orElse(null) + ); + + proceedings.setStartDate( + Optional + .ofNullable(startDateParam) + .filter(param -> !param.isBlank()) + .map( + param -> LocalDate.parse( + param, + DateTimeFormatter.ISO_DATE + ) + ) + .orElse(null) + ); + + proceedings.setEndDate( + Optional + .ofNullable(endDateParam) + .filter(param -> !param.isBlank()) + .map( + param -> LocalDate.parse( + param, + DateTimeFormatter.ISO_DATE + ) + ) + .orElse(null) + ); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/title/@add") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String addTitle( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @FormParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + final String redirect = super.addTitle( + sectionIdentifier, + assetPath, + localeParam, + value + ); + + final Proceedings proceedings = getProceedings(); + proceedings.getTitle().putValue(new Locale(localeParam), value); + publicationRepo.save(proceedings); + + return redirect; + } + + @POST + @Path("/title/@edit/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String editTitle( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + final String redirect = super.editTitle( + sectionIdentifier, + assetPath, + localeParam, + value + ); + + final Proceedings proceedings = getProceedings(); + proceedings.getTitle().putValue(new Locale(localeParam), value); + publicationRepo.save(proceedings); + + return redirect; + } + + @POST + @Path("/title/@remove/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String removeTitle( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @PathParam("locale") final String localeParam + ) { + final String redirect = super.removeTitle( + sectionIdentifier, + assetPath, + localeParam + ); + + final Proceedings proceedings = getProceedings(); + proceedings.getTitle().removeValue(new Locale(localeParam)); + publicationRepo.save(proceedings); + + return redirect; + } + + @POST + @Path("/shortdescription/add") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String addShortDescription( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @FormParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + getProceedings().getShortDescription().putValue( + new Locale(localeParam), + value + ); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/shortdescription/edit/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String editShortDescription( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + getProceedings().getShortDescription().putValue( + new Locale(localeParam), + value + ); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/shortdescription/remove/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeShortDescription( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + getProceedings().getShortDescription().removeValue( + new Locale(localeParam) + ); + publicationRepo.save(getProceedings()); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/authors") + @AuthorizationRequired + @Transactional + public String addAuthor( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @FormParam("authorIdentifier") + final String authorIdentifier, + @FormParam("editor") + final String editorParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Identifier identifier = identifierParser.parseIdentifier( + authorIdentifier + ); + final Optional authorResult; + switch (identifier.getType()) { + case ID: + authorResult = personRepo.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + authorResult = assetRepo.findByUuidAndType( + identifier.getIdentifier(), + Person.class + ); + break; + default: { + final List result = personRepo.findBySurname( + identifier.getIdentifier() + ); + if (result.isEmpty()) { + authorResult = Optional.empty(); + } else { + authorResult = Optional.of(result.get(0)); + } + break; + } + } + + if (!authorResult.isPresent()) { + return showAuthorNotFound( + sectionIdentifier, + assetPath, + authorIdentifier + ); + } + + final Person author = authorResult.get(); + final boolean editor = "true".equalsIgnoreCase(editorParam) + || "on".equalsIgnoreCase(editorParam); + publicationManager.addAuthor(author, getProceedings(), editor); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/authors/{authorshipUuid}") + @AuthorizationRequired + @Transactional + public String editAuthorship( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @PathParam("authorshipUuid") + final String authorshipUuid, + @FormParam("editor") + final String editorParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Proceedings proceedings = getProceedings(); + final Optional authorshipResult = proceedings + .getAuthorships() + .stream() + .filter(current -> current.getUuid().equals(authorshipUuid)) + .findAny(); + + if (authorshipResult.isEmpty()) { + return showAuthorshipNotFound( + sectionIdentifier, + assetPath, + authorshipUuid + ); + } + + final Authorship authorship = authorshipResult.get(); + authorship.setEditor( + "true".equalsIgnoreCase(editorParam) + || "on".equalsIgnoreCase(editorParam) + ); + + publicationRepo.save(proceedings); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/authors/{authorshipUuid}/remove") + @AuthorizationRequired + @Transactional + public String removeAuthorship( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @PathParam("authorshipUuid") + final String authorshipUuid + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Proceedings proceedings = getProceedings(); + + final Optional authorshipResult = proceedings + .getAuthorships() + .stream() + .filter(current -> current.getUuid().equals(authorshipUuid)) + .findAny(); + + if (authorshipResult.isEmpty()) { + return showAuthorshipNotFound( + sectionIdentifier, + assetPath, + authorshipUuid + ); + } + + final Authorship authorship = authorshipResult.get(); + publicationManager.removeAuthor( + authorship.getAuthor(), + proceedings + ); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/publisher") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String setPublisher( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @FormParam("publisherIdentifier") + final String publisherIdentifier + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Identifier identifier = identifierParser.parseIdentifier( + publisherIdentifier + ); + final Optional assetResult; + switch (identifier.getType()) { + case ID: + assetResult = assetRepo.findById( + Long.parseLong(identifier.getIdentifier()), + PublisherAsset.class + ); + break; + case UUID: + assetResult = assetRepo.findByUuidAndType( + identifier.getIdentifier(), + PublisherAsset.class + ); + break; + default: { + final Optional result = assetRepo.findByPath( + identifier.getIdentifier() + ); + if (result == null || result.isEmpty()) { + assetResult = Optional.empty(); + } else if (!(result.get() instanceof PublisherAsset)) { + assetResult = Optional.empty(); + } else { + assetResult = Optional.of((PublisherAsset) result.get()); + } + break; + } + } + if (!assetResult.isPresent()) { + return showPublisherNotFound( + sectionIdentifier, + assetPath, + publisherIdentifier + ); + } + + final Publisher publisher = assetResult.get().getPublisher(); + + publisherManager.addPublicationToPublisher( + getProceedings(), + publisher + ); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/publisher/@remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removePublisher() { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Proceedings proceedings = getProceedings(); + final Publisher publisher = proceedings.getPublisher(); + if (publisher != null) { + publisherManager.removePublicationFromPublisher( + proceedings, + publisher + ); + } + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/organizer") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String setOrganizer( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath, + @FormParam("organizerIdentifier") + final String organizerIdentifier + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Identifier identifier = identifierParser.parseIdentifier( + organizerIdentifier + ); + final Optional organizerResult; + switch (identifier.getType()) { + case ID: + organizerResult = assetRepo.findById( + Long.parseLong(identifier.getIdentifier()), + Organization.class + ); + break; + case UUID: + organizerResult = assetRepo.findByUuidAndType( + identifier.getIdentifier(), + Organization.class + ); + break; + default: { + final Optional result = assetRepo.findByPath( + identifier.getIdentifier() + ); + if (result == null || result.isEmpty()) { + organizerResult = Optional.empty(); + } else if (!(result.get() instanceof Organization)) { + organizerResult = Optional.empty(); + } else { + organizerResult = Optional.of( + (Organization) result.get() + ); + } + break; + } + } + + if (organizerResult.isEmpty()) { + return showOrganizerNotFound( + sectionIdentifier, + assetPath, + organizerIdentifier + ); + } + + getProceedings().setOrganizer(organizerResult.get()); + publicationRepo.save(getProceedings()); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + @POST + @Path("/organizer/@remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeOrganizer() { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + final Proceedings proceedings = getProceedings(); + proceedings.setOrganizer(null); + publicationRepo.save(proceedings); + + return buildRedirectPathForStep(); + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + protected ProceedingsAsset getProceedingsAsset() { + return (ProceedingsAsset) getAsset(); + } + + protected Proceedings getProceedings() { + return getProceedingsAsset().getProceedings(); + } + + private String showAuthorNotFound( + final String sectionIdentifier, + final String assetPath, + final String authorIdentifier + ) { + models.put("authorNotFound", authorIdentifier); + return showStep(sectionIdentifier, assetPath); + } + + private String showAuthorshipNotFound( + final String sectionIdentifier, + final String assetPath, + final String authorshipIdentifier + ) { + models.put("authorshipNotFound", authorshipIdentifier); + return showStep(sectionIdentifier, assetPath); + } + + private String showPublisherNotFound( + final String sectionIdentifier, + final String assetPath, + final String publisherIdentifier + ) { + models.put("publisherNotFound", publisherIdentifier); + return showStep(sectionIdentifier, assetPath); + } + + private String showOrganizerNotFound( + final String sectionIdentifier, + final String assetPath, + final String organizerIdentifier + ) { + models.put("organizierNotFound", organizerIdentifier); + return showStep(sectionIdentifier, assetPath); + } + + private CmsEditorLocaleVariantRow buildVariantRow( + final Map.Entry entry + ) { + final CmsEditorLocaleVariantRow variant + = new CmsEditorLocaleVariantRow(); + variant.setLocale(entry.getKey().toString()); + variant.setWordCount( + new StringTokenizer(entry.getValue()).countTokens() + ); + + return variant; + } + + private AuthorsTableRow buildAuthorsTableRow(final Authorship authorship) { + final AuthorsTableRow row = new AuthorsTableRow(); + row.setAuthorName( + String.join( + ", ", + authorship.getAuthor().getPersonName().getSurname(), + authorship.getAuthor().getPersonName().getGivenName() + ) + ); + row.setAuthorshipId(authorship.getAuthorshipId()); + row.setAuthorshipUuid(authorship.getUuid()); + row.setEditor(authorship.isEditor()); + + return row; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetEditStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetEditStepModel.java new file mode 100644 index 0000000..db7f022 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/ProceedingsAssetEditStepModel.java @@ -0,0 +1,217 @@ +package org.scientificcms.publications.ui.assets; + +import org.librecms.assets.Organization; +import org.librecms.assets.Person; +import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow; +import org.scientificcms.publications.assets.PublisherAsset; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciCmsProceedingsAssetEditStepModel") +public class ProceedingsAssetEditStepModel { + + private String baseUrl; + + private List authors; + + private int yearOfPublication; + + private String publisherUuid; + + private String publisherName; + + private String publisherPlace; + + private Map shortDescriptionValues; + + private List shortDescriptionVariants; + + private List unusedShortDescriptionLocales; + + private Integer volume; + + private Integer numberOfVolumes; + + private String nameOfConference; + + private String placeOfConference; + + private String startDate; + + private String endDate; + + private String organzierUuid; + + private String organizerName; + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + + public List getAuthors() { + return Collections.unmodifiableList(authors); + } + + public void setAuthors(final List authors) { + this.authors = authors; + } + + public int getYearOfPublication() { + return yearOfPublication; + } + + public void setYearOfPublication(final int yearOfPublication) { + this.yearOfPublication = yearOfPublication; + } + + public String getPublisherUuid() { + return publisherUuid; + } + + public void setPublisherUuid(final String publisherUuid) { + this.publisherUuid = publisherUuid; + } + + public String getPublisherName() { + return publisherName; + } + + public void setPublisherName(final String publisherName) { + this.publisherName = publisherName; + } + + public String getPublisherPlace() { + return publisherPlace; + } + + public void setPublisherPlace(final String publisherPlace) { + this.publisherPlace = publisherPlace; + } + + public Map getShortDescriptionValues() { + return Collections.unmodifiableMap(shortDescriptionValues); + } + + public void setShortDescriptionValues( + final Map shortDescriptionValues + ) { + this.shortDescriptionValues = new HashMap<>(shortDescriptionValues); + } + + public List getShortDescriptionVariants() { + return Collections.unmodifiableList(shortDescriptionVariants); + } + + public void setShortDescriptionVariants( + final List shortDescriptionVariants + ) { + this.shortDescriptionVariants = new ArrayList<>( + shortDescriptionVariants + ); + } + + public List getUnusedShortDescriptionLocales() { + return Collections.unmodifiableList(unusedShortDescriptionLocales); + } + + public void setUnusedShortDescriptionLocales( + final List unusedShortDescriptionLocales + ) { + this.unusedShortDescriptionLocales = new ArrayList<>( + unusedShortDescriptionLocales + ); + } + + public Integer getVolume() { + return volume; + } + + public void setVolume(final Integer volume) { + this.volume = volume; + } + + public Integer getNumberOfVolumes() { + return numberOfVolumes; + } + + public void setNumberOfVolumes(final Integer numberOfVolumes) { + this.numberOfVolumes = numberOfVolumes; + } + + public String getAuthorType() { + return Person.class.getName(); + } + + public String getOrganizerType() { + return Organization.class.getName(); + } + + public String getPublisherType() { + return PublisherAsset.class.getName(); + } + + public String getNameOfConference() { + return nameOfConference; + } + + public void setNameOfConference(final String nameOfConference) { + this.nameOfConference = nameOfConference; + } + + public String getPlaceOfConference() { + return placeOfConference; + } + + public void setPlaceOfConference(final String placeOfConference) { + this.placeOfConference = placeOfConference; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(final String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(final String endDate) { + this.endDate = endDate; + } + + public String getOrganzierUuid() { + return organzierUuid; + } + + public void setOrganzierUuid(final String organzierUuid) { + this.organzierUuid = organzierUuid; + } + + public String getOrganizerName() { + return organizerName; + } + + public void setOrganizerName(final String organizerName) { + this.organizerName = organizerName; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/SciPublicationsAssetSteps.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/SciPublicationsAssetSteps.java index 8597e61..52695a3 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/SciPublicationsAssetSteps.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/assets/SciPublicationsAssetSteps.java @@ -18,6 +18,7 @@ public class SciPublicationsAssetSteps implements MvcAssetEditSteps { return Set.of( CollectedVolumeAssetEditStep.class, JournalAssetEditStep.class, + ProceedingsAssetEditStep.class, PublisherAssetEditStep.class, SeriesAssetEditStep.class ); @@ -26,7 +27,8 @@ public class SciPublicationsAssetSteps implements MvcAssetEditSteps { @Override public Set> getResourceClasses() { return Set.of( - CollectedVolumeAssetAuthors.class + CollectedVolumeAssetAuthors.class, + ProceedingsAssetAuthors.class ); } } diff --git a/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/assets/proceedings/ui/create-proceedings.xhtml b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/assets/proceedings/ui/create-proceedings.xhtml new file mode 100644 index 0000000..9f3c52e --- /dev/null +++ b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/assets/proceedings/ui/create-proceedings.xhtml @@ -0,0 +1,79 @@ +]> + + + + +
+

#{SciPublicationsUiMessageBundle['proceedings.createform.title']}

+ + + + +
+ + + + + + + + + + + + #{CmsAssetsStepsDefaultMessagesBundle['createform.cancel']} + + + +
+
+ +
+ diff --git a/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/assets/proceedings/ui/edit-proceedings.xhtml b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/assets/proceedings/ui/edit-proceedings.xhtml new file mode 100644 index 0000000..5cfbe41 --- /dev/null +++ b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/assets/proceedings/ui/edit-proceedings.xhtml @@ -0,0 +1,433 @@ +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

#{SciPublicationsUiMessageBundle['proceedings.editstep.authors']}

+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
#{SciPublicationsUiMessageBundle['proceedings.editstep.authors.table.name']} + #{SciPublicationsUiMessageBundle['proceedings.editstep.authors.table.editor']} + + #{SciPublicationsUiMessageBundle['proceedings.editstep.authors.table.actions']} +
+ + #{author.authorName} + + + + #{SciPublicationsUiMessageBundle['proceedings.editstep.authors.table.editor.yes']} + + + #{SciPublicationsUiMessageBundle['proceedings.editstep.authors.table.editor.no']} + + + + + + + +
+ +

#{SciPublicationsUiMessageBundle['proceedings.editstep.publisher']}

+ +
+
+ +
+
+ +

+ + + #{SciCmsProceedingsAssetEditStepModel.publisherName}, #{SciCmsProceedingsAssetEditStepModel.publisherPlace} + + + #{SciCmsProceedingsAssetEditStepModel.publisherName} + + + + + +

+ +

#{SciPublicationsUiMessageBundle['proceedings.editstep.properties']}

+ +
+ +
+ +
+
+
#{SciPublicationsUiMessageBundle['proceedings.editstep.properties.yearofpublication.label']}
+
#{SciCmsProceedingsAssetEditStepModel.yearOfPublication}
+
+
+
#{SciPublicationsUiMessageBundle['proceedings.editstep.properties.volume.label']}
+
#{SciCmsProceedingsAssetEditStepModel.volume}
+
+
+
#{SciPublicationsUiMessageBundle['proceedings.editstep.properties.numberofvolumes.label']}
+
#{SciCmsProceedingsAssetEditStepModel.numberOfVolumes}
+
+
+
#{SciPublicationsUiMessageBundle['proceedings.editstep.properties.nameofconference.label']}
+
#{SciCmsProceedingsAssetEditStepModel.nameOfConference}
+
+
+
#{SciPublicationsUiMessageBundle['proceedings.editstep.properties.placeofconference.label']}
+
#{SciCmsProceedingsAssetEditStepModel.placeOfConference}
+
+
+ +

#{SciPublicationsUiMessageBundle['proceedings.editstep.organizer']}

+
+
+ +
+
+ +

+ #{SciCmsProceedingsAssetEditStepModel.organizerName} +

+ + + + + + +
+ +
+ + +