From 71f0d3d8ce100428d94858b09a76570aec9d47c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Petu=C5=A1ka?= Date: Mon, 8 Mar 2021 09:40:29 +0000 Subject: [PATCH] Fritz2 Rework Fixed filtered pagination and extended count badge to reflect searches --- .../kotlin/app/service/LibraryService.kt | 2 +- .../kotlin/app/service/LibraryService.kt | 18 +++++++++++++----- .../jsMain/kotlin/app/store/thunk/appThunk.kt | 15 +++++++++++---- app/src/jsMain/kotlin/app/view/Header.kt | 8 ++++++++ .../kotlin/app/view/component/LibraryCard.kt | 1 + app/src/jvmMain/kotlin/app/config/routing.kt | 2 +- .../kotlin/app/service/LibraryService.kt | 12 ++++++++---- 7 files changed, 43 insertions(+), 15 deletions(-) diff --git a/app/src/commonMain/kotlin/app/service/LibraryService.kt b/app/src/commonMain/kotlin/app/service/LibraryService.kt index feca036..8db4377 100644 --- a/app/src/commonMain/kotlin/app/service/LibraryService.kt +++ b/app/src/commonMain/kotlin/app/service/LibraryService.kt @@ -5,7 +5,7 @@ import kamp.domain.* expect class LibraryService { suspend fun getAll(page: Int, size: Int = 20, search: String? = null, targets: Set? = null): PagedResponse - suspend fun getCount(): LibraryCount + suspend fun getCount(search: String? = null, targets: Set? = null): LibraryCount companion object } diff --git a/app/src/jsMain/kotlin/app/service/LibraryService.kt b/app/src/jsMain/kotlin/app/service/LibraryService.kt index 5577ef9..f95a0ce 100644 --- a/app/src/jsMain/kotlin/app/service/LibraryService.kt +++ b/app/src/jsMain/kotlin/app/service/LibraryService.kt @@ -9,14 +9,22 @@ import kamp.domain.* actual class LibraryService(private val client: HttpClient) { actual suspend fun getAll(page: Int, size: Int, search: String?, targets: Set?): PagedResponse { val pagination = "page=$page&size=$size" - val searchQuery = search?.let { "&search=$it" } ?: "" - val targetsQuery = targets?.joinToString(prefix = "&target=", separator = "&target=") ?: "" + val searchQuery = search?.let { "search=$it" } ?: "" + val targetsQuery = targets?.joinToString(prefix = "target=", separator = "&target=") ?: "" - return client.get("${path}?$pagination$searchQuery$targetsQuery".toApi()) + return client.get("${path}${buildQuery(pagination, searchQuery, targetsQuery)}".toApi()) } - actual suspend fun getCount(): LibraryCount = - client.get("${path}/count".toApi()) + actual suspend fun getCount(search: String?, targets: Set?): LibraryCount { + val searchQuery = search?.let { "search=$it" } + val targetsQuery = targets?.joinToString(prefix = "target=", separator = "&target=") + + return client.get("${path}/count${buildQuery(searchQuery, targetsQuery)}".toApi()) + } + + private fun buildQuery(vararg query: String?): String { + return query.toSet().filterNotNull().takeIf(List::isNotEmpty)?.joinToString("&", prefix = "?") ?: "" + } actual companion object } diff --git a/app/src/jsMain/kotlin/app/store/thunk/appThunk.kt b/app/src/jsMain/kotlin/app/store/thunk/appThunk.kt index 8630c49..9295266 100644 --- a/app/src/jsMain/kotlin/app/store/thunk/appThunk.kt +++ b/app/src/jsMain/kotlin/app/store/thunk/appThunk.kt @@ -12,7 +12,7 @@ fun fetchLibraryPage(page: Int, size: Int = 12, search: String? = null, targets: val theTargets = targets ?: state.targets val service by di.instance() - val libraries = service.getAll(page, size, theSearch, targets) + val libraries = service.getAll(page, size, theSearch, theTargets) window.scrollTo(0.0, 0.0) state.copy( libraries = libraries, @@ -21,8 +21,15 @@ fun fetchLibraryPage(page: Int, size: Int = 12, search: String? = null, targets: ) } -fun fetchLibraryCount() = LibraryStore.handle { state -> +fun fetchLibraryCount(search: String? = null, targets: Set? = null) = LibraryStore.handle { state -> + val theSearch = search ?: state.search + val theTargets = targets ?: state.targets + val service by di.instance() - val count = service.getCount().count - state.copy(count = count) + val count = service.getCount(theSearch, theTargets).count + state.copy( + count = count, + search = theSearch, + targets = theTargets, + ) } diff --git a/app/src/jsMain/kotlin/app/view/Header.kt b/app/src/jsMain/kotlin/app/view/Header.kt index 34d48eb..1518e2f 100644 --- a/app/src/jsMain/kotlin/app/view/Header.kt +++ b/app/src/jsMain/kotlin/app/view/Header.kt @@ -200,6 +200,10 @@ private fun RenderContext.SearchModal() = modal({ search = searchStore.current.takeIf(String::isNotEmpty), targets = targetsStore.current.takeIf(Set::isNotEmpty) )() + fetchLibraryCount( + search = searchStore.current.takeIf(String::isNotEmpty), + targets = targetsStore.current.takeIf(Set::isNotEmpty) + )() } handledBy close } } @@ -260,6 +264,7 @@ fun RenderContext.Header() { verticalAlign { sub } fontSize(sm = { large }, md = { larger }) fontWeight { lighter } + display(sm = { none }, md = { flex }) }) { +"KAMP" } } LibraryStore.data.map { it.count }.render { count -> @@ -291,6 +296,9 @@ fun RenderContext.Header() { } lineUp({ alignItems { center } + margins { + left { tiny } + } }) { spacing { tiny } items { diff --git a/app/src/jsMain/kotlin/app/view/component/LibraryCard.kt b/app/src/jsMain/kotlin/app/view/component/LibraryCard.kt index 2bd2ebb..9e2f389 100644 --- a/app/src/jsMain/kotlin/app/view/component/LibraryCard.kt +++ b/app/src/jsMain/kotlin/app/view/component/LibraryCard.kt @@ -159,6 +159,7 @@ private fun RenderContext.CardBody(library: KotlinMPPLibrary, selectedVersion: R paddings { horizontal { tiny } } overflow { auto } width { "100%" } + minWidth { "4rem" } }) { flexBox({ css("direction: ltr") diff --git a/app/src/jvmMain/kotlin/app/config/routing.kt b/app/src/jvmMain/kotlin/app/config/routing.kt index e73504a..adcd117 100644 --- a/app/src/jvmMain/kotlin/app/config/routing.kt +++ b/app/src/jvmMain/kotlin/app/config/routing.kt @@ -26,7 +26,7 @@ private fun Routing.libraries() = route(LibraryService.path) { } get("/count") { val service by inject() - call.respond(service.getCount()) + call.respond(service.getCount(call.request.search, call.request.targets)) } authenticate { diff --git a/app/src/jvmMain/kotlin/app/service/LibraryService.kt b/app/src/jvmMain/kotlin/app/service/LibraryService.kt index 6164c0a..784e082 100644 --- a/app/src/jvmMain/kotlin/app/service/LibraryService.kt +++ b/app/src/jvmMain/kotlin/app/service/LibraryService.kt @@ -15,7 +15,7 @@ actual class LibraryService( private val call: ApplicationCall, private val collection: CoroutineCollection, ) { - actual suspend fun getAll(page: Int, size: Int, search: String?, targets: Set?): PagedResponse { + private fun buildQuery(search: String?, targets: Set?): String { val searchQuery = search?.let { """ { @@ -43,7 +43,11 @@ actual class LibraryService( } """.trimIndent() } ?: "{}" - val data = collection.find(query).sort(ascending(KotlinMPPLibrary::name)).skip(size * (page - 1)).limit(size).toList() + return query + } + + actual suspend fun getAll(page: Int, size: Int, search: String?, targets: Set?): PagedResponse { + val data = collection.find(buildQuery(search, targets)).sort(ascending(KotlinMPPLibrary::name)).skip(size * (page - 1)).limit(size).toList() return PagedResponse( data = data, page = page, @@ -52,8 +56,8 @@ actual class LibraryService( ) } - actual suspend fun getCount(): LibraryCount { - return LibraryCount(collection.countDocuments()) + actual suspend fun getCount(search: String?, targets: Set?): LibraryCount { + return LibraryCount(collection.countDocuments(buildQuery(search, targets))) } suspend fun create(library: KotlinMPPLibrary) {