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
+
+
+
+
+
+
+