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,14 @@
1
+ Blacklight.onLoad(function () {
2
+ $('[data-relations="true"]').each(function (i, element) {
3
+ var $elem = $(element);
4
+ var attributes = $elem.data();
5
+ var relation_url = attributes['url'] + '/relations';
6
+ $.ajax({
7
+ url: relation_url,
8
+ type: 'GET',
9
+ success: function (data) {
10
+ $elem.append($(data).hide().fadeIn(200));
11
+ }
12
+ })
13
+ });
14
+ });
@@ -0,0 +1,82 @@
1
+ Blacklight.onLoad(function() {
2
+ var historySupported = !!(window.history && window.history.pushState);
3
+
4
+ if (historySupported) {
5
+ History.Adapter.bind(window, 'statechange', function() {
6
+ var state = History.getState();
7
+ updatePage(state.url);
8
+ });
9
+ }
10
+
11
+ $('[data-map="index"]').each(function() {
12
+ var data = $(this).data(),
13
+ opts = { baseUrl: data.catalogPath },
14
+ world = L.latLngBounds([[-90, -180], [90, 180]]),
15
+ geoblacklight, bbox;
16
+
17
+ if (typeof data.mapBbox === 'string') {
18
+ bbox = L.bboxToBounds(data.mapBbox);
19
+ } else {
20
+ $('.document [data-bbox]').each(function() {
21
+
22
+ try {
23
+ var currentBounds = L.bboxToBounds($(this).data().bbox);
24
+ if (!world.contains(currentBounds)) {
25
+ throw "Invalid bounds";
26
+ }
27
+ if (typeof bbox === 'undefined') {
28
+ bbox = currentBounds;
29
+ } else {
30
+ bbox.extend(currentBounds);
31
+ }
32
+ } catch (e) {
33
+ bbox = L.bboxToBounds("-180 -90 180 90");
34
+ }
35
+ });
36
+ }
37
+
38
+ if (!historySupported) {
39
+ $.extend(opts, {
40
+ dynamic: false,
41
+ searcher: function() {
42
+ window.location.href = this.getSearchUrl();
43
+ }
44
+ });
45
+ }
46
+
47
+ // instantiate new map
48
+ geoblacklight = new GeoBlacklight.Viewer.Map(this, { bbox: bbox });
49
+
50
+ // set hover listeners on map
51
+ $('#content')
52
+ .on('mouseenter', '#documents [data-layer-id]', function() {
53
+ if($(this).data('bbox').length > 0) {
54
+ var bounds = L.bboxToBounds($(this).data('bbox'));
55
+ geoblacklight.addBoundsOverlay(bounds);
56
+ }
57
+ })
58
+ .on('mouseleave', '#documents [data-layer-id]', function() {
59
+ geoblacklight.removeBoundsOverlay();
60
+ });
61
+
62
+ // add geosearch control to map
63
+ geoblacklight.map.addControl(L.control.geosearch(opts));
64
+ });
65
+
66
+ function updatePage(url) {
67
+ $.get(url).done(function(data) {
68
+ var resp = $.parseHTML(data);
69
+ $doc = $(resp);
70
+ $('#documents').replaceWith($doc.find('#documents'));
71
+ $('#sidebar').replaceWith($doc.find('#sidebar'));
72
+ $('#sortAndPerPage').replaceWith($doc.find('#sortAndPerPage'));
73
+ $('#appliedParams').replaceWith($doc.find('#appliedParams'));
74
+ $('#pagination').replaceWith($doc.find('#pagination'));
75
+ if ($('#map').next().length) {
76
+ $('#map').next().replaceWith($doc.find('#map').next());
77
+ } else {
78
+ $('#map').after($doc.find('#map').next());
79
+ }
80
+ });
81
+ }
82
+ });
@@ -0,0 +1,38 @@
1
+ /*global GeoBlacklight */
2
+
3
+ GeoBlacklight.Util = {
4
+ // Regex taken from http://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links
5
+ linkify: function(str) {
6
+ var urlRegEx = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-]*)?\??(?:[\-\+=&;%@\.\w]*)#?(?:[\.\!\/\\\w]*))?)/g;
7
+ return str.toString().replace(urlRegEx, '<a href=\'$1\'>$1</a>');
8
+ },
9
+ /**
10
+ * Calls the index map download template
11
+ * @param {Object} data - GeoJSON feature properties object
12
+ * @param {requestCallback} cb
13
+ */
14
+ indexMapDownloadTemplate: function(data, cb) {
15
+ cb(HandlebarsTemplates["index_map_download"](data));
16
+ },
17
+ /**
18
+ * Calls the index map template
19
+ * @param {Object} data - GeoJSON feature properties object
20
+ * @param {requestCallback} cb
21
+ */
22
+ indexMapTemplate: function(data, cb) {
23
+ var thumbDeferred = $.Deferred();
24
+ $.when(thumbDeferred).done(function() {
25
+ cb(HandlebarsTemplates["index_map_info"](data));
26
+ });
27
+ if (data.iiifUrl && !data.thumbnailUrl) {
28
+ var manifest = $.getJSON(data.iiifUrl, function(manifestResponse) {
29
+ if (manifestResponse.thumbnail['@id'] !== null) {
30
+ data.thumbnailUrl = manifestResponse.thumbnail['@id'];
31
+ thumbDeferred.resolve();
32
+ }
33
+ });
34
+ } else {
35
+ thumbDeferred.resolve();
36
+ }
37
+ }
38
+ };
@@ -0,0 +1,19 @@
1
+ {{#if downloadUrl}}
2
+ <li class="list-group-item download js-index-map-feature">
3
+ <h3 class="card-subtitle">Selected feature</h3>
4
+
5
+ <ul class="list-group list-group-flush list-group-nested">
6
+ <li class="list-group-item download">
7
+ <div class="download-link-container">
8
+ <a class="btn btn-default download download-original" href="{{downloadUrl}}">
9
+ {{#if label}}
10
+ {{label}}
11
+ {{else}}
12
+ Download
13
+ {{/if}}
14
+ </a>
15
+ </div>
16
+ </li>
17
+ </ul>
18
+ </li>
19
+ {{/if}}
@@ -0,0 +1,40 @@
1
+ <div class="index-map-info">
2
+ {{#if title}}
3
+ <div class="col-sm-12">
4
+ <h3>{{title}}</h3>
5
+ </div>
6
+ {{/if}}
7
+ <div class="col-sm-12">
8
+ {{#if thumbnailUrl}}
9
+ {{#if websiteUrl}}
10
+ <a href="{{websiteUrl}}">
11
+ <img src="{{thumbnailUrl}}" class="img-responsive">
12
+ </a>
13
+ {{else}}
14
+ <img src="{{thumbnailUrl}}">
15
+ {{/if}}
16
+ {{/if}}
17
+ <dl class="row dl-invert document-metadata">
18
+ {{#if websiteUrl}}
19
+ <dt class="col-sm-3">Website:</dt>
20
+ <dd class="col-sm-9"><a href="{{websiteUrl}}">{{websiteUrl}}</a></dd>
21
+ {{/if}}
22
+ {{#if downloadUrl}}
23
+ <dt class="col-sm-3">Download:</dt>
24
+ <dd class="col-sm-9"><a href="{{downloadUrl}}">{{downloadUrl}}</a></dd>
25
+ {{/if}}
26
+ {{#if recordIdentifier}}
27
+ <dt class="col-sm-3">Record Identifier:</dt>
28
+ <dd class="col-sm-9">{{recordIdentifier}}</dd>
29
+ {{/if}}
30
+ {{#if label}}
31
+ <dt class="col-sm-3">Label:</dt>
32
+ <dd class="col-sm-9">{{label}}</dd>
33
+ {{/if}}
34
+ {{#if note}}
35
+ <dt class="col-sm-3">Note:</dt>
36
+ <dd class="col-sm-9">{{note}}</dd>
37
+ {{/if}}
38
+ </dl>
39
+ </div>
40
+ </div>
@@ -0,0 +1 @@
1
+ //= require_tree ./viewers
@@ -0,0 +1,77 @@
1
+ //= require geoblacklight/viewers/map
2
+
3
+ GeoBlacklight.Viewer.Esri = GeoBlacklight.Viewer.Map.extend({
4
+ layerInfo: {},
5
+
6
+ load: function() {
7
+ this.options.bbox = L.bboxToBounds(this.data.mapBbox);
8
+ this.map = L.map(this.element).fitBounds(this.options.bbox);
9
+ this.map.addLayer(this.selectBasemap());
10
+ this.map.addLayer(this.overlay);
11
+ if (this.data.available) {
12
+ this.getEsriLayer();
13
+ } else {
14
+ this.addBoundsOverlay(this.options.bbox);
15
+ }
16
+ },
17
+
18
+ getEsriLayer: function() {
19
+ var _this = this;
20
+
21
+ // remove any trailing slash from endpoint url
22
+ _this.data.url = _this.data.url.replace(/\/$/, '');
23
+ L.esri.get(_this.data.url, {}, function(error, response){
24
+ if(!error) {
25
+ _this.layerInfo = response;
26
+
27
+ // get layer as defined in submodules (e.g. esri/mapservice)
28
+ var layer = _this.getPreviewLayer();
29
+
30
+ // add layer to map
31
+ if (_this.addPreviewLayer(layer)) {
32
+ // add controls if layer is added
33
+ _this.loadControls();
34
+ }
35
+ }
36
+ });
37
+ },
38
+
39
+ addPreviewLayer: function(layer) {
40
+
41
+ // if not null, add layer to map
42
+ if (layer) {
43
+
44
+ this.overlay.addLayer(layer);
45
+ return true;
46
+ }
47
+ },
48
+
49
+ // clear attribute table and setup spinner icon
50
+ appendLoadingMessage: function() {
51
+ var spinner = '<tbody class="attribute-table-body"><tr><td colspan="2">' +
52
+ '<span id="attribute-table">' +
53
+ '<i class="fa fa-spinner fa-spin fa-align-center">' +
54
+ '</i></span>' +
55
+ '</td></tr></tbody>';
56
+
57
+ $('.attribute-table-body').html(spinner);
58
+ },
59
+
60
+ // appends error message to attribute table
61
+ appendErrorMessage: function() {
62
+ $('.attribute-table-body').html('<tbody class="attribute-table-body">'+
63
+ '<tr><td colspan="2">Could not find that feature</td></tr></tbody>');
64
+ },
65
+
66
+ // populates attribute table with feature properties
67
+ populateAttributeTable: function(feature) {
68
+ var html = $('<tbody class="attribute-table-body"></tbody>');
69
+
70
+ // step through properties and append to table
71
+ for (var property in feature.properties) {
72
+ html.append('<tr><td>' + property + '</td>'+
73
+ '<td>' + GeoBlacklight.Util.linkify(feature.properties[property]) + '</tr>');
74
+ }
75
+ $('.attribute-table-body').replaceWith(html);
76
+ }
77
+ });
@@ -0,0 +1,85 @@
1
+ //= require geoblacklight/viewers/esri
2
+
3
+ GeoBlacklight.Viewer.DynamicMapLayer = GeoBlacklight.Viewer.Esri.extend({
4
+
5
+ // override to parse between dynamic layer types
6
+ getEsriLayer: function() {
7
+ var _this = this;
8
+
9
+ // remove any trailing slash from endpoint url
10
+ _this.data.url = _this.data.url.replace(/\/$/, '');
11
+
12
+ // get last segment from url
13
+ var pathArray = this.data.url.replace(/\/$/, '').split('/');
14
+ var lastSegment = pathArray[pathArray.length - 1];
15
+
16
+ // if the last seg is an integer, slice and save as dynamicLayerId
17
+ if (Number(lastSegment) === parseInt(lastSegment, 10)) {
18
+ this.dynamicLayerId = lastSegment;
19
+ this.data.url = this.data.url.slice(0,-(lastSegment.length + 1));
20
+ }
21
+
22
+ L.esri.get(_this.data.url, {}, function(error, response){
23
+ if(!error) {
24
+ _this.layerInfo = response;
25
+
26
+ // get layer
27
+ var layer = _this.getPreviewLayer();
28
+
29
+ // add layer to map
30
+ if (_this.addPreviewLayer(layer)) {
31
+
32
+ // add controls if layer is added
33
+ _this.loadControls();
34
+ }
35
+ }
36
+ });
37
+ },
38
+
39
+ getPreviewLayer: function() {
40
+
41
+ // set layer url
42
+ this.options.url = this.data.url;
43
+
44
+ // show only single layer, if specified
45
+ if (this.dynamicLayerId) {
46
+ this.options.layers = [this.dynamicLayerId];
47
+ }
48
+
49
+ var esriDynamicMapLayer = L.esri.dynamicMapLayer(this.options);
50
+
51
+ // setup feature inspection
52
+ this.setupInspection(esriDynamicMapLayer);
53
+ return esriDynamicMapLayer;
54
+ },
55
+
56
+ setupInspection: function(layer) {
57
+ var _this = this;
58
+ this.map.on('click', function(e) {
59
+ _this.appendLoadingMessage();
60
+
61
+ // query layer at click location
62
+ var identify = L.esri.identifyFeatures({
63
+ url: layer.options.url,
64
+ useCors: true
65
+ })
66
+ .tolerance(2)
67
+ .returnGeometry(false)
68
+ .on(_this.map)
69
+ .at(e.latlng);
70
+
71
+ // query specific layer if dynamicLayerId is set
72
+ if (_this.dynamicLayerId) {
73
+ identify.layers('all: ' + _this.dynamicLayerId);
74
+ }
75
+
76
+ identify.run(function(error, featureCollection, response){
77
+ if (error || response['results'] < 1) {
78
+ _this.appendErrorMessage();
79
+ } else {
80
+ _this.populateAttributeTable(featureCollection.features[0]);
81
+ }
82
+ });
83
+ });
84
+ }
85
+ });
@@ -0,0 +1,76 @@
1
+ //= require geoblacklight/viewers/esri
2
+
3
+ GeoBlacklight.Viewer.FeatureLayer = GeoBlacklight.Viewer.Esri.extend({
4
+
5
+ // default feature styles
6
+ defaultStyles: {
7
+ 'esriGeometryPoint': '',
8
+ 'esriGeometryMultipoint': '',
9
+ 'esriGeometryPolyline': {color: 'blue', weight: 3 },
10
+ 'esriGeometryPolygon': {color: 'blue', weight: 2 }
11
+ },
12
+
13
+ getPreviewLayer: function() {
14
+
15
+ // set layer url
16
+ this.options.url = this.data.url;
17
+
18
+ // set default style
19
+ this.options.style = this.getFeatureStyle();
20
+
21
+ // define feature layer
22
+ this.esriFeatureLayer = L.esri.featureLayer(this.options);
23
+
24
+ //setup feature inspection and opacity
25
+ this.setupInspection(this.esriFeatureLayer);
26
+ this.setupInitialOpacity(this.esriFeatureLayer);
27
+
28
+ return this.esriFeatureLayer;
29
+ },
30
+
31
+ controlPreload: function() {
32
+
33
+ // define setOpacity function that works for svg elements
34
+ this.esriFeatureLayer.setOpacity = function(opacity) {
35
+ $('.leaflet-clickable').css({ opacity: opacity });
36
+ };
37
+ },
38
+
39
+ getFeatureStyle: function() {
40
+ var _this = this;
41
+
42
+ // lookup style hash based on layer geometry type and return function
43
+ return function(feature) {
44
+ return _this.defaultStyles[_this.layerInfo.geometryType];
45
+ };
46
+ },
47
+
48
+ setupInitialOpacity: function(featureLayer) {
49
+ featureLayer.on('load', function(e) {
50
+ featureLayer.setOpacity(this.options);
51
+ });
52
+ },
53
+
54
+ setupInspection: function(featureLayer) {
55
+ var _this = this;
56
+
57
+ // inspect on click
58
+ featureLayer.on('click', function(e) {
59
+ var distance = 3000 / (1 + _this.map.getZoom());
60
+
61
+ _this.appendLoadingMessage();
62
+
63
+ // query layer at click location
64
+ featureLayer.query()
65
+ .returnGeometry(false)
66
+ .nearby(e.latlng, distance)
67
+ .run(function(error, featureCollection, response) {
68
+ if (error || response['features'] < 1) {
69
+ _this.appendErrorMessage();
70
+ } else {
71
+ _this.populateAttributeTable(featureCollection.features[0]);
72
+ }
73
+ });
74
+ });
75
+ }
76
+ });
@@ -0,0 +1,14 @@
1
+ //= require geoblacklight/viewers/esri
2
+
3
+ GeoBlacklight.Viewer.ImageMapLayer = GeoBlacklight.Viewer.Esri.extend({
4
+ layerInfo: {},
5
+
6
+ getPreviewLayer: function() {
7
+
8
+ // set layer url
9
+ this.options.url = this.data.url;
10
+
11
+ // return image service layer
12
+ return L.esri.imageMapLayer(this.options);
13
+ }
14
+ });