cartodb/app/helpers/application_helper.rb

253 lines
7.3 KiB
Ruby
Raw Normal View History

2020-06-15 10:58:47 +08:00
require_dependency 'cartodb_config_utils'
require_dependency 'carto/configuration'
module ApplicationHelper
include Carto::Configuration
include CartoDB::ConfigUtils
include SafeJsObject
include TrackjsHelper
include GoogleTagManagerHelper
include FrontendConfigHelper
include AppAssetsHelper
include MapsApiHelper
include SqlApiHelper
include Carto::HtmlSafe
include CartoGearsApi::Helpers::PagesHelper
def current_user
super(CartoDB.extract_subdomain(request))
end
def current_viewer
controller.current_viewer
end
def show_footer?
(controller_name == 'tables' && action_name != 'show') ||
(controller_name == 'client_applications') || (controller_name == 'users')
end
def show_google_api_keys?(user)
user.google_maps_geocoder_enabled? && (!user.organization.present? || user.organization_owner?)
end
def in_my_tables?
controller_name == 'tables' && action_name == 'index' && !params[:public]
end
def current_path
request.path
end
def selected_if(condition)
condition ? 'selected' : ''
end
def paginate(collection)
return if collection.empty?
if collection.is_a?(Hash)
if collection[:page_count] > 1
render(:partial => 'shared/paginate', :locals => {:collection => collection}).html_safe
end
else
if collection.page_count > 1
render(:partial => 'shared/paginate', :locals => {:collection => collection}).html_safe
end
end
end
def last_blog_posts
# Data generated from Rake task in lib/tasks/blog.rake
if File.file?(CartoDB::LAST_BLOG_POSTS_FILE_PATH)
File.read(CartoDB::LAST_BLOG_POSTS_FILE_PATH).html_safe
end
end
module_function :maps_api_template, :maps_api_url
module_function :sql_api_template, :sql_api_url
module_function :app_assets_base_url
def frontend_config_public(options={ https_apis: false })
api_type = (options[:https_apis].present? && options[:https_apis]) ? 'private' : 'public'
config = {
maps_api_template: maps_api_template(api_type),
user_name: CartoDB.extract_subdomain(request),
cartodb_com_hosted: Cartodb.config[:cartodb_com_hosted],
account_host: CartoDB.account_host,
max_asset_file_size: Cartodb.config[:assets]["max_file_size"],
api_key: ''
}
# Assumption: it is safe to expose private SQL API endpoint (or it is the same just using HTTPS)
config[:sql_api_template] = sql_api_template(api_type)
if Cartodb.config[:graphite_public].present?
config[:statsd_host] = Cartodb.config[:graphite_public]['host']
config[:statsd_port] = Cartodb.config[:graphite_public]['port']
end
if Cartodb.config[:error_track].present?
config[:error_track_url] = Cartodb.config[:error_track]["url"]
config[:error_track_percent_users] = Cartodb.config[:error_track]["percent_users"]
end
if Cartodb.config[:cdn_url].present?
config[:cdn_url] = Cartodb.config[:cdn_url]
end
if Cartodb.config[:explore_api].present?
config[:explore_user] = Cartodb.config[:explore_api]['username']
end
if Cartodb.config[:common_data].present?
config[:common_data_user] = Cartodb.config[:common_data]['username']
end
config.to_json
end
def stringified_member_type
current_user.present? ? current_user.account_type.to_s.upcase : 'UNAUTHENTICATED'
end
def insert_hubspot_form(form = 'newsletter')
if CartoDB::Hubspot::instance.enabled? && !CartoDB::Hubspot::instance.token.blank? && CartoDB::Hubspot::instance.form_ids.present? && !CartoDB::Hubspot::instance.form_ids[form].blank?
token = CartoDB::Hubspot::instance.token
render(:partial => 'shared/hubspot_form', :locals => { token: token, form_id: CartoDB::Hubspot::instance.form_ids[form] })
end
end
def insert_google_maps(query_string)
render(partial: 'shared/google_maps', locals: { query_string: query_string })
end
def sources_with_path(asset_type, sources)
path = if sources.first == :editor
sources.shift
"editor/#{editor_assets_version}"
else
frontend_version
end
raise_on_asset_absence sources
sources_with_prefix("/#{path}/#{asset_type}/", sources)
end
def sources_with_prefix(path, sources)
options = sources.extract_options!.stringify_keys
with_full_path = []
sources.each do |source|
with_full_path << path + source
end
with_full_path << options
end
##
# Checks that the precompile list contains this file or raises an error, in dev only
# Note: You will need to move config.assets.precompile to application.rb from production.rb
def javascript_include_tag(*sources)
super *sources_with_path('javascripts', sources)
end
def stylesheet_link_tag(*sources)
super *sources_with_path('stylesheets', sources)
end
def image_path(source, editor = false)
if editor
super "/editor/#{editor_assets_version}/images/#{source}"
else
super "/#{frontend_version}/images/#{source}"
end
end
def image_tag(source, options={})
super "/#{frontend_version}/images/#{source}", options
end
def editor_image_path(source)
image_path(source, true)
end
def favicon_link_tag(source)
super "/#{frontend_version}/#{source}"
end
def editor_stylesheet_link_tag(*sources)
stylesheet_link_tag *([:editor] + sources)
end
def editor_javascript_include_tag(*sources)
javascript_include_tag *([:editor] + sources)
end
def raise_on_asset_absence *sources
sources.flatten.each do |source|
next if source == {:media => "all"}
raise "Hey, #{source} is not in the precompile list (check application.rb). This will fall apart in production." unless Rails.application.config.assets.precompile.any? do |matcher|
if matcher.is_a? Proc
matcher.call(source)
elsif matcher.is_a? Regexp
matcher.match(source)
else
rx = /(\.css)|(\.js)/
matcher.to_s.gsub(rx,'') == source.to_s.gsub(rx,'')
end
end
end if Rails.env.development?
end
def form_error_for(attribute, errors)
error_messages = errors[attribute].map{|e| e.humanize }.join('. ')
content_tag :div, error_messages, :class => 'field_error' if error_messages.present?
end
def v1_vizjson_url(visualization)
"/api/v1/viz/#{visualization.id}/viz"
end
def v2_vizjson_url(visualization)
"/api/v2/viz/#{visualization.id}/viz"
end
def formatted_tags(tags)
visibleCount = 3
tags.first(visibleCount).each_with_index do |tag, i|
yield tag
concat ', ' if i < visibleCount-1 && i < tags.size-1
end
if tags.size > visibleCount
concat " and #{tags.size - visibleCount} more"
end
end
def terms_path
'https://carto.com/terms'
end
def privacy_path
'https://carto.com/privacy'
end
def vis_json_url(vis_id, context, user = nil)
"#{CartoDB.url(context, 'api_v2_visualizations_vizjson',
params: { id: vis_id }, user: user).sub(/(http:|https:)/i, '')}.json"
end
def vis_json_v3_url(vis_id, context, user = nil)
"#{CartoDB.url(context, 'api_v3_visualizations_vizjson',
params: { id: vis_id }, user: user).sub(/(http:|https:)/i, '')}.json"
end
def model_errors(model)
model.errors.full_messages.map(&:capitalize).join(', ') if model.errors.present?
end
end