diff -r 8c088c628a20 -r f8f5e82944fa src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt --- a/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt Sun Jan 08 17:57:05 2023 +0100 +++ b/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt Sun Jan 08 19:32:11 2023 +0100 @@ -38,10 +38,20 @@ class IssueSorter(private vararg val criteria: Criteria) : Comparator { enum class Field { - DONE, PHASE, STATUS, CATEGORY, ETA, UPDATED, CREATED + DONE, PHASE, STATUS, CATEGORY, ETA, UPDATED, CREATED; + + val resourceKey: String by lazy { + if (this == DONE) "issue.filter.sort.done" + else if (this == PHASE) "issue.filter.sort.phase" + else "issue.${this.name.lowercase()}" + } } - data class Criteria(val field: Field, val asc: Boolean = true) + data class Criteria(val field: Field, val asc: Boolean = true) { + override fun toString(): String { + return "$field.$asc" + } + } override fun compare(left: Issue, right: Issue): Int { if (left == right) { @@ -170,6 +180,7 @@ val issueStatus = IssueStatus.values() val issueCategory = IssueCategory.values() + val sortCriteria = IssueSorter.Field.values().flatMap { listOf(IssueSorter.Criteria(it, true), IssueSorter.Criteria(it, false)) } val flagIncludeDone = "f.0" val flagMine = "f.1" val flagBlocker = "f.2" @@ -180,6 +191,26 @@ val status: List = evalEnum(http, "s") val category: List = evalEnum(http, "c") + val sortPrimary: IssueSorter.Criteria = evalSort(http, "primary", IssueSorter.Criteria(IssueSorter.Field.DONE)) + val sortSecondary: IssueSorter.Criteria = evalSort(http, "secondary", IssueSorter.Criteria(IssueSorter.Field.ETA)) + val sortTertiary: IssueSorter.Criteria = evalSort(http, "tertiary", IssueSorter.Criteria(IssueSorter.Field.UPDATED, false)) + + private fun evalSort(http: HttpRequest, prio: String, defaultValue: IssueSorter.Criteria): IssueSorter.Criteria { + val param = http.param("sort_$prio") + if (param != null) { + http.session.removeAttribute("sort_$prio") + val p = param.split(".") + if (p.size > 1) { + try { + http.session.setAttribute("sort_$prio", IssueSorter.Criteria(enumValueOf(p[0]), p[1].toBoolean())) + } catch (_:IllegalArgumentException) { + // ignore malfored values + } + } + } + return http.session.getAttribute("sort_$prio") as IssueSorter.Criteria? ?: defaultValue + } + private fun evalFlag(http: HttpRequest, name: String): Boolean { val param = http.paramArray("filter") if (param.isNotEmpty()) {