diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e0fe251..5ede55b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,18 +1,14 @@ plugins { - // Apply the shared build logic from a convention plugin. - // The shared code is located in `buildSrc/src/main/kotlin/kotlin-jvm.gradle.kts`. id("buildsrc.convention.kotlin-jvm") alias(libs.plugins.tempolin) id("app.cash.sqldelight") version "2.0.2" - - // Apply the Application plugin to add support for building an executable JVM application. application } dependencies { + implementation("at.favre.lib:bcrypt:0.10.2") implementation("org.apache.pdfbox:pdfbox:3.0.4") implementation("app.cash.sqldelight:sqlite-driver:2.0.2") - // implementation("org.xerial:sqlite-jdbc:3.48.0.0") implementation("com.fasterxml.jackson.core:jackson-databind:2.18.2") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.+") implementation(libs.slf4jsimple) @@ -23,8 +19,6 @@ dependencies { } application { - // Define the Fully Qualified Name for the application main class - // (Note that Kotlin compiles `App.kt` to a class with FQN `com.example.app.AppKt`.) mainClass = "net.h34t.filemure.ServerKt" } diff --git a/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt b/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt index 0b8c308..d0497be 100644 --- a/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt +++ b/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt @@ -58,7 +58,8 @@ class FilemureApp(repository: SqliteRepository) { modifiers = modifiers, title = "unauthorized", target = "", - content = Unauthorized() + content = Unauthorized(), + back = "" ) ) } diff --git a/app/src/main/kotlin/net/h34t/filemure/Util.kt b/app/src/main/kotlin/net/h34t/filemure/Util.kt index e5a3619..ef6eee4 100644 --- a/app/src/main/kotlin/net/h34t/filemure/Util.kt +++ b/app/src/main/kotlin/net/h34t/filemure/Util.kt @@ -6,6 +6,7 @@ import io.javalin.http.HttpStatus import io.javalin.http.UnauthorizedResponse import java.io.BufferedOutputStream import java.io.OutputStreamWriter +import java.time.LocalDate import java.time.LocalDateTime import java.time.Month import java.time.format.DateTimeFormatter @@ -66,3 +67,10 @@ val formDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm") fun LocalDateTime.formatHuman() = this.format(htmlDtf) fun LocalDateTime.formatHtmlForm() = this.format(formDtf) + +private val dfMonth = DateTimeFormatter.ofPattern("MMMM") +private val dfYearMonth = DateTimeFormatter.ofPattern("MMMM yyyy") + +fun LocalDate.formatHumanMonth() = dfMonth.format(this) + +fun LocalDate.formatHumanYearMonth() = dfYearMonth.format(this) \ No newline at end of file diff --git a/app/src/main/kotlin/net/h34t/filemure/controller/DocumentController.kt b/app/src/main/kotlin/net/h34t/filemure/controller/DocumentController.kt index 6411389..8aa490d 100644 --- a/app/src/main/kotlin/net/h34t/filemure/controller/DocumentController.kt +++ b/app/src/main/kotlin/net/h34t/filemure/controller/DocumentController.kt @@ -28,6 +28,7 @@ class DocumentController(val modifiers: TemplateModifiers, val repository: Sqlit modifiers = modifiers, title = document.title, target = "document-${document.extId}", + back = "/", content = Document( modifiers = modifiers, extId = document.extId.value, @@ -83,6 +84,7 @@ class DocumentController(val modifiers: TemplateModifiers, val repository: Sqlit title = "new document", // TODO enable target for new documents in form target = "", + back = "/", content = DocumentCreateForm( modifiers = modifiers, title = title, @@ -172,6 +174,7 @@ class DocumentController(val modifiers: TemplateModifiers, val repository: Sqlit modifiers = modifiers, title = document.title, target = "", + back = "/document/$extId", content = DocumentEditForm( modifiers = modifiers, extId = extId, diff --git a/app/src/main/kotlin/net/h34t/filemure/controller/LimboController.kt b/app/src/main/kotlin/net/h34t/filemure/controller/LimboController.kt index cb5230c..c1ff387 100644 --- a/app/src/main/kotlin/net/h34t/filemure/controller/LimboController.kt +++ b/app/src/main/kotlin/net/h34t/filemure/controller/LimboController.kt @@ -18,6 +18,7 @@ class LimboController(val modifiers: TemplateModifiers, val repository: SqliteRe modifiers = modifiers, title = "Filemure Limbo", target = "limbo", + back = "/", content = Limbo( modifiers = modifiers, limboFileCount = files.size.toString(), file = { files.map { f -> diff --git a/app/src/main/kotlin/net/h34t/filemure/controller/LoginController.kt b/app/src/main/kotlin/net/h34t/filemure/controller/LoginController.kt index ead11ab..f1156a3 100644 --- a/app/src/main/kotlin/net/h34t/filemure/controller/LoginController.kt +++ b/app/src/main/kotlin/net/h34t/filemure/controller/LoginController.kt @@ -14,9 +14,8 @@ class LoginController(val modifiers: TemplateModifiers, val repository: SqliteRe modifiers = modifiers, title = "Hello to Filemure", target = "", - content = Login( - - ) + back = "", + content = Login() ) ) } diff --git a/app/src/main/kotlin/net/h34t/filemure/controller/OverviewController.kt b/app/src/main/kotlin/net/h34t/filemure/controller/OverviewController.kt index e652b56..b7c6ad5 100644 --- a/app/src/main/kotlin/net/h34t/filemure/controller/OverviewController.kt +++ b/app/src/main/kotlin/net/h34t/filemure/controller/OverviewController.kt @@ -6,8 +6,9 @@ import net.h34t.filemure.repository.SqliteRepository import net.h34t.filemure.tpl.Frame import net.h34t.filemure.tpl.Overview import net.h34t.filemure.tpl.OverviewDocuments +import java.time.LocalDate -class OverviewController(val modifiers: TemplateModifiers, val repository: SqliteRepository) { +class OverviewController(private val modifiers: TemplateModifiers, private val repository: SqliteRepository) { fun overview(ctx: Context) { val session = ctx.requireSession() @@ -23,6 +24,7 @@ class OverviewController(val modifiers: TemplateModifiers, val repository: Sqlit modifiers = modifiers, title = "Overview", target = "document", + back = "", content = Overview( modifiers = modifiers, limboFileCount = limboFileCount.toString(), @@ -34,7 +36,8 @@ class OverviewController(val modifiers: TemplateModifiers, val repository: Sqlit year.value.entries.sortedByDescending { it.key }.map { month -> MonthBlock( year = year.key.toString(), - month = (month.key.ordinal + 1).toString(), + month = month.key.value.toString(), + monthHuman = LocalDate.of(year.key, month.key, 1).formatHumanMonth(), count = month.value.size.toString() ) }.asSequence() @@ -60,14 +63,15 @@ class OverviewController(val modifiers: TemplateModifiers, val repository: Sqlit modifiers = modifiers, title = "Overview", target = "document", + back = "/", content = OverviewDocuments( modifiers = modifiers, - category = "$year-$month", + category = LocalDate.of(year, month, 1).formatHumanYearMonth(), document = { documents.sortedBy { it.referenceDate }.map { document -> DocumentBlock( extId = document.extId.value, - referenceDate = document.referenceDate.formatHtmlForm(), + referenceDate = document.referenceDate.formatHuman(), title = document.title.ifBlank { "untitled" }, ) }.asSequence() diff --git a/app/src/main/kotlin/net/h34t/filemure/controller/SearchController.kt b/app/src/main/kotlin/net/h34t/filemure/controller/SearchController.kt index 656a36b..79fe98a 100644 --- a/app/src/main/kotlin/net/h34t/filemure/controller/SearchController.kt +++ b/app/src/main/kotlin/net/h34t/filemure/controller/SearchController.kt @@ -23,6 +23,7 @@ class SearchController(val modifiers: TemplateModifiers, val repository: SqliteR modifiers = modifiers, title = "Overview", target = "document", + back = "/", content = Search( modifiers = modifiers, search = q ?: "", diff --git a/app/src/main/tpl/net.h34t.filemure.tpl/Frame.tpl.html b/app/src/main/tpl/net.h34t.filemure.tpl/Frame.tpl.html index 6764ac5..03fbdd6 100644 --- a/app/src/main/tpl/net.h34t.filemure.tpl/Frame.tpl.html +++ b/app/src/main/tpl/net.h34t.filemure.tpl/Frame.tpl.html @@ -6,14 +6,47 @@