blacklight-maps 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +120 -42
  4. data/app/assets/javascripts/blacklight-maps.js +1 -2
  5. data/app/assets/javascripts/blacklight-maps/blacklight-maps-browse.js +122 -96
  6. data/app/assets/stylesheets/blacklight_maps/blacklight-maps.css.scss +5 -1
  7. data/app/assets/stylesheets/blacklight_maps/default.css.scss +74 -12
  8. data/app/helpers/blacklight/blacklight_maps_helper_behavior.rb +125 -0
  9. data/app/helpers/blacklight_maps_helper.rb +1 -24
  10. data/app/views/catalog/_document_maps.html.erb +1 -3
  11. data/app/views/catalog/_index_map.html.erb +7 -0
  12. data/app/views/catalog/_map_placename_search.html.erb +8 -0
  13. data/app/views/catalog/_map_spatial_search.html.erb +6 -0
  14. data/app/views/catalog/_show_maplet_default.html.erb +11 -0
  15. data/app/views/catalog/map.html.erb +8 -0
  16. data/blacklight-maps.gemspec +1 -2
  17. data/config/locales/blacklight-maps.en.yml +17 -1
  18. data/config/routes.rb +2 -2
  19. data/docs/blacklight-maps_index-view.png +0 -0
  20. data/docs/blacklight-maps_map-view.png +0 -0
  21. data/docs/blacklight-maps_search-control.png +0 -0
  22. data/docs/blacklight-maps_show-view.png +0 -0
  23. data/lib/blacklight/maps.rb +16 -0
  24. data/lib/blacklight/maps/controller_override.rb +33 -0
  25. data/lib/blacklight/maps/engine.rb +14 -6
  26. data/lib/blacklight/maps/export.rb +102 -61
  27. data/lib/blacklight/maps/render_constraints_override.rb +62 -0
  28. data/lib/blacklight/maps/version.rb +1 -1
  29. data/lib/generators/blacklight_maps/templates/blacklight_maps.css.scss +1 -1
  30. data/solr_conf/conf/schema.xml +4 -1
  31. data/spec/controllers/catalog_controller_spec.rb +22 -0
  32. data/spec/features/maps_spec.rb +194 -61
  33. data/spec/fixtures/sample_solr_documents.yml +73 -72
  34. data/spec/helpers/blacklight_maps_helper_spec.rb +134 -12
  35. data/spec/lib/blacklight/maps/controller_override_spec.rb +34 -0
  36. data/spec/lib/blacklight/maps/export_spec.rb +178 -35
  37. data/spec/lib/blacklight/maps/render_constraints_override_spec.rb +95 -0
  38. data/spec/spec_helper.rb +1 -1
  39. data/spec/test_app_templates/Gemfile.extra +0 -2
  40. metadata +22 -21
  41. data/app/views/catalog/_index_maps.html.erb +0 -9
  42. data/docs/map-sidebar.png +0 -0
  43. data/docs/map-view.png +0 -0
@@ -9,12 +9,17 @@ module BlacklightMaps
9
9
  include BlacklightMaps
10
10
 
11
11
  # controller is a Blacklight CatalogController object passed by a helper
12
- # response_docs is an array of documents passed by a helper
13
- def initialize(controller, response_docs)
12
+ # action is the controller action
13
+ # response_docs is passed by a helper, and is either:
14
+ # - index view, map view: an array of facet values
15
+ # - show view: the document object
16
+ def initialize(controller, action, response_docs)
14
17
  @controller = controller
18
+ @action = action
15
19
  @response_docs = response_docs
16
20
  end
17
21
 
22
+ # build the GeoJSON FeatureCollection
18
23
  def to_geojson
19
24
  geojson_docs = { type: 'FeatureCollection',
20
25
  features: build_geojson_features }
@@ -27,85 +32,121 @@ module BlacklightMaps
27
32
  @controller.blacklight_config.view.maps
28
33
  end
29
34
 
30
- def type
31
- blacklight_maps_config.type
35
+ def geojson_field
36
+ blacklight_maps_config.geojson_field
32
37
  end
33
38
 
34
- def placename_coord_field
35
- blacklight_maps_config.placename_coord_field
39
+ def coordinates_field
40
+ blacklight_maps_config.coordinates_field
36
41
  end
37
42
 
38
- def placename_coord_delimiter
39
- blacklight_maps_config.placename_coord_delimiter
43
+ def search_mode
44
+ blacklight_maps_config.search_mode
40
45
  end
41
46
 
42
- def bbox_field
43
- blacklight_maps_config.bbox_field
47
+ def facet_mode
48
+ blacklight_maps_config.facet_mode
44
49
  end
45
50
 
46
- def build_geojson_features
47
- case type
48
- when 'placename_coord'
49
- build_placename_coord_features
50
- when 'bbox'
51
- build_bbox_features
52
- else
53
- Rails.logger.error("Your Solr field type was not configured with a recognized type, '#{type}' is not yet supported")
54
- end
51
+ def placename_property
52
+ blacklight_maps_config.placename_property
55
53
  end
56
54
 
57
- # Builds the features structure for placename_coord type documents
58
- def build_placename_coord_features
55
+ # build GeoJSON features array
56
+ # determine how to build GeoJSON feature based on config and controller#action
57
+ def build_geojson_features
59
58
  features = []
60
- @response_docs.each do |doc|
61
- next if doc[placename_coord_field].nil?
62
- doc[placename_coord_field].uniq.each do |loc|
63
- values = loc.split(placename_coord_delimiter)
64
- features.push(
65
- build_point_feature(values[2], values[1],
66
- name: values[0],
67
- html: render_leaflet_sidebar_partial(doc)))
68
- end
59
+ case @action
60
+ when "index", "map"
61
+ @response_docs.each do |geofacet|
62
+ if facet_mode == "coordinates"
63
+ features.push(build_feature_from_coords(geofacet.value, geofacet.hits))
64
+ else
65
+ features.push(build_feature_from_geojson(geofacet.value, geofacet.hits))
66
+ end
67
+ end
68
+ when "show"
69
+ doc = @response_docs
70
+ return unless doc[geojson_field] || doc[coordinates_field]
71
+ if doc[geojson_field]
72
+ doc[geojson_field].uniq.each do |loc|
73
+ features.push(build_feature_from_geojson(loc))
74
+ end
75
+ elsif doc[coordinates_field]
76
+ doc[coordinates_field].uniq.each do |coords|
77
+ features.push(build_feature_from_coords(coords))
78
+ end
79
+ end
69
80
  end
70
81
  features
71
82
  end
72
83
 
73
- # Builds the features structure for bbox type documents
74
- def build_bbox_features
75
- features = []
76
- @response_docs.each do |doc|
77
- next if doc[bbox_field].nil?
78
- doc[bbox_field].uniq.each do |loc|
79
- lnglat = Geometry::BoundingBox.from_lon_lat_string(loc).find_center
80
- features.push(
81
- build_point_feature(lnglat[0], lnglat[1],
82
- html: render_leaflet_sidebar_partial(doc)))
83
- end
84
+ # build blacklight-maps GeoJSON feature from GeoJSON-formatted data
85
+ # turn bboxes into points for index view so we don't get weird mix of boxes and markers
86
+ def build_feature_from_geojson(loc, hits = nil)
87
+ geojson_hash = JSON.parse(loc).deep_symbolize_keys
88
+
89
+ if @action != "show" && geojson_hash[:bbox]
90
+ geojson_hash[:geometry][:coordinates] = Geometry::BoundingBox.new(geojson_hash[:bbox]).find_center
91
+ geojson_hash[:geometry][:type] = "Point"
92
+ geojson_hash.delete(:bbox)
84
93
  end
85
- features
94
+ geojson_hash[:properties] ||= {}
95
+ geojson_hash[:properties][:hits] = hits.to_i if hits
96
+ geojson_hash[:properties][:popup] = render_leaflet_popup_content(geojson_hash, hits)
97
+ geojson_hash
86
98
  end
87
99
 
88
- # Render to string the partial for each individual doc
89
- def render_leaflet_sidebar_partial(doc)
90
- @controller.render_to_string partial: 'catalog/index_maps',
91
- locals: { document: SolrDocument.new(doc) }
100
+ # build blacklight-maps GeoJSON feature from coordinate data
101
+ # turn bboxes into points for index view so we don't get weird mix of boxes and markers
102
+ def build_feature_from_coords(coords, hits = nil)
103
+ geojson_hash = {type: "Feature", geometry: {}, properties: {}}
104
+ if coords.scan(/[\s]/).length == 3 # bbox
105
+ if @action != "show"
106
+ geojson_hash[:geometry][:type] = "Point"
107
+ geojson_hash[:geometry][:coordinates] = Geometry::BoundingBox.from_lon_lat_string(coords).find_center
108
+ else
109
+ coords_array = coords.split(' ').map { |v| v.to_f }
110
+ geojson_hash[:bbox] = coords_array
111
+ geojson_hash[:geometry][:type] = "Polygon"
112
+ geojson_hash[:geometry][:coordinates] = [[[coords_array[0],coords_array[1]],
113
+ [coords_array[2],coords_array[1]],
114
+ [coords_array[2],coords_array[3]],
115
+ [coords_array[0],coords_array[3]],
116
+ [coords_array[0],coords_array[1]]]]
117
+ end
118
+ elsif coords.match(/^[-]?[\d]*[\.]?[\d]*[ ,][-]?[\d]*[\.]?[\d]*$/) # point
119
+ geojson_hash[:geometry][:type] = "Point"
120
+ if coords.match(/,/)
121
+ coords_array = coords.split(',').reverse
122
+ else
123
+ coords_array = coords.split(' ')
124
+ end
125
+ geojson_hash[:geometry][:coordinates] = coords_array.map { |v| v.to_f }
126
+ else
127
+ Rails.logger.error("This coordinate format is not yet supported: '#{coords}'")
128
+ end
129
+ geojson_hash[:properties] = { popup: render_leaflet_popup_content(geojson_hash, hits) } if geojson_hash[:geometry][:coordinates]
130
+ geojson_hash[:properties][:hits] = hits.to_i if hits
131
+ geojson_hash
92
132
  end
93
133
 
94
- # Build the individual feature which is added to the FeatureCollection.
95
- # lng is the longitude of the feature
96
- # lat is the latitude of the feature
97
- # *args additional arguments can be passed to the feature, these arguments
98
- # will be reflected in the 'properties' member.
99
- # html: "html string to show up" must be passed for the sidebar to display
100
- # list items
101
- def build_point_feature(lng, lat, *args)
102
- properties = args.extract_options!
103
- feature = { type: 'Feature',
104
- geometry: {
105
- type: 'Point',
106
- coordinates: [lng.to_f, lat.to_f] },
107
- properties: properties }
108
- feature
134
+ # Render to string the partial for each individual doc.
135
+ # For placename searching, render catalog/map_placename_search partial,
136
+ # full geojson hash is passed to the partial for easier local customization
137
+ # For coordinate searches (or features with only coordinate data),
138
+ # render catalog/map_coordinate_search partial
139
+ def render_leaflet_popup_content(geojson_hash, hits=nil)
140
+ if search_mode == 'placename' && geojson_hash[:properties][placename_property.to_sym]
141
+ @controller.render_to_string partial: 'catalog/map_placename_search',
142
+ locals: { geojson_hash: geojson_hash, hits: hits }
143
+ else
144
+ @controller.render_to_string partial: 'catalog/map_spatial_search',
145
+ locals: { coordinates: geojson_hash[:bbox].presence || geojson_hash[:geometry][:coordinates],
146
+ hits: hits }
147
+ end
109
148
  end
149
+
110
150
  end
151
+
111
152
  end
@@ -0,0 +1,62 @@
1
+ # Meant to be applied on top of Blacklight view helpers, to over-ride
2
+ # certain methods from RenderConstraintsHelper (newish in BL),
3
+ # to affect constraints rendering
4
+ module BlacklightMaps
5
+
6
+ module RenderConstraintsOverride
7
+
8
+ # BlacklightMaps override: update to look for spatial query params
9
+ def has_search_parameters?
10
+ has_spatial_parameters? || super
11
+ end
12
+
13
+ def has_spatial_parameters?
14
+ !params[:coordinates].blank?
15
+ end
16
+
17
+ # BlacklightMaps override: check for coordinate parameters
18
+ def query_has_constraints?(localized_params = params)
19
+ has_search_parameters? || super
20
+ end
21
+
22
+ # BlacklightMaps override: include render_spatial_query() in rendered constraints
23
+ def render_constraints(localized_params = params)
24
+ render_spatial_query(localized_params) + super
25
+ end
26
+
27
+ # BlacklightMaps override: include render_search_to_s_coord() in rendered constraints
28
+ # Simpler textual version of constraints, used on Search History page.
29
+ def render_search_to_s(params)
30
+ render_search_to_s_coord(params) + super
31
+ end
32
+
33
+ ##
34
+ # Render the search query constraint
35
+ def render_search_to_s_coord(params)
36
+ return "".html_safe if params[:coordinates].blank?
37
+ render_search_to_s_element(spatial_constraint_label(params), render_filter_value(params[:coordinates]) )
38
+ end
39
+
40
+ # Render the spatial query constraints
41
+ def render_spatial_query(localized_params = params)
42
+ # So simple don't need a view template, we can just do it here.
43
+ scope = localized_params.delete(:route_set) || self
44
+ return ''.html_safe if localized_params[:coordinates].blank?
45
+
46
+ render_constraint_element(spatial_constraint_label(localized_params),
47
+ localized_params[:coordinates],
48
+ :classes => ['coordinates'],
49
+ :remove => scope.url_for(localized_params.merge(:coordinates=>nil,
50
+ :spatial_search_type=>nil,
51
+ :action=>'index')))
52
+ end
53
+
54
+ def spatial_constraint_label(params)
55
+ (params[:spatial_search_type] && params[:spatial_search_type] == 'bbox') ?
56
+ t('blacklight.search.filters.coordinates.bbox') :
57
+ t('blacklight.search.filters.coordinates.point')
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -1,5 +1,5 @@
1
1
  module Blacklight
2
2
  module Maps
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -1,3 +1,3 @@
1
1
  /*
2
- *= require blacklight_maps/default
2
+ *= require blacklight_maps/blacklight-maps
3
3
  */
@@ -534,7 +534,10 @@
534
534
  <field name="format" type="string" indexed="true" stored="true"/>
535
535
 
536
536
  <!-- addition -->
537
- <field name="placename_coords" type="string" indexed="true" stored="true" multiValued="true"/>
537
+ <field name="geojson" type="string" indexed="true" stored="true" multiValued="true"/>
538
+ <field name="coordinates" type="location_rpt" stored="true" indexed="true" multiValued="true"/>
539
+ <!-- copy coordinates to string field for faceting -->
540
+ <copyField source="coordinates" dest="coordinates_facet" />
538
541
 
539
542
  <!-- Dynamic field definitions. If a field name is not found, dynamicFields
540
543
  will be used if the name matches any of the patterns.
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe CatalogController do
4
+
5
+ render_views
6
+
7
+ describe "GET 'map'" do
8
+
9
+ before { get :map }
10
+
11
+ it "should respond to the #map action" do
12
+ response.should be_success
13
+ assigns(:document_list).should_not be_nil
14
+ end
15
+
16
+ it "should render the '/map' page" do
17
+ response.body.should have_selector("body.blacklight-catalog-map")
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -2,111 +2,244 @@ require 'spec_helper'
2
2
 
3
3
  describe "Map View", js: true do
4
4
 
5
- describe "using placename coords" do
6
- before do
7
- CatalogController.blacklight_config = Blacklight::Configuration.new
8
- CatalogController.configure_blacklight do |config|
9
- config.view.maps.type = 'placename_coord'
10
- config.view.maps.placename_coord_delimiter = '-|-'
11
- # These fields also need to be added for some reason for the tests to pass
12
- # Link in list is not being generated correctly if not passed
13
- config.index.title_field = 'title_display'
5
+ before :each do
6
+ CatalogController.blacklight_config = Blacklight::Configuration.new
7
+ end
8
+
9
+ describe "catalog#index and catalog#map views" do
10
+
11
+ describe "catalog#index map view" do
12
+
13
+ before :each do
14
+ CatalogController.configure_blacklight do |config|
15
+ # use geojson facet for blacklight-maps catalog#index map view specs
16
+ config.add_facet_field 'geojson', :limit => -2, :label => 'GeoJSON', :show => false
17
+ config.add_facet_fields_to_solr_request!
18
+ end
19
+ visit catalog_index_path :q => 'korea', :view => 'maps'
14
20
  end
15
- end
16
21
 
17
- before { visit catalog_index_path :q => 'tibet', :view => 'maps' }
22
+ it "should display map elements" do
23
+ expect(page).to have_selector("#documents.map")
24
+ expect(page).to have_selector("#blacklight-index-map")
25
+ end
18
26
 
19
- it "should display map elements" do
20
- expect(page).to have_selector("#documents.map")
21
- expect(page).to have_selector("#blacklight-map")
22
- expect(page).to have_selector("#blacklight-map-sidebar")
23
- end
27
+ it "should display tile layer attribution" do
28
+ expect(find("div.leaflet-control-container")).to have_content('OpenStreetMap contributors, CC-BY-SA')
29
+ end
24
30
 
25
- describe "data attributes" do
31
+ describe "#sortAndPerPage" do
32
+
33
+ it "should show the mapped item count" do
34
+ expect(page).to have_selector(".mapped-count .badge", text: "4")
35
+ end
36
+
37
+ it "should show the mapped item caveat" do
38
+ expect(page).to have_selector(".mapped-caveat")
39
+ end
40
+
41
+ # TODO: placeholder spec: #sortAndPerPage > .view-type > .view-type-group
42
+ # should show active map icon. however, this spec doesn't work because
43
+ # Blacklight::ConfigurationHelperBehavior#has_alternative_views? returns false,
44
+ # so catalog/_view_type_group partial renders no content, can't figure out why
45
+ it "should show the map view icon" #do
46
+ #expect(page).to have_selector(".view-type-maps.active")
47
+ #end
26
48
 
27
- it "maxzoom should be 8" do
28
- expect(page).to have_selector("#blacklight-map[data-maxzoom='8']")
29
49
  end
30
50
 
31
- it "type should be placename_coord" do
32
- expect(page).to have_selector("#blacklight-map[data-type='placename_coord']")
51
+ describe "data attributes" do
52
+
53
+ it "maxzoom should be from config" do
54
+ expect(page).to have_selector("#blacklight-index-map[data-maxzoom='#{CatalogController.blacklight_config.view.maps.maxzoom}']")
55
+ end
56
+
57
+ it "tileurl should be from config" do
58
+ expect(page).to have_selector("#blacklight-index-map[data-tileurl='#{CatalogController.blacklight_config.view.maps.tileurl}']")
59
+ end
60
+
33
61
  end
34
62
 
35
- it "tileurl should be OSM" do
36
- expect(page).to have_selector("#blacklight-map[data-tileurl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png']")
63
+ describe "marker clusters" do
64
+
65
+ before {
66
+ 0.upto(2) { find("a.leaflet-control-zoom-out").click } # zoom out to create cluster
67
+ }
68
+
69
+ it "should have marker cluster div" do
70
+ expect(page).to have_selector("div.marker-cluster")
71
+ end
72
+
73
+ it "should only have one marker cluster" do
74
+ expect(page).to have_selector("div.marker-cluster", count: 1)
75
+ end
76
+
77
+ it "should show the result count" do
78
+ expect(find("div.marker-cluster")).to have_content(4)
79
+ end
80
+
81
+ describe "click marker cluster" do
82
+
83
+ before { find("div.marker-cluster").click }
84
+
85
+ it "should split into two marker clusters" do
86
+ expect(page).to have_selector("div.marker-cluster", count: 2)
87
+ end
88
+
89
+ end
90
+
37
91
  end
38
92
 
39
- end
93
+ describe "marker popups" do
40
94
 
41
- describe "marker clusters" do
95
+ before { find(".marker-cluster:first-child").click }
96
+
97
+ it "should show a popup with correct content" do
98
+ expect(page).to have_selector("div.leaflet-popup-content-wrapper")
99
+ expect(page).to have_content("Seoul (Korea)")
100
+ end
101
+
102
+ describe "click search link" do
103
+
104
+ before { find("div.leaflet-popup-content a").click }
105
+
106
+ it "should run a new search" do
107
+ expect(page).to have_selector(".constraint-value .filterValue", text: "Seoul (Korea)")
108
+ end
109
+
110
+ end
42
111
 
43
- it "should have marker cluster div" do
44
- expect(page).to have_selector("div.marker-cluster")
45
112
  end
46
113
 
47
- it "should only have one marker cluster" do
48
- expect(page).to have_selector('div.marker-cluster', count: 1)
114
+ describe "map search control" do
115
+
116
+ it "should have a search control" do
117
+ expect(page).to have_selector(".leaflet-control .search-control")
118
+ end
119
+
120
+ describe "search control hover" do
121
+
122
+ before { find(".search-control").hover }
123
+
124
+ it "should add a border to the map" do
125
+ expect(page).to have_selector(".leaflet-overlay-pane path")
126
+ end
127
+
128
+ end
129
+
130
+ describe "search control click" do
131
+
132
+ before { find(".search-control").click }
133
+
134
+ it "should run a new search" do
135
+ expect(page).to have_selector(".constraint.coordinates")
136
+ end
137
+
138
+ end
139
+
49
140
  end
50
141
 
51
- it "should have 4 markers" do
52
- expect(find("div.marker-cluster")).to have_content(4)
142
+ end
143
+
144
+ describe "catalog#map view" do
145
+
146
+ before :each do
147
+ CatalogController.configure_blacklight do |config|
148
+ # use coordinates_facet facet for blacklight-maps catalog#map view specs
149
+ config.view.maps.facet_mode = 'coordinates'
150
+ config.view.maps.coordinates_facet_field = 'coordinates_facet'
151
+ config.add_facet_field 'coordinates_facet', :limit => -2, :label => 'Coordinates', :show => false
152
+ config.add_facet_fields_to_solr_request!
153
+ end
154
+ visit map_path
155
+ #print page.html # debugging
53
156
  end
54
157
 
55
- it "should display tile layer attribution" do
56
- expect(find("div.leaflet-control-container")).to have_content('OpenStreetMap contributors, CC-BY-SA')
158
+ it "should display map elements" do
159
+ expect(page).to have_selector("#documents.map")
160
+ expect(page).to have_selector("#blacklight-index-map")
57
161
  end
58
162
 
59
- describe "Click Marker cluster" do
60
- before { find("div.marker-cluster").click }
163
+ it "should display some markers" do
164
+ expect(page).to have_selector("div.marker-cluster")
165
+ end
166
+
167
+ describe "marker popups" do
61
168
 
62
- it "should have three marker clusters" do
63
- expect(page).to have_selector('div.marker-cluster', count: 3)
169
+ before :each do
170
+ 0.upto(1) { find("a.leaflet-control-zoom-in").click } # zoom in
171
+ find(".marker-cluster:first-child").click
64
172
  end
65
173
 
66
- describe "Click low level marker cluster" do
67
- before { find("div.marker-cluster[title='India']").click }
174
+ it "should show a popup with correct content" do
175
+ expect(page).to have_selector("div.leaflet-popup-content-wrapper")
176
+ expect(page).to have_content("[35.86166, 104.195397]")
177
+ end
68
178
 
69
- it "should show sidebar with content" do
70
- expect(page).to have_content("es yon")
71
- end
179
+ describe "click search link" do
72
180
 
73
- describe "Navigate to catalog page" do
74
- before { click_link("es yon") }
181
+ before { find("div.leaflet-popup-content a").click }
75
182
 
76
- it "should show page with content" do
77
- expect(page).to have_content("es yon")
78
- end
183
+ it "should run a new search" do
184
+ expect(page).to have_selector(".constraint-value .filterValue", text: "35.86166,104.195397")
79
185
  end
186
+
80
187
  end
188
+
81
189
  end
190
+
82
191
  end
192
+
83
193
  end
84
194
 
85
- describe "using bounding box" do
86
- before do
87
- CatalogController.blacklight_config = Blacklight::Configuration.new
195
+ describe "catalog#show maplet view" do
196
+
197
+ before :each do
88
198
  CatalogController.configure_blacklight do |config|
89
- config.view.maps.type = 'bbox'
90
- config.view.maps.bbox_field = 'place_bbox'
199
+ # add maplet to show partials
200
+ config.show.partials << :show_maplet
91
201
  end
202
+ visit catalog_path('2008308175')
203
+ end
204
+
205
+ it "should show the maplet" do
206
+ expect(page).to have_selector("#blacklight-show-map")
92
207
  end
93
208
 
94
- before { visit catalog_index_path :q => 'korea', :view => 'maps' }
209
+ it "should show the mapped item count" do
210
+ expect(page).to have_selector(".mapped-count .badge", text: "2")
211
+ end
95
212
 
96
- it "should have 4 markers" do
97
- expect(find("div.marker-cluster")).to have_content(4)
213
+ it "should show a bounding box and a point marker" do
214
+ expect(page).to have_selector(".leaflet-overlay-pane path.leaflet-clickable")
215
+ expect(page).to have_selector(".leaflet-marker-icon")
98
216
  end
99
217
 
100
- it "should display number mapped" do
101
- expect(page).to have_content('4 mapped')
218
+ describe "click marker icon" do
219
+
220
+ before { find(".leaflet-marker-icon").click }
221
+
222
+ it "should show a popup with correct content" do
223
+ expect(page).to have_selector("div.leaflet-popup-content-wrapper")
224
+ expect(page).to have_content("India")
225
+ end
226
+
102
227
  end
103
228
 
104
- describe "click marker cluster" do
105
- before { find("div.marker-cluster").click }
229
+ describe "click bbox path" do
106
230
 
107
- it "should split into 2 markers" do
108
- expect(page).to have_selector('div.marker-cluster', count: 2)
231
+ before do
232
+ 0.upto(4) { find("a.leaflet-control-zoom-in").click } #so bbox not covered by point
233
+ find(".leaflet-overlay-pane svg").click
109
234
  end
235
+
236
+ it "should show a popup with correct content" do
237
+ expect(page).to have_selector("div.leaflet-popup-content-wrapper")
238
+ expect(page).to have_content("[68.162386, 6.7535159, 97.395555, 35.5044752]")
239
+ end
240
+
110
241
  end
242
+
111
243
  end
244
+
112
245
  end