diff --git a/src/main/java/org/springframework/samples/petclinic/owner/Visit.java b/src/main/java/org/springframework/samples/petclinic/owner/Visit.java index 085cd2849b8..326e1beaf11 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/Visit.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/Visit.java @@ -39,7 +39,7 @@ public class Visit extends BaseEntity { @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate date; - @NotBlank + @NotBlank(message = "Description is required") private String description; /** diff --git a/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java b/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java index cc3e3ce1a09..7d7f13eb598 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java @@ -21,11 +21,7 @@ import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @@ -61,7 +57,7 @@ public void setAllowedFields(WebDataBinder dataBinder) { */ @ModelAttribute("visit") public Visit loadPetWithVisit(@PathVariable("ownerId") int ownerId, @PathVariable("petId") int petId, - Map model) { + @RequestParam(value = "visitId", required = false) Integer visitId, Map model) { Optional optionalOwner = owners.findById(ownerId); Owner owner = optionalOwner.orElseThrow(() -> new IllegalArgumentException( "Owner not found with id: " + ownerId + ". Please ensure the ID is correct ")); @@ -74,6 +70,14 @@ public Visit loadPetWithVisit(@PathVariable("ownerId") int ownerId, @PathVariabl model.put("pet", pet); model.put("owner", owner); + if (visitId != null) { + return pet.getVisits() + .stream() + .filter(v -> v.getId().equals(visitId)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Visit not found")); + } + Visit visit = new Visit(); pet.addVisit(visit); return visit; @@ -101,4 +105,31 @@ public String processNewVisitForm(@ModelAttribute Owner owner, @PathVariable int return "redirect:/owners/{ownerId}"; } + @GetMapping("/owners/{ownerId}/pets/{petId}/visits/{visitId}/edit") + public String initUpdateVisitForm() { + return "pets/editVisitForm"; + } + + @PostMapping("/owners/{ownerId}/pets/{petId}/visits/{visitId}/edit") + public String processUpdateVisitForm(@PathVariable int ownerId, @PathVariable int petId, @PathVariable int visitId, + @Valid Visit visit, BindingResult result, RedirectAttributes redirectAttributes) { + + if (result.hasErrors()) { + return "pets/editVisitForm"; + } + + Owner owner = owners.findById(ownerId).orElseThrow(); + Pet pet = owner.getPet(petId); + + Visit existingVisit = pet.getVisits().stream().filter(v -> v.getId().equals(visitId)).findFirst().orElseThrow(); + + existingVisit.setDescription(visit.getDescription()); + existingVisit.setDate(visit.getDate()); + + owners.save(owner); + + redirectAttributes.addFlashAttribute("message", "Visit updated"); + return "redirect:/owners/{ownerId}"; + } + } diff --git a/src/main/resources/messages/messages.properties b/src/main/resources/messages/messages.properties index 19356589594..bb17d4d3049 100644 --- a/src/main/resources/messages/messages.properties +++ b/src/main/resources/messages/messages.properties @@ -38,6 +38,7 @@ type=Type previousVisits=Previous Visits date=Date description=Description +edit=Edit new=New addVisit=Add Visit editPet=Edit Pet diff --git a/src/main/resources/templates/owners/ownerDetails.html b/src/main/resources/templates/owners/ownerDetails.html index cc175cd1315..8f34da30128 100644 --- a/src/main/resources/templates/owners/ownerDetails.html +++ b/src/main/resources/templates/owners/ownerDetails.html @@ -37,46 +37,67 @@

Owner Information

Owner Add New Pet -


Pets and Visits

- - - - - - +
-
-
-
Name
-
-
Birth Date
-
-
Type
-
-
-
- - - - - - - - - - - - - - - -
Visit DateDescription
Edit PetAdd Visit
-
+
+ + | + + | + +
+ +
+ + + + + + + + + + + + + + + + + + + + +
Visit DateDescriptionActions
+ + Edit + +
No visits yet
+ +
+ + Edit Pet + + + + Add Visit + +
+ +
+