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

changeset 268
ca5501d851fa
parent 267
d8ec2d8ffa82
child 271
f8f5e82944fa
equal deleted inserted replaced
267:d8ec2d8ffa82 268:ca5501d851fa
29 import com.vladsch.flexmark.ext.tables.TablesExtension 29 import com.vladsch.flexmark.ext.tables.TablesExtension
30 import com.vladsch.flexmark.html.HtmlRenderer 30 import com.vladsch.flexmark.html.HtmlRenderer
31 import com.vladsch.flexmark.parser.Parser 31 import com.vladsch.flexmark.parser.Parser
32 import com.vladsch.flexmark.util.data.MutableDataSet 32 import com.vladsch.flexmark.util.data.MutableDataSet
33 import com.vladsch.flexmark.util.data.SharedDataKeys 33 import com.vladsch.flexmark.util.data.SharedDataKeys
34 import de.uapcore.lightpit.HttpRequest
34 import de.uapcore.lightpit.entities.* 35 import de.uapcore.lightpit.entities.*
35 import de.uapcore.lightpit.types.* 36 import de.uapcore.lightpit.types.*
36 import kotlin.math.roundToInt 37 import kotlin.math.roundToInt
37 38
38 class IssueSorter(private vararg val criteria: Criteria) : Comparator<Issue> { 39 class IssueSorter(private vararg val criteria: Criteria) : Comparator<Issue> {
109 110
110 init { 111 init {
111 val options = MutableDataSet() 112 val options = MutableDataSet()
112 .set(SharedDataKeys.EXTENSIONS, listOf(TablesExtension.create(), StrikethroughExtension.create())) 113 .set(SharedDataKeys.EXTENSIONS, listOf(TablesExtension.create(), StrikethroughExtension.create()))
113 parser = Parser.builder(options).build() 114 parser = Parser.builder(options).build()
114 renderer = HtmlRenderer.builder(options 115 renderer = HtmlRenderer.builder(
115 .set(HtmlRenderer.ESCAPE_HTML, true) 116 options
117 .set(HtmlRenderer.ESCAPE_HTML, true)
116 ).build() 118 ).build()
117 119
118 issue.description = formatMarkdown(issue.description ?: "") 120 issue.description = formatMarkdown(issue.description ?: "")
119 for (comment in comments) { 121 for (comment in comments) {
120 comment.commentFormatted = formatMarkdown(comment.comment) 122 comment.commentFormatted = formatMarkdown(comment.comment)
162 versionsRecent = recent.distinct() 164 versionsRecent = recent.distinct()
163 versionsUpcoming = upcoming.distinct() 165 versionsUpcoming = upcoming.distinct()
164 } 166 }
165 } 167 }
166 168
169 class IssueFilter(http: HttpRequest) {
170
171 val issueStatus = IssueStatus.values()
172 val issueCategory = IssueCategory.values()
173 val flagIncludeDone = "f.0"
174 val flagMine = "f.1"
175 val flagBlocker = "f.2"
176
177 val includeDone: Boolean = evalFlag(http, flagIncludeDone)
178 val onlyMine: Boolean = evalFlag(http, flagMine)
179 val onlyBlocker: Boolean = evalFlag(http, flagBlocker)
180 val status: List<IssueStatus> = evalEnum(http, "s")
181 val category: List<IssueCategory> = evalEnum(http, "c")
182
183 private fun evalFlag(http: HttpRequest, name: String): Boolean {
184 val param = http.paramArray("filter")
185 if (param.isNotEmpty()) {
186 if (param.contains(name)) {
187 http.session.setAttribute(name, true)
188 } else {
189 http.session.removeAttribute(name)
190 }
191 }
192 return http.session.getAttribute(name) != null
193 }
194
195 private inline fun <reified T : Enum<T>> evalEnum(http: HttpRequest, prefix: String): List<T> {
196 val sattr = "f.${prefix}"
197 val param = http.paramArray("filter")
198 if (param.isNotEmpty()) {
199 val list = param.filter { it.startsWith("${prefix}.") }
200 .map { it.substring(prefix.length + 1) }
201 .map {
202 try {
203 // quick and very dirty validation
204 enumValueOf<T>(it)
205 } catch (_: IllegalArgumentException) {
206 // skip
207 }
208 }
209 if (list.isEmpty()) {
210 http.session.removeAttribute(sattr)
211 } else {
212 http.session.setAttribute(sattr, list.joinToString(","))
213 }
214 }
215
216 return http.session.getAttribute(sattr)
217 ?.toString()
218 ?.split(",")
219 ?.map { enumValueOf(it) }
220 ?: emptyList()
221 }
222 }

mercurial