diff --git a/vspace/pom.xml b/vspace/pom.xml index c453493ef..d1a8788c9 100644 --- a/vspace/pom.xml +++ b/vspace/pom.xml @@ -359,13 +359,13 @@ commons-io commons-io - 2.14.0 + 2.19.0 org.apache.tika tika-core - 1.28.3 + 3.1.0 com.fasterxml.jackson.datatype 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..a8bec1173 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 @@ -31,14 +31,20 @@ public interface IExhibition extends IVSpaceElement { IVSImage getSpaceLinkDefaultImage(); void setSpaceLinkDefaultImage(IVSImage spaceLinkDefaultImage); + + void deleteSpaceLinkDefaultImage(); IVSImage getModuleLinkDefaultImage(); void setModuleLinkDefaultImage(IVSImage moduleLinkDefaultImage); + + void deleteModuleLinkDefaultImage(); IVSImage getExternalLinkDefaultImage(); void setExternalLinkDefaultImage(IVSImage externalLinkDefaultImage); + + void deleteExternalLinkDefaultImage(); List getLanguages(); @@ -52,4 +58,10 @@ public interface IExhibition extends IVSpaceElement { void setCustomMessage(String customMessage); + void disableSpaceLinkDefaultImage(); + + void disableModuleLinkDefaultImage(); + + void disableExternalLinkDefaultImage(); + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/IVSImage.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IVSImage.java index 0e055f5d3..8956f0ff0 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/IVSImage.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IVSImage.java @@ -4,25 +4,29 @@ public interface IVSImage extends IVSMedia { - String getFilename(); + String getFilename(); - void setFilename(String filename); + void setFilename(String filename); - String getParentPath(); + String getParentPath(); - void setParentPath(String parentPath); + void setParentPath(String parentPath); - void setFileType(String fileType); + void setFileType(String fileType); - String getFileType(); + String getFileType(); - void setWidth(int width); + void setWidth(int width); - int getWidth(); + int getWidth(); - void setHeight(int height); + void setHeight(int height); - int getHeight(); + int getHeight(); + + boolean getDisableFlag(); + + void toggleDisableFlag(); void setCategories(List categories); 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..f86f83060 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 @@ -48,15 +48,15 @@ public class Exhibition extends VSpaceElement implements IExhibition { private String customMessage; - @OneToOne(targetEntity = VSImage.class) + @OneToOne(targetEntity = VSImage.class, cascade = CascadeType.ALL, orphanRemoval=true) @NotFound(action = NotFoundAction.IGNORE) private IVSImage spaceLinkDefaultImage; - @OneToOne(targetEntity = VSImage.class) + @OneToOne(targetEntity = VSImage.class, cascade = CascadeType.ALL, orphanRemoval=true) @NotFound(action = NotFoundAction.IGNORE) private IVSImage moduleLinkDefaultImage; - @OneToOne(targetEntity = VSImage.class) + @OneToOne(targetEntity = VSImage.class, cascade = CascadeType.ALL, orphanRemoval=true) @NotFound(action = NotFoundAction.IGNORE) private IVSImage externalLinkDefaultImage; @@ -139,30 +139,67 @@ public void setCustomMessage(String customMessage) { public IVSImage getSpaceLinkDefaultImage() { return spaceLinkDefaultImage; } + @Override public void setSpaceLinkDefaultImage(IVSImage spaceLinkDefaultImage) { this.spaceLinkDefaultImage = spaceLinkDefaultImage; } + + @Override + public void deleteSpaceLinkDefaultImage() { + this.spaceLinkDefaultImage = null; + } + + @Override + public void disableSpaceLinkDefaultImage() { + this.spaceLinkDefaultImage.toggleDisableFlag(); + } + @Override public IVSImage getModuleLinkDefaultImage() { return moduleLinkDefaultImage; } + @Override public void setModuleLinkDefaultImage(IVSImage moduleLinkDefaultImage) { this.moduleLinkDefaultImage = moduleLinkDefaultImage; } + + @Override + public void deleteModuleLinkDefaultImage() { + this.moduleLinkDefaultImage = null; + } + + @Override + public void disableModuleLinkDefaultImage() { + this.moduleLinkDefaultImage.toggleDisableFlag(); + } + @Override public IVSImage getExternalLinkDefaultImage() { return externalLinkDefaultImage; } + @Override public void setExternalLinkDefaultImage(IVSImage externalLinkDefaultImage) { this.externalLinkDefaultImage = externalLinkDefaultImage; } + + @Override + public void deleteExternalLinkDefaultImage() { + this.externalLinkDefaultImage = null; + } + + @Override + public void disableExternalLinkDefaultImage() { + this.externalLinkDefaultImage.toggleDisableFlag(); + } + @Override public boolean isAboutPageConfigured() { return aboutPageConfigured; } + @Override public void setAboutPageConfigured(boolean aboutPageConfigured) { this.aboutPageConfigured = aboutPageConfigured; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/VSImage.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/VSImage.java index 2287a0fae..8729d44fe 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/VSImage.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/VSImage.java @@ -2,13 +2,13 @@ import java.util.List; +import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import javax.persistence.Inheritance; import javax.persistence.Lob; import javax.persistence.OneToMany; @@ -34,6 +34,9 @@ public class VSImage extends VSMedia implements IVSImage { private int height; private int width; + + @Column(name = "disableFlag", nullable = false) + private boolean disableFlag = false; @OneToMany(targetEntity = Tag.class) private List tags; @@ -106,6 +109,16 @@ public void setWidth(int width) { this.width = width; } + @Override + public boolean getDisableFlag() { + return disableFlag; + } + + @Override + public void toggleDisableFlag() { + disableFlag = !disableFlag; + } + @Override public List getTags() { return tags; @@ -126,4 +139,10 @@ public void setCategories(List categories) { this.categories = categories; } + @Override + public String toString() { + return "VSImage{" + + "disableFlag='" + disableFlag + + '}'; + } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IImageService.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IImageService.java index 31cd664b7..ad3a6dbb1 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IImageService.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IImageService.java @@ -44,6 +44,8 @@ Page getPaginatedImagesBySearchTerm(int pageNo, ImageCategory category, String searchTerm, String sortedBy, String order); IVSImage storeImage(byte[] image, String filename); + + void removeImage(String imageId); byte[] getImageContent(IVSImage image); } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ImageService.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ImageService.java index bff23caa6..b749ed2a2 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ImageService.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ImageService.java @@ -271,7 +271,6 @@ public void removeCategory(IVSImage image, ImageCategory category) { */ @Override public IVSImage storeImage(byte[] image, String filename) { - IVSImage storedImage = null; if (image != null && image.length > 0) { Tika tika = new Tika(); @@ -305,6 +304,18 @@ public IVSImage storeImage(byte[] image, String filename) { return storedImage; } + /** + * Method to delete an image in the file + * + *@param imageId - The id of the image to be removed + *@return EmptyResultDataAccessException if no image exists with the provided id + */ + @Override + public void removeImage(String imageId) { + + imageRepo.deleteById(imageId); + } + /** *Method to return content of the image * diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultImageApiController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultImageApiController.java index e381e257c..5b07939d6 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultImageApiController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultImageApiController.java @@ -24,6 +24,7 @@ public class DefaultImageApiController { public static final String API_DEFAULT_MODULE_IMAGE_PATH = "/api/image/default/link/module/"; public static final String API_DEFAULT_EXTERNAL_IMAGE_PATH = "/api/image/default/link/external/"; public static final String API_DEFAULT_SPACE_IMAGE_STATUS = "/api/exhibition/default/link/image/status/"; + public static final String API_DEFAULT_IMAGE_DISABLE_STATUS = "/api/exhibition/default/link/image/disableStatus/"; @Autowired private IImageService imageService; @@ -67,6 +68,21 @@ public ResponseEntity getDefaultImageStatus() { jsonObj.addProperty("defaultExternalLinkImageFlag", exhibition.getExternalLinkDefaultImage() != null? true : false); return new ResponseEntity<>(jsonObj.toString(), HttpStatus.OK); } + + /** + * Retrieves the status of default images for exhibition links + * @return A JSON response containing flags indicating the availability of default images. + */ + @RequestMapping(value = API_DEFAULT_IMAGE_DISABLE_STATUS, method = RequestMethod.GET) + public ResponseEntity getDefaultImageDisableStatus() { + IExhibition exhibition = exhibitManager.getStartExhibition(); + + JsonObject jsonObj = new JsonObject(); + jsonObj.addProperty("defaultSpaceImageDisableFlag", exhibition.getSpaceLinkDefaultImage().getDisableFlag()); + jsonObj.addProperty("defaultModuleImageDisableFlag", exhibition.getModuleLinkDefaultImage().getDisableFlag()); + jsonObj.addProperty("defaultExternalImageDisableFlag", exhibition.getExternalLinkDefaultImage().getDisableFlag()); + return new ResponseEntity<>(jsonObj.toString(), HttpStatus.OK); + } private ResponseEntity getResponseWithDefaultHeaders(IVSImage image) { if(image == null) { @@ -79,4 +95,5 @@ private ResponseEntity getResponseWithDefaultHeaders(IVSImage image) { return new ResponseEntity<>(imageContent, headers, HttpStatus.OK); } + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultLinkImageController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultLinkImageController.java index 5660fb415..74e0a7be1 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultLinkImageController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultLinkImageController.java @@ -1,20 +1,26 @@ package edu.asu.diging.vspace.web.staff; import java.io.IOException; -import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; +import java.util.function.Supplier; import javax.servlet.http.HttpServletRequest; 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.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import com.google.gson.JsonObject; + +import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.services.IExhibitionManager; @@ -23,10 +29,11 @@ @Controller public class DefaultLinkImageController { - private final Map> imageSetterMap = Map.of( - "space", Exhibition::setSpaceLinkDefaultImage, - "module", Exhibition::setModuleLinkDefaultImage, - "external", Exhibition::setExternalLinkDefaultImage); + private final Map> imageSetterMap = Map.of( + "space", IExhibition::setSpaceLinkDefaultImage, + "module", IExhibition::setModuleLinkDefaultImage, + "external", IExhibition::setExternalLinkDefaultImage + ); @Autowired private IExhibitionManager exhibitionManager; @@ -51,21 +58,118 @@ public String createOrUpdateLinkImage(HttpServletRequest request, Exhibition exhibition = (Exhibition) exhibitionManager.getStartExhibition(); IVSImage defaultImage = imageService.storeImage(image.getBytes(), image.getOriginalFilename()); - BiConsumer setter = imageSetterMap.get(linkType); + BiConsumer setter = imageSetterMap.get(linkType); if(setter == null) { attributes.addAttribute("exhibitId", exhibition.getId()); attributes.addAttribute("alertType", "danger"); attributes.addAttribute("message", "Could not save default image"); attributes.addAttribute("showAlert", "true"); - return "redirect:/staff/exhibit/config"; + } else { + setter.accept(exhibition, defaultImage); + exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); + attributes.addAttribute("exhibitId", exhibition.getId()); + attributes.addAttribute("alertType", "success"); + attributes.addAttribute("message", "Successfully saved!"); + attributes.addAttribute("showAlert", "true"); + } + + return "redirect:/staff/exhibit/config"; + } + + /** + * To delete the default link images. + * + * @param linkType - the type of the link for which the default image must be deleted + * @param attributes - the RedirectAttributes object to add flash attributes + * @return - a RedirectView to the exhibition configuration page + * @throws IOException if an input or output error occurs + */ + @RequestMapping(value = "/staff/exhibit/config/link/defaultImage/{linkType}", method = RequestMethod.DELETE) + public String deleteLinkImage(@PathVariable("linkType") String linkType, RedirectAttributes attributes) throws IOException { + Exhibition exhibition = (Exhibition) exhibitionManager.getStartExhibition(); + + Map> imageGetterMap = Map.of( + "space", exhibition::getSpaceLinkDefaultImage, + "module", exhibition::getModuleLinkDefaultImage, + "external", exhibition::getExternalLinkDefaultImage + ); + + IVSImage image = imageGetterMap.get(linkType).get(); + if (image == null) { + attributes.addAttribute("exhibitId", exhibition.getId()); + attributes.addAttribute("alertType", "danger"); + attributes.addAttribute("message", "Could not retrieve the default image prior to deleting"); + attributes.addAttribute("showAlert", "true"); + } else { + imageService.removeImage(image.getId()); } - setter.accept(exhibition, defaultImage); - exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); - attributes.addAttribute("exhibitId", exhibition.getId()); - attributes.addAttribute("alertType", "success"); - attributes.addAttribute("message", "Successfully Saved!"); - attributes.addAttribute("showAlert", "true"); + Map imageDeleterMap = Map.of( + "space", exhibition::deleteSpaceLinkDefaultImage, + "module", exhibition::deleteModuleLinkDefaultImage, + "external", exhibition::deleteExternalLinkDefaultImage + ); + + Runnable deleteDefautImageMethod = imageDeleterMap.get(linkType); + if (deleteDefautImageMethod == null) { + attributes.addAttribute("exhibitId", exhibition.getId()); + attributes.addAttribute("alertType", "danger"); + attributes.addAttribute("message", "Could not delete the default image"); + attributes.addAttribute("showAlert", "true"); + } else { + deleteDefautImageMethod.run(); + exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); + attributes.addAttribute("exhibitId", exhibition.getId()); + attributes.addAttribute("alertType", "success"); + attributes.addAttribute("message", "Successfully deleted the default image!"); + attributes.addAttribute("showAlert", "true"); + } + return "redirect:/staff/exhibit/config"; } + + /** + * To disable the default link images. + * + * @param linkType - the type of the link for which the default image must be disabled + * @param attributes - the RedirectAttributes object to add flash attributes + * @return - a RedirectView to the exhibition configuration page + * @throws IOException if an input or output error occurs + */ + @RequestMapping(value = "/staff/exhibit/config/link/defaultImage/{linkType}", method = RequestMethod.PUT) + public ResponseEntity disableLinkImage(@PathVariable("linkType") String linkType, RedirectAttributes attributes) throws IOException { + Exhibition exhibition = (Exhibition) exhibitionManager.getStartExhibition(); + JsonObject jsonObj = new JsonObject(); + + Map> imageGetterMap = Map.of( + "space", exhibition::getSpaceLinkDefaultImage, + "module", exhibition::getModuleLinkDefaultImage, + "external", exhibition::getExternalLinkDefaultImage + ); + + IVSImage image = imageGetterMap.get(linkType).get(); + if (image == null) { + String errorMessage = "Could not retrieve the default image prior to disabling"; + return ResponseEntity.badRequest().body(errorMessage); + } + + Map imageDisablerMap = Map.of( + "space", exhibition::disableSpaceLinkDefaultImage, + "module", exhibition::disableModuleLinkDefaultImage, + "external", exhibition::disableExternalLinkDefaultImage + ); + + Runnable disableDefautImageMethod = imageDisablerMap.get(linkType); + if (disableDefautImageMethod == null) { + String errorMessage = "Could not disable the default image"; + return ResponseEntity.badRequest().body(errorMessage); + } else { + disableDefautImageMethod.run(); + exhibitionManager.storeExhibition(exhibition); + jsonObj.addProperty("defaultImageDisableFlag", image.getDisableFlag()); + } + + return new ResponseEntity<>(jsonObj.toString(), HttpStatus.OK); + + } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java index 4e6a1c6db..f5541886e 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java @@ -1,10 +1,7 @@ package edu.asu.diging.vspace.web.staff; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; @@ -12,8 +9,6 @@ import org.javers.common.collections.Arrays; 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.validation.BindingResult; @@ -21,7 +16,6 @@ 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.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.view.RedirectView; @@ -31,10 +25,8 @@ import edu.asu.diging.vspace.core.model.ExhibitionModes; 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.impl.Exhibition; import edu.asu.diging.vspace.core.services.IExhibitionManager; -import edu.asu.diging.vspace.core.services.IImageService; import edu.asu.diging.vspace.core.services.ISpaceManager; import edu.asu.diging.vspace.web.staff.forms.ExhibitionConfigurationForm; import edu.asu.diging.vspace.core.services.impl.ExhibitionManager; @@ -54,9 +46,6 @@ public class ExhibitionConfigurationController { @Autowired private ExhibitionFactory exhibitFactory; - @Autowired - private IImageService imageService; - @Autowired private ExhibitionLanguageConfig exhibitionLanguageConfig; @@ -80,9 +69,9 @@ public String showExhibitions(Model model) { model.addAttribute("spacesList", spaceRepo.findAll()); model.addAttribute("languageList", exhibitionLanguageConfig.getExhibitionLanguageList()); model.addAttribute("exhibition", exhibition); - model.addAttribute("defaultSpaceLinkImage",exhibition.getSpaceLinkDefaultImage()); - model.addAttribute("defaultModuleLinkImage",exhibition.getModuleLinkDefaultImage()); - model.addAttribute("defaultExternalLinkImage",exhibition.getExternalLinkDefaultImage()); + model.addAttribute("defaultSpaceLinkImage", exhibition.getSpaceLinkDefaultImage()); + model.addAttribute("defaultModuleLinkImage", exhibition.getModuleLinkDefaultImage()); + model.addAttribute("defaultExternalLinkImage", exhibition.getExternalLinkDefaultImage()); return "staff/exhibit/config"; } 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 041bf1fed..fc92c978c 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html @@ -218,6 +218,7 @@ $(function () { $('[data-toggle="tooltip"]').tooltip() checkDefaultImage(); + checkDefaultImageDisabled() const textBlock = document.getElementsByClassName("textBlock"); const color = textBlock.style.borderColor; textBlock.addEventListener('focus-visible', function(e) { @@ -226,7 +227,11 @@ }); var defaultSpaceImageFlag; var defaultModuleImageFlag; - var defaultExternalLinkImageFlag; + var defaultExternalLinkImageFlag; + + var defaultSpaceImageDisableFlag; + var defaultModuleImageDisableFlag; + var defaultExternalImageDisableFlag; function toggleImgSize(isClicked){ var maxImgWidth = $(window).width(); @@ -370,9 +375,11 @@ $(".Info_cz_Class").remove(); drawLinks(); checkDefaultImage(); + checkDefaultImageDisabled() }); drawLinks(); checkDefaultImage(); + checkDefaultImageDisabled() toggleImgSize(false); }); @@ -392,6 +399,22 @@ }); } + function checkDefaultImageDisabled() { + $.ajax({ + url: "[(@{'/api/exhibition/default/link/image/disableStatus/'})]", + type: 'GET', + cache : false, + contentType : false, + success: function(data) { + if(data.length > 0){ + defaultSpaceImageDisableFlag = JSON.parse(data).defaultSpaceImageDisableFlag; + defaultModuleImageDisableFlag = JSON.parse(data).defaultModuleImageDisableFlag + defaultExternalImageDisableFlag = JSON.parse(data).defaultExternalImageDisableFlag; + } + } + }); + } + function drawLinks() { var spaceLinks = [[${spaceLinks}]]; var moduleLinks = [[${moduleList}]]; @@ -420,7 +443,7 @@ var spaceImageURL = [[@{/api/image/}]]+link.image.id; linkDisplay = $(''); } - else if(defaultSpaceImageFlag === true) { + else if(defaultSpaceImageFlag === true && defaultSpaceImageDisableFlag === false) { var defaultSpaceLinkImageURL = [[@{/api/image/default/link/space/}]]; linkDisplay = $('
'+link.link.name+'
'); } @@ -450,17 +473,18 @@ var posY = $("#space").position().top; var moduleLink = $(''); var moduleLinkURL = null; + console.log('defaultModuleImageDisableFlag: ', defaultModuleImageDisableFlag); if(isExhPreview=== true){ moduleLinkURL = [[@{|/preview/${previewId}/${space?.id}/module/|}]]+link.link.module.id; } else{ moduleLinkURL = [[@{|/exhibit/${space?.id}/module/|}]]+link.link.module.id; } moduleLink.attr("href", moduleLinkURL); - var linkDisplay = $('
'+link.link.name+'
'); + var linkDisplay = $('
'+link.link.name+'
'); if(link.type=="IMAGE" && link.image != null){ var moduleImageURL = [[@{/api/image/}]]+link.image.id; linkDisplay = $(''); - } else if(defaultModuleImageFlag === true){ + } else if(defaultModuleImageFlag === true && defaultModuleImageDisableFlag === false){ var defaultModuleURL = [[@{/api/image/default/link/module/}]]; linkDisplay = $('
'+link.link.name+'
'); } @@ -502,7 +526,7 @@ var extImageURL = [[@{/api/image/}]]+link.image.id; linkDisplay = $(''); } - else if(defaultExternalLinkImageFlag === true){ + else if(defaultExternalLinkImageFlag === true && defaultExternalImageDisableFlag === false){ var defaultExternalLinkURL = [[@{/api/image/default/link/external/}]]; linkDisplay = $('
'+link.externalLink.name+'
'); } @@ -651,19 +675,19 @@
  • [[${module.link.name}]]
  • + th:href="@{'/exhibit/'+${space?.id}+'/module/'+${module.link.module?.id}}">
    [[${module.link.name}]]
  • [[${module.link.module.name}]]
  • + th:href="@{'/exhibit/'+${space?.id}+'/module/'+${module.link.module?.id}}">
    [[${module.link.module.name}]]
  • [[${module.link.name}]]
  • + th:href="@{'/preview/'+${previewId}+'/'+${space?.id}+'/module/'+${module.link.module?.id}}">
    [[${module.link.name}]]
  • [[${module.link.module.name}]]
  • + th:href="@{'/preview/'+${previewId}+'/'+${space?.id}+'/module/'+${module.link.module?.id}}">
    [[${module.link.module.name}]] diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/exhibit/config.html b/vspace/src/main/webapp/WEB-INF/views/staff/exhibit/config.html index acf032389..bb0e06efc 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/exhibit/config.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/exhibit/config.html @@ -9,6 +9,37 @@ var spaceParamExihibit = $('#spaceParamExihibit'); var defaultImages = $('#defaultImages'); + // Disable the cancel button if there is nothing to cancel, set intial position for disable slider + if ([[${defaultSpaceLinkImage}]]==null) { + $('#spaceCancelBtn').attr('disabled', true); + } else { + if ([[${defaultSpaceLinkImage?.getDisableFlag()}]]) { + $('#disableSpaceLinkImage').prop('checked', false); + } else { + $('#disableSpaceLinkImage').prop('checked', true); + } + } + + if ([[${defaultModuleLinkImage}]]==null) { + $('#moduleCancelBtn').attr('disabled', true); + } else { + if ([[${defaultModuleLinkImage?.getDisableFlag()}]]) { + $('#disableModuleLinkImage').prop('checked', false); + } else { + $('#disableModuleLinkImage').prop('checked', true); + } + } + + if ([[${defaultExternalLinkImage}]]==null) { + $('#externalCancelBtn').attr('disabled', true); + } else { + if ([[${defaultExternalLinkImage?.getDisableFlag()}]]) { + $('#disableExternalLinkImage').prop('checked', false); + } else { + $('#disableExternalLinkImage').prop('checked', true); + } + } + if ('[(${exhibition})]' != null && '[(${exhibition.mode})]' == 'OFFLINE') { offlineMessage.show(); } else { @@ -16,45 +47,96 @@ } $("#changeBgImgAlert").show(); - $("#cancelSpaceImgBtn").click(function() { - document.getElementById('spaceLinkImage').value = null; - $('#cancelSpaceImgBtn').attr('disabled', true); + $("#spaceCancelBtn").click(function() { + document.getElementById('spaceLinkImageBlock').value = null; + closeUploadSpaceLinkImage(); + $('#spaceCancelBtn').attr('disabled', true); + }); + + $("#changeSpaceLinkImageBtn").click(function() { + openUploadSpaceLinkImage(); }); - $("#cancelModuleImgBtn").click(function() { - document.getElementById('moduleLinkImage').value = null; - $('#cancelModuleImgBtn').attr('disabled', true); + $("#moduleCancelBtn").click(function() { + document.getElementById('moduleLinkImageBlock').value = null; + closeUploadModuleLinkImage(); + $('#moduleCancelBtn').attr('disabled', true); + }); + + $("#changeModuleLinkImageBtn").click(function() { + openUploadModuleLinkImage(); }); - $("#cancelExternalImgBtn").click(function() { - document.getElementById('externalLinkImage').value = null; - $('#cancelExternalImgBtn').attr('disabled', true); + $("#externalCancelBtn").click(function() { + document.getElementById('externalLinkImageBlock').value = null; + closeUploadExternalLinkImage(); + $('#externalCancelBtn').attr('disabled', true); + }); + + $("#changeExternalLinkImageBtn").click(function() { + openUploadExternalLinkImage(); }); //when input's value changes - $("#spaceLinkImage").change(function() { + $("#spaceLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelSpaceImgBtn").prop("disabled", false); + $("#spaceCancelBtn").attr("disabled", false); } else { - $("#cancelSpaceImgBtn").prop("disabled", true); + $("#spaceCancelBtn").attr("disabled", true); } }); - $("#moduleLinkImage").change(function() { + $("#moduleLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelModuleImgBtn").prop("disabled", false); + $("#moduleCancelBtn").attr("disabled", false); } else { - $("#cancelModuleImgBtn").prop("disabled", true); + $("#moduleCancelBtn").attr("disabled", true); } }); - $("#externalLinkImage").change(function() { + $("#externalLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelExternalImgBtn").prop("disabled", false); + $("#externalCancelBtn").attr("disabled", false); } else { - $("#cancelExternalImgBtn").prop("disabled", true); + $("#externalCancelBtn").attr("disabled", true); } }); + + $(".deleteDefaultLinkImage").click(function() { + var linkType = $(this).attr('link-type'); + var token = [[${_csrf.token}]]; + $.ajax({ + url: "[(@{/staff/exhibit/config/link/defaultImage/})]"+linkType, + type: 'DELETE', + headers:{ + 'X-CSRF-Token':token + }, + success: function(result) { + $("#" + linkType + "LinkImageBlock").css('display', 'none'); + $("#" + linkType + "UploadLinkImage").css('display', 'block'); + $("#" + linkType + "CancelBtn").attr("disabled", true); + }, + error: function(data) { + } + }); + }); + + $(".disableDefaultLinkImage").click(function() { + var linkType = $(this).attr('link-type'); + var token = [[${_csrf.token}]]; + $.ajax({ + dataType: 'json', + url: "[(@{/staff/exhibit/config/link/defaultImage/})]"+linkType, + type: 'PUT', + headers:{ + 'X-CSRF-Token':token + }, + success: function(result) { + }, + error: function(data) { + } + }); + }); }); function modeChange(modeChosen) { @@ -71,38 +153,141 @@ var defaultImages = $('#defaultImages'); defaultImages.show(); } + + + function openUploadSpaceLinkImage() { + $("#spaceUploadLinkImage").css('display', 'block'); + } - function defaultLinkModuleImages() { - $("#uploadModuleLinkImage").css('display', 'block'); + function closeUploadSpaceLinkImage() { + $("#spaceUploadLinkImage").css('display', 'none'); } - function defaultLinkExternalImages() { - $("#uploadExternalLinkImage").css('display', 'block'); + function openUploadModuleLinkImage() { + $("#moduleUploadLinkImage").css('display', 'block'); } - function openUploadSpaceLinkDefaultImgBlock() { - $("#uploadSpaceLinkImage").css('display', 'block'); + + function closeUploadModuleLinkImage() { + $("#moduleUploadLinkImage").css('display', 'none'); } + + function openUploadExternalLinkImage() { + $("#externalUploadLinkImage").css('display', 'block'); + } + + + function closeUploadExternalLinkImage() { + $("#externalUploadLinkImage").css('display', 'none'); + } + @@ -161,25 +346,37 @@

    Exhibition Configuration

    - -
    - - + +
    +
    + +
    + + + +
    +
    +
    -
    -
    +
    +
    + style="background: white; display: block;"> + id="image" accept=".png, .jpg, .jpeg, .gif, .svg" style="display: inline-block;" /> -

    - +

    +

    @@ -188,23 +385,36 @@

    Exhibition Configuration

    - -
    - - + +
    +
    + +
    + + + +
    +
    +
    -
    - +
    +
    + id="image" accept=".png, .jpg, .jpeg, .gif, .svg" style="display: inline-block;"/> -

    -

    @@ -214,25 +424,37 @@

    Exhibition Configuration

    - -
    - - + +
    +
    + +
    + + + +
    +
    +
    -
    - +
    +
    + id="image" accept=".png, .jpg, .jpeg, .gif, .svg" style="display: inline-block;"/> -

    - +

    +

    diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/space.html b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/space.html index b6f5f2073..c85d3d43e 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/space.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/space.html @@ -107,7 +107,7 @@ success: function(data) { if(data.length > 0){ defaultSpaceImageFlag = JSON.parse(data).defaultSpaceImageFlag; - defaultModuleImageFlag = JSON.parse(data).defaultModuleImageFlag + defaultModuleImageFlag = JSON.parse(data).defaultModuleImageFlag; defaultExternalLinkImageFlag = JSON.parse(data).defaultExternalLinkImageFlag; } } diff --git a/vspace/src/main/webapp/resources/extra/Home.css b/vspace/src/main/webapp/resources/extra/Home.css index 6c9122895..cf7af5e8e 100644 --- a/vspace/src/main/webapp/resources/extra/Home.css +++ b/vspace/src/main/webapp/resources/extra/Home.css @@ -485,6 +485,7 @@ font-size: 20px; top: 4px; left: 4px; + color: rgba(150, 45, 62, 1); } .Icon_awesome_info_m {