951a5cca62
Signed-off-by: Rémy Coutable <remy@rymai.me>
148 lines
4 KiB
Ruby
148 lines
4 KiB
Ruby
module IssuableCollections
|
|
extend ActiveSupport::Concern
|
|
include SortingHelper
|
|
include Gitlab::IssuableMetadata
|
|
|
|
included do
|
|
helper_method :issues_finder
|
|
helper_method :merge_requests_finder
|
|
end
|
|
|
|
private
|
|
|
|
def set_issues_index
|
|
@collection_type = "Issue"
|
|
@issues = issues_collection
|
|
@issues = @issues.page(params[:page])
|
|
@issuable_meta_data = issuable_meta_data(@issues, @collection_type)
|
|
@total_pages = issues_page_count(@issues)
|
|
|
|
return if redirect_out_of_range(@issues, @total_pages)
|
|
|
|
if params[:label_name].present?
|
|
@labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute
|
|
end
|
|
|
|
@users = []
|
|
end
|
|
|
|
def issues_collection
|
|
issues_finder.execute.preload(:project, :author, :assignees, :labels, :milestone, project: :namespace)
|
|
end
|
|
|
|
def merge_requests_collection
|
|
merge_requests_finder.execute.preload(
|
|
:source_project,
|
|
:target_project,
|
|
:author,
|
|
:assignee,
|
|
:labels,
|
|
:milestone,
|
|
head_pipeline: :project,
|
|
target_project: :namespace,
|
|
merge_request_diff: :merge_request_diff_commits
|
|
)
|
|
end
|
|
|
|
def issues_finder
|
|
@issues_finder ||= issuable_finder_for(IssuesFinder)
|
|
end
|
|
|
|
def merge_requests_finder
|
|
@merge_requests_finder ||= issuable_finder_for(MergeRequestsFinder)
|
|
end
|
|
|
|
def redirect_out_of_range(relation, total_pages)
|
|
return false if total_pages.zero?
|
|
|
|
out_of_range = relation.current_page > total_pages
|
|
|
|
if out_of_range
|
|
redirect_to(url_for(params.merge(page: total_pages, only_path: true)))
|
|
end
|
|
|
|
out_of_range
|
|
end
|
|
|
|
def issues_page_count(relation)
|
|
page_count_for_relation(relation, issues_finder.row_count)
|
|
end
|
|
|
|
def merge_requests_page_count(relation)
|
|
page_count_for_relation(relation, merge_requests_finder.row_count)
|
|
end
|
|
|
|
def page_count_for_relation(relation, row_count)
|
|
limit = relation.limit_value.to_f
|
|
|
|
return 1 if limit.zero?
|
|
|
|
(row_count.to_f / limit).ceil
|
|
end
|
|
|
|
def issuable_finder_for(finder_class)
|
|
finder_class.new(current_user, filter_params)
|
|
end
|
|
|
|
def filter_params
|
|
set_sort_order_from_cookie
|
|
set_default_state
|
|
|
|
# Skip irrelevant Rails routing params
|
|
@filter_params = params.dup.except(:controller, :action, :namespace_id)
|
|
@filter_params[:sort] ||= default_sort_order
|
|
|
|
@sort = @filter_params[:sort]
|
|
|
|
if @project
|
|
@filter_params[:project_id] = @project.id
|
|
elsif @group
|
|
@filter_params[:group_id] = @group.id
|
|
else
|
|
# TODO: this filter ignore issues/mr created in public or
|
|
# internal repos where you are not a member. Enable this filter
|
|
# or improve current implementation to filter only issues you
|
|
# created or assigned or mentioned
|
|
# @filter_params[:authorized_only] = true
|
|
end
|
|
|
|
@filter_params.permit(IssuableFinder::VALID_PARAMS)
|
|
end
|
|
|
|
def set_default_state
|
|
params[:state] = 'opened' if params[:state].blank?
|
|
end
|
|
|
|
def set_sort_order_from_cookie
|
|
key = 'issuable_sort'
|
|
|
|
cookies[key] = params[:sort] if params[:sort].present?
|
|
cookies[key] = update_cookie_value(cookies[key])
|
|
params[:sort] = cookies[key]
|
|
end
|
|
|
|
def default_sort_order
|
|
case params[:state]
|
|
when 'opened', 'all' then sort_value_created_date
|
|
when 'merged', 'closed' then sort_value_recently_updated
|
|
else sort_value_created_date
|
|
end
|
|
end
|
|
|
|
# Update old values to the actual ones.
|
|
def update_cookie_value(value)
|
|
case value
|
|
when 'id_asc' then sort_value_oldest_created
|
|
when 'id_desc' then sort_value_recently_created
|
|
when 'created_asc' then sort_value_created_date
|
|
when 'created_desc' then sort_value_created_date
|
|
when 'due_date_asc' then sort_value_due_date
|
|
when 'due_date_desc' then sort_value_due_date
|
|
when 'milestone_due_asc' then sort_value_milestone
|
|
when 'milestone_due_desc' then sort_value_milestone
|
|
when 'downvotes_asc' then sort_value_popularity
|
|
when 'downvotes_desc' then sort_value_popularity
|
|
else value
|
|
end
|
|
end
|
|
end
|