[gitlab] put comment navigation data to the correct components

Fixed IJPL-249453

GitOrigin-RevId: 635a6c61289a33c60546f4066552ec58ab17dc4f
This commit is contained in:
Valeria Golovina
2026-07-21 16:29:27 +00:00
committed by intellij-monorepo-bot
parent ddd7464712
commit 36025263e3
3 changed files with 32 additions and 33 deletions
@@ -7,8 +7,10 @@ import com.intellij.collaboration.ui.codereview.CodeReviewChatItemUIUtil
import com.intellij.collaboration.ui.codereview.comment.CodeReviewCommentUIUtil
import com.intellij.collaboration.ui.codereview.comment.CommentInputActionsComponentFactory
import com.intellij.collaboration.ui.codereview.timeline.comment.CommentTextFieldFactory
import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewTrackableItemViewModel
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.collaboration.ui.util.swingAction
import com.intellij.openapi.actionSystem.UiDataProvider
import com.intellij.openapi.options.advanced.AdvancedSettings
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.MessageDialogBuilder.Companion.yesNo
@@ -51,7 +53,7 @@ internal object GitLabMergeRequestDiffInlayComponentsFactory {
GitLabDiscussionComponentFactory.create(project, cs, avatarIconsProvider, imageLoader, vm, place).apply {
border = JBUI.Borders.empty(CodeReviewCommentUIUtil.getInlayPadding(CodeReviewChatItemUIUtil.ComponentType.COMPACT))
}.let {
wrapInRoundedPanel(it, vm)
wrapInRoundedTrackablePanel(it, vm)
}
fun createDraftNote(
@@ -66,11 +68,13 @@ internal object GitLabMergeRequestDiffInlayComponentsFactory {
imageLoader, vm, place).apply {
border = JBUI.Borders.empty(CodeReviewCommentUIUtil.getInlayPadding(CodeReviewChatItemUIUtil.ComponentType.COMPACT))
}.let {
wrapInRoundedPanel(it, vm)
wrapInRoundedTrackablePanel(it, vm)
}
private fun wrapInRoundedPanel(component: JComponent, vm: FocusableViewModel): JComponent =
CodeReviewCommentUIUtil.createEditorInlayPanel(component).apply {
private fun <T> wrapInRoundedTrackablePanel(component: JComponent, vm: T): JComponent
where T : CodeReviewTrackableItemViewModel,
T : FocusableViewModel {
return CodeReviewCommentUIUtil.createEditorInlayPanel(component).apply {
isFocusable = true
launchOnShow("focusRequests") {
vm.focusRequests.collect { requestFocus(false) }
@@ -84,7 +88,12 @@ internal object GitLabMergeRequestDiffInlayComponentsFactory {
else {
roundedPanel
}
}.let {
UiDataProvider.wrapComponent(it) { sink ->
sink[CodeReviewTrackableItemViewModel.TRACKABLE_ITEM_KEY] = vm
}
}
}
fun createNewDiscussion(
project: Project,
@@ -17,7 +17,6 @@ import com.intellij.collaboration.ui.codereview.comment.CodeReviewCommentUIUtil
import com.intellij.collaboration.ui.codereview.comment.CommentInputActionsComponentFactory
import com.intellij.collaboration.ui.codereview.timeline.comment.CommentTextFieldFactory
import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewResolvableItemViewModel
import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewTrackableItemViewModel
import com.intellij.collaboration.ui.codereview.timeline.thread.TimelineThreadCommentsPanel
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.collaboration.ui.util.bindChildIn
@@ -25,7 +24,6 @@ import com.intellij.collaboration.ui.util.bindEnabledIn
import com.intellij.collaboration.ui.util.bindTextIn
import com.intellij.collaboration.ui.util.bindVisibilityIn
import com.intellij.collaboration.ui.util.swingAction
import com.intellij.openapi.actionSystem.UiDataProvider
import com.intellij.openapi.project.Project
import com.intellij.ui.components.ActionLink
import com.intellij.util.ui.JBUI
@@ -68,28 +66,25 @@ internal object GitLabDiscussionComponentFactory {
}
}
return UiDataProvider.wrapComponent(
VerticalListPanel().apply {
name = "GitLab Discussion Panel ${vm.id}"
add(notesPanel)
return VerticalListPanel().apply {
name = "GitLab Discussion Panel ${vm.id}"
add(notesPanel)
cs.launchNow {
vm.replyVm.collectScoped { replyVm ->
if (replyVm == null) return@collectScoped
cs.launchNow {
vm.replyVm.collectScoped { replyVm ->
if (replyVm == null) return@collectScoped
bindChildIn(this, replyVm.newNoteVm) { newNoteVm ->
newNoteVm?.let {
createReplyField(ComponentType.COMPACT, project, this, vm, newNoteVm, avatarIconsProvider, place,
swingAction("") { replyVm.stopWriting() })
} ?: createReplyActionsPanel(vm, replyVm, project, place).apply {
border = JBUI.Borders.empty(8, ComponentType.COMPACT.fullLeftShift)
}
bindChildIn(this, replyVm.newNoteVm) { newNoteVm ->
newNoteVm?.let {
createReplyField(ComponentType.COMPACT, project, this, vm, newNoteVm, avatarIconsProvider, place,
swingAction("") { replyVm.stopWriting() })
} ?: createReplyActionsPanel(vm, replyVm, project, place).apply {
border = JBUI.Borders.empty(8, ComponentType.COMPACT.fullLeftShift)
}
}
}
}, { sink ->
sink[CodeReviewTrackableItemViewModel.TRACKABLE_ITEM_KEY] = vm
})
}
}
}
fun createReplyField(
@@ -12,13 +12,11 @@ import com.intellij.collaboration.ui.codereview.CodeReviewChatItemUIUtil
import com.intellij.collaboration.ui.codereview.CodeReviewChatItemUIUtil.ComponentType
import com.intellij.collaboration.ui.codereview.CodeReviewTimelineUIUtil
import com.intellij.collaboration.ui.codereview.comment.CodeReviewCommentUIUtil
import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewTrackableItemViewModel
import com.intellij.collaboration.ui.html.AsyncHtmlImageLoader
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.collaboration.ui.util.bindChildIn
import com.intellij.collaboration.ui.util.bindDisabledIn
import com.intellij.collaboration.ui.util.bindTextIn
import com.intellij.openapi.actionSystem.UiDataProvider
import com.intellij.openapi.project.Project
import com.intellij.util.ui.InlineIconButton
import icons.CollaborationToolsIcons
@@ -66,14 +64,11 @@ internal object GitLabNoteComponentFactory {
}
val actionsPanel = createActions(cs, flowOf(vm), project, place)
return UiDataProvider.wrapComponent(
CodeReviewChatItemUIUtil.build(componentType,
{ avatarIconsProvider.getIcon(vm.author, it) },
contentPanel) {
withHeader(createTitle(cs, vm, project, place), actionsPanel)
}, { sink ->
sink[CodeReviewTrackableItemViewModel.TRACKABLE_ITEM_KEY] = vm
})
return CodeReviewChatItemUIUtil.build(componentType,
{ avatarIconsProvider.getIcon(vm.author, it) },
contentPanel) {
withHeader(createTitle(cs, vm, project, place), actionsPanel)
}
}
@OptIn(ExperimentalCoroutinesApi::class)