--- a/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt Mon Aug 05 18:40:47 2024 +0200 +++ b/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt Mon Aug 05 19:17:36 2024 +0200 @@ -220,7 +220,7 @@ val includeDone: Boolean = evalFlag(http, flagIncludeDone) val onlyMine: Boolean = evalFlag(http, flagMine) val onlyBlocker: Boolean = evalFlag(http, flagBlocker) - val status: List<IssueStatus> = evalEnum(http, "s") + val status: List<IssueStatus> = evalEnum(http, "s") { issueStatusOf(IssueStatusPhase(it)) } val category: List<IssueCategory> = evalEnum(http, "c") val assignee: List<Int> = evalInts(http, "u") @@ -258,18 +258,29 @@ return http.session.getAttribute(name) != null } - private inline fun <reified T : Enum<T>> evalEnum(http: HttpRequest, prefix: String): List<T> { + private inline fun <reified T : Enum<T>> evalEnum( + http: HttpRequest, + prefix: String, + categorizer: ((Int) -> List<T>) = { emptyList() } + ): List<T> { val sattr = "f.${prefix}" val param = http.paramArray("filter") if (param.isNotEmpty()) { val list = param.filter { it.startsWith("${prefix}.") } .map { it.substring(prefix.length + 1) } - .map { - try { - // quick and very dirty validation - enumValueOf<T>(it) - } catch (_: IllegalArgumentException) { - // skip + .flatMap { + // try resolving as category + val cat = it.toIntOrNull() + if (cat != null) { + categorizer(cat) + } else { + try { + // quick and very dirty validation + listOf(enumValueOf<T>(it)) + } catch (_: IllegalArgumentException) { + // simply skip bogus enums + emptyList() + } } } if (list.isEmpty()) {