From 6e5be878d4f27af60cd719e5fe00d840c8a340ed Mon Sep 17 00:00:00 2001 From: Ivan Semenov Date: Mon, 4 Nov 2024 17:23:11 +0100 Subject: [PATCH] [collab/gitlab] fix review diff file update when only selection is changed #IJPL-164167 Fixed (cherry picked from commit 79634a7d2efe2f45408998990256d4aea10200e0) IJ-CR-149434 GitOrigin-RevId: f60f607d436b47f833c0a81fab2189b9b381f85f --- .../api-dump-experimental.txt | 2 -- .../model/CodeReviewDiffProcessorViewModel.kt | 20 ++++++++++--------- .../diff/model/RefComparisonChangesSorter.kt | 7 ------- .../diff/GitLabMergeRequestDiffViewModel.kt | 7 +++++-- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/platform/collaboration-tools/api-dump-experimental.txt b/platform/collaboration-tools/api-dump-experimental.txt index 63250ae4ccf8..08028ca6883f 100644 --- a/platform/collaboration-tools/api-dump-experimental.txt +++ b/platform/collaboration-tools/api-dump-experimental.txt @@ -953,8 +953,6 @@ f:com.intellij.collaboration.api.json.JsonHttpApiHelperKt - com.intellij.collaboration.ui.codereview.diff.model.RefComparisonChangesSorter - sf:INSTANCE:com.intellij.collaboration.ui.codereview.diff.model.RefComparisonChangesSorter$None - sort(java.util.List):java.util.List -*f:com.intellij.collaboration.ui.codereview.diff.model.RefComparisonChangesSorterKt -- sf:sort(com.intellij.collaboration.ui.codereview.diff.model.RefComparisonChangesSorter,com.intellij.openapi.ListSelection):com.intellij.openapi.ListSelection f:com.intellij.collaboration.ui.codereview.diff.viewer.DiffViewerUtilKt - *sf:controlInlaysIn(com.intellij.diff.tools.util.base.DiffViewerBase,kotlinx.coroutines.CoroutineScope,kotlinx.coroutines.flow.Flow,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function2):V - *sf:showCodeReview(com.intellij.diff.tools.util.base.DiffViewerBase,kotlin.jvm.functions.Function3,com.intellij.openapi.util.Key,kotlin.jvm.functions.Function2,kotlin.coroutines.Continuation):java.lang.Object diff --git a/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/CodeReviewDiffProcessorViewModel.kt b/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/CodeReviewDiffProcessorViewModel.kt index 292dad88a06e..02b17d60bcdd 100644 --- a/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/CodeReviewDiffProcessorViewModel.kt +++ b/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/CodeReviewDiffProcessorViewModel.kt @@ -3,6 +3,7 @@ package com.intellij.collaboration.ui.codereview.diff.model import com.intellij.collaboration.async.MappingScopedItemsContainer import com.intellij.collaboration.async.collectScoped +import com.intellij.collaboration.ui.util.selectedItem import com.intellij.collaboration.util.ComputedResult import com.intellij.collaboration.util.onFailure import com.intellij.collaboration.util.onInProgress @@ -49,7 +50,7 @@ interface PreLoadingCodeReviewAsyncDiffViewModelDelegate create( preloadedDataFlow: Flow?>, - changesPreProcessor: Flow<(ListSelection) -> ListSelection>, + changesPreProcessor: Flow<(List) -> List>, createViewModel: CoroutineScope.(D, C) -> CVM, ): PreLoadingCodeReviewAsyncDiffViewModelDelegate = PreLoadingCodeReviewAsyncDiffViewModelDelegateImpl(preloadedDataFlow, changesPreProcessor, createViewModel) @@ -59,7 +60,7 @@ interface PreLoadingCodeReviewAsyncDiffViewModelDelegate( preloadedDataFlow: Flow?>, - private val changesPreProcessor: Flow<(ListSelection) -> ListSelection>, + private val changesPreProcessor: Flow<(List) -> List>, private val createViewModel: CoroutineScope.(D, C) -> CVM, ) : PreLoadingCodeReviewAsyncDiffViewModelDelegate { private val changesToShow = MutableStateFlow(ChangesState()) @@ -81,17 +82,18 @@ private class PreLoadingCodeReviewAsyncDiffViewModelDelegateImpl(this) { createViewModel(preloadedData, it) } - var lastList: ListSelection = ListSelection.empty() + var lastList: List = emptyList() changesPreProcessor.collectLatest { preProcessor -> changesToShow.collectScoped { changesState -> - if (changesState.selectedChanges.list != lastList.list) { + if (changesState.selectedChanges.list != lastList) { emit(ComputedResult.loading()) - val processedList = preProcessor(changesState.selectedChanges) - vmsContainer.update(processedList.list) - lastList = processedList + val processedList = preProcessor(changesState.selectedChanges.list) + vmsContainer.update(processedList) + lastList = changesState.selectedChanges.list } - val vms = vmsContainer.mappingState.value.values.toList() - val selectedVmIdx = lastList.selectedIndex + val mappingState = vmsContainer.mappingState.value + val vms = mappingState.values.toList() + val selectedVmIdx = mappingState.keys.indexOf(changesState.selectedChanges.selectedItem) val newState = ViewModelsState(ListSelection.createAt(vms, selectedVmIdx), changesState.scrollRequests) emit(ComputedResult.success(newState)) } diff --git a/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/RefComparisonChangesSorter.kt b/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/RefComparisonChangesSorter.kt index 58950ef14a09..1c1c088bce7c 100644 --- a/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/RefComparisonChangesSorter.kt +++ b/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/model/RefComparisonChangesSorter.kt @@ -1,11 +1,9 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.collaboration.ui.codereview.diff.model -import com.intellij.collaboration.ui.util.selectedItem import com.intellij.collaboration.util.RefComparisonChange import com.intellij.collaboration.util.filePath import com.intellij.collaboration.util.fileStatus -import com.intellij.openapi.ListSelection import com.intellij.openapi.project.Project import com.intellij.openapi.vcs.FilePath import com.intellij.openapi.vcs.changes.ui.* @@ -40,8 +38,3 @@ fun interface RefComparisonChangesSorter { } } } - -fun RefComparisonChangesSorter.sort(list: ListSelection): ListSelection { - val newList = sort(list.list) - return ListSelection.create(newList, list.selectedItem) -} diff --git a/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/diff/GitLabMergeRequestDiffViewModel.kt b/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/diff/GitLabMergeRequestDiffViewModel.kt index bc57f01fccca..6f957df303c6 100644 --- a/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/diff/GitLabMergeRequestDiffViewModel.kt +++ b/plugins/gitlab/src/org/jetbrains/plugins/gitlab/mergerequest/diff/GitLabMergeRequestDiffViewModel.kt @@ -4,7 +4,10 @@ package org.jetbrains.plugins.gitlab.mergerequest.diff import com.intellij.collaboration.async.computationStateFlow import com.intellij.collaboration.async.mapScoped import com.intellij.collaboration.ui.codereview.diff.DiffLineLocation -import com.intellij.collaboration.ui.codereview.diff.model.* +import com.intellij.collaboration.ui.codereview.diff.model.CodeReviewDiffProcessorViewModel +import com.intellij.collaboration.ui.codereview.diff.model.DiffViewerScrollRequest +import com.intellij.collaboration.ui.codereview.diff.model.PreLoadingCodeReviewAsyncDiffViewModelDelegate +import com.intellij.collaboration.ui.codereview.diff.model.RefComparisonChangesSorter import com.intellij.collaboration.ui.icon.IconsProvider import com.intellij.collaboration.util.ComputedResult import com.intellij.collaboration.util.RefComparisonChange @@ -54,7 +57,7 @@ internal class GitLabMergeRequestDiffProcessorViewModelImpl( private val changesFetchFlow = computationStateFlow(mergeRequest.changes, GitLabMergeRequestChanges::loadRevisionsAndParseChanges) private val changesSorter = project.service().changesGroupingState .map { - { changes: ListSelection -> + { changes: List -> RefComparisonChangesSorter.Grouping(project, it).sort(changes) } }