geoblacklight 4.0.0.pre.alpha.1 → 4.0.0.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +1 -1
  3. data/.github/workflows/ruby.yml +32 -64
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +6 -6
  6. data/.rubocop_todo.yml +0 -3
  7. data/.solr_wrapper +1 -0
  8. data/README.md +1 -4
  9. data/Rakefile +0 -1
  10. data/app/assets/images/blacklight/child-item.svg +3 -0
  11. data/app/assets/images/blacklight/collections.svg +4 -0
  12. data/app/assets/images/blacklight/datasets.svg +7 -0
  13. data/app/assets/images/blacklight/geoblacklight-icons.json +363 -332
  14. data/app/assets/images/blacklight/imagery.svg +4 -0
  15. data/app/assets/images/blacklight/maps.svg +4 -0
  16. data/app/assets/images/blacklight/michigan-state-university.svg +0 -1
  17. data/app/assets/images/blacklight/parent-item.svg +3 -0
  18. data/app/assets/images/blacklight/pennsylvania-state-university.svg +0 -1
  19. data/app/assets/images/blacklight/purdue-university.svg +0 -1
  20. data/app/assets/images/blacklight/the-ohio-state-university.svg +0 -1
  21. data/app/assets/images/blacklight/university-of-chicago.svg +0 -1
  22. data/app/assets/images/blacklight/university-of-colorado-boulder.svg +6 -0
  23. data/app/assets/images/blacklight/university-of-illinois-urbana-champaign.svg +0 -1
  24. data/app/assets/images/blacklight/university-of-iowa.svg +0 -1
  25. data/app/assets/images/blacklight/university-of-maryland.svg +0 -1
  26. data/app/assets/images/blacklight/university-of-michigan.svg +0 -1
  27. data/app/assets/images/blacklight/university-of-minnesota.svg +0 -1
  28. data/app/assets/images/blacklight/university-of-nebraska-lincoln.svg +0 -1
  29. data/app/assets/images/blacklight/university-of-wisconsin-madison.svg +0 -1
  30. data/app/assets/images/blacklight/websites.svg +4 -0
  31. data/app/assets/javascripts/geoblacklight/controls/fullscreen.js +8 -0
  32. data/app/assets/javascripts/geoblacklight/geoblacklight.js +2 -1
  33. data/app/assets/javascripts/geoblacklight/viewers/esri.js +1 -0
  34. data/app/assets/javascripts/geoblacklight/viewers/index_map.js +1 -0
  35. data/app/assets/javascripts/geoblacklight/viewers/tilejson.js +33 -0
  36. data/app/assets/javascripts/geoblacklight/viewers/tms.js +2 -2
  37. data/app/assets/javascripts/geoblacklight/viewers/viewer.js +3 -0
  38. data/app/assets/javascripts/geoblacklight/viewers/wms.js +2 -2
  39. data/app/assets/javascripts/geoblacklight/viewers/wmts.js +85 -0
  40. data/app/assets/javascripts/geoblacklight/viewers/xyz.js +10 -0
  41. data/app/assets/stylesheets/geoblacklight/geoblacklight.scss +1 -0
  42. data/app/assets/stylesheets/geoblacklight/modules/_base.scss +0 -1
  43. data/app/assets/stylesheets/geoblacklight/modules/_styles.scss +5 -1
  44. data/app/assets/stylesheets/geoblacklight/modules/downloads.scss +20 -47
  45. data/app/assets/stylesheets/geoblacklight/modules/index_maps.scss +68 -0
  46. data/app/assets/stylesheets/geoblacklight/modules/item.scss +16 -0
  47. data/app/assets/stylesheets/geoblacklight/modules/modal.scss +6 -0
  48. data/app/assets/stylesheets/geoblacklight/modules/sidebar.scss +4 -0
  49. data/app/components/geoblacklight/icon_facet_item_component.rb +33 -0
  50. data/app/helpers/geoblacklight_helper.rb +6 -45
  51. data/app/models/concerns/geoblacklight/bbox_filter_field.rb +45 -0
  52. data/app/models/concerns/geoblacklight/bbox_filter_query.rb +50 -0
  53. data/app/models/concerns/geoblacklight/solr_document.rb +1 -1
  54. data/app/models/concerns/geoblacklight/suppressed_records_search_behavior.rb +26 -0
  55. data/app/presenters/geoblacklight/bbox_item_presenter.rb +9 -0
  56. data/app/views/catalog/_downloads_collapse.html.erb +27 -0
  57. data/app/views/catalog/_header_icons.html.erb +2 -2
  58. data/app/views/catalog/_index_split_default.html.erb +2 -2
  59. data/app/views/catalog/_show_default_viewer_container.html.erb +17 -0
  60. data/app/views/catalog/_show_downloads.html.erb +10 -21
  61. data/app/views/catalog/_show_sidebar.html.erb +3 -0
  62. data/app/views/catalog/_show_web_services.html.erb +11 -0
  63. data/app/views/catalog/_web_services.html.erb +3 -2
  64. data/app/views/catalog/web_services.html.erb +1 -1
  65. data/app/views/relation/_relations.html.erb +1 -1
  66. data/app/views/relation/index.html.erb +1 -1
  67. data/config/locales/geoblacklight.en.yml +4 -1
  68. data/geoblacklight.gemspec +6 -6
  69. data/lib/generators/geoblacklight/install_generator.rb +1 -1
  70. data/lib/generators/geoblacklight/templates/assets/_customizations.scss +5 -4
  71. data/lib/generators/geoblacklight/templates/assets/application.scss +0 -3
  72. data/lib/generators/geoblacklight/templates/catalog_controller.rb +74 -56
  73. data/lib/generators/geoblacklight/templates/settings.gbl_v1.yml +5 -5
  74. data/lib/generators/geoblacklight/templates/settings.yml +36 -23
  75. data/lib/geoblacklight/bounding_box.rb +4 -0
  76. data/lib/geoblacklight/constants.rb +3 -0
  77. data/lib/geoblacklight/engine.rb +3 -2
  78. data/lib/geoblacklight/faraday_middleware/follow_redirects.rb +176 -0
  79. data/lib/geoblacklight/item_viewer.rb +13 -1
  80. data/lib/geoblacklight/metadata/base.rb +2 -1
  81. data/lib/geoblacklight/version.rb +1 -1
  82. data/lib/geoblacklight/view_helper_override.rb +2 -28
  83. data/lib/geoblacklight.rb +0 -10
  84. data/lib/tasks/geoblacklight.rake +1 -1
  85. data/schema/geoblacklight-schema-aardvark.json +3 -23
  86. data/solr/conf/schema.xml +37 -43
  87. data/solr/conf/solrconfig.xml +17 -17
  88. data/spec/components/geoblacklight/icon_facet_item_component_spec.rb +17 -0
  89. data/spec/controllers/catalog_controller_spec.rb +1 -1
  90. data/spec/features/download_layer_spec.rb +31 -14
  91. data/spec/features/esri_viewer_spec.rb +5 -1
  92. data/spec/features/full_screen_controll_spec.rb +15 -0
  93. data/spec/features/home_page_spec.rb +2 -2
  94. data/spec/features/index_map_spec.rb +2 -2
  95. data/spec/features/missing_metadata_spec.rb +1 -1
  96. data/spec/features/multiple_downloads_spec.rb +2 -1
  97. data/spec/features/relations_spec.rb +1 -1
  98. data/spec/features/saved_searches_spec.rb +1 -1
  99. data/spec/features/search_results_complex_geometry_spec.rb +24 -0
  100. data/spec/features/search_results_icons_spec.rb +16 -0
  101. data/spec/features/search_results_map_spec.rb +2 -2
  102. data/spec/features/search_spec.rb +22 -0
  103. data/spec/features/show_page_download_spec.rb +29 -0
  104. data/spec/features/show_page_metadata_spec.rb +2 -2
  105. data/spec/features/split_view.html.erb_spec.rb +12 -1
  106. data/spec/features/tilejson_spec.rb +22 -0
  107. data/spec/features/tms_spec.rb +2 -2
  108. data/spec/features/web_services_modal_spec.rb +35 -2
  109. data/spec/features/wmts_spec.rb +34 -0
  110. data/spec/features/xyz_spec.rb +10 -0
  111. data/spec/fixtures/manifests/tilejson.json +21 -0
  112. data/spec/fixtures/manifests/wmts-multiple.xml +813 -0
  113. data/spec/fixtures/manifests/wmts-single.xml +126 -0
  114. data/spec/fixtures/solr_documents/README.md +46 -43
  115. data/spec/fixtures/solr_documents/actual-papermap1.json +2 -1
  116. data/spec/fixtures/solr_documents/actual-point1.json +2 -1
  117. data/spec/fixtures/solr_documents/actual-polygon1.json +2 -1
  118. data/spec/fixtures/solr_documents/actual-raster1.json +3 -2
  119. data/spec/fixtures/solr_documents/baruch_ancestor1.json +2 -1
  120. data/spec/fixtures/solr_documents/baruch_ancestor2.json +2 -1
  121. data/spec/fixtures/solr_documents/baruch_documentation_download.json +1 -1
  122. data/spec/fixtures/solr_documents/bbox-spans-180.json +2 -1
  123. data/spec/fixtures/solr_documents/cornell_html_metadata.json +4 -3
  124. data/spec/fixtures/solr_documents/esri-dynamic-layer-all-layers.json +3 -2
  125. data/spec/fixtures/solr_documents/esri-dynamic-layer-single-layer.json +3 -2
  126. data/spec/fixtures/solr_documents/esri-feature-layer.json +2 -1
  127. data/spec/fixtures/solr_documents/esri-image-map-layer.json +3 -2
  128. data/spec/fixtures/solr_documents/esri-tiled_map_layer.json +2 -1
  129. data/spec/fixtures/solr_documents/esri-wms-layer.json +2 -1
  130. data/spec/fixtures/solr_documents/harvard_raster.json +3 -2
  131. data/spec/fixtures/solr_documents/iiif-eastern-hemisphere.json +3 -2
  132. data/spec/fixtures/solr_documents/index-map-polygon-no-downloadurl.json +2 -1
  133. data/spec/fixtures/solr_documents/index-map-polygon.json +2 -1
  134. data/spec/fixtures/solr_documents/index-map-stanford.json +2 -1
  135. data/spec/fixtures/solr_documents/index_map_point.json +3 -2
  136. data/spec/fixtures/solr_documents/metadata_no_provider.json +2 -1
  137. data/spec/fixtures/solr_documents/multiple-downloads.json +3 -2
  138. data/spec/fixtures/solr_documents/no_spatial.json +1 -4
  139. data/spec/fixtures/solr_documents/oembed.json +2 -1
  140. data/spec/fixtures/solr_documents/princeton-child1.json +3 -2
  141. data/spec/fixtures/solr_documents/princeton-child2.json +3 -2
  142. data/spec/fixtures/solr_documents/princeton-child3.json +2 -1
  143. data/spec/fixtures/solr_documents/princeton-child4.json +3 -2
  144. data/spec/fixtures/solr_documents/princeton-parent.json +5 -3
  145. data/spec/fixtures/solr_documents/public_direct_download.json +2 -1
  146. data/spec/fixtures/solr_documents/public_iiif_princeton.json +3 -2
  147. data/spec/fixtures/solr_documents/public_polygon_mit.json +2 -1
  148. data/spec/fixtures/solr_documents/restricted-line.json +2 -1
  149. data/spec/fixtures/solr_documents/tilejson.json +48 -0
  150. data/spec/fixtures/solr_documents/tms.json +15 -18
  151. data/spec/fixtures/solr_documents/umn_metro_result1.json +5 -3
  152. data/spec/fixtures/solr_documents/umn_state_result1.json +3 -2
  153. data/spec/fixtures/solr_documents/umn_state_result2.json +3 -5
  154. data/spec/fixtures/solr_documents/uva_slug_colon.json +2 -1
  155. data/spec/fixtures/solr_documents/wmts-multiple.json +41 -0
  156. data/spec/fixtures/solr_documents/wmts-single-layer.json +48 -0
  157. data/spec/fixtures/solr_documents/xyz.json +46 -0
  158. data/spec/helpers/geoblacklight_helper_spec.rb +12 -35
  159. data/spec/lib/geoblacklight/document_presenter_spec.rb +3 -3
  160. data/spec/lib/geoblacklight/download/geojson_download_spec.rb +1 -1
  161. data/spec/lib/geoblacklight/download/geotiff_download_spec.rb +1 -1
  162. data/spec/lib/geoblacklight/download/kmz_download_spec.rb +1 -1
  163. data/spec/lib/geoblacklight/download/shapefile_download_spec.rb +1 -1
  164. data/spec/lib/geoblacklight/download_spec.rb +2 -2
  165. data/spec/lib/geoblacklight/metadata/base_spec.rb +19 -1
  166. data/spec/lib/geoblacklight/references_spec.rb +1 -1
  167. data/spec/lib/geoblacklight/relation/relation_response_spec.rb +5 -0
  168. data/spec/lib/geoblacklight/view_helper_override_spec.rb +0 -10
  169. data/spec/models/concerns/geoblacklight/bbox_filter_field_spec.rb +77 -0
  170. data/spec/models/concerns/geoblacklight/bbox_filter_query_spec.rb +105 -0
  171. data/spec/models/concerns/geoblacklight/solr_document/inspection_spec.rb +2 -1
  172. data/spec/models/concerns/geoblacklight/suppressed_records_search_behavior_spec.rb +31 -0
  173. data/spec/presenters/geoblacklight/bbox_item_presenter_spec.rb +36 -0
  174. data/spec/spec_helper.rb +6 -1
  175. data/spec/test_app_templates/Gemfile.extra +1 -0
  176. data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -4
  177. data/spec/views/catalog/_show_downloads.html.erb_spec.rb +5 -5
  178. data/template.rb +2 -4
  179. data/vendor/assets/images/fullscreen.png +0 -0
  180. data/vendor/assets/images/fullscreen@2x.png +0 -0
  181. data/vendor/assets/javascripts/Leaflet.fullscreen.js +152 -0
  182. data/vendor/assets/javascripts/esri-leaflet.js +10 -3
  183. data/vendor/assets/javascripts/esri-leaflet.js.map +1 -1
  184. data/vendor/assets/javascripts/leaflet-iiif.js +39 -18
  185. data/vendor/assets/javascripts/leaflet-src.js.erb +14062 -0
  186. data/vendor/assets/javascripts/leaflet-src.js.map +1 -1
  187. data/vendor/assets/stylesheets/leaflet.css +640 -634
  188. data/vendor/assets/stylesheets/leaflet.fullscreen.css +40 -0
  189. metadata +91 -46
  190. data/app/models/concerns/geoblacklight/spatial_search_behavior.rb +0 -71
  191. data/app/views/catalog/_download_generated_link.html.erb +0 -4
  192. data/app/views/catalog/_download_link.html.erb +0 -3
  193. data/app/views/catalog/_downloads_generated.html.erb +0 -6
  194. data/app/views/catalog/_downloads_primary.html.erb +0 -21
  195. data/app/views/catalog/_downloads_secondary.html.erb +0 -39
  196. data/app/views/catalog/_icon_facet.html.erb +0 -16
  197. data/bin/coverage.rb +0 -36
  198. data/lib/generators/geoblacklight/templates/Procfile +0 -3
  199. data/lib/generators/geoblacklight/templates/package.json +0 -14
  200. data/lib/generators/geoblacklight/templates/webpacker.yml +0 -67
  201. data/lib/generators/geoblacklight/webpacker_generator.rb +0 -36
  202. data/lib/geoblacklight/catalog_helper_override.rb +0 -14
  203. data/spec/models/concerns/geoblacklight/spatial_search_behavior_spec.rb +0 -97
  204. data/vendor/assets/javascripts/leaflet.js.erb +0 -13922
  205. data/vendor/assets/stylesheets/leaflet-label.css +0 -54
@@ -5,3 +5,71 @@
5
5
  margin: 5px 0;
6
6
  }
7
7
  }
8
+
9
+ #map[data-protocol="IndexMap"] {
10
+ .leaflet-interactive {
11
+ stroke: black;
12
+ fill-opacity: 0.65;
13
+ }
14
+ }
15
+
16
+ .index-map-legend {
17
+ font-size: 15px;
18
+ display: flex;
19
+ position: absolute;
20
+ right: 15px;
21
+ top: -2px;
22
+ left: 90px;
23
+
24
+ &-info {
25
+ display: flex;
26
+ flex-wrap: nowrap;
27
+ align-items: center;
28
+ margin-left: 15px;
29
+ }
30
+
31
+ span {
32
+ display: inline-block;
33
+ border: 1px solid black;
34
+ margin-right: 10px;
35
+ height: 24px;
36
+ width: 24px;
37
+ min-height: 24px;
38
+ min-width: 24px;
39
+ }
40
+
41
+ p {
42
+ margin-bottom: 0;
43
+ }
44
+
45
+ &-default {
46
+ background: #7FCDBB;
47
+ }
48
+ &-unavailable {
49
+ background: #EDF8B1;
50
+ }
51
+ &-selected {
52
+ background: #2C7FB8;
53
+ }
54
+ &-default, &-unavailable, &-selected {
55
+ opacity: 0.65;
56
+ }
57
+
58
+ @media(max-width: 768px){
59
+ position: revert;
60
+ margin-bottom: 1.25rem;
61
+
62
+ :first-child {
63
+ margin-left: 0;
64
+ }
65
+ }
66
+
67
+ @media(max-width: 480px){
68
+ display: block;
69
+
70
+ .index-map-legend-info {
71
+ margin-left: 0;
72
+ margin-bottom: 10px;
73
+ }
74
+ }
75
+ }
@@ -9,6 +9,11 @@
9
9
  [data-map="item"] {
10
10
  border: 1px solid $gray-400;
11
11
  height: 27.5rem;
12
+
13
+ // Ensure oembed iframe is the same height as its container
14
+ iframe {
15
+ height: 27.5rem;
16
+ }
12
17
  }
13
18
 
14
19
  [data-inspect="true"][data-available="true"] {
@@ -19,6 +24,7 @@
19
24
  cursor: crosshair;
20
25
  }
21
26
  }
27
+ margin-bottom: 1rem;
22
28
  }
23
29
 
24
30
  .help-text {
@@ -36,4 +42,14 @@
36
42
  -webkit-box-orient: vertical;
37
43
  -webkit-line-clamp: 8;
38
44
  }
45
+
46
+ #table-container{
47
+ overflow:scroll;
48
+ max-height: 450px;
49
+ margin-bottom: 1rem;
50
+
51
+ table {
52
+ margin-bottom: 0px;
53
+ }
54
+ }
39
55
  }
@@ -12,3 +12,9 @@
12
12
  }
13
13
 
14
14
  }
15
+
16
+ // Add some separation between web services entries
17
+ .web-services-modal-body > div + div {
18
+ border-top: 1px solid #dee2e6;
19
+ padding-top: 1rem;
20
+ }
@@ -28,3 +28,7 @@
28
28
  }
29
29
  }
30
30
  }
31
+
32
+ .card.relations {
33
+ margin-bottom: 20px;
34
+ }
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Geoblacklight
4
+ # Display facet values with a decorative icon
5
+ # @example Usage in the blacklight configuration:
6
+ # config.add_facet_field 'provider_facet', [...], item_component: Geoblacklight::IconFacetItemComponent
7
+ class IconFacetItemComponent < Blacklight::FacetItemComponent
8
+ delegate :safe_join, :geoblacklight_icon, to: :helpers
9
+
10
+ def initialize(facet_item:, **)
11
+ super
12
+
13
+ # store a copy of the original label value
14
+ @undecorated_label = @label
15
+ end
16
+
17
+ def before_render
18
+ # replace the original label with an icon-decorated version; this has to be done in
19
+ # #before_render or #render so we have access to the icon helpers.
20
+ @label = decorated_label
21
+
22
+ super
23
+ end
24
+
25
+ private
26
+
27
+ def decorated_label
28
+ icon = geoblacklight_icon(@facet_item.value, aria_hidden: true, classes: 'svg_tooltip')
29
+
30
+ safe_join([icon, @undecorated_label], ' ')
31
+ end
32
+ end
33
+ end
@@ -17,7 +17,6 @@ module GeoblacklightHelper
17
17
  label,
18
18
  url,
19
19
  'contentUrl' => url,
20
- class: ['btn', 'btn-default', 'download', 'download-original'],
21
20
  data: {
22
21
  download: 'trigger',
23
22
  download_type: 'direct',
@@ -30,7 +29,6 @@ module GeoblacklightHelper
30
29
  link_to(
31
30
  text,
32
31
  download_hgl_path(id: document),
33
- class: ['btn', 'btn-default', 'download', 'download-original'],
34
32
  data: {
35
33
  blacklight_modal: 'trigger',
36
34
  download: 'trigger',
@@ -47,7 +45,6 @@ module GeoblacklightHelper
47
45
  download_text('JPG'),
48
46
  iiif_jpg_url,
49
47
  'contentUrl' => iiif_jpg_url,
50
- class: ['btn', 'btn-default', 'download', 'download-generated'],
51
48
  data: {
52
49
  download: 'trigger'
53
50
  }
@@ -56,9 +53,8 @@ module GeoblacklightHelper
56
53
 
57
54
  def download_link_generated(download_type, document)
58
55
  link_to(
59
- t('geoblacklight.download.export_link', download_format: proper_case_format(download_type)),
56
+ t('geoblacklight.download.export_link', download_format: export_format_label(download_type)),
60
57
  '',
61
- class: ['btn', 'btn-default', 'download', 'download-generated'],
62
58
  data: {
63
59
  download_path: download_path(document.id, type: download_type),
64
60
  download: 'trigger',
@@ -88,16 +84,6 @@ module GeoblacklightHelper
88
84
  end
89
85
  end
90
86
 
91
- ##
92
- # Renders an unique array of search links based off of terms
93
- # passed in using the facet parameter
94
- #
95
- def render_facet_links(facet, items)
96
- items.uniq.map do |item|
97
- link_to item, search_catalog_path(f: { facet => [item] })
98
- end.join(', ').html_safe
99
- end
100
-
101
87
  ##
102
88
  # Looks up properly formatted names for formats
103
89
  #
@@ -105,6 +91,11 @@ module GeoblacklightHelper
105
91
  t("geoblacklight.formats.#{format.to_s.parameterize(separator: '_')}")
106
92
  end
107
93
 
94
+ # Format labels are customized for exports - look up the appropriate key.
95
+ def export_format_label(format)
96
+ t("geoblacklight.download.export_#{format.to_s.parameterize(separator: '_')}_link")
97
+ end
98
+
108
99
  ##
109
100
  # Looks up formatted names for references
110
101
  # @param (String, Symbol) reference
@@ -122,22 +113,6 @@ module GeoblacklightHelper
122
113
  value.html_safe
123
114
  end
124
115
 
125
- def download_generated_body(format)
126
- value = proper_case_format(format)
127
- value = case value
128
- when t('geoblacklight.formats.shapefile')
129
- t('geoblacklight.download.export_shapefile_link')
130
- when t('geoblacklight.formats.kmz')
131
- t('geoblacklight.download.export_kmz_link')
132
- when t('geoblacklight.formats.geojson')
133
- t('geoblacklight.download.export_geojson_link')
134
- else
135
- value
136
- end
137
-
138
- value.html_safe
139
- end
140
-
141
116
  ##
142
117
  # Deteremines if a feature should include help text popover
143
118
  # @return [Boolean]
@@ -206,18 +181,6 @@ module GeoblacklightHelper
206
181
  Settings.LEAFLET
207
182
  end
208
183
 
209
- ##
210
- # Renders a facet item with an icon placed as the first child of
211
- # `.facet-label`. This works with `render_facet_value` and
212
- # `render_selected_facet_value`
213
- # @return String
214
- def render_facet_item_with_icon(field_name, item)
215
- doc = Nokogiri::HTML.fragment(render_facet_item(field_name, item))
216
- doc.at_css('.facet-label').children.first
217
- .add_previous_sibling(geoblacklight_icon(item.value, aria_hidden: true, classes: 'svg_tooltip'))
218
- doc.to_html.html_safe
219
- end
220
-
221
184
  ##
222
185
  # Renders the transformed metadata
223
186
  # (Renders a partial when the metadata isn't available)
@@ -267,8 +230,6 @@ module GeoblacklightHelper
267
230
  case controller_name
268
231
  when 'bookmarks'
269
232
  'bookmarks'
270
- when 'catalog'
271
- 'index'
272
233
  else
273
234
  'index'
274
235
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Geoblacklight
4
+ class BboxFilterField < Blacklight::SearchState::FilterField
5
+ # @param [String,#value] a filter item to add to the url
6
+ # @return [Blacklight::SearchState] new state
7
+ def add(item)
8
+ new_state = search_state.reset_search
9
+ params = new_state.params
10
+ value = as_url_parameter(item)
11
+
12
+ params[:bbox] = value.to_param
13
+
14
+ new_state.reset(params)
15
+ end
16
+
17
+ # @param [String,#value] a filter to remove from the url
18
+ # @return [Blacklight::SearchState] new state
19
+ def remove(_item)
20
+ new_state = search_state.reset_search
21
+ params = new_state.params
22
+
23
+ params.delete(:bbox)
24
+ new_state.reset(params)
25
+ end
26
+
27
+ # @return [Array] an array of applied filters
28
+ def values
29
+ params = search_state.params
30
+ return super unless params[:bbox]
31
+
32
+ bbox = Geoblacklight::BoundingBox.from_rectangle(params[:bbox])
33
+
34
+ super + [bbox]
35
+ rescue Geoblacklight::Exceptions::WrongBoundingBoxFormat => e
36
+ Rails.logger.warn(e)
37
+
38
+ super
39
+ end
40
+
41
+ # @param [String,#value] a filter to remove from the url
42
+ # @return [Boolean] whether the provided filter is currently applied/selected
43
+ delegate :include?, to: :values
44
+ end
45
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Geoblacklight
4
+ class BboxFilterQuery
5
+ def self.call(_search_builder, filter, solr_params)
6
+ bbox_filter_query = Geoblacklight::BboxFilterQuery.new(filter, solr_params)
7
+
8
+ [bbox_filter_query.intersects_filter, bbox_filter_query.relevancy_boost]
9
+ end
10
+
11
+ def initialize(filter, solr_params)
12
+ @filter = filter
13
+ @solr_params = solr_params
14
+ end
15
+
16
+ def intersects_filter
17
+ "#{@filter.key}:\"Intersects(#{envelope_bounds})\""
18
+ end
19
+
20
+ def relevancy_boost
21
+ boosted_params = @solr_params.slice(:bq, :bf)
22
+
23
+ boosted_params[:bq] ||= []
24
+ boosted_params[:bq] << "#{@filter.key}:\"IsWithin(#{envelope_bounds})\"#{boost}"
25
+
26
+ if field_config.overlap_boost
27
+ boosted_params[:bf] ||= []
28
+ boosted_params[:overlap] =
29
+ "{!field uf=* defType=lucene f=#{field_config.overlap_field} score=overlapRatio}Intersects(#{envelope_bounds})"
30
+ boosted_params[:bf] << "$overlap^#{field_config.overlap_boost}"
31
+ end
32
+
33
+ boosted_params
34
+ end
35
+
36
+ def envelope_bounds
37
+ @filter.values.first.to_envelope
38
+ end
39
+
40
+ def boost
41
+ "^#{field_config.within_boost || '10'}"
42
+ end
43
+
44
+ private
45
+
46
+ def field_config
47
+ @filter.config
48
+ end
49
+ end
50
+ end
@@ -72,7 +72,7 @@ module Geoblacklight
72
72
  end
73
73
 
74
74
  def geom_field
75
- fetch(Settings.FIELDS.SPATIAL_EXTENT, '')
75
+ fetch(Settings.FIELDS.GEOMETRY, '')
76
76
  end
77
77
 
78
78
  def geometry
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ module Geoblacklight
3
+ module SuppressedRecordsSearchBehavior
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ self.default_processor_chain += [:hide_suppressed_records]
8
+ end
9
+
10
+ ##
11
+ # Hide suppressed records in search
12
+ # @param [Blacklight::Solr::Request]
13
+ # @return [Blacklight::Solr::Request]
14
+ def hide_suppressed_records(solr_params)
15
+ # Show child records if searching for a specific source parent
16
+ return unless blacklight_params.fetch(:f, {})[Settings.FIELDS.SOURCE.to_sym].nil?
17
+
18
+ # Do not suppress action_documents method calls for individual documents
19
+ # ex. CatalogController#web_services (exportable views)
20
+ return if solr_params[:q]&.include?("{!lucene}#{Settings.FIELDS.ID}:")
21
+
22
+ solr_params[:fq] ||= []
23
+ solr_params[:fq] << "-#{Settings.FIELDS.SUPPRESSED}: true"
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Geoblacklight
4
+ class BboxItemPresenter < Blacklight::FacetItemPresenter
5
+ def label
6
+ super.to_param
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ <%# Renders the options of the downloads dropdown button %>
2
+ <% document ||= @document %>
3
+
4
+ <% if document.direct_download.present? %>
5
+ <% if document.direct_download[:download].is_a? Array %>
6
+ <% document.direct_download[:download].each do |download| %>
7
+ <%= download_link_file(download['label'], document.id, download['url']) %>
8
+ <% end %>
9
+ <% end %>
10
+ <% if document.direct_download[:download].is_a? String %>
11
+ <%= download_link_file(download_text(document.file_format), document.id, document.direct_download[:download]) %>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <% if document.hgl_download.present? %>
16
+ <%= download_link_hgl(download_text(document.download_types.first[0]), document) %>
17
+ <% end %>
18
+
19
+ <% if document.iiif_download.present? %>
20
+ <%= download_link_iiif %>
21
+ <% end %>
22
+
23
+ <% if document.download_types.present? %>
24
+ <% document.download_types.each do |type| %>
25
+ <%= download_link_generated(type.first, document) %>
26
+ <% end %>
27
+ <% end %>
@@ -1,3 +1,3 @@
1
- <%= geoblacklight_icon(document[Settings.FIELDS.GEOM_TYPE], classes: 'svg_tooltip') %>
1
+ <%= geoblacklight_icon(document[Settings.FIELDS.RESOURCE_CLASS]&.first, classes: 'svg_tooltip') %>
2
2
  <%= geoblacklight_icon(document[Settings.FIELDS.PROVIDER], classes: 'svg_tooltip') %>
3
- <%= geoblacklight_icon(document[Settings.FIELDS.RIGHTS], classes: 'svg_tooltip') %>
3
+ <%= geoblacklight_icon(document[Settings.FIELDS.ACCESS_RIGHTS], classes: 'svg_tooltip') %>
@@ -5,7 +5,7 @@
5
5
  <span class="document-counter">
6
6
  <%= t('blacklight.search.documents.counter', :counter => counter) if counter %>
7
7
  </span>
8
- <%= link_to_document document, counter: counter %>
8
+ <%= link_to_document document, counter: counter, itemprop: "name" %>
9
9
  </h3>
10
10
  <span class='status-icons'>
11
11
  <%= render partial: 'header_icons', locals: { document: document } %>
@@ -23,7 +23,7 @@
23
23
 
24
24
  <div class='more-info-area'>
25
25
  <div id="doc-<%= document.id %>-fields-collapse" class='collapse'>
26
- <small>
26
+ <small itemprop="description">
27
27
  <%= geoblacklight_present(:index_fields_display, document) %>
28
28
  </small>
29
29
  </div>
@@ -6,6 +6,23 @@
6
6
  <%= render_help_text_entry('viewer_protocol', document.viewer_protocol) %>
7
7
  <% end %>
8
8
 
9
+ <% if document.item_viewer.index_map %>
10
+ <div class="index-map-legend">
11
+ <div class="index-map-legend-info">
12
+ <span class="index-map-legend-default"></span>
13
+ <p><span class="sr-only">Green tile indicates </span>Map held by collection</p>
14
+ </div>
15
+ <div class="index-map-legend-info">
16
+ <span class="index-map-legend-unavailable"></span>
17
+ <p><span class="sr-only">Yellow tile indicates </span>Map not held by collection</p>
18
+ </div>
19
+ <div class="index-map-legend-info">
20
+ <span class="index-map-legend-selected"></span>
21
+ <p><span class="sr-only">Blue tile indicates </span>Selected map tile</p>
22
+ </div>
23
+ </div>
24
+ <% end %>
25
+
9
26
  <%= content_tag :div, id: 'map', aria: { label: t('geoblacklight.map.label') }, data: { map: 'item', protocol: document.viewer_protocol.camelize, url: document.viewer_endpoint, 'layer-id' => document.wxs_identifier, 'map-geom' => document.geometry.geojson, 'catalog-path'=> search_catalog_path, available: document_available?, inspect: show_attribute_table?, basemap: geoblacklight_basemap, leaflet_options: leaflet_options } do %>
10
27
  <% end %>
11
28
  </div>
@@ -1,28 +1,17 @@
1
1
  <% document ||= @document %>
2
2
 
3
3
  <% if document_downloadable? %>
4
- <% if document.direct_download.present? || document.hgl_download.present? || document.iiif_download.present? %>
5
- <div class="card downloads">
6
- <div class="card-header">
7
- <h2><%= t('geoblacklight.download.download').pluralize %></h2>
4
+ <% if document.direct_download.present? || document.hgl_download.present? || document.iiif_download.present? || document.download_types.present? %>
5
+ <div class="downloads-sidebar">
6
+ <%# the dropdown-toggle class gives us the little arrow %>
7
+ <button type="button" class="btn btn-primary dropdown-toggle sidebar-btn" id="downloads-button" data-toggle="collapse" data-target="#downloads-collapse" aria-expanded="false" aria-controls="downloads-collapse">
8
+ Download
9
+ </button>
10
+ <div class="collapse" id="downloads-collapse">
11
+ <div class="card card-body">
12
+ <%= render 'downloads_collapse' %>
13
+ </div>
8
14
  </div>
9
-
10
- <ul class="list-group list-group-flush js-download-list">
11
- <%= render 'downloads_primary' %>
12
- </ul>
13
- </div>
14
- <% end %>
15
-
16
- <% if document.download_types.present? %>
17
- <div class="card exports">
18
- <div class="card-header">
19
-
20
- <h2><%= t('geoblacklight.download.export_formats') %></h2>
21
- </div>
22
-
23
- <ul class="list-group list-group-flush">
24
- <%= render 'downloads_generated' %>
25
- </ul>
26
15
  </div>
27
16
  <% end %>
28
17
  <% elsif document.restricted? && document.same_institution? %>
@@ -1,6 +1,9 @@
1
1
  <%= render :partial => 'show_tools' %>
2
2
 
3
+ <div class="sidebar-buttons">
4
+ <%= render :partial => "show_web_services" %>
3
5
  <%= render :partial => "show_downloads" %>
6
+ </div>
4
7
 
5
8
  <% unless @document.more_like_this.empty? %>
6
9
  <div class="card">
@@ -0,0 +1,11 @@
1
+ <% document ||= @document %>
2
+
3
+ <% if (Settings.WEBSERVICES_SHOWN & document.references.refs.map(&:type).map(&:to_s)).any? %>
4
+ <div class="web-services-sidebar">
5
+ <%= link_to "Web services",
6
+ web_services_solr_document_path(id: document.id),
7
+ class: ['btn', 'btn-primary', 'sidebar-btn'],
8
+ id: "web-services-button",
9
+ data: {blacklight_modal: "trigger"} %>
10
+ </div>
11
+ <% end %>
@@ -2,7 +2,8 @@
2
2
 
3
3
  <% document.references.refs.each do |reference| %>
4
4
  <% if Settings.WEBSERVICES_SHOWN.include? reference.type.to_s %>
5
- <%= render_web_services(reference) %>
6
- <hr>
5
+ <div class="web-services-modal-entry">
6
+ <%= render_web_services(reference) %>
7
+ </div>
7
8
  <% end %>
8
9
  <% end %>
@@ -4,7 +4,7 @@
4
4
  <span aria-hidden="true">&times;</span>
5
5
  </button>
6
6
  </div>
7
- <div class="modal-body">
7
+ <div class="modal-body web-services-modal-body">
8
8
  <%= render partial: 'web_services' %>
9
9
  </div>
10
10
  <div class="modal-footer">
@@ -8,7 +8,7 @@
8
8
  <% end %>
9
9
  <% unless (@relations.send(rel)['numFound'].to_i <= 3) %>
10
10
  <li class="list-group-item border-bottom-0">
11
- <%= link_to search_catalog_path({f: {"#{Settings.FIELDS.SOURCE}" => [@relations.link_id]}}) do %>
11
+ <%= link_to search_catalog_path({f: {"#{Settings.RELATIONSHIPS_SHOWN.send(rel).field}" => [@relations.link_id]}}) do %>
12
12
  <%= t('geoblacklight.relations.browse_all', count: @relations.send(rel)['numFound']) %>
13
13
  <% end %>
14
14
  </li>
@@ -1,6 +1,6 @@
1
1
  <%- Settings.RELATIONSHIPS_SHOWN.each do |rel, value| %>
2
2
  <% unless @relations.send(rel)['numFound'].to_i.zero? %>
3
- <div class="card relations">
3
+ <div class="card relations relationship-<%= rel.downcase %>">
4
4
  <div class="card-header">
5
5
  <h2 class="mb-0 h6"><%= t("#{value.label}") %></h2>
6
6
  </div>
@@ -16,7 +16,7 @@ en:
16
16
  error: 'Sorry, the requested file could not be downloaded'
17
17
  error_with_url: 'Sorry, the requested file could not be downloaded. Try downloading it directly from: %{link}'
18
18
  export_formats: 'Export Formats'
19
- export_link: 'Export'
19
+ export_link: 'Export %{download_format}'
20
20
  export_shapefile_link: 'Shapefile'
21
21
  export_kmz_link: 'KMZ'
22
22
  export_geojson_link: 'GeoJSON'
@@ -65,6 +65,9 @@ en:
65
65
  services: 'Web services'
66
66
  services_close: 'Close'
67
67
  tms: 'Tile Map Service'
68
+ tilejson: 'TileJSON Document'
69
+ xyz: 'XYZ Tiles'
70
+ wmts: 'Web Map Tile Service'
68
71
  relations:
69
72
  ancestor: 'Source Datasets'
70
73
  descendant: 'Derived Datasets'
@@ -20,10 +20,9 @@ Gem::Specification.new do |spec|
20
20
  spec.required_rubygems_version = '>= 2.5.2'
21
21
 
22
22
  spec.add_dependency 'rails', '>= 5.2.4', '< 6.2'
23
- spec.add_dependency 'blacklight', '~> 7.8'
23
+ spec.add_dependency 'blacklight', '~> 7.12'
24
24
  spec.add_dependency 'config'
25
- spec.add_dependency 'faraday', '~> 1.0'
26
- spec.add_dependency 'faraday_middleware', '~> 1.0.0.rc1'
25
+ spec.add_dependency 'faraday', '>= 1.0'
27
26
  spec.add_dependency 'coderay'
28
27
  spec.add_dependency 'deprecation'
29
28
  spec.add_dependency 'geo_combine', '~> 0.4'
@@ -41,7 +40,8 @@ Gem::Specification.new do |spec|
41
40
  spec.add_development_dependency 'database_cleaner', '~> 1.3'
42
41
  spec.add_development_dependency 'simplecov', '~> 0.17.1'
43
42
  spec.add_development_dependency 'foreman'
44
- spec.add_development_dependency 'rubocop', '~> 1.10'
45
- spec.add_development_dependency 'rubocop-rails', '~> 2.9'
46
- spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
43
+ spec.add_development_dependency 'rubocop', '~> 1.25'
44
+ spec.add_development_dependency 'rubocop-rails', '~> 2.13'
45
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.8'
46
+ spec.add_development_dependency 'webmock', '~> 3.14'
47
47
  end
@@ -62,7 +62,7 @@ module Geoblacklight
62
62
 
63
63
  def add_spatial_search_behavior
64
64
  inject_into_file 'app/models/search_builder.rb', after: 'include Blacklight::Solr::SearchBuilderBehavior' do
65
- "\n include Geoblacklight::SpatialSearchBehavior"
65
+ "\n include Geoblacklight::SuppressedRecordsSearchBehavior"
66
66
  end
67
67
  end
68
68