Table for Series

pull/1/head
Jens Pelzetter 2019-10-19 17:09:51 +02:00
parent 96aee1917a
commit 6f5e33403a
6 changed files with 185 additions and 74 deletions

View File

@ -20,7 +20,6 @@ import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl;
@ -28,7 +27,6 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker;
import org.librecms.assets.Person;
import org.librecms.contentsection.privileges.ItemPrivileges;
import org.scientificcms.publications.Authorship;
import org.scientificcms.publications.SciPublicationsConstants;
@ -71,7 +69,7 @@ public class PublicationAuthorsTable
private final PublicationAuthorsPropertyStep editStep;
public PublicationAuthorsTable(
final ItemSelectionModel itemModel,
final ItemSelectionModel itemModel,
final PublicationAuthorsPropertyStep editStep
) {
super();
@ -159,6 +157,53 @@ public class PublicationAuthorsTable
addTableActionListener(this);
}
@Override
public void cellSelected(final TableActionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
final PublicationItem<?> selected = (PublicationItem<?>) itemModel
.getSelectedItem(state);
final SciPublicationsController controller = CdiUtil
.createCdiUtil()
.findBean(SciPublicationsController.class);
final Authorship authorship = controller.findAuthorship(
selected.getPublication().getPublicationId(),
event.getRowKey()
).get();
final TableColumn column = getColumnModel().get(event.getColumn());
if (TABLE_COL_EDIT_ASSOC.equals(column.getHeaderKey())) {
editStep.setSelectedAuthor(authorship.getAuthor());
editStep.setSelectedAuthorEditor(authorship.isEditor());
editStep.showComponent(state, "AuthorsEntryForm");
} else if (TABLE_COL_DEL.equals(column.getHeaderKey())) {
controller.removeAuthor(
selected.getPublication().getPublicationId(),
authorship.getAuthorshipId()
);
} else if (TABLE_COL_UP.equals(column.getHeaderKey())) {
controller.swapWithPrevAuthorship(
selected.getPublication().getPublicationId(),
authorship.getAuthorshipId()
);
} else if (TABLE_COL_DOWN.equals(column.getHeaderKey())) {
controller.swapWithNextAuthorship(
selected.getPublication().getPublicationId(),
authorship.getAuthorshipId()
);
}
}
@Override
public void headSelected(final TableActionEvent event) {
// Nothing
}
private class PublicationAuthorsTableModelBuilder
extends LockableImpl
implements TableModelBuilder {
@ -182,52 +227,6 @@ public class PublicationAuthorsTable
}
@Override
public void cellSelected(final TableActionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
final PublicationItem<?> selected = (PublicationItem<?>) itemModel
.getSelectedItem(state);
final SciPublicationsController controller = CdiUtil
.createCdiUtil()
.findBean(SciPublicationsController.class);
final Authorship authorship = controller.findAuthorship(
selected.getPublication().getPublicationId(), event.getRowKey()
).get();
final TableColumn column = getColumnModel().get(event.getColumn());
if (TABLE_COL_EDIT_ASSOC.equals(column.getHeaderKey())) {
editStep.setSelectedAuthor(authorship.getAuthor());
editStep.setSelectedAuthorEditor(authorship.isEditor());
editStep.showComponent(state, "AuthorsEntryForm");
} else if (TABLE_COL_DEL.equals(column.getHeaderKey())) {
controller.removeAuthor(
selected.getPublication().getPublicationId(),
authorship.getAuthorshipId()
);
} else if (TABLE_COL_UP.equals(column.getHeaderKey())) {
controller.swapWithPrevAuthorship(
selected.getPublication().getPublicationId(),
authorship.getAuthorshipId()
);
} else if (TABLE_COL_DOWN.equals(column.getHeaderKey())) {
controller.swapWithNextAuthorship(
selected.getPublication().getPublicationId(),
authorship.getAuthorshipId()
);
}
}
@Override
public void headSelected(final TableActionEvent event) {
// Nothing
}
private class PublicationAuthorsTableModel implements TableModel {
private static final int MAX_DESC_LENGTH = 25;
@ -260,9 +259,7 @@ public class PublicationAuthorsTable
@Override
public boolean nextRow() {
if (iterator.hasNext()) {
currentRow = iterator.next();
return true;
} else {

View File

@ -76,7 +76,7 @@ public class PublicationSeriesAddForm
add(seriesSearchWidget);
final ParameterModel volumeOfSeriesParam = new StringParameter(
SciPublicationsController.VOLUME_OF_SERIES
SciPublicationsController.VOLUME_IN_SERIES
);
volumeOfSeries = new TextField(volumeOfSeriesParam);
volumeOfSeries.setLabel(

View File

@ -11,6 +11,7 @@ import org.scientificcms.publications.Authorship;
import org.scientificcms.publications.Publication;
import org.scientificcms.publications.PublicationManager;
import org.scientificcms.publications.PublicationRepository;
import org.scientificcms.publications.VolumeInSeries;
import java.io.Serializable;
import java.util.HashMap;
@ -59,8 +60,14 @@ class SciPublicationsController implements Serializable {
public static final String AUTHORSHIP_IS_EDITOR = "isEditor";
public static final String AUTHORSHIP_ORDER = "order";
public static final String VOLUME_IN_SERIES = "volumeInSeries";
public static final String VOLUME_IN_SERIES_ID = "volumeInSeriesId";
public static final String VOLUME_IN_SERIES_TITLE = "volumeInSeriesTitle";
public static final String VOLUME_OF_SERIES = "volumeOfSeries";
public static final String VOLUME_IN_SERIES_VOLUME = "volumeInSeriesVolume";
@Inject
private PersonRepository personRepository;
@ -252,11 +259,8 @@ class SciPublicationsController implements Serializable {
)
);
final Optional<Authorship> authorship = publication
.getAuthorships()
.stream()
.filter(current -> current.getAuthorshipId() == authorshipId)
.findAny();
final Optional<Authorship> authorship = findAuthorship(publicationId,
authorshipId);
if (authorship.isPresent()) {
publicationManager.removeAuthor(
@ -352,26 +356,110 @@ class SciPublicationsController implements Serializable {
Authorship authorship = null;
int index = -1;
for (int i = 0; i < authorships.size(); i++) {
if (authorships.get(i).getAuthorshipId() == authorshipId) {
authorship = authorships.get(i);
index = i;
break;
}
}
if (index < authorships.size() && authorship != null) {
final long order = authorship.getAuthorOrder();
final Authorship nextAuthorship = authorships.get(index + 1);
final long nextOrder = nextAuthorship.getAuthorOrder();
authorship.setAuthorOrder(nextOrder);
nextAuthorship.setAuthorOrder(order);
publicationRepository.save(publication);
}
}
@Transactional(Transactional.TxType.REQUIRED)
public List<Map<String, Object>> getVolumesInSeries(
final long publicationId
) {
final Publication publication = publicationRepository
.findById(publicationId)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No Publication with ID %d found.", publicationId
)
)
);
return publication
.getSeries()
.stream()
.map(this::buildVolumeInSeriesEntry)
.collect(Collectors.toList());
}
private Map<String, Object> buildVolumeInSeriesEntry(
final VolumeInSeries volumeInSeries
) {
Objects.requireNonNull(volumeInSeries);
final Map<String, Object> result = new HashMap<>();
result.put(VOLUME_IN_SERIES_ID, volumeInSeries.getVolumeId());
result.put(
VOLUME_IN_SERIES_TITLE, volumeInSeries.getSeries().getTitle()
);
result.put(VOLUME_IN_SERIES_VOLUME, volumeInSeries.getVolumeOfSeries());
return result;
}
@Transactional(Transactional.TxType.REQUIRED)
public Optional<VolumeInSeries> findVolumeInSeries(
final long publicationId, final Object key
) {
final Publication publication = publicationRepository
.findById(publicationId)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No Publication with ID %d found.", publicationId
)
)
);
final long volumeId = (long) key;
return publication
.getSeries()
.stream()
.filter(series -> series.getVolumeId() == volumeId)
.findAny();
}
@Transactional(Transactional.TxType.REQUIRED)
public void removeSeries(final long publicationId,
final long volumeInSeriesId) {
final Publication publication = publicationRepository
.findById(publicationId)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No Publication with ID %d found.", publicationId
)
)
);
final Optional<VolumeInSeries> volumeInSeries = findVolumeInSeries(
publicationId, volumeInSeriesId);
if (volumeInSeries.isPresent()) {
publicationManager.removeSeries(
volumeInSeries.get().getSeries(),
publication
);
}
}
private boolean filterAuthorship(final Authorship authorship,
final Publication publication,
final Person author) {

View File

@ -27,7 +27,7 @@ public class PublicationManager {
@Inject
private EntityManager entityManager;
@Inject
private PublicationRepository publicationRepository;
@ -322,13 +322,13 @@ public class PublicationManager {
) {
Objects.requireNonNull(series);
Objects.requireNonNull(publication);
final boolean alreadyAdded = publication
.getSeries()
.stream()
.map(VolumeInSeries::getSeries)
.anyMatch(obj -> obj.equals(series));
.getSeries()
.stream()
.map(VolumeInSeries::getSeries)
.anyMatch(obj -> obj.equals(series));
if (alreadyAdded) {
throw new IllegalArgumentException(
String.format(
@ -338,7 +338,7 @@ public class PublicationManager {
)
);
}
final VolumeInSeries volume = new VolumeInSeries();
volume.setPublication(publication);
volume.setSeries(series);
@ -349,4 +349,30 @@ public class PublicationManager {
publicationRepository.save(publication);
}
@AuthorizationRequired
@RequiresPrivilege(ItemPrivileges.EDIT)
@Transactional(Transactional.TxType.REQUIRED)
public void removeSeries(
final Series series, final Publication fromPublication
) {
Objects.requireNonNull(series);
Objects.requireNonNull(fromPublication);
final Optional<VolumeInSeries> result = fromPublication
.getSeries()
.stream()
.filter(volume -> volume.getSeries().equals(series))
.findAny();
if (!result.isPresent()) {
return;
}
final VolumeInSeries remove = result.get();
fromPublication.removeSeries(remove);
entityManager.remove(remove);
publicationRepository.save(fromPublication);
}
}

View File

@ -44,10 +44,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*;
),
@NamedQuery(
name = "Series.findByTitle",
query = "SELECT DISTINCT s "
+ "FROM Series s "
+ "JOIN s.title.values t "
+ "WHERE lower(t) LIKE CONCAT ('%', :title, '%')"
query = "SELECT DISTINCT s FROM Series s JOIN s.title.values t WHERE lower(t) LIKE CONCAT ('%', :title, '%')"
)
})
public class Series implements Serializable {

View File

@ -5,6 +5,8 @@
*/
package org.scientificcms.publications;
import org.hibernate.envers.Audited;
import java.io.Serializable;
import java.util.Objects;
@ -25,6 +27,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*;
*/
@Entity
@Table(name = "VOLUMES_IN_SERIES", schema = DB_SCHEMA)
@Audited
public class VolumeInSeries implements Serializable {
private static final long serialVersionUID = 1L;