From 42e33512b5ebdf0b8fcd6eb4a41b82e94d666e2b Mon Sep 17 00:00:00 2001 From: MateusVinicio Date: Mon, 6 Jun 2022 21:25:11 -0300 Subject: [PATCH] adicionando upload de multiplas imagens no jobRequest --- .../controller/JobRequestController.java | 65 +++++++++++++++---- .../servicebook/model/dto/JobRequestDTO.java | 5 +- .../servicebook/model/entity/JobImages.java | 1 + .../client/job-request/wizard-step-05.jsp | 27 ++++++-- .../assets/resources/scripts/job-image.js | 14 ++++ .../webapp/assets/resources/styles/style.css | 31 +++++++++ 6 files changed, 122 insertions(+), 21 deletions(-) create mode 100644 src/main/webapp/assets/resources/scripts/job-image.js diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/JobRequestController.java b/src/main/java/br/edu/utfpr/servicebook/controller/JobRequestController.java index 05f2992b..3b445901 100644 --- a/src/main/java/br/edu/utfpr/servicebook/controller/JobRequestController.java +++ b/src/main/java/br/edu/utfpr/servicebook/controller/JobRequestController.java @@ -6,6 +6,7 @@ import br.edu.utfpr.servicebook.model.entity.City; import br.edu.utfpr.servicebook.model.entity.Expertise; import br.edu.utfpr.servicebook.model.entity.Individual; +import br.edu.utfpr.servicebook.model.entity.JobImages; import br.edu.utfpr.servicebook.model.entity.JobRequest; import br.edu.utfpr.servicebook.model.mapper.ExpertiseMapper; import br.edu.utfpr.servicebook.model.mapper.IndividualMapper; @@ -14,6 +15,7 @@ import br.edu.utfpr.servicebook.service.ExpertiseService; import br.edu.utfpr.servicebook.service.IndividualService; import br.edu.utfpr.servicebook.service.JobRequestService; +import br.edu.utfpr.servicebook.service.JobImagesService; import br.edu.utfpr.servicebook.util.DateUtil; import br.edu.utfpr.servicebook.util.WizardSessionUtil; import com.cloudinary.Cloudinary; @@ -37,6 +39,7 @@ import java.nio.file.Files; import java.util.Arrays; import java.util.List; +import java.util.ArrayList; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -51,6 +54,9 @@ public class JobRequestController { @Autowired private JobRequestService jobRequestService; + @Autowired + private JobImagesService jobImagesService; + @Autowired private IndividualService individualService; @@ -237,28 +243,55 @@ public String saveFormDescription(HttpSession httpSession, @Validated(JobRequest } @PostMapping("/passo-5") public String saveFormImagePath(HttpSession httpSession, RedirectAttributes redirectAttributes, JobRequestDTO dto, Model model) throws IOException { + try { + if (dto.images.get(0).getOriginalFilename().equals("")) { + redirectAttributes.addFlashAttribute("errors", "Nenhuma imagem enviada."); + return "redirect:/requisicoes?passo=5"; + } + JobRequestDTO sessionDTO = wizardSessionUtil.getWizardState(httpSession, JobRequestDTO.class, WizardSessionUtil.KEY_WIZARD_JOB_REQUEST); - //persiste na sessão - JobRequestDTO sessionDTO = wizardSessionUtil.getWizardState(httpSession, JobRequestDTO.class, WizardSessionUtil.KEY_WIZARD_JOB_REQUEST); - sessionDTO.setImageFile(dto.getImageFile()); + List successImages = new ArrayList<>(); + List invalidImages = new ArrayList<>(); - System.out.println(sessionDTO.getExpertiseId()); + for (MultipartFile image : dto.getImages()) { + if (isValidateImage(image)) { + File jobImage = Files.createTempFile("temp", image.getOriginalFilename()).toFile(); + image.transferTo(jobImage); + Map data = cloudinary.uploader().upload(jobImage, ObjectUtils.asMap("folder", "jobs")); - if(isValidateImage(dto.getImageFile())){ - File jobImage = Files.createTempFile("temp", dto.getImageFile().getOriginalFilename()).toFile(); - dto.getImageFile().transferTo(jobImage); - Map data = cloudinary.uploader().upload(jobImage, ObjectUtils.asMap("folder", "jobs")); + successImages.add((String) data.get("url")); + } else { + invalidImages.add("Não foi possível anexar o arquivo " + image.getOriginalFilename() + "."); + } + } + if (!successImages.isEmpty()) + sessionDTO.setImagesSession(successImages); - sessionDTO.setImageSession((String)data.get("url")); - log.debug("Passo 5 {}", sessionDTO); + if (!invalidImages.isEmpty()) + redirectAttributes.addFlashAttribute("errors", invalidImages); - return "redirect:/requisicoes/passo=6"; - } else { - return "redirect:/requisicoes/passo=6"; + return "redirect:/requisicoes?passo=5"; + } + catch (Exception e){ + redirectAttributes.addFlashAttribute("errors", "Um erro inesperado aconteceu. Tente novamente!"); + return "redirect:/requisicoes?passo=5"; } + } + @DeleteMapping("/session/image/{url}") + public String deleteImageSession(@PathVariable String url, HttpSession httpSession, RedirectAttributes redirectAttributes, JobRequestDTO dto, Model model) throws IOException { + + JobRequestDTO sessionDTO = wizardSessionUtil.getWizardState(httpSession, JobRequestDTO.class, WizardSessionUtil.KEY_WIZARD_JOB_REQUEST); + for (String path : sessionDTO.getImagesSession()) { + if(path.contains(url)) { + int index = sessionDTO.getImagesSession().indexOf(path); + sessionDTO.getImagesSession().remove(index); + return "Imagem apagada."; + } + } + return "Não foi possível apagar imagem."; } @GetMapping("passo=6") @@ -296,13 +329,17 @@ public String saveFormVerification(HttpSession httpSession, JobRequestDTO dto, R sessionDTO.setClientConfirmation(true); sessionDTO.setDateCreated(DateUtil.getToday()); - sessionDTO.setStatus("Requerido"); + sessionDTO.setStatus("AVAILABLE"); log.debug("Passo 7 {}", sessionDTO); JobRequest jobRequest = jobRequestMapper.toEntity(sessionDTO); jobRequest.setIndividual(client); jobRequest.setExpertise(exp); //jobRequest.setImage(sessionDTO.getImageSession()); jobRequestService.save(jobRequest); + for (String path : sessionDTO.getImagesSession()) { + JobImages jobImage = new JobImages(jobRequest, path); + jobImagesService.save(jobImage); + } redirectAttributes.addFlashAttribute("msg", "Requisição confirmada!"); status.setComplete(); return "redirect:/requisicoes?passo=8"; diff --git a/src/main/java/br/edu/utfpr/servicebook/model/dto/JobRequestDTO.java b/src/main/java/br/edu/utfpr/servicebook/model/dto/JobRequestDTO.java index 3b8ceebc..297f31f7 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/dto/JobRequestDTO.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/dto/JobRequestDTO.java @@ -9,6 +9,7 @@ import javax.validation.constraints.*; import java.io.Serializable; import java.time.LocalDate; +import java.util.List; @Data @NoArgsConstructor @@ -36,8 +37,8 @@ public class JobRequestDTO implements Serializable { @NotBlank(message = "A Descrição não pode ser vazia.", groups = RequestDescriptionGroupValidation.class) private String description; - private MultipartFile imageFile; - private String imageSession; + public List images; + private List imagesSession; // @NotBlank(message = "O campo CEP é de preenchimento obrigatório", groups = RequestClientInfoGroupValidation.class) // @Pattern(regexp="\\d{5}-?\\d{3}",message="Por favor, preencha um CEP válido", groups = RequestClientInfoGroupValidation.class) diff --git a/src/main/java/br/edu/utfpr/servicebook/model/entity/JobImages.java b/src/main/java/br/edu/utfpr/servicebook/model/entity/JobImages.java index 64ba1818..8e516089 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/entity/JobImages.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/entity/JobImages.java @@ -28,6 +28,7 @@ public class JobImages { @ManyToOne @JoinColumn(name = "job_request_id") + @NonNull private JobRequest jobRequest; @NonNull diff --git a/src/main/webapp/WEB-INF/view/client/job-request/wizard-step-05.jsp b/src/main/webapp/WEB-INF/view/client/job-request/wizard-step-05.jsp index 121e8dae..3f4e5c3b 100644 --- a/src/main/webapp/WEB-INF/view/client/job-request/wizard-step-05.jsp +++ b/src/main/webapp/WEB-INF/view/client/job-request/wizard-step-05.jsp @@ -9,8 +9,8 @@
- - ${e.getDefaultMessage()}
+ + ${error}
@@ -26,14 +26,29 @@
- Choose File - + Escolha as Imagens +
+
+
+ +
+
+
Voltar @@ -41,7 +56,7 @@
- + Próximo
@@ -54,3 +69,5 @@ + + diff --git a/src/main/webapp/assets/resources/scripts/job-image.js b/src/main/webapp/assets/resources/scripts/job-image.js new file mode 100644 index 00000000..de9cb7a5 --- /dev/null +++ b/src/main/webapp/assets/resources/scripts/job-image.js @@ -0,0 +1,14 @@ +function deleteImage(url){ + let path = url.split('/'); + let filename = path[path.length - 1]; + + $.ajax({ + type: 'DELETE', + url: 'requisicoes/session/image/' + filename, + complete: function() { + location. reload(); + } + }); +} + + diff --git a/src/main/webapp/assets/resources/styles/style.css b/src/main/webapp/assets/resources/styles/style.css index f02ffc4c..73f6609d 100644 --- a/src/main/webapp/assets/resources/styles/style.css +++ b/src/main/webapp/assets/resources/styles/style.css @@ -170,6 +170,15 @@ blockquote{ background-color: #3f51b5; } +.btn-validate{ + color: #fff; + background-color: #28a745; +} + +.btn-validate:hover{ + background-color: #28a745 !important; +} + .btn-gray{ color: #1c2231; background-color: #cccccc; @@ -635,6 +644,28 @@ textarea { margin-top: 14px; } +.gallery { + margin: -3px; + width: 100%; + overflow: hidden; +} + +.box-image{ + width: 100px; + height: 140px; + display: inline-block; +} + +.box-image img { + width: 100px; + height: 100px; + object-fit: contain; +} + +.box-image a { + color: #f44336; +} + @media only screen and (max-width : 992px) { .parallax-container .section { position: absolute;