diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/13_9/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/13_9/mergeRequest.graphql index a1fa7f64d611..a9453fd1127f 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/13_9/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/13_9/mergeRequest.graphql @@ -17,7 +17,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/community/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/community/mergeRequest.graphql index 8594a00d4252..fd808b79a263 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/community/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/community/mergeRequest.graphql @@ -17,7 +17,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/mergeRequest.graphql index 8eedbf78f06e..714fb8d82962 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_0/mergeRequest.graphql @@ -16,7 +16,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/community/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/community/mergeRequest.graphql index a53359c7b039..efa792a1bb32 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/community/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/community/mergeRequest.graphql @@ -17,7 +17,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/mergeRequest.graphql index c39dc5a2772e..35dc18dba734 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/14_7/mergeRequest.graphql @@ -16,7 +16,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/community/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/community/mergeRequest.graphql index 324c0a6619d3..3f902e0c64c9 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/community/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/community/mergeRequest.graphql @@ -16,7 +16,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/label.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/label.graphql index 5bc5783a5561..93c85a0b73f9 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/label.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/label.graphql @@ -1,4 +1,5 @@ fragment label on Label { title description + color } \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/resources/graphql/fragment/mergeRequest.graphql b/plugins/gitlab/gitlab-core/resources/graphql/fragment/mergeRequest.graphql index 515872cddd66..9d21514ba295 100644 --- a/plugins/gitlab/gitlab-core/resources/graphql/fragment/mergeRequest.graphql +++ b/plugins/gitlab/gitlab-core/resources/graphql/fragment/mergeRequest.graphql @@ -15,7 +15,7 @@ fragment mergeRequest on MergeRequest { } nodes { - title + ...label } } diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/dto/GitLabLabelDTO.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/dto/GitLabLabelGQLDTO.kt similarity index 74% rename from plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/dto/GitLabLabelDTO.kt rename to plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/dto/GitLabLabelGQLDTO.kt index 3f5c8b14e429..e2e2c7db9e06 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/dto/GitLabLabelDTO.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/dto/GitLabLabelGQLDTO.kt @@ -2,10 +2,12 @@ package org.jetbrains.plugins.gitlab.api.dto import com.intellij.collaboration.api.dto.GraphQLFragment +import com.intellij.openapi.util.NlsSafe import org.jetbrains.plugins.gitlab.api.SinceGitLab @SinceGitLab("12.0") @GraphQLFragment("/graphql/fragment/label.graphql") -data class GitLabLabelDTO( - val title: String +data class GitLabLabelGQLDTO( + val title: @NlsSafe String, + val color: String, ) \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/request/GitLabProjectApi.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/request/GitLabProjectApi.kt index e2b6572b6dd3..8f482baf3d67 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/request/GitLabProjectApi.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/api/request/GitLabProjectApi.kt @@ -20,9 +20,8 @@ import org.jetbrains.plugins.gitlab.api.GitLabProjectCoordinates import org.jetbrains.plugins.gitlab.api.GitLabServerMetadata import org.jetbrains.plugins.gitlab.api.GitLabVersion import org.jetbrains.plugins.gitlab.api.SinceGitLab -import org.jetbrains.plugins.gitlab.api.dto.GitLabGraphQLMutationResultDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabGroupDTO -import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelDTO +import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelGQLDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabNamespaceDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabNamespaceRestDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabProjectDTO @@ -37,7 +36,6 @@ import org.jetbrains.plugins.gitlab.api.gitLabQuery import org.jetbrains.plugins.gitlab.api.restApiUri import org.jetbrains.plugins.gitlab.api.withErrorStats import org.jetbrains.plugins.gitlab.api.withQuery -import org.jetbrains.plugins.gitlab.mergerequest.api.dto.GitLabMergeRequestDTO import org.jetbrains.plugins.gitlab.util.GitLabApiRequestName import java.net.URI import java.net.http.HttpRequest.BodyPublishers @@ -102,7 +100,7 @@ suspend fun GitLabApi.isProjectForked(project: GitLabProjectCoordinates): Boolea @SinceGitLab("13.1", note = "No exact version") -fun GitLabApi.GraphQL.createAllProjectLabelsFlow(project: GitLabProjectCoordinates): Flow> = +fun GitLabApi.GraphQL.createAllProjectLabelsFlow(project: GitLabProjectCoordinates): Flow> = ApiPageUtil.createGQLPagesFlow { page -> val parameters = page.asParameters() + mapOf( "fullPath" to project.projectPath.fullPath() @@ -188,8 +186,8 @@ private data class GitLabUserNamespacesResult( data class CurrentUser(val namespace: GitLabNamespaceDTO) } -private class LabelConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List) - : GraphQLConnectionDTO(pageInfo, nodes) +private class LabelConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List) + : GraphQLConnectionDTO(pageInfo, nodes) private class WorkItemConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List) : GraphQLConnectionDTO(pageInfo, nodes) \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/api/dto/GitLabMergeRequestDTO.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/api/dto/GitLabMergeRequestDTO.kt index 76e5193d62c3..318e8e9de2b5 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/api/dto/GitLabMergeRequestDTO.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/api/dto/GitLabMergeRequestDTO.kt @@ -8,7 +8,7 @@ import org.jetbrains.plugins.gitlab.api.GitLabEdition import org.jetbrains.plugins.gitlab.api.SinceGitLab import org.jetbrains.plugins.gitlab.api.dto.GitLabCommitDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabDiffRefs -import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelDTO +import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelGQLDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabMergeRequestPermissionsDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabPipelineDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabProjectDTO @@ -60,7 +60,7 @@ class GitLabMergeRequestDTO( @SinceGitLab("14.7") val commits: List? = commits?.nodes - val labels: List = labels.nodes + val labels: List = labels.nodes @SinceGitLab("13.5") class UserCoreConnection( @@ -89,6 +89,6 @@ class GitLabMergeRequestDTO( @SinceGitLab("12.4") class LabelConnection( pageInfo: GraphQLCursorPageInfoDTO, - nodes: List - ) : GraphQLConnectionDTO(pageInfo, nodes) + nodes: List + ) : GraphQLConnectionDTO(pageInfo, nodes) } \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabLabel.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabLabel.kt new file mode 100644 index 000000000000..32f4d6fe6525 --- /dev/null +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabLabel.kt @@ -0,0 +1,20 @@ +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.plugins.gitlab.mergerequest.data + +class GitLabLabel( + val title: String, + val colorHex: String, +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is GitLabLabel) return false + + if (title != other.title) return false + + return true + } + + override fun hashCode(): Int { + return title.hashCode() + } +} \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabMergeRequestFullDetails.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabMergeRequestFullDetails.kt index b67305264577..c50783a94ce3 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabMergeRequestFullDetails.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabMergeRequestFullDetails.kt @@ -9,7 +9,7 @@ import git4idea.remote.hosting.HostedGitRepositoryRemote import git4idea.repo.GitRemote import org.jetbrains.plugins.gitlab.api.GitLabServerPath import org.jetbrains.plugins.gitlab.api.dto.GitLabDiffRefs -import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelDTO +import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelGQLDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabMergeRequestPermissionsDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabPipelineDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabProjectDTO @@ -19,35 +19,35 @@ import org.jetbrains.plugins.gitlab.mergerequest.api.dto.GitLabMergeRequestDTO import java.util.Date data class GitLabMergeRequestFullDetails( - val iid: String, - val title: @NlsSafe String, - val createdAt: Date, - val author: GitLabUserDTO, - val mergeStatus: GitLabMergeStatus, - val isMergeable: Boolean, - val state: GitLabMergeRequestState, - val draft: Boolean, - val assignees: List, - val reviewers: List, - val webUrl: @NlsSafe String, - val detailedLabels: List, - val targetProject: GitLabProjectDTO, - val sourceProject: GitLabProjectDTO?, - val description: String, - val approvedBy: List, - val targetBranch: String, - val sourceBranch: String, - val approvalsRequired: Int, - val conflicts: Boolean, - val onlyAllowMergeIfAllDiscussionsAreResolved: Boolean, - val onlyAllowMergeIfPipelineSucceeds: Boolean, - val allowMergeOnSkippedPipeline: Boolean, - val diffRefs: GitLabDiffRefs?, - val headPipeline: GitLabPipelineDTO?, - val userPermissions: GitLabMergeRequestPermissionsDTO, - val shouldRemoveSourceBranch: Boolean?, - val shouldBeRebased: Boolean, - val rebaseInProgress: Boolean + val iid: String, + val title: @NlsSafe String, + val createdAt: Date, + val author: GitLabUserDTO, + val mergeStatus: GitLabMergeStatus, + val isMergeable: Boolean, + val state: GitLabMergeRequestState, + val draft: Boolean, + val assignees: List, + val reviewers: List, + val webUrl: @NlsSafe String, + val detailedLabels: List, + val targetProject: GitLabProjectDTO, + val sourceProject: GitLabProjectDTO?, + val description: String, + val approvedBy: List, + val targetBranch: String, + val sourceBranch: String, + val approvalsRequired: Int, + val conflicts: Boolean, + val onlyAllowMergeIfAllDiscussionsAreResolved: Boolean, + val onlyAllowMergeIfPipelineSucceeds: Boolean, + val allowMergeOnSkippedPipeline: Boolean, + val diffRefs: GitLabDiffRefs?, + val headPipeline: GitLabPipelineDTO?, + val userPermissions: GitLabMergeRequestPermissionsDTO, + val shouldRemoveSourceBranch: Boolean?, + val shouldBeRebased: Boolean, + val rebaseInProgress: Boolean ) { companion object { diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabProject.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabProject.kt index 39a04ff1cb64..2899bbe3d1f5 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabProject.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabProject.kt @@ -14,18 +14,13 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async -import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.transformWhile import org.jetbrains.plugins.gitlab.api.GitLabApi import org.jetbrains.plugins.gitlab.api.GitLabGidData @@ -35,12 +30,10 @@ import org.jetbrains.plugins.gitlab.api.GitLabProjectCoordinates import org.jetbrains.plugins.gitlab.api.GitLabServerMetadata import org.jetbrains.plugins.gitlab.api.GitLabVersion import org.jetbrains.plugins.gitlab.api.data.GitLabPlan -import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabProjectDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabUserDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabWorkItemDTO.GitLabWidgetDTO.WorkItemWidgetAssignees import org.jetbrains.plugins.gitlab.api.dto.GitLabWorkItemDTO.WorkItemType -import org.jetbrains.plugins.gitlab.api.getResultOrThrow import org.jetbrains.plugins.gitlab.api.request.createAllProjectLabelsFlow import org.jetbrains.plugins.gitlab.api.request.createAllWorkItemsFlow import org.jetbrains.plugins.gitlab.api.request.getProjectNamespace @@ -72,7 +65,7 @@ interface GitLabProject { suspend fun getEmojis(): List - fun getLabelsBatches(): Flow> + fun getLabelsBatches(): Flow> fun getMembersBatches(): Flow> val defaultBranch: String? @@ -135,7 +128,12 @@ class GitLabLazyProject( CachingGitLabProjectMergeRequestsStore(project, cs, api, glMetadata, projectMapping, currentUser, tokenRefreshFlow) } - private val labelsLoader = BatchesLoader(cs, api.graphQL.createAllProjectLabelsFlow(projectMapping.repository)) + private val labelsLoader = BatchesLoader(cs, + api.graphQL.createAllProjectLabelsFlow(projectMapping.repository).map { labels -> + labels.map { + GitLabLabel(it.title, it.color) + } + }) private val membersLoader = BatchesLoader(cs, ApiPageUtil.createPagesFlowByLinkHeader(getProjectUsersURI(projectMapping.repository)) { api.rest.getProjectUsers(it) @@ -144,7 +142,7 @@ class GitLabLazyProject( override suspend fun getEmojis(): List = emojisRequest.await() override val defaultBranch: String? = initialData.repository?.rootRef override suspend fun isMultipleReviewersAllowed(): Boolean = multipleReviewersAllowedRequest.await() - override fun getLabelsBatches(): Flow> = labelsLoader.getBatches() + override fun getLabelsBatches(): Flow> = labelsLoader.getBatches() override fun getMembersBatches(): Flow> = membersLoader.getBatches() private suspend fun loadMultipleReviewersAllowed(project: GitLabProjectDTO): Boolean { diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabFiltersPanelFactory.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabFiltersPanelFactory.kt index 74f5f0addf97..b48eaabcd407 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabFiltersPanelFactory.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabFiltersPanelFactory.kt @@ -1,7 +1,6 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.plugins.gitlab.mergerequest.ui.filters -import com.intellij.collaboration.ui.codereview.avatar.Avatar import com.intellij.collaboration.ui.codereview.list.error.ErrorStatusPresenter import com.intellij.collaboration.ui.codereview.list.search.ChooserPopupUtil import com.intellij.collaboration.ui.codereview.list.search.DropDownComponentFactory @@ -13,7 +12,6 @@ import com.intellij.ui.awt.RelativePoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.map import org.jetbrains.annotations.Nls import org.jetbrains.plugins.gitlab.api.dto.GitLabUserDTO import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.LabelFilterValue @@ -22,6 +20,7 @@ import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsF import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAssigneeFilterValue import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAuthorFilterValue import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsReviewerFilterValue +import org.jetbrains.plugins.gitlab.mergerequest.util.GitLabMergeRequestChoosersUtil import org.jetbrains.plugins.gitlab.util.GitLabBundle import javax.swing.JComponent @@ -94,11 +93,13 @@ internal class GitLabFiltersPanelFactory( filterName = GitLabBundle.message("merge.request.list.filter.category.label"), valuePresenter = { labelFilterValue -> labelFilterValue.title }, chooseValue = { point -> - ChooserPopupUtil.showAsyncChooserPopup( + ChooserPopupUtil.showAsyncChooserPopup( point, - itemsLoader = vm.labels.mapResultList { label -> LabelFilterValue(label.title) }, - presenter = { labelFilterValue -> PopupItemPresentation.Simple(shortText = labelFilterValue.title) } - ) + itemsLoader = vm.labels, + presenter = GitLabMergeRequestChoosersUtil.getLabelPresenter() + )?.let { + LabelFilterValue(it.title) + } } ) @@ -121,13 +122,7 @@ internal class GitLabFiltersPanelFactory( participantsLoader: Flow>> ): GitLabUserDTO? = ChooserPopupUtil.showAsyncChooserPopup( point, itemsLoader = participantsLoader, - presenter = { user -> - PopupItemPresentation.Simple( - user.username, - vm.avatarIconsProvider.getIcon(user, Avatar.Sizes.BASE), - user.name - ) - }, + presenter = GitLabMergeRequestChoosersUtil.getUserPresenter(vm.avatarIconsProvider), popupConfig = PopupConfig(errorPresenter = ErrorStatusPresenter.simple( GitLabBundle.message("merge.request.list.filter.error"), descriptionProvider = { null }, @@ -146,15 +141,4 @@ internal class GitLabFiltersPanelFactory( MergeRequestStateFilterValue.CLOSED -> GitLabBundle.message("merge.request.list.filter.state.closed") } } -} - -private fun Flow>>.mapResultList(mapper: (T) -> R): Flow>> { - val flow = this - return flow.map { result: Result> -> - result.map { list: List -> - list.map { item: T -> - mapper(item) - } - } - } } \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabMergeRequestsFiltersViewModel.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabMergeRequestsFiltersViewModel.kt index c835c0fa050e..fbb49f882e5f 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabMergeRequestsFiltersViewModel.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/filters/GitLabMergeRequestsFiltersViewModel.kt @@ -13,8 +13,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.drop import org.jetbrains.annotations.ApiStatus -import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelDTO import org.jetbrains.plugins.gitlab.api.dto.GitLabUserDTO +import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabLabel import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabProject import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestStateFilterValue import org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue @@ -33,7 +33,7 @@ interface GitLabMergeRequestsFiltersViewModel : ReviewListSearchPanelViewModel val mergeRequestMembers: Flow>> - val labels: Flow>> + val labels: Flow>> fun reloadData() } @@ -87,7 +87,7 @@ internal class GitLabMergeRequestsFiltersViewModelImpl( override val mergeRequestMembers: Flow>> = GitLabCoroutineUtil.batchesResultsFlow(projectData.dataReloadSignal, projectData::getMembersBatches) - override val labels: Flow>> = + override val labels: Flow>> = GitLabCoroutineUtil.batchesResultsFlow(projectData.dataReloadSignal, projectData::getLabelsBatches) override fun reloadData() { diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/util/GitLabMergeRequestChoosersUtil.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/util/GitLabMergeRequestChoosersUtil.kt index b1bc936dfc50..fc5a0a22f263 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/util/GitLabMergeRequestChoosersUtil.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/util/GitLabMergeRequestChoosersUtil.kt @@ -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.mergerequest.util +import com.intellij.collaboration.ui.CollaborationToolsUIUtil import com.intellij.collaboration.ui.codereview.avatar.Avatar import com.intellij.collaboration.ui.codereview.list.search.ChooserPopupUtil import com.intellij.collaboration.ui.codereview.list.search.PopupConfig @@ -9,8 +10,10 @@ import com.intellij.collaboration.ui.icon.IconsProvider import com.intellij.collaboration.ui.util.popup.PopupItemPresentation import com.intellij.collaboration.util.IncrementallyComputedValue import com.intellij.ui.awt.RelativePoint +import com.intellij.util.ui.ColorIcon import kotlinx.coroutines.flow.StateFlow import org.jetbrains.plugins.gitlab.api.dto.GitLabUserDTO +import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabLabel internal object GitLabMergeRequestChoosersUtil { suspend fun chooseUser( @@ -22,13 +25,7 @@ internal object GitLabMergeRequestChoosersUtil { ChooserPopupUtil.showChooserPopupWithIncrementalLoading( point, users, - presenter = { reviewer -> - PopupItemPresentation.Simple( - reviewer.username, - avatarIconsProvider.getIcon(reviewer, Avatar.Sizes.BASE), - reviewer.name, - ) - }, + getUserPresenter(avatarIconsProvider), PopupConfig.DEFAULT.copy(showDirection = showDirection) ) @@ -43,13 +40,30 @@ internal object GitLabMergeRequestChoosersUtil { point, choseUsers, users, - presenter = { reviewer -> - PopupItemPresentation.Simple( - reviewer.username, - avatarIconsProvider.getIcon(reviewer, Avatar.Sizes.BASE), - reviewer.name, - ) - }, + getUserPresenter(avatarIconsProvider), PopupConfig.DEFAULT.copy(showDirection = showDirection) ) + + fun getUserPresenter(avatarIconsProvider: IconsProvider): (GitLabUserDTO) -> PopupItemPresentation { + return { + PopupItemPresentation.Simple( + it.username, + avatarIconsProvider.getIcon(it, Avatar.Sizes.BASE), + it.name, + ) + } + } + + fun getLabelPresenter(): (GitLabLabel) -> PopupItemPresentation { + return { + val icon = runCatching { + val color = CollaborationToolsUIUtil.getLabelBackground(it.colorHex) + ColorIcon(16, color) + } + PopupItemPresentation.Simple( + it.title, + icon.getOrNull(), + ) + } + } } \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/testApi/org/jetbrains/plugins/gitlab/apitests/GitLabApiTestCase.kt b/plugins/gitlab/gitlab-core/testApi/org/jetbrains/plugins/gitlab/apitests/GitLabApiTestCase.kt index cdd309e66630..2de34266d225 100644 --- a/plugins/gitlab/gitlab-core/testApi/org/jetbrains/plugins/gitlab/apitests/GitLabApiTestCase.kt +++ b/plugins/gitlab/gitlab-core/testApi/org/jetbrains/plugins/gitlab/apitests/GitLabApiTestCase.kt @@ -14,7 +14,7 @@ import org.jetbrains.plugins.gitlab.api.GitLabServerMetadata import org.jetbrains.plugins.gitlab.api.GitLabServerPath import org.jetbrains.plugins.gitlab.api.GitLabVersion import org.jetbrains.plugins.gitlab.api.dto.GitLabGraphQLMutationResultDTO -import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelDTO +import org.jetbrains.plugins.gitlab.api.dto.GitLabLabelGQLDTO import org.jetbrains.plugins.gitlab.apitests.GitLabApiTestCase.Companion.IDEA_TEST_GITLAB_API_DATA_PATH import org.jetbrains.plugins.gitlab.apitests.GitLabApiTestCase.Companion.IDEA_TEST_GITLAB_API_EDITION import org.jetbrains.plugins.gitlab.apitests.GitLabApiTestCase.Companion.IDEA_TEST_GITLAB_API_TOKEN @@ -61,13 +61,13 @@ abstract class GitLabApiTestCase { class GitLabDataConstants { val rootUsername = "root" - val testsGroupLabel1 = GitLabLabelDTO("grouplabel1") - val testsGroupLabel2 = GitLabLabelDTO("grouplabel2") + val testsGroupLabel1 = GitLabLabelGQLDTO("grouplabel1", "#FFFFFF") + val testsGroupLabel2 = GitLabLabelGQLDTO("grouplabel2", "#FFFFFF") val glTests2Project = GitLabProjectPath("tests", "gl-tests-2") val glTests2Coordinates = GitLabProjectCoordinates(server, glTests2Project) - val glTests2Label1 = GitLabLabelDTO("label1") - val glTests2Label2 = GitLabLabelDTO("label2") + val glTests2Label1 = GitLabLabelGQLDTO("label1", "#FFFFFF") + val glTests2Label2 = GitLabLabelGQLDTO("label2", "#FFFFFF") val glTest1Project = GitLabProjectPath("root", "gl-test-1") val glTest1Coordinates = GitLabProjectCoordinates(server, glTest1Project)