diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java index 743148ce3..d6adec3d1 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java @@ -87,6 +87,8 @@ public interface IContentBlockManager { */ void deleteSpaceBlockById(String blockId, String slideId) throws BlockDoesNotExistException; + void updateContentOrder(List contentBlockList, ISlide slide) throws BlockDoesNotExistException; + /** * Adjusting the content order of the blocks of slide once it is dragged and * changed position. @@ -97,6 +99,5 @@ public interface IContentBlockManager { void updateContentOrder(List contentBlockList) throws BlockDoesNotExistException; void saveVideoBlock(IVideoBlock videoBlock); - } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExternalLinkManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExternalLinkManager.java index ceddbd672..064084407 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExternalLinkManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExternalLinkManager.java @@ -1,6 +1,7 @@ package edu.asu.diging.vspace.core.services; import edu.asu.diging.vspace.core.exception.ImageCouldNotBeStoredException; +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import edu.asu.diging.vspace.core.exception.LinkDoesNotExistsException; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; import edu.asu.diging.vspace.core.model.IExternalLink; @@ -12,13 +13,11 @@ public interface IExternalLinkManager extends ILinkManager{ IExternalLinkDisplay createLink(String title, String id, float positionX, float positionY, int rotation, String linkedId, - String linkLabel, DisplayType displayType, byte[] linkImage, String imageFilename,ExternalLinkDisplayMode howToOpen) - throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException; + String linkLabel, String desc, DisplayType displayType, byte[] linkImage, String imageFilename,ExternalLinkDisplayMode howToOpen, String imageId) + throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException, ImageDoesNotExistException; IExternalLinkDisplay updateLink(String title, String id, float positionX, float positionY, int rotation, String linkedId, - String linkLabel, String linkId, String linkDisplayId, DisplayType displayType, byte[] linkImage, - String imageFilename,ExternalLinkDisplayMode howToOpen) - throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException; - - + String linkLabel, String desc, String linkId, String linkDisplayId, DisplayType displayType, byte[] linkImage, + String imageFilename, String existingImageId, ExternalLinkDisplayMode howToOpen) + throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException, ImageDoesNotExistException; } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILinkManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILinkManager.java index b34febced..be7690f21 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILinkManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILinkManager.java @@ -3,26 +3,28 @@ import java.util.List; import edu.asu.diging.vspace.core.exception.ImageCouldNotBeStoredException; +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import edu.asu.diging.vspace.core.exception.LinkDoesNotExistsException; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; import edu.asu.diging.vspace.core.model.ILink; import edu.asu.diging.vspace.core.model.IVSpaceElement; import edu.asu.diging.vspace.core.model.display.DisplayType; +import edu.asu.diging.vspace.core.model.display.ExternalLinkDisplayMode; import edu.asu.diging.vspace.core.model.display.ILinkDisplay; public interface ILinkManager, T extends IVSpaceElement, U extends ILinkDisplay> { U createLink(String title, String id, float positionX, float positionY, int rotation, String linkedId, - String linkLabel, DisplayType displayType, byte[] linkImage, String imageFilename) - throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException; + String linkLabel, String linkDesc, DisplayType displayType, byte[] linkImage, String imageFilename, String existingImageId) + throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException, ImageDoesNotExistException; U updateLink(String title, String id, float positionX, float positionY, int rotation, String linkedId, - String linkLabel, String linkId, String linkDisplayId, DisplayType displayType, byte[] linkImage, - String imageFilename) - throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException; + String linkLabel, String linkDesc, String linkId, String linkDisplayId, DisplayType displayType, byte[] linkImage, + String imageFilename, String existingImageId) + throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException, ImageDoesNotExistException; List getLinkDisplays(String spaceId); void deleteLink(String linkId); -} +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java index 872e12ddf..75d3977a6 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java @@ -14,6 +14,7 @@ import edu.asu.diging.vspace.core.data.BiblioBlockRepository; import org.springframework.transaction.annotation.Transactional; + import edu.asu.diging.vspace.core.data.ChoiceContentBlockRepository; import edu.asu.diging.vspace.core.data.ContentBlockRepository; import edu.asu.diging.vspace.core.data.ImageContentBlockRepository; @@ -57,6 +58,7 @@ import edu.asu.diging.vspace.core.model.impl.VideoBlock; import edu.asu.diging.vspace.core.services.IContentBlockManager; import edu.asu.diging.vspace.core.services.ISlideManager; +import edu.asu.diging.vspace.core.services.impl.CreationReturnValue; @Transactional(rollbackFor = { Exception.class }) @Service @@ -273,7 +275,9 @@ public CreationReturnValue createVideoBlock(String slideId, byte[] video, Long s private IVSVideo storeVideo(byte[] video, Long size, String fileName, String url, String title) throws VideoCouldNotBeStoredException { IVSVideo slideContentVideo = null; + if (video != null) { + slideContentVideo = saveVideo(video, size, fileName, title); storeVideoFile(video, slideContentVideo, fileName); slideContentVideo.setUrl(null); @@ -589,12 +593,13 @@ public Integer findMaxContentOrder(String slideId) { * content order corresponding to each blocks. */ @Override - public void updateContentOrder(List contentBlockList) throws BlockDoesNotExistException { + public void updateContentOrder(List contentBlockList, ISlide slide) throws BlockDoesNotExistException { if (contentBlockList == null) { return; } List contentBlocks = new ArrayList<>(); for (ContentBlock eachBlock : contentBlockList) { + eachBlock.setSlide(slide); String blockId = eachBlock.getId(); int contentOrder = eachBlock.getContentOrder(); Optional contentBlock = contentBlockRepository.findById(blockId); @@ -609,6 +614,7 @@ public void updateContentOrder(List contentBlockList) throws Block contentBlockRepository.saveAll(contentBlocks); } + /** * Decreasing content order by 1 of the slide's block which are after the * specified contentOrder diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExternalLinkManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExternalLinkManager.java index b9002df3f..b522456e2 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExternalLinkManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExternalLinkManager.java @@ -25,7 +25,7 @@ import edu.asu.diging.vspace.core.model.impl.ExternalLinkValue; import edu.asu.diging.vspace.core.services.IExternalLinkManager; import edu.asu.diging.vspace.core.services.ISpaceManager; - +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; @Transactional @Service public class ExternalLinkManager extends LinkManager @@ -109,9 +109,10 @@ protected void deleteLinkRepo(IExternalLink link) { @Override public IExternalLinkDisplay createLink(String title, String id, float positionX, float positionY, int rotation, - String linkedId, String linkLabel, DisplayType displayType, byte[] linkImage, String imageFilename, - ExternalLinkDisplayMode howToOpen) - throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException { + String linkedId, String linkLabel, String desc, DisplayType displayType, byte[] linkImage, String imageFilename, + ExternalLinkDisplayMode howToOpen, String imageId ) + throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException, ImageDoesNotExistException { + /* * When createLink is called then inside updateLinkAndDisplay(link, displayLink) @@ -121,7 +122,7 @@ public IExternalLinkDisplay createLink(String title, String id, float positionX, * automatically persist howToOpen in database. */ IExternalLinkDisplay externalLinkDisplay = createLink(title, id, positionX, positionY, rotation, linkedId, - linkLabel, displayType, linkImage, imageFilename); + linkLabel, desc, displayType, linkImage, imageFilename, imageId); externalLinkDisplay.setHowToOpen(howToOpen); return externalLinkDisplay; @@ -129,9 +130,9 @@ public IExternalLinkDisplay createLink(String title, String id, float positionX, @Override public IExternalLinkDisplay updateLink(String title, String id, float positionX, float positionY, int rotation, - String linkedId, String linkLabel, String linkId, String linkDisplayId, DisplayType displayType, - byte[] linkImage, String imageFilename, ExternalLinkDisplayMode howToOpen) - throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException { + String linkedId, String linkLabel, String desc, String linkId, String linkDisplayId, DisplayType displayType, + byte[] linkImage, String imageFilename, String existingImageId, ExternalLinkDisplayMode howToOpen) + throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException, ImageDoesNotExistException { /* * When updateLink is called then inside updateLinkAndDisplay(link, displayLink) @@ -141,7 +142,7 @@ public IExternalLinkDisplay updateLink(String title, String id, float positionX, * automatically persist howToOpen in database. */ IExternalLinkDisplay externalLinkDisplay = updateLink(title, id, positionX, positionY, rotation, linkedId, - linkLabel, linkId, linkDisplayId, displayType, linkImage, imageFilename); + linkLabel, desc, linkId, linkDisplayId, displayType, linkImage, imageFilename, existingImageId); externalLinkDisplay.setHowToOpen(howToOpen); return externalLinkDisplay; } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LinkManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LinkManager.java index 9a4c2c7af..91fac963d 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LinkManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LinkManager.java @@ -16,11 +16,13 @@ import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.IVSpaceElement; import edu.asu.diging.vspace.core.model.display.DisplayType; +import edu.asu.diging.vspace.core.model.display.ExternalLinkDisplayMode; import edu.asu.diging.vspace.core.model.display.ILinkDisplay; import edu.asu.diging.vspace.core.model.impl.VSImage; +import edu.asu.diging.vspace.core.services.IImageService; import edu.asu.diging.vspace.core.services.ILinkManager; import edu.asu.diging.vspace.core.services.ISpaceManager; - +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; @Transactional public abstract class LinkManager, T extends IVSpaceElement, U extends ILinkDisplay> implements ILinkManager { @@ -36,37 +38,66 @@ public abstract class LinkManager, T extends IVSpaceElement, @Autowired private IStorageEngine storage; + + @Autowired + private IImageService imageService; + + protected abstract void deleteLinkRepo(L link); + + protected abstract void deleteLinkDisplayRepo(L link); + + protected abstract void removeFromLinkList(ISpace space, L link); + + protected abstract U updateLinkAndDisplay(L link, U displayLink); + + protected abstract U getDisplayLink(String linkDisplayId) throws LinkDoesNotExistsException; + + protected abstract L getLink(String linkId); + protected abstract L createLinkObject(String title, String id); + + protected abstract T getTarget(String linkedId); + + protected abstract U createDisplayLink(L link); + @Override public U createLink(String title, String id, float positionX, float positionY, int rotation, String linkedId, - String linkLabel, DisplayType displayType, byte[] linkImage, String imageFilename) - throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException { + String linkLabel, String linkDesc, DisplayType displayType, byte[] linkImage, String imageFilename, String existingImageId) + throws SpaceDoesNotExistException, ImageCouldNotBeStoredException, SpaceDoesNotExistException, ImageDoesNotExistException { L link = createLinkObject(title, id); T target = getTarget(linkedId); link.setName(linkLabel); + link.setDescription(linkDesc); link.setTarget(target); U displayLink = createDisplayLink(link); - setDisplayProperties(displayLink, id, positionX, positionY, rotation, displayType, linkImage, imageFilename); + if(existingImageId!=null && !existingImageId.trim().isEmpty()) { + setDisplayProperties(displayLink, positionX, positionY, rotation, displayType, existingImageId); + } else { + setDisplayProperties(displayLink, id, positionX, positionY, rotation, displayType, linkImage, imageFilename); + } return updateLinkAndDisplay(link, displayLink); } - + @Override public U updateLink(String title, String id, float positionX, float positionY, int rotation, String linkedId, - String linkLabel, String linkId, String linkDisplayId, DisplayType displayType, byte[] linkImage, - String imageFilename) - throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException { - + String linkLabel, String linkDesc, String linkId, String linkDisplayId, DisplayType displayType, byte[] linkImage, + String imageFilename, String existingImageId) + throws SpaceDoesNotExistException, LinkDoesNotExistsException, ImageCouldNotBeStoredException, ImageDoesNotExistException { validateSpace(id); - L link = getLink(linkId); T target = getTarget(linkedId); link.setName(title); + link.setDescription(linkDesc); link.setTarget(target); U displayLink = getDisplayLink(linkDisplayId); - setDisplayProperties(displayLink, id, positionX, positionY, rotation, displayType, linkImage, imageFilename); - return updateLinkAndDisplay(link, displayLink); + if(existingImageId!=null && !existingImageId.trim().isEmpty()) { + setDisplayProperties(displayLink, positionX, positionY, rotation, displayType, existingImageId); + } else { + setDisplayProperties(displayLink, id, positionX, positionY, rotation, displayType, linkImage, imageFilename); + } + return updateLinkAndDisplay(link,displayLink); } @Override @@ -77,24 +108,6 @@ public void deleteLink(String linkId) { deleteLinkRepo(link); } - protected abstract void deleteLinkRepo(L link); - - protected abstract void deleteLinkDisplayRepo(L link); - - protected abstract void removeFromLinkList(ISpace space, L link); - - protected abstract U updateLinkAndDisplay(L link, U displayLink); - - protected abstract U getDisplayLink(String linkDisplayId) throws LinkDoesNotExistsException; - - protected abstract L getLink(String linkId); - - protected abstract L createLinkObject(String title, String id); - - protected abstract T getTarget(String linkedId); - - protected abstract U createDisplayLink(L link); - protected void validateSpace(String id) throws SpaceDoesNotExistException { ISpace source = spaceManager.getSpace(id); if (source == null) { @@ -102,13 +115,18 @@ protected void validateSpace(String id) throws SpaceDoesNotExistException { } } + protected void setLinkDisplay(ILinkDisplay linkDisplay, float positionX, float positionY, int rotation, DisplayType displayType) { + linkDisplay.setPositionX(positionX); + linkDisplay.setPositionY(positionY); + linkDisplay.setRotation(rotation); + linkDisplay.setType(displayType != null ? displayType : DisplayType.ARROW); + } protected void setDisplayProperties(ILinkDisplay linkDisplay, String id, float positionX, float positionY, int rotation, DisplayType displayType, byte[] linkImage, String imageFilename) throws ImageCouldNotBeStoredException { - linkDisplay.setPositionX(positionX); - linkDisplay.setPositionY(positionY); - linkDisplay.setRotation(rotation); - linkDisplay.setType(displayType != null ? displayType : DisplayType.ARROW); + + setLinkDisplay(linkDisplay, positionX, positionY, rotation, displayType); + if (linkImage != null && linkImage.length > 0) { Tika tika = new Tika(); String contentType = tika.detect(linkImage); @@ -125,4 +143,15 @@ protected void setDisplayProperties(ILinkDisplay linkDisplay, String id, float p linkDisplay.setImage(image); } } + + protected void setDisplayProperties(ILinkDisplay linkDisplay, float positionX, float positionY, int rotation, + DisplayType displayType, String existingImageId) throws ImageCouldNotBeStoredException, ImageDoesNotExistException { + setLinkDisplay(linkDisplay, positionX, positionY, rotation, displayType); + if(existingImageId!=null && !existingImageId.trim().isEmpty()) { + IVSImage image = imageService.getImageById(existingImageId); + linkDisplay.setImage(image); + } + + } + } 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..686643e54 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 @@ -387,5 +387,4 @@ public int getTotalSpaceCount(String searchTerm) { return (int) spaceRepo.count(); } } - } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddExternalLinkController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddExternalLinkController.java index 660735218..ec1e2cd97 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddExternalLinkController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddExternalLinkController.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import edu.asu.diging.vspace.core.exception.ImageCouldNotBeStoredException; +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.display.DisplayType; @@ -37,16 +38,19 @@ public class AddExternalLinkController { public ResponseEntity createExternalLink(@PathVariable("id") String id, @RequestParam("x") String x, @RequestParam("y") String y, @RequestParam("externalLinkLabel") String title, @RequestParam("url") String externalLink, @RequestParam("tabOpen") String howToOpen, - @RequestParam("type") String displayType, @RequestParam("externalLinkImage") MultipartFile file) - throws NumberFormatException, SpaceDoesNotExistException, IOException, ImageCouldNotBeStoredException { + @RequestParam("type") String displayType, @RequestParam(value="externalLinkImage", required=false) MultipartFile file, + @RequestParam(value="externalLink-imageId", required=false) String imageId) + throws NumberFormatException, SpaceDoesNotExistException, IOException, ImageCouldNotBeStoredException, ImageDoesNotExistException { ISpace space = spaceManager.getSpace(id); + String desc = ""; if (space == null) { return new ResponseEntity<>("{'error': 'Space could not be found.'}", HttpStatus.NOT_FOUND); } byte[] linkImage = null; String filename = null; + if (file != null) { linkImage = file.getBytes(); filename = file.getOriginalFilename(); @@ -55,7 +59,8 @@ public ResponseEntity createExternalLink(@PathVariable("id") String id, ExternalLinkDisplayMode externalLinkOpenMode = howToOpen.isEmpty() ? null : ExternalLinkDisplayMode.valueOf(howToOpen); IExternalLinkDisplay display = externalLinkManager.createLink(title, id, new Float(x), new Float(y), 0, - externalLink, title, type, linkImage, filename, externalLinkOpenMode); + externalLink, title, desc, type, linkImage, filename, externalLinkOpenMode, imageId); + ObjectMapper mapper = new ObjectMapper(); ObjectNode linkNode = mapper.createObjectNode(); linkNode.put("id", display.getExternalLink().getId()); @@ -66,4 +71,4 @@ public ResponseEntity createExternalLink(@PathVariable("id") String id, return new ResponseEntity<>(mapper.writeValueAsString(linkNode), HttpStatus.OK); } -} +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddModuleLinkController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddModuleLinkController.java index ed767d769..a97c2560d 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddModuleLinkController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddModuleLinkController.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; - +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -33,12 +33,14 @@ public class AddModuleLinkController { private IModuleLinkManager moduleLinkManager; @RequestMapping(value = "/staff/space/{id}/modulelink", method = RequestMethod.POST) - public ResponseEntity createModuleLink(@PathVariable("id") String id, @RequestParam("x") String x, - @RequestParam("y") String y, @RequestParam("rotation") String rotation, - @RequestParam("moduleLinkLabel") String title, @RequestParam("linkedModule") String linkedModuleId, - @RequestParam("moduleLinkLabel") String moduleLinkLabel, @RequestParam("moduleType") String displayType, - @RequestParam("moduleLinkImage") MultipartFile file) - throws NumberFormatException, SpaceDoesNotExistException, IOException, ImageCouldNotBeStoredException { + public ResponseEntity createModuleLink(@PathVariable("id") String id, @RequestParam("x") String x, + @RequestParam("y") String y, @RequestParam("rotation") String rotation, + @RequestParam("moduleLinkLabel") String title, @RequestParam("linkedModule") String linkedModuleId, + @RequestParam("moduleLinkLabel") String moduleLinkLabel, + @RequestParam(value = "moduleLinkDesc", required = false) String moduleLinkDesc, @RequestParam("moduleType") String displayType, + @RequestParam(value = "moduleLinkImage", required = false) MultipartFile file, + @RequestParam(value = "module-imageId", required = false) String imageId) + throws NumberFormatException, SpaceDoesNotExistException, IOException, ImageCouldNotBeStoredException, ImageDoesNotExistException { ISpace source = spaceManager.getSpace(id); if (source == null) { @@ -51,6 +53,13 @@ public ResponseEntity createModuleLink(@PathVariable("id") String id, @R node.put("errorMessage", "No link coordinates specified."); return new ResponseEntity(mapper.writeValueAsString(node), HttpStatus.BAD_REQUEST); } + + if (file == null && (imageId == null || imageId.equals(""))) { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.createObjectNode(); + node.put("errorMessage", "No image provided for space link."); + return new ResponseEntity(mapper.writeValueAsString(node), HttpStatus.BAD_REQUEST); + } byte[] linkImage = null; String filename = null; @@ -63,7 +72,7 @@ public ResponseEntity createModuleLink(@PathVariable("id") String id, @R IModuleLinkDisplay display; try { display = moduleLinkManager.createLink(title, id, new Float(x), new Float(y), new Integer(rotation), - linkedModuleId, moduleLinkLabel, type, linkImage, filename); + linkedModuleId, moduleLinkLabel, moduleLinkDesc, type, linkImage, filename, imageId); } catch (SpaceDoesNotExistException e) { ObjectMapper mapper = new ObjectMapper(); ObjectNode node = mapper.createObjectNode(); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceLinkController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceLinkController.java index f9afa5799..e9af321c7 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceLinkController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceLinkController.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; - +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -37,10 +37,11 @@ public class AddSpaceLinkController { public ResponseEntity createSpaceLink(@PathVariable("id") String id, @RequestParam("x") String x, @RequestParam("y") String y, @RequestParam("rotation") String rotation, @RequestParam("spaceLinkLabel") String title, @RequestParam("linkedSpace") String linkedSpaceId, - @RequestParam("spaceLinkLabel") String spaceLinkLabel, @RequestParam("type") String displayType, - @RequestParam("spaceLinkImage") MultipartFile file) - throws NumberFormatException, SpaceDoesNotExistException, IOException { + @RequestParam("spaceLinkLabel") String spaceLinkLabel, @RequestParam(value = "spaceLinkDesc", required=false) String spaceLinkDesc, @RequestParam("type") String displayType, + @RequestParam(value="spaceLinkImage", required=false) MultipartFile file, @RequestParam(value="space-imageId", required=false) String imageId) + throws NumberFormatException, SpaceDoesNotExistException, IOException, ImageDoesNotExistException { + ISpace source = spaceManager.getSpace(id); if (source == null) { return new ResponseEntity<>("{'error': 'Space could not be found.'}", HttpStatus.NOT_FOUND); @@ -52,6 +53,13 @@ public ResponseEntity createSpaceLink(@PathVariable("id") String id, @Re node.put("errorMessage", "No link coordinates specified."); return new ResponseEntity(mapper.writeValueAsString(node), HttpStatus.BAD_REQUEST); } + + if (file == null && (imageId == null || imageId.equals(""))) { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.createObjectNode(); + node.put("errorMessage", "No image provided for space link."); + return new ResponseEntity(mapper.writeValueAsString(node), HttpStatus.BAD_REQUEST); + } byte[] linkImage = null; String filename = null; @@ -64,7 +72,7 @@ public ResponseEntity createSpaceLink(@PathVariable("id") String id, @Re ISpaceLinkDisplay display; try { display = spaceLinkManager.createLink(title, id, new Float(x), new Float(y), new Integer(rotation), - linkedSpaceId, spaceLinkLabel, type, linkImage, filename); + linkedSpaceId, spaceLinkLabel, spaceLinkDesc, type, linkImage, filename, imageId); } catch (ImageCouldNotBeStoredException e) { ObjectMapper mapper = new ObjectMapper(); ObjectNode node = mapper.createObjectNode(); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditExternalLinkController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditExternalLinkController.java index 61c9353b3..c29c3e0b0 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditExternalLinkController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditExternalLinkController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; - +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import edu.asu.diging.vspace.core.exception.ImageCouldNotBeStoredException; import edu.asu.diging.vspace.core.exception.LinkDoesNotExistsException; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; @@ -30,14 +30,17 @@ public class EditExternalLinkController extends EditSpaceLinksController { private IExternalLinkManager externalLinkManager; @RequestMapping(value = "/staff/space/link/external/{id}", method = RequestMethod.POST) - public ResponseEntity createExternalLink(@PathVariable("id") String id, @RequestParam("x") String x, - @RequestParam("y") String y, @RequestParam("externalLinkLabel") String title, - @RequestParam("url") String externalLink, - @RequestParam("externalLinkIdValueEdit") String externalLinkIdValueEdit, - @RequestParam("externalLinkDisplayId") String externalLinkDisplayId, - @RequestParam("tabOpen") String howToOpen, @RequestParam("type") String displayType, - @RequestParam("externalLinkImage") MultipartFile file) throws SpaceDoesNotExistException, IOException, - LinkDoesNotExistsException, NumberFormatException, ImageCouldNotBeStoredException { + public ResponseEntity createExternalLink(@PathVariable("id") String id, @RequestParam("x") String x, + @RequestParam("y") String y, @RequestParam("externalLinkLabel") String title, + @RequestParam("externalLinkDesc") String desc, @RequestParam("url") String externalLink, + @RequestParam("externalLinkIdValueEdit") String externalLinkIdValueEdit, + @RequestParam("externalLinkDisplayId") String externalLinkDisplayId, + @RequestParam(value="externalLinkImageIdEdit", required=false) String externalLinkImageIdEdit, + @RequestParam("tabOpen") String howToOpen, @RequestParam("type") String displayType, + @RequestParam("externalLinkImage") MultipartFile file, + @RequestParam(value = "imageId", required = false) String imageId) + throws SpaceDoesNotExistException, IOException, LinkDoesNotExistsException, NumberFormatException, + ImageCouldNotBeStoredException, ImageDoesNotExistException { ResponseEntity validation = checkIfSpaceExists(spaceManager, id, x, y); if (validation != null) { @@ -51,10 +54,10 @@ public ResponseEntity createExternalLink(@PathVariable("id") String id, } DisplayType type = displayType.isEmpty() ? null : DisplayType.valueOf(displayType); ExternalLinkDisplayMode externalLinkOpenMode = howToOpen.isEmpty() ? null - : ExternalLinkDisplayMode.valueOf(howToOpen); + : ExternalLinkDisplayMode.valueOf(howToOpen); IExternalLinkDisplay display = (IExternalLinkDisplay) externalLinkManager.updateLink(title, id, new Float(x), - new Float(y), 0, externalLink, title, externalLinkIdValueEdit, externalLinkDisplayId, type, linkImage, - filename, externalLinkOpenMode); + new Float(y), 0, externalLink, title,desc, externalLinkIdValueEdit, externalLinkDisplayId, type, linkImage, + filename, imageId); return success(display.getExternalLink().getId(), display.getId(), display.getPositionX(), display.getPositionY(), display.getRotation(), display.getExternalLink().getExternalLink(), title, displayType, null, null); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditModuleLinkController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditModuleLinkController.java index c63889ea4..5b39b9c26 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditModuleLinkController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditModuleLinkController.java @@ -18,7 +18,7 @@ import edu.asu.diging.vspace.core.model.display.IModuleLinkDisplay; import edu.asu.diging.vspace.core.services.IModuleLinkManager; import edu.asu.diging.vspace.core.services.ISpaceManager; - +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; @Controller public class EditModuleLinkController extends EditSpaceLinksController { @@ -30,13 +30,14 @@ public class EditModuleLinkController extends EditSpaceLinksController { @RequestMapping(value = "/staff/space/link/module/{id}", method = RequestMethod.POST) public ResponseEntity editModuleLink(@PathVariable("id") String id, @RequestParam("x") String x, - @RequestParam("y") String y, @RequestParam("rotation") String rotation, - @RequestParam("moduleLinkLabel") String title, @RequestParam("linkedModule") String linkedModuleId, - @RequestParam("moduleLinkLabel") String moduleLinkLabel, - @RequestParam("moduleLinkIdValueEdit") String moduleLinkIdValueEdit, - @RequestParam("moduleLinkDisplayId") String moduleLinkDisplayId, @RequestParam("type") String displayType, - @RequestParam("moduleLinkImage") MultipartFile file) throws NumberFormatException, - SpaceDoesNotExistException, LinkDoesNotExistsException, IOException, ImageCouldNotBeStoredException { + @RequestParam("y") String y, @RequestParam("rotation") String rotation, + @RequestParam("moduleLinkLabel") String title, @RequestParam("linkedModule") String linkedModuleId, + @RequestParam("moduleLinkLabel") String moduleLinkLabel, + @RequestParam("moduleLinkDesc") String moduleLinkDesc, + @RequestParam("moduleLinkIdValueEdit") String moduleLinkIdValueEdit, + @RequestParam("moduleLinkDisplayId") String moduleLinkDisplayId, @RequestParam("type") String displayType, + @RequestParam("moduleLinkImage") MultipartFile file, @RequestParam(value="imageId", required=false) String imageId) throws NumberFormatException, + SpaceDoesNotExistException, LinkDoesNotExistsException, IOException, ImageCouldNotBeStoredException, ImageDoesNotExistException { ResponseEntity validation = checkIfSpaceExists(spaceManager, id, x, y); if (validation != null) { @@ -50,8 +51,8 @@ public ResponseEntity editModuleLink(@PathVariable("id") String id, @Req } DisplayType type = displayType.isEmpty() ? null : DisplayType.valueOf(displayType); IModuleLinkDisplay display = (IModuleLinkDisplay) moduleLinkManager.updateLink(title, id, new Float(x), - new Float(y), new Integer(rotation), linkedModuleId, moduleLinkLabel, moduleLinkIdValueEdit, - moduleLinkDisplayId, type, linkImage, filename); + new Float(y), new Integer(rotation), linkedModuleId, moduleLinkLabel,moduleLinkDesc, moduleLinkIdValueEdit, + moduleLinkDisplayId, type, linkImage, filename, imageId); return success(display.getLink().getId(), display.getId(), display.getPositionX(), display.getPositionY(), display.getRotation(), null, title, displayType, linkedModuleId, null); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceLinkController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceLinkController.java index 8fad32125..b0e7745aa 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceLinkController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceLinkController.java @@ -3,6 +3,7 @@ import java.io.IOException; 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; @@ -11,6 +12,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + import edu.asu.diging.vspace.core.exception.ImageCouldNotBeStoredException; import edu.asu.diging.vspace.core.exception.LinkDoesNotExistsException; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; @@ -19,6 +23,7 @@ import edu.asu.diging.vspace.core.model.impl.SpaceStatus; import edu.asu.diging.vspace.core.services.ISpaceLinkManager; import edu.asu.diging.vspace.core.services.ISpaceManager; +import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; @Controller public class EditSpaceLinkController extends EditSpaceLinksController { @@ -30,14 +35,15 @@ public class EditSpaceLinkController extends EditSpaceLinksController { private ISpaceLinkManager spaceLinkManager; @RequestMapping(value = "/staff/space/link/space/{id}", method = RequestMethod.POST) - public ResponseEntity editSpaceLink(@PathVariable("id") String id, @RequestParam("x") String x, - @RequestParam("y") String y, @RequestParam("rotation") String rotation, - @RequestParam("spaceLinkLabel") String title, @RequestParam("linkedSpace") String linkedSpaceId, - @RequestParam("spaceLinkLabel") String spaceLinkLabel, - @RequestParam("spaceLinkIdValueEdit") String spaceLinkIdValueEdit, - @RequestParam("spaceLinkDisplayId") String spaceLinkDisplayId, @RequestParam("type") String displayType, - @RequestParam("spaceLinkImage") MultipartFile file) throws NumberFormatException, - SpaceDoesNotExistException, LinkDoesNotExistsException, IOException, ImageCouldNotBeStoredException { + public ResponseEntity editSpaceLink(@PathVariable("id") String id, @RequestParam("x") String x, + @RequestParam("y") String y, @RequestParam("rotation") String rotation, + @RequestParam("spaceLinkLabel") String title, @RequestParam("linkedSpace") String linkedSpaceId, + @RequestParam("spaceLinkLabel") String spaceLinkLabel,@RequestParam("spaceLinkDesc") String spaceLinkDesc, + @RequestParam("spaceLinkIdValueEdit") String spaceLinkIdValueEdit, + @RequestParam("spaceLinkDisplayId") String spaceLinkDisplayId, + @RequestParam("type") String displayType, @RequestParam(value="spaceLinkImage", required = false) MultipartFile file, + @RequestParam(value = "imageId", required = false) String imageId) throws NumberFormatException, + SpaceDoesNotExistException, LinkDoesNotExistsException, IOException, ImageCouldNotBeStoredException, ImageDoesNotExistException { ResponseEntity validation = checkIfSpaceExists(spaceManager, id, x, y); if (validation != null) { @@ -45,18 +51,24 @@ public ResponseEntity editSpaceLink(@PathVariable("id") String id, @Requ } byte[] linkImage = null; String filename = null; - if (file != null) { + if (file != null && !file.isEmpty()) { linkImage = file.getBytes(); filename = file.getOriginalFilename(); } + if (file == null && (imageId == null || imageId.equals(""))) { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.createObjectNode(); + node.put("errorMessage", "No image provided for space link."); + return new ResponseEntity(mapper.writeValueAsString(node), HttpStatus.BAD_REQUEST); + } DisplayType type = displayType.isEmpty() ? null : DisplayType.valueOf(displayType); ISpaceLinkDisplay display = (ISpaceLinkDisplay) spaceLinkManager.updateLink(title, id, new Float(x), - new Float(y), new Integer(rotation), linkedSpaceId, spaceLinkLabel, spaceLinkIdValueEdit, - spaceLinkDisplayId, type, linkImage, filename); + new Float(y), new Integer(rotation), linkedSpaceId, spaceLinkLabel,spaceLinkDesc, spaceLinkIdValueEdit, + spaceLinkDisplayId, type, linkImage, filename, imageId); SpaceStatus targetSpaceStatus = spaceManager.getSpace(linkedSpaceId).getSpaceStatus(); String linkedSpaceStatus = targetSpaceStatus != null ? targetSpaceStatus.toString() : null; return success(display.getLink().getId(), display.getId(), display.getPositionX(), display.getPositionY(), - display.getRotation(), null, title, displayType, linkedSpaceId, linkedSpaceStatus); + display.getRotation(), null, title, displayType, linkedSpaceId, linkedSpaceStatus); } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSearchSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSearchSpaceController.java index 8b25ae9dd..14e22e03f 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSearchSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/StaffSearchSpaceController.java @@ -11,8 +11,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import com.fasterxml.jackson.core.JsonProcessingException; - import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.services.IStaffSearchManager; import edu.asu.diging.vspace.core.services.impl.model.StaffSearchSpaceResults; @@ -26,13 +24,14 @@ public class StaffSearchSpaceController { @RequestMapping(value = "/staff/search/space") public ResponseEntity searchInVspace( @RequestParam(value = "spacePagenum", required = false, defaultValue = "1") String spacePagenum, - Model model, @RequestParam(name = "searchText") String searchTerm) throws JsonProcessingException { + Model model, @RequestParam(name = "searchText") String searchTerm) { List spaceList = paginationForSpace(spacePagenum, searchTerm); StaffSearchSpaceResults staffSearch = new StaffSearchSpaceResults(); staffSearch.setSpaces(spaceList); return new ResponseEntity(staffSearch, HttpStatus.OK); } + /** * This method is used to search the search string specified in the input diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateContentOrderController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateContentOrderController.java index 75d409c53..9b08ef1e5 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateContentOrderController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/UpdateContentOrderController.java @@ -8,13 +8,20 @@ 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import edu.asu.diging.vspace.core.exception.BlockDoesNotExistException; +import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.impl.ContentBlock; import edu.asu.diging.vspace.core.services.IContentBlockManager; +import edu.asu.diging.vspace.core.services.ISlideManager; @Controller public class UpdateContentOrderController { @@ -23,17 +30,29 @@ public class UpdateContentOrderController { @Autowired private IContentBlockManager contentBlockManager; + + @Autowired + private ISlideManager slideManager; @RequestMapping(value = "/staff/module/{moduleId}/slide/{id}/blocks/order/update", method = RequestMethod.POST) - public ResponseEntity> adjustContentOrder(@RequestBody List contentBlockList) { + public ResponseEntity> adjustContentOrder(@RequestBody String contentBlockString, @PathVariable("id") String slideId) { + ObjectMapper objectMapper = new ObjectMapper(); + ISlide slide = slideManager.getSlide(slideId); + List contentBlockList; try { - contentBlockManager.updateContentOrder(contentBlockList); + contentBlockList = objectMapper.readValue(contentBlockString, new TypeReference>(){}); + contentBlockManager.updateContentOrder(contentBlockList, slide); } catch (BlockDoesNotExistException e) { - logger.warn("Block Id does not exist, bad request.", e); - return new ResponseEntity>(HttpStatus.BAD_REQUEST); + logger.warn("Block does not exist, bad request.", e); + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } catch (Exception e) { + // Catching generic Exception for JSON parsing errors (JsonProcessingException, IOException, etc.) + // ObjectMapper.readValue() can throw JsonProcessingException, JsonMappingException, or IOException + logger.warn("Error while parsing content blocks.", e); + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } - return new ResponseEntity>(contentBlockList,HttpStatus.OK); + return new ResponseEntity>(contentBlockList, HttpStatus.OK); } +} -} \ No newline at end of file diff --git a/vspace/src/main/resources/exhibitionLanguages.properties b/vspace/src/main/resources/exhibitionLanguages.properties index ccbc75cac..492b3ab2e 100644 --- a/vspace/src/main/resources/exhibitionLanguages.properties +++ b/vspace/src/main/resources/exhibitionLanguages.properties @@ -119,7 +119,7 @@ { "code": "na", "label": "Nauru" }, { "code": "nb", - "label": "BokmÃ¥l, Norwegian; Norwegian BokmÃ¥l" + "label": "Bokmål, Norwegian; Norwegian Bokmål" }, { "code": "nd", "label": "Ndebele, North; North Ndebele" }, { "code": "ne", "label": "Nepali" }, @@ -184,7 +184,7 @@ { "code": "uz", "label": "Uzbek" }, { "code": "ve", "label": "Venda" }, { "code": "vi", "label": "Vietlabelse" }, - { "code": "vo", "label": "Volapük" }, + { "code": "vo", "label": "Volapük" }, { "code": "wa", "label": "Walloon" }, { "code": "wo", "label": "Wolof" }, { "code": "xh", "label": "Xhosa" }, diff --git a/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html b/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html index dcc9d59c3..9ddf8445f 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html @@ -84,7 +84,7 @@ .biblioDiv ul { list-style: none; padding: 0; - margin: 16px 0 0 0; + margin: 16px 0 0; } .referenceDiv { diff --git a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html index 2884e881e..1fab4463c 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html @@ -407,10 +407,10 @@ var posX = parseInt($("#space").css('margin-left')) + $("#space").position().left; var posY = $("#space").position().top; var spaceLink = $(''); - if(isExhPreview=== true){ + if(isExhPreview=== true) { spaceLink.attr("href",[[@{|/preview/${previewId}/space/|}]]+link.link.targetSpace.id); } - else{ + else { spaceLink.attr("href", link.link.targetSpace.id); } var linkDisplay = $('
'+link.link.name+'
'); @@ -418,8 +418,8 @@ linkDisplay = $(''); } else if(link.type=="IMAGE" && link.image != null){ - var spaceImageURL = [[@{/api/image/}]]+link.image.id; - linkDisplay = $(''); + var spaceImageURL = [[@{/api/image/}]]+link.image.id; + linkDisplay = $(''); } else if(defaultSpaceImageFlag === true) { var defaultSpaceLinkImageURL = [[@{/api/image/default/link/space/}]]; diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html index e49a7189a..25588c1c7 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html @@ -1,139 +1,139 @@ - - + + - +