From d07646dbc4f85037ccd61f8f5271602dc18b046b Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Thu, 9 Apr 2026 22:48:43 +0200 Subject: [PATCH 01/18] refactor: rename class placeholder to create and add initial code --- src/main/jte/create.jte | 13 +++++++++++++ src/main/jte/placeholder.jte | 1 - 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/main/jte/create.jte delete mode 100644 src/main/jte/placeholder.jte diff --git a/src/main/jte/create.jte b/src/main/jte/create.jte new file mode 100644 index 0000000..c5414d1 --- /dev/null +++ b/src/main/jte/create.jte @@ -0,0 +1,13 @@ +@param org.example.alfs.dto.ticket.TicketCreateDTO ticket + + + + + Create Ticket + + + +

Create Ticket

+ + + \ No newline at end of file diff --git a/src/main/jte/placeholder.jte b/src/main/jte/placeholder.jte deleted file mode 100644 index 666c406..0000000 --- a/src/main/jte/placeholder.jte +++ /dev/null @@ -1 +0,0 @@ -<%-- This is a placeholder jte file for CI test --%> \ No newline at end of file From 6419e6e0664cd1139416f8a364a5f0f0eca6aa5e Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Sun, 12 Apr 2026 14:11:21 +0200 Subject: [PATCH 02/18] feat: add shared layout template for jte views --- src/main/jte/layout.jte | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/jte/layout.jte diff --git a/src/main/jte/layout.jte b/src/main/jte/layout.jte new file mode 100644 index 0000000..dd72c32 --- /dev/null +++ b/src/main/jte/layout.jte @@ -0,0 +1,50 @@ +@param String title +@param gg.jte.Content content + + + + + + + + ${title} + + + + + + + + + + + +
+
+

+ Vissleblåsarinstansen +

+ + +
+
+ + +
+ + ${content} + +
+ + +
+
+ © Vissleblåsarsystem +
+
+ + + \ No newline at end of file From 4d62e0c9a22ca1aa6e13602e86add6341e9ada8e Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Sun, 12 Apr 2026 14:12:10 +0200 Subject: [PATCH 03/18] style: add base styles and theme colors --- src/main/resources/static/css/style.css | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/resources/static/css/style.css diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css new file mode 100644 index 0000000..94c5199 --- /dev/null +++ b/src/main/resources/static/css/style.css @@ -0,0 +1,27 @@ + +:root { + --state-blue: #1a2b49; + --state-gold: #b39359; + --state-gray: #f4f4f4; +} +body { + font-family: 'Georgia', serif; + background-color: var(--state-gray); + color: #333; +} +.header-border { + border-bottom: 4px solid var(--state-gold); +} +.btn-primary { + background-color: var(--state-blue); + color: white; + transition: all 0.3s ease; +} +.btn-primary:hover { + background-color: #2c4471; +} +.card { + background: white; + border: 1px solid #ddd; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); +} From 569ce8e19216efb7bf37ffeecc2c8b2a649f26ee Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Sun, 12 Apr 2026 14:12:39 +0200 Subject: [PATCH 04/18] config: allow public access to create and view endpoints for development --- src/main/java/org/example/alfs/config/SecurityConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/example/alfs/config/SecurityConfig.java b/src/main/java/org/example/alfs/config/SecurityConfig.java index 479f686..8af00cf 100644 --- a/src/main/java/org/example/alfs/config/SecurityConfig.java +++ b/src/main/java/org/example/alfs/config/SecurityConfig.java @@ -43,6 +43,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .requestMatchers("/auth/signup").permitAll() .requestMatchers("/auth/hash").permitAll() .requestMatchers("/h2-console/**").permitAll() + + //allow access to endpoints during development + .requestMatchers("/create", "/view/**").permitAll() + .requestMatchers("/css/**", "/js/**", "/images/**", "/static/**").permitAll() .anyRequest().authenticated() ) From f5d238296b50d6c285d48e3c25da9f8e70872bd6 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Sun, 12 Apr 2026 14:19:04 +0200 Subject: [PATCH 05/18] update : create with new template --- src/main/jte/create.jte | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/jte/create.jte b/src/main/jte/create.jte index c5414d1..37d6aa3 100644 --- a/src/main/jte/create.jte +++ b/src/main/jte/create.jte @@ -1,13 +1,17 @@ @param org.example.alfs.dto.ticket.TicketCreateDTO ticket - - - - Create Ticket - - +@template.layout(title = "Create Ticket", content = @` +

Create Ticket

-

Create Ticket

+
+ - - \ No newline at end of file + + + +
+`) \ No newline at end of file From 4cf43e5170af00107402ada8a157047958760aff Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Sun, 12 Apr 2026 14:22:06 +0200 Subject: [PATCH 06/18] update: layout language to eng --- src/main/jte/layout.jte | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/jte/layout.jte b/src/main/jte/layout.jte index dd72c32..e638a21 100644 --- a/src/main/jte/layout.jte +++ b/src/main/jte/layout.jte @@ -2,7 +2,7 @@ @param gg.jte.Content content - + @@ -22,12 +22,13 @@

- Vissleblåsarinstansen + ALFS + whistleblower system

@@ -42,7 +43,7 @@
- © Vissleblåsarsystem + © ALFS
From 9fc6bba170d8f8bebff83c859a9fc7ecfad1002f Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 11:43:40 +0200 Subject: [PATCH 07/18] add /tickets to allowed endpoints for development --- src/main/java/org/example/alfs/config/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/alfs/config/SecurityConfig.java b/src/main/java/org/example/alfs/config/SecurityConfig.java index 8af00cf..d78789f 100644 --- a/src/main/java/org/example/alfs/config/SecurityConfig.java +++ b/src/main/java/org/example/alfs/config/SecurityConfig.java @@ -45,7 +45,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .requestMatchers("/h2-console/**").permitAll() //allow access to endpoints during development - .requestMatchers("/create", "/view/**").permitAll() + .requestMatchers("/create", "/tickets/**", "/view/**").permitAll() .requestMatchers("/css/**", "/js/**", "/images/**", "/static/**").permitAll() .anyRequest().authenticated() ) From a0daf3f7a071102500bbe82f0438a231a9ef6e5a Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 11:45:58 +0200 Subject: [PATCH 08/18] Create view.jte and initial code --- src/main/jte/view.jte | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/jte/view.jte diff --git a/src/main/jte/view.jte b/src/main/jte/view.jte new file mode 100644 index 0000000..60b2417 --- /dev/null +++ b/src/main/jte/view.jte @@ -0,0 +1,23 @@ +@param org.example.alfs.dto.ticket.TicketViewDTO ticket + +@template.layout(title = "View Ticket", content = @` +

Ticket

+ +
+
+ ID: ${ticket.getId()} +
+ +
+ Title: ${ticket.getTitle()} +
+ +
+ Description: ${ticket.getDescription()} +
+ +
+ Status: ${ticket.getStatus()} +
+
+`) \ No newline at end of file From 10279a555b7d442e9d4739d940b0fd61a4d06238 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 11:48:17 +0200 Subject: [PATCH 09/18] refactor: changed endpoint --- src/main/jte/layout.jte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/jte/layout.jte b/src/main/jte/layout.jte index e638a21..254387a 100644 --- a/src/main/jte/layout.jte +++ b/src/main/jte/layout.jte @@ -28,7 +28,7 @@ From 7c1b551c3c6aecb72822d65f9cc6fece2894997f Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 11:49:46 +0200 Subject: [PATCH 10/18] fix: bind create ticket form to DTO and enable POST submission --- src/main/jte/create.jte | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/jte/create.jte b/src/main/jte/create.jte index 37d6aa3..8e4e07e 100644 --- a/src/main/jte/create.jte +++ b/src/main/jte/create.jte @@ -3,14 +3,20 @@ @template.layout(title = "Create Ticket", content = @`

Create Ticket

-
- + - -
From fd329e56984f80fb3400d19e37be092d2c334063 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 11:50:53 +0200 Subject: [PATCH 11/18] fix: correct ticket routing and redirect paths --- .../alfs/controllers/TicketController.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/alfs/controllers/TicketController.java b/src/main/java/org/example/alfs/controllers/TicketController.java index 23ade1d..195c92a 100644 --- a/src/main/java/org/example/alfs/controllers/TicketController.java +++ b/src/main/java/org/example/alfs/controllers/TicketController.java @@ -5,6 +5,8 @@ import org.example.alfs.dto.ticket.TicketViewDTO; import org.example.alfs.entities.Ticket; import org.example.alfs.services.TicketService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; @@ -13,10 +15,11 @@ //TODO: Decide final routes and redirects @Controller -@RequestMapping +@RequestMapping("/tickets") public class TicketController { TicketService ticketService; + private static final Logger log = LoggerFactory.getLogger(TicketController.class); public TicketController(TicketService ticketService) { @@ -34,20 +37,23 @@ public String createNewTicketForm(Model model) { //TODO REDIRECT, WHERE?? @PostMapping("/create") - public String createNewTicket(@ModelAttribute("ticket") @Valid TicketCreateDTO ticketCreateDTO, BindingResult bindingResult) { + public String createNewTicket(@ModelAttribute("ticket") @Valid TicketCreateDTO ticketCreateDTO, BindingResult bindingResult, Model model) { if (bindingResult.hasErrors()) { + log.info("Title: {}", ticketCreateDTO.getTitle()); + log.info("Description: {}", ticketCreateDTO.getDescription()); + model.addAttribute("ticket", ticketCreateDTO); return "create"; } - ticketService.createNewTicket(ticketCreateDTO); + TicketViewDTO ticket = ticketService.createNewTicket(ticketCreateDTO); - return "redirect:/home"; + return "redirect:/tickets/" + ticket.getId(); } //view ticket by token - @GetMapping("/view/token/{token}") + @GetMapping("/token/{token}") public String viewTicketByToken(@PathVariable String token, Model model) { TicketViewDTO ticket = ticketService.getTicketByToken(token); @@ -57,7 +63,7 @@ public String viewTicketByToken(@PathVariable String token, Model model) { } //view ticket by id - @GetMapping("/view/id/{id}") + @GetMapping("/{id}") public String viewTicketById(@PathVariable Long id, Model model) { TicketViewDTO ticket = ticketService.getTicketById(id); @@ -70,6 +76,7 @@ public String viewTicketById(@PathVariable Long id, Model model) { // TODO implement DTO + service @PostMapping("/{id}/assign") public String assignTicket(@PathVariable Long id) { + return "redirect:/tickets/" + id; } @@ -77,6 +84,7 @@ public String assignTicket(@PathVariable Long id) { // TODO implement DTO + service @PostMapping("/{id}/status") public String updateStatus(@PathVariable Long id) { + return "redirect:/tickets/" + id; } From 2c9a57c46b06aa4cfc89f45ed127307110b5f0b4 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 13:14:22 +0200 Subject: [PATCH 12/18] add: sign in button --- src/main/jte/layout.jte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/jte/layout.jte b/src/main/jte/layout.jte index 254387a..88cd4f2 100644 --- a/src/main/jte/layout.jte +++ b/src/main/jte/layout.jte @@ -29,6 +29,7 @@ From 3793994afd7bbee707b6d2afc7b11090cc765f8c Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 14:14:17 +0200 Subject: [PATCH 13/18] fix: remove logging --- .../java/org/example/alfs/controllers/TicketController.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/example/alfs/controllers/TicketController.java b/src/main/java/org/example/alfs/controllers/TicketController.java index 195c92a..e745f03 100644 --- a/src/main/java/org/example/alfs/controllers/TicketController.java +++ b/src/main/java/org/example/alfs/controllers/TicketController.java @@ -19,7 +19,6 @@ public class TicketController { TicketService ticketService; - private static final Logger log = LoggerFactory.getLogger(TicketController.class); public TicketController(TicketService ticketService) { @@ -39,8 +38,6 @@ public String createNewTicketForm(Model model) { @PostMapping("/create") public String createNewTicket(@ModelAttribute("ticket") @Valid TicketCreateDTO ticketCreateDTO, BindingResult bindingResult, Model model) { if (bindingResult.hasErrors()) { - log.info("Title: {}", ticketCreateDTO.getTitle()); - log.info("Description: {}", ticketCreateDTO.getDescription()); model.addAttribute("ticket", ticketCreateDTO); return "create"; } From 876fc51185c8f756a286dd30caa2f8c23d270d64 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 13 Apr 2026 14:28:33 +0200 Subject: [PATCH 14/18] fix: preserve form input on validation errors --- src/main/jte/create.jte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/jte/create.jte b/src/main/jte/create.jte index 8e4e07e..02fc472 100644 --- a/src/main/jte/create.jte +++ b/src/main/jte/create.jte @@ -6,13 +6,14 @@
+ class="w-full border p-2 rounded h-32">${ticket.getDescription()}