cartodb/lib/carto/export/layer_exporter.rb
2020-06-15 10:58:47 +08:00

116 lines
3.3 KiB
Ruby

module Carto
module LayerImporter
private
def build_layers_from_hash(exported_layers)
return [] unless exported_layers
exported_layers.map.with_index.map { |layer, i| build_layer_from_hash(layer, order: i) }
end
# user_name is not cleaned to ease username replacement at sql rewriting (see #7380)
LAYER_OPTIONS_WITH_IDS = [:id, :stat_tag].freeze
def build_layer_from_hash(exported_layer, order:)
options = exported_layer[:options]
LAYER_OPTIONS_WITH_IDS.each do |option_key|
options[option_key] = nil if options.has_key?(option_key)
end
# Indifferent access is used to keep symbol/string hash coherence with Layer serializers.
options_with_indifferent_access = options.with_indifferent_access
infowindow = exported_layer[:infowindow]
infowindow_with_indifferent_access = infowindow.with_indifferent_access if infowindow
tooltip = exported_layer[:tooltip]
tooltip_with_indifferent_access = tooltip.with_indifferent_access if tooltip
layer = Carto::Layer.new(
options: options_with_indifferent_access,
kind: exported_layer[:kind],
infowindow: infowindow_with_indifferent_access,
order: order,
tooltip: tooltip_with_indifferent_access
)
layer.widgets = build_widgets_from_hash(exported_layer[:widgets], layer: layer)
layer.legends = build_legends_from_hash(exported_layer[:legends], layer)
layer
end
def build_legends_from_hash(exported_legends, layer)
return [] unless exported_legends
exported_legends.map do |exported_legend|
legend = Legend.new(exported_legend)
legend.layer = layer
legend
end
end
def build_widgets_from_hash(exported_widgets, layer:)
return [] unless exported_widgets
exported_widgets.map.with_index.map do |widget, index|
build_widget_from_hash(widget, order: index, layer: layer)
end
end
def build_widget_from_hash(exported_widget, order:, layer:)
return nil unless exported_widget
Carto::Widget.new(
order: exported_widget[:order] || order, # Order added to export on 2.0.5
layer: layer,
type: exported_widget[:type],
title: exported_widget[:title],
options: exported_widget[:options],
source_id: exported_widget[:source_id],
style: exported_widget[:style]
)
end
end
module LayerExporter
private
def export_layer(layer, active_layer: false)
layer = {
options: layer.options,
kind: layer.kind,
infowindow: layer.infowindow,
tooltip: layer.tooltip,
widgets: layer.widgets.map { |widget| export_widget(widget) },
legends: layer.legends.map { |legend| export_legend(legend) }
}
layer[:active_layer] = true if active_layer
layer
end
def export_widget(widget)
{
options: widget.options,
type: widget.type,
title: widget.title,
source_id: widget.source_id,
order: widget.order,
style: widget.style
}
end
def export_legend(legend)
{
definition: legend.definition,
post_html: legend.post_html,
pre_html: legend.pre_html,
title: legend.title,
type: legend.type
}
end
end
end