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 } |