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

changeset 311
bf67e0ff7131
parent 307
23fe9f174d2d
child 312
b7554a6ef430
--- a/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt	Mon Aug 05 17:41:56 2024 +0200
+++ b/src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt	Mon Aug 05 18:40:47 2024 +0200
@@ -32,7 +32,9 @@
 import com.vladsch.flexmark.util.data.MutableDataSet
 import com.vladsch.flexmark.util.data.SharedDataKeys
 import de.uapcore.lightpit.HttpRequest
+import de.uapcore.lightpit.dao.DataAccessObject
 import de.uapcore.lightpit.entities.*
+import de.uapcore.lightpit.logic.compareEtaTo
 import de.uapcore.lightpit.types.*
 import kotlin.math.roundToInt
 
@@ -101,18 +103,29 @@
 
 data class CommitLink(val url: String, val hash: String, val message: String)
 
+class IssueOverview(
+    val issues: List<Issue>,
+    val filter: IssueFilter
+) : View() {
+    val issueSummary = IssueSummary()
+
+    init {
+        feedHref = "feed/-/issues.rss"
+        issues.forEach(issueSummary::add)
+    }
+}
+
 class IssueDetailView(
-    val pathInfos: PathInfos,
     val issue: Issue,
     val comments: List<IssueComment>,
-    val project: Project,
     projectIssues: List<Issue>,
     val currentRelations: List<IssueRelation>,
+    commitRefs: List<CommitRef>,
     /**
      * Optional resource key to an error message for the relation editor.
      */
-    val relationError: String?,
-    commitRefs: List<CommitRef>
+    val relationError: String? = null,
+    val pathInfos: PathInfos? = null
 ) : View() {
     val relationTypes = RelationType.entries
     val linkableIssues = projectIssues.filterNot { it.id == issue.id }
@@ -135,9 +148,9 @@
             comment.commentFormatted = formatMarkdown(comment.comment)
         }
 
-        val commitBaseUrl = project.repoUrl
-        commitLinks = (if (commitBaseUrl == null || project.vcs == VcsType.None) emptyList() else commitRefs.map {
-            CommitLink(buildCommitUrl(commitBaseUrl, project.vcs, it.hash), it.hash, it.message)
+        val commitBaseUrl = issue.project.repoUrl
+        commitLinks = (if (commitBaseUrl == null || issue.project.vcs == VcsType.None) emptyList() else commitRefs.map {
+            CommitLink(buildCommitUrl(commitBaseUrl, issue.project.vcs, it.hash), it.hash, it.message)
         })
     }
 
@@ -166,8 +179,8 @@
     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 pathInfos: PathInfos
+    val project: Project,
+    val pathInfos: PathInfos? = null
 ) : EditView() {
 
     val versionsUpcoming: List<Version>
@@ -194,10 +207,11 @@
     }
 }
 
-class IssueFilter(http: HttpRequest) {
+class IssueFilter(http: HttpRequest, dao: DataAccessObject) {
 
     val issueStatus = IssueStatus.entries
     val issueCategory = IssueCategory.entries
+    val users = dao.listUsers().sortedBy(User::shortDisplayname)
     val sortCriteria = IssueSorter.Field.entries.flatMap { listOf(IssueSorter.Criteria(it, true), IssueSorter.Criteria(it, false)) }
     val flagIncludeDone = "f.0"
     val flagMine = "f.1"
@@ -293,3 +307,16 @@
             ?: emptyList()
     }
 }
+
+fun issueFilterFunction(
+    filter: IssueFilter,
+    relationsMap: IssueRelationMap,
+    currentUserName: String
+): (issue: Issue) -> Boolean =
+    {
+        (!filter.onlyMine || (it.assignee?.username ?: "") == currentUserName) &&
+                (!filter.onlyBlocker || (relationsMap[it.id]?.any { (_, type) -> type.blocking } ?: false)) &&
+                (filter.status.isEmpty() || filter.status.contains(it.status)) &&
+                (filter.category.isEmpty() || filter.category.contains(it.category)) &&
+                (filter.onlyMine || filter.assignee.isEmpty() || filter.assignee.contains(it.assignee?.id ?: -1))
+    }

mercurial