assign tags

master
Josha von Gizycki 2 weeks ago
parent 97fe0acdea
commit 26fdc13a77

@ -0,0 +1,15 @@
package wanijo.wanijo2.domain.event
import jakarta.validation.constraints.Min
import jakarta.validation.constraints.NotEmpty
import wanijo.wanijo2.domain.DocumentId
import wanijo.wanijo2.domain.TagId
data class AssignTaggingCommand(
@NotEmpty
@Min(1)
val tagId: TagId,
@NotEmpty
@Min(1)
val documentId: DocumentId
)

@ -0,0 +1,22 @@
package wanijo.wanijo2.domain.handler
import org.springframework.stereotype.Service
import wanijo.wanijo2.domain.DocumentTagging
import wanijo.wanijo2.domain.DocumentTaggingDao
import wanijo.wanijo2.domain.event.AssignTaggingCommand
@Service
class AssignTaggingHandler(
val taggingDao: DocumentTaggingDao
) {
fun exec(command: AssignTaggingCommand) {
taggingDao.save(
DocumentTagging.between(
command.documentId,
command.tagId
)
)
}
}

@ -33,6 +33,11 @@ data class DocumentTagging(
tagId = AggregateReference.to(tagId),
documentId = AggregateReference.to(doc.id)
)
fun between(docId: DocumentId, tagId: TagId) =
DocumentTagging(
tagId = AggregateReference.to(tagId),
documentId = AggregateReference.to(docId)
)
}
}

@ -25,13 +25,16 @@ class ShowController(
val document = docDao.findById(id) ?: throw DocumentNotFound()
model["document"] = document
model["tags"] = tagDao.ofDocument(id)
val descHtml = Parser.builder().build().parse(document.description).let {
HtmlRenderer.builder().build().render(it)
}
model["descHtml"] = descHtml
val documentTags = tagDao.ofDocument(id)
model["documentTags"] = documentTags.sortedBy { it.name.lowercase() }
model["assignableTags"] = (tagDao.findAll() - documentTags).sortedBy { it.name.lowercase() }
return "show"
}

@ -1,32 +1,35 @@
package wanijo.wanijo2.http.controller
import jakarta.validation.Valid
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestParam
import wanijo.wanijo2.domain.DocumentId
import wanijo.wanijo2.domain.TagId
import wanijo.wanijo2.domain.event.AssignTaggingCommand
import wanijo.wanijo2.domain.event.DeleteTaggingCommand
import wanijo.wanijo2.domain.handler.AssignTaggingHandler
import wanijo.wanijo2.domain.handler.DeleteTaggingHandler
@Controller
class TaggingController(
val deleteTaggingHandler: DeleteTaggingHandler
val deleteTaggingHandler: DeleteTaggingHandler,
val assignTaggingHandler: AssignTaggingHandler
) {
@PostMapping("/tagging/delete")
fun delete(
@RequestParam("docId")
documentId: DocumentId,
@RequestParam("tagId")
tagId: TagId
@Valid
command: DeleteTaggingCommand
): String {
deleteTaggingHandler.exec(
DeleteTaggingCommand(
tagId = tagId,
documentId = documentId
)
)
return "redirect:/document/${documentId}"
deleteTaggingHandler.exec(command)
return "redirect:/document/${command.documentId}"
}
@PostMapping("/tagging/assign")
fun assign(
@Valid
command: AssignTaggingCommand
): String {
assignTaggingHandler.exec(command)
return "redirect:/document/${command.documentId}"
}
}

@ -30,8 +30,7 @@ main {
font-size: 90%;
}
.show__tags {
ul {
.tag-container {
list-style-type: none;
margin: 0;
padding: 0;
@ -39,7 +38,6 @@ main {
display: flex;
justify-content: space-evenly;
}
}
.tag-block {
border-left: .5rem solid AccentColor;

@ -33,12 +33,12 @@
<fieldset class="show__tags">
<legend>tags</legend>
<ul>
<li th:each="tag : ${tags}" class="tag-block">
<ul class="tag-container">
<li th:each="tag : ${documentTags}" class="tag-block">
<th:block th:text="${tag.name}"/>
<form class="form-link" th:action="@{/tagging/delete}" method="post">
<input type="hidden" name="tagId" th:value="${tag.id}">
<input type="hidden" name="docId" th:value="${document.id}">
<input type="hidden" name="documentId" th:value="${document.id}">
<button type="submit">🞭</button>
</form>
</li>
@ -51,6 +51,16 @@
</fieldset>
<h2 class="low-key-hint">taggen</h2>
<ul class="tag-container">
<li th:each="tag : ${assignableTags}" class="tag-block">
<th:block th:text="${tag.name}"/>
<form class="form-link" th:action="@{/tagging/assign}" method="post">
<input type="hidden" name="tagId" th:value="${tag.id}">
<input type="hidden" name="documentId" th:value="${document.id}">
<button type="submit"></button>
</form>
</li>
</ul>
</main>
</body>
</html>

Loading…
Cancel
Save