Second part of MVC based UI for SciProject
parent
8dad903963
commit
ffcdb70f98
|
|
@ -7,3 +7,4 @@ node_modules
|
||||||
/sci-publications/nbproject/
|
/sci-publications/nbproject/
|
||||||
/sci-publications/target/
|
/sci-publications/target/
|
||||||
/scicms-bundle-devel-wildfly/target/
|
/scicms-bundle-devel-wildfly/target/
|
||||||
|
/sci-types-project/nbproject/
|
||||||
|
|
|
||||||
|
|
@ -1,188 +0,0 @@
|
||||||
* Copyright (C) 2022 LibreCCM Foundation.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
* MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
package org.scientificcms.contenttypes.sciproject.ui;
|
|
||||||
|
|
||||||
import org.libreccm.l10n.GlobalizationHelper;
|
|
||||||
import org.libreccm.l10n.LocalizedString;
|
|
||||||
import org.libreccm.security.AuthorizationRequired;
|
|
||||||
import org.libreccm.workflow.Workflow;
|
|
||||||
import org.librecms.contentsection.ContentItemManager;
|
|
||||||
import org.librecms.contentsection.ContentItemRepository;
|
|
||||||
import org.librecms.ui.contentsections.documents.AbstractMvcDocumentCreateStep;
|
|
||||||
|
|
||||||
import org.scientificcms.contenttypes.sciproject.SciProject;
|
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Named;
|
|
||||||
import javax.transaction.Transactional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create step for a {@link SciProject}
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
@RequestScoped
|
|
||||||
@Named("SciProjectCreateStep")
|
|
||||||
public class ProjectCreateStep
|
|
||||||
extends AbstractMvcDocumentCreateStep<SciProject> {
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_NAME = "name";
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_TITLE = "title";
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_STARTDATE = "startDate";
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_ENDDATE = "startDate";
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_SUMMARY = "summary";
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_INITIAL_LOCALE = "locale";
|
|
||||||
|
|
||||||
private static final String FORM_PARAM_SELECTED_WORKFLOW = "workflow";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides functions for working with content items.
|
|
||||||
*/
|
|
||||||
@Inject
|
|
||||||
private ContentItemManager itemManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to save the event.
|
|
||||||
*/
|
|
||||||
@Inject
|
|
||||||
private ContentItemRepository itemRepo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides functions for working with {@link LocalizedString}s.
|
|
||||||
*/
|
|
||||||
@Inject
|
|
||||||
private GlobalizationHelper globalizationHelper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Name of the project.
|
|
||||||
*/
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Title of the project.
|
|
||||||
*/
|
|
||||||
private String title;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The start date of the project.
|
|
||||||
*/
|
|
||||||
private String startDate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The end date of the project
|
|
||||||
*/
|
|
||||||
private String endDate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The short description of the project.
|
|
||||||
*/
|
|
||||||
private String shortDescription;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The initial locale of the project.
|
|
||||||
*/
|
|
||||||
private String initialLocale;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The workflow to use for the new project.
|
|
||||||
*/
|
|
||||||
private String selectedWorkflow;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDocumentType() {
|
|
||||||
return SciProject.class.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription() {
|
|
||||||
return globalizationHelper
|
|
||||||
.getLocalizedTextsUtil(getBundle())
|
|
||||||
.getText("createstep.description");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getBundle() {
|
|
||||||
return SciProjectStepsConstants.BUNDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return getTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStartDate() {
|
|
||||||
return startDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getEndDate() {
|
|
||||||
return endDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getShortDescription() {
|
|
||||||
return shortDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getInitialLocale() {
|
|
||||||
return initialLocale;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
|
||||||
public String getSelectedWorkflow() {
|
|
||||||
if (selectedWorkflow == null || selectedWorkflow.isEmpty()) {
|
|
||||||
return getContentSection()
|
|
||||||
.getContentTypes()
|
|
||||||
.stream()
|
|
||||||
.filter(
|
|
||||||
type -> type.getContentItemClass().equals(
|
|
||||||
Event.class.getName()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.findAny()
|
|
||||||
.map(type -> type.getDefaultWorkflow())
|
|
||||||
.map(
|
|
||||||
workflow -> globalizationHelper.getValueFromLocalizedString(
|
|
||||||
workflow.getName()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.orElse("");
|
|
||||||
} else {
|
|
||||||
return selectedWorkflow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String showCreateStep() {
|
|
||||||
return "org/scientificcms/contenttypes/sciproject/ui/create-sciproject.xhtml";
|
|
||||||
}
|
|
||||||
|
|
||||||
@AuthorizationRequired
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
|
||||||
@Override
|
|
||||||
public String createItem(final Map<String, String[]> formParams) {
|
|
||||||
// ToDo
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,377 @@
|
||||||
|
/* Copyright (C) 2022 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
|
import org.libreccm.l10n.LocalizedString;
|
||||||
|
import org.libreccm.security.AuthorizationRequired;
|
||||||
|
import org.libreccm.workflow.Workflow;
|
||||||
|
import org.librecms.contentsection.ContentItemManager;
|
||||||
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.ui.contentsections.documents.AbstractMvcDocumentCreateStep;
|
||||||
|
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProject;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.time.format.DateTimeParseException;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create step for a {@link SciProject}
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Named("SciProjectCreateStep")
|
||||||
|
public class SciProjectCreateStep
|
||||||
|
extends AbstractMvcDocumentCreateStep<SciProject> {
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_NAME = "name";
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_TITLE = "title";
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_BEGIN = "begin";
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_END = "end";
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_SUMMARY = "summary";
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_INITIAL_LOCALE = "locale";
|
||||||
|
|
||||||
|
private static final String FORM_PARAM_SELECTED_WORKFLOW = "workflow";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions for working with content items.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private ContentItemManager itemManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to save the event.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions for working with {@link LocalizedString}s.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private GlobalizationHelper globalizationHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the project.
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Title of the project.
|
||||||
|
*/
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The start date of the project.
|
||||||
|
*/
|
||||||
|
private String beginParam;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The end date of the project
|
||||||
|
*/
|
||||||
|
private String endParam;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The short description of the project.
|
||||||
|
*/
|
||||||
|
private String shortDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The initial locale of the project.
|
||||||
|
*/
|
||||||
|
private String initialLocale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The workflow to use for the new project.
|
||||||
|
*/
|
||||||
|
private String selectedWorkflow;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDocumentType() {
|
||||||
|
return SciProject.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.description");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getBundle() {
|
||||||
|
return SciProjectStepsConstants.BUNDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBeginParam() {
|
||||||
|
return beginParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndParam() {
|
||||||
|
return endParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getShortDescription() {
|
||||||
|
return shortDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInitialLocale() {
|
||||||
|
return initialLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String getSelectedWorkflow() {
|
||||||
|
if (selectedWorkflow == null || selectedWorkflow.isEmpty()) {
|
||||||
|
return getContentSection()
|
||||||
|
.getContentTypes()
|
||||||
|
.stream()
|
||||||
|
.filter(
|
||||||
|
type -> type.getContentItemClass().equals(
|
||||||
|
SciProject.class.getName()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.findAny()
|
||||||
|
.map(type -> type.getDefaultWorkflow())
|
||||||
|
.map(
|
||||||
|
workflow -> globalizationHelper.getValueFromLocalizedString(
|
||||||
|
workflow.getName()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.orElse("");
|
||||||
|
} else {
|
||||||
|
return selectedWorkflow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String showCreateStep() {
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/create-sciproject.xhtml";
|
||||||
|
}
|
||||||
|
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
@Override
|
||||||
|
public String createItem(final Map<String, String[]> formParams) {
|
||||||
|
if (!formParams.containsKey(FORM_PARAM_NAME)
|
||||||
|
|| formParams.get(FORM_PARAM_NAME) == null
|
||||||
|
|| formParams.get(FORM_PARAM_NAME).length == 0) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.name.error.missing")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
name = formParams.get(FORM_PARAM_NAME)[0];
|
||||||
|
if (!name.matches("^([a-zA-Z0-9_-]*)$")) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.name.error.invalid")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!formParams.containsKey(FORM_PARAM_TITLE)
|
||||||
|
|| formParams.get(FORM_PARAM_TITLE) == null
|
||||||
|
|| formParams.get(FORM_PARAM_TITLE).length == 0) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.title.error.missing")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
title = formParams.get(FORM_PARAM_TITLE)[0];
|
||||||
|
|
||||||
|
if (!formParams.containsKey(FORM_PARAM_BEGIN)
|
||||||
|
|| formParams.get(FORM_PARAM_BEGIN) == null
|
||||||
|
|| formParams.get(FORM_PARAM_BEGIN).length == 0) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.startdate.error.missing")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
beginParam = formParams.get(FORM_PARAM_BEGIN)[0];
|
||||||
|
final DateTimeFormatter isoDateFormatter = DateTimeFormatter.ISO_DATE
|
||||||
|
.withZone(ZoneId.systemDefault());
|
||||||
|
|
||||||
|
final LocalDate begin;
|
||||||
|
try {
|
||||||
|
begin = LocalDate.parse(
|
||||||
|
beginParam,
|
||||||
|
isoDateFormatter
|
||||||
|
);
|
||||||
|
} catch (DateTimeParseException ex) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.begindate.error.malformed")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
final LocalDate end = readEndDate(formParams);
|
||||||
|
|
||||||
|
if (!formParams.containsKey(FORM_PARAM_SUMMARY)
|
||||||
|
|| formParams.get(FORM_PARAM_SUMMARY) == null
|
||||||
|
|| formParams.get(FORM_PARAM_SUMMARY).length == 0) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.summary.error.missing")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
shortDescription = formParams.get(FORM_PARAM_SUMMARY)[0];
|
||||||
|
|
||||||
|
if (!formParams.containsKey(FORM_PARAM_INITIAL_LOCALE)
|
||||||
|
|| formParams.get(FORM_PARAM_INITIAL_LOCALE) == null
|
||||||
|
|| formParams.get(FORM_PARAM_INITIAL_LOCALE).length == 0) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper.getLocalizedTextsUtil(
|
||||||
|
getBundle()
|
||||||
|
).getText("createstep.initial_locale.error.missing")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
final Locale locale = new Locale(
|
||||||
|
formParams.get(FORM_PARAM_INITIAL_LOCALE)[0]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!formParams.containsKey(FORM_PARAM_SELECTED_WORKFLOW)
|
||||||
|
|| formParams.get(FORM_PARAM_SELECTED_WORKFLOW) == null
|
||||||
|
|| formParams.get(FORM_PARAM_SELECTED_WORKFLOW).length == 0) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper.getLocalizedTextsUtil(
|
||||||
|
getBundle()
|
||||||
|
).getText("createstep.workflow.none_selected")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedWorkflow = formParams.get(FORM_PARAM_SELECTED_WORKFLOW)[0];
|
||||||
|
|
||||||
|
final Optional<Workflow> workflowResult = getContentSection()
|
||||||
|
.getWorkflowTemplates()
|
||||||
|
.stream()
|
||||||
|
.filter(template -> template.getUuid().equals(selectedWorkflow))
|
||||||
|
.findAny();
|
||||||
|
|
||||||
|
if (!workflowResult.isPresent()) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper.getLocalizedTextsUtil(
|
||||||
|
getBundle()
|
||||||
|
).getText("createstep.workflow.error.not_available")
|
||||||
|
);
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getMessages().isEmpty()) {
|
||||||
|
return showCreateStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
final SciProject project = itemManager.createContentItem(
|
||||||
|
name,
|
||||||
|
getContentSection(),
|
||||||
|
getFolder(),
|
||||||
|
workflowResult.get(),
|
||||||
|
SciProject.class,
|
||||||
|
locale
|
||||||
|
);
|
||||||
|
|
||||||
|
project.getTitle().putValue(locale, title);
|
||||||
|
project.setBegin(begin);
|
||||||
|
if (end != null) {
|
||||||
|
project.setEnd(end);
|
||||||
|
}
|
||||||
|
project.getShortDescription().putValue(locale, shortDescription);
|
||||||
|
itemRepo.save(project);
|
||||||
|
|
||||||
|
return String.format(
|
||||||
|
"redirect:/%s/documents/%s/%s/@sciproject-basicproperties",
|
||||||
|
getContentSectionLabel(),
|
||||||
|
getFolderPath(),
|
||||||
|
name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LocalDate readEndDate(final Map<String, String[]> formParams) {
|
||||||
|
if (formParams.containsKey(FORM_PARAM_END)
|
||||||
|
&& formParams.get(FORM_PARAM_END) != null
|
||||||
|
&& formParams.get(FORM_PARAM_END).length > 0) {
|
||||||
|
endParam = formParams.get(FORM_PARAM_END)[0];
|
||||||
|
if (endParam != null) {
|
||||||
|
try {
|
||||||
|
return LocalDate.parse(
|
||||||
|
endParam,
|
||||||
|
DateTimeFormatter.ISO_DATE
|
||||||
|
);
|
||||||
|
} catch (DateTimeParseException ex) {
|
||||||
|
addMessage(
|
||||||
|
"danger",
|
||||||
|
globalizationHelper
|
||||||
|
.getLocalizedTextsUtil(getBundle())
|
||||||
|
.getText("createstep.enddate.error.malformed")
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,123 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.librecms.contentsection.ContentItem;
|
||||||
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.contentsection.ContentSection;
|
||||||
|
import org.librecms.ui.contentsections.ContentSectionsUi;
|
||||||
|
import org.librecms.ui.contentsections.ItemPermissionChecker;
|
||||||
|
import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProject;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
import javax.ws.rs.ForbiddenException;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.NotFoundException;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Path(MvcAuthoringSteps.PATH_PREFIX + "sciproject-description-resources")
|
||||||
|
public class SciProjectDescriptionStepResources {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentSectionsUi sectionsUi;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ItemPermissionChecker itemPermissionChecker;
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/project-description/wordcount/{locale}")
|
||||||
|
@Produces(MediaType.TEXT_HTML)
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String getProjectDescriptionWordCount(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPathParam,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
final ContentSection contentSection = sectionsUi
|
||||||
|
.findContentSection(sectionIdentifier)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException()
|
||||||
|
);
|
||||||
|
|
||||||
|
final ContentItem document = itemRepo
|
||||||
|
.findByPath(contentSection, documentPathParam)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!(document instanceof SciProject)) {
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
|
||||||
|
final SciProject project = (SciProject) document;
|
||||||
|
if (itemPermissionChecker.canEditItem(project)) {
|
||||||
|
final String text = project
|
||||||
|
.getProjectDescription()
|
||||||
|
.getValue(new Locale(localeParam));
|
||||||
|
final Document jsoupDoc = Jsoup.parseBodyFragment(text);
|
||||||
|
final long result = new StringTokenizer(
|
||||||
|
jsoupDoc.body().text()
|
||||||
|
).countTokens();
|
||||||
|
return Long.toString(result);
|
||||||
|
} else {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/project-description/{locale}")
|
||||||
|
@Produces(MediaType.TEXT_HTML)
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String viewProjectDescriptionValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPathParam,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
final ContentSection contentSection = sectionsUi
|
||||||
|
.findContentSection(sectionIdentifier)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException()
|
||||||
|
);
|
||||||
|
|
||||||
|
final ContentItem document = itemRepo
|
||||||
|
.findByPath(contentSection, documentPathParam)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!(document instanceof SciProject)) {
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
|
||||||
|
final SciProject project = (SciProject) document;
|
||||||
|
if (itemPermissionChecker.canEditItem(project)) {
|
||||||
|
return project.getProjectDescription().getValue(
|
||||||
|
new Locale(localeParam)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.libreccm.ui.AbstractMessagesBean;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Named("SciProjectMessageBundle")
|
||||||
|
public class SciProjectMessageBundle extends AbstractMessagesBean {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getMessageBundle() {
|
||||||
|
return SciProjectStepsConstants.BUNDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,587 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
|
import org.libreccm.l10n.LocalizedString;
|
||||||
|
import org.libreccm.security.AuthorizationRequired;
|
||||||
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.ui.contentsections.ContentSectionNotFoundException;
|
||||||
|
import org.librecms.ui.contentsections.ItemPermissionChecker;
|
||||||
|
import org.librecms.ui.contentsections.documents.AbstractMvcAuthoringStep;
|
||||||
|
import org.librecms.ui.contentsections.documents.DocumentNotFoundException;
|
||||||
|
import org.librecms.ui.contentsections.documents.DocumentUi;
|
||||||
|
import org.librecms.ui.contentsections.documents.MvcAuthoringStepDef;
|
||||||
|
import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProject;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.mvc.Controller;
|
||||||
|
import javax.mvc.Models;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
import javax.ws.rs.DefaultValue;
|
||||||
|
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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Path(MvcAuthoringSteps.PATH_PREFIX + "sciproject-basicproperties")
|
||||||
|
@Controller
|
||||||
|
@MvcAuthoringStepDef(
|
||||||
|
bundle = SciProjectStepsConstants.BUNDLE,
|
||||||
|
descriptionKey = "authoringsteps.basicproperties.description",
|
||||||
|
labelKey = "authoringsteps.basicproperties.label",
|
||||||
|
supportedDocumentType = SciProject.class
|
||||||
|
)
|
||||||
|
public class SciProjectPropertiesStep extends AbstractMvcAuthoringStep {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectMessageBundle sciProjectMessageBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for retrieving and saving the projects.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private DocumentUi documentUi;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions for working with {@link LocalizedString}s.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private GlobalizationHelper globalizationHelper;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ItemPermissionChecker itemPermissionChecker;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectPropertiesStepModel sciProjectPropertiesStepModel;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Models models;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<SciProjectPropertiesStep> getStepClass() {
|
||||||
|
return SciProjectPropertiesStep.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
protected void init() throws ContentSectionNotFoundException,
|
||||||
|
DocumentNotFoundException {
|
||||||
|
super.init();
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setName(getDocument().getDisplayName());
|
||||||
|
|
||||||
|
final Set<Locale> titleLocales = getDocument()
|
||||||
|
.getTitle()
|
||||||
|
.getAvailableLocales();
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setTitleValues(
|
||||||
|
getDocument()
|
||||||
|
.getTitle()
|
||||||
|
.getValues()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.collect(
|
||||||
|
Collectors.toMap(
|
||||||
|
entry -> entry.getKey().toString(),
|
||||||
|
entry -> entry.getValue()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setUnusedTitleLocales(
|
||||||
|
globalizationHelper
|
||||||
|
.getAvailableLocales()
|
||||||
|
.stream()
|
||||||
|
.filter(locale -> !titleLocales.contains(locale))
|
||||||
|
.map(Locale::toString)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
|
||||||
|
final SciProject project = (SciProject) getDocument();
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setShortDescriptionValues(
|
||||||
|
project
|
||||||
|
.getShortDescription()
|
||||||
|
.getValues()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.collect(
|
||||||
|
Collectors.toMap(
|
||||||
|
entry -> entry.getKey().toString(),
|
||||||
|
entry -> entry.getValue()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
final Set<Locale> shortDescriptionLocales = project
|
||||||
|
.getShortDescription()
|
||||||
|
.getAvailableLocales();
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setUnusedShortDescriptionLocales(
|
||||||
|
globalizationHelper
|
||||||
|
.getAvailableLocales()
|
||||||
|
.stream()
|
||||||
|
.filter(locale -> !shortDescriptionLocales.contains(locale))
|
||||||
|
.map(Locale::toString)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
|
||||||
|
final DateTimeFormatter isoDateFormatter = DateTimeFormatter.ISO_DATE
|
||||||
|
.withZone(ZoneId.systemDefault());
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setBegin(
|
||||||
|
Optional
|
||||||
|
.ofNullable(project.getBegin())
|
||||||
|
.map(isoDateFormatter::format)
|
||||||
|
.orElse("")
|
||||||
|
);
|
||||||
|
|
||||||
|
sciProjectPropertiesStepModel.setEndDate(
|
||||||
|
Optional
|
||||||
|
.ofNullable(project.getEnd())
|
||||||
|
.map(isoDateFormatter::format)
|
||||||
|
.orElse("")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String showStep(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/sciproject-basic-properties.xhtml";
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
sciProjectMessageBundle.getMessage("project.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the name of the current project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/name")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String updateName(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("name") @DefaultValue("") final String name
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
if (name.isBlank()) {
|
||||||
|
models.put("nameMissing", true);
|
||||||
|
|
||||||
|
return showStep(sectionIdentifier, documentPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
getDocument().setDisplayName(name);
|
||||||
|
itemRepo.save(getDocument());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/begin")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String updateBegin(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("begin")
|
||||||
|
final String begin
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final SciProject project = (SciProject) getDocument();
|
||||||
|
final DateTimeFormatter isoDateFormatter
|
||||||
|
= DateTimeFormatter.ISO_DATE
|
||||||
|
.withZone(ZoneId.systemDefault());
|
||||||
|
project.setBegin(LocalDate.parse(begin, isoDateFormatter));
|
||||||
|
|
||||||
|
itemRepo.save(project);
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/end")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String updateEnd(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("end")
|
||||||
|
final String end
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final SciProject project = (SciProject) getDocument();
|
||||||
|
final DateTimeFormatter isoDateFormatter
|
||||||
|
= DateTimeFormatter.ISO_DATE
|
||||||
|
.withZone(ZoneId.systemDefault());
|
||||||
|
project.setEnd(LocalDate.parse(end, isoDateFormatter));
|
||||||
|
|
||||||
|
itemRepo.save(project);
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a localized title of the project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param localeParam The locale to update.
|
||||||
|
* @param value The updated title value.
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/title/@add")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String addTitle(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("locale") final String localeParam,
|
||||||
|
@FormParam("value") final String value
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getDocument().getTitle().putValue(locale, value);
|
||||||
|
itemRepo.save(getDocument());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a localized title of the project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param localeParam The locale to update.
|
||||||
|
* @param value The updated title value.
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/title/@edit/{locale}")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String editTitle(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam,
|
||||||
|
@FormParam("value") final String value
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getDocument().getTitle().putValue(locale, value);
|
||||||
|
itemRepo.save(getDocument());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a localized title of the project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param localeParam The locale to remove.
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/title/@remove/{locale}")
|
||||||
|
@AuthorizationRequired
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String removeTitle(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getDocument().getTitle().removeValue(locale);
|
||||||
|
itemRepo.save(getDocument());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a localized short description to the project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param localeParam The locale of the description.
|
||||||
|
* @param value The description value.
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/short-description/@add")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String addShortDescription(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("locale") final String localeParam,
|
||||||
|
@FormParam("value") final String value
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
final SciProject project = (SciProject) getDocument();
|
||||||
|
project.getShortDescription().putValue(locale, value);
|
||||||
|
|
||||||
|
itemRepo.save(project);
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a localized short description to the project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param localeParam The locale to update.
|
||||||
|
* @param value The description value.
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/short-description/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String editShortDescription(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam,
|
||||||
|
@FormParam("value") final String value
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
final SciProject project = (SciProject) getDocument();
|
||||||
|
project.getShortDescription().putValue(locale, value);
|
||||||
|
|
||||||
|
itemRepo.save(project);
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a localized short description from the project.
|
||||||
|
*
|
||||||
|
* @param sectionIdentifier
|
||||||
|
* @param documentPath
|
||||||
|
* @param localeParam The locale to remove.
|
||||||
|
*
|
||||||
|
* @return A redirect to this authoring step.
|
||||||
|
*/
|
||||||
|
public String removeShortDescription(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getDocument())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
final SciProject project = (SciProject) getDocument();
|
||||||
|
project.getShortDescription().removeValue(locale);
|
||||||
|
itemRepo.save(project);
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getDocument(),
|
||||||
|
getLabel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Named("SciProjectPropertiesStep")
|
||||||
|
public class SciProjectPropertiesStepModel {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private Map<String, String> titleValues;
|
||||||
|
|
||||||
|
private List<String> unusedTitleLocales;
|
||||||
|
|
||||||
|
private Map<String, String> shortDescriptionValues;
|
||||||
|
|
||||||
|
private List<String> unusedShortDescriptionLocales;
|
||||||
|
|
||||||
|
private String begin;
|
||||||
|
|
||||||
|
private String endDate;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(final String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getTitleValues() {
|
||||||
|
return Collections.unmodifiableMap(titleValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitleValues(final Map<String, String> titleValues) {
|
||||||
|
this.titleValues = new HashMap<>(titleValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getUnusedTitleLocales() {
|
||||||
|
return Collections.unmodifiableList(unusedTitleLocales);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnusedTitleLocales(final List<String> unusedTitleLocales) {
|
||||||
|
this.unusedTitleLocales = new ArrayList<>(unusedTitleLocales);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getShortDescriptionValues() {
|
||||||
|
return Collections.unmodifiableMap(shortDescriptionValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShortDescriptionValues(
|
||||||
|
final Map<String, String> shortDescriptionValues
|
||||||
|
) {
|
||||||
|
this.shortDescriptionValues = new HashMap<>(shortDescriptionValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getUnusedShortDescriptionLocales() {
|
||||||
|
return Collections.unmodifiableList(unusedShortDescriptionLocales);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnusedShortDescriptionLocales(
|
||||||
|
final List<String> unusedShortDescriptionLocales
|
||||||
|
) {
|
||||||
|
this.unusedShortDescriptionLocales = new ArrayList<>(
|
||||||
|
unusedShortDescriptionLocales
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBegin() {
|
||||||
|
return begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBegin(final String begin) {
|
||||||
|
this.begin = begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getHasStartDate() {
|
||||||
|
return !begin.isBlank();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndDate() {
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDate(final String endDate) {
|
||||||
|
this.endDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getHasEndDate() {
|
||||||
|
return !endDate.isBlank();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue