geoblacklight 4.4.1 → 5.0.0.pre.alpha.11

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 (577) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build-demo-app.yml +153 -0
  3. data/.github/workflows/prune-containers.yml +19 -0
  4. data/.github/workflows/ruby.yml +54 -52
  5. data/.gitignore +2 -2
  6. data/CONTRIBUTING.md +62 -44
  7. data/Gemfile +3 -28
  8. data/Rakefile +42 -67
  9. data/app/assets/images/blacklight/logo.svg +31 -1
  10. data/app/assets/stylesheets/geoblacklight/geoblacklight.scss +1 -2
  11. data/app/assets/stylesheets/geoblacklight/modules/_base.scss +1 -1
  12. data/app/assets/stylesheets/geoblacklight/modules/_blacklight_overrides.scss +24 -26
  13. data/app/assets/stylesheets/geoblacklight/modules/downloads.scss +13 -0
  14. data/app/assets/stylesheets/geoblacklight/modules/home.scss +2 -17
  15. data/app/assets/stylesheets/geoblacklight/modules/icon-customization.scss +48 -23
  16. data/app/assets/stylesheets/geoblacklight/modules/index_maps.scss +1 -15
  17. data/app/assets/stylesheets/geoblacklight/modules/item.scss +13 -11
  18. data/app/assets/stylesheets/geoblacklight/modules/layer_opacity.scss +3 -3
  19. data/app/assets/stylesheets/geoblacklight/modules/leaflet.scss +4 -0
  20. data/app/assets/stylesheets/geoblacklight/modules/modal.scss +0 -15
  21. data/app/assets/stylesheets/geoblacklight/modules/results.scss +10 -19
  22. data/app/assets/stylesheets/geoblacklight/modules/sidebar.scss +2 -2
  23. data/app/components/blacklight/icons/american_geographical_society_library_uwm_libraries_component.rb +46 -0
  24. data/app/components/blacklight/icons/arizona_component.rb +24 -0
  25. data/app/components/blacklight/icons/arrow_circle_down_component.rb +23 -0
  26. data/app/components/blacklight/icons/baruch_cuny_component.rb +23 -0
  27. data/app/components/blacklight/icons/book_component.rb +23 -0
  28. data/app/components/blacklight/icons/bookmark_component.rb +23 -0
  29. data/app/components/blacklight/icons/cd_rom_component.rb +23 -0
  30. data/app/components/blacklight/icons/child_item_component.rb +23 -0
  31. data/app/components/blacklight/icons/circle_info_solid_component.rb +23 -0
  32. data/app/components/blacklight/icons/citation_component.rb +23 -0
  33. data/app/components/blacklight/icons/collection_component.rb +23 -0
  34. data/app/components/blacklight/icons/collections_component.rb +24 -0
  35. data/app/components/blacklight/icons/columbia_component.rb +23 -0
  36. data/app/components/blacklight/icons/cornell_component.rb +25 -0
  37. data/app/components/blacklight/icons/datasets_component.rb +27 -0
  38. data/app/components/blacklight/icons/dvd_rom_component.rb +23 -0
  39. data/app/components/blacklight/icons/email_component.rb +23 -0
  40. data/app/components/blacklight/icons/esri_globe_component.rb +51 -0
  41. data/app/components/blacklight/icons/fire_solid_component.rb +23 -0
  42. data/app/components/blacklight/icons/george_mason_component.rb +24 -0
  43. data/app/components/blacklight/icons/globe_component.rb +23 -0
  44. data/app/components/blacklight/icons/harvard_component.rb +23 -0
  45. data/app/components/blacklight/icons/home_component.rb +23 -0
  46. data/app/components/blacklight/icons/iiif_drag_drop_component.rb +31 -0
  47. data/app/components/blacklight/icons/image_component.rb +23 -0
  48. data/app/components/blacklight/icons/imagery_component.rb +24 -0
  49. data/app/components/blacklight/icons/indiana_component.rb +23 -0
  50. data/app/components/blacklight/icons/leaf_component.rb +23 -0
  51. data/app/components/blacklight/icons/lewis_clark_component.rb +25 -0
  52. data/app/components/blacklight/icons/lightbulb_solid_component.rb +23 -0
  53. data/app/components/blacklight/icons/line_component.rb +24 -0
  54. data/app/components/blacklight/icons/map_component.rb +23 -0
  55. data/app/components/blacklight/icons/map_marker_component.rb +23 -0
  56. data/app/components/blacklight/icons/maps_component.rb +24 -0
  57. data/app/components/blacklight/icons/massgis_component.rb +23 -0
  58. data/app/components/blacklight/icons/metadata_component.rb +23 -0
  59. data/app/components/blacklight/icons/michigan_state_university_component.rb +25 -0
  60. data/app/components/blacklight/icons/mit_component.rb +23 -0
  61. data/app/components/blacklight/icons/mixed_component.rb +25 -0
  62. data/app/components/blacklight/icons/multilinestring_component.rb +26 -0
  63. data/app/components/blacklight/icons/multipoint_component.rb +23 -0
  64. data/app/components/blacklight/icons/multipolygon_component.rb +26 -0
  65. data/app/components/blacklight/icons/northwestern_university_component.rb +24 -0
  66. data/app/components/blacklight/icons/nyu_component.rb +26 -0
  67. data/app/components/blacklight/icons/pagelines_brands_component.rb +23 -0
  68. data/app/components/blacklight/icons/paper_map_component.rb +23 -0
  69. data/app/components/blacklight/icons/parent_item_component.rb +23 -0
  70. data/app/components/blacklight/icons/pennsylvania_state_university_component.rb +25 -0
  71. data/app/components/blacklight/icons/point_component.rb +23 -0
  72. data/app/components/blacklight/icons/polygon_component.rb +24 -0
  73. data/app/components/blacklight/icons/polyline_component.rb +26 -0
  74. data/app/components/blacklight/icons/princeton_component.rb +23 -0
  75. data/app/components/blacklight/icons/public_component.rb +23 -0
  76. data/app/components/blacklight/icons/purdue_university_component.rb +25 -0
  77. data/app/components/blacklight/icons/raster_component.rb +23 -0
  78. data/app/components/blacklight/icons/restricted_component.rb +23 -0
  79. data/app/components/blacklight/icons/rutgers_component.rb +25 -0
  80. data/app/components/blacklight/icons/sms_component.rb +23 -0
  81. data/app/components/blacklight/icons/stanford_component.rb +23 -0
  82. data/app/components/blacklight/icons/table_component.rb +23 -0
  83. data/app/components/blacklight/icons/tags_component.rb +23 -0
  84. data/app/components/blacklight/icons/texas_component.rb +23 -0
  85. data/app/components/blacklight/icons/the_ohio_state_university_component.rb +26 -0
  86. data/app/components/blacklight/icons/triangle_exclamation_solid_component.rb +23 -0
  87. data/app/components/blacklight/icons/tufts_component.rb +23 -0
  88. data/app/components/blacklight/icons/ucla_component.rb +23 -0
  89. data/app/components/blacklight/icons/university_of_california_berkeley_component.rb +24 -0
  90. data/app/components/blacklight/icons/university_of_chicago_component.rb +25 -0
  91. data/app/components/blacklight/icons/university_of_colorado_boulder_component.rb +26 -0
  92. data/app/components/blacklight/icons/university_of_illinois_urbana_champaign_component.rb +25 -0
  93. data/app/components/blacklight/icons/university_of_iowa_component.rb +24 -0
  94. data/app/components/blacklight/icons/university_of_maryland_component.rb +24 -0
  95. data/app/components/blacklight/icons/university_of_michigan_component.rb +24 -0
  96. data/app/components/blacklight/icons/university_of_minnesota_component.rb +24 -0
  97. data/app/components/blacklight/icons/university_of_nebraska_lincoln_component.rb +27 -0
  98. data/app/components/blacklight/icons/university_of_wisconsin_madison_component.rb +24 -0
  99. data/app/components/blacklight/icons/uva_component.rb +23 -0
  100. data/app/components/blacklight/icons/web_services_component.rb +23 -0
  101. data/app/components/blacklight/icons/websites_component.rb +24 -0
  102. data/app/components/geoblacklight/arcgis_component.html.erb +3 -0
  103. data/app/components/geoblacklight/arcgis_component.rb +25 -0
  104. data/app/components/geoblacklight/attribute_table_component.html.erb +17 -0
  105. data/app/components/geoblacklight/attribute_table_component.rb +17 -0
  106. data/app/components/geoblacklight/data_dictionary_download_component.html.erb +3 -0
  107. data/app/components/geoblacklight/data_dictionary_download_component.rb +16 -0
  108. data/app/components/geoblacklight/display_note_component.rb +1 -1
  109. data/app/components/geoblacklight/document/citation_component.html.erb +1 -0
  110. data/app/components/geoblacklight/document/citation_component.rb +19 -0
  111. data/app/components/geoblacklight/document/sidebar_component.html.erb +12 -0
  112. data/app/components/geoblacklight/document/sidebar_component.rb +8 -0
  113. data/app/components/geoblacklight/document_component.html.erb +43 -0
  114. data/app/components/geoblacklight/document_component.rb +6 -0
  115. data/app/components/geoblacklight/download_links_component.html.erb +31 -0
  116. data/app/components/geoblacklight/download_links_component.rb +80 -0
  117. data/app/components/geoblacklight/header_component.html.erb +14 -0
  118. data/app/components/geoblacklight/header_component.rb +9 -0
  119. data/app/components/geoblacklight/header_icons_component.html.erb +3 -0
  120. data/app/components/geoblacklight/header_icons_component.rb +29 -0
  121. data/app/components/geoblacklight/iiif_drag_drop_component.html.erb +3 -0
  122. data/app/components/geoblacklight/iiif_drag_drop_component.rb +16 -0
  123. data/app/components/geoblacklight/index_map_inspect_component.rb +15 -0
  124. data/app/components/geoblacklight/index_map_legend_component.html.erb +14 -0
  125. data/app/components/geoblacklight/index_map_legend_component.rb +17 -0
  126. data/app/components/geoblacklight/item_map_viewer_component.html.erb +1 -0
  127. data/app/components/geoblacklight/item_map_viewer_component.rb +87 -0
  128. data/app/components/geoblacklight/location_leaflet_map_component.html.erb +1 -0
  129. data/app/components/geoblacklight/location_leaflet_map_component.rb +49 -0
  130. data/app/components/geoblacklight/login_link_component.html.erb +5 -0
  131. data/app/components/geoblacklight/login_link_component.rb +17 -0
  132. data/app/components/geoblacklight/relations_component.html.erb +23 -0
  133. data/app/components/geoblacklight/relations_component.rb +25 -0
  134. data/app/components/geoblacklight/search_result_component.html.erb +44 -0
  135. data/app/{presenters/geoblacklight/document_presenter.rb → components/geoblacklight/search_result_component.rb} +9 -6
  136. data/app/components/geoblacklight/static_map_component.html.erb +9 -0
  137. data/app/components/geoblacklight/static_map_component.rb +36 -0
  138. data/app/components/geoblacklight/viewer_help_text_component.html.erb +1 -0
  139. data/app/components/geoblacklight/viewer_help_text_component.rb +46 -0
  140. data/app/components/geoblacklight/web_services_component.html.erb +1 -0
  141. data/app/components/geoblacklight/web_services_component.rb +26 -0
  142. data/app/{views/catalog/_web_services_default.html.erb → components/geoblacklight/web_services_default_component.html.erb} +3 -5
  143. data/app/components/geoblacklight/web_services_default_component.rb +11 -0
  144. data/app/components/geoblacklight/web_services_link_component.html.erb +3 -0
  145. data/app/components/geoblacklight/web_services_link_component.rb +22 -0
  146. data/app/{views/catalog/_web_services_wfs.html.erb → components/geoblacklight/web_services_wfs_component.html.erb} +4 -7
  147. data/app/components/geoblacklight/web_services_wfs_component.rb +12 -0
  148. data/app/components/geoblacklight/web_services_wms_component.html.erb +10 -0
  149. data/app/components/geoblacklight/web_services_wms_component.rb +12 -0
  150. data/app/controllers/download_controller.rb +10 -26
  151. data/app/helpers/geoblacklight_helper.rb +10 -194
  152. data/app/javascript/geoblacklight/controllers/clipboard_controller.js +11 -0
  153. data/app/javascript/geoblacklight/controllers/clover_viewer_controller.js +47 -0
  154. data/app/javascript/geoblacklight/controllers/downloads_controller.js +56 -0
  155. data/app/javascript/geoblacklight/controllers/leaflet_viewer_controller.js +217 -0
  156. data/app/javascript/geoblacklight/controllers/oembed_viewer_controller.js +18 -0
  157. data/app/javascript/geoblacklight/controllers/openlayers_viewer_controller.js +63 -0
  158. data/app/javascript/geoblacklight/controllers/search_results_controller.js +50 -0
  159. data/app/javascript/geoblacklight/core.js +69 -0
  160. data/app/javascript/geoblacklight/index.js +29 -0
  161. data/app/javascript/geoblacklight/initializers/metadata_download.js +54 -0
  162. data/app/javascript/geoblacklight/initializers/popovers.js +11 -0
  163. data/app/javascript/geoblacklight/initializers/relations.js +40 -0
  164. data/app/javascript/geoblacklight/initializers/tooltips.js +55 -0
  165. data/app/javascript/geoblacklight/initializers/truncation.js +45 -0
  166. data/app/javascript/geoblacklight/leaflet/basemaps.js +74 -0
  167. data/app/javascript/geoblacklight/leaflet/constants.js +18 -0
  168. data/app/javascript/geoblacklight/leaflet/controls/geosearch.js +160 -0
  169. data/app/javascript/geoblacklight/leaflet/controls/layer_opacity.js +120 -0
  170. data/app/javascript/geoblacklight/leaflet/inspection.js +195 -0
  171. data/app/javascript/geoblacklight/leaflet/layer_index_map.js +120 -0
  172. data/app/javascript/geoblacklight/leaflet/layer_wmts.js +59 -0
  173. data/app/javascript/geoblacklight/leaflet/layers.js +153 -0
  174. data/app/javascript/geoblacklight/leaflet/utils.js +83 -0
  175. data/app/javascript/geoblacklight/openlayers/basemaps.js +47 -0
  176. data/app/javascript/geoblacklight/openlayers/layers.js +44 -0
  177. data/app/models/concerns/geoblacklight/solr_document/citation.rb +20 -8
  178. data/app/models/concerns/geoblacklight/solr_document.rb +22 -30
  179. data/app/presenters/geoblacklight/bbox_item_presenter.rb +1 -1
  180. data/app/views/catalog/_citation.html.erb +16 -33
  181. data/app/views/catalog/_document_split.html.erb +18 -3
  182. data/app/views/catalog/_home_text.html.erb +2 -2
  183. data/app/views/catalog/_metadata.html.erb +1 -1
  184. data/app/views/catalog/index.html.erb +8 -4
  185. data/app/views/catalog/metadata/_markup.html.erb +1 -1
  186. data/app/views/catalog/metadata.html.erb +14 -13
  187. data/app/views/catalog/web_services.html.erb +19 -28
  188. data/app/views/relation/index.html.erb +2 -12
  189. data/app/views/relation/index.json.jbuilder +1 -1
  190. data/compose.yml +14 -0
  191. data/config/importmap.rb +20 -0
  192. data/config/locales/geoblacklight.en.yml +15 -24
  193. data/geoblacklight.gemspec +7 -7
  194. data/lib/generators/geoblacklight/assets/importmap_generator.rb +87 -0
  195. data/lib/generators/geoblacklight/assets/vite_generator.rb +90 -0
  196. data/lib/generators/geoblacklight/assets_generator.rb +12 -37
  197. data/lib/generators/geoblacklight/install_generator.rb +11 -49
  198. data/lib/generators/geoblacklight/templates/assets/_customizations.scss +13 -19
  199. data/lib/generators/geoblacklight/templates/assets/application.js +17 -0
  200. data/lib/generators/geoblacklight/templates/assets/application.scss +9 -4
  201. data/lib/generators/geoblacklight/templates/assets/geoblacklight.scss +11 -0
  202. data/lib/generators/geoblacklight/templates/base.html.erb +9 -12
  203. data/lib/generators/geoblacklight/templates/catalog_controller.rb +7 -15
  204. data/lib/generators/geoblacklight/templates/demo-app/Dockerfile +31 -0
  205. data/lib/generators/geoblacklight/templates/demo-app/compose.yml +26 -0
  206. data/lib/generators/geoblacklight/templates/demo-app/start-server.sh +21 -0
  207. data/lib/generators/geoblacklight/templates/package.json +7 -1
  208. data/lib/generators/geoblacklight/templates/settings.yml +45 -40
  209. data/lib/generators/geoblacklight/templates/vite.config.ts +22 -7
  210. data/lib/geoblacklight/bounding_box.rb +16 -0
  211. data/lib/geoblacklight/constants.rb +0 -1
  212. data/lib/geoblacklight/download/csv_download.rb +22 -0
  213. data/lib/geoblacklight/download/geojson_download.rb +1 -1
  214. data/lib/geoblacklight/download/geotiff_download.rb +1 -1
  215. data/lib/geoblacklight/download/kmz_download.rb +1 -1
  216. data/lib/geoblacklight/download/shapefile_download.rb +1 -1
  217. data/lib/geoblacklight/download.rb +1 -1
  218. data/lib/geoblacklight/engine.rb +15 -6
  219. data/lib/geoblacklight/item_viewer.rb +1 -1
  220. data/lib/geoblacklight/metadata/base.rb +2 -1
  221. data/lib/geoblacklight/references.rb +27 -8
  222. data/lib/geoblacklight/routes/downloadable.rb +0 -1
  223. data/lib/geoblacklight/routes.rb +0 -3
  224. data/lib/geoblacklight/version.rb +1 -1
  225. data/lib/geoblacklight/wms_layer/feature_info_response.rb +9 -6
  226. data/lib/geoblacklight.rb +6 -30
  227. data/lib/tasks/geoblacklight.rake +24 -60
  228. data/package.json +24 -17
  229. data/solr/conf/schema.xml +15 -13
  230. data/solr/conf/solrconfig.xml +6 -4
  231. data/spec/components/blacklight/icons/american_geographical_society_library_uwm_libraries_component_spec.rb +15 -0
  232. data/spec/components/blacklight/icons/arizona_component_spec.rb +15 -0
  233. data/spec/components/blacklight/icons/arrow_circle_down_component_spec.rb +15 -0
  234. data/spec/components/blacklight/icons/baruch_cuny_component_spec.rb +15 -0
  235. data/spec/components/blacklight/icons/book_component_spec.rb +15 -0
  236. data/spec/components/blacklight/icons/bookmark_component_spec.rb +15 -0
  237. data/spec/components/blacklight/icons/cd_rom_component_spec.rb +15 -0
  238. data/spec/components/blacklight/icons/child_item_component_spec.rb +15 -0
  239. data/spec/components/blacklight/icons/circle_info_solid_component_spec.rb +15 -0
  240. data/spec/components/blacklight/icons/citation_component_spec.rb +15 -0
  241. data/spec/components/blacklight/icons/collection_component_spec.rb +15 -0
  242. data/spec/components/blacklight/icons/collections_component_spec.rb +15 -0
  243. data/spec/components/blacklight/icons/columbia_component_spec.rb +15 -0
  244. data/spec/components/blacklight/icons/cornell_component_spec.rb +15 -0
  245. data/spec/components/blacklight/icons/datasets_component_spec.rb +15 -0
  246. data/spec/components/blacklight/icons/dvd_rom_component_spec.rb +15 -0
  247. data/spec/components/blacklight/icons/email_component_spec.rb +15 -0
  248. data/spec/components/blacklight/icons/esri_globe_component_spec.rb +15 -0
  249. data/spec/components/blacklight/icons/fire_solid_component_spec.rb +15 -0
  250. data/spec/components/blacklight/icons/george_mason_component_spec.rb +15 -0
  251. data/spec/components/blacklight/icons/globe_component_spec.rb +15 -0
  252. data/spec/components/blacklight/icons/harvard_component_spec.rb +15 -0
  253. data/spec/components/blacklight/icons/home_component_spec.rb +15 -0
  254. data/spec/components/blacklight/icons/iiif_drag_drop_component_spec.rb +15 -0
  255. data/spec/components/blacklight/icons/image_component_spec.rb +15 -0
  256. data/spec/components/blacklight/icons/imagery_component_spec.rb +15 -0
  257. data/spec/components/blacklight/icons/indiana_component_spec.rb +15 -0
  258. data/spec/components/blacklight/icons/leaf_component_spec.rb +15 -0
  259. data/spec/components/blacklight/icons/lewis_clark_component_spec.rb +15 -0
  260. data/spec/components/blacklight/icons/lightbulb_solid_component_spec.rb +15 -0
  261. data/spec/components/blacklight/icons/line_component_spec.rb +15 -0
  262. data/spec/components/blacklight/icons/map_component_spec.rb +15 -0
  263. data/spec/components/blacklight/icons/map_marker_component_spec.rb +15 -0
  264. data/spec/components/blacklight/icons/maps_component_spec.rb +15 -0
  265. data/spec/components/blacklight/icons/massgis_component_spec.rb +15 -0
  266. data/spec/components/blacklight/icons/metadata_component_spec.rb +15 -0
  267. data/spec/components/blacklight/icons/michigan_state_university_component_spec.rb +15 -0
  268. data/spec/components/blacklight/icons/mit_component_spec.rb +15 -0
  269. data/spec/components/blacklight/icons/mixed_component_spec.rb +15 -0
  270. data/spec/components/blacklight/icons/multilinestring_component_spec.rb +15 -0
  271. data/spec/components/blacklight/icons/multipoint_component_spec.rb +15 -0
  272. data/spec/components/blacklight/icons/multipolygon_component_spec.rb +15 -0
  273. data/spec/components/blacklight/icons/northwestern_university_component_spec.rb +15 -0
  274. data/spec/components/blacklight/icons/nyu_component_spec.rb +15 -0
  275. data/spec/components/blacklight/icons/pagelines_brands_component_spec.rb +15 -0
  276. data/spec/components/blacklight/icons/paper_map_component_spec.rb +15 -0
  277. data/spec/components/blacklight/icons/parent_item_component_spec.rb +15 -0
  278. data/spec/components/blacklight/icons/pennsylvania_state_university_component_spec.rb +15 -0
  279. data/spec/components/blacklight/icons/point_component_spec.rb +15 -0
  280. data/spec/components/blacklight/icons/polygon_component_spec.rb +15 -0
  281. data/spec/components/blacklight/icons/polyline_component_spec.rb +15 -0
  282. data/spec/components/blacklight/icons/princeton_component_spec.rb +15 -0
  283. data/spec/components/blacklight/icons/public_component_spec.rb +15 -0
  284. data/spec/components/blacklight/icons/purdue_university_component_spec.rb +15 -0
  285. data/spec/components/blacklight/icons/raster_component_spec.rb +15 -0
  286. data/spec/components/blacklight/icons/restricted_component_spec.rb +15 -0
  287. data/spec/components/blacklight/icons/rutgers_component_spec.rb +15 -0
  288. data/spec/components/blacklight/icons/sms_component_spec.rb +15 -0
  289. data/spec/components/blacklight/icons/stanford_component_spec.rb +15 -0
  290. data/spec/components/blacklight/icons/table_component_spec.rb +15 -0
  291. data/spec/components/blacklight/icons/tags_component_spec.rb +15 -0
  292. data/spec/components/blacklight/icons/texas_component_spec.rb +15 -0
  293. data/spec/components/blacklight/icons/the_ohio_state_university_component_spec.rb +15 -0
  294. data/spec/components/blacklight/icons/triangle_exclamation_solid_component_spec.rb +15 -0
  295. data/spec/components/blacklight/icons/tufts_component_spec.rb +15 -0
  296. data/spec/components/blacklight/icons/ucla_component_spec.rb +15 -0
  297. data/spec/components/blacklight/icons/university_of_california_berkeley_component_spec.rb +15 -0
  298. data/spec/components/blacklight/icons/university_of_chicago_component_spec.rb +15 -0
  299. data/spec/components/blacklight/icons/university_of_colorado_boulder_component_spec.rb +15 -0
  300. data/spec/components/blacklight/icons/university_of_illinois_urbana_champaign_component_spec.rb +15 -0
  301. data/spec/components/blacklight/icons/university_of_iowa_component_spec.rb +15 -0
  302. data/spec/components/blacklight/icons/university_of_maryland_component_spec.rb +15 -0
  303. data/spec/components/blacklight/icons/university_of_michigan_component_spec.rb +15 -0
  304. data/spec/components/blacklight/icons/university_of_minnesota_component_spec.rb +15 -0
  305. data/spec/components/blacklight/icons/university_of_nebraska_lincoln_component_spec.rb +15 -0
  306. data/spec/components/blacklight/icons/university_of_wisconsin_madison_component_spec.rb +15 -0
  307. data/spec/components/blacklight/icons/uva_component_spec.rb +15 -0
  308. data/spec/components/blacklight/icons/web_services_component_spec.rb +15 -0
  309. data/spec/components/blacklight/icons/websites_component_spec.rb +15 -0
  310. data/spec/components/geoblacklight/arcgis_component_spec.rb +31 -0
  311. data/spec/components/geoblacklight/attribute_table_component_spec.rb +37 -0
  312. data/spec/components/geoblacklight/citation_component_spec.rb +37 -0
  313. data/spec/components/geoblacklight/document_component_spec.rb +92 -0
  314. data/spec/components/geoblacklight/download_links_component_spec.rb +102 -0
  315. data/spec/components/geoblacklight/header_icons_component_spec.rb +56 -0
  316. data/spec/components/geoblacklight/iiif_drag_drop_component_spec.rb +30 -0
  317. data/spec/components/geoblacklight/index_map_legend_component_spec.rb +42 -0
  318. data/spec/components/geoblacklight/item_map_viewer_component_spec.rb +36 -0
  319. data/spec/components/geoblacklight/login_link_component_spec.rb +33 -0
  320. data/spec/{lib/geoblacklight/document_presenter_spec.rb → components/geoblacklight/search_result_component_spec.rb} +19 -11
  321. data/spec/components/geoblacklight/static_map_component_spec.rb +22 -0
  322. data/spec/components/geoblacklight/viewer_help_text_component_spec.rb +28 -0
  323. data/spec/components/geoblacklight/web_services_component_spec.rb +45 -0
  324. data/spec/controllers/download_controller_spec.rb +12 -35
  325. data/spec/features/axe_spec.rb +66 -0
  326. data/spec/features/bookmarks_spec.rb +1 -1
  327. data/spec/features/citations_spec.rb +7 -3
  328. data/spec/features/download_layer_spec.rb +24 -39
  329. data/spec/features/esri_viewer_spec.rb +1 -1
  330. data/spec/features/exports_spec.rb +0 -15
  331. data/spec/features/{full_screen_controll_spec.rb → full_screen_control_spec.rb} +6 -6
  332. data/spec/features/home_page_spec.rb +12 -7
  333. data/spec/features/iiif_viewer_spec.rb +1 -1
  334. data/spec/features/index_map_spec.rb +16 -9
  335. data/spec/features/{split_view.html.erb_spec.rb → index_view_spec.rb} +15 -13
  336. data/spec/features/layer_inspection_spec.rb +2 -2
  337. data/spec/features/layer_preview_spec.rb +1 -1
  338. data/spec/features/missing_metadata_spec.rb +5 -5
  339. data/spec/features/oembed_spec.rb +2 -2
  340. data/spec/features/saved_searches_spec.rb +4 -1
  341. data/spec/features/search_results_complex_geometry_spec.rb +2 -2
  342. data/spec/features/search_results_icons_spec.rb +3 -3
  343. data/spec/features/search_results_map_spec.rb +4 -36
  344. data/spec/features/search_results_overlap_ratio_spec.rb +1 -1
  345. data/spec/features/show_page_download_spec.rb +0 -8
  346. data/spec/features/tilejson_spec.rb +2 -2
  347. data/spec/features/web_services_modal_spec.rb +57 -39
  348. data/spec/features/wmts_spec.rb +4 -4
  349. data/spec/fixtures/solr_documents/README.md +2 -1
  350. data/spec/fixtures/solr_documents/complex-geom.json +61 -0
  351. data/spec/fixtures/solr_documents/esri-tiled_map_layer.json +45 -24
  352. data/spec/fixtures/solr_documents/harvard_raster.json +1 -1
  353. data/spec/fixtures/solr_documents/multiple-downloads.json +1 -0
  354. data/spec/helpers/geoblacklight_helper_spec.rb +8 -173
  355. data/spec/lib/geoblacklight/download/csv_download_spec.rb +21 -0
  356. data/spec/lib/geoblacklight/reference_spec.rb +17 -19
  357. data/spec/lib/geoblacklight/references_spec.rb +31 -17
  358. data/spec/lib/geoblacklight/wms_layer/feature_info_response_spec.rb +8 -6
  359. data/spec/lib/geoblacklight/wms_layer_spec.rb +14 -0
  360. data/spec/models/concerns/geoblacklight/solr_document/citation_spec.rb +1 -1
  361. data/spec/models/concerns/geoblacklight/solr_document_spec.rb +1 -21
  362. data/spec/spec_helper.rb +2 -28
  363. data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -12
  364. data/template.rb +13 -11
  365. data/test/leaflet/layers.test.js +17 -0
  366. data/vite.config.ts +34 -23
  367. metadata +304 -256
  368. data/.hound.yml +0 -8
  369. data/.jshintignore +0 -2
  370. data/.jshintrc +0 -67
  371. data/.solr_wrapper +0 -6
  372. data/app/assets/images/blacklight/american-geographical-society-library-uwm-libraries.svg +0 -26
  373. data/app/assets/images/blacklight/arizona.svg +0 -4
  374. data/app/assets/images/blacklight/arrow-circle-down.svg +0 -3
  375. data/app/assets/images/blacklight/baruch-cuny.svg +0 -3
  376. data/app/assets/images/blacklight/book.svg +0 -3
  377. data/app/assets/images/blacklight/bookmark.svg +0 -3
  378. data/app/assets/images/blacklight/cd-rom.svg +0 -3
  379. data/app/assets/images/blacklight/chicago.svg +0 -4
  380. data/app/assets/images/blacklight/child-item.svg +0 -3
  381. data/app/assets/images/blacklight/circle-info-solid.svg +0 -1
  382. data/app/assets/images/blacklight/citation.svg +0 -3
  383. data/app/assets/images/blacklight/collection.svg +0 -3
  384. data/app/assets/images/blacklight/collections.svg +0 -4
  385. data/app/assets/images/blacklight/columbia.svg +0 -3
  386. data/app/assets/images/blacklight/cornell.svg +0 -5
  387. data/app/assets/images/blacklight/datasets.svg +0 -7
  388. data/app/assets/images/blacklight/dvd-rom.svg +0 -3
  389. data/app/assets/images/blacklight/email.svg +0 -3
  390. data/app/assets/images/blacklight/esri-globe.svg +0 -31
  391. data/app/assets/images/blacklight/fire-solid.svg +0 -1
  392. data/app/assets/images/blacklight/geoblacklight-icons.json +0 -3312
  393. data/app/assets/images/blacklight/george-mason.svg +0 -4
  394. data/app/assets/images/blacklight/globe.svg +0 -3
  395. data/app/assets/images/blacklight/harvard.svg +0 -3
  396. data/app/assets/images/blacklight/home.svg +0 -3
  397. data/app/assets/images/blacklight/illinois.svg +0 -4
  398. data/app/assets/images/blacklight/image.svg +0 -3
  399. data/app/assets/images/blacklight/imagery.svg +0 -4
  400. data/app/assets/images/blacklight/indiana.svg +0 -3
  401. data/app/assets/images/blacklight/iowa.svg +0 -3
  402. data/app/assets/images/blacklight/leaf.svg +0 -3
  403. data/app/assets/images/blacklight/lewis-clark.svg +0 -5
  404. data/app/assets/images/blacklight/lightbulb-solid.svg +0 -1
  405. data/app/assets/images/blacklight/line.svg +0 -4
  406. data/app/assets/images/blacklight/map-marker.svg +0 -3
  407. data/app/assets/images/blacklight/map.svg +0 -3
  408. data/app/assets/images/blacklight/maps.svg +0 -4
  409. data/app/assets/images/blacklight/maryland.svg +0 -3
  410. data/app/assets/images/blacklight/massgis.svg +0 -3
  411. data/app/assets/images/blacklight/metadata.svg +0 -3
  412. data/app/assets/images/blacklight/michigan-state-university.svg +0 -5
  413. data/app/assets/images/blacklight/michigan-state.svg +0 -4
  414. data/app/assets/images/blacklight/michigan.svg +0 -3
  415. data/app/assets/images/blacklight/minnesota.svg +0 -3
  416. data/app/assets/images/blacklight/mit.svg +0 -3
  417. data/app/assets/images/blacklight/mixed.svg +0 -5
  418. data/app/assets/images/blacklight/multilinestring.svg +0 -6
  419. data/app/assets/images/blacklight/multipoint.svg +0 -3
  420. data/app/assets/images/blacklight/multipolygon.svg +0 -6
  421. data/app/assets/images/blacklight/nebraska.svg +0 -4
  422. data/app/assets/images/blacklight/northwestern-university.svg +0 -5
  423. data/app/assets/images/blacklight/nyu.svg +0 -6
  424. data/app/assets/images/blacklight/ohio-state.svg +0 -5
  425. data/app/assets/images/blacklight/pagelines-brands.svg +0 -3
  426. data/app/assets/images/blacklight/paper-map.svg +0 -3
  427. data/app/assets/images/blacklight/parent-item.svg +0 -3
  428. data/app/assets/images/blacklight/penn-state.svg +0 -4
  429. data/app/assets/images/blacklight/pennsylvania-state-university.svg +0 -5
  430. data/app/assets/images/blacklight/point.svg +0 -3
  431. data/app/assets/images/blacklight/polygon.svg +0 -4
  432. data/app/assets/images/blacklight/polyline.svg +0 -6
  433. data/app/assets/images/blacklight/princeton.svg +0 -3
  434. data/app/assets/images/blacklight/public.svg +0 -3
  435. data/app/assets/images/blacklight/purdue-university.svg +0 -5
  436. data/app/assets/images/blacklight/purdue.svg +0 -4
  437. data/app/assets/images/blacklight/raster.svg +0 -3
  438. data/app/assets/images/blacklight/restricted.svg +0 -3
  439. data/app/assets/images/blacklight/rutgers.svg +0 -5
  440. data/app/assets/images/blacklight/sms.svg +0 -3
  441. data/app/assets/images/blacklight/stanford.svg +0 -3
  442. data/app/assets/images/blacklight/table.svg +0 -3
  443. data/app/assets/images/blacklight/tags.svg +0 -3
  444. data/app/assets/images/blacklight/texas.svg +0 -3
  445. data/app/assets/images/blacklight/the-ohio-state-university.svg +0 -6
  446. data/app/assets/images/blacklight/triangle-exclamation-solid.svg +0 -1
  447. data/app/assets/images/blacklight/tufts.svg +0 -3
  448. data/app/assets/images/blacklight/ucla.svg +0 -3
  449. data/app/assets/images/blacklight/university-of-california-berkeley.svg +0 -4
  450. data/app/assets/images/blacklight/university-of-chicago.svg +0 -5
  451. data/app/assets/images/blacklight/university-of-colorado-boulder.svg +0 -6
  452. data/app/assets/images/blacklight/university-of-illinois-urbana-champaign.svg +0 -5
  453. data/app/assets/images/blacklight/university-of-iowa.svg +0 -4
  454. data/app/assets/images/blacklight/university-of-maryland.svg +0 -4
  455. data/app/assets/images/blacklight/university-of-michigan.svg +0 -4
  456. data/app/assets/images/blacklight/university-of-minnesota.svg +0 -4
  457. data/app/assets/images/blacklight/university-of-nebraska-lincoln.svg +0 -7
  458. data/app/assets/images/blacklight/university-of-wisconsin-madison.svg +0 -4
  459. data/app/assets/images/blacklight/uva.svg +0 -3
  460. data/app/assets/images/blacklight/web_services.svg +0 -3
  461. data/app/assets/images/blacklight/websites.svg +0 -4
  462. data/app/assets/images/blacklight/wisconsin.svg +0 -3
  463. data/app/assets/javascripts/geoblacklight/basemaps.js +0 -85
  464. data/app/assets/javascripts/geoblacklight/controls/fullscreen.js +0 -8
  465. data/app/assets/javascripts/geoblacklight/controls/opacity.js +0 -6
  466. data/app/assets/javascripts/geoblacklight/controls.js +0 -1
  467. data/app/assets/javascripts/geoblacklight/downloaders/downloader.js +0 -61
  468. data/app/assets/javascripts/geoblacklight/downloaders/hgl_downloader.js +0 -32
  469. data/app/assets/javascripts/geoblacklight/downloaders.js +0 -1
  470. data/app/assets/javascripts/geoblacklight/geoblacklight.js +0 -60
  471. data/app/assets/javascripts/geoblacklight/modules/bookmarks.js +0 -43
  472. data/app/assets/javascripts/geoblacklight/modules/download.js +0 -11
  473. data/app/assets/javascripts/geoblacklight/modules/geosearch.js +0 -133
  474. data/app/assets/javascripts/geoblacklight/modules/help_text.js +0 -7
  475. data/app/assets/javascripts/geoblacklight/modules/home.js +0 -16
  476. data/app/assets/javascripts/geoblacklight/modules/item.js +0 -32
  477. data/app/assets/javascripts/geoblacklight/modules/layer_opacity.js +0 -68
  478. data/app/assets/javascripts/geoblacklight/modules/metadata.js +0 -15
  479. data/app/assets/javascripts/geoblacklight/modules/metadata_download_button.js +0 -58
  480. data/app/assets/javascripts/geoblacklight/modules/relations.js +0 -14
  481. data/app/assets/javascripts/geoblacklight/modules/results.js +0 -81
  482. data/app/assets/javascripts/geoblacklight/modules/svg_tooltips.js +0 -31
  483. data/app/assets/javascripts/geoblacklight/modules/util.js +0 -48
  484. data/app/assets/javascripts/geoblacklight/modules.js +0 -1
  485. data/app/assets/javascripts/geoblacklight/templates/index_map_download.hbs +0 -19
  486. data/app/assets/javascripts/geoblacklight/templates/index_map_info.hbs +0 -61
  487. data/app/assets/javascripts/geoblacklight/viewers/cog.js +0 -5
  488. data/app/assets/javascripts/geoblacklight/viewers/esri/dynamic_map_layer.js +0 -85
  489. data/app/assets/javascripts/geoblacklight/viewers/esri/feature_layer.js +0 -76
  490. data/app/assets/javascripts/geoblacklight/viewers/esri/image_map_layer.js +0 -14
  491. data/app/assets/javascripts/geoblacklight/viewers/esri/tiled_map_layer.js +0 -50
  492. data/app/assets/javascripts/geoblacklight/viewers/esri.js +0 -78
  493. data/app/assets/javascripts/geoblacklight/viewers/iiif.js +0 -25
  494. data/app/assets/javascripts/geoblacklight/viewers/index_map.js +0 -71
  495. data/app/assets/javascripts/geoblacklight/viewers/map.js +0 -77
  496. data/app/assets/javascripts/geoblacklight/viewers/oembed.js +0 -13
  497. data/app/assets/javascripts/geoblacklight/viewers/pmtiles.js +0 -5
  498. data/app/assets/javascripts/geoblacklight/viewers/tilejson.js +0 -33
  499. data/app/assets/javascripts/geoblacklight/viewers/tms.js +0 -10
  500. data/app/assets/javascripts/geoblacklight/viewers/viewer.js +0 -68
  501. data/app/assets/javascripts/geoblacklight/viewers/wms.js +0 -74
  502. data/app/assets/javascripts/geoblacklight/viewers/wmts.js +0 -85
  503. data/app/assets/javascripts/geoblacklight/viewers/xyz.js +0 -10
  504. data/app/assets/javascripts/geoblacklight/viewers.js +0 -1
  505. data/app/assets/stylesheets/geoblacklight/modules/mixins.scss +0 -5
  506. data/app/helpers/arcgis_helper.rb +0 -14
  507. data/app/helpers/blacklight_helper.rb +0 -11
  508. data/app/helpers/carto_helper.rb +0 -31
  509. data/app/helpers/geoblacklight/geoblacklight_helper_behavior.rb +0 -18
  510. data/app/javascript/clover/clover_initializer.js +0 -29
  511. data/app/javascript/index.js +0 -7
  512. data/app/javascript/openlayers/basemaps.js +0 -47
  513. data/app/javascript/openlayers/ol_initializer.js +0 -106
  514. data/app/javascript/stylesheets/openlayers.css +0 -1
  515. data/app/models/concerns/geoblacklight/solr_document/carto.rb +0 -17
  516. data/app/views/catalog/_arcgis.html.erb +0 -4
  517. data/app/views/catalog/_carto.html.erb +0 -4
  518. data/app/views/catalog/_data_dictionary.html.erb +0 -5
  519. data/app/views/catalog/_downloads_collapse.html.erb +0 -27
  520. data/app/views/catalog/_header_icons.html.erb +0 -3
  521. data/app/views/catalog/_index_split_default.html.erb +0 -30
  522. data/app/views/catalog/_results_pagination.html.erb +0 -12
  523. data/app/views/catalog/_show_default_attribute_table.html.erb +0 -19
  524. data/app/views/catalog/_show_default_display_note.html.erb +0 -7
  525. data/app/views/catalog/_show_default_viewer_container.html.erb +0 -28
  526. data/app/views/catalog/_show_downloads.html.erb +0 -23
  527. data/app/views/catalog/_show_header_default.html.erb +0 -4
  528. data/app/views/catalog/_show_sidebar.html.erb +0 -16
  529. data/app/views/catalog/_show_sidebar_static_map.html.erb +0 -10
  530. data/app/views/catalog/_show_web_services.html.erb +0 -11
  531. data/app/views/catalog/_web_services.html.erb +0 -9
  532. data/app/views/catalog/_web_services_wms.html.erb +0 -13
  533. data/app/views/download/hgl.html.erb +0 -27
  534. data/app/views/relation/_relations.html.erb +0 -15
  535. data/app/views/shared/_header_navbar.html.erb +0 -46
  536. data/babel.config.json +0 -4
  537. data/jest.config.js +0 -25
  538. data/lib/generators/geoblacklight/templates/assets/_blacklight.scss +0 -1
  539. data/lib/generators/geoblacklight/templates/assets/_geoblacklight.scss +0 -1
  540. data/lib/generators/geoblacklight/templates/assets/geoblacklight.js +0 -9
  541. data/lib/generators/geoblacklight/templates/clover.js +0 -5
  542. data/lib/generators/geoblacklight/templates/ol.js +0 -6
  543. data/lib/generators/geoblacklight/templates/package-test.json +0 -10
  544. data/lib/generators/geoblacklight/templates/settings.gbl_v1.yml +0 -195
  545. data/lib/geoblacklight/download/hgl_download.rb +0 -20
  546. data/lib/geoblacklight/view_helper_override.rb +0 -16
  547. data/setupJest.js +0 -14
  548. data/spec/helpers/arcgis_helper_spec.rb +0 -16
  549. data/spec/helpers/carto_helper_spec.rb +0 -13
  550. data/spec/helpers/geoblacklight/geoblacklight_helper_behavior_spec.rb +0 -27
  551. data/spec/javascripts/util_spec.js +0 -10
  552. data/spec/lib/geoblacklight/download/hgl_download_spec.rb +0 -62
  553. data/spec/lib/geoblacklight/view_helper_override_spec.rb +0 -29
  554. data/spec/models/concerns/geoblacklight/solr_document/carto_spec.rb +0 -43
  555. data/spec/test_app_templates/Gemfile.extra +0 -2
  556. data/spec/views/catalog/_document_split.html.erb_spec.rb +0 -7
  557. data/spec/views/catalog/_index_split.html.erb_spec.rb +0 -7
  558. data/spec/views/catalog/_results_pagination.html.erb_spec.rb +0 -11
  559. data/spec/views/catalog/_show_downloads.html.erb_spec.rb +0 -43
  560. data/spec/views/catalog/_show_tools.html.erb_spec.rb +0 -38
  561. data/vendor/assets/images/fullscreen.png +0 -0
  562. data/vendor/assets/images/fullscreen@2x.png +0 -0
  563. data/vendor/assets/images/layers-2x.png +0 -0
  564. data/vendor/assets/images/layers.png +0 -0
  565. data/vendor/assets/images/marker-icon-2x.png +0 -0
  566. data/vendor/assets/images/marker-icon.png +0 -0
  567. data/vendor/assets/images/marker-shadow.png +0 -0
  568. data/vendor/assets/javascripts/Leaflet.fullscreen.js +0 -152
  569. data/vendor/assets/javascripts/esri-leaflet.js +0 -12
  570. data/vendor/assets/javascripts/esri-leaflet.js.map +0 -1
  571. data/vendor/assets/javascripts/leaflet-iiif.js +0 -323
  572. data/vendor/assets/javascripts/leaflet-src.js.erb +0 -14126
  573. data/vendor/assets/javascripts/leaflet-src.js.map +0 -1
  574. data/vendor/assets/javascripts/native.history.js +0 -1
  575. data/vendor/assets/stylesheets/leaflet.css +0 -640
  576. data/vendor/assets/stylesheets/leaflet.fullscreen.css +0 -40
  577. /data/app/{views/catalog/_show_default_viewer_information.html.erb → components/geoblacklight/index_map_inspect_component.html.erb} +0 -0
@@ -1,70 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GeoblacklightHelper
4
- def document_available?
5
- @document.public? || (@document.same_institution? && user_signed_in?)
6
- end
7
-
8
- def document_downloadable?
9
- document_available? && @document.downloadable?
4
+ def document_available?(document = @document)
5
+ document.public? || (document.same_institution? && user_signed_in?)
10
6
  end
11
7
 
12
8
  def iiif_jpg_url
13
9
  @document.references.iiif.endpoint.sub! "info.json", "full/full/0/default.jpg"
14
10
  end
15
11
 
16
- def download_link_file(label, id, url)
17
- link_to(
18
- label,
19
- url,
20
- "contentUrl" => url,
21
- :data => {
22
- download: "trigger",
23
- download_type: "direct",
24
- download_id: id
25
- }
26
- )
27
- end
28
-
29
- def download_link_hgl(text, document)
30
- link_to(
31
- text,
32
- download_hgl_path(id: document),
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
- :data => {
50
- download: "trigger"
51
- }
52
- )
53
- end
54
-
55
- def download_link_generated(download_type, document)
56
- link_to(
57
- t("geoblacklight.download.export_link", download_format: export_format_label(download_type)),
58
- "",
59
- data: {
60
- download_path: download_path(document.id, type: download_type),
61
- download: "trigger",
62
- download_type: download_type,
63
- download_id: document.id
64
- }
65
- )
66
- end
67
-
68
12
  ##
69
13
  # Blacklight catalog controller helper method to truncate field value to 150 chars
70
14
  # @param [SolrDocument] args
@@ -76,29 +20,16 @@ module GeoblacklightHelper
76
20
  ##
77
21
  # Returns an SVG icon or empty HTML span element
78
22
  # @return [SVG or HTML tag]
79
- # standard:disable Style/ArgumentsForwarding
80
- # TODO: Remove linter disable after lowest supported Ruby version >= 3.2
81
23
  def geoblacklight_icon(name, **args)
82
24
  icon_name = name ? name.to_s.parameterize : "none"
25
+ icon_name = Settings.ICON_MAPPING && Settings.ICON_MAPPING[icon_name] || icon_name
26
+ camel_icon = icon_name.tr("-", "_").camelize.delete(" ")
83
27
  begin
84
- blacklight_icon(icon_name, **args)
85
- rescue Blacklight::Exceptions::IconNotFound
28
+ render "Blacklight::Icons::#{camel_icon}Component".constantize.new(name: icon_name, **args)
29
+ rescue NameError
86
30
  tag.span class: "icon-missing geoblacklight-none"
87
31
  end
88
32
  end
89
- # standard:enable Style/ArgumentsForwarding
90
-
91
- ##
92
- # Looks up properly formatted names for formats
93
- #
94
- def proper_case_format(format)
95
- t("geoblacklight.formats.#{format.to_s.parameterize(separator: "_")}")
96
- end
97
-
98
- # Format labels are customized for exports - look up the appropriate key.
99
- def export_format_label(format)
100
- t("geoblacklight.download.export_#{format.to_s.parameterize(separator: "_")}_link")
101
- end
102
33
 
103
34
  ##
104
35
  # Looks up formatted names for references
@@ -108,52 +39,6 @@ module GeoblacklightHelper
108
39
  t "geoblacklight.references.#{reference}"
109
40
  end
110
41
 
111
- ##
112
- # Wraps download text with proper_case_format
113
- #
114
- def download_text(format)
115
- download_format = proper_case_format(format)
116
- value = t("geoblacklight.download.download_link", download_format: download_format)
117
- value.html_safe
118
- end
119
-
120
- ##
121
- # Deteremines if a feature should include help text popover
122
- # @return [Boolean]
123
- def show_help_text?(feature, key)
124
- Settings&.HELP_TEXT&.send(feature)&.include?(key)
125
- end
126
-
127
- ##
128
- # Render help text popover for a given feature and translation key
129
- # @return [HTML tag]
130
- def render_help_text_entry(feature, key)
131
- if I18n.exists?("geoblacklight.help_text.#{feature}.#{key}", locale)
132
- help_text = I18n.t("geoblacklight.help_text.#{feature}.#{key}")
133
- tag.h3 class: "help-text viewer_protocol h6" do
134
- tag.a data: {toggle: "popover", title: help_text[:title], content: help_text[:content]} do
135
- help_text[:title]
136
- end
137
- end
138
- else
139
- tag.span class: "help-text translation-missing"
140
- end
141
- end
142
-
143
- ##
144
- # Determines if item view should render the sidebar static map
145
- # @return [Boolean]
146
- def render_sidebar_map?(document)
147
- Settings.SIDEBAR_STATIC_MAP&.any? { |vp| document.viewer_protocol == vp }
148
- end
149
-
150
- ##
151
- # Deteremines if item view should include attribute table
152
- # @return [Boolean]
153
- def show_attribute_table?
154
- document_available? && @document.inspectable?
155
- end
156
-
157
42
  ##
158
43
  # Render value for a document's field as a truncate abstract
159
44
  # div. Arguments come from Blacklight::DocumentPresenter's
@@ -172,19 +57,6 @@ module GeoblacklightHelper
172
57
  blacklight_config.basemap_provider || "positron"
173
58
  end
174
59
 
175
- ##
176
- # Renders the partials for a Geoblacklight::Reference in the web services
177
- # modal
178
- # @param [Geoblacklight::Reference]
179
- def render_web_services(reference)
180
- render(
181
- partial: "web_services_#{reference.type}",
182
- locals: {reference: reference}
183
- )
184
- rescue ActionView::MissingTemplate
185
- render partial: "web_services_default", locals: {reference: reference}
186
- end
187
-
188
60
  ##
189
61
  # Returns a hash of the leaflet plugin settings to pass to the viewer.
190
62
  # @return[Hash]
@@ -229,14 +101,12 @@ module GeoblacklightHelper
229
101
 
230
102
  ## Returns the icon used based off a Settings strategy
231
103
  def relations_icon(document, icon)
232
- icon_name = document[Settings.FIELDS.GEOM_TYPE] if Settings.USE_GEOM_FOR_RELATIONS_ICON
233
- icon_name = icon if icon_name.blank?
234
- icon_options = {}
235
- icon_options = {classes: "svg_tooltip"} if Settings.USE_GEOM_FOR_RELATIONS_ICON
236
- geoblacklight_icon(icon_name, **icon_options)
104
+ icon_html = render Geoblacklight::HeaderIconsComponent.new(document: document, fields: [Settings.FIELDS.GEOM_TYPE]) if Settings.USE_GEOM_FOR_RELATIONS_ICON
105
+ return icon_html unless !Settings.USE_GEOM_FOR_RELATIONS_ICON || icon_html.include?("icon-missing")
106
+ geoblacklight_icon(icon, **{})
237
107
  end
238
108
 
239
- ## Returns the data-map attribute value used as the JS map selector
109
+ ## Returns the data-page attribute value used as the JS map selector
240
110
  def results_js_map_selector(controller_name)
241
111
  case controller_name
242
112
  when "bookmarks"
@@ -245,58 +115,4 @@ module GeoblacklightHelper
245
115
  "index"
246
116
  end
247
117
  end
248
-
249
- def viewer_container
250
- if openlayers_container?
251
- ol_viewer
252
- elsif iiif_manifest_container?
253
- iiif_manifest_viewer
254
- else
255
- leaflet_viewer
256
- end
257
- end
258
-
259
- def openlayers_container?
260
- return false unless @document
261
- @document.item_viewer.pmtiles || @document.item_viewer.cog
262
- end
263
-
264
- def leaflet_viewer
265
- tag.div(nil,
266
- id: "map",
267
- data: {
268
- :map => "item", :protocol => @document.viewer_protocol.camelize,
269
- :url => @document.viewer_endpoint,
270
- "layer-id" => @document.wxs_identifier,
271
- "map-geom" => @document.geometry.geojson,
272
- "catalog-path" => search_catalog_path,
273
- :available => document_available?,
274
- :basemap => geoblacklight_basemap,
275
- :leaflet_options => leaflet_options
276
- })
277
- end
278
-
279
- def ol_viewer
280
- tag.div(nil,
281
- id: "ol-map",
282
- data: {
283
- :map => "item", :protocol => @document.viewer_protocol.camelize,
284
- :url => @document.viewer_endpoint,
285
- "layer-id" => @document.wxs_identifier,
286
- "map-geom" => @document.geometry.geojson,
287
- "catalog-path" => search_catalog_path,
288
- :available => document_available?,
289
- :basemap => geoblacklight_basemap,
290
- :leaflet_options => leaflet_options
291
- })
292
- end
293
-
294
- def iiif_manifest_container?
295
- return false unless @document
296
- @document&.item_viewer&.viewer_preference&.key?(:iiif_manifest)
297
- end
298
-
299
- def iiif_manifest_viewer
300
- tag.div(nil, id: "clover-viewer", iiif_content: @document.viewer_endpoint)
301
- end
302
118
  end
@@ -0,0 +1,11 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["alert"];
5
+
6
+ async copyToClipboard(event) {
7
+ let text = event.params.value;
8
+ await navigator.clipboard.writeText(text)
9
+ this.alertTarget.classList.remove('d-none');
10
+ }
11
+ }
@@ -0,0 +1,47 @@
1
+ import { createElement } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import Viewer from "@samvera/clover-iiif/viewer";
4
+ import Image from "@samvera/clover-iiif/image";
5
+ import { Controller } from "@hotwired/stimulus";
6
+
7
+ const viewerOptions = {
8
+ showTitle: false,
9
+ showIIIFBadge: false,
10
+ informationPanel: {
11
+ renderToggle: false,
12
+ renderAbout: false,
13
+ },
14
+ };
15
+
16
+ export default class CloverViewerController extends Controller {
17
+ static values = {
18
+ url: String,
19
+ protocol: String,
20
+ };
21
+
22
+ connect() {
23
+ const root = createRoot(this.element);
24
+ root.render(this.getViewer(this.protocolValue, this.urlValue));
25
+ }
26
+
27
+ getViewer(protocol, url) {
28
+ if (protocol == "Iiif") {
29
+ // Create a wrapper div with inline style, as recommended in the docs:
30
+ // https://samvera-labs.github.io/clover-iiif/docs/image#react
31
+ return createElement(
32
+ "div",
33
+ { style: { height: 400 } },
34
+ createElement(Image, {
35
+ src: url.replace(/\/info\.json$/, ""),
36
+ isTiledImage: true,
37
+ })
38
+ );
39
+ }
40
+ if (protocol == "IiifManifest")
41
+ return createElement(Viewer, {
42
+ iiifContent: url,
43
+ options: viewerOptions,
44
+ });
45
+ console.error(`Unsupported protocol name: "${protocol}"`);
46
+ }
47
+ }
@@ -0,0 +1,56 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ download(ev) {
5
+ ev.preventDefault();
6
+ if (this.downloading) {
7
+ return;
8
+ }
9
+ this.downloading = true;
10
+ ev.target.classList.add('download-in-progress');
11
+ const url = ev.target.dataset.downloadPath;
12
+ ev.target.removeAttribute('href');
13
+ ev.target.innerHTML = '<div class="spinner-border spinner-border-sm float-end"></div> Preparing download...';
14
+
15
+ fetch(url)
16
+ .then((response) => {
17
+ if (!response.ok) {
18
+ return response.json().then((errorData) => {
19
+ const exception = new Error("Network response was not ok");
20
+ exception.data = errorData; // Attach the parsed JSON data to the error object
21
+ throw exception;
22
+ });
23
+ }
24
+ return response.json();
25
+ })
26
+ .then((data) => this.complete(data, ev.target))
27
+ .catch((error) => this.error(error, ev.target));
28
+ }
29
+
30
+ complete(data, target) {
31
+ this.downloading = false;
32
+ target.classList.remove('download-in-progress');
33
+ target.classList.add('download-complete');
34
+ target.innerHTML = `Download ready (${target.dataset.downloadType})`;
35
+ target.href = data[1];
36
+ this.renderMessage(data[0]);
37
+ //target.click();
38
+ }
39
+
40
+ error(exception, target) {
41
+ this.downloading = false;
42
+ target.classList.remove('download-in-progress');
43
+ target.classList.add('download-complete');
44
+ target.innerHTML = `Download failed (${target.dataset.downloadType})`;
45
+ this.renderMessage(exception.data[0]);
46
+ }
47
+
48
+ renderMessage(message) {
49
+ Object.entries(message).forEach(([idx, msg]) => {
50
+ const flash = document.createElement("div");
51
+ flash.className = `alert alert-${msg[0]}`;
52
+ flash.innerHTML = `<button type="button" class="close" data-bs-dismiss="alert" aria-hidden="true">&times;</button>${msg[1]}`;
53
+ document.querySelector("div.flash_messages").appendChild(flash);
54
+ });
55
+ }
56
+ }
@@ -0,0 +1,217 @@
1
+ import { Icon, Control } from "leaflet";
2
+ import "leaflet-fullscreen";
3
+ import { layerGroup, polygon, map, tileLayer } from "leaflet";
4
+ import { imageMapLayer } from "esri-leaflet";
5
+ import { Controller } from "@hotwired/stimulus";
6
+ import basemaps from "geoblacklight/leaflet/basemaps";
7
+ import LayerOpacityControl from "geoblacklight/leaflet/controls/layer_opacity";
8
+ import GeoSearchControl from "geoblacklight/leaflet/controls/geosearch";
9
+ import { wmsInspection,
10
+ tiledMapLayerInspection,
11
+ featureLayerInspection,
12
+ dynamicMapLayerInspection
13
+ } from "geoblacklight/leaflet/inspection";
14
+ import {
15
+ esriDynamicMapLayer,
16
+ esriFeatureLayer,
17
+ esriTiledMapLayer,
18
+ tileJsonLayer,
19
+ wmsLayer,
20
+ wmtsLayer,
21
+ indexMapLayer,
22
+ } from "geoblacklight/leaflet/layers";
23
+ import { geoJSONToBounds } from "geoblacklight/leaflet/utils";
24
+ import { DEFAULT_BOUNDS, DEFAULT_OPACITY, DEFAULT_GEOM_OVERLAY_OPTIONS } from "geoblacklight/leaflet/constants";
25
+
26
+ export default class LeafletViewerController extends Controller {
27
+ static values = {
28
+ url: String,
29
+ catalogBaseUrl: String,
30
+ protocol: String,
31
+ available: Boolean,
32
+ options: Object,
33
+ basemap: String,
34
+ mapGeom: Object,
35
+ page: String,
36
+ layerId: String,
37
+ drawInitialBounds: Boolean,
38
+ };
39
+
40
+ connect() {
41
+ // Sets leaflet icon paths to ex. /assets/marker-icon-2x-rails-fingerprint
42
+ // TODO: figure out why vite @leaftlet_images alias is not working.
43
+ Icon.Default.imagePath = "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/";
44
+
45
+ // Set up layers
46
+ this.basemap = this.getBasemap();
47
+ this.overlay = layerGroup();
48
+
49
+ // Calculate bounds
50
+ this.bounds = DEFAULT_BOUNDS;
51
+ if (this.hasMapGeomValue) this.bounds = geoJSONToBounds(this.mapGeomValue);
52
+
53
+ // Load the map
54
+ this.loadMap();
55
+ }
56
+
57
+ get config() {
58
+
59
+ if (!this.optionsValue.VIEWERS || !this.hasProtocolValue) return {};
60
+ return this.optionsValue.VIEWERS[this.protocolValue.toUpperCase()];
61
+ }
62
+
63
+ // Create the map, add layers, fit the bounds
64
+ async loadMap() {
65
+ if (this.map) return;
66
+
67
+ // Set up the map and fit to bounds
68
+ this.map = map(this.element);
69
+ this.map.addLayer(this.basemap);
70
+ this.map.addLayer(this.overlay);
71
+ this.fitBounds(this.bounds);
72
+ this.map.options.selected_color = this.optionsValue.SELECTED_COLOR || 'blue';
73
+
74
+ // If the data is available, add the preview and set up inspection
75
+ // Otherwise just draw the bounds, if configured to do so
76
+ if (this.availableValue && this.protocolValue) {
77
+ await this.addPreviewOverlay();
78
+ this.addInspection();
79
+ } else if (this.drawInitialBoundsValue && this.bounds) {
80
+ this.addBoundsOverlay(this.bounds);
81
+ }
82
+
83
+ // Add configured controls
84
+ this.addControls();
85
+
86
+ if (this.protocolValue == "IndexMap"){
87
+ this.fitBounds(this.previewOverlay.getBounds())
88
+ }
89
+
90
+ // Enable geosearch handler, if available
91
+ if (this.map.geosearch) this.map.geosearch.enable();
92
+
93
+ // Emit an event for other controllers to listen to
94
+ this.dispatch("loaded");
95
+ }
96
+
97
+ // Set the bounds of the map to an L.LatLngBounds object
98
+ fitBounds(bounds) {
99
+ // prevent map from moving when setting bounds, if relevant
100
+ if (this.map.geosearch) this.map.geosearch.disable();
101
+ this.map.fitBounds(bounds, { animate: false, noMoveStart: true });
102
+ this.bounds = bounds;
103
+ if (this.map.geosearch) this.map.geosearch.enable();
104
+ this.element.dataset.bounds = this.bounds.toBBoxString();
105
+ }
106
+
107
+ // Select the configured basemap to use
108
+ getBasemap() {
109
+ const basemapName = this.basemapValue || "positron";
110
+ return tileLayer(basemaps[basemapName].url, {
111
+ ...basemaps[basemapName],
112
+ detectRetina: this.optionsValue.LAYERS.DETECT_RETINA || false,
113
+ });
114
+ }
115
+
116
+ // Add the configured controls to the map
117
+ addControls() {
118
+ // Add any top-level controls (e.g. geosearch) first
119
+ const globalControls = this.optionsValue.CONTROLS || {};
120
+ Object.entries(globalControls).forEach(([controlName, controlOptions]) => {
121
+ const control = this.getControl(controlName, controlOptions);
122
+ if (control) this.addControl(control);
123
+ });
124
+
125
+ // Add opacity and fullscreen controls for all layers
126
+ if (this.hasProtocolValue) {
127
+ if (this.availableValue){
128
+ const opacityControl = this.getControl("Opacity");
129
+ this.addControl(opacityControl);
130
+ }
131
+ const fullscreenControl = this.getControl("Fullscreen");
132
+ this.addControl(fullscreenControl);
133
+ }
134
+ }
135
+
136
+ // Add a pre-configured L.Control instance to the map
137
+ addControl(control) {
138
+ this.map.addControl(control);
139
+ }
140
+
141
+ // Look up the control name and return the corresponding L.Control instance
142
+ getControl(controlName, controlOptions) {
143
+ if (controlName == "Opacity")
144
+ return new LayerOpacityControl(this.previewOverlay);
145
+ if (controlName == "Fullscreen")
146
+ return new Control.Fullscreen({ position: "topright", ...controlOptions });
147
+ if (controlName == "Geosearch")
148
+ return new GeoSearchControl({ baseUrl: this.catalogBaseUrlValue, ...controlOptions });
149
+ console.error(`Unsupported control name: "${controlName}"`);
150
+ }
151
+
152
+ // Add the bounding box to the map
153
+ addBoundsOverlay(bounds) {
154
+ const hasMapGeomValue = Object.keys(this.mapGeomValue).length > 0 && !this.map.geosearch;
155
+ var defaultOptions = hasMapGeomValue ? DEFAULT_GEOM_OVERLAY_OPTIONS : {};
156
+ const overlayOptions = this.optionsValue.BOUNDSOVERLAY || {};
157
+ const options = {...defaultOptions, ...overlayOptions[this.pageValue]}
158
+ const boundsOverlay = polygon([
159
+ bounds.getSouthWest(),
160
+ bounds.getSouthEast(),
161
+ bounds.getNorthEast(),
162
+ bounds.getNorthWest(),
163
+ ], options
164
+ );
165
+
166
+ // Render geometry layer if available
167
+ if (hasMapGeomValue) this.map.addLayer(L.geoJSON(this.mapGeomValue, overlayOptions[this.pageValue]));
168
+
169
+ // Render the bounds overlay
170
+ this.boundsOverlay = boundsOverlay;
171
+ this.overlay.addLayer(boundsOverlay);
172
+ }
173
+
174
+ // Remove the bounding box overlay
175
+ removeBoundsOverlay() {
176
+ if (this.boundsOverlay) this.overlay.removeLayer(this.boundsOverlay);
177
+ }
178
+
179
+ addInspection() {
180
+ if (this.protocolValue == "Wms") return wmsInspection(this.map, this.urlValue, this.layerIdValue, this.previewOverlay);
181
+ if (this.protocolValue == "FeatureLayer") return featureLayerInspection(this.map, this.previewOverlay);
182
+ if (this.protocolValue == "DynamicMapLayer") return dynamicMapLayerInspection(this.map, this.previewOverlay, this.layerIdValue)
183
+ // TODO: TiledMapLayer is converted but seems busted -- see layers.js. Don't know what to test it with, need a fixture.
184
+ // if (this.protocolValue == "TiledMapLayer") return tiledMapLayerInspection(this.map, this.previewOverlay);
185
+ }
186
+
187
+ // Add the actual data to the map as a layer
188
+ async addPreviewOverlay() {
189
+ this.previewOverlay = await this.getPreviewOverlay(
190
+ this.protocolValue,
191
+ this.urlValue,
192
+ {
193
+ layerId: this.layerIdValue,
194
+ opacity: this.optionsValue.opacity || DEFAULT_OPACITY,
195
+ detectRetina: this.optionsValue.LAYERS.DETECT_RETINA || false,
196
+ }
197
+ );
198
+ if (this.previewOverlay) this.overlay.addLayer(this.previewOverlay);
199
+ }
200
+
201
+ // Generate a layer based on the protocol
202
+ async getPreviewOverlay(protocol, url, options) {
203
+ if (protocol == "DynamicMapLayer") return esriDynamicMapLayer(url, options);
204
+ if (protocol == "FeatureLayer") return esriFeatureLayer(url, options);
205
+ // imageMapLayer is a built-in method from esri-leaflet
206
+ if (protocol == "ImageMapLayer") return imageMapLayer({url, ...options});
207
+ if (protocol == "IndexMap") return await indexMapLayer(url, this.optionsValue);
208
+ if (protocol == "TiledMapLayer") return await esriTiledMapLayer(url, options);
209
+ if (protocol == "Tilejson") return await tileJsonLayer(url, options);
210
+ // tileLayer is a built-in method from leaflet
211
+ if (protocol == "Tms") return tileLayer(url, { tms: true, ...options });
212
+ if (protocol == "Wms") return wmsLayer(url, options);
213
+ if (protocol == "Wmts") return await wmtsLayer(url, options);
214
+ if (protocol == "Xyz") return tileLayer(url, options);
215
+ console.error(`Unsupported protocol name: "${protocol}"`);
216
+ }
217
+ }
@@ -0,0 +1,18 @@
1
+ import { Controller } from "@hotwired/stimulus";
2
+
3
+ export default class OembedViewerController extends Controller {
4
+ static values = {
5
+ url: String,
6
+ };
7
+
8
+ connect() {
9
+ fetch(this.urlValue)
10
+ .then((response) => response.json())
11
+ .then((data) => {
12
+ if (data) this.element.innerHTML = data.html;
13
+ })
14
+ .catch((error) => {
15
+ console.error("Error loading oEmbed data:", error);
16
+ });
17
+ }
18
+ }
@@ -0,0 +1,63 @@
1
+ import { Map } from "ol";
2
+ import TileLayer from "ol/layer/Tile";
3
+ import XYZ from "ol/source/XYZ";
4
+ import GeoJSON from "ol/format/GeoJSON";
5
+ import { FullScreen, defaults as defaultControls } from "ol/control";
6
+ import { pmTilesLayer, cogLayer } from "geoblacklight/openlayers/layers";
7
+ import basemaps from "geoblacklight/openlayers/basemaps";
8
+ import { Controller } from "@hotwired/stimulus";
9
+
10
+ export default class OpenlayersViewerController extends Controller {
11
+ static values = {
12
+ url: String,
13
+ protocol: String,
14
+ basemap: String,
15
+ mapGeom: String,
16
+ };
17
+
18
+ async connect() {
19
+ // Set up layers
20
+ this.basemap = this.getBasemap();
21
+ this.overlay = this.getPreviewOverlay(this.protocolValue, this.urlValue);
22
+
23
+ await this.getBounds();
24
+ // Load the map
25
+ this.loadMap();
26
+ }
27
+
28
+ // Create the map, add layers, and fit the bounds
29
+ loadMap() {
30
+ this.map = new Map({
31
+ target: this.element,
32
+ controls: defaultControls().extend([new FullScreen()]),
33
+ layers: [this.basemap, this.overlay],
34
+ });
35
+ this.map.getView().fit(this.extent, this.map.getSize());
36
+ }
37
+
38
+ async getBounds() {
39
+ if (this.protocolValue == 'Cog') {
40
+ const view = await this.overlay.getSource().getView();
41
+ this.extent = view.extent;
42
+ } else {
43
+ this.extent = new GeoJSON()
44
+ .readFeatures(this.mapGeomValue)[0]
45
+ .getGeometry()
46
+ .getExtent();
47
+ }
48
+ }
49
+
50
+ // Select the configured basemap to use
51
+ getBasemap() {
52
+ const basemap = basemaps[this.basemapValue || "positron"];
53
+ const layer = new TileLayer({ source: new XYZ(basemap) });
54
+ return layer;
55
+ }
56
+
57
+ // Generate a layer based on the protocol
58
+ getPreviewOverlay(protocol, url) {
59
+ if (protocol === "Pmtiles") return pmTilesLayer(url);
60
+ if (protocol === "Cog") return cogLayer(url);
61
+ console.error(`Unsupported protocol name: "${protocol}"`);
62
+ }
63
+ }