Skip to content
Snippets Groups Projects
Commit ae91cf33 authored by Rhys Nute's avatar Rhys Nute
Browse files

Merge branch...

Merge branch '31-as-a-user-i-want-to-be-able-submit-a-form-about-a-specific-landmark-to-add-to-the-trail' into 'main'

Resolve "As a user I want to be able submit a form about a specific landmark to add to the trail"

Closes #31

See merge request !13
parents 38e0307d e7374366
No related branches found
No related tags found
1 merge request!13Resolve "As a user I want to be able submit a form about a specific landmark to add to the trail"
...@@ -28,6 +28,9 @@ dependencies { ...@@ -28,6 +28,9 @@ dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools' developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test' 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') { tasks.named('bootBuildImage') {
......
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;
}
}
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;
}
}
}
/*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
<!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
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
<body> <body>
<header th:replace="fragments/temp_frags.html :: header"></header> <header th:replace="fragments/temp_frags.html :: header"></header>
<main> <main>
<div class="trailList"> <div class="trailList">
<ul class="ulHeader"> <ul class="ulHeader">
......
<!--<<<<<<< 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"> <link rel="stylesheet" href="../../static/css/templatingstyle.css">
<header class="headerBar" th:fragment="header"> <header class="headerBar" th:fragment="header">
...@@ -53,3 +71,4 @@ ...@@ -53,3 +71,4 @@
</div> </div>
</div> </div>
</div> </div>
<!--&gt;>>>>>> main-->
...@@ -110,6 +110,7 @@ ...@@ -110,6 +110,7 @@
grid-template-columns: 50% 50%; grid-template-columns: 50% 50%;
grid-template-rows: auto; grid-template-rows: auto;
grid-template-areas: grid-template-areas:
"title1 title1" "title1 title1"
"title2 title2" "title2 title2"
"BadgeStickerProgress ." "BadgeStickerProgress ."
......
<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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment