diff --git a/vspace/.classpath b/vspace/.classpath index 3aa72561a..94c3284e0 100644 --- a/vspace/.classpath +++ b/vspace/.classpath @@ -27,6 +27,7 @@ + @@ -34,19 +35,10 @@ - - - - - - - - - - \ No newline at end of file + diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java b/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java index b3a67339c..9bbb3a6c3 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java @@ -29,6 +29,7 @@ import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.model.impl.SpaceStatus; import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.IExhibitionSpaceOrderUtility; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISpaceManager; import edu.asu.diging.vspace.web.exhibit.view.ExhibitionConstants; @@ -49,6 +50,11 @@ public class ExhibitionDataAspect { @Autowired private AuthenticationFacade authFacade; + + @Autowired + private IExhibitionSpaceOrderUtility exhibitionSpaceOrderUtility; + + @After("execution(public * edu.asu.diging.vspace.web..*Controller.*(..))") public void setExhibition(JoinPoint jp) { Object[] args = jp.getArgs(); @@ -69,6 +75,7 @@ public void setExhibition(JoinPoint jp) { * spaces with null space status */ publishedSpaces.addAll(spaceManager.getSpacesWithStatus(null)); + publishedSpaces = spaceManager.sortPublishedSpacesByGivenOrder(publishedSpaces); ((Model) obj).addAttribute("publishedSpaces", publishedSpaces); } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/data/SpacesCustomOrderRepository.java b/vspace/src/main/java/edu/asu/diging/vspace/core/data/SpacesCustomOrderRepository.java new file mode 100644 index 000000000..e8aa980bf --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/data/SpacesCustomOrderRepository.java @@ -0,0 +1,13 @@ +package edu.asu.diging.vspace.core.data; + +import org.javers.spring.annotation.JaversSpringDataAuditable; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; + +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; + +@Repository +@JaversSpringDataAuditable +public interface SpacesCustomOrderRepository extends PagingAndSortingRepository { + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ExhibitionSpaceOrderMode.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ExhibitionSpaceOrderMode.java new file mode 100644 index 000000000..1465b5696 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ExhibitionSpaceOrderMode.java @@ -0,0 +1,7 @@ +package edu.asu.diging.vspace.core.model; + +public enum ExhibitionSpaceOrderMode { + ALPHABETICAL, + CREATION_DATE, + CUSTOM +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibition.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibition.java index ffa052264..dd95b590c 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibition.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibition.java @@ -2,6 +2,8 @@ import java.util.List; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; + public interface IExhibition extends IVSpaceElement { /* @@ -50,6 +52,12 @@ public interface IExhibition extends IVSpaceElement { void setPreviewId(String previewId); - void setCustomMessage(String customMessage); + SpacesCustomOrder getSpacesCustomOrder(); + + void setSpacesCustomOrder(SpacesCustomOrder spacesCustomOrder); + + void setSpaceOrderMode(ExhibitionSpaceOrderMode spaceOrderMode); + + ExhibitionSpaceOrderMode getSpaceOrderMode(); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpacesCustomOrder.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpacesCustomOrder.java new file mode 100644 index 000000000..a71293914 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpacesCustomOrder.java @@ -0,0 +1,15 @@ +package edu.asu.diging.vspace.core.model; + +import java.util.List; + +public interface ISpacesCustomOrder extends IVSpaceElement { + + public String getCustomOrderName(); + + public void setCustomOrderName(String customOrderName); + + public List getCustomOrderedSpaces(); + + public void setCustomOrderedSpaces(List customOrderedSpaces); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java index f7c79dfb9..6d0d5c15d 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java @@ -10,6 +10,7 @@ import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; @@ -19,6 +20,7 @@ import org.hibernate.annotations.Parameter; import edu.asu.diging.vspace.core.model.ExhibitionModes; +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.IExhibitionLanguage; import edu.asu.diging.vspace.core.model.ISpace; @@ -48,6 +50,13 @@ public class Exhibition extends VSpaceElement implements IExhibition { private String customMessage; + @Enumerated(EnumType.STRING) + private ExhibitionSpaceOrderMode spaceOrderMode; + + @OneToOne(targetEntity = SpacesCustomOrder.class) + @JoinColumn(name = "Space_Custom_Order_Id", referencedColumnName = "id") + private SpacesCustomOrder spacesCustomOrder; + @OneToOne(targetEntity = VSImage.class) @NotFound(action = NotFoundAction.IGNORE) private IVSImage spaceLinkDefaultImage; @@ -160,6 +169,26 @@ public void setExternalLinkDefaultImage(IVSImage externalLinkDefaultImage) { this.externalLinkDefaultImage = externalLinkDefaultImage; } @Override + public ExhibitionSpaceOrderMode getSpaceOrderMode() { + return spaceOrderMode; + } + + @Override + public void setSpaceOrderMode(ExhibitionSpaceOrderMode spaceOrderMode) { + this.spaceOrderMode = spaceOrderMode; + } + + @Override + public SpacesCustomOrder getSpacesCustomOrder() { + return spacesCustomOrder; + } + + @Override + public void setSpacesCustomOrder(SpacesCustomOrder spacesCustomOrder) { + this.spacesCustomOrder = spacesCustomOrder; + } + + public boolean isAboutPageConfigured() { return aboutPageConfigured; } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/SpacesCustomOrder.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/SpacesCustomOrder.java new file mode 100644 index 000000000..119218759 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/SpacesCustomOrder.java @@ -0,0 +1,70 @@ +package edu.asu.diging.vspace.core.model.impl; + + +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.OrderColumn; + +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; + +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.model.ISpacesCustomOrder; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +public class SpacesCustomOrder extends VSpaceElement implements ISpacesCustomOrder { + + @Id + @GeneratedValue(generator = "customorder_id_generator") + @GenericGenerator(name = "customorder_id_generator", + parameters = @Parameter(name = "prefix", value = "SPC"), + strategy = "edu.asu.diging.vspace.core.data.IdGenerator") + private String id; + + @Column(nullable=false) + private String customOrderName; + + @ManyToMany(targetEntity = Space.class) + @JoinTable(name = "spaces_custom_orders", + joinColumns = @JoinColumn(name = "SpacesCustomOrder_Id", referencedColumnName="id"), + inverseJoinColumns = @JoinColumn(name = "Space_Id", referencedColumnName="id")) + @OrderColumn + private List customOrderedSpaces; + + @Override + public String getId() { + return id; + } + + @Override + public void setId(String id) { + this.id = id; + } + + public String getCustomOrderName() { + return customOrderName; + } + + public void setCustomOrderName(String customOrderName) { + this.customOrderName = customOrderName; + } + + public List getCustomOrderedSpaces() { + return customOrderedSpaces; + } + + public void setCustomOrderedSpaces(List customOrderedSpaces) { + this.customOrderedSpaces = customOrderedSpaces; + } + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java index e7ac5a475..00b395558 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java @@ -2,6 +2,7 @@ import java.util.List; +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.impl.Exhibition; @@ -33,6 +34,8 @@ public interface IExhibitionManager { List findAll(); IExhibition getStartExhibition(); + + IExhibition updateSpaceOrderMode(ExhibitionSpaceOrderMode mode); void updateExhibitionLanguages(IExhibition exhibition, List languages, String defaultLanguage); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionSpaceOrderUtility.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionSpaceOrderUtility.java new file mode 100644 index 000000000..dfdb3cd2c --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionSpaceOrderUtility.java @@ -0,0 +1,12 @@ +package edu.asu.diging.vspace.core.services; + +import java.util.List; + +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; +import edu.asu.diging.vspace.core.model.ISpace; + +public interface IExhibitionSpaceOrderUtility { + + List sortSpaces(List publishedSpaces, ExhibitionSpaceOrderMode mode); + +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java index b8be74816..0d2e2240e 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java @@ -39,6 +39,9 @@ public interface ISpaceManager { Page findByNameOrDescription(Pageable requestedPage,String searchText); + List sortPublishedSpacesByGivenOrder(List publishedSpaces); + + void addSpaceToCustomOrders(ISpace space); List findByName(String name); List findByNamePaginated(String name, int page, int pageSize); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpacesCustomOrderManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpacesCustomOrderManager.java new file mode 100644 index 000000000..ea277a6aa --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpacesCustomOrderManager.java @@ -0,0 +1,29 @@ +package edu.asu.diging.vspace.core.services; + +import java.util.List; + +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.model.ISpacesCustomOrder; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; + +public interface ISpacesCustomOrderManager { + + Iterable findAll(); + + void addSpaceToCustomOrders(ISpace space); + + void save(Iterable spacesCustomOrder); + + ISpacesCustomOrder get(String customSpaceOrderId); + + void updateNameAndDescription(String spacesCustomOrderId, String title, String description); + + void updateSpaces(String spacesCustomOrderId, List spaceOrders); + + ISpacesCustomOrder create(List spaceOrders, String name, String description); + + void setExhibitionSpacesCustomOrder(String customOrderId); + + void delete(String id); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java index 516cd81c1..f19c78294 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java @@ -18,6 +18,7 @@ import edu.asu.diging.vspace.core.data.ExhibitionRepository; import edu.asu.diging.vspace.core.exception.LanguageListConfigurationNotFoundException; import edu.asu.diging.vspace.core.factory.impl.ExhibitionFactory; +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.IExhibitionLanguage; import edu.asu.diging.vspace.core.model.impl.Exhibition; @@ -94,6 +95,7 @@ public IExhibition getStartExhibition() { } return exhibition; } + /** * Updates the Exhibition with given list of languages. It fetches the language from exhibitionLanguageConfig using code. @@ -153,4 +155,12 @@ private IExhibitionLanguage addExhibitionLanguage(IExhibition exhibition, Map la return exhibitionLanguage; } + + @Override + public IExhibition updateSpaceOrderMode(ExhibitionSpaceOrderMode mode) { + Exhibition exhibition = (Exhibition) getStartExhibition(); + exhibition.setSpaceOrderMode(mode); + return exhibitRepo.save(exhibition); + } + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionSpaceOrderUtility.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionSpaceOrderUtility.java new file mode 100644 index 000000000..2e9b9a4f4 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionSpaceOrderUtility.java @@ -0,0 +1,111 @@ +package edu.asu.diging.vspace.core.services.impl; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.model.impl.SpaceStatus; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.IExhibitionSpaceOrderUtility; + +/** + * Utility class for Exhibition Spaces custom order + * @author prachikharge + * + */ +@Component +public class ExhibitionSpaceOrderUtility implements IExhibitionSpaceOrderUtility { + + @Autowired + private IExhibitionManager exhibitionManager; + + /** + * Sorts the spaces in alphabetical order by name (case-insensitive). + * This method sorts the spaces in place, so the passed-in list of spaces + * will be sorted after the method is done. + * + * @param publishedSpaces the list of spaces to be sorted alphabetically + * @return the same list of spaces, now sorted alphabetically by name + */ + private List sortSpacesAlphabetically(List publishedSpaces){ + Collections.sort(publishedSpaces, new Comparator() { + @Override + public int compare(ISpace space1, ISpace space2) { + return (space1.getName().toLowerCase()).compareTo(space2.getName().toLowerCase()); + } + }); + return publishedSpaces; + } + + /** + * Sorts the spaces based on their creation date in ascending order. + * This method sorts the spaces in place, so the passed-in list of spaces + * will be sorted after the method is done. + * + * @param publishedSpaces the list of spaces to be sorted by creation date + * @return the same list of spaces, now sorted by creation date + */ + private List sortSpacesOnCreationDate(List publishedSpaces){ + Collections.sort(publishedSpaces, new Comparator() { + @Override + public int compare(ISpace space1, ISpace space2) { + return (space1.getCreationDate()).compareTo(space2.getCreationDate()); + } + }); + return publishedSpaces; + } + + /** + * Sorts the spaces based on user-defined custom order. + * If no custom order is defined (spacesCustomOrder is null), the method + * falls back to alphabetical sorting and the passed-in list will be modified. + * Otherwise, a new filtered list is returned containing only published spaces + * from the custom order, and the original passed-in list remains unchanged. + * + * @param publishedSpaces the list of spaces to be sorted (may or may not be modified) + * @return either the same list sorted alphabetically (if no custom order exists) + * or a new filtered list based on custom order containing only published spaces + */ + private List sortSpacesByCustomOrder(List publishedSpaces){ + IExhibition exhibition = exhibitionManager.getStartExhibition(); + SpacesCustomOrder spacesCustomOrder = exhibition.getSpacesCustomOrder(); + if(spacesCustomOrder == null) { + return sortSpacesAlphabetically(publishedSpaces); + } + List allSpaces = spacesCustomOrder.getCustomOrderedSpaces(); + + //only show published spaces + return allSpaces.stream() + .filter(space -> space.getSpaceStatus() == SpaceStatus.PUBLISHED) + .collect(Collectors.toList()); + } + + /** + * Sorts the spaces based on the specified ordering mode. + * + * @param publishedSpaces the list of spaces to be sorted + * @param mode the ordering mode to apply (ALPHABETICAL, CREATION_DATE, or CUSTOM). + * If null, defaults to ALPHABETICAL ordering + * @return the sorted list of spaces according to the specified mode. + * Note: For ALPHABETICAL and CREATION_DATE modes, the original list is modified in place. + * For CUSTOM mode, behavior depends on whether custom order exists - see sortSpacesByCustomOrder() + */ + @Override + public List sortSpaces(List publishedSpaces, ExhibitionSpaceOrderMode mode){ + if(mode == null || mode == ExhibitionSpaceOrderMode.ALPHABETICAL) { + return sortSpacesAlphabetically(publishedSpaces); + } else if(mode == ExhibitionSpaceOrderMode.CREATION_DATE) { + return sortSpacesOnCreationDate(publishedSpaces); + } else { + return sortSpacesByCustomOrder(publishedSpaces); + } + } +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java index 297143ead..169883911 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java @@ -23,6 +23,7 @@ import edu.asu.diging.vspace.core.data.ImageRepository; import edu.asu.diging.vspace.core.data.SpaceLinkRepository; import edu.asu.diging.vspace.core.data.SpaceRepository; +import edu.asu.diging.vspace.core.data.SpacesCustomOrderRepository; import edu.asu.diging.vspace.core.data.display.SpaceDisplayRepository; import edu.asu.diging.vspace.core.data.display.SpaceLinkDisplayRepository; import edu.asu.diging.vspace.core.exception.FileStorageException; @@ -30,6 +31,7 @@ import edu.asu.diging.vspace.core.factory.IImageFactory; import edu.asu.diging.vspace.core.factory.ISpaceDisplayFactory; import edu.asu.diging.vspace.core.file.IStorageEngine; +import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.SortByField; @@ -39,10 +41,13 @@ import edu.asu.diging.vspace.core.model.impl.Space; import edu.asu.diging.vspace.core.model.impl.SpaceLink; import edu.asu.diging.vspace.core.model.impl.SpaceStatus; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; import edu.asu.diging.vspace.core.model.impl.VSImage; import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.IExhibitionSpaceOrderUtility; import edu.asu.diging.vspace.core.services.IImageService; import edu.asu.diging.vspace.core.services.ISpaceManager; +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; import edu.asu.diging.vspace.core.services.impl.model.ImageData; @Transactional @@ -83,6 +88,16 @@ public class SpaceManager implements ISpaceManager { @Autowired private SpaceLinkDisplayRepository spaceLinkDisplayRepo; + @Autowired + private IExhibitionSpaceOrderUtility exhibitionSpaceOrderUtility; + + @Autowired + private ISpacesCustomOrderManager spacesCustomOrderManager; + + @Autowired + private SpacesCustomOrderRepository spacesCustomOrderRepo; + + @Value("${page_size}") private int pageSize; @@ -243,6 +258,14 @@ public void deleteSpaceById(String id) { Optional space = spaceRepo.findById(id); if (space.isPresent()) { fromSpaceLinks = spaceLinkRepo.findByTargetSpace(space.get()); + + //To remove the current space from all existing custom orders + Iterable spacesCustomOrder = spacesCustomOrderManager.findAll(); + for(SpacesCustomOrder spaceCustomOrder : spacesCustomOrder) { + if(spaceCustomOrder.getCustomOrderedSpaces().remove(space.get())) { + spacesCustomOrderRepo.save(spaceCustomOrder); + } + } } Exhibition exhibition = (Exhibition) exhibitionManager.getStartExhibition(); // When space has other links attached to it @@ -388,4 +411,23 @@ public int getTotalSpaceCount(String searchTerm) { } } + + /** + * Method to sort published spaces based on the given order, i.e Alphabetical, + * Creation Date, or, Custom + * @param publishedSpaces + */ + @Override + public List sortPublishedSpacesByGivenOrder(List publishedSpaces) { + IExhibition exhibition = exhibitionManager.getStartExhibition(); + return exhibitionSpaceOrderUtility.sortSpaces(publishedSpaces, exhibition.getSpaceOrderMode()); + } + + @Override + public void addSpaceToCustomOrders(ISpace space) { + spacesCustomOrderManager.addSpaceToCustomOrders(space); + + } + + } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpacesCustomOrderManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpacesCustomOrderManager.java new file mode 100644 index 000000000..80228c682 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpacesCustomOrderManager.java @@ -0,0 +1,156 @@ +package edu.asu.diging.vspace.core.services.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.persistence.EntityNotFoundException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import edu.asu.diging.vspace.core.data.SpacesCustomOrderRepository; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.model.ISpacesCustomOrder; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.SpaceStatus; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.ISpaceManager; +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; + +/** + * SpacesCustomOrderManager is the manager + * to allow custom ordering of spaces + * @author Glen D'souza + * + */ + +@Service +@Transactional(rollbackFor = { Exception.class }) +public class SpacesCustomOrderManager implements ISpacesCustomOrderManager { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private SpacesCustomOrderRepository spacesCustomOrderRepository; + + @Autowired + private ISpaceManager spaceManager; + + @Autowired + private IExhibitionManager exhibitionManager; + + @Override + public ISpacesCustomOrder create(List spaceOrders, + String name, + String description) { + SpacesCustomOrder spacesCustomOrder = new SpacesCustomOrder(); + spacesCustomOrder.setCustomOrderName(name); + spacesCustomOrder.setDescription(description); + List orderedSpaces = spaceOrders.stream() + .map(spaceId -> spaceManager.getSpace(spaceId)) + .collect(Collectors.toList()); + spacesCustomOrder.setCustomOrderedSpaces(orderedSpaces); + return spacesCustomOrderRepository.save(spacesCustomOrder); + } + + + @Override + public Iterable findAll(){ + return spacesCustomOrderRepository.findAll(); + } + + @Override + public ISpacesCustomOrder get(String customSpaceOrderId) { + Optional spacesCustomOrderOptional = spacesCustomOrderRepository.findById(customSpaceOrderId); + if(spacesCustomOrderOptional.isPresent()) { + return spacesCustomOrderOptional.get(); + } + return null; + } + + @Override + public void save(Iterable spacesCustomOrder) { + spacesCustomOrderRepository.saveAll(spacesCustomOrder); + } + + /** + * This method adds the newly created spaces to all custom orders at the end of the list + * @param space + */ + @Override + public void addSpaceToCustomOrders(ISpace space) { + Iterable spacesCustomOrders = findAll(); + for(ISpacesCustomOrder spaceCustomOrder : spacesCustomOrders) { + spaceCustomOrder.getCustomOrderedSpaces().add(space); + } + save(spacesCustomOrders); + } + + + + @Override + /** + * This method updates the custom order name and description + * @param spacesCustomOrderId + * @param title + * @param description + */ + public void updateNameAndDescription(String spacesCustomOrderId, String title, String description) { + ISpacesCustomOrder spaceCustomOrder = get(spacesCustomOrderId); + spaceCustomOrder.setCustomOrderName(title); + spaceCustomOrder.setDescription(description); + spacesCustomOrderRepository.save((SpacesCustomOrder)spaceCustomOrder); + } + + /** + * This method updated custom order of spaces + * @param spacesCustomOrderId + * @param spacesIds + */ + @Override + public void updateSpaces(String spacesCustomOrderId, List spacesIds) { + List spaces = new ArrayList(); + spacesIds.stream().filter(spaceId -> spaceManager.getSpace(spaceId) != null) + .map(id -> spaces.add(spaceManager.getSpace(id))); + ISpacesCustomOrder spaceCustomOrder = get(spacesCustomOrderId); + spaceCustomOrder.setCustomOrderedSpaces(spaces); + spacesCustomOrderRepository.save((SpacesCustomOrder)spaceCustomOrder); + } + + /** + * This method sets the custom order to be used on exhibition page + * @param customOrderId + */ + @Override + public void setExhibitionSpacesCustomOrder(String customOrderId) { + IExhibition exhibition = exhibitionManager.getStartExhibition(); + Optional spacesCustomOrder = spacesCustomOrderRepository + .findById(customOrderId); + if(spacesCustomOrder.isPresent()) + exhibition.setSpacesCustomOrder(spacesCustomOrder.get()); + } + + /** + * This method deletes the @{SpaceCustomOrder} object with the given id. + * @param id + */ + @Override + public void delete(String id) { + IExhibition exhibition = exhibitionManager.getStartExhibition(); + SpacesCustomOrder spaceCustomOrder = exhibition + .getSpacesCustomOrder(); + if(spaceCustomOrder!=null && spaceCustomOrder.getId().equals(id)) { + exhibition.setSpacesCustomOrder(null); + exhibitionManager.storeExhibition((Exhibition)exhibition); + } + spacesCustomOrderRepository.deleteById(id); + } +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java index dc7738b8a..892b79c43 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java @@ -13,10 +13,8 @@ import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.display.ISpaceLinkDisplay; -import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; import edu.asu.diging.vspace.core.model.impl.SequenceHistory; import edu.asu.diging.vspace.core.model.impl.SpaceStatus; -import edu.asu.diging.vspace.core.services.IExhibitionAboutPageManager; import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.IExternalLinkManager; import edu.asu.diging.vspace.core.services.IModuleLinkManager; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java index 587ec6df5..8f2849c1d 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java @@ -81,6 +81,10 @@ public String addSpace(Model model, @ModelAttribute SpaceForm spaceForm, @Reques creationValue = spaceManager.storeSpace(space, bgImage, filename); } + + //add new space to all custom space orders + spaceManager.addSpaceToCustomOrders(space); + if (creationValue != null) { return "redirect:/staff/space/" + creationValue.getElement().getId(); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpacesCustomOrderController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpacesCustomOrderController.java new file mode 100644 index 000000000..52f3ece8e --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpacesCustomOrderController.java @@ -0,0 +1,49 @@ +package edu.asu.diging.vspace.web.staff; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.services.ISpaceManager; +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; + +@Controller +public class AddSpacesCustomOrderController { + + @Autowired + private ISpacesCustomOrderManager spacesCustomOrderManager; + + @Autowired + private ISpaceManager spaceManager; + + @RequestMapping(value = "/staff/space/order/add", method = RequestMethod.GET) + public String addSpacesCustomOrders(Model model) { + model.addAttribute("spaces", spaceManager.getAllSpaces()); + return "staff/spaces/customorder/add"; + } + + @RequestMapping(value = "/staff/space/order/customorder/add", method = RequestMethod.POST) + public String createCustomOrder(Model model, @RequestParam("spaceOrder") List spaceOrders, + @RequestParam("name") String name, + @RequestParam("description") String description, RedirectAttributes attributes) { + if(name == null || name.isEmpty()) { + attributes.addFlashAttribute("alertType", "danger"); + attributes.addFlashAttribute("message", "Custom order could not be saved. Please enter the name of the order."); + attributes.addFlashAttribute("showAlert", "true"); + return "redirect:/staff/space/order/add"; + } + spacesCustomOrderManager.create(spaceOrders, name, description); + attributes.addFlashAttribute("alertType", "success"); + attributes.addFlashAttribute("message", "Custom Order has been successfully added."); + attributes.addFlashAttribute("showAlert", "true"); + return "redirect:/staff/space/order"; + } + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpacesCustomOrderController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpacesCustomOrderController.java new file mode 100644 index 000000000..5bac9a1f2 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpacesCustomOrderController.java @@ -0,0 +1,30 @@ +package edu.asu.diging.vspace.web.staff; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; + +@Controller +public class DeleteSpacesCustomOrderController { + + @Autowired + private ISpacesCustomOrderManager spacesCustomOrderManager; + + @RequestMapping(value = "/staff/space/customorder/{orderId}", method = RequestMethod.POST) + public String deleteSpacesCustomOrder(@PathVariable String orderId, Model model, RedirectAttributes attributes) { + spacesCustomOrderManager.delete(orderId); + attributes.addFlashAttribute("alertType", "success"); + attributes.addFlashAttribute("message", "Custom Order has been successfully deleted."); + attributes.addFlashAttribute("showAlert", "true"); + return "redirect:/staff/space/order"; + } + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpacesCustomOrderController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpacesCustomOrderController.java new file mode 100644 index 000000000..a3f975cfd --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpacesCustomOrderController.java @@ -0,0 +1,57 @@ +package edu.asu.diging.vspace.web.staff; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; + +@Controller +public class EditSpacesCustomOrderController { + + @Autowired + private ISpacesCustomOrderManager spacesCustomOrderManager; + + @RequestMapping(value = "/staff/space/order/{customOrderId}/edit/info", method = RequestMethod.POST) + public String saveTitleDescription( + @RequestParam("title") String title, + @RequestParam("description") String description, + @PathVariable("customOrderId") String spacesCustomOrderId, + RedirectAttributes attributes) { + if(title == null || title.isEmpty()) { + attributes.addFlashAttribute("alertType", "danger"); + attributes.addFlashAttribute("message", "Custom order could not be updated. The title field is empty."); + attributes.addFlashAttribute("showAlert", "true"); + return "redirect:/staff/space/order/"+spacesCustomOrderId; + } + spacesCustomOrderManager.updateNameAndDescription(spacesCustomOrderId, title, description); + attributes.addFlashAttribute("alertType", "success"); + attributes.addFlashAttribute("message", "Custom order info has been updated."); + attributes.addFlashAttribute("showAlert", "true"); + return "redirect:/staff/space/order/"+spacesCustomOrderId; + } + + @RequestMapping(value = "/staff/space/order/{customOrderId}/edit/spaceorders", method = RequestMethod.POST) + public String saveOrder( + @PathVariable("customOrderId") String spacesCustomOrderId, + @RequestParam("spaceOrder") List spaceOrders, + RedirectAttributes attributes) { + spacesCustomOrderManager.updateSpaces(spacesCustomOrderId, spaceOrders); + attributes.addFlashAttribute("alertType", "success"); + attributes.addFlashAttribute("message", "The order of spaces has been updated."); + attributes.addFlashAttribute("showAlert", "true"); + return "redirect:/staff/space/order/"+spacesCustomOrderId; + } + + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ListSpacesController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ListSpacesController.java index da619a95d..9245e5e93 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ListSpacesController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ListSpacesController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import edu.asu.diging.vspace.core.data.SpaceRepository; +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.ISpaceManager; @@ -24,9 +25,10 @@ public class ListSpacesController { @RequestMapping("/staff/space/list") public String listSpaces(Model model) { - - model.addAttribute("spaces", spaceManager.addIncomingLinkInfoToSpaces(spaceRepo.findAll())); IExhibition startExhibition = exhibitionManager.getStartExhibition(); + ExhibitionSpaceOrderMode currentMode = startExhibition.getSpaceOrderMode(); + model.addAttribute("spaces", spaceManager.addIncomingLinkInfoToSpaces(spaceRepo.findAll())); + model.addAttribute("currentMode", currentMode); if(startExhibition!=null) { model.addAttribute("startSpace", startExhibition.getStartSpace()); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java index e36571afb..f0b3642ea 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java @@ -47,6 +47,7 @@ public class SpaceController { @Autowired private IExternalLinkManager externalLinkManager; + @Autowired private ISpaceTextBlockManager spaceTextBlockManager; @@ -83,4 +84,5 @@ public ResponseEntity> showSpaceLinks(@PathVariable String id return new ResponseEntity<>(responseData, HttpStatus.OK); } + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpacesCustomOrderController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpacesCustomOrderController.java new file mode 100644 index 000000000..823535f47 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpacesCustomOrderController.java @@ -0,0 +1,34 @@ +package edu.asu.diging.vspace.web.staff; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import edu.asu.diging.vspace.core.model.ISpacesCustomOrder; +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; + +/** + * SpacesCustomOrderController is the controller + * to allow custom ordering of spaces + * @author Glen D'souza + * + */ + +@Controller +public class SpacesCustomOrderController { + + @Autowired + private ISpacesCustomOrderManager spacesCustomOrderManager; + + @RequestMapping(value = "/staff/space/order/{orderId}", method = RequestMethod.GET) + public String displaySpacesCustomOrder(Model model, @PathVariable("orderId") String customSpaceOrderId) { + ISpacesCustomOrder spacesCustomOrder = spacesCustomOrderManager.get(customSpaceOrderId); + model.addAttribute("customSpaceOrder", spacesCustomOrder); + model.addAttribute("selectedSpaces", spacesCustomOrder.getCustomOrderedSpaces()); + return "/staff/spaces/customorder/order"; + } + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSpaceCustomOrderController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSpaceCustomOrderController.java new file mode 100644 index 000000000..1eda30999 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSpaceCustomOrderController.java @@ -0,0 +1,44 @@ +package edu.asu.diging.vspace.web.staff; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.ISpacesCustomOrderManager; + +/** + * StaffSpaceCustomOrderController is the controller + * to set mode of order of spaces on exhibition side, change custom order selection + * @author Tushar Anand + * + */ + +@Controller +public class StaffSpaceCustomOrderController { + + @Autowired + private ISpacesCustomOrderManager spacesCustomOrderManager; + + @Autowired + private IExhibitionManager exhibitionManager; + + @RequestMapping(value = "/staff/space/order", method = RequestMethod.GET) + public String displayCustomOrders(Model model) { + model.addAttribute("customSpaceOrders", spacesCustomOrderManager.findAll()); + model.addAttribute("currentSelectedCustomOrder", exhibitionManager.getStartExhibition().getSpacesCustomOrder()); + return "/staff/spaces/customorder/customordering"; + } + + @RequestMapping(value = "/staff/space/order/{orderId}/set", method = RequestMethod.POST) + public String setExhibitionSpacesCustomOrder(Model model, + @RequestParam("selectedCustomOrderId") String orderId) { + spacesCustomOrderManager.setExhibitionSpacesCustomOrder(orderId); + return "redirect:/staff/space/order"; + } + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateSpaceStatusController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateSpaceStatusController.java index 02be0666f..afa6df6f1 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateSpaceStatusController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateSpaceStatusController.java @@ -14,7 +14,6 @@ import edu.asu.diging.vspace.core.model.impl.SpaceStatus; import edu.asu.diging.vspace.core.services.ISpaceManager; - @Controller public class UpdateSpaceStatusController { @Autowired diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateStaffSpaceOrderModeController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateStaffSpaceOrderModeController.java new file mode 100644 index 000000000..4d9dd65c4 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateStaffSpaceOrderModeController.java @@ -0,0 +1,24 @@ +package edu.asu.diging.vspace.web.staff; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; +import edu.asu.diging.vspace.core.services.IExhibitionManager; + + +@Controller +public class UpdateStaffSpaceOrderModeController { + + @Autowired + private IExhibitionManager exhibitionManager; + + @RequestMapping(value = "/staff/space/order/mode", method = RequestMethod.POST) + public String updateSpaceOrderMode(String mode, @RequestParam ExhibitionSpaceOrderMode spaceOrderMode) { + exhibitionManager.updateSpaceOrderMode(spaceOrderMode); + return "redirect:/staff/space/list"; + } +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpacesCustomOrderForm.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpacesCustomOrderForm.java new file mode 100644 index 000000000..69f6c82db --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpacesCustomOrderForm.java @@ -0,0 +1,40 @@ +package edu.asu.diging.vspace.web.staff.forms; + +import java.util.List; + +import edu.asu.diging.vspace.core.model.ISpace; + +public class SpacesCustomOrderForm { + + private String name; + private String description; + + private List orderedSpaces; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getOrderedSpaces() { + return orderedSpaces; + } + + public void setOrderedSpaces(List orderedSpaces) { + this.orderedSpaces = orderedSpaces; + } + + + +} diff --git a/vspace/src/main/webapp/WEB-INF/views/layouts/main_staff.html b/vspace/src/main/webapp/WEB-INF/views/layouts/main_staff.html index 7505d7521..b0658e0d8 100644 --- a/vspace/src/main/webapp/WEB-INF/views/layouts/main_staff.html +++ b/vspace/src/main/webapp/WEB-INF/views/layouts/main_staff.html @@ -70,17 +70,32 @@ +
-
+
[[${#request.getParameter('message')}]]
+
+ [[${message}]] + +
diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/add.html b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/add.html new file mode 100644 index 000000000..4264ce911 --- /dev/null +++ b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/add.html @@ -0,0 +1,106 @@ + + + + + + + + + + +
+
+ + Go Back +
+

Add New Custom Order

+ +
+ +
+ + +
+
+ + +
+
Drag and drop to arrange spaces
+ +
+
+
+

[[${selectedSpace.name}]]

+
+
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/customordering.html b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/customordering.html new file mode 100644 index 000000000..bed5c4d8b --- /dev/null +++ b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/customordering.html @@ -0,0 +1,80 @@ + + + + + + +
+ + New Order +

Custom Orders for Spaces

+
This virtual exhibition contains the following custom orders for spaces.
+
+
+ +
Select Custom Order to be used
+ + +
+
+
+
+

Custom Orders

+
+ +
+
+ + + + + diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/order.html b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/order.html new file mode 100644 index 000000000..bfbe63667 --- /dev/null +++ b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/customorder/order.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + +
+
+ + Go Back +
+
+ + +
+ +
+
+
+

+ Custom Space Order: + [[${customSpaceOrder.customOrderName}]] +

+
+ + Edit +
+
+

[[${customSpaceOrder.description}]]

+
+ +
+
+ Drag and drop to arrange spaces +
+
+ + +
+
+
+

[[${selectedSpace.name}]]

+
+
+
+
+ +
+
+ +
+ + +
+ + + + +
+ + diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/spacelist.html b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/spacelist.html index 9833d4fb6..239b1878c 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/spacelist.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/spacelist.html @@ -2,12 +2,19 @@ + @@ -61,8 +83,32 @@

Spaces

This virtual exhibition contains the following spaces. - indicates the start space. -
+ indicates the start space. + +
+
+ Select how you want to arrange this in the exhibition navigation bar +
+
+ +

Select spaces display order.

+ + +
+ + +
+ +
- \ No newline at end of file diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionSpaceOrderUtilityTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionSpaceOrderUtilityTest.java new file mode 100644 index 000000000..a27393561 --- /dev/null +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionSpaceOrderUtilityTest.java @@ -0,0 +1,112 @@ +package edu.asu.diging.vspace.core.services.impl; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import edu.asu.diging.vspace.core.model.ExhibitionSpaceOrderMode; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.Space; +import edu.asu.diging.vspace.core.model.impl.SpaceStatus; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; +import edu.asu.diging.vspace.core.services.IExhibitionManager; + +public class ExhibitionSpaceOrderUtilityTest { + + @Mock + private IExhibitionManager exhibitionManager; + + @InjectMocks + private ExhibitionSpaceOrderUtility exhibitionSpaceOrderUtility; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void test_sortSpaces_creationDate() { + ISpace space1 = new Space(); + space1.setCreationDate(OffsetDateTime.now()); + ISpace space2 = new Space(); + space2.setCreationDate(OffsetDateTime.now()); + List publishedSpaces = new ArrayList(); + publishedSpaces.add(space2); + publishedSpaces.add(space1); + List actualSpaces = exhibitionSpaceOrderUtility.sortSpaces(publishedSpaces, ExhibitionSpaceOrderMode.CREATION_DATE); + publishedSpaces.clear(); + publishedSpaces.add(space2); + publishedSpaces.add(space1); + Assert.assertEquals(publishedSpaces, actualSpaces); + } + + @Test + public void test_sortSpaces_alphabetical() { + ISpace space1 = new Space(); + space1.setName("Name 1"); + ISpace space2 = new Space(); + space2.setName("Name 2"); + List publishedSpaces = new ArrayList(); + publishedSpaces.add(space2); + publishedSpaces.add(space1); + List actualSpaces = exhibitionSpaceOrderUtility.sortSpaces(publishedSpaces, ExhibitionSpaceOrderMode.ALPHABETICAL); + publishedSpaces.clear(); + publishedSpaces.add(space1); + publishedSpaces.add(space2); + Assert.assertEquals(publishedSpaces, actualSpaces); + } + + @Test + public void test_sortSpaces_customOrder() { + ISpace space1 = new Space(); + space1.setName("Name 1"); + space1.setSpaceStatus(SpaceStatus.PUBLISHED); + ISpace space2 = new Space(); + space2.setName("Name 2"); + space2.setSpaceStatus(SpaceStatus.PUBLISHED); + List publishedSpaces = new ArrayList(); + publishedSpaces.add(space2); + publishedSpaces.add(space1); + + IExhibition exhibition = new Exhibition(); + SpacesCustomOrder spacesCustomOrder = new SpacesCustomOrder(); + spacesCustomOrder.setCustomOrderedSpaces(publishedSpaces); + exhibition.setSpacesCustomOrder(spacesCustomOrder); + Mockito.when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + + List actualSpaces = exhibitionSpaceOrderUtility.sortSpaces(publishedSpaces, ExhibitionSpaceOrderMode.CUSTOM); + Assert.assertEquals(publishedSpaces, actualSpaces); + } + + @Test + public void test_sortSpaces_customOrderNotSet() { + ISpace space1 = new Space(); + space1.setName("Name 1"); + space1.setSpaceStatus(SpaceStatus.PUBLISHED); + ISpace space2 = new Space(); + space2.setName("Name 2"); + space2.setSpaceStatus(SpaceStatus.PUBLISHED); + List publishedSpaces = new ArrayList(); + publishedSpaces.add(space2); + publishedSpaces.add(space1); + + IExhibition exhibition = new Exhibition(); + Mockito.when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + + List actualSpaces = exhibitionSpaceOrderUtility.sortSpaces(publishedSpaces, ExhibitionSpaceOrderMode.CUSTOM); + publishedSpaces.clear(); + publishedSpaces.add(space1); + publishedSpaces.add(space2); + Assert.assertEquals(publishedSpaces, actualSpaces); + } +} \ No newline at end of file diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java index 671fa628f..910f9c0da 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java @@ -73,6 +73,7 @@ public class SpaceManagerTest { @Mock private ExhibitionManager exhibitionManager; + @InjectMocks @@ -84,6 +85,7 @@ public class SpaceManagerTest { private String spaceId1, spaceId2; private String spaceLinkId1; private SpaceLink spaceLink; + List publishedSpaces = new ArrayList(); @Before public void setUp() { @@ -91,6 +93,7 @@ public void setUp() { spaceId1 = "SPA000000001"; spaceId2 = "SPA000000001"; spaceLinkId1 = "SPL000000001"; + } @@ -301,5 +304,6 @@ public void test_getSpacesWithImageId_ImageIdIsInValid(){ public void test_getSpacesWithImageId_ImageIdIsNull(){ Assert.assertNull(managerToTest.getSpacesWithImageId(null)); } + } diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpacesCustomOrderManagerTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpacesCustomOrderManagerTest.java new file mode 100644 index 000000000..66b509864 --- /dev/null +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpacesCustomOrderManagerTest.java @@ -0,0 +1,117 @@ +package edu.asu.diging.vspace.core.services.impl; + +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import edu.asu.diging.vspace.core.data.SpacesCustomOrderRepository; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.Space; +import edu.asu.diging.vspace.core.model.impl.SpacesCustomOrder; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.ISpaceManager; + +public class SpacesCustomOrderManagerTest{ + + @Mock + private SpacesCustomOrderRepository spacesCustomOrderRepository; + + @Mock + private ISpaceManager spaceManager; + + @Mock + private IExhibitionManager exhibitionManager; + + @InjectMocks + private SpacesCustomOrderManager serviceToTest; + + private String spaceCustomOrderId1, spaceCustomOrderId2; + private IExhibition exhibition = new Exhibition(); + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + spaceCustomOrderId1 = "SPC000000001"; + spaceCustomOrderId2 = "SPC000000001"; + } + + @Test + public void test_deleteSpaceCustomOrderById_customOrderNotSet() { + Mockito.when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + serviceToTest.delete(spaceCustomOrderId1); + Mockito.verify(spacesCustomOrderRepository).deleteById(spaceCustomOrderId1); + } + + @Test + public void test_deleteSpaceCustomOrderById_customOrderSet() { + SpacesCustomOrder spacesCustomOrder = new SpacesCustomOrder(); + spacesCustomOrder.setId(spaceCustomOrderId1); + exhibition.setSpacesCustomOrder(spacesCustomOrder); + Mockito.when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + serviceToTest.delete(spaceCustomOrderId1); + Mockito.verify(spacesCustomOrderRepository).deleteById(spaceCustomOrderId1); + Mockito.verify(exhibitionManager).storeExhibition((Exhibition)exhibition); + } + + @Test + public void test_updateSpaces_success() { + String spaceId1 = "SPC001"; + String spaceId2 = "SPC002"; + List spaceIdList = new ArrayList(); + spaceIdList.add(spaceId1); + spaceIdList.add(spaceId2); + SpacesCustomOrder spacesCustomOrder = new SpacesCustomOrder(); + when(spacesCustomOrderRepository.findById(spaceCustomOrderId1)).thenReturn(Optional.of(spacesCustomOrder)); + serviceToTest.updateSpaces(spaceCustomOrderId1, spaceIdList); + Mockito.verify(spacesCustomOrderRepository).save(spacesCustomOrder); + } + + @Test + public void test_addSpacesToCustomOrders_success() { + Space space = new Space(); + List spacesCustomOrders = new ArrayList(); + when(spacesCustomOrderRepository.findAll()).thenReturn(spacesCustomOrders); + serviceToTest.addSpaceToCustomOrders(space); + Mockito.verify(spacesCustomOrderRepository).saveAll(spacesCustomOrders); + + } + + @Test + public void test_updateSpacesCustomOrder_updateName() { + String spaceId1 = "SPC001"; + String spaceId2 = "SPC002"; + List spaceIdList = new ArrayList(); + spaceIdList.add(spaceId1); + spaceIdList.add(spaceId2); + SpacesCustomOrder spacesCustomOrder = new SpacesCustomOrder(); + spacesCustomOrder.setCustomOrderName("hello"); + when(spacesCustomOrderRepository.findById(spaceCustomOrderId1)).thenReturn(Optional.of(spacesCustomOrder)); + serviceToTest.updateNameAndDescription(spaceCustomOrderId2, "updated", "name"); + Mockito.verify(spacesCustomOrderRepository).save(spacesCustomOrder); + } + + @Test + public void test_updateSpacesCustomOrder_updateDescription() { + String spaceId1 = "SPC001"; + String spaceId2 = "SPC002"; + List spaceIdList = new ArrayList(); + spaceIdList.add(spaceId1); + spaceIdList.add(spaceId2); + SpacesCustomOrder spacesCustomOrder = new SpacesCustomOrder(); + spacesCustomOrder.setCustomOrderName("hello"); + when(spacesCustomOrderRepository.findById(spaceCustomOrderId1)).thenReturn(Optional.of(spacesCustomOrder)); + serviceToTest.updateNameAndDescription(spaceCustomOrderId2, "updated", "description"); + Mockito.verify(spacesCustomOrderRepository).save(spacesCustomOrder); + } + +} \ No newline at end of file