diff --git a/app/graphql/resolvers/board_list_issues_resolver.rb b/app/graphql/resolvers/board_list_issues_resolver.rb index 29e66a59a1564a6f16bf08642ed8ce6ca9db5a34..dac93b91469cef1cfeba7dd711e35cdc6e9b76f8 100644 --- a/app/graphql/resolvers/board_list_issues_resolver.rb +++ b/app/graphql/resolvers/board_list_issues_resolver.rb @@ -2,7 +2,7 @@ module Resolvers class BoardListIssuesResolver < BaseResolver - include BoardIssueFilterable + include BoardItemFilterable argument :filters, Types::Boards::BoardIssueInputType, required: false, @@ -13,7 +13,7 @@ class BoardListIssuesResolver < BaseResolver alias_method :list, :object def resolve(**args) - filter_params = issue_filters(args[:filters]).merge(board_id: list.board.id, id: list.id) + filter_params = item_filters(args[:filters]).merge(board_id: list.board.id, id: list.id) service = ::Boards::Issues::ListService.new(list.board.resource_parent, context[:current_user], filter_params) offset_pagination(service.execute) diff --git a/app/graphql/resolvers/board_lists_resolver.rb b/app/graphql/resolvers/board_lists_resolver.rb index 0b69900662661cfb73c86e2809a9443eeee59497..4dae3b4a9d1737ab7cdf4e0f10f82563a59ce3f4 100644 --- a/app/graphql/resolvers/board_lists_resolver.rb +++ b/app/graphql/resolvers/board_lists_resolver.rb @@ -2,7 +2,7 @@ module Resolvers class BoardListsResolver < BaseResolver - include BoardIssueFilterable + include BoardItemFilterable include Gitlab::Graphql::Authorize::AuthorizeResource include LooksAhead @@ -22,7 +22,7 @@ class BoardListsResolver < BaseResolver def resolve_with_lookahead(id: nil, issue_filters: {}) lists = board_lists(id) - context.scoped_set!(:issue_filters, issue_filters(issue_filters)) + context.scoped_set!(:issue_filters, item_filters(issue_filters)) List.preload_preferences_for_user(lists, current_user) if load_preferences? diff --git a/app/graphql/resolvers/concerns/board_issue_filterable.rb b/app/graphql/resolvers/concerns/board_item_filterable.rb similarity index 83% rename from app/graphql/resolvers/concerns/board_issue_filterable.rb rename to app/graphql/resolvers/concerns/board_item_filterable.rb index 88de69a3844dc3204313f46e944b69278ad8a68b..1457a02e44f53deb999917005daa6f96184c057e 100644 --- a/app/graphql/resolvers/concerns/board_issue_filterable.rb +++ b/app/graphql/resolvers/concerns/board_item_filterable.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true -module BoardIssueFilterable +module BoardItemFilterable extend ActiveSupport::Concern private - def issue_filters(args) + def item_filters(args) filters = args.to_h set_filter_values(filters) @@ -32,4 +32,4 @@ def filter_by_assignee(filters) end end -::BoardIssueFilterable.prepend_mod_with('Resolvers::BoardIssueFilterable') +::BoardItemFilterable.prepend_mod_with('Resolvers::BoardItemFilterable') diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 6fab96fe9ba4eb0c881ce0cc54779bc907d68526..724446912aa2885364a5ebc90e5a5f7b0a3dbfa8 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -8570,6 +8570,7 @@ four standard [pagination arguments](#connection-pagination-arguments): | Name | Type | Description | | ---- | ---- | ----------- | +| <a id="epicboardlistsepicfilters"></a>`epicFilters` | [`EpicFilters`](#epicfilters) | Filters applied when getting epic metadata in the epic board list. | | <a id="epicboardlistsid"></a>`id` | [`BoardsEpicListID`](#boardsepiclistid) | Find an epic board list by ID. | ### `EpicDescendantCount` diff --git a/ee/app/graphql/ee/resolvers/board_issue_filterable.rb b/ee/app/graphql/ee/resolvers/board_item_filterable.rb similarity index 97% rename from ee/app/graphql/ee/resolvers/board_issue_filterable.rb rename to ee/app/graphql/ee/resolvers/board_item_filterable.rb index eefb6edf55cb70f69e8c216b6ae9113227a2c226..81fc01c5a1b3de1ba5c241259289b41df3b96b4b 100644 --- a/ee/app/graphql/ee/resolvers/board_issue_filterable.rb +++ b/ee/app/graphql/ee/resolvers/board_item_filterable.rb @@ -2,7 +2,7 @@ module EE module Resolvers - module BoardIssueFilterable + module BoardItemFilterable extend ActiveSupport::Concern extend ::Gitlab::Utils::Override diff --git a/ee/app/graphql/resolvers/board_groupings/epics_resolver.rb b/ee/app/graphql/resolvers/board_groupings/epics_resolver.rb index fe8a23d2418b37b8abe1dc658b7986121434552a..60509c26b349c15fcff80ecdfe06aa52a927e06e 100644 --- a/ee/app/graphql/resolvers/board_groupings/epics_resolver.rb +++ b/ee/app/graphql/resolvers/board_groupings/epics_resolver.rb @@ -3,7 +3,7 @@ module Resolvers module BoardGroupings class EpicsResolver < BaseResolver - include ::BoardIssueFilterable + include ::BoardItemFilterable alias_method :board, :object @@ -25,7 +25,7 @@ def resolve(**args) private def board_epic_ids(issue_params) - params = issue_filters(issue_params).merge(all_lists: true, board_id: board.id) + params = item_filters(issue_params).merge(all_lists: true, board_id: board.id) list_service = ::Boards::Issues::ListService.new( board.resource_parent, diff --git a/ee/app/graphql/resolvers/boards/epic_lists_resolver.rb b/ee/app/graphql/resolvers/boards/epic_lists_resolver.rb index e8f3d68f7adcf66f6ac92c4ca3b2d21c3816ce1f..e270dab82ec9abc80c94bbfc78754e4547d1836d 100644 --- a/ee/app/graphql/resolvers/boards/epic_lists_resolver.rb +++ b/ee/app/graphql/resolvers/boards/epic_lists_resolver.rb @@ -5,6 +5,7 @@ module Boards class EpicListsResolver < BaseResolver include Gitlab::Graphql::Authorize::AuthorizeResource include LooksAhead + include ::BoardItemFilterable type Types::Boards::EpicListType.connection_type, null: true @@ -12,12 +13,17 @@ class EpicListsResolver < BaseResolver required: false, description: 'Find an epic board list by ID.' + argument :epic_filters, Types::Boards::BoardEpicInputType, + required: false, + description: 'Filters applied when getting epic metadata in the epic board list.' + alias_method :epic_board, :object - def resolve_with_lookahead(id: nil) + def resolve_with_lookahead(id: nil, epic_filters: {}) authorize! lists = board_lists(id) + context.scoped_set!(:epic_filters, item_filters(epic_filters)) if load_preferences?(lookahead) ::Boards::EpicList.preload_preferences_for_user(lists, current_user) diff --git a/ee/app/graphql/types/boards/epic_list_type.rb b/ee/app/graphql/types/boards/epic_list_type.rb index d9c21415af45b2c604c44d92159da6894d259f81..1909c8e52d9558b68cd8583d590b6213a6ea9a82 100644 --- a/ee/app/graphql/types/boards/epic_list_type.rb +++ b/ee/app/graphql/types/boards/epic_list_type.rb @@ -48,8 +48,10 @@ def epics_count def metadata strong_memoize(:metadata) do + params = (context[:epic_filters] || {}).merge(board_id: list.epic_board_id, id: list.id) + ::Boards::Epics::ListService - .new(list.epic_board.resource_parent, current_user, { board_id: list.epic_board_id, id: list.id }) + .new(list.epic_board.resource_parent, current_user, params) .metadata end end diff --git a/ee/spec/requests/api/graphql/boards/epic_lists_query_spec.rb b/ee/spec/requests/api/graphql/boards/epic_lists_query_spec.rb index 47e6ccdde8b4ff5aac2e4e82e524d8696a6300fd..1ba8a875cfb3bdb6bb1b2fd1aa5dcd61195ed86a 100644 --- a/ee/spec/requests/api/graphql/boards/epic_lists_query_spec.rb +++ b/ee/spec/requests/api/graphql/boards/epic_lists_query_spec.rb @@ -80,11 +80,17 @@ def pagination_results_data(nodes) end it 'returns the correct values for count' do - create_list(:epic, 2, group: group) # epics in backlog, the list which is returned first + label = create(:group_label, group: group) + # Epics in backlog, the list which is returned first. The first epic + # should be ignored because it doesn't have the label by which we are + # filtering. + create(:labeled_epic, group: group) + create(:labeled_epic, group: group, labels: [label]) - post_graphql(pagination_query, current_user: current_user) + params = { epicFilters: { labelName: label.title } } + post_graphql(pagination_query(params), current_user: current_user) - assert_field_value('epicsCount', [2, 0, 0]) + assert_field_value('epicsCount', [1, 0, 0]) end end end