Skip to content

Commit

Permalink
Merge pull request #8079 from CartoDB/8040-named-maps-interactivity-a…
Browse files Browse the repository at this point in the history
…ttributes

8040 named maps interactivity attributes
  • Loading branch information
gfiorav committed Jun 23, 2016
2 parents b507eb6 + 5cd6b76 commit bee7185
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 54 deletions.
45 changes: 26 additions & 19 deletions lib/carto/named_maps/template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,10 @@ def common_options_for_carto_and_torque_layers(layer, index)
options[:sql] = visibility_wrapped_sql(layer.wrapped_sql(@visualization.user), index)
end

interactivity, attributes = infowindow_options(layer)
attributes, interactivity = attributes_and_interactivity(layer.infowindow, layer.tooltip)

options[:interactivity] = interactivity if interactivity
options[:attributes] = attributes if attributes
options[:attributes] = attributes if attributes.present?
options[:interactivity] = interactivity if interactivity.present?

options
end
Expand All @@ -164,6 +164,29 @@ def visibility_wrapped_sql(sql, index)
"SELECT * FROM (#{sql}) AS wrapped_query WHERE <%= layer#{index} %>=1"
end

def attributes_and_interactivity(layer_infowindow, layer_tooltip)
click_fields = layer_infowindow['fields'] if layer_infowindow
hover_fields = layer_tooltip['fields'] if layer_tooltip

interactivity = []
attributes = {}

if hover_fields.present?
interactivity << hover_fields.map { |hover_field| hover_field.fetch('name') }
end

if click_fields.present?
interactivity << 'cartodb_id'

attributes = {
id: 'cartodb_id',
columns: click_fields.map { |click_field| click_field.fetch('name') }
}
end

[attributes, interactivity.join(',')]
end

def dataviews
dataviews = {}

Expand All @@ -182,22 +205,6 @@ def stats_aggregator
@@stats_aggregator_instance ||= CartoDB::Stats::EditorAPIs.instance
end

def infowindow_options(layer)
layer_options_interactivity = layer.options[:interactivity]
interactivity = layer_options_interactivity if layer_options_interactivity

layer_infowindow = layer.infowindow
layer_infowindow_fields = layer_infowindow['fields'] if layer_infowindow
attributes = if layer_infowindow_fields && !layer_infowindow_fields.empty?
{
id: 'cartodb_id',
columns: layer_infowindow['fields'].map { |field| field.fetch('name') }
}
end

[interactivity, attributes]
end

def dataview_data(widget)
options = widget.options.select { |k, _v| DATAVIEW_TEMPLATE_OPTIONS.include?(k) }
options[:aggregationColumn] = options.delete(:aggregation_column)
Expand Down
145 changes: 110 additions & 35 deletions spec/lib/carto/named_maps/template_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,41 @@ module NamedMaps
@template_hash[:layergroup][:layers].second[:type].should eq 'cartodb'
end

describe 'with infowindows' do
describe 'with popups' do
let(:dummy_infowindow) do
{
"fields" => [
{
"name" => "click_status",
"title" => true,
"position" => 8
}],
"template_name" => "table/views/infowindow_light",
"template" => "",
"alternative_names" => {},
"width" => 226,
"maxHeight" => 180
}
end

let(:dummy_tooltip) do
{
"fields" => [
{
"name" => "hover_status",
"title" => true,
"position" => 8
}],
"template_name" => "table/views/infowindow_light",
"template" => "",
"alternative_names" => {},
"width" => 226,
"maxHeight" => 180
}
end

before(:all) do
@carto_layer.options[:interactivity] = 'cartodb_id,manolo_status'
@carto_layer.options[:interactivity] = 'cartodb_id,click_status'
@carto_layer.save

@visualization.reload
Expand All @@ -74,67 +106,110 @@ module NamedMaps
@visualization.reload
end

describe 'triggered on hover' do
it 'interactivity should be present' do
template_hash = Carto::NamedMaps::Template.new(@visualization).to_hash
layer_options_hash = template_hash[:layergroup][:layers].second[:options]
describe 'triggered on hover only' do
before(:all) do
@carto_layer.tooltip = dummy_tooltip
@carto_layer.save

layer_options_hash[:interactivity].should be_present
end
@visualization.reload

it 'interactivity should be correct' do
template_hash = Carto::NamedMaps::Template.new(@visualization).to_hash
layer_options_hash = template_hash[:layergroup][:layers].second[:options]
@layer_options_hash = template_hash[:layergroup][:layers].second[:options]
end

layer_options_hash[:interactivity].should eq @carto_layer.options[:interactivity]
after(:all) do
@carto_layer.tooltip = nil
@carto_layer.save

@visualization.reload
@layer_options_hash = nil
end
end

describe 'triggered onclick' do
let(:dummy_infowindow) do
{
"fields" => [
{
"name" => "manolo_status",
"title" => true,
"position" => 8
}],
"template_name" => "table/views/infowindow_light",
"template" => "",
"alternative_names" => {},
"width" => 226,
"maxHeight" => 180
}
it 'interactivity contain fields but not cartodb_id' do
@layer_options_hash[:interactivity].should eq 'hover_status'
end

it 'should not contain attributes' do
@layer_options_hash[:attributes].should be_nil
end
end

describe 'triggered onclick only' do
before(:all) do
@carto_layer.infowindow = dummy_infowindow
@carto_layer.save

@visualization.reload

template_hash = Carto::NamedMaps::Template.new(@visualization).to_hash
@layer_options_hash = template_hash[:layergroup][:layers].second[:options]
end

after(:all) do
@carto_layer.infowindow = nil
@carto_layer.save

@visualization.reload
@layer_options_hash = nil
end

it 'attributes should be present' do
template_hash = Carto::NamedMaps::Template.new(@visualization).to_hash
layer_options_hash = template_hash[:layergroup][:layers].second[:options]
it 'interactivity should only contain cartodb_id' do
@layer_options_hash[:interactivity].should eq 'cartodb_id'
end

it 'should have attributes' do
@layer_options_hash[:attributes].should_not be_nil
@layer_options_hash[:attributes].should_not be_empty
end

it 'attributes should have id: cartodb_id' do
@layer_options_hash[:attributes][:id].should eq 'cartodb_id'
end

layer_options_hash[:attributes].should be_present
it 'attributes should contain correct columns' do
@layer_options_hash[:attributes][:columns].should eq ['click_status']
end
end

describe 'triggered onclick and onhover' do
before(:all) do
@carto_layer.infowindow = dummy_infowindow
@carto_layer.tooltip = dummy_tooltip
@carto_layer.save

@visualization.reload

it 'attributes should be correct' do
template_hash = Carto::NamedMaps::Template.new(@visualization).to_hash
layer_options_hash = template_hash[:layergroup][:layers].second[:options]
@layer_options_hash = template_hash[:layergroup][:layers].second[:options]
end

expected_attributes = { id: 'cartodb_id', columns: ['manolo_status'] }
after(:all) do
@carto_layer.infowindow = nil
@carto_layer.save

@visualization.reload
@layer_options_hash = nil
end

it 'interactivity should contain cartodb_id and selected columns' do
@layer_options_hash[:interactivity].should include 'cartodb_id'
@layer_options_hash[:interactivity].should_not include 'click_status'
@layer_options_hash[:interactivity].should include 'hover_status'
end

it 'should have attributes' do
@layer_options_hash[:attributes].should_not be_nil
@layer_options_hash[:attributes].should_not be_empty
end

it 'attributes should have id: cartodb_id' do
@layer_options_hash[:attributes][:id].should eq 'cartodb_id'
end

layer_options_hash[:attributes].should eq expected_attributes
it 'attributes should contain correct columns but not cartodb_id' do
@layer_options_hash[:attributes][:columns].should include 'click_status'
@layer_options_hash[:attributes][:columns].should_not include 'hover_status'
@layer_options_hash[:attributes][:columns].should_not include 'cartodb_id'
end
end
end
Expand Down

0 comments on commit bee7185

Please sign in to comment.