summaryrefslogtreecommitdiff
path: root/app/helpers/members_helper.rb
blob: f1f5f941edd309dddc852f95e500049d89809cca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# frozen_string_literal: true

module MembersHelper
  def remove_member_message(member, user: nil)
    user = current_user if defined?(current_user)
    text = 'Are you sure you want to'

    action =
      if member.invite?
        "revoke the invitation for #{member.invite_email} to join"
      elsif member.request?
        if member.user == user
          'withdraw your access request for'
        else
          "deny #{member.user.name}'s request to join"
        end
      else
        if member.user
          "remove #{member.user.name} from"
        else
          e = RuntimeError.new("Data integrity error: no associated user for member ID #{member.id}")
          Gitlab::ErrorTracking.track_exception(e,
            member_id: member.id,
            invite_email: member.invite_email,
            invite_accepted_at: member.invite_accepted_at,
            source_id: member.source_id,
            source_type: member.source_type)
          "remove this orphaned member from"
        end
      end

    "#{text} #{action} the #{member.source.human_name} #{source_text(member)}?"
  end

  def remove_member_title(member)
    action = member.request? ? 'Deny access request' : 'Remove user'

    "#{action} from #{source_text(member)}"
  end

  def leave_confirmation_message(member_source)
    "Are you sure you want to leave the " \
    "\"#{member_source.human_name}\" #{member_source.class.to_s.humanize(capitalize: false)}?"
  end

  def filter_group_project_member_path(options = {})
    options = params.slice(:search, :sort).merge(options).permit!
    "#{request.path}?#{options.to_param}"
  end

  def member_path(member)
    if member.is_a?(GroupMember)
      group_group_member_path(member.source, member)
    else
      project_project_member_path(member.source, member)
    end
  end

  def localized_tasks_to_be_done_choices
    {
      code: s_('TasksToBeDone|Create/import code into a project (repository)'),
      ci: s_('TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor code'),
      issues: s_('TasksToBeDone|Create/import issues (tickets) to collaborate on ideas and plan work')
    }.freeze
  end

  private

  def source_text(member)
    type = member.real_source_type.humanize(capitalize: false)

    return type if member.request? || member.invite? || type != 'group'

    'group and any subresources'
  end

  def members_pagination_data(members, pagination = {})
    {
      current_page: members.respond_to?(:current_page) ? members.current_page : nil,
      per_page: members.respond_to?(:limit_value) ? members.limit_value : nil,
      total_items: members.respond_to?(:total_count) ? members.total_count : members.count,
      param_name: pagination[:param_name] || nil,
      params: pagination[:params] || {}
    }
  end

  def member_request_access_link(member)
    user = member.user
    member_source = member.source

    member_link = link_to user.name, user, class: :highlight
    member_role = content_tag :span, member.human_access, class: :highlight
    target_source_link = link_to member_source.human_name, polymorphic_url([member_source, :members]), class: :highlight
    target_type = member_source.model_name.singular

    s_('Notify|%{member_link} requested %{member_role} access to the %{target_source_link} %{target_type}.')
      .html_safe % {
        member_link: member_link,
        member_role: member_role,
        target_source_link: target_source_link,
        target_type: target_type
      }
  end
end

MembersHelper.prepend_mod_with('MembersHelper')