diff -r bbf4eb9a71f8 -r bf67e0ff7131 src/main/kotlin/de/uapcore/lightpit/viewmodel/Issues.kt --- 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, + 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, - val project: Project, projectIssues: List, val currentRelations: List, + commitRefs: List, /** * Optional resource key to an error message for the relation editor. */ - val relationError: String?, - commitRefs: List + 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, val components: List, val users: List, - 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 @@ -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)) + }