2018-08-18 11:19:57 +00:00
# frozen_string_literal: true
2016-02-15 14:19:23 +00:00
module IssuablesHelper
2017-03-09 00:14:16 +00:00
include GitlabRoutingHelper
2021-02-08 18:09:49 +00:00
include IssuablesDescriptionTemplatesHelper
2021-09-01 15:10:20 +00:00
include :: Sidebars :: Concerns :: HasPill
2017-03-09 00:14:16 +00:00
2016-02-15 14:19:23 +00:00
def sidebar_gutter_toggle_icon
2020-10-03 03:08:48 +00:00
content_tag ( :span , class : 'js-sidebar-toggle-container' , data : { is_expanded : ! sidebar_gutter_collapsed? } ) do
sprite_icon ( 'chevron-double-lg-left' , css_class : " js-sidebar-expand #{ 'hidden' unless sidebar_gutter_collapsed? } " ) +
sprite_icon ( 'chevron-double-lg-right' , css_class : " js-sidebar-collapse #{ 'hidden' if sidebar_gutter_collapsed? } " )
end
2016-02-15 14:19:23 +00:00
end
def sidebar_gutter_collapsed_class
2022-05-16 21:09:09 +00:00
return " right-sidebar-expanded " if moved_mr_sidebar_enabled?
2016-02-15 14:19:23 +00:00
" right-sidebar- #{ sidebar_gutter_collapsed? ? 'collapsed' : 'expanded' } "
end
2018-04-19 14:43:20 +00:00
def sidebar_gutter_tooltip_text
sidebar_gutter_collapsed? ? _ ( 'Expand sidebar' ) : _ ( 'Collapse sidebar' )
end
2019-04-07 18:35:16 +00:00
def assignees_label ( issuable , include_value : true )
2021-03-19 06:09:30 +00:00
assignees = issuable . assignees
2019-04-07 18:35:16 +00:00
if include_value
sanitized_list = sanitize_name ( issuable . assignee_list )
2021-03-19 06:09:30 +00:00
ns_ ( 'NotificationEmail|Assignee: %{users}' , 'NotificationEmail|Assignees: %{users}' , assignees . count ) % { users : sanitized_list }
2018-04-19 14:43:20 +00:00
else
2021-03-19 06:09:30 +00:00
ns_ ( 'NotificationEmail|Assignee' , 'NotificationEmail|Assignees' , assignees . count )
2018-04-19 14:43:20 +00:00
end
end
2018-11-27 16:53:16 +00:00
def sidebar_milestone_tooltip_label ( milestone )
2018-11-30 04:03:35 +00:00
return _ ( 'Milestone' ) unless milestone . present?
2020-08-05 21:09:40 +00:00
[ escape_once ( milestone [ :title ] ) , sidebar_milestone_remaining_days ( milestone ) || _ ( 'Milestone' ) ] . join ( '<br/>' )
2018-04-19 14:43:20 +00:00
end
2018-11-27 16:53:16 +00:00
def sidebar_milestone_remaining_days ( milestone )
2018-11-30 04:03:35 +00:00
due_date_with_remaining_days ( milestone [ :due_date ] , milestone [ :start_date ] )
2018-11-27 16:53:16 +00:00
end
def sidebar_due_date_tooltip_label ( due_date )
2018-11-30 04:03:35 +00:00
[ _ ( 'Due date' ) , due_date_with_remaining_days ( due_date ) ] . compact . join ( '<br/>' )
2018-11-27 16:53:16 +00:00
end
2018-11-30 04:03:35 +00:00
def due_date_with_remaining_days ( due_date , start_date = nil )
return unless due_date
" #{ due_date . to_s ( :medium ) } ( #{ remaining_days_in_words ( due_date , start_date ) } ) "
2018-11-27 16:53:16 +00:00
end
2016-07-19 09:26:49 +00:00
def multi_label_name ( current_labels , default_label )
2018-11-30 04:03:35 +00:00
return default_label if current_labels . blank?
2018-11-27 16:53:16 +00:00
2018-11-30 04:03:35 +00:00
title = current_labels . first . try ( :title ) || current_labels . first [ :title ]
if current_labels . size > 1
" #{ title } + #{ current_labels . size - 1 } more "
2016-04-19 16:22:55 +00:00
else
2018-11-30 04:03:35 +00:00
title
2016-04-07 18:57:21 +00:00
end
end
2019-06-20 22:18:51 +00:00
def serialize_issuable ( issuable , opts = { } )
2017-10-31 16:15:03 +00:00
serializer_klass = case issuable
when Issue
IssueSerializer
when MergeRequest
MergeRequestSerializer
end
2022-11-09 15:07:50 +00:00
serializer_klass
2017-10-31 16:15:03 +00:00
. new ( current_user : current_user , project : issuable . project )
2022-11-09 15:07:50 +00:00
. represent ( issuable , opts )
. to_json
2016-12-23 05:44:02 +00:00
end
2017-05-04 12:11:15 +00:00
def users_dropdown_label ( selected_users )
2017-05-08 14:58:42 +00:00
case selected_users . length
when 0
2021-12-03 09:10:57 +00:00
_ ( 'Unassigned' )
2017-05-08 14:58:42 +00:00
when 1
2017-05-04 12:11:15 +00:00
selected_users [ 0 ] . name
else
" #{ selected_users [ 0 ] . name } + #{ selected_users . length - 1 } more "
end
end
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2016-03-15 17:17:05 +00:00
def user_dropdown_label ( user_id , default_label )
2016-04-19 14:58:20 +00:00
return default_label if user_id . nil?
2016-03-15 17:17:05 +00:00
return " Unassigned " if user_id == " 0 "
2016-04-19 14:58:20 +00:00
user = User . find_by ( id : user_id )
2016-03-15 17:17:05 +00:00
if user
user . name
else
default_label
end
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2016-03-15 17:17:05 +00:00
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2016-08-27 22:45:01 +00:00
def project_dropdown_label ( project_id , default_label )
return default_label if project_id . nil?
return " Any project " if project_id == " 0 "
project = Project . find_by ( id : project_id )
if project
2018-03-05 14:15:26 +00:00
project . full_name
2016-08-27 22:45:01 +00:00
else
default_label
end
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2016-08-27 22:45:01 +00:00
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2018-07-16 13:35:19 +00:00
def group_dropdown_label ( group_id , default_label )
return default_label if group_id . nil?
return " Any group " if group_id == " 0 "
group = :: Group . find_by ( id : group_id )
if group
group . full_name
else
default_label
end
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2018-07-16 13:35:19 +00:00
2021-12-03 09:10:57 +00:00
def milestone_dropdown_label ( milestone_title , default_label = _ ( 'Milestone' ) )
2017-03-10 19:01:05 +00:00
title =
case milestone_title
when Milestone :: Upcoming . name then Milestone :: Upcoming . title
when Milestone :: Started . name then Milestone :: Started . title
else milestone_title . presence
end
2016-03-29 11:19:09 +00:00
2017-03-10 19:01:05 +00:00
h ( title || default_label )
2016-03-24 15:20:35 +00:00
end
2020-12-09 09:09:47 +00:00
def issuable_meta_author_status ( author )
2022-07-26 09:09:02 +00:00
return " " unless author & . status & . customized? && status = user_status ( author )
2020-12-09 09:09:47 +00:00
" #{ status } " . html_safe
end
2020-11-30 15:09:21 +00:00
def issuable_meta ( issuable , project )
2018-08-18 11:19:57 +00:00
output = [ ]
2022-08-15 15:09:53 +00:00
if issuable . respond_to? ( :work_item_type ) && WorkItems :: Type :: WI_TYPES_WITH_CREATED_HEADER . include? ( issuable . work_item_type . base_type )
2022-08-22 15:11:25 +00:00
output << content_tag ( :span , sprite_icon ( " #{ issuable . work_item_type . icon_name } " , css_class : 'gl-icon gl-vertical-align-middle gl-text-gray-500' ) , class : 'gl-mr-2' , aria : { hidden : 'true' } )
2022-10-25 09:10:14 +00:00
output << content_tag ( :span , s_ ( 'IssuableStatus|%{wi_type} created %{created_at} by ' ) . html_safe % { wi_type : issuable . issue_type . capitalize , created_at : time_ago_with_tooltip ( issuable . created_at ) } , class : 'gl-mr-2' )
2022-08-15 15:09:53 +00:00
else
2022-10-25 09:10:14 +00:00
output << content_tag ( :span , s_ ( 'IssuableStatus|Created %{created_at} by' ) . html_safe % { created_at : time_ago_with_tooltip ( issuable . created_at ) } , class : 'gl-mr-2' )
2022-08-15 15:09:53 +00:00
end
2018-08-18 11:19:57 +00:00
2020-11-24 21:09:39 +00:00
if issuable . is_a? ( Issue ) && issuable . service_desk_reply_to
output << " #{ html_escape ( issuable . service_desk_reply_to ) } via "
end
2016-04-01 11:20:54 +00:00
output << content_tag ( :strong ) do
2018-12-08 03:12:23 +00:00
author_output = link_to_member ( project , issuable . author , size : 24 , mobile_classes : " d-none d-sm-inline " )
2019-02-18 01:23:12 +00:00
author_output << link_to_member ( project , issuable . author , size : 24 , by_username : true , avatar : false , mobile_classes : " d-inline d-sm-none " )
2018-07-16 16:18:52 +00:00
2020-04-21 21:09:38 +00:00
author_output << issuable_meta_author_slot ( issuable . author , css_class : 'ml-1' )
2020-12-09 09:09:47 +00:00
author_output << issuable_meta_author_status ( issuable . author )
2018-07-16 16:18:52 +00:00
author_output
2016-04-01 11:20:54 +00:00
end
2016-09-26 21:36:11 +00:00
2020-09-16 15:09:32 +00:00
if access = project . team . human_max_access ( issuable . author_id )
2020-09-24 12:09:37 +00:00
output << content_tag ( :span , access , class : " user-access-role has-tooltip d-none d-xl-inline-block gl-ml-3 " , title : _ ( " This user has the %{access} role in the %{name} project. " ) % { access : access . downcase , name : project . name } )
2020-09-16 15:09:32 +00:00
elsif project . team . contributor? ( issuable . author_id )
output << content_tag ( :span , _ ( " Contributor " ) , class : " user-access-role has-tooltip d-none d-xl-inline-block gl-ml-3 " , title : _ ( " This user has previously committed to the %{name} project. " ) % { name : project . name } )
end
2020-08-10 18:09:54 +00:00
output << content_tag ( :span , ( sprite_icon ( 'first-contribution' , css_class : 'gl-icon gl-vertical-align-middle' ) if issuable . first_contribution? ) , class : 'has-tooltip gl-ml-2' , title : _ ( '1st contribution!' ) )
2017-07-29 15:04:42 +00:00
2020-11-12 18:09:26 +00:00
output << content_tag ( :span , ( issuable . task_status if issuable . tasks? ) , id : " task_status " , class : " d-none d-md-inline-block gl-ml-3 " )
2018-06-07 20:46:14 +00:00
output << content_tag ( :span , ( issuable . task_status_short if issuable . tasks? ) , id : " task_status_short " , class : " d-md-none " )
2016-09-26 21:36:11 +00:00
2018-08-18 11:19:57 +00:00
output . join . html_safe
2016-04-01 11:20:54 +00:00
end
2020-04-21 21:09:38 +00:00
# This is a dummy method, and has an override defined in ee
def issuable_meta_author_slot ( author , css_class : nil )
nil
end
2018-03-23 14:27:15 +00:00
def issuables_state_counter_text ( issuable_type , state , display_count )
2021-12-03 09:10:57 +00:00
titles = {
opened : _ ( " Open " ) ,
closed : _ ( " Closed " ) ,
merged : _ ( " Merged " ) ,
all : _ ( " All " )
}
2016-09-26 17:12:16 +00:00
state_title = titles [ state ] || state . to_s . humanize
html = content_tag ( :span , state_title )
2018-03-23 14:27:15 +00:00
2021-02-02 15:09:06 +00:00
return html . html_safe unless display_count
count = issuables_count_for_state ( issuable_type , state )
if count != - 1
2022-01-24 12:10:54 +00:00
html << " " << gl_badge_tag ( format_count ( issuable_type , count , Gitlab :: IssuablesCountForState :: THRESHOLD ) , { variant : :muted , size : :sm } , { class : " gl-tab-counter-badge gl-display-none gl-sm-display-inline-flex " } )
2018-03-23 14:27:15 +00:00
end
2016-09-26 17:12:16 +00:00
html . html_safe
end
2017-04-19 15:17:46 +00:00
def assigned_issuables_count ( issuable_type )
2017-08-10 16:39:26 +00:00
case issuable_type
when :issues
current_user . assigned_open_issues_count
when :merge_requests
current_user . assigned_open_merge_requests_count
else
raise ArgumentError , " invalid issuable ` #{ issuable_type } ` "
end
2016-11-09 06:59:51 +00:00
end
2017-01-12 12:28:37 +00:00
def issuable_reference ( issuable )
@show_full_reference ? issuable . to_reference ( full : true ) : issuable . to_reference ( @group || @project )
end
2021-06-09 12:10:27 +00:00
def issuable_project_reference ( issuable )
" #{ issuable . project . full_name } #{ issuable . to_reference } "
end
2017-05-15 13:51:40 +00:00
def issuable_initial_data ( issuable )
2017-05-31 13:03:32 +00:00
data = {
2017-11-01 17:35:14 +00:00
endpoint : issuable_path ( issuable ) ,
2017-11-29 09:29:06 +00:00
updateEndpoint : " #{ issuable_path ( issuable ) } .json " ,
2017-11-01 17:35:14 +00:00
canUpdate : can? ( current_user , :" update_ #{ issuable . to_ability_name } " , issuable ) ,
canDestroy : can? ( current_user , :" destroy_ #{ issuable . to_ability_name } " , issuable ) ,
2022-09-06 06:10:18 +00:00
canUpdateTimelineEvent : can? ( current_user , :admin_incident_management_timeline_event , issuable ) ,
2017-05-24 11:25:53 +00:00
issuableRef : issuable . to_reference ,
2022-04-07 18:08:29 +00:00
markdownPreviewPath : preview_markdown_path ( parent , target_type : issuable . model_name , target_id : issuable . iid ) ,
2017-08-17 17:25:56 +00:00
markdownDocsPath : help_page_path ( 'user/markdown' ) ,
2018-12-21 00:19:17 +00:00
lockVersion : issuable . lock_version ,
2022-05-18 00:08:34 +00:00
state : issuable . state ,
2019-09-18 14:02:45 +00:00
issuableTemplateNamesPath : template_names_path ( parent , issuable ) ,
2017-05-24 11:25:53 +00:00
initialTitleHtml : markdown_field ( issuable , :title ) ,
initialTitleText : issuable . title ,
initialDescriptionHtml : markdown_field ( issuable , :description ) ,
2017-06-20 09:56:18 +00:00
initialDescriptionText : issuable . description ,
initialTaskStatus : issuable . task_status
2017-05-31 13:03:32 +00:00
}
2019-12-10 21:08:01 +00:00
data . merge! ( issue_only_initial_data ( issuable ) )
data . merge! ( path_data ( parent ) )
data . merge! ( updated_at_by ( issuable ) )
2017-05-31 13:03:32 +00:00
2019-12-10 21:08:01 +00:00
data
end
2019-07-17 06:41:26 +00:00
2019-12-10 21:08:01 +00:00
def issue_only_initial_data ( issuable )
return { } unless issuable . is_a? ( Issue )
2017-11-01 17:35:14 +00:00
2019-12-10 21:08:01 +00:00
{
hasClosingMergeRequest : issuable . merge_requests_count ( current_user ) != 0 ,
2020-09-02 09:10:23 +00:00
issueType : issuable . issue_type ,
2019-12-10 21:08:01 +00:00
zoomMeetingUrl : ZoomMeeting . canonical_meeting_url ( issuable ) ,
2020-09-10 18:08:54 +00:00
sentryIssueIdentifier : SentryIssue . find_by ( issue : issuable ) & . sentry_issue_identifier , # rubocop:disable CodeReuse/ActiveRecord
2021-08-25 09:10:52 +00:00
iid : issuable . iid . to_s ,
2021-11-09 21:10:00 +00:00
isHidden : issue_hidden? ( issuable ) ,
canCreateIncident : create_issue_type_allowed? ( issuable . project , :incident )
2019-12-10 21:08:01 +00:00
}
end
2017-06-02 16:30:58 +00:00
2019-12-10 21:08:01 +00:00
def path_data ( parent )
return { groupPath : parent . path } if parent . is_a? ( Group )
{
2020-09-02 09:10:23 +00:00
projectPath : ref_project . path ,
2021-02-08 18:09:49 +00:00
projectId : ref_project . id ,
2020-09-02 09:10:23 +00:00
projectNamespace : ref_project . namespace . full_path
2019-12-10 21:08:01 +00:00
}
2017-05-31 13:03:32 +00:00
end
def updated_at_by ( issuable )
2017-08-24 16:26:24 +00:00
return { } unless issuable . edited?
2017-05-31 13:03:32 +00:00
{
2018-01-11 16:22:00 +00:00
updatedAt : issuable . last_edited_at . to_time . iso8601 ,
2017-06-02 16:17:54 +00:00
updatedBy : {
2017-05-31 13:03:32 +00:00
name : issuable . last_edited_by . name ,
path : user_path ( issuable . last_edited_by )
}
}
end
2017-08-31 11:21:39 +00:00
def issuables_count_for_state ( issuable_type , state )
2021-10-21 09:09:48 +00:00
Gitlab :: IssuablesCountForState . new ( finder , store_in_redis_cache : true ) [ state ]
2017-06-30 10:55:27 +00:00
end
2017-09-28 11:37:29 +00:00
def close_issuable_path ( issuable )
issuable_path ( issuable , close_reopen_params ( issuable , :close ) )
2017-06-07 10:18:35 +00:00
end
2017-09-28 11:37:29 +00:00
def reopen_issuable_path ( issuable )
issuable_path ( issuable , close_reopen_params ( issuable , :reopen ) )
2017-06-07 10:18:35 +00:00
end
2017-09-28 11:37:29 +00:00
def issuable_path ( issuable , * options )
2017-11-01 17:35:14 +00:00
polymorphic_path ( issuable , * options )
2017-06-07 10:18:35 +00:00
end
2017-07-06 14:35:07 +00:00
def issuable_author_is_current_user ( issuable )
issuable . author == current_user
end
def issuable_display_type ( issuable )
2020-10-27 18:08:59 +00:00
case issuable
when Issue
issuable . issue_type . downcase
when MergeRequest
issuable . model_name . human . downcase
end
2017-07-06 14:35:07 +00:00
end
2018-11-19 11:59:08 +00:00
def has_filter_bar_param?
finder . class . scalar_params . any? { | p | params [ p ] . present? }
end
2019-09-24 18:06:05 +00:00
def assignee_sidebar_data ( assignee , merge_request : nil )
{ avatar_url : assignee . avatar_url , name : assignee . name , username : assignee . username } . tap do | data |
data [ :can_merge ] = merge_request . can_be_merged_by? ( assignee ) if merge_request
2021-01-28 18:09:27 +00:00
data [ :availability ] = assignee . status . availability if assignee . association ( :status ) . loaded? && assignee . status & . availability
2019-09-24 18:06:05 +00:00
end
end
2020-09-29 09:09:49 +00:00
def reviewer_sidebar_data ( reviewer , merge_request : nil )
{ avatar_url : reviewer . avatar_url , name : reviewer . name , username : reviewer . username } . tap do | data |
data [ :can_merge ] = merge_request . can_be_merged_by? ( reviewer ) if merge_request
end
end
2020-07-06 06:09:59 +00:00
def issuable_squash_option? ( issuable , project )
if issuable . persisted?
issuable . squash
else
project . squash_enabled_by_default?
end
end
2021-05-04 12:10:04 +00:00
def state_name_with_icon ( issuable )
2022-05-13 09:07:54 +00:00
if issuable . is_a? ( MergeRequest )
if issuable . open?
[ _ ( " Open " ) , " merge-request-open " ]
elsif issuable . merged?
[ _ ( " Merged " ) , " merge " ]
else
[ _ ( " Closed " ) , " merge-request-close " ]
end
2021-05-04 12:10:04 +00:00
else
2022-05-13 09:07:54 +00:00
if issuable . open?
[ _ ( " Open " ) , " issues " ]
else
[ _ ( " Closed " ) , " issue-closed " ]
end
2021-05-04 12:10:04 +00:00
end
end
2016-02-15 14:19:23 +00:00
private
def sidebar_gutter_collapsed?
cookies [ :collapsed_gutter ] == 'true'
end
2018-11-30 04:03:35 +00:00
def issuable_todo_button_data ( issuable , is_collapsed )
{
2020-10-08 09:08:40 +00:00
todo_text : _ ( 'Add a to do' ) ,
2019-07-04 15:45:54 +00:00
mark_text : _ ( 'Mark as done' ) ,
2018-11-30 04:03:35 +00:00
todo_icon : sprite_icon ( 'todo-add' ) ,
mark_icon : sprite_icon ( 'todo-done' , css_class : 'todo-undone' ) ,
issuable_id : issuable [ :id ] ,
issuable_type : issuable [ :type ] ,
create_path : issuable [ :create_todo_path ] ,
delete_path : issuable . dig ( :current_user , :todo , :delete_path ) ,
placement : is_collapsed ? 'left' : nil ,
container : is_collapsed ? 'body' : nil ,
boundary : 'viewport' ,
2019-08-21 19:12:11 +00:00
is_collapsed : is_collapsed ,
track_label : " right_sidebar " ,
track_property : " update_todo " ,
2021-09-15 18:11:29 +00:00
track_action : " click_button " ,
2019-08-21 19:12:11 +00:00
track_value : " "
2018-11-30 04:03:35 +00:00
}
end
2017-07-04 13:41:26 +00:00
def close_reopen_params ( issuable , action )
2017-07-06 14:35:07 +00:00
{
issuable . model_name . to_s . underscore = > { state_event : action }
} . tap do | params |
params [ :format ] = :json if issuable . is_a? ( Issue )
end
2017-07-04 13:41:26 +00:00
end
2017-07-25 15:46:15 +00:00
2017-08-28 21:56:49 +00:00
def labels_path
if @project
project_labels_path ( @project )
elsif @group
group_labels_path ( @group )
end
end
2018-11-30 04:03:35 +00:00
def issuable_sidebar_options ( issuable )
2017-07-25 15:46:15 +00:00
{
2018-11-30 04:03:35 +00:00
endpoint : " #{ issuable [ :issuable_json_path ] } ?serializer=sidebar_extras " ,
toggleSubscriptionEndpoint : issuable [ :toggle_subscription_path ] ,
moveIssueEndpoint : issuable [ :move_issue_path ] ,
projectsAutocompleteEndpoint : issuable [ :projects_autocomplete_path ] ,
editable : issuable . dig ( :current_user , :can_edit ) ,
currentUser : issuable [ :current_user ] ,
2017-07-25 15:46:15 +00:00
rootPath : root_path ,
2019-06-11 10:40:01 +00:00
fullPath : issuable [ :project_full_path ] ,
2020-03-13 15:09:21 +00:00
iid : issuable [ :iid ] ,
2021-04-26 09:09:53 +00:00
id : issuable [ :id ] ,
2020-09-10 18:08:54 +00:00
severity : issuable [ :severity ] ,
2021-01-05 03:10:19 +00:00
timeTrackingLimitToHours : Gitlab :: CurrentSettings . time_tracking_limit_to_hours ,
2021-03-01 18:11:21 +00:00
createNoteEmail : issuable [ :create_note_email ] ,
2021-04-29 09:10:11 +00:00
issuableType : issuable [ :type ]
2017-07-25 15:46:15 +00:00
}
end
2017-11-01 17:35:14 +00:00
2020-11-06 03:09:19 +00:00
def sidebar_labels_data ( issuable_sidebar , project )
{
allow_label_create : issuable_sidebar . dig ( :current_user , :can_admin_label ) . to_s ,
allow_scoped_labels : issuable_sidebar [ :scoped_labels_available ] . to_s ,
can_edit : issuable_sidebar . dig ( :current_user , :can_edit ) . to_s ,
iid : issuable_sidebar [ :iid ] ,
issuable_type : issuable_sidebar [ :type ] ,
labels_fetch_path : issuable_sidebar [ :project_labels_path ] ,
labels_manage_path : project_labels_path ( project ) ,
project_issues_path : issuable_sidebar [ :project_issuables_path ] ,
project_path : project . full_path ,
2022-11-09 15:07:50 +00:00
selected_labels : issuable_sidebar [ :labels ] . to_json
2020-11-06 03:09:19 +00:00
}
end
2021-07-09 12:08:17 +00:00
def sidebar_status_data ( issuable_sidebar , project )
{
iid : issuable_sidebar [ :iid ] ,
issuable_type : issuable_sidebar [ :type ] ,
full_path : project . full_path ,
can_edit : issuable_sidebar . dig ( :current_user , :can_edit ) . to_s
}
end
2017-11-01 17:35:14 +00:00
def parent
@project || @group
end
2021-09-01 15:10:20 +00:00
def format_count ( issuable_type , count , threshold )
2021-10-21 09:09:48 +00:00
if issuable_type == :issues && parent . is_a? ( Group )
2021-09-01 15:10:20 +00:00
format_cached_count ( threshold , count )
else
number_with_delimiter ( count )
end
end
2016-02-15 14:19:23 +00:00
end
2019-09-13 13:26:31 +00:00
2021-05-11 21:10:21 +00:00
IssuablesHelper . prepend_mod_with ( 'IssuablesHelper' )