253 lines
7.3 KiB
Ruby
253 lines
7.3 KiB
Ruby
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
|