Emi Matchu
c3eab22b4e
I noticed an issue where Turbo-loading between the Your Items page and the homepage would clobber each other's copy of jQuery, breaking things sometimes. e.g. go to Your Items, then go to home, then go to Your Items, and the page's JS fails because `$.fn.live` isn't defined. I briefly tested the homepage and it didn't seem to actually depend on any features from the later version of jQuery? At least not that I noticed! So I'll just downgrade for consistency. (I also tried upgrading the Your Items page, but there's too much usage of `$.fn.live`, which is replaced with a notably different syntax in jQuery 2.0+.)
253 lines
6.9 KiB
Ruby
253 lines
6.9 KiB
Ruby
module ApplicationHelper
|
|
include FragmentLocalization
|
|
|
|
def absolute_url(path_or_url)
|
|
if path_or_url.include?('://') # already an absolute URL
|
|
path_or_url
|
|
else # a relative path
|
|
request.protocol + request.host_with_port + path_or_url
|
|
end
|
|
end
|
|
|
|
def add_body_class(class_name)
|
|
@body_class ||= ''
|
|
@body_class << " #{class_name}"
|
|
end
|
|
|
|
def body_class
|
|
controller = params[:controller].gsub("/", "-")
|
|
"#{controller} #{controller}-#{params[:action]}".tap do |output|
|
|
output << @body_class if @body_class
|
|
end
|
|
end
|
|
|
|
def advertise_campaign_progress(campaign, &block)
|
|
if campaign && campaign.advertised?
|
|
campaign_progress(campaign, &block)
|
|
end
|
|
end
|
|
|
|
def cents_to_currency(cents, options={})
|
|
number_to_currency(cents / 100.0, options)
|
|
end
|
|
|
|
def campaign_progress(campaign, &block)
|
|
if campaign
|
|
if block_given?
|
|
content = capture(&block)
|
|
else
|
|
if campaign.complete?
|
|
pitch = "We've met this year's fundraising goal! Thanks, everybody!"
|
|
prompt = "Learn more"
|
|
elsif campaign.remaining < 200_00
|
|
estimate = (campaign.remaining.to_f / 10_00).ceil * 10_00
|
|
if estimate == campaign.remaining
|
|
pitch = "We're only #{cents_to_currency(estimate, precision: 0)} away from paying #{campaign.purpose}!"
|
|
else
|
|
pitch = "We're less than #{cents_to_currency(estimate, precision: 0)} away from paying #{campaign.purpose}!"
|
|
end
|
|
prompt = "Donate now"
|
|
else
|
|
pitch = "Help Dress to Impress stay online!"
|
|
prompt = "Learn more"
|
|
end
|
|
content = link_to(
|
|
content_tag(:span, pitch) +
|
|
content_tag(:span, prompt, :class => 'button'), donate_path)
|
|
end
|
|
|
|
meter = content_tag(:div, nil, :class => 'campaign-progress',
|
|
style: "width: #{campaign.progress_percent}%;")
|
|
label = content_tag(:div, content, :class => 'campaign-progress-label')
|
|
content_tag(:div, meter + label, :class => 'campaign-progress-wrapper')
|
|
end
|
|
end
|
|
|
|
def canonical_path(resource)
|
|
I18n.with_locale(I18n.default_locale) do
|
|
content_for :meta, tag(:link, :rel => 'canonical', :href => url_for(resource))
|
|
end
|
|
end
|
|
|
|
def contact_email
|
|
"matchu@openneo.net"
|
|
end
|
|
|
|
def flashes
|
|
raw(flash.inject('') do |html, pair|
|
|
key, value = pair
|
|
html + content_tag('p', value, :class => "flash #{key}")
|
|
end)
|
|
end
|
|
|
|
def hide_home_link
|
|
@hide_home_link = true
|
|
end
|
|
|
|
def home_link?
|
|
!@hide_home_link
|
|
end
|
|
|
|
def support_staff?
|
|
user_signed_in? && current_user.support_staff?
|
|
end
|
|
|
|
def impress_2020_meta_tags
|
|
origin = Rails.configuration.impress_2020_origin
|
|
support_secret = Rails.application.credentials.impress_2020.support_secret
|
|
|
|
capture do
|
|
concat tag("meta", name: "impress-2020-origin", content: origin)
|
|
|
|
if support_staff? && support_secret.present?
|
|
concat tag("meta", name: "impress-2020-support-secret",
|
|
content: support_secret)
|
|
end
|
|
end
|
|
end
|
|
|
|
JAVASCRIPT_LIBRARIES = {
|
|
:jquery => 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js',
|
|
:jquery_tmpl => 'https://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js',
|
|
}
|
|
|
|
def include_javascript_libraries(*library_names)
|
|
raw(library_names.inject('') do |html, name|
|
|
html + javascript_include_tag(JAVASCRIPT_LIBRARIES[name], defer: true)
|
|
end)
|
|
end
|
|
|
|
def locale_options
|
|
current_locale_is_public = false
|
|
options = I18n.public_locales.map do |available_locale|
|
|
current_locale_is_public = true if I18n.locale == available_locale
|
|
# Include fallbacks data on the tag. Right now it's used in blog
|
|
# localization, but may conceivably be used for something else later.
|
|
[translate('locale_name', :locale => available_locale), available_locale,
|
|
{'data-fallbacks' => I18n.fallbacks[available_locale].join(',')}]
|
|
end
|
|
|
|
unless current_locale_is_public
|
|
name = translate('locale_name', :locale => I18n.locale) + ' (alpha)'
|
|
options << [name, I18n.locale]
|
|
end
|
|
|
|
options
|
|
end
|
|
|
|
def localized_cache(key={}, &block)
|
|
localized_key = localize_fragment_key(key, locale)
|
|
# TODO: The digest feature is handy, but it's not compatible with how we
|
|
# check for fragments existence in the controller, so skip it for now.
|
|
cache(localized_key, skip_digest: true, &block)
|
|
end
|
|
|
|
def auth_user_sign_in_path_with_return_to
|
|
new_auth_user_session_path :return_to => request.fullpath
|
|
end
|
|
|
|
def origin_tag(value)
|
|
hidden_field_tag 'origin', value, :id => nil
|
|
end
|
|
|
|
def open_graph(properties)
|
|
if @open_graph
|
|
@open_graph.merge! properties
|
|
else
|
|
@open_graph = properties
|
|
end
|
|
end
|
|
|
|
def open_graph_tags
|
|
if @open_graph
|
|
@open_graph.inject('') do |output, property|
|
|
key, value = property
|
|
output + tag(:meta, :property => "og:#{key}", :content => value)
|
|
end.html_safe
|
|
end
|
|
end
|
|
|
|
def secondary_nav(&block)
|
|
content_for :before_flashes,
|
|
content_tag(:nav, :id => 'secondary-nav', &block)
|
|
end
|
|
|
|
def show_title_header?
|
|
params[:controller] != 'items' && !@hide_title_header
|
|
end
|
|
|
|
def hide_title_header
|
|
@hide_title_header = true
|
|
end
|
|
|
|
def signed_in_meta_tag
|
|
%(<meta name="user-signed-in" content="#{user_signed_in?}">).html_safe
|
|
end
|
|
|
|
def current_user_id_meta_tag
|
|
%(<meta name="current-user-id" content="#{current_user.id}">).html_safe
|
|
end
|
|
|
|
def labeled_time_ago_in_words(time)
|
|
content_tag :abbr, time_ago_in_words(time), :title => time
|
|
end
|
|
|
|
def title(value)
|
|
content_for :title, value
|
|
end
|
|
|
|
def md(text)
|
|
RDiscount.new(text).to_html.html_safe
|
|
end
|
|
|
|
def terms_updated_at
|
|
Date.new(2024, 2, 29)
|
|
end
|
|
|
|
def terms_updated_timestamp
|
|
terms_updated_at.strftime("%b %Y")
|
|
end
|
|
|
|
def terms_updated_recently
|
|
terms_updated_at >= 2.months.ago
|
|
end
|
|
|
|
def translate_markdown(key, options={})
|
|
md translate("#{key}_markdown", **options)
|
|
end
|
|
|
|
alias_method :tmd, :translate_markdown
|
|
|
|
def translate_with_links(key, options={})
|
|
nonlink_options = {}
|
|
link_urls = {}
|
|
|
|
options.each do |key, value|
|
|
str_key = key.to_s
|
|
if str_key.end_with? '_link_url'
|
|
link_key = str_key[0..-5] # "abcdef_link_url" => "abcdef_link"
|
|
link_urls[link_key] = value
|
|
else
|
|
nonlink_options[key] = value
|
|
end
|
|
end
|
|
|
|
link_options = {}
|
|
link_urls.each do |link_key, url|
|
|
content = translate("#{key}.#{link_key}_content", **nonlink_options)
|
|
link_options[link_key.to_sym] = link_to(content, url)
|
|
end
|
|
|
|
converted_options = link_options.merge(nonlink_options)
|
|
translate("#{key}.main_html", **converted_options)
|
|
end
|
|
|
|
alias_method :twl, :translate_with_links
|
|
|
|
def userbar_contributions_summary(user)
|
|
translate_with_links '.userbar.contributions_summary',
|
|
:contributions_link_url => user_contributions_path(user),
|
|
:user_points => user.points
|
|
end
|
|
end
|
|
|