Bugfixes for editing publications

pull/1/head
Jens Pelzetter 2022-06-29 20:27:37 +02:00
parent 30a01f2df3
commit 8aef004c17
10 changed files with 274 additions and 153 deletions

View File

@ -3,7 +3,6 @@ package org.scientificcms.publications.ui.contenttypes;
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.Person;
import org.librecms.assets.PersonRepository;
@ -36,9 +35,6 @@ import javax.servlet.http.HttpServletRequest;
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;
/**

View File

@ -2,7 +2,6 @@ package org.scientificcms.publications.ui.contenttypes;
import org.libreccm.api.Identifier;
import org.libreccm.api.IdentifierParser;
import org.libreccm.security.AuthorizationRequired;
import org.librecms.contentsection.Asset;
import org.librecms.contentsection.AssetRepository;
import org.librecms.ui.contentsections.ContentSectionNotFoundException;
@ -22,8 +21,6 @@ import javax.inject.Inject;
import javax.mvc.Models;
import javax.transaction.Transactional;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
/**

View File

@ -7,7 +7,6 @@ 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.librecms.ui.contenttypes.event.EventStepsConstants;
import org.scientificcms.publications.Monograph;
import org.scientificcms.publications.contenttypes.MonographItem;
import org.scientificcms.publications.ui.SciPublicationsUiConstants;

View File

@ -26,6 +26,7 @@ public class PublicationAuthoringSteps implements MvcAuthoringSteps {
@Override
public Set<Class<?>> getResourceClasses() {
return Set.of(
PublicationItemAuthors.class,
PublicationAbstractStepResources.class,
PublicationMiscStepResources.class
);

View File

@ -0,0 +1,108 @@
package org.scientificcms.publications.ui.contenttypes;
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.documents.MvcAuthoringSteps;
import org.scientificcms.publications.Authorship;
import org.scientificcms.publications.Publication;
import org.scientificcms.publications.PublicationRepository;
import org.scientificcms.publications.contenttypes.PublicationItem;
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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
@Path(MvcAuthoringSteps.PATH_PREFIX + "publication-authors")
public class PublicationItemAuthors {
@Inject
private ContentItemRepository itemRepo;
@Inject
private ContentSectionsUi sectionsUi;
@Inject
private PublicationRepository publicationRepo;
@POST
@Path("/save-order")
@Consumes(MediaType.APPLICATION_JSON)
@Transactional(Transactional.TxType.REQUIRED)
public Response saveOrder(
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
final String sectionIdentifier,
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
final String documentPath,
final List<String> order
) {
final ContentSection section = sectionsUi
.findContentSection(sectionIdentifier)
.orElseThrow(
() -> new NotFoundException(
String.format(
"ContentSection %s not found.",
sectionIdentifier
)
)
);
final ContentItem item = itemRepo
.findByPath(section, documentPath)
.orElseThrow(
() -> new NotFoundException(
String.format(
"ContentItem %s not found.",
documentPath
)
)
);
if (!(item instanceof PublicationItem)) {
throw new NotFoundException(
String.format(
"ContentItem %s is not a publication item.",
documentPath
)
);
}
final Map<Long, Long> orderMap = new HashMap<>();
for (int i = 0; i < order.size(); i++) {
orderMap.put(Long.parseLong(order.get(i)), (long) i);
}
final PublicationItem<?> publicationItem = (PublicationItem<?>) item;
final Publication publication = publicationItem.getPublication();
for(final Authorship authorship : publication.getAuthorships()) {
authorship.setAuthorOrder(
orderMap.get(
authorship.getAuthorshipId()
)
);
}
publicationRepo.save(publication);
return Response.ok().build();
}
}

View File

@ -30,27 +30,34 @@
formParamName="publisherIdentifier"
/>
<p>
<c:choose>
<c:when test="#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherPlace != null}">
#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName}, #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherPlace}
</c:when>
<c:otherwise>
#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName}
</c:otherwise>
</c:choose>
<c:if test="#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherUuid != null}">
<libreccm:deleteDialog
actionTarget="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@collectedvolume-edit/publisher/@remove"
buttonText="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.remove.label']}"
cancelLabel="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.cancel']}"
confirmLabel="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.confirm']}"
dialogId="publisher-remove"
dialogTitle="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.title']}"
message="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.message']}"
/>
</c:if>
</p>
<c:choose>
<c:when test="#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName == null}">
<p>#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.none']}</p>
</c:when>
<c:otherwise>
<p>
<c:choose>
<c:when test="#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherPlace != null}">
#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName}, #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherPlace}
</c:when>
<c:otherwise>
#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName}
</c:otherwise>
</c:choose>
<c:if test="#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherUuid != null}">
<libreccm:deleteDialog
actionTarget="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@collectedvolume-edit/publisher/@remove"
buttonText="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.remove.label']}"
cancelLabel="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.cancel']}"
confirmLabel="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.confirm']}"
dialogId="publisher-remove"
dialogTitle="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.title']}"
message="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.message']}"
/>
</c:if>
</p>
</c:otherwise>
</c:choose>
<ui:insert name="publicationWithPublisherProperties" />

View File

@ -247,7 +247,7 @@
</div>
</div>
<librecms:assetPicker
actionUrl="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}/authors"
actionUrl="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}/authors"
assetType="#{SciCmsCollectedVolumeAssetEditStepModel.authorType}"
assetPickerId="authors-picker"
baseUrl="#{SciCmsPublicationPropertiesStepModel.baseUrl}"
@ -261,127 +261,134 @@
name="editor"
/>
</librecms:assetPicker>
<button class="btn btn-secondary authors-save-order-button"
disabled="disabled"
type="button">
<span class="save-icon">
<bootstrap:svgIcon icon="save" />
</span>
<span class="save-spinner d-none">
<span aria-hidden="true"
class="spinner-border spinner-border-sm"
role="status"></span>
<span class="sr-only">#{SciPublicationsUiMessageBundle['authors.order.save.inprogress']}</span>
</span>
<span>#{SciPublicationsUiMessageBundle['authors.order.save']}</span>
</button>
<table id="authors-table"
data-saveUrl="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}-authors/save-order">
<thead>
<tr>
<th>#{SciPublicationsUiMessageBundle['basicproperties.authors.table.name']}</th>
<th>
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.editor']}
</th>
<th colspan="2">
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.actions']}
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{SciCmsPublicationPropertiesStepModel.authors}"
var="author">
<tr class="publication-author"
id="#{author.authorshipId}"
data-id="#{author.authorshipId}">
<td>
<button class="btn btn-secondary cms-sort-handle mr-2"
type="button">
<bootstrap:svgIcon icon="arrows-move" />
<span class="sr-only">#{SciPublicationsUiMessageBundle['basicproperties.authors.move']}</span>
</button>
#{author.authorName}
</td>
<td>
<c:choose>
<c:when test="#{author.editor}">
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.editor.yes']}
</c:when>
<c:otherwise>
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.editor.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<button class="btn btn-secondary"
data-toggle="modal"
data-target="#authorship-edit-#{author.authorshipUuid}"
type="button">
<bootstrap:svgIcon icon="pen" />
<span class="sr-only">
#{SciPublicationsUiMessageBundle['basicproperties.authors.edit.label']}
</span>
</button>
<div aria-hidden="true"
aria-labelledby="authorship-edit-#{author.authorshipUuid}-title"
class="modal fade"
id="authorship-edit-#{author.authorshipUuid}"
tabindex="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}/authors/#{author.authorshipUuid}"
class="modal-content"
method="post">
<div class="modal-header">
<h4 class="modal-title"
id="authorship-edit-#{author.authorshipUuid}-title">
#{SciPublicationsUiMessageBundle.getMessage('basicproperties.authors.editdialog.title', [author.authorName])}
</h4>
<button aria-label="{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.cancel']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
<c:choose>
<c:when test="#{SciCmsPublicationPropertiesStepModel.authors.isEmpty()}">
<p>#{SciPublicationsUiMessageBundle['basicproperties.authors.none']}</p>
</c:when>
<c:otherwise>
<button class="btn btn-secondary authors-save-order-button"
disabled="disabled"
type="button">
<span class="save-icon">
<bootstrap:svgIcon icon="save" />
</span>
<span class="save-spinner d-none">
<span aria-hidden="true"
class="spinner-border spinner-border-sm"
role="status"></span>
<span class="sr-only">#{SciPublicationsUiMessageBundle['authors.order.save.inprogress']}</span>
</span>
<span>#{SciPublicationsUiMessageBundle['authors.order.save']}</span>
</button>
<table id="authors-table"
data-saveUrl="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@publication-authors/save-order">
<thead>
<tr>
<th>#{SciPublicationsUiMessageBundle['basicproperties.authors.table.name']}</th>
<th>
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.editor']}
</th>
<th colspan="2">
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.actions']}
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{SciCmsPublicationPropertiesStepModel.authors}"
var="author">
<tr class="publication-author"
id="#{author.authorshipId}"
data-id="#{author.authorshipId}">
<td>
<button class="btn btn-secondary cms-sort-handle mr-2"
type="button">
<bootstrap:svgIcon icon="arrows-move" />
<span class="sr-only">#{SciPublicationsUiMessageBundle['basicproperties.authors.move']}</span>
</button>
#{author.authorName}
</td>
<td>
<c:choose>
<c:when test="#{author.editor}">
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.editor.yes']}
</c:when>
<c:otherwise>
#{SciPublicationsUiMessageBundle['basicproperties.authors.table.editor.no']}
</c:otherwise>
</c:choose>
</td>
<td>
<button class="btn btn-secondary"
data-toggle="modal"
data-target="#authorship-edit-#{author.authorshipUuid}"
type="button">
<bootstrap:svgIcon icon="pen" />
<span class="sr-only">
#{SciPublicationsUiMessageBundle['basicproperties.authors.edit.label']}
</span>
</button>
<div aria-hidden="true"
aria-labelledby="authorship-edit-#{author.authorshipUuid}-title"
class="modal fade"
id="authorship-edit-#{author.authorshipUuid}"
tabindex="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}/authors/#{author.authorshipUuid}"
class="modal-content"
method="post">
<div class="modal-header">
<h4 class="modal-title"
id="authorship-edit-#{author.authorshipUuid}-title">
#{SciPublicationsUiMessageBundle.getMessage('basicproperties.authors.editdialog.title', [author.authorName])}
</h4>
<button aria-label="{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.cancel']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<bootstrap:formCheck
checked="#{author.editor}"
inputId="#{author.authorshipUuid}-editor"
label="#{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.editor.label']}"
name="editor"
value="true"
/>
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.cancel']}
</button>
<button class="btn btn-success"
type="submit">
#{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.submit']}
</button>
</div>
</form>
</div>
<div class="modal-body">
<bootstrap:formCheck
checked="#{author.editor}"
inputId="#{author.authorshipUuid}-editor"
label="#{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.editor.label']}"
name="editor"
value="true"
/>
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.cancel']}
</button>
<button class="btn btn-success"
type="submit">
#{SciPublicationsUiMessageBundle['basicproperties.authors.editdialog.submit']}
</button>
</div>
</form>
</div>
</div>
</td>
<td>
<libreccm:deleteDialog
actionTarget="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}/authors/#{author.authorshipUuid}/remove"
buttonText="#{SciPublicationsUiMessageBundle['basicproperties.authors.remove.label']}"
cancelLabel="#{SciPublicationsUiMessageBundle['basicproperties.authors.remove.cancel']}"
confirmLabel="#{SciPublicationsUiMessageBundle['basicproperties.authors.remove.confirm']}"
dialogId="remove-author-#{author.authorshipUuid}"
dialogTitle="#{SciPublicationsUiMessageBundle.getMessage('basicproperties.authors.remove.title', [author.authorName])}"
message="#{SciPublicationsUiMessageBundle.getMessage('basicproperties.authors.remove.text', [author.authorName])}"
/>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</td>
<td>
<libreccm:deleteDialog
actionTarget="#{mvc.basePath}/#{ContentSectionModel.sectionName}/documents/#{CmsSelectedDocumentModel.itemPath}/@#{SciCmsPublicationPropertiesStepModel.editStepUrlFragment}/authors/#{author.authorshipUuid}/remove"
buttonText="#{SciPublicationsUiMessageBundle['basicproperties.authors.remove.label']}"
cancelLabel="#{SciPublicationsUiMessageBundle['basicproperties.authors.remove.cancel']}"
confirmLabel="#{SciPublicationsUiMessageBundle['basicproperties.authors.remove.confirm']}"
dialogId="remove-author-#{author.authorshipUuid}"
dialogTitle="#{SciPublicationsUiMessageBundle.getMessage('basicproperties.authors.remove.title', [author.authorName])}"
message="#{SciPublicationsUiMessageBundle.getMessage('basicproperties.authors.remove.text', [author.authorName])}"
/>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:otherwise>
</c:choose>
</c:if>
<ui:insert name="publicationProperties" />

View File

@ -377,3 +377,6 @@ editsteps.misc.step_back=Back
editsteps.misc.header_view=Miscellaneous information
editsteps.misc.edit=Edit
editsteps.misc.header_edit=Edit miscellaneous information
basicproperties.authors.none=No authors assigned yet.
publicationwithpublisher.publisher.none=No publisher assigned yet.
basicproperties.authors.remove.confirm=Remove

View File

@ -335,7 +335,7 @@ basicproperties.authors.table.name=Name
basicproperties.authors.table.editor=Herausgeber:in
basicproperties.authors.table.actions=Aktionen
basicproperties.authors.move=Verschieben
basicproperties.authors.table.editor.yes=No
basicproperties.authors.table.editor.yes=Ja
basicproperties.authors.table.editor.no=Nein
basicproperties.authors.edit.label=Autorenschaft bearbeiten
basicproperties.authors.editdialog.title=Autorenschaft von {0} bearbeiten
@ -377,3 +377,6 @@ editsteps.misc.step_back=Zur\u00fcck
editsteps.misc.header_view=Weitere Informationen
editsteps.misc.edit=Bearbeiten
editsteps.misc.header_edit=Weitere Informationen bearbeiten
basicproperties.authors.none=Es wurden noch keine Autoren eingetragen.
publicationwithpublisher.publisher.none=Es wurde noch kein Verlag zugewiesen.
basicproperties.authors.remove.confirm=Entfernen

View File

@ -7,7 +7,7 @@ module.exports = {
entry: {
"collectedvolume-asset-authors": "./src/main/typescript/collectedvolume-asset-authors.ts",
"proceedings-asset-authors": "./src/main/typescript/proceedings-asset-authors",
"publications-authors.ts": "./src/main/typescript/publication-authors.ts"
"publication-authors": "./src/main/typescript/publication-authors.ts"
},
output: {
filename: "[name].js",