geoblacklight 2.3.0

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.
Files changed (418) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +195 -0
  3. data/.github/ISSUE_TEMPLATE.md +17 -0
  4. data/.gitignore +21 -0
  5. data/.gitmodules +0 -0
  6. data/.hound.yml +8 -0
  7. data/.jshintignore +2 -0
  8. data/.jshintrc +67 -0
  9. data/.rubocop.yml +99 -0
  10. data/.rubocop_todo.yml +196 -0
  11. data/.solr_wrapper +5 -0
  12. data/CODE_OF_CONDUCT.md +76 -0
  13. data/CONTRIBUTING.md +49 -0
  14. data/Gemfile +39 -0
  15. data/LICENSE.txt +13 -0
  16. data/README.md +39 -0
  17. data/Rakefile +125 -0
  18. data/app/assets/images/blacklight/arrow-circle-down.svg +4 -0
  19. data/app/assets/images/blacklight/baruch-cuny.svg +6 -0
  20. data/app/assets/images/blacklight/berkeley.svg +7 -0
  21. data/app/assets/images/blacklight/book.svg +6 -0
  22. data/app/assets/images/blacklight/bookmark.svg +6 -0
  23. data/app/assets/images/blacklight/cd-rom.svg +6 -0
  24. data/app/assets/images/blacklight/chicago.svg +7 -0
  25. data/app/assets/images/blacklight/columbia.svg +6 -0
  26. data/app/assets/images/blacklight/cornell.svg +8 -0
  27. data/app/assets/images/blacklight/dvd-rom.svg +6 -0
  28. data/app/assets/images/blacklight/email.svg +6 -0
  29. data/app/assets/images/blacklight/esri-globe.svg +34 -0
  30. data/app/assets/images/blacklight/geoblacklight-icons.json +2079 -0
  31. data/app/assets/images/blacklight/globe.svg +4 -0
  32. data/app/assets/images/blacklight/harvard.svg +6 -0
  33. data/app/assets/images/blacklight/home.svg +4 -0
  34. data/app/assets/images/blacklight/illinois.svg +7 -0
  35. data/app/assets/images/blacklight/image.svg +6 -0
  36. data/app/assets/images/blacklight/indiana.svg +6 -0
  37. data/app/assets/images/blacklight/iowa.svg +6 -0
  38. data/app/assets/images/blacklight/leaf.svg +6 -0
  39. data/app/assets/images/blacklight/lewis-clark.svg +8 -0
  40. data/app/assets/images/blacklight/line.svg +7 -0
  41. data/app/assets/images/blacklight/logo.svg +1 -0
  42. data/app/assets/images/blacklight/map-marker.svg +6 -0
  43. data/app/assets/images/blacklight/map.svg +6 -0
  44. data/app/assets/images/blacklight/maryland.svg +6 -0
  45. data/app/assets/images/blacklight/massgis.svg +6 -0
  46. data/app/assets/images/blacklight/metadata.svg +6 -0
  47. data/app/assets/images/blacklight/michigan-state.svg +7 -0
  48. data/app/assets/images/blacklight/michigan.svg +6 -0
  49. data/app/assets/images/blacklight/minnesota.svg +6 -0
  50. data/app/assets/images/blacklight/mit.svg +6 -0
  51. data/app/assets/images/blacklight/mixed.svg +8 -0
  52. data/app/assets/images/blacklight/multilinestring.svg +9 -0
  53. data/app/assets/images/blacklight/multipoint.svg +6 -0
  54. data/app/assets/images/blacklight/multipolygon.svg +9 -0
  55. data/app/assets/images/blacklight/nyu.svg +9 -0
  56. data/app/assets/images/blacklight/ohio-state.svg +8 -0
  57. data/app/assets/images/blacklight/pagelines-brands.svg +6 -0
  58. data/app/assets/images/blacklight/paper-map.svg +6 -0
  59. data/app/assets/images/blacklight/penn-state.svg +7 -0
  60. data/app/assets/images/blacklight/point.svg +6 -0
  61. data/app/assets/images/blacklight/polygon.svg +7 -0
  62. data/app/assets/images/blacklight/polyline.svg +9 -0
  63. data/app/assets/images/blacklight/princeton.svg +6 -0
  64. data/app/assets/images/blacklight/public.svg +6 -0
  65. data/app/assets/images/blacklight/purdue.svg +7 -0
  66. data/app/assets/images/blacklight/raster.svg +6 -0
  67. data/app/assets/images/blacklight/restricted.svg +6 -0
  68. data/app/assets/images/blacklight/sms.svg +6 -0
  69. data/app/assets/images/blacklight/stanford.svg +6 -0
  70. data/app/assets/images/blacklight/table.svg +6 -0
  71. data/app/assets/images/blacklight/tags.svg +4 -0
  72. data/app/assets/images/blacklight/texas.svg +6 -0
  73. data/app/assets/images/blacklight/tufts.svg +6 -0
  74. data/app/assets/images/blacklight/ucla.svg +6 -0
  75. data/app/assets/images/blacklight/uva.svg +6 -0
  76. data/app/assets/images/blacklight/web_services.svg +6 -0
  77. data/app/assets/images/blacklight/wisconsin.svg +6 -0
  78. data/app/assets/javascripts/geoblacklight/basemaps.js +85 -0
  79. data/app/assets/javascripts/geoblacklight/controls.js +1 -0
  80. data/app/assets/javascripts/geoblacklight/controls/opacity.js +6 -0
  81. data/app/assets/javascripts/geoblacklight/downloaders.js +1 -0
  82. data/app/assets/javascripts/geoblacklight/downloaders/downloader.js +61 -0
  83. data/app/assets/javascripts/geoblacklight/downloaders/hgl_downloader.js +32 -0
  84. data/app/assets/javascripts/geoblacklight/geoblacklight.js +42 -0
  85. data/app/assets/javascripts/geoblacklight/modules.js +1 -0
  86. data/app/assets/javascripts/geoblacklight/modules/collapse.js +7 -0
  87. data/app/assets/javascripts/geoblacklight/modules/download.js +11 -0
  88. data/app/assets/javascripts/geoblacklight/modules/geosearch.js +133 -0
  89. data/app/assets/javascripts/geoblacklight/modules/help_text.js +7 -0
  90. data/app/assets/javascripts/geoblacklight/modules/home.js +16 -0
  91. data/app/assets/javascripts/geoblacklight/modules/item.js +13 -0
  92. data/app/assets/javascripts/geoblacklight/modules/layer_opacity.js +68 -0
  93. data/app/assets/javascripts/geoblacklight/modules/metadata.js +15 -0
  94. data/app/assets/javascripts/geoblacklight/modules/metadata_download_button.js +53 -0
  95. data/app/assets/javascripts/geoblacklight/modules/relations.js +14 -0
  96. data/app/assets/javascripts/geoblacklight/modules/results.js +82 -0
  97. data/app/assets/javascripts/geoblacklight/modules/util.js +38 -0
  98. data/app/assets/javascripts/geoblacklight/templates/index_map_download.hbs +19 -0
  99. data/app/assets/javascripts/geoblacklight/templates/index_map_info.hbs +40 -0
  100. data/app/assets/javascripts/geoblacklight/viewers.js +1 -0
  101. data/app/assets/javascripts/geoblacklight/viewers/esri.js +77 -0
  102. data/app/assets/javascripts/geoblacklight/viewers/esri/dynamic_map_layer.js +85 -0
  103. data/app/assets/javascripts/geoblacklight/viewers/esri/feature_layer.js +76 -0
  104. data/app/assets/javascripts/geoblacklight/viewers/esri/image_map_layer.js +14 -0
  105. data/app/assets/javascripts/geoblacklight/viewers/esri/tiled_map_layer.js +50 -0
  106. data/app/assets/javascripts/geoblacklight/viewers/iiif.js +25 -0
  107. data/app/assets/javascripts/geoblacklight/viewers/index_map.js +70 -0
  108. data/app/assets/javascripts/geoblacklight/viewers/map.js +67 -0
  109. data/app/assets/javascripts/geoblacklight/viewers/oembed.js +13 -0
  110. data/app/assets/javascripts/geoblacklight/viewers/viewer.js +65 -0
  111. data/app/assets/javascripts/geoblacklight/viewers/wms.js +74 -0
  112. data/app/assets/stylesheets/geoblacklight/_blacklight_overrides.scss +51 -0
  113. data/app/assets/stylesheets/geoblacklight/_geoblacklight.scss +36 -0
  114. data/app/assets/stylesheets/geoblacklight/_styles.scss +4 -0
  115. data/app/assets/stylesheets/geoblacklight/application.scss +2 -0
  116. data/app/assets/stylesheets/geoblacklight/modules/downloads.scss +93 -0
  117. data/app/assets/stylesheets/geoblacklight/modules/facets.scss +5 -0
  118. data/app/assets/stylesheets/geoblacklight/modules/geosearch.scss +29 -0
  119. data/app/assets/stylesheets/geoblacklight/modules/home.scss +28 -0
  120. data/app/assets/stylesheets/geoblacklight/modules/icon-customization.scss +50 -0
  121. data/app/assets/stylesheets/geoblacklight/modules/index_maps.scss +7 -0
  122. data/app/assets/stylesheets/geoblacklight/modules/item.scss +26 -0
  123. data/app/assets/stylesheets/geoblacklight/modules/layer_opacity.scss +87 -0
  124. data/app/assets/stylesheets/geoblacklight/modules/metadata.scss +31 -0
  125. data/app/assets/stylesheets/geoblacklight/modules/metadata_content.scss +43 -0
  126. data/app/assets/stylesheets/geoblacklight/modules/metadata_markup.scss +9 -0
  127. data/app/assets/stylesheets/geoblacklight/modules/metadata_missing.scss +7 -0
  128. data/app/assets/stylesheets/geoblacklight/modules/mixins.scss +5 -0
  129. data/app/assets/stylesheets/geoblacklight/modules/modal.scss +14 -0
  130. data/app/assets/stylesheets/geoblacklight/modules/relations.scss +15 -0
  131. data/app/assets/stylesheets/geoblacklight/modules/results.scss +68 -0
  132. data/app/assets/stylesheets/geoblacklight/modules/search_widgets.scss +5 -0
  133. data/app/assets/stylesheets/geoblacklight/modules/sidebar.scss +60 -0
  134. data/app/assets/stylesheets/geoblacklight/modules/toolbar.scss +70 -0
  135. data/app/assets/stylesheets/geoblacklight/modules/web_services.scss +5 -0
  136. data/app/controllers/download_controller.rb +114 -0
  137. data/app/controllers/relation_controller.rb +20 -0
  138. data/app/controllers/wms_controller.rb +15 -0
  139. data/app/helpers/arcgis_helper.rb +12 -0
  140. data/app/helpers/blacklight_helper.rb +9 -0
  141. data/app/helpers/carto_helper.rb +29 -0
  142. data/app/helpers/geoblacklight_helper.rb +323 -0
  143. data/app/models/concerns/geoblacklight/solr_document.rb +113 -0
  144. data/app/models/concerns/geoblacklight/solr_document/arcgis.rb +10 -0
  145. data/app/models/concerns/geoblacklight/solr_document/carto.rb +28 -0
  146. data/app/models/concerns/geoblacklight/solr_document/finder.rb +38 -0
  147. data/app/models/concerns/geoblacklight/solr_document/inspection.rb +15 -0
  148. data/app/models/concerns/geoblacklight/spatial_search_behavior.rb +69 -0
  149. data/app/presenters/geoblacklight/document_presenter.rb +23 -0
  150. data/app/views/catalog/_data_dictionary.html.erb +6 -0
  151. data/app/views/catalog/_document_action.html.erb +6 -0
  152. data/app/views/catalog/_document_split.html.erb +6 -0
  153. data/app/views/catalog/_download_generated_link.html.erb +4 -0
  154. data/app/views/catalog/_download_link.html.erb +3 -0
  155. data/app/views/catalog/_downloads_generated.html.erb +6 -0
  156. data/app/views/catalog/_downloads_primary.html.erb +14 -0
  157. data/app/views/catalog/_downloads_secondary.html.erb +39 -0
  158. data/app/views/catalog/_exports.html.erb +3 -0
  159. data/app/views/catalog/_facet_tag_item.html.erb +3 -0
  160. data/app/views/catalog/_facet_tag_layout.html.erb +2 -0
  161. data/app/views/catalog/_header_icons.html.erb +3 -0
  162. data/app/views/catalog/_home_text.html.erb +43 -0
  163. data/app/views/catalog/_icon_facet.html.erb +16 -0
  164. data/app/views/catalog/_index_split_default.html.erb +22 -0
  165. data/app/views/catalog/_metadata.html.erb +27 -0
  166. data/app/views/catalog/_relations_container.html.erb +1 -0
  167. data/app/views/catalog/_results_pagination.html.erb +12 -0
  168. data/app/views/catalog/_show_default_attribute_table.html.erb +19 -0
  169. data/app/views/catalog/_show_default_viewer_container.html.erb +12 -0
  170. data/app/views/catalog/_show_default_viewer_information.html.erb +4 -0
  171. data/app/views/catalog/_show_downloads.html.erb +34 -0
  172. data/app/views/catalog/_show_header_default.html.erb +4 -0
  173. data/app/views/catalog/_show_sidebar.html.erb +12 -0
  174. data/app/views/catalog/_show_tools.html.erb +25 -0
  175. data/app/views/catalog/_web_services.html.erb +8 -0
  176. data/app/views/catalog/_web_services_default.html.erb +8 -0
  177. data/app/views/catalog/_web_services_wfs.html.erb +8 -0
  178. data/app/views/catalog/_web_services_wms.html.erb +8 -0
  179. data/app/views/catalog/index.html.erb +13 -0
  180. data/app/views/catalog/metadata.html.erb +11 -0
  181. data/app/views/catalog/metadata/_content.html.erb +3 -0
  182. data/app/views/catalog/metadata/_markup.html.erb +8 -0
  183. data/app/views/catalog/metadata/_missing.html.erb +6 -0
  184. data/app/views/catalog/web_services.html.erb +10 -0
  185. data/app/views/download/hgl.html.erb +25 -0
  186. data/app/views/relation/_ancestors.html.erb +11 -0
  187. data/app/views/relation/_descendants.html.erb +18 -0
  188. data/app/views/relation/index.html.erb +13 -0
  189. data/app/views/relation/index.json.jbuilder +3 -0
  190. data/app/views/shared/_header_navbar.html.erb +38 -0
  191. data/config/initializers/rails_config.rb +3 -0
  192. data/config/locales/geoblacklight.en.yml +163 -0
  193. data/geoblacklight.gemspec +49 -0
  194. data/lib/generators/geoblacklight/install_generator.rb +105 -0
  195. data/lib/generators/geoblacklight/templates/Procfile +3 -0
  196. data/lib/generators/geoblacklight/templates/catalog_controller.rb +272 -0
  197. data/lib/generators/geoblacklight/templates/geoblacklight.js +10 -0
  198. data/lib/generators/geoblacklight/templates/geoblacklight.scss +4 -0
  199. data/lib/generators/geoblacklight/templates/package.json +14 -0
  200. data/lib/generators/geoblacklight/templates/settings.yml +127 -0
  201. data/lib/generators/geoblacklight/templates/webpacker.yml +67 -0
  202. data/lib/generators/geoblacklight/webpacker_generator.rb +35 -0
  203. data/lib/geoblacklight.rb +50 -0
  204. data/lib/geoblacklight/bounding_box.rb +45 -0
  205. data/lib/geoblacklight/catalog_helper_override.rb +13 -0
  206. data/lib/geoblacklight/constants.rb +28 -0
  207. data/lib/geoblacklight/download.rb +108 -0
  208. data/lib/geoblacklight/download/geojson_download.rb +22 -0
  209. data/lib/geoblacklight/download/geotiff_download.rb +20 -0
  210. data/lib/geoblacklight/download/hgl_download.rb +18 -0
  211. data/lib/geoblacklight/download/kmz_download.rb +22 -0
  212. data/lib/geoblacklight/download/shapefile_download.rb +20 -0
  213. data/lib/geoblacklight/engine.rb +27 -0
  214. data/lib/geoblacklight/exceptions.rb +27 -0
  215. data/lib/geoblacklight/geoblacklight_helper_behavior.rb +14 -0
  216. data/lib/geoblacklight/item_viewer.rb +54 -0
  217. data/lib/geoblacklight/metadata.rb +18 -0
  218. data/lib/geoblacklight/metadata/base.rb +93 -0
  219. data/lib/geoblacklight/metadata/fgdc.rb +14 -0
  220. data/lib/geoblacklight/metadata/html.rb +13 -0
  221. data/lib/geoblacklight/metadata/iso19139.rb +14 -0
  222. data/lib/geoblacklight/metadata_transformer.rb +33 -0
  223. data/lib/geoblacklight/metadata_transformer/base.rb +42 -0
  224. data/lib/geoblacklight/metadata_transformer/fgdc.rb +8 -0
  225. data/lib/geoblacklight/metadata_transformer/iso19139.rb +8 -0
  226. data/lib/geoblacklight/reference.rb +45 -0
  227. data/lib/geoblacklight/references.rb +132 -0
  228. data/lib/geoblacklight/relation/ancestors.rb +27 -0
  229. data/lib/geoblacklight/relation/descendants.rb +27 -0
  230. data/lib/geoblacklight/relation/relation_response.rb +24 -0
  231. data/lib/geoblacklight/routes.rb +7 -0
  232. data/lib/geoblacklight/routes/downloadable.rb +14 -0
  233. data/lib/geoblacklight/routes/exportable.rb +17 -0
  234. data/lib/geoblacklight/routes/wms.rb +13 -0
  235. data/lib/geoblacklight/version.rb +3 -0
  236. data/lib/geoblacklight/view_helper_override.rb +40 -0
  237. data/lib/geoblacklight/wms_layer.rb +35 -0
  238. data/lib/geoblacklight/wms_layer/feature_info_response.rb +32 -0
  239. data/lib/tasks/geoblacklight.rake +108 -0
  240. data/package.json +4 -0
  241. data/schema/format-values.md +50 -0
  242. data/schema/geoblacklight-schema-deprecated.md +39 -0
  243. data/schema/geoblacklight-schema.json +214 -0
  244. data/schema/geoblacklight-schema.md +323 -0
  245. data/schema/geometry-type-values.md +11 -0
  246. data/schema/references.md +23 -0
  247. data/schema/schema-commentary.md +198 -0
  248. data/schema/subjects.md +41 -0
  249. data/schema/type-values.md +10 -0
  250. data/solr/conf/_rest_managed.json +3 -0
  251. data/solr/conf/admin-extra.html +31 -0
  252. data/solr/conf/core.properties +5 -0
  253. data/solr/conf/elevate.xml +36 -0
  254. data/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  255. data/solr/conf/protwords.txt +21 -0
  256. data/solr/conf/schema.xml +198 -0
  257. data/solr/conf/scripts.conf +24 -0
  258. data/solr/conf/solrconfig.xml +243 -0
  259. data/solr/conf/spellings.txt +2 -0
  260. data/solr/conf/stopwords.txt +58 -0
  261. data/solr/conf/stopwords_en.txt +58 -0
  262. data/solr/conf/synonyms.txt +31 -0
  263. data/solr/conf/xslt/example.xsl +132 -0
  264. data/solr/conf/xslt/example_atom.xsl +67 -0
  265. data/solr/conf/xslt/example_rss.xsl +66 -0
  266. data/solr/conf/xslt/luke.xsl +337 -0
  267. data/spec/controllers/catalog_controller_spec.rb +82 -0
  268. data/spec/controllers/download_controller_spec.rb +120 -0
  269. data/spec/controllers/relation_controller_spec.rb +11 -0
  270. data/spec/controllers/wms_controller_spec.rb +34 -0
  271. data/spec/factories/user.rb +7 -0
  272. data/spec/features/bookmarks_spec.rb +10 -0
  273. data/spec/features/configurable_basemap_spec.rb +35 -0
  274. data/spec/features/data_dictionary_download_spec.rb +16 -0
  275. data/spec/features/download_layer_spec.rb +93 -0
  276. data/spec/features/empty_search_spec.rb +11 -0
  277. data/spec/features/esri_viewer_spec.rb +42 -0
  278. data/spec/features/exports_spec.rb +36 -0
  279. data/spec/features/help_text_spec.rb +8 -0
  280. data/spec/features/home_page_spec.rb +40 -0
  281. data/spec/features/iiif_viewer_spec.rb +8 -0
  282. data/spec/features/index_map_spec.rb +31 -0
  283. data/spec/features/layer_inspection_spec.rb +10 -0
  284. data/spec/features/layer_opacity_spec.rb +20 -0
  285. data/spec/features/layer_preview_spec.rb +17 -0
  286. data/spec/features/layer_with_no_references_spec.rb +8 -0
  287. data/spec/features/linkified_attribute_table_spec.rb +11 -0
  288. data/spec/features/metadata_panel_spec.rb +78 -0
  289. data/spec/features/missing_metadata_spec.rb +24 -0
  290. data/spec/features/oembed_spec.rb +9 -0
  291. data/spec/features/relations_spec.rb +51 -0
  292. data/spec/features/saved_searches_spec.rb +13 -0
  293. data/spec/features/search_bar_spec.rb +12 -0
  294. data/spec/features/search_results_map_spec.rb +55 -0
  295. data/spec/features/search_results_overlap_ratio_spec.rb +55 -0
  296. data/spec/features/search_spec.rb +14 -0
  297. data/spec/features/show_page_metadata_spec.rb +12 -0
  298. data/spec/features/sms_spec.rb +15 -0
  299. data/spec/features/split_view.html.erb_spec.rb +75 -0
  300. data/spec/features/suppressed_records_spec.rb +14 -0
  301. data/spec/features/web_services_modal_spec.rb +25 -0
  302. data/spec/fixtures/fgdc/harvard-g7064-s2-1834-k3.xml +1 -0
  303. data/spec/fixtures/iso19139/stanford-cg357zz0321.xml +581 -0
  304. data/spec/fixtures/mods/fb897vt9938.mods +111 -0
  305. data/spec/fixtures/mods/stanford-cg357zz0321.mods +113 -0
  306. data/spec/fixtures/solr_documents/README.md +40 -0
  307. data/spec/fixtures/solr_documents/actual-papermap1.json +23 -0
  308. data/spec/fixtures/solr_documents/actual-point1.json +37 -0
  309. data/spec/fixtures/solr_documents/actual-polygon1.json +23 -0
  310. data/spec/fixtures/solr_documents/actual-raster1.json +38 -0
  311. data/spec/fixtures/solr_documents/baruch_ancestor1.json +46 -0
  312. data/spec/fixtures/solr_documents/baruch_ancestor2.json +46 -0
  313. data/spec/fixtures/solr_documents/baruch_documentation_download.json +49 -0
  314. data/spec/fixtures/solr_documents/bbox-spans-180.json +20 -0
  315. data/spec/fixtures/solr_documents/cornell_html_metadata.json +42 -0
  316. data/spec/fixtures/solr_documents/esri-dynamic-layer-all-layers.json +38 -0
  317. data/spec/fixtures/solr_documents/esri-dynamic-layer-single-layer.json +40 -0
  318. data/spec/fixtures/solr_documents/esri-feature-layer.json +46 -0
  319. data/spec/fixtures/solr_documents/esri-image-map-layer.json +42 -0
  320. data/spec/fixtures/solr_documents/esri-tiled_map_layer.json +22 -0
  321. data/spec/fixtures/solr_documents/esri-wms-layer.json +33 -0
  322. data/spec/fixtures/solr_documents/harvard_raster.json +44 -0
  323. data/spec/fixtures/solr_documents/iiif-eastern-hemisphere.json +30 -0
  324. data/spec/fixtures/solr_documents/index-map-polygon-no-downloadurl.json +37 -0
  325. data/spec/fixtures/solr_documents/index-map-polygon.json +37 -0
  326. data/spec/fixtures/solr_documents/index-map-stanford.json +37 -0
  327. data/spec/fixtures/solr_documents/index_map_point.json +27 -0
  328. data/spec/fixtures/solr_documents/metadata_no_dct_provenance_s.json +30 -0
  329. data/spec/fixtures/solr_documents/metadata_no_layer_geom_type_s.json +17 -0
  330. data/spec/fixtures/solr_documents/metadata_no_solr_geom.json +23 -0
  331. data/spec/fixtures/solr_documents/no_spatial.json +21 -0
  332. data/spec/fixtures/solr_documents/oembed.json +24 -0
  333. data/spec/fixtures/solr_documents/princeton-child1.json +30 -0
  334. data/spec/fixtures/solr_documents/princeton-child2.json +30 -0
  335. data/spec/fixtures/solr_documents/princeton-child3.json +30 -0
  336. data/spec/fixtures/solr_documents/princeton-child4.json +30 -0
  337. data/spec/fixtures/solr_documents/princeton-parent.json +25 -0
  338. data/spec/fixtures/solr_documents/public_direct_download.json +34 -0
  339. data/spec/fixtures/solr_documents/public_iiif_princeton.json +36 -0
  340. data/spec/fixtures/solr_documents/public_polygon_mit.json +27 -0
  341. data/spec/fixtures/solr_documents/restricted-line.json +37 -0
  342. data/spec/fixtures/solr_documents/umn_metro_result1.json +41 -0
  343. data/spec/fixtures/solr_documents/umn_state_result1.json +38 -0
  344. data/spec/fixtures/solr_documents/umn_state_result2.json +38 -0
  345. data/spec/fixtures/solr_documents/uva_slug_colon.json +25 -0
  346. data/spec/helpers/arcgis_helper_spec.rb +14 -0
  347. data/spec/helpers/carto_helper_spec.rb +11 -0
  348. data/spec/helpers/geoblacklight_helper_spec.rb +329 -0
  349. data/spec/javascripts/geoblacklight_spec.js +21 -0
  350. data/spec/javascripts/metadata_download_button_spec.js +14 -0
  351. data/spec/javascripts/spec_helper.js +32 -0
  352. data/spec/javascripts/util_spec.js +12 -0
  353. data/spec/lib/geoblacklight/bounding_box_spec.rb +27 -0
  354. data/spec/lib/geoblacklight/controller_override_spec.rb +1 -0
  355. data/spec/lib/geoblacklight/document_presenter_spec.rb +61 -0
  356. data/spec/lib/geoblacklight/download/geojson_download_spec.rb +19 -0
  357. data/spec/lib/geoblacklight/download/geotiff_download_spec.rb +20 -0
  358. data/spec/lib/geoblacklight/download/hgl_download_spec.rb +60 -0
  359. data/spec/lib/geoblacklight/download/kmz_download_spec.rb +20 -0
  360. data/spec/lib/geoblacklight/download/shapefile_download_spec.rb +19 -0
  361. data/spec/lib/geoblacklight/download_spec.rb +177 -0
  362. data/spec/lib/geoblacklight/geoblacklight_helper_behavior_spec.rb +30 -0
  363. data/spec/lib/geoblacklight/item_viewer_spec.rb +63 -0
  364. data/spec/lib/geoblacklight/metadata/base_spec.rb +157 -0
  365. data/spec/lib/geoblacklight/metadata/html_spec.rb +18 -0
  366. data/spec/lib/geoblacklight/metadata_spec.rb +42 -0
  367. data/spec/lib/geoblacklight/metadata_transformer/base_spec.rb +35 -0
  368. data/spec/lib/geoblacklight/metadata_transformer/fgdc_spec.rb +23 -0
  369. data/spec/lib/geoblacklight/metadata_transformer/iso19139_spec.rb +23 -0
  370. data/spec/lib/geoblacklight/metadata_transformer_spec.rb +69 -0
  371. data/spec/lib/geoblacklight/reference_spec.rb +64 -0
  372. data/spec/lib/geoblacklight/references_spec.rb +216 -0
  373. data/spec/lib/geoblacklight/relation/ancestors_spec.rb +32 -0
  374. data/spec/lib/geoblacklight/relation/descendants_spec.rb +32 -0
  375. data/spec/lib/geoblacklight/relation/relation_response_spec.rb +43 -0
  376. data/spec/lib/geoblacklight/view_helper_override_spec.rb +37 -0
  377. data/spec/lib/geoblacklight/wms_layer/feature_info_response_spec.rb +50 -0
  378. data/spec/lib/geoblacklight/wms_layer_spec.rb +99 -0
  379. data/spec/models/concerns/geoblacklight/solr_document/carto_spec.rb +61 -0
  380. data/spec/models/concerns/geoblacklight/solr_document/finder_spec.rb +40 -0
  381. data/spec/models/concerns/geoblacklight/solr_document/inspection_spec.rb +16 -0
  382. data/spec/models/concerns/geoblacklight/solr_document_spec.rb +251 -0
  383. data/spec/models/concerns/geoblacklight/spatial_search_behavior_spec.rb +84 -0
  384. data/spec/routing/catalog_routing_spec.rb +8 -0
  385. data/spec/spec_helper.rb +79 -0
  386. data/spec/support/backport_test_helpers.rb +45 -0
  387. data/spec/support/features.rb +5 -0
  388. data/spec/support/features/session_helpers.rb +20 -0
  389. data/spec/teaspoon_env.rb +213 -0
  390. data/spec/test_app_templates/Gemfile.extra +1 -0
  391. data/spec/test_app_templates/lib/generators/test_app_generator.rb +49 -0
  392. data/spec/test_app_templates/metadata/fgdc.html +129 -0
  393. data/spec/test_app_templates/metadata/fgdc.xml +145 -0
  394. data/spec/test_app_templates/metadata/iso.html +275 -0
  395. data/spec/test_app_templates/metadata/iso.xml +511 -0
  396. data/spec/test_app_templates/solr_documents +1 -0
  397. data/spec/views/catalog/_document_split.html.erb_spec.rb +5 -0
  398. data/spec/views/catalog/_index_split.html.erb_spec.rb +5 -0
  399. data/spec/views/catalog/_results_pagination.html.erb_spec.rb +9 -0
  400. data/spec/views/catalog/_show_downloads.html.erb_spec.rb +41 -0
  401. data/spec/views/catalog/_show_tools.html.erb_spec.rb +39 -0
  402. data/template.rb +19 -0
  403. data/vendor/assets/images/layers-2x.png +0 -0
  404. data/vendor/assets/images/layers.png +0 -0
  405. data/vendor/assets/images/marker-icon-2x.png +0 -0
  406. data/vendor/assets/images/marker-icon.png +0 -0
  407. data/vendor/assets/images/marker-shadow.png +0 -0
  408. data/vendor/assets/javascripts/esri-leaflet.js +5 -0
  409. data/vendor/assets/javascripts/esri-leaflet.js.map +1 -0
  410. data/vendor/assets/javascripts/leaflet-iiif.js +302 -0
  411. data/vendor/assets/javascripts/leaflet-src.js.map +1 -0
  412. data/vendor/assets/javascripts/leaflet.js.erb +13922 -0
  413. data/vendor/assets/javascripts/native.history.js +1 -0
  414. data/vendor/assets/javascripts/readmore.js +618 -0
  415. data/vendor/assets/javascripts/readmore.js.map +1 -0
  416. data/vendor/assets/stylesheets/leaflet-label.css +54 -0
  417. data/vendor/assets/stylesheets/leaflet.css +635 -0
  418. metadata +967 -0
@@ -0,0 +1,323 @@
1
+ module GeoblacklightHelper
2
+ def document_available?
3
+ @document.public? || (@document.same_institution? && user_signed_in?)
4
+ end
5
+
6
+ def document_downloadable?
7
+ document_available? && @document.downloadable?
8
+ end
9
+
10
+ def iiif_jpg_url
11
+ @document.references.iiif.endpoint.sub! 'info.json', 'full/full/0/default.jpg'
12
+ end
13
+
14
+ def download_link_direct(text, document)
15
+ link_to(
16
+ text,
17
+ document.direct_download[:download],
18
+ 'contentUrl' => document.direct_download[:download],
19
+ class: ['btn', 'btn-default', 'download', 'download-original'],
20
+ data: {
21
+ download: 'trigger',
22
+ download_type: 'direct',
23
+ download_id: document.id
24
+ }
25
+ )
26
+ end
27
+
28
+ def download_link_hgl(text, document)
29
+ link_to(
30
+ text,
31
+ download_hgl_path(id: document),
32
+ class: ['btn', 'btn-default', 'download', 'download-original'],
33
+ data: {
34
+ blacklight_modal: 'trigger',
35
+ download: 'trigger',
36
+ download_type: 'harvard-hgl',
37
+ download_id: document.id
38
+ }
39
+ )
40
+ end
41
+
42
+ # Generates the link markup for the IIIF JPEG download
43
+ # @return [String]
44
+ def download_link_iiif
45
+ link_to(
46
+ download_text('JPG'),
47
+ iiif_jpg_url,
48
+ 'contentUrl' => iiif_jpg_url,
49
+ class: ['btn', 'btn-default', 'download', 'download-generated'],
50
+ data: {
51
+ download: 'trigger'
52
+ }
53
+ )
54
+ end
55
+
56
+ def download_link_generated(download_type, document)
57
+ link_to(
58
+ t('geoblacklight.download.export_link', download_format: proper_case_format(download_type)),
59
+ '',
60
+ class: ['btn', 'btn-default', 'download', 'download-generated'],
61
+ data: {
62
+ download_path: download_path(document.id, type: download_type),
63
+ download: 'trigger',
64
+ download_type: download_type,
65
+ download_id: document.id
66
+ }
67
+ )
68
+ end
69
+
70
+ ##
71
+ # Blacklight catalog controller helper method to truncate field value to 150 chars
72
+ # @param [SolrDocument] args
73
+ # @return [String]
74
+ def snippit(args)
75
+ truncate(Array(args[:value]).flatten.join(' '), length: 150)
76
+ end
77
+
78
+ def render_facet_tags(facet)
79
+ render_facet_limit(facets_from_request(facet).first,
80
+ partial: 'facet_tag_item',
81
+ layout: 'facet_tag_layout')
82
+ end
83
+
84
+ ##
85
+ # Returns an SVG icon or empty HTML span element
86
+ # @return [SVG or HTML tag]
87
+ def geoblacklight_icon(name)
88
+ icon_name = name ? name.to_s.parameterize : 'none'
89
+ begin
90
+ icon = blacklight_icon(icon_name)
91
+ # Add icon info to queue after icon instantiated successfully
92
+ queue_icon_aria_label(icon_name)
93
+ icon
94
+ rescue Blacklight::Exceptions::IconNotFound
95
+ tag.span class: 'icon-missing geoblacklight-none'
96
+ end
97
+ end
98
+
99
+ ##
100
+ # Render an empty span
101
+ # @return [HTML tag]
102
+ def render_empty_span(classname)
103
+ tag.span class: classname
104
+ end
105
+
106
+ ##
107
+ # Capture SVG icon aria labels to describe
108
+ def queue_icon_aria_label(feature_name)
109
+ @aria_labels ||= Set.new
110
+ @aria_labels << feature_name
111
+ end
112
+
113
+ ##
114
+ # Render a div of divs describing aria-labelledby values
115
+ # @return [HTML tag]
116
+ def render_aria_labels(aria_labels)
117
+ return unless aria_labels
118
+ content_tag :div, id: 'aria-labels', class: 'sr-only sr-only-focusable' do
119
+ aria_labels.each do |label|
120
+ concat(render_aria_label(label))
121
+ end
122
+ end
123
+ end
124
+
125
+ # Render a div describing a aria-labelledby value
126
+ # @return [HTML tag]
127
+ def render_aria_label(label)
128
+ content_tag :div, id: "aria-label-#{label}" do
129
+ I18n.t("geoblacklight.aria-labels.#{label}")
130
+ end
131
+ end
132
+
133
+ ##
134
+ # Renders an unique array of search links based off of terms
135
+ # passed in using the facet parameter
136
+ #
137
+ def render_facet_links(facet, items)
138
+ items.uniq.map do |item|
139
+ link_to item, search_catalog_path(f: { facet => [item] })
140
+ end.join(', ').html_safe
141
+ end
142
+
143
+ ##
144
+ # Looks up properly formatted names for formats
145
+ #
146
+ def proper_case_format(format)
147
+ t("geoblacklight.formats.#{format.to_s.parameterize(separator: '_')}")
148
+ end
149
+
150
+ ##
151
+ # Looks up formatted names for references
152
+ # @param (String, Symbol) reference
153
+ # @return (String)
154
+ def formatted_name_reference(reference)
155
+ t "geoblacklight.references.#{reference}"
156
+ end
157
+
158
+ ##
159
+ # Wraps download text with proper_case_format
160
+ #
161
+ def download_text(format)
162
+ download_format = proper_case_format(format)
163
+ value = t('geoblacklight.download.download_link', download_format: download_format)
164
+ value.html_safe
165
+ end
166
+
167
+ def download_generated_body(format)
168
+ value = proper_case_format(format)
169
+ value = case value
170
+ when t('geoblacklight.formats.shapefile')
171
+ t('geoblacklight.download.export_shapefile_link')
172
+ when t('geoblacklight.formats.kmz')
173
+ t('geoblacklight.download.export_kmz_link')
174
+ when t('geoblacklight.formats.geojson')
175
+ t('geoblacklight.download.export_geojson_link')
176
+ else
177
+ value
178
+ end
179
+
180
+ value.html_safe
181
+ end
182
+
183
+ ##
184
+ # Deteremines if a feature should include help text popover
185
+ # @return [Boolean]
186
+ def show_help_text?(feature, key)
187
+ Settings&.HELP_TEXT&.send(feature)&.include?(key)
188
+ end
189
+
190
+ ##
191
+ # Render help text popover for a given feature and translation key
192
+ # @return [HTML tag]
193
+ def render_help_text_entry(feature, key)
194
+ if I18n.exists?("geoblacklight.help_text.#{feature}.#{key}", locale)
195
+ help_text = I18n.t("geoblacklight.help_text.#{feature}.#{key}")
196
+ content_tag :h3, class: 'help-text viewer_protocol h6' do
197
+ content_tag :a, 'data': { toggle: 'popover', title: help_text[:title], content: help_text[:content] } do
198
+ help_text[:title]
199
+ end
200
+ end
201
+ else
202
+ tag.span class: 'help-text translation-missing'
203
+ end
204
+ end
205
+
206
+ ##
207
+ # Deteremines if item view should include attribute table
208
+ # @return [Boolean]
209
+ def show_attribute_table?
210
+ document_available? && @document.inspectable?
211
+ end
212
+
213
+ ##
214
+ # Render value for a document's field as a truncate abstract
215
+ # div. Arguments come from Blacklight::DocumentPresenter's
216
+ # get_field_values method
217
+ # @param [Hash] args from get_field_values
218
+ def render_value_as_truncate_abstract(args)
219
+ content_tag :div, class: 'truncate-abstract' do
220
+ Array(args[:value]).flatten.join(' ')
221
+ end
222
+ end
223
+
224
+ ##
225
+ # Selects the basemap used for map displays
226
+ # @return [String]
227
+ def geoblacklight_basemap
228
+ blacklight_config.basemap_provider || 'positron'
229
+ end
230
+
231
+ def display_carto
232
+ return link_to(
233
+ content_tag(:span, '', class: 'geoblacklight geoblacklight-carto') +
234
+ t('geoblacklight.tools.open_carto'),
235
+ carto_link(@document.carto_reference),
236
+ target: '_blank'
237
+ ) if @document.carto_reference.present? && !Settings.CARTO_HIDE
238
+ end
239
+
240
+ def display_arcgis
241
+ return link_to(
242
+ blacklight_icon('esri-globe') + ' ' +
243
+ t('geoblacklight.tools.open_arcgis'),
244
+ arcgis_link(@document.arcgis_urls)
245
+ ) if @document.arcgis_urls.present? && !Settings.ARCGIS_HIDE
246
+ end
247
+
248
+ ##
249
+ # Creates a Carto OneClick link link, using the configuration link
250
+ # @param [String] file_link
251
+ # @return [String]
252
+ # @deprecated Use {#carto_link} instead.
253
+ def cartodb_link(file_link)
254
+ carto_link(file_link)
255
+ end
256
+ deprecation_deprecate carto_link: 'use GeoblacklightHelper#carto_link instead'
257
+
258
+ ##
259
+ # Renders the partials for a Geoblacklight::Reference in the web services
260
+ # modal
261
+ # @param [Geoblacklight::Reference]
262
+ def render_web_services(reference)
263
+ render(
264
+ partial: "web_services_#{reference.type}",
265
+ locals: { reference: reference }
266
+ )
267
+ rescue ActionView::MissingTemplate
268
+ render partial: 'web_services_default', locals: { reference: reference }
269
+ end
270
+
271
+ ##
272
+ # Returns a hash of the leaflet plugin settings to pass to the viewer.
273
+ # @return[Hash]
274
+ def leaflet_options
275
+ Settings.LEAFLET
276
+ end
277
+
278
+ ##
279
+ # Renders a facet item with an icon placed as the first child of
280
+ # `.facet-label`. This works with `render_facet_value` and
281
+ # `render_selected_facet_value`
282
+ # @return String
283
+ def render_facet_item_with_icon(field_name, item)
284
+ doc = Nokogiri::HTML.fragment(render_facet_item(field_name, item))
285
+ doc.at_css('.facet-label').children.first
286
+ .add_previous_sibling(geoblacklight_icon(item.value))
287
+ doc.to_html.html_safe
288
+ end
289
+
290
+ ##
291
+ # Renders the transformed metadata
292
+ # (Renders a partial when the metadata isn't available)
293
+ # @param [Geoblacklight::Metadata::Base] metadata the metadata object
294
+ # @return [String]
295
+ def render_transformed_metadata(metadata)
296
+ render partial: 'catalog/metadata/content', locals: { content: metadata.transform.html_safe }
297
+ rescue Geoblacklight::MetadataTransformer::TransformError => transform_err
298
+ Geoblacklight.logger.warn transform_err.message
299
+ render partial: 'catalog/metadata/markup', locals: { content: metadata.to_xml }
300
+ rescue => err
301
+ Geoblacklight.logger.warn err.message
302
+ render partial: 'catalog/metadata/missing'
303
+ end
304
+
305
+ ##
306
+ # Determines whether or not the metadata is the first within the array of References
307
+ # @param [SolrDocument] document the Solr Document for the item
308
+ # @param [Geoblacklight::Metadata::Base] metadata the object for the metadata resource
309
+ # @return [Boolean]
310
+ def first_metadata?(document, metadata)
311
+ document.references.shown_metadata.first.type == metadata.type
312
+ end
313
+
314
+ ##
315
+ # Renders a reference url for a document
316
+ # @param [Hash] document, field_name
317
+ def render_references_url(args)
318
+ link_to(
319
+ args[:document].references.url.endpoint,
320
+ args[:document].references.url.endpoint
321
+ ) if args[:document]&.references&.url
322
+ end
323
+ end
@@ -0,0 +1,113 @@
1
+ module Geoblacklight
2
+ # Extends Blacklight::Solr::Document for GeoBlacklight specific functionalit
3
+ module SolrDocument
4
+ extend Blacklight::Solr::Document
5
+
6
+ include Geoblacklight::SolrDocument::Finder
7
+ include Geoblacklight::SolrDocument::Carto
8
+ include Geoblacklight::SolrDocument::Inspection
9
+ include Geoblacklight::SolrDocument::Arcgis
10
+
11
+ delegate :download_types, to: :references
12
+ delegate :viewer_protocol, to: :item_viewer
13
+ delegate :viewer_endpoint, to: :item_viewer
14
+
15
+ def available?
16
+ public? || same_institution?
17
+ end
18
+
19
+ def public?
20
+ fetch(Settings.FIELDS.RIGHTS).casecmp('public').zero?
21
+ end
22
+
23
+ def restricted?
24
+ fetch(Settings.FIELDS.RIGHTS).casecmp('restricted').zero?
25
+ end
26
+
27
+ def downloadable?
28
+ (direct_download || download_types.present? || iiif_download) && available?
29
+ end
30
+
31
+ def references
32
+ References.new(self)
33
+ end
34
+
35
+ def direct_download
36
+ references.download.to_hash unless references.download.blank?
37
+ end
38
+
39
+ def hgl_download
40
+ references.hgl.to_hash unless references.hgl.blank?
41
+ end
42
+
43
+ def oembed
44
+ references.oembed.endpoint unless references.oembed.blank?
45
+ end
46
+
47
+ def same_institution?
48
+ fetch(Settings.FIELDS.PROVENANCE, '').casecmp(Settings.INSTITUTION.downcase).zero?
49
+ end
50
+
51
+ def iiif_download
52
+ references.iiif.to_hash unless references.iiif.blank?
53
+ end
54
+
55
+ def data_dictionary_download
56
+ references.data_dictionary.to_hash unless references.data_dictionary.blank?
57
+ end
58
+
59
+ def external_url
60
+ references.url.endpoint if references.url
61
+ end
62
+
63
+ def item_viewer
64
+ ItemViewer.new(references)
65
+ end
66
+
67
+ def itemtype
68
+ 'http://schema.org/Dataset'
69
+ end
70
+
71
+ def bounding_box_as_wsen
72
+ geom_field = fetch(Settings.FIELDS.GEOMETRY, '')
73
+ exp = /^\s*ENVELOPE\(
74
+ \s*([-\.\d]+)\s*,
75
+ \s*([-\.\d]+)\s*,
76
+ \s*([-\.\d]+)\s*,
77
+ \s*([-\.\d]+)\s*
78
+ \)\s*$/x # uses 'x' option for free-spacing mode
79
+ bbox_match = exp.match(geom_field)
80
+ return geom_field unless bbox_match # return as-is, not a WKT
81
+ w, e, n, s = bbox_match.captures
82
+ "#{w} #{s} #{e} #{n}"
83
+ end
84
+
85
+ def wxs_identifier
86
+ fetch(Settings.FIELDS.WXS_IDENTIFIER, '')
87
+ end
88
+
89
+ def file_format
90
+ fetch(Settings.FIELDS.FILE_FORMAT)
91
+ end
92
+
93
+ ##
94
+ # Provides a convenience method to access a SolrDocument's References
95
+ # endpoint url without having to check and see if it is available
96
+ # :type => a string which if its a Geoblacklight::Constants::URI key
97
+ # will return a coresponding Geoblacklight::Reference
98
+ def checked_endpoint(type)
99
+ type = references.send(type)
100
+ type.endpoint if type.present?
101
+ end
102
+
103
+ private
104
+
105
+ def method_missing(method, *args, &block)
106
+ if /.*_url$/ =~ method.to_s
107
+ checked_endpoint(method.to_s.gsub('_url', ''))
108
+ else
109
+ super
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,10 @@
1
+ module Geoblacklight
2
+ module SolrDocument
3
+ module Arcgis
4
+ def arcgis_urls
5
+ return unless references.esri_webservices.present?
6
+ references.esri_webservices.map { |layer| layer.reference[1] if layer }.compact
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module Geoblacklight
2
+ module SolrDocument
3
+ ##
4
+ # Module for providing external Carto download references for a document
5
+ module Carto
6
+ extend Deprecation
7
+ self.deprecation_horizon = 'Geoblacklight 2.0.0'
8
+ ##
9
+ # Returns a url to a file that should be used with CartoDB integration
10
+ # @return [String]
11
+ # @deprecated Use {#carto_reference} instead
12
+ def cartodb_reference
13
+ carto_reference
14
+ end
15
+ deprecation_deprecate(
16
+ cartodb_reference: 'use Geoblacklight::SolrDocument::Carto#carto_reference instead'
17
+ )
18
+
19
+ ##
20
+ # Returns a url to a file that should be used with CartoDB integration
21
+ # @return [String]
22
+ def carto_reference
23
+ return unless public? && download_types.try(:[], :geojson).present?
24
+ Geoblacklight::GeojsonDownload.new(self).url_with_params
25
+ end
26
+ end
27
+ end
28
+ end