Module: IssuesHelper
- Includes:
- Issues::IssueTypeHelpers
- Included in:
- Types::Namespaces::AvailableFeaturesType, WorkItemsHelper
- Defined in:
- app/helpers/issues_helper.rb
Instance Method Summary collapse
- #award_emoji_issue_api_path(issue) ⇒ Object
- #award_state_class(awardable, awards, current_user) ⇒ Object
- #award_user_list(awards, current_user, limit: 10) ⇒ Object
- #awards_sort(awards) ⇒ Object
- #can_admin_issue? ⇒ Boolean
- #can_create_confidential_merge_request? ⇒ Boolean
- #common_issues_list_data(namespace, current_user) ⇒ Object
- #confidential_icon(issue) ⇒ Object
- #dashboard_issues_list_data(current_user) ⇒ Object
- #has_issue_date_filter_feature?(namespace, current_user) ⇒ Boolean
- #has_subepics_feature?(namespace) ⇒ Boolean
- #issue_header_actions_data(project, issuable, current_user, issuable_sidebar) ⇒ Object
- #issue_hidden?(issue) ⇒ Boolean
- #issue_repositioning_disabled? ⇒ Boolean
- #link_to_discussions_to_resolve(merge_request, single_discussion = nil) ⇒ Object
- #project_issues_list_data(project, current_user) ⇒ Object
-
#scoped_labels_available?(parent) ⇒ Boolean
Overridden in EE.
- #show_moved_service_desk_issue_warning?(issue) ⇒ Boolean
- #show_new_branch_button? ⇒ Boolean
- #show_new_issue_link?(project) ⇒ Boolean
- #show_timeline_view_toggle?(issue) ⇒ Boolean
Methods included from Issues::IssueTypeHelpers
Instance Method Details
#award_emoji_issue_api_path(issue) ⇒ Object
224 225 226 |
# File 'app/helpers/issues_helper.rb', line 224 def award_emoji_issue_api_path(issue) api_v4_projects_issues_award_emoji_path(id: issue.project.id, issue_iid: issue.iid) end |
#award_state_class(awardable, awards, current_user) ⇒ Object
44 45 46 47 48 49 50 51 52 |
# File 'app/helpers/issues_helper.rb', line 44 def award_state_class(awardable, awards, current_user) if !can?(current_user, :award_emoji, awardable) "disabled" elsif current_user && awards.find { |a| a.user_id == current_user.id } "selected" else "" end end |
#award_user_list(awards, current_user, limit: 10) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'app/helpers/issues_helper.rb', line 31 def award_user_list(awards, current_user, limit: 10) names = awards.map do |award| award.user == current_user ? 'You' : award.user.name end current_user_name = names.delete('You') names = names.insert(0, current_user_name).compact.first(limit) names << "#{awards.size - names.size} more." if awards.size > names.size names.to_sentence end |
#awards_sort(awards) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'app/helpers/issues_helper.rb', line 54 def awards_sort(awards) awards.sort_by do |award, award_emojis| case award when AwardEmoji::THUMBS_UP 0 when AwardEmoji::THUMBS_DOWN 1 else 2 end end.to_h end |
#can_admin_issue? ⇒ Boolean
6 7 8 |
# File 'app/helpers/issues_helper.rb', line 6 def can_admin_issue? can?(current_user, :admin_issue, @group || @project) end |
#can_create_confidential_merge_request? ⇒ Boolean
96 97 98 99 |
# File 'app/helpers/issues_helper.rb', line 96 def can_create_confidential_merge_request? @issue.confidential? && !@project.private? && can?(current_user, :create_merge_request_in, @project) end |
#common_issues_list_data(namespace, current_user) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'app/helpers/issues_helper.rb', line 135 def common_issues_list_data(namespace, current_user) { autocomplete_award_emojis_path: autocomplete_award_emojis_path, calendar_path: url_for(safe_params.merge()), full_path: namespace.full_path, has_issue_date_filter_feature: has_issue_date_filter_feature?(namespace, current_user).to_s, initial_sort: current_user&.user_preference&.issues_sort, is_issue_repositioning_disabled: issue_repositioning_disabled?.to_s, is_public_visibility_restricted: Gitlab::CurrentSettings.restricted_visibility_levels&.include?(Gitlab::VisibilityLevel::PUBLIC).to_s, is_signed_in: current_user.present?.to_s, rss_path: url_for(safe_params.merge()), sign_in_path: new_user_session_path, wi: work_items_data(namespace, current_user), has_subepics_feature: has_subepics_feature?(namespace).to_s } end |
#confidential_icon(issue) ⇒ Object
23 24 25 |
# File 'app/helpers/issues_helper.rb', line 23 def confidential_icon(issue) sprite_icon('eye-slash', css_class: 'gl-align-text-bottom') if issue.confidential? end |
#dashboard_issues_list_data(current_user) ⇒ Object
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'app/helpers/issues_helper.rb', line 201 def dashboard_issues_list_data(current_user) { autocomplete_award_emojis_path: autocomplete_award_emojis_path, autocomplete_users_path: autocomplete_users_path, calendar_path: url_for(safe_params.merge()), dashboard_labels_path: dashboard_labels_path(format: :json, include_ancestor_groups: true), dashboard_milestones_path: dashboard_milestones_path(format: :json), empty_state_with_filter_svg_path: image_path('illustrations/empty-state/empty-issues-md.svg'), empty_state_without_filter_svg_path: image_path('illustrations/empty-state/empty-search-md.svg'), has_issue_date_filter_feature: Feature.enabled?(:issue_date_filter, current_user).to_s, initial_sort: current_user&.user_preference&.issues_sort, is_public_visibility_restricted: Gitlab::CurrentSettings.restricted_visibility_levels&.include?(Gitlab::VisibilityLevel::PUBLIC).to_s, is_signed_in: current_user.present?.to_s, rss_path: url_for(safe_params.merge()) } end |
#has_issue_date_filter_feature?(namespace, current_user) ⇒ Boolean
163 164 165 166 167 168 169 170 171 |
# File 'app/helpers/issues_helper.rb', line 163 def has_issue_date_filter_feature?(namespace, current_user) enabled_for_user = Feature.enabled?(:issue_date_filter, current_user) return true if enabled_for_user enabled_for_group = Feature.enabled?(:issue_date_filter, namespace.group) if namespace.respond_to?(:group) return true if enabled_for_group Feature.enabled?(:issue_date_filter, namespace) end |
#has_subepics_feature?(namespace) ⇒ Boolean
153 154 155 156 157 158 159 160 161 |
# File 'app/helpers/issues_helper.rb', line 153 def has_subepics_feature?(namespace) if namespace.is_a?(Group) return namespace.licensed_feature_available?(:subepics) elsif namespace.respond_to?(:group) && namespace.group return namespace.group.licensed_feature_available?(:subepics) end false end |
#issue_header_actions_data(project, issuable, current_user, issuable_sidebar) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'app/helpers/issues_helper.rb', line 109 def issue_header_actions_data(project, issuable, current_user, ) new_issuable_params = { issue: {}, add_related_issue: issuable.iid } if issuable.work_item_type&.incident? new_issuable_params[:issuable_template] = 'incident' new_issuable_params[:issue][:issue_type] = 'incident' end { can_create_issue: show_new_issue_link?(project).to_s, can_create_incident: create_issue_type_allowed?(project, :incident).to_s, can_destroy_issue: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable).to_s, can_reopen_issue: can?(current_user, :reopen_issue, issuable).to_s, can_report_spam: issuable.submittable_as_spam_by?(current_user).to_s, can_update_issue: can?(current_user, :update_issue, issuable).to_s, is_issue_author: (issuable. == current_user).to_s, issue_path: issuable_path(issuable), new_issue_path: new_project_issue_path(project, new_issuable_params), project_path: project.full_path, report_abuse_path: add_category_abuse_reports_path, reported_user_id: issuable..id, reported_from_url: issue_url(issuable), submit_as_spam_path: mark_as_spam_project_issue_path(project, issuable), issuable_email_address: .nil? ? '' : [:create_note_email] } end |
#issue_hidden?(issue) ⇒ Boolean
27 28 29 |
# File 'app/helpers/issues_helper.rb', line 27 def issue_hidden?(issue) issue.hidden? end |
#issue_repositioning_disabled? ⇒ Boolean
15 16 17 18 19 20 21 |
# File 'app/helpers/issues_helper.rb', line 15 def issue_repositioning_disabled? if @group @group.root_ancestor.issue_repositioning_disabled? elsif @project @project.root_namespace.issue_repositioning_disabled? end end |
#link_to_discussions_to_resolve(merge_request, single_discussion = nil) ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'app/helpers/issues_helper.rb', line 67 def link_to_discussions_to_resolve(merge_request, single_discussion = nil) link_text = [merge_request.to_reference] link_text << "(discussion #{single_discussion.first_note.id})" if single_discussion path = if single_discussion Gitlab::UrlBuilder.build(single_discussion.first_note) else project = merge_request.project project_merge_request_path(project, merge_request) end link_to link_text.join(' '), path end |
#project_issues_list_data(project, current_user) ⇒ Object
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'app/helpers/issues_helper.rb', line 173 def project_issues_list_data(project, current_user) common_issues_list_data(project, current_user).merge( can_bulk_update: can?(current_user, :admin_issue, project).to_s, can_create_issue: can?(current_user, :create_issue, project).to_s, can_edit: can?(current_user, :admin_project, project).to_s, can_import_issues: can?(current_user, :import_issues, @project).to_s, can_read_crm_contact: can?(current_user, :read_crm_contact, project.crm_group).to_s, can_read_crm_organization: can?(current_user, :read_crm_organization, project.crm_group).to_s, email: current_user&.notification_email_or_default, emails_help_page_path: help_page_path('development/emails.md', anchor: 'email-namespace'), export_csv_path: export_csv_project_issues_path(project), has_any_issues: project_issues(project).exists?.to_s, import_csv_issues_path: import_csv_namespace_project_issues_path, initial_email: project.new_issuable_address(current_user, 'issue'), is_project: true.to_s, markdown_help_path: help_page_path('user/markdown.md'), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings..megabytes), new_issue_path: new_project_issue_path(project), project_import_jira_path: project_import_jira_path(project), quick_actions_help_path: help_page_path('user/project/quick_actions.md'), releases_path: project_releases_path(project, format: :json), reset_path: new_issuable_address_project_path(project, issuable_type: 'issue'), project_namespace_full_path: project.namespace.full_path, show_new_issue_link: show_new_issue_link?(project).to_s, time_tracking_limit_to_hours: Gitlab::CurrentSettings.time_tracking_limit_to_hours.to_s ) end |
#scoped_labels_available?(parent) ⇒ Boolean
Overridden in EE
220 221 222 |
# File 'app/helpers/issues_helper.rb', line 220 def scoped_labels_available?(parent) false end |
#show_moved_service_desk_issue_warning?(issue) ⇒ Boolean
101 102 103 104 105 106 107 |
# File 'app/helpers/issues_helper.rb', line 101 def show_moved_service_desk_issue_warning?(issue) return false unless issue.moved_from return false unless issue.from_service_desk? ::ServiceDesk.enabled?(issue.moved_from.project) && !::ServiceDesk.enabled?(issue.project) end |
#show_new_branch_button? ⇒ Boolean
92 93 94 |
# File 'app/helpers/issues_helper.rb', line 92 def can_create_confidential_merge_request? || !@issue.confidential? end |
#show_new_issue_link?(project) ⇒ Boolean
81 82 83 84 85 86 87 88 89 90 |
# File 'app/helpers/issues_helper.rb', line 81 def show_new_issue_link?(project) return false unless project return false if project.self_or_ancestors_archived? # We want to show the link to users that are not signed in, that way they # get directed to the sign-in/sign-up flow and afterwards to the new issue page. return true unless current_user can?(current_user, :create_issue, project) end |
#show_timeline_view_toggle?(issue) ⇒ Boolean
10 11 12 13 |
# File 'app/helpers/issues_helper.rb', line 10 def show_timeline_view_toggle?(issue) # Overridden in EE false end |