1.1 --- a/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt Sun Jan 08 17:57:05 2023 +0100 1.2 +++ b/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt Sun Jan 08 19:32:11 2023 +0100 1.3 @@ -38,10 +38,20 @@ 1.4 1.5 class IssueSorter(private vararg val criteria: Criteria) : Comparator<Issue> { 1.6 enum class Field { 1.7 - DONE, PHASE, STATUS, CATEGORY, ETA, UPDATED, CREATED 1.8 + DONE, PHASE, STATUS, CATEGORY, ETA, UPDATED, CREATED; 1.9 + 1.10 + val resourceKey: String by lazy { 1.11 + if (this == DONE) "issue.filter.sort.done" 1.12 + else if (this == PHASE) "issue.filter.sort.phase" 1.13 + else "issue.${this.name.lowercase()}" 1.14 + } 1.15 } 1.16 1.17 - data class Criteria(val field: Field, val asc: Boolean = true) 1.18 + data class Criteria(val field: Field, val asc: Boolean = true) { 1.19 + override fun toString(): String { 1.20 + return "$field.$asc" 1.21 + } 1.22 + } 1.23 1.24 override fun compare(left: Issue, right: Issue): Int { 1.25 if (left == right) { 1.26 @@ -170,6 +180,7 @@ 1.27 1.28 val issueStatus = IssueStatus.values() 1.29 val issueCategory = IssueCategory.values() 1.30 + val sortCriteria = IssueSorter.Field.values().flatMap { listOf(IssueSorter.Criteria(it, true), IssueSorter.Criteria(it, false)) } 1.31 val flagIncludeDone = "f.0" 1.32 val flagMine = "f.1" 1.33 val flagBlocker = "f.2" 1.34 @@ -180,6 +191,26 @@ 1.35 val status: List<IssueStatus> = evalEnum(http, "s") 1.36 val category: List<IssueCategory> = evalEnum(http, "c") 1.37 1.38 + val sortPrimary: IssueSorter.Criteria = evalSort(http, "primary", IssueSorter.Criteria(IssueSorter.Field.DONE)) 1.39 + val sortSecondary: IssueSorter.Criteria = evalSort(http, "secondary", IssueSorter.Criteria(IssueSorter.Field.ETA)) 1.40 + val sortTertiary: IssueSorter.Criteria = evalSort(http, "tertiary", IssueSorter.Criteria(IssueSorter.Field.UPDATED, false)) 1.41 + 1.42 + private fun evalSort(http: HttpRequest, prio: String, defaultValue: IssueSorter.Criteria): IssueSorter.Criteria { 1.43 + val param = http.param("sort_$prio") 1.44 + if (param != null) { 1.45 + http.session.removeAttribute("sort_$prio") 1.46 + val p = param.split(".") 1.47 + if (p.size > 1) { 1.48 + try { 1.49 + http.session.setAttribute("sort_$prio", IssueSorter.Criteria(enumValueOf(p[0]), p[1].toBoolean())) 1.50 + } catch (_:IllegalArgumentException) { 1.51 + // ignore malfored values 1.52 + } 1.53 + } 1.54 + } 1.55 + return http.session.getAttribute("sort_$prio") as IssueSorter.Criteria? ?: defaultValue 1.56 + } 1.57 + 1.58 private fun evalFlag(http: HttpRequest, name: String): Boolean { 1.59 val param = http.paramArray("filter") 1.60 if (param.isNotEmpty()) {