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

changeset 184
e8eecee6aadf
child 186
05eec764facd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt	Fri Apr 02 11:59:14 2021 +0200
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2021 Mike Becker. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package de.uapcore.lightpit.viewmodel
+
+import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension
+import com.vladsch.flexmark.ext.tables.TablesExtension
+import com.vladsch.flexmark.html.HtmlRenderer
+import com.vladsch.flexmark.parser.Parser
+import com.vladsch.flexmark.util.data.MutableDataSet
+import de.uapcore.lightpit.entities.*
+import de.uapcore.lightpit.types.IssueCategory
+import de.uapcore.lightpit.types.IssueStatus
+import de.uapcore.lightpit.types.IssueStatusPhase
+import de.uapcore.lightpit.types.VersionStatus
+import kotlin.math.roundToInt
+
+class IssueSummary {
+    var open = 0
+    var active = 0
+    var done = 0
+
+    val total get() = open + active + done
+
+    val openPercent get() = 100 - activePercent - donePercent
+    val activePercent get() = if (total > 0) (100f * active / total).roundToInt() else 0
+    val donePercent get() = if (total > 0) (100f * done / total).roundToInt() else 100
+
+    /**
+     * Adds the specified issue to the summary by incrementing the respective counter.
+     * @param issue the issue
+     */
+    fun add(issue: Issue) {
+        when (issue.status.phase) {
+            IssueStatusPhase.Open -> open++
+            IssueStatusPhase.WorkInProgress -> active++
+            IssueStatusPhase.Done -> done++
+        }
+    }
+}
+
+class IssueDetailView(
+    val issue: Issue,
+    val comments: List<IssueComment>,
+    val project: Project,
+    val version: Version? = null,
+    val component: Component? = null
+) : View() {
+
+    init {
+        val options = MutableDataSet()
+            .set(Parser.EXTENSIONS, listOf(TablesExtension.create(), StrikethroughExtension.create()))
+        val parser = Parser.builder(options).build()
+        val renderer = HtmlRenderer.builder(options).build()
+        val process = fun(it: String) = renderer.render(parser.parse(it))
+
+        issue.description = process(issue.description)
+        for (comment in comments) {
+            comment.comment = process(comment.comment)
+        }
+    }
+}
+
+class IssueEditView(
+    val issue: Issue,
+    val versions: List<Version>,
+    val components: List<Component>,
+    val users: List<User>,
+    val project: Project, // TODO: allow null values to create issues from the IssuesServlet
+    val version: Version? = null,
+    val component: Component? = null
+) : EditView() {
+
+    val versionsUpcoming: List<Version>
+    val versionsRecent: List<Version>
+
+    val issueStatus = IssueStatus.values()
+    val issueCategory = IssueCategory.values()
+
+    init {
+        val recent = mutableListOf<Version>()
+        val upcoming = mutableListOf<Version>()
+        recent.addAll(issue.affectedVersions)
+        upcoming.addAll(issue.resolvedVersions)
+        for (v in versions) {
+            if (v.status.isReleased) {
+                if (v.status != VersionStatus.Deprecated) recent.add(v)
+            } else {
+                upcoming.add(v)
+            }
+        }
+        versionsRecent = recent
+        versionsUpcoming = upcoming
+    }
+}
+

mercurial