diff --git a/build.gradle b/build.gradle index de322fceebe23864820f63c414daeb1dcbe1c391..35e48fec6bee2b4ae45087f8df5749a71edb9edb 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,9 @@ dependencies { developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-validation' +// implementation 'org.springframework.boot:spring-boot-starter-jdbc' +// implementation 'org.mariadb.jdbc:mariadb-java-client:2.1.2' } tasks.named('bootBuildImage') { diff --git a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java b/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java new file mode 100644 index 0000000000000000000000000000000000000000..ee6628f305b885fab6253be7ab50482d1cc818f2 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java @@ -0,0 +1,29 @@ +package Team5.SmartTowns.Landmarks; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import lombok.AllArgsConstructor; +import lombok.Data; +@Data +@AllArgsConstructor +public class Landmarks { + @NotEmpty(message = "You must type in a username.") + private String landmarkName; + @Email(message = "You must attach a contact address.") + private String landmarkEmail; + private String landmarkDescription; + private String landmarkLocation; + private Integer trailID; + + + public Landmarks(){ + this.landmarkName =""; + this.landmarkEmail=""; + this.landmarkDescription =""; + this.landmarkLocation =""; + this.trailID =0; + } + + +} diff --git a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java b/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java new file mode 100644 index 0000000000000000000000000000000000000000..98c35594da947d261f6980b10a516a75b4583431 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java @@ -0,0 +1,53 @@ +package Team5.SmartTowns.Landmarks; + +import jakarta.validation.Valid; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.servlet.ModelAndView; +//import jakarta.validation.Valid; + +@Controller +public class LandmarksController { + +// Controllers for LandmarkFormTh.html landmark submission form + @GetMapping("/landmarkSubmission") + public ModelAndView landmarkSubmission(){ + ModelAndView modelAndView1 = new ModelAndView("Landmarks/LandmarkFormTh.html"); + modelAndView1.addObject("landmarkData", new Landmarks()); + return modelAndView1; + + } + + + @PostMapping("/landmarkSub") + public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model ) { + + + if (bindingResult.hasErrors()) { + ModelAndView modelAndView = new ModelAndView("Landmarks/LandmarkFormTh.html", model.asMap()); + return modelAndView; + + } else{ + System.out.println(landmarks); + // current functionality only prints successful Landmarks, (todo )database integration is necessary here + + + ModelAndView modelAndView = new ModelAndView("redirect:/test.html"); + return modelAndView; + + } + + + + + + + + } + + +} diff --git a/src/main/resources/static/css/landmarkFormStyle.css b/src/main/resources/static/css/landmarkFormStyle.css new file mode 100644 index 0000000000000000000000000000000000000000..9d638b48ae03d406b9f97c85e21f14a00fb3188f --- /dev/null +++ b/src/main/resources/static/css/landmarkFormStyle.css @@ -0,0 +1,21 @@ +/*LandmarkFormTh stylesheet*/ +body{ + background: rgb(41, 41, 41); + color: wheat; +} +#landmarkSubmission { + background-color: rgb(206, 153, 253); + color: black; + border-color: white; + align-content: center; + text-align: center; + border-radius: 25px; + max-width: 620px; + margin: 0 auto +} + +#landmarkFormTitle{ + color:white; + text-align: center; + +} \ No newline at end of file diff --git a/src/main/resources/templates/Landmarks/LandmarkFormTh.html b/src/main/resources/templates/Landmarks/LandmarkFormTh.html new file mode 100644 index 0000000000000000000000000000000000000000..9690356f54031ce873453d68aa97a248ac89f687 --- /dev/null +++ b/src/main/resources/templates/Landmarks/LandmarkFormTh.html @@ -0,0 +1,100 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Landmark Sign Up</title> + <link rel="stylesheet" th:href="@{css/landmarkFormStyle.css}"> + <link rel="stylesheet" th:href="@{css/templatingstyle.css}"> + + +</head> +<body> +<header th:insert="~{/towns/Templating.html :: header}"></header> +<hr style="height:20px; visibility:hidden;" /> +<H2 id="landmarkFormTitle"> Interested in joining our trails? Sign up Here! </H2> +<main> +<!-- Form used to submit potential landmarks for trails--> + <form action="/landmarkSub" id="landmarkSubmission" name="landmarkSubmission" method="post" th:object="${landmarkData}" onsubmit="return landmarkFormValidation()"> + + <br> + <label>Business Name: + <input type="text" th:field="*{landmarkName}" placeholder="Business name here..."> + </label><br> + <div th:errors="*{landmarkName}" th:if="${#fields.hasErrors('landmarkName')}">ErrorLandmarkName</div> + <br><label>Contact Address: + <input type="text" th:field="*{landmarkEmail}" placeholder="E-mail here..."> + </label><br> + <div th:errors="*{landmarkEmail}" th:if="${#fields.hasErrors('landmarkEmail')}">ErrorEmail</div> + <br><label>Please Describe Your Business:<br> + <textarea th:field="*{landmarkDescription}" rows="18" cols="70" placeholder="Max 200 words please..."></textarea> + </label><br><br> + <label>Your Location: + <select th:field="*{landmarkLocation}"> + <option value="" disabled selected>Select Location</option> + <option value="Caerphilly">Caerphilly</option> + <option value="Risca">Risca</option> + <option value="Penarth">Penarth</option> + </select> + </label><br><br> + <label>Trail: + <select th:field="*{trailID}"> + <option value=0 disabled selected>Select Trail</option> + <option value=0101>(Caerphilly) Castle Trail</option> + <option value=0102>(Caerphilly) Pub Trail</option> + <option value=0103>(Caerphilly) Heritage Trail</option> + <option value=0201>(Risca) Heritage and Culture Trail</option> + <option value=0301>(Penarth) Esplanade Trail</option> + </select> + + </label><br><br> + + + <input type="submit"> + <hr style="height:0px; visibility:hidden;" /> + </form> + + <hr style="height:40px; visibility:hidden;" /> +</main> + +<script> + + + + +// verification function of the above form + function landmarkFormValidation(){ + var pass=true; + var trail = document.forms["landmarkSubmission"]["trailID"].value + var location = document.forms["landmarkSubmission"]["landmarkLocation"].value + var description = document.forms["landmarkSubmission"]["landmarkDescription"].value; + var descriptionWrdCount=description.split(" ").length + if (descriptionWrdCount>200){ + alert('Please keep your description to a maximum of 200 words.'); + pass = false; + } + + if (trail==0){ // values of 0 and "" used to ensure default drop down option isn't submittable + alert('Invalid trail selected. \nPlease select the trail you wish to join.'); + pass = false; + } + + if (location==""){ + alert('Invalid location selected. \nPlease select the location you wish to join.'); + + pass = false; // ensure correct trail is selected in accordance to the town it takes place in + + } if ( (location=="Caerphilly" & (parseInt(trail/100)!==1)) || + (location=="Risca" & (parseInt(trail/100)!==2)) || + (location=="Penarth" & (parseInt(trail/100)!==3)) ){ + alert('Trail unavailable in your current location. \nPlease choose an available trail'); + pass = false; + } + + return pass; + } + + +</script> +<footer th:insert="~{/towns/Templating.html :: footer}"></footer> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 39906f23d230c075381eeb440453ce3b4ace4029..47b1dc1353c7c96bcb3409f54558ff18c4da6cf4 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -9,7 +9,6 @@ <body> <header th:replace="fragments/temp_frags.html :: header"></header> - <main> <div class="trailList"> <ul class="ulHeader"> diff --git a/src/main/resources/templates/towns/Templating.html b/src/main/resources/templates/towns/Templating.html index 59d73364e1e8fba008a809e8a457c55bacecf168..2cac9faac6f9f4cd243066db805d7384f29544aa 100644 --- a/src/main/resources/templates/towns/Templating.html +++ b/src/main/resources/templates/towns/Templating.html @@ -1,3 +1,21 @@ +<!--<<<<<<< HEAD--> +<!--<header th:fragment="headerBlock">--> +<!-- <br>Header Block<br>--> +<!--</header>--> + +<!--<footer th:fragment="footerBlock">--> +<!-- <br><b>VZTA</b><br>--> +<!-- <br>Near Me Now LTD<br>--> +<!-- <br>Britania House<br>--> +<!-- <br>Caerphilly Business Park<br>--> +<!-- <br>Caerphilly<br>--> +<!-- <br>CF83 3GG<br>--> +<!-- <br>(C) VZTA 2022<br>--> +<!-- <br><b>Follow Us</b><br>--> +<!-- <br>Facebook Twitter Instagram LinkedIn<br>--> +<!-- <br>Privacy Policy Terms and Conditions<br>--> +<!--</footer>--> +<!--=======--> <link rel="stylesheet" href="../../static/css/templatingstyle.css"> <header class="headerBar" th:fragment="header"> <div class="Logo"> @@ -52,3 +70,4 @@ </div> </div> </div> +<!-->>>>>>> main--> diff --git a/src/main/resources/templates/towns/caerphilly.html b/src/main/resources/templates/towns/caerphilly.html index 9c17a4a75c35cc017db9084403b7cf14fbf357d0..a2ce11074c7412ff9b05115adac5cc1ff117c611 100644 --- a/src/main/resources/templates/towns/caerphilly.html +++ b/src/main/resources/templates/towns/caerphilly.html @@ -110,6 +110,7 @@ grid-template-columns: 50% 50%; grid-template-rows: auto; grid-template-areas: + "title1 title1" "title2 title2" "BadgeStickerProgress ." diff --git a/src/main/resources/templates/towns/templates.server/TemplatingOld.html b/src/main/resources/templates/towns/templates.server/TemplatingOld.html deleted file mode 100644 index 65a9c20b4115094f7ef70c2778eb8512198e197d..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/towns/templates.server/TemplatingOld.html +++ /dev/null @@ -1,16 +0,0 @@ -<header th:fragment="headerBlock"> - <br>Header Block<br> -</header> - -<footer th:fragment="footerBlock"> - <br><b>VZTA</b><br> - <br>Near Me Now LTD<br> - <br>Britania House<br> - <br>Caerphilly Business Park<br> - <br>Caerphilly<br> - <br>CF83 3GG<br> - <br>(C) VZTA 2022<br> - <br><b>Follow Us</b><br> - <br>Facebook Twitter Instagram LinkedIn<br> - <br>Privacy Policy Terms and Conditions<br> -</footer> \ No newline at end of file