From 278fd3d0e69e6c2925e0478cc43d9db54c788d56 Mon Sep 17 00:00:00 2001 From: Julian Ophals Date: Sun, 6 Apr 2025 01:20:23 -0700 Subject: [PATCH 01/12] [story/VSPC-275] almost finished implementing delete button for default images, fixed cancel button, fixed edit button --- vspace/.classpath | 12 +- .../diging/vspace/core/model/IExhibition.java | 6 + .../vspace/core/model/impl/Exhibition.java | 12 ++ .../vspace/core/services/IImageService.java | 2 + .../core/services/impl/ImageService.java | 12 ++ .../web/staff/DefaultLinkImageController.java | 66 +++++++- .../ExhibitionConfigurationController.java | 6 +- .../WEB-INF/views/staff/exhibit/config.html | 157 +++++++++++++----- 8 files changed, 210 insertions(+), 63 deletions(-) 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/model/IExhibition.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibition.java index ffa052264..ffe4e1683 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(); 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..a8434a27d 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 @@ -144,6 +144,10 @@ public void setSpaceLinkDefaultImage(IVSImage spaceLinkDefaultImage) { this.spaceLinkDefaultImage = spaceLinkDefaultImage; } @Override + public void deleteSpaceLinkDefaultImage() { + this.spaceLinkDefaultImage = null; + } + @Override public IVSImage getModuleLinkDefaultImage() { return moduleLinkDefaultImage; } @@ -152,6 +156,10 @@ public void setModuleLinkDefaultImage(IVSImage moduleLinkDefaultImage) { this.moduleLinkDefaultImage = moduleLinkDefaultImage; } @Override + public void deleteModuleLinkDefaultImage() { + this.moduleLinkDefaultImage = null; + } + @Override public IVSImage getExternalLinkDefaultImage() { return externalLinkDefaultImage; } @@ -160,6 +168,10 @@ public void setExternalLinkDefaultImage(IVSImage externalLinkDefaultImage) { this.externalLinkDefaultImage = externalLinkDefaultImage; } @Override + public void deleteExternalLinkDefaultImage() { + this.externalLinkDefaultImage = null; + } + @Override public boolean isAboutPageConfigured() { return aboutPageConfigured; } 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..5a540b61e 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 @@ -305,6 +305,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/DefaultLinkImageController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DefaultLinkImageController.java index 5660fb415..2a9a01988 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,14 +1,15 @@ 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.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; @@ -26,7 +27,8 @@ public class DefaultLinkImageController { private final Map> imageSetterMap = Map.of( "space", Exhibition::setSpaceLinkDefaultImage, "module", Exhibition::setModuleLinkDefaultImage, - "external", Exhibition::setExternalLinkDefaultImage); + "external", Exhibition::setExternalLinkDefaultImage + ); @Autowired private IExhibitionManager exhibitionManager; @@ -57,15 +59,61 @@ public String createOrUpdateLinkImage(HttpServletRequest request, 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"; + } + + @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) { + System.out.println("HERE1"); + attributes.addAttribute("exhibitId", exhibition.getId()); + attributes.addAttribute("alertType", "danger"); + attributes.addAttribute("message", "Could not delete the default image"); + attributes.addAttribute("showAlert", "true"); + } else { + System.out.println("HERE2"); + 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"; } } 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 f7f63685b..dd09f04a3 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 @@ -76,9 +76,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/staff/exhibit/config.html b/vspace/src/main/webapp/WEB-INF/views/staff/exhibit/config.html index 1481745be..eeae7e0bc 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 @@ -13,23 +13,38 @@ } $("#changeBgImgAlert").show(); - $("#cancelSpaceImgBtn").click(function() { - document.getElementById('spaceLinkImage').value = null; + $("#cancelUploadSpaceImgBtn").click(function() { + document.getElementById('spaceLinkImageBlock').value = null; + closeUploadSpaceLinkImage(); $('#cancelSpaceImgBtn').attr('disabled', true); }); + + $("#changeSpaceLinkImageBtn").click(function() { + openUploadSpaceLinkImage(); + }); - $("#cancelModuleImgBtn").click(function() { - document.getElementById('moduleLinkImage').value = null; + $("#cancelUploadModuleImgBtn").click(function() { + document.getElementById('moduleLinkImageBlock').value = null; + closeUploadModuleLinkImage(); $('#cancelModuleImgBtn').attr('disabled', true); }); + + $("#changeModuleLinkImageBtn").click(function() { + openUploadModuleLinkImage(); + }); - $("#cancelExternalImgBtn").click(function() { - document.getElementById('externalLinkImage').value = null; + $("#cancelUploadExternalImgBtn").click(function() { + document.getElementById('externalLinkImageBlock').value = null; + closeUploadExternalLinkImage(); $('#cancelExternalImgBtn').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); } else { @@ -37,7 +52,7 @@ } }); - $("#moduleLinkImage").change(function() { + $("#moduleLinkImageBlock").change(function() { if ($(this).val()) { $("#cancelModuleImgBtn").prop("disabled", false); } else { @@ -45,13 +60,31 @@ } }); - $("#externalLinkImage").change(function() { + $("#externalLinkImageBlock").change(function() { if ($(this).val()) { $("#cancelExternalImgBtn").prop("disabled", false); } else { $("#cancelExternalImgBtn").prop("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) { + console.log('SUCCESS!!!!!!'); + }, + error: function(data) { + console.log('FAILURE!!!!!'); + } + }); + }); }); function modeChange(modeChosen) { @@ -68,38 +101,68 @@ var defaultImages = $('#defaultImages'); defaultImages.show(); } + + + function openUploadSpaceLinkImage() { + $("#uploadSpaceLinkImage").css('display', 'block'); + } - function defaultLinkModuleImages() { + function closeUploadSpaceLinkImage() { + $("#uploadSpaceLinkImage").css('display', 'none'); + } + + function openUploadModuleLinkImage() { $("#uploadModuleLinkImage").css('display', 'block'); } - function defaultLinkExternalImages() { + + function closeUploadModuleLinkImage() { + $("#uploadModuleLinkImage").css('display', 'none'); + } + + function openUploadExternalLinkImage() { $("#uploadExternalLinkImage").css('display', 'block'); } + - function openUploadSpaceLinkDefaultImgBlock() { - $("#uploadSpaceLinkImage").css('display', 'block'); + function closeUploadExternalLinkImage() { + $("#uploadExternalLinkImage").css('display', 'none'); } + @@ -157,12 +220,15 @@

Exhibition Configuration

- -
+ +
- + +
@@ -174,7 +240,7 @@

Exhibition Configuration

id="image" class="form-control-file" />

-

@@ -184,11 +250,16 @@

Exhibition Configuration

- +
- + +
@@ -200,7 +271,7 @@

Exhibition Configuration

id="image" class="form-control-file" />

-

@@ -210,12 +281,16 @@

Exhibition Configuration

- +
- - + + +
@@ -227,7 +302,7 @@

Exhibition Configuration

id="image" class="form-control-file" />

-

From c435ea7eb893e5532cccb522fe86be4ac61eda2b Mon Sep 17 00:00:00 2001 From: Julian Ophals Date: Thu, 10 Apr 2025 22:53:40 -0700 Subject: [PATCH 02/12] [story/VSPC-275] in the process of implementing the disable slider for default images, added file upload constraints --- .../diging/vspace/core/model/IVSImage.java | 4 + .../vspace/core/model/impl/Exhibition.java | 6 +- .../vspace/core/model/impl/VSImage.java | 19 +- .../web/staff/DefaultImageApiController.java | 17 ++ .../web/staff/DefaultLinkImageController.java | 46 +++- .../WEB-INF/views/exhibition/space.html | 22 +- .../WEB-INF/views/staff/exhibit/config.html | 252 ++++++++++++++---- .../WEB-INF/views/staff/spaces/space.html | 2 +- 8 files changed, 303 insertions(+), 65 deletions(-) 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..e6faf408d 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 @@ -23,6 +23,10 @@ public interface IVSImage extends IVSMedia { void setHeight(int height); 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 a8434a27d..bc117b8b9 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; 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..5d30ea89b 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 @@ -8,7 +8,6 @@ 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 +33,8 @@ public class VSImage extends VSMedia implements IVSImage { private int height; private int width; + + private Boolean disableFlag = false; @OneToMany(targetEntity = Tag.class) private List tags; @@ -106,6 +107,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 +137,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/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 2a9a01988..7e13a6f4f 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 @@ -83,13 +83,55 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec IVSImage image = imageGetterMap.get(linkType).get(); if (image == null) { - System.out.println("HERE1"); attributes.addAttribute("exhibitId", exhibition.getId()); attributes.addAttribute("alertType", "danger"); attributes.addAttribute("message", "Could not delete the default image"); attributes.addAttribute("showAlert", "true"); } else { - System.out.println("HERE2"); + imageService.removeImage(image.getId()); + } + + 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"; + } + + @RequestMapping(value = "/staff/exhibit/config/link/defaultImage/{linkType}", method = RequestMethod.PUT) + public String disableLinkImage(@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 delete the default image"); + attributes.addAttribute("showAlert", "true"); + } else { imageService.removeImage(image.getId()); } 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..ed35e04f6 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html @@ -226,7 +226,11 @@ }); var defaultSpaceImageFlag; var defaultModuleImageFlag; - var defaultExternalLinkImageFlag; + var defaultExternalLinkImageFlag; + + var defaultSpaceImageDisableFlag; + var defaultModuleImageDisableFlag; + var defaultExternalImageDisableFlag; function toggleImgSize(isClicked){ var maxImgWidth = $(window).width(); @@ -392,6 +396,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}]]; 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 eeae7e0bc..14ab577ed 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 @@ -5,6 +5,23 @@ var offlineMessage = $('#offlineMessage'); var spaceParamExihibit = $('#spaceParamExihibit'); var defaultImages = $('#defaultImages'); + var defaultSpaceLinkImage = [[${defaultSpaceLinkImage}]]; + var defaultModuleLinkImage = [[${defaultModuleLinkImage}]]; + var defaultExternalLinkImage = [[${defaultExternalLinkImage}]]; + /* onsole.log('DEFAULT SPACE DISBLAE FLAG 1: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); + [[${defaultSpaceLinkImage.toggleDisableFlag()}]]; + console.log('DEFAULT SPACE DISBLAE FLAG 2: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); */ + if ([[${defaultSpaceLinkImage}]]==null) { + $('#cancelUploadSpaceImgBtn').attr('disabled', true); + } + + if ([[${defaultModuleLinkImage}]]==null) { + $('#cancelUploadModuleImgBtn').attr('disabled', true); + } + + if ([[${defaultExternalLinkImage}]]==null) { + $('#cancelUploadExternalImgBtn').attr('disabled', true); + } if ('[(${exhibition})]' != null && '[(${exhibition.mode})]' == 'OFFLINE') { offlineMessage.show(); @@ -16,55 +33,77 @@ $("#cancelUploadSpaceImgBtn").click(function() { document.getElementById('spaceLinkImageBlock').value = null; closeUploadSpaceLinkImage(); - $('#cancelSpaceImgBtn').attr('disabled', true); + $('#cancelUploadSpaceImgBtn').attr('disabled', true); }); $("#changeSpaceLinkImageBtn").click(function() { openUploadSpaceLinkImage(); }); + + $("#disableSpaceImage").change(function() { + if ($(this).val()) { + console.log('SPACE DISABLE FLAG 1: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); + [[${defaultSpaceLinkImage.toggleDisableFlag()}]]; + console.log('SPACE DISABLE FLAG 2: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); + } + }); $("#cancelUploadModuleImgBtn").click(function() { document.getElementById('moduleLinkImageBlock').value = null; closeUploadModuleLinkImage(); - $('#cancelModuleImgBtn').attr('disabled', true); + $('#cancelUploadModuleImgBtn').attr('disabled', true); }); $("#changeModuleLinkImageBtn").click(function() { openUploadModuleLinkImage(); }); + + $("#disableModuleImage").click(function() { + if ($(this).val()) { + defaultModuleLinkImage.toggleDisableFlag(); + console.log('MOD DISABLE FLAG: ', defaultModuleLinkImage.getDisableFlag()); + } + }); $("#cancelUploadExternalImgBtn").click(function() { document.getElementById('externalLinkImageBlock').value = null; closeUploadExternalLinkImage(); - $('#cancelExternalImgBtn').attr('disabled', true); + $('#cancelUploadExternalImgBtn').attr('disabled', true); }); $("#changeExternalLinkImageBtn").click(function() { openUploadExternalLinkImage(); }); + + $("#disableExternalImage").change(function() { + if ($(this).val()) { + defaultExternalLinkImage.toggleDisableFlag(); + console.log('EXT DISABLE FLAG: ', defaultExternalLinkImage.getDisableFlag()); + } + }); //when input's value changes $("#spaceLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelSpaceImgBtn").prop("disabled", false); + $("#cancelUploadSpaceImgBtn").attr("disabled", false); } else { - $("#cancelSpaceImgBtn").prop("disabled", true); + $("#cancelUploadSpaceImgBtn").attr("disabled", true); } }); $("#moduleLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelModuleImgBtn").prop("disabled", false); + $("#cancelUploadModuleImgBtn").attr("disabled", false); } else { - $("#cancelModuleImgBtn").prop("disabled", true); + $("#cancelUploadModuleImgBtn").attr("disabled", true); } }); $("#externalLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelExternalImgBtn").prop("disabled", false); + $("#cancelUploadExternalImgBtn").attr("disabled", false); } else { - $("#cancelExternalImgBtn").prop("disabled", true); + $("#cancelUploadExternalImgBtn").attr("disabled", true); } }); @@ -78,6 +117,9 @@ 'X-CSRF-Token':token }, success: function(result) { + $("#" + linkType + "LinkImageBlock").css('display', 'none'); + $("#" + linkType + "UploadLinkImage").css('display', 'block'); + console.log('SUCCESS!!!!!!'); }, error: function(data) { @@ -104,33 +146,39 @@ function openUploadSpaceLinkImage() { - $("#uploadSpaceLinkImage").css('display', 'block'); + $("#spaceUploadLinkImage").css('display', 'block'); } function closeUploadSpaceLinkImage() { - $("#uploadSpaceLinkImage").css('display', 'none'); + $("#spaceUploadLinkImage").css('display', 'none'); } function openUploadModuleLinkImage() { - $("#uploadModuleLinkImage").css('display', 'block'); + $("#moduleUploadLinkImage").css('display', 'block'); } function closeUploadModuleLinkImage() { - $("#uploadModuleLinkImage").css('display', 'none'); + $("#moduleUploadLinkImage").css('display', 'none'); } function openUploadExternalLinkImage() { - $("#uploadExternalLinkImage").css('display', 'block'); + $("#externalUploadLinkImage").css('display', 'block'); } function closeUploadExternalLinkImage() { - $("#uploadExternalLinkImage").css('display', 'none'); + $("#externalUploadLinkImage").css('display', 'none'); } @@ -221,27 +334,36 @@

Exhibition Configuration

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

+

+ class="btn light btn-sm btn-sm cancelBtn">Cancel

@@ -251,26 +373,34 @@

Exhibition Configuration

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

+

@@ -282,28 +412,36 @@

Exhibition Configuration

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

+

+ class="btn light btn-sm btn-sm cancelBtn">Cancel

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; } } From b8a4f873b4aa776797e99aee16356b54c82bff36 Mon Sep 17 00:00:00 2001 From: Julian Ophals Date: Tue, 15 Apr 2025 16:49:50 -0700 Subject: [PATCH 03/12] [story/VSPC-275] implemented disabling of default images, fixed backup default image styling, upgraded tika and commons-io dependencies, etc. --- vspace/pom.xml | 10 +- .../diging/vspace/core/model/IExhibition.java | 6 + .../diging/vspace/core/model/IVSImage.java | 2 +- .../vspace/core/model/impl/Exhibition.java | 25 ++++ .../vspace/core/model/impl/VSImage.java | 4 +- .../core/services/impl/ImageService.java | 4 +- .../web/staff/DefaultLinkImageController.java | 53 ++++---- .../ExhibitionConfigurationController.java | 12 -- .../WEB-INF/views/exhibition/space.html | 20 +-- .../WEB-INF/views/staff/exhibit/config.html | 119 ++++++++++-------- .../src/main/webapp/resources/extra/Home.css | 1 + 11 files changed, 145 insertions(+), 111 deletions(-) diff --git a/vspace/pom.xml b/vspace/pom.xml index 43423e53c..227bf0152 100644 --- a/vspace/pom.xml +++ b/vspace/pom.xml @@ -23,9 +23,9 @@ com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/vspace?serverTimezone=UTC&useEncoding=true - vspace - vspace - + user_vspc + password + /Users/jophals/Downloads/ @@ -354,13 +354,13 @@ commons-io commons-io - 2.7 + 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 ffe4e1683..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 @@ -58,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 e6faf408d..4d36cfbb2 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 @@ -24,7 +24,7 @@ public interface IVSImage extends IVSMedia { int getHeight(); - boolean getDisableFlag(); + Boolean getDisableFlag(); void toggleDisableFlag(); 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 bc117b8b9..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 @@ -139,42 +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 5d30ea89b..b57705ef5 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 @@ -34,7 +34,7 @@ public class VSImage extends VSMedia implements IVSImage { private int height; private int width; - private Boolean disableFlag = false; + private Boolean disableFlag; @OneToMany(targetEntity = Tag.class) private List tags; @@ -108,7 +108,7 @@ public void setWidth(int width) { } @Override - public boolean getDisableFlag() { + public Boolean getDisableFlag() { return disableFlag; } 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 5a540b61e..0acf82c61 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,11 +271,13 @@ public void removeCategory(IVSImage image, ImageCategory category) { */ @Override public IVSImage storeImage(byte[] image, String filename) { - IVSImage storedImage = null; if (image != null && image.length > 0) { + System.out.println("HERE1"); Tika tika = new Tika(); + System.out.println("HERE2"); String contentType = tika.detect(image); + System.out.println("CONTENT TYPE: " + contentType); storedImage = imageFactory.createImage(filename, contentType); storedImage = imageRepo.save((VSImage) storedImage); } 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 7e13a6f4f..2fb14a500 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 @@ -8,7 +8,10 @@ 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.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -16,6 +19,8 @@ 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.IVSImage; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.services.IExhibitionManager; @@ -85,7 +90,7 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec if (image == null) { attributes.addAttribute("exhibitId", exhibition.getId()); attributes.addAttribute("alertType", "danger"); - attributes.addAttribute("message", "Could not delete the default image"); + attributes.addAttribute("message", "Could not retrieve the default image prior to deleting"); attributes.addAttribute("showAlert", "true"); } else { imageService.removeImage(image.getId()); @@ -116,8 +121,9 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec } @RequestMapping(value = "/staff/exhibit/config/link/defaultImage/{linkType}", method = RequestMethod.PUT) - public String disableLinkImage(@PathVariable("linkType") String linkType, RedirectAttributes attributes) throws IOException { - Exhibition exhibition = (Exhibition) exhibitionManager.getStartExhibition(); + 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, @@ -127,35 +133,28 @@ public String disableLinkImage(@PathVariable("linkType") String linkType, Redire IVSImage image = imageGetterMap.get(linkType).get(); if (image == null) { - attributes.addAttribute("exhibitId", exhibition.getId()); - attributes.addAttribute("alertType", "danger"); - attributes.addAttribute("message", "Could not delete the default image"); - attributes.addAttribute("showAlert", "true"); - } else { - imageService.removeImage(image.getId()); + String errorMessage = "Could not retrieve the default image prior to disabling"; + return ResponseEntity.badRequest().body(errorMessage); } - - Map imageDeleterMap = Map.of( - "space", exhibition::deleteSpaceLinkDefaultImage, - "module", exhibition::deleteModuleLinkDefaultImage, - "external", exhibition::deleteExternalLinkDefaultImage + + Map imageDisablerMap = Map.of( + "space", exhibition::disableSpaceLinkDefaultImage, + "module", exhibition::disableModuleLinkDefaultImage, + "external", exhibition::disableExternalLinkDefaultImage ); - 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"); + Runnable disableDefautImageMethod = imageDisablerMap.get(linkType); + if (disableDefautImageMethod == null) { + String errorMessage = "Could not disable the default image"; + return ResponseEntity.badRequest().body(errorMessage); } else { - deleteDefautImageMethod.run(); + disableDefautImageMethod.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"); + + jsonObj.addProperty("defaultImageDisableFlag", image.getDisableFlag()); } - - return "redirect:/staff/exhibit/config"; + + 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 dd09f04a3..1ef6d8732 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,24 +1,18 @@ 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; 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.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; @@ -28,12 +22,9 @@ 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.core.services.impl.ExhibitionManager; @Controller public class ExhibitionConfigurationController { @@ -50,9 +41,6 @@ public class ExhibitionConfigurationController { @Autowired private ExhibitionFactory exhibitFactory; - @Autowired - private IImageService imageService; - @Autowired private ExhibitionLanguageConfig exhibitionLanguageConfig; 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 ed35e04f6..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) { @@ -374,9 +375,11 @@ $(".Info_cz_Class").remove(); drawLinks(); checkDefaultImage(); + checkDefaultImageDisabled() }); drawLinks(); checkDefaultImage(); + checkDefaultImageDisabled() toggleImgSize(false); }); @@ -440,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+'
'); } @@ -470,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+'
'); } @@ -522,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+'
'); } @@ -671,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 14ab577ed..4300dfa17 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 @@ -5,23 +5,37 @@ var offlineMessage = $('#offlineMessage'); var spaceParamExihibit = $('#spaceParamExihibit'); var defaultImages = $('#defaultImages'); - var defaultSpaceLinkImage = [[${defaultSpaceLinkImage}]]; - var defaultModuleLinkImage = [[${defaultModuleLinkImage}]]; - var defaultExternalLinkImage = [[${defaultExternalLinkImage}]]; - /* onsole.log('DEFAULT SPACE DISBLAE FLAG 1: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); - [[${defaultSpaceLinkImage.toggleDisableFlag()}]]; - console.log('DEFAULT SPACE DISBLAE FLAG 2: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); */ + + // Disable the cancel button if there is nothing to cancel, set intial position for disable slider if ([[${defaultSpaceLinkImage}]]==null) { $('#cancelUploadSpaceImgBtn').attr('disabled', true); + } else { + if ([[${defaultSpaceLinkImage?.getDisableFlag()}]]) { + $('#disableSpaceLinkImage').prop('checked', false); + } else { + $('#disableSpaceLinkImage').prop('checked', true); + } } if ([[${defaultModuleLinkImage}]]==null) { $('#cancelUploadModuleImgBtn').attr('disabled', true); + } else { + if ([[${defaultModuleLinkImage?.getDisableFlag()}]]) { + $('#disableModuleLinkImage').prop('checked', false); + } else { + $('#disableModuleLinkImage').prop('checked', true); + } } if ([[${defaultExternalLinkImage}]]==null) { $('#cancelUploadExternalImgBtn').attr('disabled', true); - } + } else { + if ([[${defaultExternalLinkImage?.getDisableFlag()}]]) { + $('#disableExternalLinkImage').prop('checked', false); + } else { + $('#disableExternalLinkImage').prop('checked', true); + } + } if ('[(${exhibition})]' != null && '[(${exhibition.mode})]' == 'OFFLINE') { offlineMessage.show(); @@ -39,14 +53,6 @@ $("#changeSpaceLinkImageBtn").click(function() { openUploadSpaceLinkImage(); }); - - $("#disableSpaceImage").change(function() { - if ($(this).val()) { - console.log('SPACE DISABLE FLAG 1: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); - [[${defaultSpaceLinkImage.toggleDisableFlag()}]]; - console.log('SPACE DISABLE FLAG 2: ', [[${defaultSpaceLinkImage.getDisableFlag()}]]); - } - }); $("#cancelUploadModuleImgBtn").click(function() { document.getElementById('moduleLinkImageBlock').value = null; @@ -57,13 +63,6 @@ $("#changeModuleLinkImageBtn").click(function() { openUploadModuleLinkImage(); }); - - $("#disableModuleImage").click(function() { - if ($(this).val()) { - defaultModuleLinkImage.toggleDisableFlag(); - console.log('MOD DISABLE FLAG: ', defaultModuleLinkImage.getDisableFlag()); - } - }); $("#cancelUploadExternalImgBtn").click(function() { document.getElementById('externalLinkImageBlock').value = null; @@ -74,13 +73,6 @@ $("#changeExternalLinkImageBtn").click(function() { openUploadExternalLinkImage(); }); - - $("#disableExternalImage").change(function() { - if ($(this).val()) { - defaultExternalLinkImage.toggleDisableFlag(); - console.log('EXT DISABLE FLAG: ', defaultExternalLinkImage.getDisableFlag()); - } - }); //when input's value changes $("#spaceLinkImageBlock").change(function() { @@ -118,12 +110,27 @@ }, success: function(result) { $("#" + linkType + "LinkImageBlock").css('display', 'none'); - $("#" + linkType + "UploadLinkImage").css('display', 'block'); - - console.log('SUCCESS!!!!!!'); + $("#" + linkType + "UploadLinkImage").css('display', 'block'); + }, + 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) { + console.log('DISABLE FLAG: ', result['defaultImageDisableFlag']); }, error: function(data) { - console.log('FAILURE!!!!!'); } }); }); @@ -179,21 +186,23 @@ display: block; } -.tooltiptext { +.changeBtn { + position: relative; + display: inline-block; + border-bottom: 1px dotted black; /* If you want dots under the hoverable text */ + opacity: 1; +} + +.changeBtn .tooltiptext { width: 140px; color: #fff; font-size: 13px; padding: 5px 0; background: black; - top: -5px; - right: 105%; -} - -.tooltip { - position: relative; - display: inline-block; - border-bottom: 1px dotted black; /* If you want dots under the hoverable text */ - opacity: 1; + bottom: 100%; + left: 50%; + margin-left: -70px; + top: initial; } .previewExhb:hover .tooltiptext { @@ -339,14 +348,14 @@

    Exhibition Configuration

    - -
    @@ -378,14 +387,14 @@

    Exhibition Configuration

    - -
    @@ -417,14 +426,14 @@

    Exhibition Configuration

    - -
    diff --git a/vspace/src/main/webapp/resources/extra/Home.css b/vspace/src/main/webapp/resources/extra/Home.css index b360e06a7..0ab304be5 100644 --- a/vspace/src/main/webapp/resources/extra/Home.css +++ b/vspace/src/main/webapp/resources/extra/Home.css @@ -467,6 +467,7 @@ font-size: 20px; top: 4px; left: 4px; + color: rgba(150, 45, 62, 1); } .Icon_awesome_info_m { From b9dcf3e228474482526ba7d33285018175f777a2 Mon Sep 17 00:00:00 2001 From: Julian Ophals Date: Tue, 15 Apr 2025 17:06:00 -0700 Subject: [PATCH 04/12] [story/VSPC-275] reverted accidental changes to pom and classpath files --- vspace/.classpath | 12 ++++++++++-- vspace/pom.xml | 6 +++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/vspace/.classpath b/vspace/.classpath index 94c3284e0..3aa72561a 100644 --- a/vspace/.classpath +++ b/vspace/.classpath @@ -27,7 +27,6 @@ - @@ -35,10 +34,19 @@ + + + + + + + + + - + \ No newline at end of file diff --git a/vspace/pom.xml b/vspace/pom.xml index 227bf0152..32f99d103 100644 --- a/vspace/pom.xml +++ b/vspace/pom.xml @@ -23,9 +23,9 @@ com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/vspace?serverTimezone=UTC&useEncoding=true - user_vspc - password - /Users/jophals/Downloads/ + vspace + vspace + From 0f32151f14fd775f3c9c8d6d053ff12feab85044 Mon Sep 17 00:00:00 2001 From: Julian Ophals Date: Wed, 16 Apr 2025 08:56:10 -0700 Subject: [PATCH 05/12] [story/VSPC-275] fixed CodeFactor indentation issues --- .../diging/vspace/core/model/IVSImage.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) 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 4d36cfbb2..9366ee8ab 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,29 +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(); - - Boolean getDisableFlag(); - - void toggleDisableFlag(); + int getHeight(); + + Boolean getDisableFlag(); + + void toggleDisableFlag(); void setCategories(List categories); From 56d287bc4f87a6e50b9a612719701e11cb605daf Mon Sep 17 00:00:00 2001 From: Julian Ophals Date: Mon, 23 Jun 2025 13:26:12 -0700 Subject: [PATCH 06/12] [story/VSPC-275] fixed initialization of disbaledFlag property, fixed cancel button not disabling after default images are deleted, fixed casting of Exhibition type in controller, added javadoc for default image delete endpoint --- .../diging/vspace/core/model/IVSImage.java | 2 +- .../vspace/core/model/impl/VSImage.java | 6 ++- .../core/services/impl/ImageService.java | 3 -- .../web/staff/DefaultLinkImageController.java | 35 +++++++++++----- .../WEB-INF/views/staff/exhibit/config.html | 40 +++++++++---------- 5 files changed, 50 insertions(+), 36 deletions(-) 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 9366ee8ab..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 @@ -24,7 +24,7 @@ public interface IVSImage extends IVSMedia { int getHeight(); - Boolean getDisableFlag(); + boolean getDisableFlag(); void toggleDisableFlag(); 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 b57705ef5..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,6 +2,7 @@ import java.util.List; +import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -34,7 +35,8 @@ public class VSImage extends VSMedia implements IVSImage { private int height; private int width; - private Boolean disableFlag; + @Column(name = "disableFlag", nullable = false) + private boolean disableFlag = false; @OneToMany(targetEntity = Tag.class) private List tags; @@ -108,7 +110,7 @@ public void setWidth(int width) { } @Override - public Boolean getDisableFlag() { + public boolean getDisableFlag() { return disableFlag; } 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 0acf82c61..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 @@ -273,11 +273,8 @@ public void removeCategory(IVSImage image, ImageCategory category) { public IVSImage storeImage(byte[] image, String filename) { IVSImage storedImage = null; if (image != null && image.length > 0) { - System.out.println("HERE1"); Tika tika = new Tika(); - System.out.println("HERE2"); String contentType = tika.detect(image); - System.out.println("CONTENT TYPE: " + contentType); storedImage = imageFactory.createImage(filename, contentType); storedImage = imageRepo.save((VSImage) storedImage); } 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 2fb14a500..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 @@ -11,7 +11,6 @@ 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; @@ -21,6 +20,7 @@ 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; @@ -29,10 +29,10 @@ @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 @@ -58,7 +58,7 @@ 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"); @@ -69,13 +69,21 @@ public String createOrUpdateLinkImage(HttpServletRequest request, exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); attributes.addAttribute("exhibitId", exhibition.getId()); attributes.addAttribute("alertType", "success"); - attributes.addAttribute("message", "Successfully Saved!"); + 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(); @@ -120,10 +128,18 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec 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(); + JsonObject jsonObj = new JsonObject(); Map> imageGetterMap = Map.of( "space", exhibition::getSpaceLinkDefaultImage, @@ -149,8 +165,7 @@ public ResponseEntity disableLinkImage(@PathVariable("linkType") String return ResponseEntity.badRequest().body(errorMessage); } else { disableDefautImageMethod.run(); - exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); - + exhibitionManager.storeExhibition(exhibition); jsonObj.addProperty("defaultImageDisableFlag", image.getDisableFlag()); } 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 bd930f615..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 @@ -11,7 +11,7 @@ // Disable the cancel button if there is nothing to cancel, set intial position for disable slider if ([[${defaultSpaceLinkImage}]]==null) { - $('#cancelUploadSpaceImgBtn').attr('disabled', true); + $('#spaceCancelBtn').attr('disabled', true); } else { if ([[${defaultSpaceLinkImage?.getDisableFlag()}]]) { $('#disableSpaceLinkImage').prop('checked', false); @@ -21,7 +21,7 @@ } if ([[${defaultModuleLinkImage}]]==null) { - $('#cancelUploadModuleImgBtn').attr('disabled', true); + $('#moduleCancelBtn').attr('disabled', true); } else { if ([[${defaultModuleLinkImage?.getDisableFlag()}]]) { $('#disableModuleLinkImage').prop('checked', false); @@ -31,7 +31,7 @@ } if ([[${defaultExternalLinkImage}]]==null) { - $('#cancelUploadExternalImgBtn').attr('disabled', true); + $('#externalCancelBtn').attr('disabled', true); } else { if ([[${defaultExternalLinkImage?.getDisableFlag()}]]) { $('#disableExternalLinkImage').prop('checked', false); @@ -47,30 +47,30 @@ } $("#changeBgImgAlert").show(); - $("#cancelUploadSpaceImgBtn").click(function() { + $("#spaceCancelBtn").click(function() { document.getElementById('spaceLinkImageBlock').value = null; closeUploadSpaceLinkImage(); - $('#cancelUploadSpaceImgBtn').attr('disabled', true); + $('#spaceCancelBtn').attr('disabled', true); }); $("#changeSpaceLinkImageBtn").click(function() { openUploadSpaceLinkImage(); }); - $("#cancelUploadModuleImgBtn").click(function() { + $("#moduleCancelBtn").click(function() { document.getElementById('moduleLinkImageBlock').value = null; closeUploadModuleLinkImage(); - $('#cancelUploadModuleImgBtn').attr('disabled', true); + $('#moduleCancelBtn').attr('disabled', true); }); $("#changeModuleLinkImageBtn").click(function() { openUploadModuleLinkImage(); }); - $("#cancelUploadExternalImgBtn").click(function() { + $("#externalCancelBtn").click(function() { document.getElementById('externalLinkImageBlock').value = null; closeUploadExternalLinkImage(); - $('#cancelUploadExternalImgBtn').attr('disabled', true); + $('#externalCancelBtn').attr('disabled', true); }); $("#changeExternalLinkImageBtn").click(function() { @@ -80,25 +80,25 @@ //when input's value changes $("#spaceLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelUploadSpaceImgBtn").attr("disabled", false); + $("#spaceCancelBtn").attr("disabled", false); } else { - $("#cancelUploadSpaceImgBtn").attr("disabled", true); + $("#spaceCancelBtn").attr("disabled", true); } }); $("#moduleLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelUploadModuleImgBtn").attr("disabled", false); + $("#moduleCancelBtn").attr("disabled", false); } else { - $("#cancelUploadModuleImgBtn").attr("disabled", true); + $("#moduleCancelBtn").attr("disabled", true); } }); $("#externalLinkImageBlock").change(function() { if ($(this).val()) { - $("#cancelUploadExternalImgBtn").attr("disabled", false); + $("#externalCancelBtn").attr("disabled", false); } else { - $("#cancelUploadExternalImgBtn").attr("disabled", true); + $("#externalCancelBtn").attr("disabled", true); } }); @@ -113,7 +113,8 @@ }, success: function(result) { $("#" + linkType + "LinkImageBlock").css('display', 'none'); - $("#" + linkType + "UploadLinkImage").css('display', 'block'); + $("#" + linkType + "UploadLinkImage").css('display', 'block'); + $("#" + linkType + "CancelBtn").attr("disabled", true); }, error: function(data) { } @@ -131,7 +132,6 @@ 'X-CSRF-Token':token }, success: function(result) { - console.log('DISABLE FLAG: ', result['defaultImageDisableFlag']); }, error: function(data) { } @@ -375,7 +375,7 @@

    Exhibition Configuration

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

    -

    @@ -414,7 +414,7 @@

    Exhibition Configuration

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

    -

    @@ -453,7 +453,7 @@

    Exhibition Configuration

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

    -

    From ae49901b47a56e3eb9cd60de5d4d9d9d90171bd4 Mon Sep 17 00:00:00 2001 From: Girik1105 Date: Thu, 30 Oct 2025 12:00:55 -0700 Subject: [PATCH 07/12] [VSPC-275] Chabged Exhibition to IExhibition in DefaultLingImageController --- .../vspace/web/staff/DefaultLinkImageController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 74e0a7be1..209805b47 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 @@ -55,7 +55,7 @@ public String createOrUpdateLinkImage(HttpServletRequest request, @RequestParam(name = "image", required = false) MultipartFile image, @RequestParam(name="linkType") String linkType, RedirectAttributes attributes) throws IOException { - Exhibition exhibition = (Exhibition) exhibitionManager.getStartExhibition(); + IExhibition exhibition = (IExhibition) exhibitionManager.getStartExhibition(); IVSImage defaultImage = imageService.storeImage(image.getBytes(), image.getOriginalFilename()); BiConsumer setter = imageSetterMap.get(linkType); @@ -66,7 +66,7 @@ public String createOrUpdateLinkImage(HttpServletRequest request, attributes.addAttribute("showAlert", "true"); } else { setter.accept(exhibition, defaultImage); - exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); + exhibition = (IExhibition) exhibitionManager.storeExhibition(exhibition); attributes.addAttribute("exhibitId", exhibition.getId()); attributes.addAttribute("alertType", "success"); attributes.addAttribute("message", "Successfully saved!"); @@ -86,7 +86,7 @@ public String createOrUpdateLinkImage(HttpServletRequest request, */ @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(); + IExhibition exhibition = (IExhibition) exhibitionManager.getStartExhibition(); Map> imageGetterMap = Map.of( "space", exhibition::getSpaceLinkDefaultImage, @@ -118,7 +118,7 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec attributes.addAttribute("showAlert", "true"); } else { deleteDefautImageMethod.run(); - exhibition = (Exhibition) exhibitionManager.storeExhibition(exhibition); + exhibition = (IExhibition) exhibitionManager.storeExhibition(exhibition); attributes.addAttribute("exhibitId", exhibition.getId()); attributes.addAttribute("alertType", "success"); attributes.addAttribute("message", "Successfully deleted the default image!"); @@ -138,7 +138,7 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec */ @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(); + IExhibition exhibition = (IExhibition) exhibitionManager.getStartExhibition(); JsonObject jsonObj = new JsonObject(); Map> imageGetterMap = Map.of( From e537d8446af332d8cfed56238561cddea3dea634 Mon Sep 17 00:00:00 2001 From: Girik1105 Date: Fri, 31 Oct 2025 16:31:50 -0700 Subject: [PATCH 08/12] [VSPC-275] Improved toString() method to include useful info, in config removed repetitive code and made a func --- .../vspace/core/model/impl/VSImage.java | 7 ++- .../web/staff/DefaultLinkImageController.java | 17 ++++---- .../WEB-INF/views/exhibition/space.html | 1 - .../WEB-INF/views/staff/exhibit/config.html | 43 ++++++------------- 4 files changed, 27 insertions(+), 41 deletions(-) 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 8729d44fe..68cba3895 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 @@ -142,7 +142,12 @@ public void setCategories(List categories) { @Override public String toString() { return "VSImage{" + - "disableFlag='" + disableFlag + + "id='" + id + '\'' + + ", filename='" + getFilename() + '\'' + + ", width=" + width + + ", height=" + height + + ", disableFlag=" + disableFlag + + ", hashCode=" + hashCode() + '}'; } } 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 209805b47..c28fa378e 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 @@ -138,6 +138,12 @@ public String deleteLinkImage(@PathVariable("linkType") String linkType, Redirec */ @RequestMapping(value = "/staff/exhibit/config/link/defaultImage/{linkType}", method = RequestMethod.PUT) public ResponseEntity disableLinkImage(@PathVariable("linkType") String linkType, RedirectAttributes attributes) throws IOException { + // Validate linkType first + if (!imageSetterMap.containsKey(linkType)) { + String errorMessage = "Invalid link type: " + linkType; + return ResponseEntity.badRequest().body(errorMessage); + } + IExhibition exhibition = (IExhibition) exhibitionManager.getStartExhibition(); JsonObject jsonObj = new JsonObject(); @@ -160,14 +166,9 @@ public ResponseEntity disableLinkImage(@PathVariable("linkType") String ); 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()); - } + disableDefautImageMethod.run(); + exhibitionManager.storeExhibition(exhibition); + jsonObj.addProperty("defaultImageDisableFlag", image.getDisableFlag()); return new ResponseEntity<>(jsonObj.toString(), HttpStatus.OK); 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 fc92c978c..c41f3f403 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html @@ -473,7 +473,6 @@ 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{ 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 bb0e06efc..acd8f3fff 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 @@ -4,41 +4,24 @@ From 5626172dc47dc78ccf29fe29a694349a026d1fbe Mon Sep 17 00:00:00 2001 From: Girik1105 Date: Wed, 5 Nov 2025 11:00:02 -0700 Subject: [PATCH 10/12] [VSPC-275] Default image thumbnail works in dashboard --- .../vspace/web/api/ImageApiController.java | 13 +++++++++++-- .../vspace/web/staff/DashboardController.java | 15 +++++++++++++++ .../vspace/web/staff/ListSpacesController.java | 14 ++++++++++++++ .../views/staff/dashboard/dashboard.html | 16 ++++++++++++++-- .../WEB-INF/views/staff/spaces/spacelist.html | 18 +++++++++++++++--- 5 files changed, 69 insertions(+), 7 deletions(-) diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/api/ImageApiController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/api/ImageApiController.java index 4ced5d35c..5dec7b272 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/api/ImageApiController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/api/ImageApiController.java @@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Optional; + import edu.asu.diging.vspace.core.data.ImageRepository; import edu.asu.diging.vspace.core.file.IStorageEngine; import edu.asu.diging.vspace.core.model.IVSImage; @@ -32,8 +34,15 @@ public class ImageApiController { private IStorageEngine storage; @RequestMapping(API_IMAGE_PATH + "{id}") - public ResponseEntity getImage(@PathVariable String id) { - IVSImage image = imageRepo.findById(id).get(); + public ResponseEntity getImage(@PathVariable("id") String id) { + Optional imageOpt = imageRepo.findById(id); + + if (!imageOpt.isPresent()) { + logger.warn("Image not found for id: {}", id); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + IVSImage image = imageOpt.get(); byte[] imageContent = null; try { imageContent = storage.getMediaContent(image.getId(), image.getFilename()); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DashboardController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DashboardController.java index dd12c48ab..61c2a95e9 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DashboardController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DashboardController.java @@ -14,6 +14,7 @@ import edu.asu.diging.vspace.core.data.SpaceRepository; import edu.asu.diging.vspace.core.factory.impl.ExhibitionFactory; import edu.asu.diging.vspace.core.model.ExhibitionModes; +import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.model.impl.Module; import edu.asu.diging.vspace.core.model.impl.Space; @@ -50,14 +51,28 @@ public String displayDashboard(Model model, Authentication authentication) { Exhibition exhibition = (Exhibition) exhibitManager.getStartExhibition(); String previewId = null; ExhibitionModes exhibitionMode = null; + boolean hasDefaultSpaceImage = false; + boolean isDefaultSpaceImageDisabled = false; + if (exhibition != null) { previewId = exhibition.getPreviewId(); exhibitionMode = exhibition.getMode(); + + // Check if default space link image exists and is not disabled + IVSImage defaultSpaceImage = exhibition.getSpaceLinkDefaultImage(); + if (defaultSpaceImage != null) { + hasDefaultSpaceImage = true; + isDefaultSpaceImageDisabled = defaultSpaceImage.getDisableFlag(); + } } + model.addAttribute("recentSpaces", recentSpaces); model.addAttribute("recentModules", recentModules); model.addAttribute("previewId", previewId); model.addAttribute("exhibitionMode", exhibitionMode!=null?exhibitionMode.name():null); + model.addAttribute("hasDefaultSpaceImage", hasDefaultSpaceImage); + model.addAttribute("isDefaultSpaceImageDisabled", isDefaultSpaceImageDisabled); + return "staff/dashboard/dashboard"; } 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..68ed1f5f1 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 @@ -7,6 +7,7 @@ import edu.asu.diging.vspace.core.data.SpaceRepository; import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.ISpaceManager; @@ -27,10 +28,23 @@ public String listSpaces(Model model) { model.addAttribute("spaces", spaceManager.addIncomingLinkInfoToSpaces(spaceRepo.findAll())); IExhibition startExhibition = exhibitionManager.getStartExhibition(); + boolean hasDefaultSpaceImage = false; + boolean isDefaultSpaceImageDisabled = false; + if(startExhibition!=null) { model.addAttribute("startSpace", startExhibition.getStartSpace()); + + // Check if default space link image exists and is not disabled + IVSImage defaultSpaceImage = startExhibition.getSpaceLinkDefaultImage(); + if (defaultSpaceImage != null) { + hasDefaultSpaceImage = true; + isDefaultSpaceImageDisabled = defaultSpaceImage.getDisableFlag(); + } } + model.addAttribute("hasDefaultSpaceImage", hasDefaultSpaceImage); + model.addAttribute("isDefaultSpaceImageDisabled", isDefaultSpaceImageDisabled); + return "staff/spaces/spacelist"; } } \ No newline at end of file diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/dashboard/dashboard.html b/vspace/src/main/webapp/WEB-INF/views/staff/dashboard/dashboard.html index 92c34a168..26430cb71 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/dashboard/dashboard.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/dashboard/dashboard.html @@ -45,7 +45,7 @@ } }); /*[/]*/ - +