From ae0a87b53dc3d79619a6b4e39e4bca1d586ad761 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Tue, 22 Jul 2025 15:16:41 +0200 Subject: [PATCH] starting point for new form --- pom.xml | 6 ++- src/main/kotlin/wanijo/wanijo2/domain/tag.kt | 1 + .../wanijo2/http/controller/NewController.kt | 43 +++++++++++++++++ .../wanijo/wanijo2/http/form/NewForm.kt | 10 ++++ src/main/resources/static/stylesheet.css | 47 +++++++++++++++---- src/main/resources/templates/base.html | 3 ++ src/main/resources/templates/new.html | 29 ++++++++++++ 7 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/wanijo/wanijo2/http/controller/NewController.kt create mode 100644 src/main/kotlin/wanijo/wanijo2/http/form/NewForm.kt create mode 100644 src/main/resources/templates/new.html diff --git a/pom.xml b/pom.xml index 7960c49..23869e5 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,10 @@ org.jetbrains.kotlin kotlin-stdlib + + org.springframework.boot + spring-boot-starter-validation + @@ -85,7 +89,7 @@ kotlin-test-junit5 test - + ${project.basedir}/src/main/kotlin diff --git a/src/main/kotlin/wanijo/wanijo2/domain/tag.kt b/src/main/kotlin/wanijo/wanijo2/domain/tag.kt index bbc3f12..6b5cc8d 100644 --- a/src/main/kotlin/wanijo/wanijo2/domain/tag.kt +++ b/src/main/kotlin/wanijo/wanijo2/domain/tag.kt @@ -29,4 +29,5 @@ interface DocumentTaggingDao : Repository { interface TagDao: Repository { fun save(tag: Tag): Tag fun findByName(name: String): Tag? + fun findAll(): List } diff --git a/src/main/kotlin/wanijo/wanijo2/http/controller/NewController.kt b/src/main/kotlin/wanijo/wanijo2/http/controller/NewController.kt new file mode 100644 index 0000000..dcf561c --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/http/controller/NewController.kt @@ -0,0 +1,43 @@ +package wanijo.wanijo2.http.controller + +import jakarta.validation.Valid +import org.springframework.stereotype.Controller +import org.springframework.ui.Model +import org.springframework.ui.set +import org.springframework.validation.BindingResult +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import wanijo.wanijo2.domain.TagDao +import wanijo.wanijo2.http.form.NewForm + +@Controller +@RequestMapping("/document") +class NewController( + private val tagDao: TagDao +) { + + @GetMapping("/new") + fun newDocument( + model: Model + ): String { + model["tags"] = tagDao.findAll() + model["form"] = NewForm() + return "new" + } + + @PostMapping("/new") + fun saveNewDocument( + model: Model, + @Valid + newForm: NewForm, + bindingResult: BindingResult + ): String { + if (bindingResult.hasErrors()) { + return newDocument(model) + } + + return "redirect:/" + } + +} diff --git a/src/main/kotlin/wanijo/wanijo2/http/form/NewForm.kt b/src/main/kotlin/wanijo/wanijo2/http/form/NewForm.kt new file mode 100644 index 0000000..ee4b22d --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/http/form/NewForm.kt @@ -0,0 +1,10 @@ +package wanijo.wanijo2.http.form + +import jakarta.validation.constraints.NotEmpty + +data class NewForm ( + @NotEmpty + val name: String = "", + val description: String = "", + val tagIds: List = emptyList() +) diff --git a/src/main/resources/static/stylesheet.css b/src/main/resources/static/stylesheet.css index bcd1ac5..abb4bb7 100644 --- a/src/main/resources/static/stylesheet.css +++ b/src/main/resources/static/stylesheet.css @@ -1,14 +1,5 @@ body { margin: 0 5rem; -} - -main { - .show__meta { - display: flex; - justify-content: space-evenly; - - font-size: 90%; - } a:link, a:visited { text-decoration: none; @@ -18,6 +9,25 @@ main { a:hover, a:active { text-decoration: underline; } +} + +nav { + display: flex; + flex-direction: row; + align-items: baseline; + + * { + margin-right: 1rem; + } +} + +main { + .show__meta { + display: flex; + justify-content: space-evenly; + + font-size: 90%; + } fieldset { border: 1px solid AccentColor; @@ -41,3 +51,22 @@ table { } } } + +form { + display: grid; + grid-template-columns: 30% 70%; + grid-auto-flow: row; + row-gap: .5rem; + + label { + grid-column: 1; + } + + input, textarea, select, button { + grid-column: 2; + } + + textarea { + min-height: 10rem; + } +} diff --git a/src/main/resources/templates/base.html b/src/main/resources/templates/base.html index dfa61ea..e4e47fe 100644 --- a/src/main/resources/templates/base.html +++ b/src/main/resources/templates/base.html @@ -11,6 +11,9 @@
Lorem Ipsum diff --git a/src/main/resources/templates/new.html b/src/main/resources/templates/new.html new file mode 100644 index 0000000..0eabeb2 --- /dev/null +++ b/src/main/resources/templates/new.html @@ -0,0 +1,29 @@ + + + + Home + + +
+
+ + + + + + + + + + +
+
+ +