geoblacklight 4.0.0.pre.alpha.2 → 4.0.0.pre.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +1 -1
- data/.github/workflows/ruby.yml +27 -103
- data/.gitignore +1 -0
- data/.rubocop.yml +6 -6
- data/.rubocop_todo.yml +0 -3
- data/.solr_wrapper +2 -0
- data/README.md +1 -4
- data/Rakefile +0 -1
- data/app/assets/images/blacklight/child-item.svg +3 -0
- data/app/assets/images/blacklight/collections.svg +4 -0
- data/app/assets/images/blacklight/datasets.svg +7 -0
- data/app/assets/images/blacklight/geoblacklight-icons.json +363 -332
- data/app/assets/images/blacklight/imagery.svg +4 -0
- data/app/assets/images/blacklight/maps.svg +4 -0
- data/app/assets/images/blacklight/parent-item.svg +3 -0
- data/app/assets/images/blacklight/university-of-colorado-boulder.svg +6 -0
- data/app/assets/images/blacklight/websites.svg +4 -0
- data/app/assets/javascripts/geoblacklight/controls/fullscreen.js +8 -0
- data/app/assets/javascripts/geoblacklight/geoblacklight.js +2 -1
- data/app/assets/javascripts/geoblacklight/viewers/esri.js +1 -0
- data/app/assets/javascripts/geoblacklight/viewers/index_map.js +1 -0
- data/app/assets/javascripts/geoblacklight/viewers/tilejson.js +33 -0
- data/app/assets/javascripts/geoblacklight/viewers/tms.js +2 -2
- data/app/assets/javascripts/geoblacklight/viewers/viewer.js +3 -0
- data/app/assets/javascripts/geoblacklight/viewers/wms.js +2 -2
- data/app/assets/javascripts/geoblacklight/viewers/wmts.js +85 -0
- data/app/assets/javascripts/geoblacklight/viewers/xyz.js +10 -0
- data/app/assets/stylesheets/geoblacklight/geoblacklight.scss +1 -0
- data/app/assets/stylesheets/geoblacklight/modules/_base.scss +0 -1
- data/app/assets/stylesheets/geoblacklight/modules/_styles.scss +5 -1
- data/app/assets/stylesheets/geoblacklight/modules/downloads.scss +20 -47
- data/app/assets/stylesheets/geoblacklight/modules/index_maps.scss +68 -0
- data/app/assets/stylesheets/geoblacklight/modules/item.scss +16 -0
- data/app/assets/stylesheets/geoblacklight/modules/modal.scss +6 -0
- data/app/assets/stylesheets/geoblacklight/modules/sidebar.scss +4 -0
- data/app/components/geoblacklight/icon_facet_item_component.rb +33 -0
- data/app/helpers/geoblacklight_helper.rb +6 -45
- data/app/models/concerns/geoblacklight/bbox_filter_field.rb +64 -0
- data/app/models/concerns/geoblacklight/bbox_filter_query.rb +50 -0
- data/app/models/concerns/geoblacklight/solr_document.rb +1 -1
- data/app/models/concerns/geoblacklight/suppressed_records_search_behavior.rb +31 -0
- data/app/presenters/geoblacklight/bbox_item_presenter.rb +9 -0
- data/app/views/catalog/_downloads_collapse.html.erb +27 -0
- data/app/views/catalog/_header_icons.html.erb +2 -2
- data/app/views/catalog/_index_split_default.html.erb +2 -2
- data/app/views/catalog/_show_default_viewer_container.html.erb +17 -0
- data/app/views/catalog/_show_downloads.html.erb +10 -21
- data/app/views/catalog/_show_sidebar.html.erb +3 -0
- data/app/views/catalog/_show_web_services.html.erb +11 -0
- data/app/views/catalog/_web_services.html.erb +3 -2
- data/app/views/catalog/web_services.html.erb +1 -1
- data/app/views/shared/_header_navbar.html.erb +13 -3
- data/config/locales/geoblacklight.en.yml +5 -1
- data/geoblacklight.gemspec +7 -7
- data/lib/generators/geoblacklight/install_generator.rb +1 -1
- data/lib/generators/geoblacklight/templates/assets/_customizations.scss +5 -4
- data/lib/generators/geoblacklight/templates/assets/application.scss +0 -3
- data/lib/generators/geoblacklight/templates/catalog_controller.rb +86 -57
- data/lib/generators/geoblacklight/templates/settings.gbl_v1.yml +5 -5
- data/lib/generators/geoblacklight/templates/settings.yml +43 -25
- data/lib/geoblacklight/bounding_box.rb +5 -1
- data/lib/geoblacklight/constants.rb +3 -0
- data/lib/geoblacklight/engine.rb +3 -2
- data/lib/geoblacklight/faraday_middleware/follow_redirects.rb +176 -0
- data/lib/geoblacklight/item_viewer.rb +13 -1
- data/lib/geoblacklight/metadata/base.rb +2 -1
- data/lib/geoblacklight/version.rb +1 -1
- data/lib/geoblacklight/view_helper_override.rb +2 -28
- data/lib/geoblacklight.rb +0 -10
- data/lib/tasks/geoblacklight.rake +1 -1
- data/schema/geoblacklight-schema-aardvark.json +3 -23
- data/solr/conf/schema.xml +37 -43
- data/solr/conf/solrconfig.xml +17 -17
- data/spec/components/geoblacklight/icon_facet_item_component_spec.rb +17 -0
- data/spec/config/initializers/rails_config_spec.rb +1 -1
- data/spec/controllers/catalog_controller_spec.rb +1 -1
- data/spec/controllers/wms_controller_spec.rb +1 -1
- data/spec/features/download_layer_spec.rb +31 -14
- data/spec/features/esri_viewer_spec.rb +5 -1
- data/spec/features/full_screen_controll_spec.rb +15 -0
- data/spec/features/home_page_spec.rb +2 -2
- data/spec/features/index_map_spec.rb +2 -2
- data/spec/features/missing_metadata_spec.rb +1 -1
- data/spec/features/multiple_downloads_spec.rb +2 -1
- data/spec/features/relations_spec.rb +12 -1
- data/spec/features/saved_searches_spec.rb +1 -1
- data/spec/features/search_results_complex_geometry_spec.rb +24 -0
- data/spec/features/search_results_icons_spec.rb +16 -0
- data/spec/features/search_results_map_spec.rb +2 -2
- data/spec/features/search_spec.rb +17 -0
- data/spec/features/show_page_download_spec.rb +29 -0
- data/spec/features/show_page_metadata_spec.rb +2 -2
- data/spec/features/split_view.html.erb_spec.rb +12 -1
- data/spec/features/tilejson_spec.rb +22 -0
- data/spec/features/tms_spec.rb +2 -2
- data/spec/features/web_services_modal_spec.rb +35 -2
- data/spec/features/wmts_spec.rb +34 -0
- data/spec/features/xyz_spec.rb +10 -0
- data/spec/fixtures/manifests/tilejson.json +21 -0
- data/spec/fixtures/manifests/wmts-multiple.xml +813 -0
- data/spec/fixtures/manifests/wmts-single.xml +126 -0
- data/spec/fixtures/solr_documents/README.md +46 -43
- data/spec/fixtures/solr_documents/actual-papermap1.json +2 -1
- data/spec/fixtures/solr_documents/actual-point1.json +2 -1
- data/spec/fixtures/solr_documents/actual-polygon1.json +2 -1
- data/spec/fixtures/solr_documents/actual-raster1.json +3 -2
- data/spec/fixtures/solr_documents/b1g_wabash_child_15.json +62 -0
- data/spec/fixtures/solr_documents/b1g_wabash_child_16.json +64 -0
- data/spec/fixtures/solr_documents/b1g_wabash_child_17.json +62 -0
- data/spec/fixtures/solr_documents/b1g_wabash_child_18.json +62 -0
- data/spec/fixtures/solr_documents/b1g_wabash_parent.json +59 -0
- data/spec/fixtures/solr_documents/baruch_ancestor1.json +2 -1
- data/spec/fixtures/solr_documents/baruch_ancestor2.json +2 -1
- data/spec/fixtures/solr_documents/baruch_documentation_download.json +1 -1
- data/spec/fixtures/solr_documents/bbox-spans-180.json +2 -1
- data/spec/fixtures/solr_documents/cornell_html_metadata.json +4 -3
- data/spec/fixtures/solr_documents/esri-dynamic-layer-all-layers.json +3 -2
- data/spec/fixtures/solr_documents/esri-dynamic-layer-single-layer.json +3 -2
- data/spec/fixtures/solr_documents/esri-feature-layer.json +2 -1
- data/spec/fixtures/solr_documents/esri-image-map-layer.json +3 -2
- data/spec/fixtures/solr_documents/esri-tiled_map_layer.json +2 -1
- data/spec/fixtures/solr_documents/esri-wms-layer.json +2 -1
- data/spec/fixtures/solr_documents/harvard_raster.json +3 -2
- data/spec/fixtures/solr_documents/iiif-eastern-hemisphere.json +3 -2
- data/spec/fixtures/solr_documents/index-map-polygon-no-downloadurl.json +2 -1
- data/spec/fixtures/solr_documents/index-map-polygon.json +2 -1
- data/spec/fixtures/solr_documents/index-map-stanford.json +2 -1
- data/spec/fixtures/solr_documents/index_map_point.json +3 -2
- data/spec/fixtures/solr_documents/metadata_no_provider.json +2 -1
- data/spec/fixtures/solr_documents/multiple-downloads.json +3 -2
- data/spec/fixtures/solr_documents/no_spatial.json +1 -4
- data/spec/fixtures/solr_documents/oembed.json +2 -1
- data/spec/fixtures/solr_documents/princeton-child1.json +3 -2
- data/spec/fixtures/solr_documents/princeton-child2.json +3 -2
- data/spec/fixtures/solr_documents/princeton-child3.json +2 -1
- data/spec/fixtures/solr_documents/princeton-child4.json +3 -2
- data/spec/fixtures/solr_documents/princeton-parent.json +5 -3
- data/spec/fixtures/solr_documents/public_direct_download.json +2 -1
- data/spec/fixtures/solr_documents/public_iiif_princeton.json +3 -2
- data/spec/fixtures/solr_documents/public_polygon_mit.json +2 -1
- data/spec/fixtures/solr_documents/restricted-line.json +2 -1
- data/spec/fixtures/solr_documents/tilejson.json +48 -0
- data/spec/fixtures/solr_documents/tms.json +15 -18
- data/spec/fixtures/solr_documents/umn_metro_result1.json +5 -3
- data/spec/fixtures/solr_documents/umn_state_result1.json +3 -2
- data/spec/fixtures/solr_documents/umn_state_result2.json +3 -5
- data/spec/fixtures/solr_documents/uva_slug_colon.json +2 -1
- data/spec/fixtures/solr_documents/wmts-multiple.json +41 -0
- data/spec/fixtures/solr_documents/wmts-single-layer.json +48 -0
- data/spec/fixtures/solr_documents/xyz.json +46 -0
- data/spec/helpers/geoblacklight_helper_spec.rb +12 -35
- data/spec/lib/geoblacklight/document_presenter_spec.rb +3 -3
- data/spec/lib/geoblacklight/download/geojson_download_spec.rb +1 -1
- data/spec/lib/geoblacklight/download/geotiff_download_spec.rb +1 -1
- data/spec/lib/geoblacklight/download/kmz_download_spec.rb +1 -1
- data/spec/lib/geoblacklight/download/shapefile_download_spec.rb +1 -1
- data/spec/lib/geoblacklight/download_spec.rb +2 -2
- data/spec/lib/geoblacklight/metadata/base_spec.rb +19 -1
- data/spec/lib/geoblacklight/metadata_transformer/fgdc_spec.rb +1 -1
- data/spec/lib/geoblacklight/metadata_transformer/iso19139_spec.rb +1 -1
- data/spec/lib/geoblacklight/references_spec.rb +5 -3
- data/spec/lib/geoblacklight/relation/relation_response_spec.rb +5 -0
- data/spec/lib/geoblacklight/view_helper_override_spec.rb +0 -10
- data/spec/lib/geoblacklight/wms_layer_spec.rb +1 -1
- data/spec/models/concerns/geoblacklight/bbox_filter_field_spec.rb +96 -0
- data/spec/models/concerns/geoblacklight/bbox_filter_query_spec.rb +105 -0
- data/spec/models/concerns/geoblacklight/solr_document/inspection_spec.rb +2 -1
- data/spec/models/concerns/geoblacklight/suppressed_records_search_behavior_spec.rb +31 -0
- data/spec/presenters/geoblacklight/bbox_item_presenter_spec.rb +36 -0
- data/spec/spec_helper.rb +8 -3
- data/spec/test_app_templates/Gemfile.extra +1 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -4
- data/spec/views/catalog/_show_downloads.html.erb_spec.rb +5 -5
- data/template.rb +2 -4
- data/vendor/assets/images/fullscreen.png +0 -0
- data/vendor/assets/images/fullscreen@2x.png +0 -0
- data/vendor/assets/javascripts/Leaflet.fullscreen.js +152 -0
- data/vendor/assets/javascripts/esri-leaflet.js +10 -3
- data/vendor/assets/javascripts/esri-leaflet.js.map +1 -1
- data/vendor/assets/javascripts/leaflet-iiif.js +39 -18
- data/vendor/assets/javascripts/leaflet-src.js.erb +14126 -0
- data/vendor/assets/javascripts/leaflet-src.js.map +1 -1
- data/vendor/assets/stylesheets/leaflet.css +640 -634
- data/vendor/assets/stylesheets/leaflet.fullscreen.css +40 -0
- metadata +108 -53
- data/app/models/concerns/geoblacklight/spatial_search_behavior.rb +0 -71
- data/app/views/catalog/_download_generated_link.html.erb +0 -4
- data/app/views/catalog/_download_link.html.erb +0 -3
- data/app/views/catalog/_downloads_generated.html.erb +0 -6
- data/app/views/catalog/_downloads_primary.html.erb +0 -21
- data/app/views/catalog/_downloads_secondary.html.erb +0 -39
- data/app/views/catalog/_icon_facet.html.erb +0 -16
- data/bin/coverage.rb +0 -36
- data/lib/generators/geoblacklight/templates/Procfile +0 -3
- data/lib/generators/geoblacklight/templates/package.json +0 -14
- data/lib/generators/geoblacklight/templates/webpacker.yml +0 -67
- data/lib/generators/geoblacklight/webpacker_generator.rb +0 -36
- data/lib/geoblacklight/catalog_helper_override.rb +0 -14
- data/spec/models/concerns/geoblacklight/spatial_search_behavior_spec.rb +0 -97
- data/vendor/assets/javascripts/leaflet.js.erb +0 -13922
- data/vendor/assets/stylesheets/leaflet-label.css +0 -54
|
@@ -25,7 +25,7 @@ OVERLAP_RATIO_BOOST: '2'
|
|
|
25
25
|
FIELDS:
|
|
26
26
|
:ACCESS_RIGHTS: 'dc_rights_s'
|
|
27
27
|
#:ALTERNATIVE_TITLE: 'dct_alternative_sm'
|
|
28
|
-
#:CENTROID: '
|
|
28
|
+
#:CENTROID: 'dcat_centroid'
|
|
29
29
|
:CREATOR: 'dc_creator_sm'
|
|
30
30
|
:DATE_ISSUED: 'dct_issued_s'
|
|
31
31
|
#:DATE_RANGE: 'gbl_dateRange_drsim'
|
|
@@ -57,7 +57,7 @@ FIELDS:
|
|
|
57
57
|
#:RIGHTS_HOLDER: 'dct_rightsHolder_sm'
|
|
58
58
|
:SOURCE: 'dc_source_sm'
|
|
59
59
|
:SPATIAL_COVERAGE: 'dct_spatial_sm'
|
|
60
|
-
:
|
|
60
|
+
:GEOMETRY: 'solr_geom'
|
|
61
61
|
:SUBJECT: 'dc_subject_sm'
|
|
62
62
|
:SUPPRESSED: 'suppressed_b'
|
|
63
63
|
:TEMPORAL_COVERAGE: 'dct_temporal_sm'
|
|
@@ -159,15 +159,15 @@ LEAFLET:
|
|
|
159
159
|
DETECT_RETINA: true
|
|
160
160
|
INDEX:
|
|
161
161
|
DEFAULT: &default
|
|
162
|
-
color: "#
|
|
162
|
+
color: "#7FCDBB"
|
|
163
163
|
weight: "1"
|
|
164
164
|
radius: "4"
|
|
165
165
|
UNAVAILABLE:
|
|
166
166
|
<<: *default
|
|
167
|
-
color: "#
|
|
167
|
+
color: "#EDF8B1"
|
|
168
168
|
SELECTED:
|
|
169
169
|
<<: *default
|
|
170
|
-
color: "#
|
|
170
|
+
color: "#2C7FB8"
|
|
171
171
|
VIEWERS:
|
|
172
172
|
WMS:
|
|
173
173
|
<<: *opacity_control
|
|
@@ -10,9 +10,6 @@ ARCGIS_BASE_URL: 'https://www.arcgis.com/home/webmap/viewer.html'
|
|
|
10
10
|
# Download path can be configured using this setting
|
|
11
11
|
#DOWNLOAD_PATH: "./tmp/cache/downloads"
|
|
12
12
|
|
|
13
|
-
# DEPRECATED Main Solr geometry field used for spatial search and bounding box. Should be type 'rpt'
|
|
14
|
-
GEOMETRY_FIELD: 'solr_geom'
|
|
15
|
-
|
|
16
13
|
# The bq boost value for spatial search matches within a bounding box
|
|
17
14
|
BBOX_WITHIN_BOOST: '10'
|
|
18
15
|
|
|
@@ -29,7 +26,7 @@ HOMEPAGE_MAP_GEOM: null
|
|
|
29
26
|
FIELDS:
|
|
30
27
|
:ACCESS_RIGHTS: 'dct_accessRights_s'
|
|
31
28
|
:ALTERNATIVE_TITLE: 'dct_alternative_sm'
|
|
32
|
-
:CENTROID: '
|
|
29
|
+
:CENTROID: 'dcat_centroid'
|
|
33
30
|
:CREATOR: 'dct_creator_sm'
|
|
34
31
|
:DATE_ISSUED: 'dct_issued_s'
|
|
35
32
|
:DATE_RANGE: 'gbl_dateRange_drsim'
|
|
@@ -42,9 +39,10 @@ FIELDS:
|
|
|
42
39
|
:INDEX_YEAR: 'gbl_indexYear_im'
|
|
43
40
|
:IS_PART_OF: 'dct_isPartOf_sm'
|
|
44
41
|
:IS_REPLACED_BY: 'dct_isReplacedBy_sm'
|
|
45
|
-
:
|
|
42
|
+
:THEME: 'dcat_theme_sm'
|
|
46
43
|
:KEYWORD: 'dcat_keyword_sm'
|
|
47
44
|
:LANGUAGE: 'dct_language_sm'
|
|
45
|
+
:LAYER_MODIFIED: 'gbl_mdModified_dt'
|
|
48
46
|
:LICENSE: 'dct_license_sm'
|
|
49
47
|
:MEMBER_OF: 'pcdm_memberOf_sm'
|
|
50
48
|
:METADATA_VERSION: 'gbl_mdVersion_s'
|
|
@@ -61,7 +59,7 @@ FIELDS:
|
|
|
61
59
|
:RIGHTS_HOLDER: 'dct_rightsHolder_sm'
|
|
62
60
|
:SOURCE: 'dct_source_sm'
|
|
63
61
|
:SPATIAL_COVERAGE: 'dct_spatial_sm'
|
|
64
|
-
:
|
|
62
|
+
:GEOMETRY: 'locn_geometry'
|
|
65
63
|
:SUBJECT: 'dct_subject_sm'
|
|
66
64
|
:SUPPRESSED: 'gbl_suppressed_b'
|
|
67
65
|
:TEMPORAL_COVERAGE: 'dct_temporal_sm'
|
|
@@ -93,6 +91,9 @@ WEBSERVICES_SHOWN:
|
|
|
93
91
|
- 'wms'
|
|
94
92
|
- 'tms'
|
|
95
93
|
- 'wfs'
|
|
94
|
+
- 'xyz'
|
|
95
|
+
- 'wmts'
|
|
96
|
+
- 'tilejson'
|
|
96
97
|
- 'iiif'
|
|
97
98
|
- 'feature_layer'
|
|
98
99
|
- 'tiled_map_layer'
|
|
@@ -106,11 +107,16 @@ RELATIONSHIPS_SHOWN:
|
|
|
106
107
|
query_type: ancestors
|
|
107
108
|
icon: nil
|
|
108
109
|
label: geoblacklight.relations.member_of
|
|
109
|
-
|
|
110
|
+
PART_OF_ANCESTORS:
|
|
110
111
|
field: dct_isPartOf_sm
|
|
111
112
|
query_type: ancestors
|
|
112
113
|
icon: nil
|
|
113
|
-
label: geoblacklight.relations.
|
|
114
|
+
label: geoblacklight.relations.part_of_ancestors
|
|
115
|
+
PART_OF_DESCENDANTS:
|
|
116
|
+
field: dct_isPartOf_sm
|
|
117
|
+
query_type: descendants
|
|
118
|
+
icon: child-item
|
|
119
|
+
label: geoblacklight.relations.part_of_descendants
|
|
114
120
|
RELATION:
|
|
115
121
|
field: dct_relation_sm
|
|
116
122
|
query_type: ancestors
|
|
@@ -129,12 +135,12 @@ RELATIONSHIPS_SHOWN:
|
|
|
129
135
|
SOURCE_ANCESTORS:
|
|
130
136
|
field: dct_source_sm
|
|
131
137
|
query_type: ancestors
|
|
132
|
-
icon:
|
|
138
|
+
icon: parent-item
|
|
133
139
|
label: geoblacklight.relations.ancestor
|
|
134
140
|
SOURCE_DESCENDANTS:
|
|
135
141
|
field: dct_source_sm
|
|
136
142
|
query_type: descendants
|
|
137
|
-
icon:
|
|
143
|
+
icon: child-item
|
|
138
144
|
label: geoblacklight.relations.descendant
|
|
139
145
|
VERSION_OF:
|
|
140
146
|
field: dct_isVersionOf_sm
|
|
@@ -153,36 +159,48 @@ WMS_PARAMS:
|
|
|
153
159
|
:INFO_FORMAT: 'text/html'
|
|
154
160
|
|
|
155
161
|
# Settings for leaflet
|
|
156
|
-
OPACITY_CONTROL: &opacity_control
|
|
157
|
-
CONTROLS:
|
|
158
|
-
- 'Opacity'
|
|
159
|
-
|
|
160
162
|
LEAFLET:
|
|
161
163
|
MAP:
|
|
162
164
|
LAYERS:
|
|
163
165
|
DETECT_RETINA: true
|
|
164
166
|
INDEX:
|
|
165
167
|
DEFAULT: &default
|
|
166
|
-
color: "#
|
|
168
|
+
color: "#7FCDBB"
|
|
167
169
|
weight: "1"
|
|
168
170
|
radius: "4"
|
|
169
171
|
UNAVAILABLE:
|
|
170
172
|
<<: *default
|
|
171
|
-
color: "#
|
|
173
|
+
color: "#EDF8B1"
|
|
172
174
|
SELECTED:
|
|
173
175
|
<<: *default
|
|
174
|
-
color: "#
|
|
176
|
+
color: "#2C7FB8"
|
|
175
177
|
VIEWERS:
|
|
176
|
-
WMS:
|
|
177
|
-
<<: *opacity_control
|
|
178
|
-
TILEDMAPLAYER:
|
|
179
|
-
<<: *opacity_control
|
|
180
|
-
FEATURELAYER:
|
|
181
|
-
<<: *opacity_control
|
|
182
178
|
DYNAMICMAPLAYER:
|
|
183
|
-
|
|
179
|
+
CONTROLS:
|
|
180
|
+
- 'Opacity'
|
|
181
|
+
- 'Fullscreen'
|
|
182
|
+
FEATURELAYER:
|
|
183
|
+
CONTROLS:
|
|
184
|
+
- 'Opacity'
|
|
185
|
+
- 'Fullscreen'
|
|
186
|
+
IIIF:
|
|
187
|
+
CONTROLS:
|
|
188
|
+
- 'Fullscreen'
|
|
184
189
|
IMAGEMAPLAYER:
|
|
185
|
-
|
|
190
|
+
CONTROLS:
|
|
191
|
+
- 'Opacity'
|
|
192
|
+
- 'Fullscreen'
|
|
193
|
+
INDEXMAP:
|
|
194
|
+
CONTROLS:
|
|
195
|
+
- 'Fullscreen'
|
|
196
|
+
TILEDMAPLAYER:
|
|
197
|
+
CONTROLS:
|
|
198
|
+
- 'Opacity'
|
|
199
|
+
- 'Fullscreen'
|
|
200
|
+
WMS:
|
|
201
|
+
CONTROLS:
|
|
202
|
+
- 'Opacity'
|
|
203
|
+
- 'Fullscreen'
|
|
186
204
|
|
|
187
205
|
# Toggle the help text feature that offers users context
|
|
188
206
|
HELP_TEXT:
|
|
@@ -23,12 +23,16 @@ module Geoblacklight
|
|
|
23
23
|
"ENVELOPE(#{west}, #{east}, #{north}, #{south})"
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
+
def to_param
|
|
27
|
+
"#{west} #{south} #{east} #{north}"
|
|
28
|
+
end
|
|
29
|
+
|
|
26
30
|
##
|
|
27
31
|
# Create a Geoblacklight::BoundingBox from a Solr rectangle syntax
|
|
28
32
|
# @param [String] bbox as "W S E N"
|
|
29
33
|
# @return [Geoblacklight::BoundingBox]
|
|
30
34
|
def self.from_rectangle(rectangle)
|
|
31
|
-
rectangle_array = rectangle.split
|
|
35
|
+
rectangle_array = rectangle.is_a?(String) ? rectangle.split : []
|
|
32
36
|
message = 'Bounding box should be a string in Solr rectangle syntax e.g."W S E N"'
|
|
33
37
|
fail Geoblacklight::Exceptions::WrongBoundingBoxFormat, message if rectangle_array.count != 4
|
|
34
38
|
new(
|
|
@@ -16,7 +16,10 @@ module Geoblacklight
|
|
|
16
16
|
wcs: 'http://www.opengis.net/def/serviceType/ogc/wcs',
|
|
17
17
|
wfs: 'http://www.opengis.net/def/serviceType/ogc/wfs',
|
|
18
18
|
wms: 'http://www.opengis.net/def/serviceType/ogc/wms',
|
|
19
|
+
wmts: 'http://www.opengis.net/def/serviceType/ogc/wmts',
|
|
19
20
|
tms: 'https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification',
|
|
21
|
+
tilejson: 'https://github.com/mapbox/tilejson-spec',
|
|
22
|
+
xyz: 'https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames',
|
|
20
23
|
hgl: 'http://schema.org/DownloadAction',
|
|
21
24
|
feature_layer: 'urn:x-esri:serviceType:ArcGIS#FeatureLayer',
|
|
22
25
|
tiled_map_layer: 'urn:x-esri:serviceType:ArcGIS#TiledMapLayer',
|
data/lib/geoblacklight/engine.rb
CHANGED
|
@@ -3,7 +3,6 @@ require 'blacklight'
|
|
|
3
3
|
require 'coderay'
|
|
4
4
|
require 'config'
|
|
5
5
|
require 'faraday'
|
|
6
|
-
require 'faraday_middleware'
|
|
7
6
|
require 'geoblacklight/version'
|
|
8
7
|
require 'nokogiri'
|
|
9
8
|
require 'mime/types'
|
|
@@ -19,7 +18,9 @@ module Geoblacklight
|
|
|
19
18
|
end
|
|
20
19
|
|
|
21
20
|
config.to_prepare do
|
|
22
|
-
Geoblacklight
|
|
21
|
+
unless SearchHistoryController.helpers.is_a?(Geoblacklight::ViewHelperOverride)
|
|
22
|
+
SearchHistoryController.send(:helper, Geoblacklight::ViewHelperOverride)
|
|
23
|
+
end
|
|
23
24
|
end
|
|
24
25
|
end
|
|
25
26
|
end
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# :nocov:
|
|
3
|
+
require 'faraday'
|
|
4
|
+
require 'set'
|
|
5
|
+
|
|
6
|
+
module Geoblacklight
|
|
7
|
+
# NOTE: We copied this class from faraday_middleware in order to support
|
|
8
|
+
# both Faraday 1 & 2. If this middleware is ever extracted from
|
|
9
|
+
# faraday_middleware into its own gem we should remove this and use that
|
|
10
|
+
# instead.
|
|
11
|
+
module FaradayMiddleware
|
|
12
|
+
# Exception thrown when the maximum amount of requests is
|
|
13
|
+
# exceeded.
|
|
14
|
+
class RedirectLimitReached < ::Faraday::ClientError
|
|
15
|
+
attr_reader :response
|
|
16
|
+
|
|
17
|
+
def initialize(response)
|
|
18
|
+
super "too many redirects; last one to: #{response['location']}"
|
|
19
|
+
@response = response
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Public: Follow HTTP 301, 302, 303, 307, and 308 redirects.
|
|
24
|
+
#
|
|
25
|
+
# For HTTP 301, 302, and 303, the original GET, POST, PUT, DELETE, or PATCH
|
|
26
|
+
# request gets converted into a GET. With `:standards_compliant => true`,
|
|
27
|
+
# however, the HTTP method after 301/302 remains unchanged. This allows you
|
|
28
|
+
# to opt into HTTP/1.1 compliance and act unlike the major web browsers.
|
|
29
|
+
#
|
|
30
|
+
# This middleware currently only works with synchronous requests; i.e. it
|
|
31
|
+
# doesn't support parallelism.
|
|
32
|
+
#
|
|
33
|
+
# If you wish to persist cookies across redirects, you could use
|
|
34
|
+
# the faraday-cookie_jar gem:
|
|
35
|
+
#
|
|
36
|
+
# Faraday.new(:url => url) do |faraday|
|
|
37
|
+
# faraday.use FaradayMiddleware::FollowRedirects
|
|
38
|
+
# faraday.use :cookie_jar
|
|
39
|
+
# faraday.adapter Faraday.default_adapter
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
class FollowRedirects < ::Faraday::Middleware
|
|
43
|
+
# HTTP methods for which 30x redirects can be followed
|
|
44
|
+
ALLOWED_METHODS = Set.new [:head, :options, :get, :post, :put, :patch, :delete]
|
|
45
|
+
# HTTP redirect status codes that this middleware implements
|
|
46
|
+
REDIRECT_CODES = Set.new [301, 302, 303, 307, 308]
|
|
47
|
+
# Keys in env hash which will get cleared between requests
|
|
48
|
+
ENV_TO_CLEAR = Set.new [:status, :response, :response_headers]
|
|
49
|
+
|
|
50
|
+
# Default value for max redirects followed
|
|
51
|
+
FOLLOW_LIMIT = 3
|
|
52
|
+
|
|
53
|
+
# Regex that matches characters that need to be escaped in URLs, sans
|
|
54
|
+
# the "%" character which we assume already represents an escaped sequence.
|
|
55
|
+
URI_UNSAFE = %r{[^\-_.!~*'()a-zA-Z\d;/?:@&=+$,\[\]%]}.freeze
|
|
56
|
+
|
|
57
|
+
AUTH_HEADER = 'Authorization'
|
|
58
|
+
|
|
59
|
+
# Public: Initialize the middleware.
|
|
60
|
+
#
|
|
61
|
+
# options - An options Hash (default: {}):
|
|
62
|
+
# :limit - A Numeric redirect limit (default: 3)
|
|
63
|
+
# :standards_compliant - A Boolean indicating whether to respect
|
|
64
|
+
# the HTTP spec when following 301/302
|
|
65
|
+
# (default: false)
|
|
66
|
+
# :callback - A callable used on redirects
|
|
67
|
+
# with the old and new envs
|
|
68
|
+
# :cookies - An Array of Strings (e.g.
|
|
69
|
+
# ['cookie1', 'cookie2']) to choose
|
|
70
|
+
# cookies to be kept, or :all to keep
|
|
71
|
+
# all cookies (default: []).
|
|
72
|
+
# :clear_authorization_header - A Boolean indicating whether the request
|
|
73
|
+
# Authorization header should be cleared on
|
|
74
|
+
# redirects (default: true)
|
|
75
|
+
def initialize(app, options = {})
|
|
76
|
+
super(app)
|
|
77
|
+
@options = options
|
|
78
|
+
|
|
79
|
+
@convert_to_get = Set.new [303]
|
|
80
|
+
@convert_to_get << 301 << 302 unless standards_compliant?
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def call(env)
|
|
84
|
+
perform_with_redirection(env, follow_limit)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
def convert_to_get?(response)
|
|
90
|
+
[:head, :options].exclude?(response.env[:method]) &&
|
|
91
|
+
@convert_to_get.include?(response.status)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def perform_with_redirection(env, follows)
|
|
95
|
+
request_body = env[:body]
|
|
96
|
+
response = @app.call(env)
|
|
97
|
+
|
|
98
|
+
response.on_complete do |response_env|
|
|
99
|
+
if follow_redirect?(response_env, response)
|
|
100
|
+
fail RedirectLimitReached, response if follows.zero?
|
|
101
|
+
|
|
102
|
+
new_request_env = update_env(response_env.dup, request_body, response)
|
|
103
|
+
callback&.call(response_env, new_request_env)
|
|
104
|
+
response = perform_with_redirection(new_request_env, follows - 1)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
response
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def update_env(env, request_body, response)
|
|
111
|
+
redirect_from_url = env[:url].to_s
|
|
112
|
+
redirect_to_url = safe_escape(response['location'] || '')
|
|
113
|
+
env[:url] += redirect_to_url
|
|
114
|
+
|
|
115
|
+
ENV_TO_CLEAR.each { |key| env.delete key }
|
|
116
|
+
|
|
117
|
+
if convert_to_get?(response)
|
|
118
|
+
env[:method] = :get
|
|
119
|
+
env[:body] = nil
|
|
120
|
+
else
|
|
121
|
+
env[:body] = request_body
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
clear_authorization_header(env, redirect_from_url, redirect_to_url)
|
|
125
|
+
|
|
126
|
+
env
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def follow_redirect?(env, response)
|
|
130
|
+
ALLOWED_METHODS.include?(env[:method]) &&
|
|
131
|
+
REDIRECT_CODES.include?(response.status)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def follow_limit
|
|
135
|
+
@options.fetch(:limit, FOLLOW_LIMIT)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def standards_compliant?
|
|
139
|
+
@options.fetch(:standards_compliant, false)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def callback
|
|
143
|
+
@options[:callback]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Internal: escapes unsafe characters from an URL which might be a path
|
|
147
|
+
# component only or a fully qualified URI so that it can be joined onto an
|
|
148
|
+
# URI:HTTP using the `+` operator. Doesn't escape "%" characters so to not
|
|
149
|
+
# risk double-escaping.
|
|
150
|
+
def safe_escape(uri)
|
|
151
|
+
uri = uri.split('#')[0] # we want to remove the fragment if present
|
|
152
|
+
uri.to_s.gsub(URI_UNSAFE) do |match|
|
|
153
|
+
"%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def clear_authorization_header(env, from_url, to_url)
|
|
158
|
+
return env if redirect_to_same_host?(from_url, to_url)
|
|
159
|
+
return env unless @options.fetch(:clear_authorization_header, true)
|
|
160
|
+
|
|
161
|
+
env[:request_headers].delete(AUTH_HEADER)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def redirect_to_same_host?(from_url, to_url)
|
|
165
|
+
return true if to_url.start_with?('/')
|
|
166
|
+
|
|
167
|
+
from_uri = URI.parse(from_url)
|
|
168
|
+
to_uri = URI.parse(to_url)
|
|
169
|
+
|
|
170
|
+
[from_uri.scheme, from_uri.host, from_uri.port] ==
|
|
171
|
+
[to_uri.scheme, to_uri.host, to_uri.port]
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
# :nocov:
|
|
@@ -51,8 +51,20 @@ module Geoblacklight
|
|
|
51
51
|
@references.tms
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
def xyz
|
|
55
|
+
@references.xyz
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def tilejson
|
|
59
|
+
@references.tilejson
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def wmts
|
|
63
|
+
@references.wmts
|
|
64
|
+
end
|
|
65
|
+
|
|
54
66
|
def viewer_preference
|
|
55
|
-
[oembed, index_map, tms, wms, iiif, tiled_map_layer, dynamic_map_layer,
|
|
67
|
+
[oembed, index_map, tilejson, xyz, wmts, tms, wms, iiif, tiled_map_layer, dynamic_map_layer,
|
|
56
68
|
image_map_layer, feature_layer].compact.map(&:to_hash).first
|
|
57
69
|
end
|
|
58
70
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
require 'geoblacklight/faraday_middleware/follow_redirects'
|
|
2
3
|
module Geoblacklight
|
|
3
4
|
module Metadata
|
|
4
5
|
##
|
|
@@ -47,7 +48,7 @@ module Geoblacklight
|
|
|
47
48
|
# connection error
|
|
48
49
|
def retrieve_metadata
|
|
49
50
|
connection = Faraday.new(url: @reference.endpoint) do |conn|
|
|
50
|
-
conn.use FaradayMiddleware::FollowRedirects
|
|
51
|
+
conn.use Geoblacklight::FaradayMiddleware::FollowRedirects
|
|
51
52
|
conn.adapter Faraday.default_adapter
|
|
52
53
|
end
|
|
53
54
|
begin
|
|
@@ -1,41 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Geoblacklight
|
|
3
|
+
# Override Blacklight helpers to inject behavior
|
|
3
4
|
module ViewHelperOverride
|
|
4
|
-
include CatalogHelperOverride
|
|
5
|
-
|
|
6
|
-
def spatial_parameters?
|
|
7
|
-
params[:bbox]
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# Overrides BL method to enable results for spatial only params
|
|
11
|
-
def has_search_parameters?
|
|
12
|
-
spatial_parameters? || super
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def query_has_constraints?(localized_params = params)
|
|
16
|
-
has_search_parameters? || super(localized_params)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
5
|
def render_search_to_s(params)
|
|
20
6
|
super + render_search_to_s_bbox(params)
|
|
21
7
|
end
|
|
22
8
|
|
|
23
9
|
def render_search_to_s_bbox(params)
|
|
24
10
|
return ''.html_safe if params['bbox'].blank?
|
|
25
|
-
render_search_to_s_element(t('geoblacklight.bbox_label'), render_filter_value(params['bbox']))
|
|
26
|
-
end
|
|
27
11
|
|
|
28
|
-
|
|
29
|
-
content = super(localized_params)
|
|
30
|
-
localized_params = localized_params.to_h if localized_params.respond_to?(:to_h)
|
|
31
|
-
|
|
32
|
-
if localized_params[:bbox]
|
|
33
|
-
path = search_action_path(remove_spatial_filter_group(:bbox, localized_params))
|
|
34
|
-
content << render_constraint_element(t('geoblacklight.bbox_label'),
|
|
35
|
-
localized_params[:bbox], remove: path)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
content
|
|
12
|
+
render_search_to_s_element(t('geoblacklight.bbox_label'), render_filter_value(params['bbox']))
|
|
39
13
|
end
|
|
40
14
|
end
|
|
41
15
|
end
|
data/lib/geoblacklight.rb
CHANGED
|
@@ -4,7 +4,6 @@ require 'geoblacklight/engine'
|
|
|
4
4
|
|
|
5
5
|
module Geoblacklight
|
|
6
6
|
require 'geoblacklight/bounding_box'
|
|
7
|
-
require 'geoblacklight/catalog_helper_override'
|
|
8
7
|
require 'geoblacklight/constants'
|
|
9
8
|
require 'geoblacklight/exceptions'
|
|
10
9
|
require 'geoblacklight/geometry'
|
|
@@ -34,15 +33,6 @@ module Geoblacklight
|
|
|
34
33
|
require 'geoblacklight/relation/ancestors'
|
|
35
34
|
require 'geoblacklight/relation/relation_response'
|
|
36
35
|
|
|
37
|
-
def self.inject!
|
|
38
|
-
CatalogController.send(:include, Geoblacklight::CatalogHelperOverride)
|
|
39
|
-
CatalogController.send(:include, Geoblacklight::ViewHelperOverride)
|
|
40
|
-
CatalogController.send(:helper, Geoblacklight::ViewHelperOverride) unless
|
|
41
|
-
CatalogController.helpers.is_a?(Geoblacklight::ViewHelperOverride)
|
|
42
|
-
SearchHistoryController.send(:helper, Geoblacklight::ViewHelperOverride) unless
|
|
43
|
-
SearchHistoryController.helpers.is_a?(Geoblacklight::ViewHelperOverride)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
36
|
def self.logger
|
|
47
37
|
::Rails.logger
|
|
48
38
|
end
|
|
@@ -87,7 +87,7 @@ namespace :geoblacklight do
|
|
|
87
87
|
fail 'Please supply required arguments [document_id, download_type and timeout]'
|
|
88
88
|
end
|
|
89
89
|
document = Geoblacklight::SolrDocument.find(args[:doc_id])
|
|
90
|
-
fail Blacklight::Exceptions::RecordNotFound if document[:
|
|
90
|
+
fail Blacklight::Exceptions::RecordNotFound if document[:id] != args[:doc_id]
|
|
91
91
|
download = "Geoblacklight::#{args[:download_type].capitalize}Download"
|
|
92
92
|
.constantize.new(document, timeout: args[:timeout].to_i)
|
|
93
93
|
download.get
|
|
@@ -67,28 +67,7 @@
|
|
|
67
67
|
"dcat_theme_sm": {
|
|
68
68
|
"type": "array",
|
|
69
69
|
"items": {
|
|
70
|
-
"type": "string"
|
|
71
|
-
"enum": [
|
|
72
|
-
"Farming",
|
|
73
|
-
"Biota",
|
|
74
|
-
"Boundaries",
|
|
75
|
-
"Climatology, Meteorology and Atmosphere",
|
|
76
|
-
"Economy",
|
|
77
|
-
"Elevation",
|
|
78
|
-
"Environment",
|
|
79
|
-
"Geoscientific Information",
|
|
80
|
-
"Health",
|
|
81
|
-
"Imagery and Base Maps",
|
|
82
|
-
"Intelligence and Military",
|
|
83
|
-
"Inland Waters",
|
|
84
|
-
"Location",
|
|
85
|
-
"Oceans",
|
|
86
|
-
"Planning and Cadastral",
|
|
87
|
-
"Society",
|
|
88
|
-
"Structure",
|
|
89
|
-
"Transportation",
|
|
90
|
-
"Utilities and Communications"
|
|
91
|
-
]
|
|
70
|
+
"type": "string"
|
|
92
71
|
}
|
|
93
72
|
},
|
|
94
73
|
"dcat_keyword_sm": {
|
|
@@ -123,7 +102,8 @@
|
|
|
123
102
|
}
|
|
124
103
|
},
|
|
125
104
|
"locn_geometry": { "type": "string" },
|
|
126
|
-
"
|
|
105
|
+
"dcat_bbox": { "type": "string" },
|
|
106
|
+
"dcat_centroid": { "type": "string" },
|
|
127
107
|
"dct_relation_sm": {
|
|
128
108
|
"type": "array",
|
|
129
109
|
"items": {
|