src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt

changeset 271
f8f5e82944fa
parent 268
ca5501d851fa
child 284
671c1c8fbf1c
     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()) {

mercurial