From 0d93394008b87f36ff92a3c237024c22a3c9f64e Mon Sep 17 00:00:00 2001 From: Stefan Schallerl Date: Thu, 6 Feb 2025 17:17:53 +0100 Subject: [PATCH] Categorizes documents into year/month on overview. --- .../kotlin/net/h34t/filemure/FilemureApp.kt | 4 +- .../net/h34t/filemure/TemplateModifiers.kt | 2 +- app/src/main/kotlin/net/h34t/filemure/Util.kt | 10 ++++- .../filemure/controller/OverviewController.kt | 41 +++++++++++++++++++ .../filemure/repository/SqliteRepository.kt | 20 +++++++++ .../net/h34t/filemure/db/Database.sq | 28 +++++++++++++ .../net.h34t.filemure.tpl/Overview.tpl.html | 14 ++++--- .../OverviewDocuments.tpl.html | 17 ++++++++ 8 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 app/src/main/tpl/net.h34t.filemure.tpl/OverviewDocuments.tpl.html diff --git a/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt b/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt index 0d7b70e..4a65a8a 100644 --- a/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt +++ b/app/src/main/kotlin/net/h34t/filemure/FilemureApp.kt @@ -28,7 +28,6 @@ class FilemureApp(repository: SqliteRepository) { } } - server.get("/", overviewController::overview, Role.USER) server.get("/login", loginPageController::formLogin, Role.ANON, Role.USER) server.post("/login", loginPageController::doLogin, Role.ANON, Role.USER) server.post("/logout", loginPageController::doLogout, Role.USER) @@ -36,6 +35,9 @@ class FilemureApp(repository: SqliteRepository) { server.post("/upload", uploadController::upload, Role.USER) server.get("/limbo", limboController::formLimbo, Role.USER) + server.get("/", overviewController::overview, Role.USER) + server.get("/overview/{year}/{month}", overviewController::overviewCategory, Role.USER) + server.get("/document/new", documentController::createDocumentForm, Role.USER) server.post("/document/new", documentController::createDocument, Role.USER) server.get("/document/{extId}", documentController::documentDetail, Role.USER) diff --git a/app/src/main/kotlin/net/h34t/filemure/TemplateModifiers.kt b/app/src/main/kotlin/net/h34t/filemure/TemplateModifiers.kt index 837980a..e9feb32 100644 --- a/app/src/main/kotlin/net/h34t/filemure/TemplateModifiers.kt +++ b/app/src/main/kotlin/net/h34t/filemure/TemplateModifiers.kt @@ -6,7 +6,7 @@ import java.net.URLEncoder class TemplateModifiers : Frame.Modifiers, Limbo.Modifiers, DocumentCreateForm.Modifiers, Overview.Modifiers, FilePreview.Modifiers, DocumentEditForm.Modifiers, FileList.Modifiers, - net.h34t.filemure.tpl.Document.Modifiers { + net.h34t.filemure.tpl.Document.Modifiers, OverviewDocuments.Modifiers { fun hashPrefix(arg: String): String { return URLEncoder.encode(arg, Charsets.UTF_8) diff --git a/app/src/main/kotlin/net/h34t/filemure/Util.kt b/app/src/main/kotlin/net/h34t/filemure/Util.kt index 2659289..254865b 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.Month /** * Outputs an HTML page rendered via TempolinTemplate. @@ -49,4 +50,11 @@ object TagAdapter { } fun List.serialize() = if (this.isEmpty()) "" else this.joinToString(",") { it.value } -} \ No newline at end of file +} + +fun List.grouped(): Map>> = + this.groupBy { it.referenceDate.year } + .mapValues { (_, values) -> + values.groupBy { it.referenceDate.month } + } + 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 3bb4c3f..985500e 100644 --- a/app/src/main/kotlin/net/h34t/filemure/controller/OverviewController.kt +++ b/app/src/main/kotlin/net/h34t/filemure/controller/OverviewController.kt @@ -2,11 +2,13 @@ package net.h34t.filemure.controller import io.javalin.http.Context import net.h34t.filemure.TemplateModifiers +import net.h34t.filemure.grouped import net.h34t.filemure.repository.SqliteRepository import net.h34t.filemure.requireSession import net.h34t.filemure.tempolin import net.h34t.filemure.tpl.Frame import net.h34t.filemure.tpl.Overview +import net.h34t.filemure.tpl.OverviewDocuments import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -21,6 +23,8 @@ class OverviewController(val modifiers: TemplateModifiers, val repository: Sqlit val documents = repository.getDocuments(accountId = session.id) + val grouped = documents.grouped() + ctx.tempolin( Frame( modifiers = modifiers, @@ -29,6 +33,43 @@ class OverviewController(val modifiers: TemplateModifiers, val repository: Sqlit content = Overview( modifiers = modifiers, limboFileCount = limboFileCount.toString(), + year = { + grouped.entries.sortedByDescending { it.key }.map { year -> + YearBlock( + year = year.key.toString(), + month = { + year.value.entries.sortedByDescending { it.key }.map { month -> + MonthBlock( + year = year.key.toString(), + month = (month.key.ordinal + 1).toString(), + count = month.value.size.toString() + ) + }.asSequence() + } + ) + }.asSequence() + } + ) + ) + ) + } + + fun overviewCategory(ctx: Context) { + val session = ctx.requireSession() + + val year = ctx.pathParam("year").toInt() + val month = ctx.pathParam("month").toInt() + + val documents = repository.getDocumentsByYearMonth(accountId = session.id, year = year, month = month) + + ctx.tempolin( + Frame( + modifiers = modifiers, + title = "Overview", + isTarget = true, + content = OverviewDocuments( + modifiers = modifiers, + category = "$year-$month", document = { documents.map { document -> DocumentBlock( diff --git a/app/src/main/kotlin/net/h34t/filemure/repository/SqliteRepository.kt b/app/src/main/kotlin/net/h34t/filemure/repository/SqliteRepository.kt index ef2277a..1604e37 100644 --- a/app/src/main/kotlin/net/h34t/filemure/repository/SqliteRepository.kt +++ b/app/src/main/kotlin/net/h34t/filemure/repository/SqliteRepository.kt @@ -153,6 +153,26 @@ class SqliteRepository(url: String) { } } + fun getDocumentsByYearMonth(accountId: Long, year: Int, month: Int, state: State = State.ACTIVE) = "%04d%02d".format(year, month).let { date -> + database.databaseQueries.getDocumentsByYearMonth( + account_id = accountId, + yearMonth = date, + state = state + ).executeAsList().map { + Document( + id = it.id, + extId = it.ext_id, + title = it.title, + description = it.description, + tags = it.tags, + created = it.created, + referenceDate = it.reference_date, + state = it.state, + files = emptyList() + ) + } + } + fun updateDocument( accountId: Long, id: Long, diff --git a/app/src/main/sqldelight/net/h34t/filemure/db/Database.sq b/app/src/main/sqldelight/net/h34t/filemure/db/Database.sq index ca70713..21897e6 100644 --- a/app/src/main/sqldelight/net/h34t/filemure/db/Database.sq +++ b/app/src/main/sqldelight/net/h34t/filemure/db/Database.sq @@ -112,6 +112,25 @@ WHERE account_id=? AND state=?; +getDocumentsByYearMonth: +SELECT + d.id, + d.account_id, + d.ext_id, + d.title, + d.description, + d.tags, + d.created, + d.reference_date, + d.state, + strftime("%Y%m", reference_date) AS yearMonth +FROM + document d +WHERE + account_id=? AND + state=? AND + yearMonth = ?; + updateDocument: UPDATE document @@ -178,3 +197,12 @@ WHERE getLastInsertRowId: SELECT last_insert_rowid(); + +setDocumentState: +UPDATE document SET state=? WHERE ext_id=?; + +setDocumentStates: +UPDATE document SET state=? WHERE ext_id IN ?; + +setFilesStates: +UPDATE file SET state=? WHERE ext_id IN ?; diff --git a/app/src/main/tpl/net.h34t.filemure.tpl/Overview.tpl.html b/app/src/main/tpl/net.h34t.filemure.tpl/Overview.tpl.html index a46ce2b..ed1a4ec 100644 --- a/app/src/main/tpl/net.h34t.filemure.tpl/Overview.tpl.html +++ b/app/src/main/tpl/net.h34t.filemure.tpl/Overview.tpl.html @@ -3,11 +3,15 @@

Files in limbo: {$limboFileCount}.

- {for $document} + {for $year} - - - + + + {for $month} + + + {/for} -
{*$referenceDate}{*$title}details{*$year}
{*$month}{*$count} Files
\ No newline at end of file + {/for} + diff --git a/app/src/main/tpl/net.h34t.filemure.tpl/OverviewDocuments.tpl.html b/app/src/main/tpl/net.h34t.filemure.tpl/OverviewDocuments.tpl.html new file mode 100644 index 0000000..71e599b --- /dev/null +++ b/app/src/main/tpl/net.h34t.filemure.tpl/OverviewDocuments.tpl.html @@ -0,0 +1,17 @@ +

Documents for {*$category}

+ + + + + + + + + {for $document} + + + + + + {/for} +
DateTitleDetails
{*$referenceDate}{*$title}details
\ No newline at end of file