[gitlab] better presentation for system MR events

GitOrigin-RevId: 1ac931318698a5832664397dcbf5574289e9f2e5
This commit is contained in:
Ivan Semenov
2023-01-13 18:32:42 +01:00
committed by intellij-monorepo-bot
parent 9f7d93e803
commit 8f86e85ce5
5 changed files with 105 additions and 12 deletions

View File

@@ -36,4 +36,12 @@ merge.request.list.renderer.user.reviewers={0, choice, 1#Reviewer|2#Reviewers}
merge.request.show.action=Show Merge Request
merge.request.show.action.description=Show merge request details
merge.request.open.in.browser.action=Open Merge Request On GitLab
merge.request.open.in.browser.action.description=Open merge request in a web browser
merge.request.open.in.browser.action.description=Open merge request in a web browser
merge.request.event.closed=closed this merge request
merge.request.event.reopened=reopened this merge request
merge.request.event.merged=merged this merge request
merge.request.event.milestone.removed=removed milestone {0}
merge.request.event.milestone.changed=changed milestone to {0}
merge.request.event.label.added=added {0} label
merge.request.event.label.removed=removed {0} label

View File

@@ -1,11 +1,13 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.api.dto
import org.jetbrains.annotations.Nls
data class GitLabLabelRestDTO(
val color: String,
val description: String?,
val descriptionHtml: String?,
val id: Int,
val name: String,
val name: @Nls String,
val textColor: String
)

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.api.dto
import org.jetbrains.annotations.Nls
import java.util.*
data class GitLabMilestoneDTO(
@@ -12,7 +13,7 @@ data class GitLabMilestoneDTO(
val projectId: Int,
val startDate: Date?,
val state: String,
val title: String,
val title: @Nls String,
val updatedAt: String,
val webUrl: String
)

View File

@@ -1,6 +1,8 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger
import java.util.*
data class GitLabResourceStateEventDTO(
@@ -10,4 +12,22 @@ data class GitLabResourceStateEventDTO(
val resourceType: String,
val state: String,
val user: GitLabUserDTO
)
) {
val stateEnum: State = parseState(state)
enum class State {
CLOSED, REOPENED, MERGED
}
companion object {
private val logger: Logger = logger<GitLabResourceLabelEventDTO>()
private fun parseState(value: String): State = try {
State.valueOf(value.uppercase(Locale.getDefault()))
}
catch (_: IllegalArgumentException) {
logger.warn("Unable to parse merge label event action: $value")
State.CLOSED
}
}
}

View File

@@ -6,6 +6,8 @@ import com.intellij.collaboration.ui.SimpleHtmlPane
import com.intellij.collaboration.ui.TransparentScrollPane
import com.intellij.collaboration.ui.VerticalListPanel
import com.intellij.collaboration.ui.codereview.CodeReviewChatItemUIUtil
import com.intellij.collaboration.ui.codereview.timeline.StatusMessageComponentFactory
import com.intellij.collaboration.ui.codereview.timeline.StatusMessageType
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.util.text.HtmlBuilder
@@ -19,9 +21,11 @@ import com.intellij.util.ui.update.UiNotifyConnector
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import org.jetbrains.plugins.gitlab.api.dto.GitLabUserDTO
import org.jetbrains.annotations.Nls
import org.jetbrains.plugins.gitlab.api.dto.*
import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabMergeRequestTimelineItem
import org.jetbrains.plugins.gitlab.mergerequest.ui.timeline.GitLabMergeRequestTimelineViewModel.LoadingState
import org.jetbrains.plugins.gitlab.util.GitLabBundle
import java.util.*
import javax.swing.JComponent
import javax.swing.JLabel
@@ -81,15 +85,60 @@ object GitLabMergeRequestTimelineComponentFactory {
}
private fun createContent(item: GitLabMergeRequestTimelineItem): JComponent {
val text = when (item) {
is GitLabMergeRequestTimelineItem.Discussion -> item.discussion.notes.first().body
is GitLabMergeRequestTimelineItem.LabelEvent -> "${item.event.action} label ${item.event.label.name}"
is GitLabMergeRequestTimelineItem.MilestoneEvent -> "${item.event.action} milestone ${item.event.milestone.title}"
is GitLabMergeRequestTimelineItem.StateEvent -> "changed state to ${item.event.state}"
return when (item) {
is GitLabMergeRequestTimelineItem.Discussion -> createDiscussionContent(item)
is GitLabMergeRequestTimelineItem.LabelEvent -> createLabeledEventContent(item)
is GitLabMergeRequestTimelineItem.MilestoneEvent -> createMilestonedEventContent(item)
is GitLabMergeRequestTimelineItem.StateEvent -> createStateChangeContent(item)
}
return SimpleHtmlPane(text)
}
private fun createDiscussionContent(item: GitLabMergeRequestTimelineItem.Discussion): JComponent {
val firstNote = item.discussion.notes.first()
return if (firstNote.system) {
StatusMessageComponentFactory.create(SimpleHtmlPane(firstNote.body))
}
else {
SimpleHtmlPane(firstNote.body)
}
}
private fun createLabeledEventContent(item: GitLabMergeRequestTimelineItem.LabelEvent): JComponent {
val text = when (item.event.actionEnum) {
GitLabResourceLabelEventDTO.Action.ADD -> GitLabBundle.message("merge.request.event.label.added", item.event.label.toHtml())
GitLabResourceLabelEventDTO.Action.REMOVE -> GitLabBundle.message("merge.request.event.label.removed", item.event.label.toHtml())
}
val textPane = SimpleHtmlPane(text)
return StatusMessageComponentFactory.create(textPane)
}
private fun createMilestonedEventContent(item: GitLabMergeRequestTimelineItem.MilestoneEvent): JComponent {
val text = when (item.event.actionEnum) {
GitLabResourceMilestoneEventDTO.Action.ADD ->
GitLabBundle.message("merge.request.event.milestone.changed", item.event.milestone.toHtml())
GitLabResourceMilestoneEventDTO.Action.REMOVE ->
GitLabBundle.message("merge.request.event.milestone.removed", item.event.milestone.toHtml())
}
val textPane = SimpleHtmlPane(text)
return StatusMessageComponentFactory.create(textPane)
}
private fun createStateChangeContent(item: GitLabMergeRequestTimelineItem.StateEvent): JComponent {
val text = when (item.event.stateEnum) {
GitLabResourceStateEventDTO.State.CLOSED -> GitLabBundle.message("merge.request.event.closed")
GitLabResourceStateEventDTO.State.REOPENED -> GitLabBundle.message("merge.request.event.reopened")
GitLabResourceStateEventDTO.State.MERGED -> GitLabBundle.message("merge.request.event.merged")
}
val type: StatusMessageType = when (item.event.stateEnum) {
GitLabResourceStateEventDTO.State.CLOSED -> StatusMessageType.SECONDARY_INFO
GitLabResourceStateEventDTO.State.REOPENED -> StatusMessageType.INFO
GitLabResourceStateEventDTO.State.MERGED -> StatusMessageType.SUCCESS
}
val textPane = SimpleHtmlPane(text)
return StatusMessageComponentFactory.create(textPane, type)
}
private fun createTitleTextPane(actor: GitLabUserDTO, date: Date?): JComponent {
val userNameLink = HtmlChunk.link(actor.webUrl, actor.name)
.wrapWith(HtmlChunk.font(ColorUtil.toHtmlColor(UIUtil.getLabelForeground())))
@@ -107,4 +156,17 @@ object GitLabMergeRequestTimelineComponentFactory {
}
return titleTextPane
}
}
}
private fun GitLabLabelRestDTO.toHtml(): @Nls String {
val bg = CollaborationToolsUIUtil.getLabelBackground(color)
val fg = CollaborationToolsUIUtil.getLabelForeground(bg)
return HtmlChunk.span("color: #${ColorUtil.toHex(fg)}; background: #${ColorUtil.toHex(bg)}")
.child(HtmlChunk.nbsp())
.addText(name)
.child(HtmlChunk.nbsp())
.toString()
}
private fun GitLabMilestoneDTO.toHtml(): @Nls String = HtmlChunk.link(webUrl, title).toString()