2018-08-18 07:19:57 -04:00
# frozen_string_literal: true
2014-11-11 10:09:58 -05:00
module EmailsHelper
2017-02-07 10:06:27 -05:00
include AppearancesHelper
2014-11-11 10:09:58 -05:00
# Google Actions
# https://developers.google.com/gmail/markup/reference/go-to-action
2014-11-12 05:59:57 -05:00
def email_action ( url )
name = action_title ( url )
2021-08-06 14:09:57 -04:00
return unless name
gmail_goto_action ( name , url )
2014-11-12 05:59:57 -05:00
end
def action_title ( url )
return unless url
2017-11-14 04:02:39 -05:00
2017-02-22 12:46:57 -05:00
%w( merge_requests issues commit ) . each do | action |
2014-11-12 05:59:57 -05:00
if url . split ( " / " ) . include? ( action )
return " View #{ action . humanize . singularize } "
end
2014-11-11 10:09:58 -05:00
end
2015-11-25 07:53:02 -05:00
nil
2014-11-11 10:09:58 -05:00
end
2015-01-16 08:38:53 -05:00
2021-08-06 14:09:57 -04:00
def gmail_goto_action ( name , url )
data = {
" @context " = > " http://schema.org " ,
" @type " = > " EmailMessage " ,
" action " = > {
" @type " = > " ViewAction " ,
" name " = > name ,
" url " = > url
}
}
content_tag :script , type : 'application/ld+json' do
2022-10-27 20:11:00 -04:00
Gitlab :: Json . dump ( data ) . html_safe
2021-08-06 14:09:57 -04:00
end
end
2019-01-15 09:21:37 -05:00
def sanitize_name ( name )
if name =~ URI :: DEFAULT_PARSER . regexp [ :URI_REF ]
name . tr ( '.' , '_' )
else
name
end
end
2015-04-27 00:04:33 -04:00
def password_reset_token_valid_time
valid_hours = Devise . reset_password_within / 60 / 60
if valid_hours > = 24
unit = 'day'
valid_length = ( valid_hours / 24 ) . floor
else
unit = 'hour'
valid_length = valid_hours . floor
end
pluralize ( valid_length , unit )
end
2017-02-07 10:06:27 -05:00
def header_logo
2022-06-10 08:09:36 -04:00
if current_appearance & . header_logo? && ! current_appearance . header_logo . filename . ends_with? ( '.svg' )
2017-02-17 04:05:13 -05:00
image_tag (
2018-12-25 03:24:00 -05:00
current_appearance . header_logo_path ,
2017-02-17 04:05:13 -05:00
style : 'height: 50px'
)
2017-02-07 10:06:27 -05:00
else
image_tag (
2022-04-27 11:10:01 -04:00
image_url ( 'mailers/gitlab_logo.png' ) ,
size : '55x55' ,
2017-07-24 13:36:52 -04:00
alt : 'GitLab'
2017-02-07 10:06:27 -05:00
)
end
end
2017-05-10 11:38:37 -04:00
def email_default_heading ( text )
content_tag :h1 , text , style : [
" font-family:'Helvetica Neue',Helvetica,Arial,sans-serif " ,
'color:#333333' ,
'font-size:18px' ,
'font-weight:400' ,
'line-height:1.4' ,
'padding:0' ,
'margin:0' ,
'text-align:center'
] . join ( ';' )
end
2017-12-28 12:25:02 -05:00
2019-05-16 07:59:02 -04:00
def closure_reason_text ( closed_via , format : nil )
case closed_via
when MergeRequest
merge_request = MergeRequest . find ( closed_via [ :id ] ) . present
2019-08-08 15:29:45 -04:00
return " " unless Ability . allowed? ( @recipient , :read_merge_request , merge_request )
2019-05-16 07:59:02 -04:00
case format
when :html
2019-06-04 05:56:32 -04:00
merge_request_link = link_to ( merge_request . to_reference , merge_request . web_url )
_ ( " via merge request %{link} " ) . html_safe % { link : merge_request_link }
2019-05-16 07:59:02 -04:00
else
# If it's not HTML nor text then assume it's text to be safe
2019-06-04 05:56:32 -04:00
_ ( " via merge request %{link} " ) % { link : " #{ merge_request . to_reference } ( #{ merge_request . web_url } ) " }
2019-05-16 07:59:02 -04:00
end
when String
# Technically speaking this should be Commit but per
2019-09-18 10:02:45 -04:00
# https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/15610#note_163812339
2019-05-16 07:59:02 -04:00
# we can't deserialize Commit without custom serializer for ActiveJob
2019-08-08 15:29:45 -04:00
return " " unless Ability . allowed? ( @recipient , :download_code , @project )
2019-06-04 05:56:32 -04:00
_ ( " via %{closed_via} " ) % { closed_via : closed_via }
2019-05-16 07:59:02 -04:00
else
" "
end
end
2022-07-06 14:08:29 -04:00
# "You are receiving this email because ... on #{host}. ..."
def notification_reason_text ( reason : nil , show_manage_notifications_link : false , show_help_link : false , manage_label_subscriptions_url : nil , unsubscribe_url : nil , format : :text )
if unsubscribe_url && show_manage_notifications_link && show_help_link
notification_reason_text_with_unsubscribe_and_manage_notifications_and_help_links ( reason : reason , unsubscribe_url : unsubscribe_url , format : format )
elsif ! reason && manage_label_subscriptions_url && show_help_link
notification_reason_text_with_manage_label_subscriptions_and_help_links ( manage_label_subscriptions_url : manage_label_subscriptions_url , format : format )
elsif show_manage_notifications_link && show_help_link
notification_reason_text_with_manage_notifications_and_help_links ( reason : reason , format : format )
2019-12-04 16:07:31 -05:00
else
2022-07-06 14:08:29 -04:00
notification_reason_text_without_links ( reason : reason , format : format )
2019-12-04 16:07:31 -05:00
end
2017-12-28 12:25:02 -05:00
end
2018-12-13 06:15:48 -05:00
def create_list_id_string ( project , list_id_max_length = 255 )
project_path_as_domain = project . full_path . downcase
. split ( '/' ) . reverse . join ( '/' )
. gsub ( %r{ [^a-z0-9 \ /] } , '-' )
. gsub ( %r{ \ /+ } , '.' )
. gsub ( / ( \ A \ .+| \ .+ \ z) / , '' )
max_domain_length = list_id_max_length - Gitlab . config . gitlab . host . length - project . id . to_s . length - 2
if max_domain_length < 3
return project . id . to_s + " ... " + Gitlab . config . gitlab . host
end
if project_path_as_domain . length > max_domain_length
project_path_as_domain = project_path_as_domain . slice ( 0 , max_domain_length )
last_dot_index = project_path_as_domain [ 0 .. - 2 ] . rindex ( " . " )
last_dot_index || = max_domain_length - 2
project_path_as_domain = project_path_as_domain . slice ( 0 , last_dot_index ) . concat ( " .. " )
end
project . id . to_s + " . " + project_path_as_domain + " . " + Gitlab . config . gitlab . host
end
2019-02-20 10:18:15 -05:00
def html_header_message
return unless show_header?
render_message ( :header_message , style : '' )
end
def html_footer_message
return unless show_footer?
render_message ( :footer_message , style : '' )
end
def text_header_message
return unless show_header?
strip_tags ( render_message ( :header_message , style : '' ) )
end
def text_footer_message
return unless show_footer?
strip_tags ( render_message ( :footer_message , style : '' ) )
end
2020-08-20 11:10:18 -04:00
def say_hi ( user )
_ ( 'Hi %{username}!' ) % { username : sanitize_name ( user . name ) }
end
2020-09-04 05:08:38 -04:00
def say_hello ( user )
_ ( 'Hello, %{username}!' ) % { username : sanitize_name ( user . name ) }
end
2020-08-20 11:10:18 -04:00
def two_factor_authentication_disabled_text
_ ( 'Two-factor authentication has been disabled for your GitLab account.' )
end
def re_enable_two_factor_authentication_text ( format : nil )
url = profile_two_factor_auth_url
case format
when :html
2020-09-04 05:08:38 -04:00
settings_link_to = generate_link ( _ ( 'two-factor authentication settings' ) , url ) . html_safe
2020-08-20 11:10:18 -04:00
_ ( " If you want to re-enable two-factor authentication, visit the %{settings_link_to} page. " ) . html_safe % { settings_link_to : settings_link_to }
else
_ ( 'If you want to re-enable two-factor authentication, visit %{two_factor_link}' ) %
{ two_factor_link : url }
end
end
2022-03-18 11:07:23 -04:00
def new_email_address_added_text ( email )
_ ( 'A new email address has been added to your GitLab account: %{email}' ) % { email : email }
end
def remove_email_address_text ( format : nil )
url = profile_emails_url
case format
when :html
settings_link_to = generate_link ( _ ( 'email address settings' ) , url ) . html_safe
_ ( " If you want to remove this email address, visit the %{settings_link_to} page. " ) . html_safe % { settings_link_to : settings_link_to }
else
_ ( 'If you want to remove this email address, visit %{profile_link}' ) %
{ profile_link : url }
end
end
2020-09-04 05:08:38 -04:00
def admin_changed_password_text ( format : nil )
url = Gitlab . config . gitlab . url
case format
when :html
link_to = generate_link ( url , url ) . html_safe
_ ( 'An administrator changed the password for your GitLab account on %{link_to}.' ) . html_safe % { link_to : link_to }
else
_ ( 'An administrator changed the password for your GitLab account on %{link_to}.' ) % { link_to : url }
end
end
2021-01-14 13:10:59 -05:00
def group_membership_expiration_changed_text ( member , group )
if member . expires?
days = ( member . expires_at - Date . today ) . to_i
days_formatted = pluralize ( days , 'day' )
_ ( 'Your %{group} membership will now expire in %{days}.' ) % { group : group . human_name , days : days_formatted }
else
_ ( 'Your membership in %{group} no longer expires.' ) % { group : group . human_name }
end
end
def group_membership_expiration_changed_link ( member , group , format : nil )
url = group_group_members_url ( group , search : member . user . username )
case format
when :html
link_to = generate_link ( 'group membership' , url ) . html_safe
_ ( 'For additional information, review your %{link_to} or contact your group owner.' ) . html_safe % { link_to : link_to }
else
_ ( 'For additional information, review your group membership: %{link_to} or contact your group owner.' ) % { link_to : url }
end
end
2020-11-12 19:09:49 -05:00
def instance_access_request_text ( user , format : nil )
2022-07-06 14:08:29 -04:00
_ ( '%{username} has asked for a GitLab account on your instance %{host}:' ) . html_safe % { username : sanitize_name ( user . name ) , host : gitlab_host_link ( format ) }
2020-11-12 19:09:49 -05:00
end
def instance_access_request_link ( user , format : nil )
url = admin_user_url ( user )
case format
when :html
user_page = '<a href="%{url}" target="_blank" rel="noopener noreferrer">' . html_safe % { url : url }
_ ( " Click %{link_start}here%{link_end} to view the request. " ) . html_safe % { link_start : user_page , link_end : '</a>' . html_safe }
else
_ ( 'Click %{link_to} to view the request.' ) % { link_to : url }
end
end
2022-07-01 11:08:30 -04:00
def link_start ( url )
'<a href="%{url}" target="_blank" rel="noopener noreferrer">' . html_safe % { url : url }
end
def link_end
'</a>' . html_safe
end
2020-09-04 05:08:38 -04:00
def contact_your_administrator_text
_ ( 'Please contact your administrator with any questions.' )
end
2020-09-21 08:09:34 -04:00
def change_reviewer_notification_text ( new_reviewers , previous_reviewers , html_tag = nil )
new = new_reviewers . any? ? users_to_sentence ( new_reviewers ) : s_ ( 'ChangeReviewer|Unassigned' )
old = previous_reviewers . any? ? users_to_sentence ( previous_reviewers ) : nil
if html_tag . present?
new = content_tag ( html_tag , new )
old = content_tag ( html_tag , old ) if old . present?
end
if old . present?
s_ ( 'ChangeReviewer|Reviewer changed from %{old} to %{new}' ) . html_safe % { old : old , new : new }
else
s_ ( 'ChangeReviewer|Reviewer changed to %{new}' ) . html_safe % { new : new }
end
end
2019-02-20 10:18:15 -05:00
private
2020-09-21 08:09:34 -04:00
def users_to_sentence ( users )
sanitize_name ( users . map ( & :name ) . to_sentence )
end
2020-09-04 05:08:38 -04:00
def generate_link ( text , url )
link_to ( text , url , target : :_blank , rel : 'noopener noreferrer' )
end
2019-02-20 10:18:15 -05:00
def show_footer?
email_header_and_footer_enabled? && current_appearance & . show_footer?
end
def show_header?
email_header_and_footer_enabled? && current_appearance & . show_header?
end
def email_header_and_footer_enabled?
current_appearance & . email_header_and_footer_enabled?
end
2022-07-06 14:08:29 -04:00
def gitlab_host_link ( format )
case format
when :html
generate_link ( Gitlab . config . gitlab . host , Gitlab . config . gitlab . url )
when :text
Gitlab . config . gitlab . host
end
end
def notification_reason_text_with_unsubscribe_and_manage_notifications_and_help_links ( reason : , unsubscribe_url : , format : )
unsubscribe_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">' . html_safe % { url : unsubscribe_url }
unsubscribe_link_end = '</a>' . html_safe
manage_notifications_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="mng-notif-link">' . html_safe % { url : profile_notifications_url }
manage_notifications_link_end = '</a>' . html_safe
help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="help-link">' . html_safe % { url : help_url }
help_link_end = '</a>' . html_safe
case reason
when NotificationReason :: OWN_ACTIVITY
_ ( " You're receiving this email because of your activity on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread · %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , unsubscribe_link_start : unsubscribe_link_start , unsubscribe_link_end : unsubscribe_link_end , manage_notifications_link_start : manage_notifications_link_start , manage_notifications_link_end : manage_notifications_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
when NotificationReason :: ASSIGNED
_ ( " You're receiving this email because you have been assigned an item on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread · %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , unsubscribe_link_start : unsubscribe_link_start , unsubscribe_link_end : unsubscribe_link_end , manage_notifications_link_start : manage_notifications_link_start , manage_notifications_link_end : manage_notifications_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
when NotificationReason :: MENTIONED
_ ( " You're receiving this email because you have been mentioned on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread · %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , unsubscribe_link_start : unsubscribe_link_start , unsubscribe_link_end : unsubscribe_link_end , manage_notifications_link_start : manage_notifications_link_start , manage_notifications_link_end : manage_notifications_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
else
_ ( " You're receiving this email because of your account on %{host}. %{unsubscribe_link_start}Unsubscribe%{unsubscribe_link_end} from this thread · %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , unsubscribe_link_start : unsubscribe_link_start , unsubscribe_link_end : unsubscribe_link_end , manage_notifications_link_start : manage_notifications_link_start , manage_notifications_link_end : manage_notifications_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
end
end
def notification_reason_text_with_manage_label_subscriptions_and_help_links ( manage_label_subscriptions_url : , format : )
manage_label_subscriptions_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="mng-notif-link">' . html_safe % { url : manage_label_subscriptions_url }
manage_label_subscriptions_link_end = '</a>' . html_safe
help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="help-link">' . html_safe % { url : help_url }
help_link_end = '</a>' . html_safe
_ ( " You're receiving this email because of your account on %{host}. %{manage_label_subscriptions_link_start}Manage label subscriptions%{manage_label_subscriptions_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , manage_label_subscriptions_link_start : manage_label_subscriptions_link_start , manage_label_subscriptions_link_end : manage_label_subscriptions_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
end
def notification_reason_text_with_manage_notifications_and_help_links ( reason : , format : )
manage_notifications_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="mng-notif-link">' . html_safe % { url : profile_notifications_url }
manage_notifications_link_end = '</a>' . html_safe
help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer" class="help-link">' . html_safe % { url : help_url }
help_link_end = '</a>' . html_safe
case reason
when NotificationReason :: MENTIONED
_ ( " You're receiving this email because you have been mentioned on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , manage_notifications_link_start : manage_notifications_link_start , manage_notifications_link_end : manage_notifications_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
else
_ ( " You're receiving this email because of your account on %{host}. %{manage_notifications_link_start}Manage all notifications%{manage_notifications_link_end} · %{help_link_start}Help%{help_link_end} " ) . html_safe % { host : gitlab_host_link ( format ) , manage_notifications_link_start : manage_notifications_link_start , manage_notifications_link_end : manage_notifications_link_end , help_link_start : help_link_start , help_link_end : help_link_end }
end
end
def notification_reason_text_without_links ( reason : , format : )
case reason
when NotificationReason :: OWN_ACTIVITY
_ ( " You're receiving this email because of your activity on %{host}. " ) . html_safe % { host : gitlab_host_link ( format ) }
when NotificationReason :: ASSIGNED
_ ( " You're receiving this email because you have been assigned an item on %{host}. " ) . html_safe % { host : gitlab_host_link ( format ) }
when NotificationReason :: MENTIONED
_ ( " You're receiving this email because you have been mentioned on %{host}. " ) . html_safe % { host : gitlab_host_link ( format ) }
else
_ ( " You're receiving this email because of your account on %{host}. " ) . html_safe % { host : gitlab_host_link ( format ) }
end
end
2014-11-11 10:09:58 -05:00
end
2019-09-13 09:26:31 -04:00
2021-05-11 17:10:21 -04:00
EmailsHelper . prepend_mod_with ( 'EmailsHelper' )