geoblacklight 5.2.0 → 6.0.0.pre.alpha.1

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 (455) hide show
  1. checksums.yaml +4 -4
  2. data/.engine_cart.yml +14 -0
  3. data/.github/workflows/ruby.yml +24 -25
  4. data/.gitignore +0 -9
  5. data/.prettierignore +4 -0
  6. data/.prettierrc +5 -0
  7. data/CONTRIBUTING.md +2 -4
  8. data/Gemfile +4 -2
  9. data/README.md +4 -4
  10. data/Rakefile +0 -22
  11. data/app/assets/stylesheets/geoblacklight/global.css +7 -0
  12. data/app/assets/stylesheets/geoblacklight/home.css +22 -0
  13. data/app/assets/stylesheets/geoblacklight/index_maps.css +36 -0
  14. data/app/assets/stylesheets/geoblacklight/record.css +39 -0
  15. data/app/assets/stylesheets/geoblacklight/search.css +56 -0
  16. data/app/assets/stylesheets/geoblacklight/viewers.css +50 -0
  17. data/app/assets/stylesheets/geoblacklight.css +14 -0
  18. data/app/components/blacklight/icons/web_services_component.rb +3 -3
  19. data/app/components/geoblacklight/accordion_component.html.erb +16 -0
  20. data/app/components/geoblacklight/accordion_component.rb +15 -0
  21. data/app/components/geoblacklight/arcgis_component.html.erb +1 -1
  22. data/app/components/geoblacklight/arcgis_component.rb +1 -1
  23. data/app/components/geoblacklight/attribute_table_component.html.erb +15 -17
  24. data/app/components/geoblacklight/data_dictionary_download_component.html.erb +1 -1
  25. data/app/components/geoblacklight/display_note_component.html.erb +1 -1
  26. data/app/components/geoblacklight/display_note_component.rb +2 -1
  27. data/app/components/geoblacklight/document/citation_component.html.erb +1 -1
  28. data/app/components/geoblacklight/document/sidebar_component.html.erb +1 -1
  29. data/app/components/geoblacklight/document/sidebar_component.rb +0 -1
  30. data/app/components/geoblacklight/document_component.html.erb +1 -2
  31. data/app/components/geoblacklight/header_component.html.erb +4 -4
  32. data/app/components/geoblacklight/header_icons_component.rb +4 -2
  33. data/app/components/geoblacklight/homepage_feature_facet_component.html.erb +3 -7
  34. data/app/components/geoblacklight/homepage_feature_facet_component.rb +12 -3
  35. data/app/components/geoblacklight/iiif_drag_drop_component.html.erb +2 -2
  36. data/app/components/geoblacklight/iiif_drag_drop_component.rb +2 -2
  37. data/app/components/geoblacklight/index_map_inspect_component.html.erb +4 -3
  38. data/app/components/geoblacklight/index_map_legend_component.html.erb +7 -7
  39. data/app/components/geoblacklight/index_map_legend_component.rb +7 -0
  40. data/app/components/geoblacklight/item_map_viewer_component.rb +8 -4
  41. data/app/components/geoblacklight/location_leaflet_map_component.rb +28 -15
  42. data/app/components/geoblacklight/relations_component.html.erb +2 -2
  43. data/app/components/geoblacklight/search_result_component.html.erb +28 -26
  44. data/app/components/geoblacklight/search_result_component.rb +2 -2
  45. data/app/components/geoblacklight/static_map_component.rb +5 -4
  46. data/app/components/geoblacklight/viewer_help_text_component.html.erb +1 -1
  47. data/app/components/geoblacklight/viewer_help_text_component.rb +1 -1
  48. data/app/components/geoblacklight/web_services_component.html.erb +1 -1
  49. data/app/components/geoblacklight/web_services_component.rb +1 -1
  50. data/app/components/geoblacklight/web_services_default_component.html.erb +6 -6
  51. data/app/components/geoblacklight/web_services_link_component.rb +12 -9
  52. data/app/components/geoblacklight/web_services_wfs_component.html.erb +4 -4
  53. data/app/components/geoblacklight/web_services_wms_component.html.erb +4 -4
  54. data/app/controllers/download_controller.rb +0 -1
  55. data/app/controllers/wms_controller.rb +1 -1
  56. data/app/helpers/geoblacklight_helper.rb +0 -15
  57. data/app/javascript/geoblacklight/controllers/clipboard_controller.js +6 -6
  58. data/app/javascript/geoblacklight/controllers/downloads_controller.js +37 -29
  59. data/app/javascript/geoblacklight/controllers/leaflet_viewer_controller.js +112 -107
  60. data/app/javascript/geoblacklight/controllers/oembed_viewer_controller.js +5 -5
  61. data/app/javascript/geoblacklight/controllers/openlayers_viewer_controller.js +27 -30
  62. data/app/javascript/geoblacklight/controllers/search_results_controller.js +18 -18
  63. data/app/javascript/geoblacklight/core.js +35 -36
  64. data/app/javascript/geoblacklight/index.js +10 -10
  65. data/app/javascript/geoblacklight/initializers/metadata_download.js +23 -25
  66. data/app/javascript/geoblacklight/initializers/popovers.js +4 -4
  67. data/app/javascript/geoblacklight/initializers/relations.js +20 -20
  68. data/app/javascript/geoblacklight/initializers/tooltips.js +19 -23
  69. data/app/javascript/geoblacklight/initializers/truncation.js +18 -18
  70. data/app/javascript/geoblacklight/leaflet/basemaps.js +2 -3
  71. data/app/javascript/geoblacklight/leaflet/constants.js +7 -7
  72. data/app/javascript/geoblacklight/leaflet/controls/geosearch.js +80 -74
  73. data/app/javascript/geoblacklight/leaflet/controls/layer_opacity.js +74 -73
  74. data/app/javascript/geoblacklight/leaflet/controls/sidebar.js +49 -0
  75. data/app/javascript/geoblacklight/leaflet/controls/sleep.js +54 -51
  76. data/app/javascript/geoblacklight/leaflet/inspection.js +77 -68
  77. data/app/javascript/geoblacklight/leaflet/layer_index_map.js +74 -69
  78. data/app/javascript/geoblacklight/leaflet/layer_wmts.js +14 -16
  79. data/app/javascript/geoblacklight/leaflet/layers.js +59 -66
  80. data/app/javascript/geoblacklight/leaflet/utils.js +37 -43
  81. data/app/javascript/geoblacklight/openlayers/basemaps.js +35 -27
  82. data/app/javascript/geoblacklight/openlayers/inspection.js +23 -23
  83. data/app/javascript/geoblacklight/openlayers/layers.js +11 -11
  84. data/app/models/concerns/geoblacklight/bbox_filter_query.rb +7 -9
  85. data/app/models/concerns/geoblacklight/solr_document.rb +16 -39
  86. data/app/models/concerns/geoblacklight/suppressed_records_search_behavior.rb +3 -3
  87. data/app/views/catalog/_document_split.html.erb +3 -3
  88. data/app/views/catalog/_home_text.html.erb +22 -14
  89. data/app/views/catalog/_metadata.html.erb +1 -1
  90. data/app/views/catalog/_relations_container.html.erb +1 -1
  91. data/app/views/catalog/index.html.erb +0 -1
  92. data/app/views/catalog/metadata/_markup.html.erb +1 -2
  93. data/app/views/catalog/metadata/_missing.html.erb +2 -2
  94. data/app/views/catalog/web_services.html.erb +1 -1
  95. data/app/views/relation/index.html.erb +1 -1
  96. data/app/views/relation/index.json.jbuilder +1 -1
  97. data/config/importmap.rb +4 -10
  98. data/config/initializers/rails_config.rb +0 -3
  99. data/config/locales/geoblacklight.en.yml +79 -77
  100. data/geoblacklight.gemspec +1 -2
  101. data/lib/generators/geoblacklight/assets_generator.rb +35 -26
  102. data/lib/generators/geoblacklight/install_generator.rb +6 -11
  103. data/lib/generators/geoblacklight/templates/assets/customizations.css +6 -0
  104. data/lib/generators/geoblacklight/templates/catalog_controller.rb +97 -73
  105. data/lib/generators/geoblacklight/templates/settings.yml +98 -113
  106. data/lib/geoblacklight/configuration/default_settings_builder.rb +18 -0
  107. data/lib/geoblacklight/configuration/display_note_shown_config.rb +13 -0
  108. data/lib/geoblacklight/configuration/fields_config.rb +51 -0
  109. data/lib/geoblacklight/configuration/leaflet_config.rb +73 -0
  110. data/lib/geoblacklight/configuration/leaflet_layers_config.rb +21 -0
  111. data/lib/geoblacklight/configuration/leaflet_sleep_config.rb +20 -0
  112. data/lib/geoblacklight/configuration/legacy_settings_builder.rb +94 -0
  113. data/lib/geoblacklight/configuration.rb +148 -0
  114. data/lib/geoblacklight/download.rb +2 -2
  115. data/lib/geoblacklight/engine.rb +7 -5
  116. data/lib/geoblacklight/metadata/base.rb +0 -2
  117. data/lib/geoblacklight/metadata_transformer.rb +0 -2
  118. data/lib/geoblacklight/references.rb +5 -4
  119. data/lib/geoblacklight/relation/ancestors.rb +3 -2
  120. data/lib/geoblacklight/relation/descendants.rb +2 -1
  121. data/lib/geoblacklight/relation/relation_response.rb +4 -4
  122. data/lib/geoblacklight/version.rb +1 -1
  123. data/lib/geoblacklight/wms_layer.rb +3 -3
  124. data/lib/geoblacklight.rb +7 -1
  125. data/package.json +10 -34
  126. data/schema/geoblacklight-schema-aardvark.json +3 -11
  127. data/schema/readme.md +3 -4
  128. data/solr/conf/_rest_managed.json +3 -2
  129. data/solr/conf/schema.xml +1 -1
  130. data/spec/components/geoblacklight/arcgis_component_spec.rb +6 -6
  131. data/spec/components/geoblacklight/attribute_table_component_spec.rb +6 -7
  132. data/spec/components/geoblacklight/citation_component_spec.rb +7 -4
  133. data/spec/components/geoblacklight/display_note_component_spec.rb +8 -8
  134. data/spec/components/geoblacklight/document_component_spec.rb +13 -13
  135. data/spec/components/geoblacklight/download_links_component_spec.rb +17 -14
  136. data/spec/components/geoblacklight/header_icons_component_spec.rb +6 -11
  137. data/spec/components/geoblacklight/homepage_feature_facet_component_spec.rb +22 -30
  138. data/spec/components/geoblacklight/iiif_drag_drop_component_spec.rb +3 -3
  139. data/spec/components/geoblacklight/index_map_legend_component_spec.rb +5 -18
  140. data/spec/components/geoblacklight/item_map_viewer_component_spec.rb +5 -5
  141. data/spec/components/geoblacklight/login_link_component_spec.rb +4 -5
  142. data/spec/components/geoblacklight/search_result_component_spec.rb +2 -6
  143. data/spec/components/geoblacklight/static_map_component_spec.rb +2 -2
  144. data/spec/components/geoblacklight/viewer_help_text_component_spec.rb +4 -6
  145. data/spec/components/geoblacklight/web_services_component_spec.rb +11 -10
  146. data/spec/controllers/catalog_controller_spec.rb +7 -7
  147. data/spec/controllers/download_controller_spec.rb +1 -1
  148. data/spec/controllers/relation_controller_spec.rb +1 -1
  149. data/spec/controllers/wms_controller_spec.rb +1 -1
  150. data/spec/features/axe_spec.rb +4 -4
  151. data/spec/features/bookmarks_spec.rb +1 -1
  152. data/spec/features/citations_spec.rb +1 -1
  153. data/spec/features/configurable_basemap_spec.rb +1 -1
  154. data/spec/features/data_dictionary_download_spec.rb +1 -1
  155. data/spec/features/download_layer_spec.rb +1 -1
  156. data/spec/features/empty_search_spec.rb +1 -1
  157. data/spec/features/esri_viewer_spec.rb +1 -1
  158. data/spec/features/exports_spec.rb +1 -1
  159. data/spec/features/full_screen_control_spec.rb +3 -12
  160. data/spec/features/help_text_spec.rb +1 -1
  161. data/spec/features/home_page_spec.rb +1 -1
  162. data/spec/features/index_map_spec.rb +3 -3
  163. data/spec/features/index_view_spec.rb +7 -7
  164. data/spec/features/layer_inspection_spec.rb +1 -1
  165. data/spec/features/layer_opacity_spec.rb +1 -1
  166. data/spec/features/layer_preview_spec.rb +1 -1
  167. data/spec/features/layer_with_no_references_spec.rb +1 -1
  168. data/spec/features/linkified_attribute_table_spec.rb +1 -1
  169. data/spec/features/metadata_panel_spec.rb +1 -1
  170. data/spec/features/missing_metadata_spec.rb +1 -1
  171. data/spec/features/multiple_downloads_spec.rb +1 -1
  172. data/spec/features/oembed_spec.rb +1 -1
  173. data/spec/features/relations_spec.rb +2 -2
  174. data/spec/features/saved_searches_spec.rb +2 -9
  175. data/spec/features/search_bar_spec.rb +1 -1
  176. data/spec/features/search_results_complex_geometry_spec.rb +1 -1
  177. data/spec/features/search_results_icons_spec.rb +3 -4
  178. data/spec/features/search_results_map_spec.rb +1 -1
  179. data/spec/features/search_results_overlap_ratio_spec.rb +3 -3
  180. data/spec/features/search_spec.rb +1 -1
  181. data/spec/features/show_page_download_spec.rb +1 -1
  182. data/spec/features/show_page_metadata_spec.rb +2 -2
  183. data/spec/features/show_page_sidebar_static_map_spec.rb +1 -1
  184. data/spec/features/sms_spec.rb +1 -1
  185. data/spec/features/suppressed_records_spec.rb +1 -1
  186. data/spec/features/tilejson_spec.rb +1 -1
  187. data/spec/features/tms_spec.rb +1 -1
  188. data/spec/features/web_services_modal_spec.rb +1 -1
  189. data/spec/features/wmts_spec.rb +1 -1
  190. data/spec/features/xyz_spec.rb +1 -1
  191. data/spec/fixtures/manifests/tilejson.json +10 -19
  192. data/spec/fixtures/metadata/fgdc.html +1 -1
  193. data/spec/fixtures/metadata/iso.html +1 -1
  194. data/spec/fixtures/solr_documents/README.md +0 -1
  195. data/spec/fixtures/solr_documents/actual-papermap1.json +9 -28
  196. data/spec/fixtures/solr_documents/actual-point1.json +12 -39
  197. data/spec/fixtures/solr_documents/actual-polygon1.json +10 -30
  198. data/spec/fixtures/solr_documents/actual-raster1.json +14 -46
  199. data/spec/fixtures/solr_documents/all-relationships.json +12 -36
  200. data/spec/fixtures/solr_documents/b1g_iiif_manifest.json +33 -62
  201. data/spec/fixtures/solr_documents/b1g_wabash_child_15.json +13 -40
  202. data/spec/fixtures/solr_documents/b1g_wabash_child_16.json +13 -40
  203. data/spec/fixtures/solr_documents/b1g_wabash_child_17.json +13 -40
  204. data/spec/fixtures/solr_documents/b1g_wabash_child_18.json +13 -40
  205. data/spec/fixtures/solr_documents/b1g_wabash_parent.json +13 -40
  206. data/spec/fixtures/solr_documents/baruch_ancestor1.json +13 -40
  207. data/spec/fixtures/solr_documents/baruch_ancestor2.json +13 -40
  208. data/spec/fixtures/solr_documents/baruch_documentation_download.json +14 -46
  209. data/spec/fixtures/solr_documents/bbox-spans-180.json +7 -21
  210. data/spec/fixtures/solr_documents/complex-geom.json +11 -37
  211. data/spec/fixtures/solr_documents/cornell_html_metadata.json +12 -37
  212. data/spec/fixtures/solr_documents/display-note.json +11 -33
  213. data/spec/fixtures/solr_documents/esri-dynamic-layer-all-layers.json +13 -39
  214. data/spec/fixtures/solr_documents/esri-dynamic-layer-single-layer.json +13 -40
  215. data/spec/fixtures/solr_documents/esri-feature-layer.json +13 -39
  216. data/spec/fixtures/solr_documents/esri-image-map-layer.json +13 -40
  217. data/spec/fixtures/solr_documents/esri-tiled_map_layer.json +16 -54
  218. data/spec/fixtures/solr_documents/esri-wms-layer.json +12 -36
  219. data/spec/fixtures/solr_documents/harvard_raster.json +12 -37
  220. data/spec/fixtures/solr_documents/iiif-eastern-hemisphere.json +9 -27
  221. data/spec/fixtures/solr_documents/index-map-polygon-no-downloadurl.json +12 -41
  222. data/spec/fixtures/solr_documents/index-map-polygon.json +12 -41
  223. data/spec/fixtures/solr_documents/index-map-stanford.json +14 -45
  224. data/spec/fixtures/solr_documents/index-map-v1-complex.json +13 -38
  225. data/spec/fixtures/solr_documents/index_map_point.json +13 -42
  226. data/spec/fixtures/solr_documents/metadata_no_geom.json +4 -14
  227. data/spec/fixtures/solr_documents/metadata_no_provider.json +8 -25
  228. data/spec/fixtures/solr_documents/multiple-downloads.json +6 -18
  229. data/spec/fixtures/solr_documents/no_locn_geometry.json +4 -12
  230. data/spec/fixtures/solr_documents/no_spatial.json +4 -12
  231. data/spec/fixtures/solr_documents/oembed.json +8 -25
  232. data/spec/fixtures/solr_documents/princeton-child1.json +9 -29
  233. data/spec/fixtures/solr_documents/princeton-child2.json +9 -29
  234. data/spec/fixtures/solr_documents/princeton-child3.json +9 -29
  235. data/spec/fixtures/solr_documents/princeton-child4.json +9 -29
  236. data/spec/fixtures/solr_documents/princeton-parent.json +10 -33
  237. data/spec/fixtures/solr_documents/public_cog_princeton.json +9 -27
  238. data/spec/fixtures/solr_documents/public_iiif_princeton.json +13 -43
  239. data/spec/fixtures/solr_documents/public_pmtiles_princeton.json +29 -39
  240. data/spec/fixtures/solr_documents/public_polygon_mit.json +9 -30
  241. data/spec/fixtures/solr_documents/restricted-line.json +14 -47
  242. data/spec/fixtures/solr_documents/the-related-record.json +4 -12
  243. data/spec/fixtures/solr_documents/tilejson.json +23 -46
  244. data/spec/fixtures/solr_documents/tms.json +7 -21
  245. data/spec/fixtures/solr_documents/umn_metro_result1.json +13 -41
  246. data/spec/fixtures/solr_documents/umn_state_result1.json +13 -39
  247. data/spec/fixtures/solr_documents/umn_state_result2.json +13 -39
  248. data/spec/fixtures/solr_documents/uva_slug_colon.json +10 -30
  249. data/spec/fixtures/solr_documents/wmts-multiple.json +23 -39
  250. data/spec/fixtures/solr_documents/wmts-single-layer.json +23 -46
  251. data/spec/fixtures/solr_documents/xyz.json +10 -33
  252. data/spec/helpers/geoblacklight_helper_spec.rb +5 -50
  253. data/spec/javascripts/geoblacklight_spec.js +10 -10
  254. data/spec/javascripts/metadata_download_button_spec.js +14 -13
  255. data/spec/lib/geoblacklight/bounding_box_spec.rb +1 -1
  256. data/spec/lib/geoblacklight/configuration/default_settings_builder_spec.rb +9 -0
  257. data/spec/lib/geoblacklight/configuration_spec.rb +13 -0
  258. data/spec/lib/geoblacklight/download/csv_download_spec.rb +2 -2
  259. data/spec/lib/geoblacklight/download/geojson_download_spec.rb +2 -2
  260. data/spec/lib/geoblacklight/download/geotiff_download_spec.rb +5 -2
  261. data/spec/lib/geoblacklight/download/kmz_download_spec.rb +2 -2
  262. data/spec/lib/geoblacklight/download/shapefile_download_spec.rb +2 -2
  263. data/spec/lib/geoblacklight/download_spec.rb +15 -6
  264. data/spec/lib/geoblacklight/geometry_spec.rb +1 -1
  265. data/spec/lib/geoblacklight/item_viewer_spec.rb +2 -2
  266. data/spec/lib/geoblacklight/metadata/base_spec.rb +1 -1
  267. data/spec/lib/geoblacklight/metadata/html_spec.rb +1 -1
  268. data/spec/lib/geoblacklight/metadata_spec.rb +1 -1
  269. data/spec/lib/geoblacklight/metadata_transformer/base_spec.rb +1 -1
  270. data/spec/lib/geoblacklight/metadata_transformer/fgdc_spec.rb +1 -1
  271. data/spec/lib/geoblacklight/metadata_transformer/iso19139_spec.rb +1 -1
  272. data/spec/lib/geoblacklight/metadata_transformer_spec.rb +1 -1
  273. data/spec/lib/geoblacklight/reference_spec.rb +1 -1
  274. data/spec/lib/geoblacklight/references_spec.rb +6 -4
  275. data/spec/lib/geoblacklight/relation/ancestors_spec.rb +10 -4
  276. data/spec/lib/geoblacklight/relation/descendants_spec.rb +9 -4
  277. data/spec/lib/geoblacklight/relation/relation_response_spec.rb +12 -15
  278. data/spec/lib/geoblacklight/wms_layer/feature_info_response_spec.rb +1 -1
  279. data/spec/lib/geoblacklight/wms_layer_spec.rb +1 -1
  280. data/spec/models/concerns/geoblacklight/bbox_filter_query_spec.rb +20 -11
  281. data/spec/models/concerns/geoblacklight/solr_document/citation_spec.rb +1 -1
  282. data/spec/models/concerns/geoblacklight/solr_document/finder_spec.rb +1 -1
  283. data/spec/models/concerns/geoblacklight/solr_document/inspection_spec.rb +1 -1
  284. data/spec/models/concerns/geoblacklight/solr_document_spec.rb +4 -39
  285. data/spec/models/concerns/geoblacklight/suppressed_records_search_behavior_spec.rb +2 -2
  286. data/spec/routing/catalog_routing_spec.rb +1 -1
  287. data/spec/spec_helper.rb +21 -10
  288. data/spec/tasks/geoblacklight_spec.rb +1 -1
  289. data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -3
  290. metadata +36 -185
  291. data/Procfile.dev +0 -3
  292. data/app/assets/stylesheets/geoblacklight/geoblacklight.scss +0 -2
  293. data/app/assets/stylesheets/geoblacklight/modules/_base.scss +0 -31
  294. data/app/assets/stylesheets/geoblacklight/modules/_blacklight_overrides.scss +0 -40
  295. data/app/assets/stylesheets/geoblacklight/modules/_styles.scss +0 -9
  296. data/app/assets/stylesheets/geoblacklight/modules/downloads.scss +0 -62
  297. data/app/assets/stylesheets/geoblacklight/modules/geosearch.scss +0 -23
  298. data/app/assets/stylesheets/geoblacklight/modules/home.scss +0 -13
  299. data/app/assets/stylesheets/geoblacklight/modules/icon-customization.scss +0 -116
  300. data/app/assets/stylesheets/geoblacklight/modules/index_maps.scss +0 -61
  301. data/app/assets/stylesheets/geoblacklight/modules/item.scss +0 -61
  302. data/app/assets/stylesheets/geoblacklight/modules/layer_opacity.scss +0 -87
  303. data/app/assets/stylesheets/geoblacklight/modules/leaflet.scss +0 -4
  304. data/app/assets/stylesheets/geoblacklight/modules/metadata.scss +0 -31
  305. data/app/assets/stylesheets/geoblacklight/modules/metadata_content.scss +0 -43
  306. data/app/assets/stylesheets/geoblacklight/modules/metadata_markup.scss +0 -9
  307. data/app/assets/stylesheets/geoblacklight/modules/metadata_missing.scss +0 -7
  308. data/app/assets/stylesheets/geoblacklight/modules/modal.scss +0 -5
  309. data/app/assets/stylesheets/geoblacklight/modules/results.scss +0 -60
  310. data/app/assets/stylesheets/geoblacklight/modules/search_widgets.scss +0 -5
  311. data/app/assets/stylesheets/geoblacklight/modules/sidebar.scss +0 -42
  312. data/app/assets/stylesheets/geoblacklight/modules/toolbar.scss +0 -34
  313. data/app/assets/stylesheets/geoblacklight/modules/web_services.scss +0 -5
  314. data/app/components/blacklight/icons/american_geographical_society_library_uwm_libraries_component.rb +0 -46
  315. data/app/components/blacklight/icons/arizona_component.rb +0 -24
  316. data/app/components/blacklight/icons/baruch_cuny_component.rb +0 -23
  317. data/app/components/blacklight/icons/bookmark_component.rb +0 -23
  318. data/app/components/blacklight/icons/circle_info_solid_component.rb +0 -23
  319. data/app/components/blacklight/icons/columbia_component.rb +0 -23
  320. data/app/components/blacklight/icons/cornell_component.rb +0 -25
  321. data/app/components/blacklight/icons/george_mason_component.rb +0 -24
  322. data/app/components/blacklight/icons/harvard_component.rb +0 -23
  323. data/app/components/blacklight/icons/indiana_component.rb +0 -23
  324. data/app/components/blacklight/icons/lewis_clark_component.rb +0 -25
  325. data/app/components/blacklight/icons/massgis_component.rb +0 -23
  326. data/app/components/blacklight/icons/michigan_state_university_component.rb +0 -25
  327. data/app/components/blacklight/icons/mit_component.rb +0 -23
  328. data/app/components/blacklight/icons/northwestern_university_component.rb +0 -24
  329. data/app/components/blacklight/icons/nyu_component.rb +0 -26
  330. data/app/components/blacklight/icons/pennsylvania_state_university_component.rb +0 -25
  331. data/app/components/blacklight/icons/princeton_component.rb +0 -23
  332. data/app/components/blacklight/icons/purdue_university_component.rb +0 -25
  333. data/app/components/blacklight/icons/rutgers_component.rb +0 -25
  334. data/app/components/blacklight/icons/sms_component.rb +0 -23
  335. data/app/components/blacklight/icons/stanford_component.rb +0 -23
  336. data/app/components/blacklight/icons/texas_component.rb +0 -23
  337. data/app/components/blacklight/icons/the_ohio_state_university_component.rb +0 -26
  338. data/app/components/blacklight/icons/tufts_component.rb +0 -23
  339. data/app/components/blacklight/icons/ucla_component.rb +0 -23
  340. data/app/components/blacklight/icons/university_of_california_berkeley_component.rb +0 -24
  341. data/app/components/blacklight/icons/university_of_chicago_component.rb +0 -25
  342. data/app/components/blacklight/icons/university_of_colorado_boulder_component.rb +0 -26
  343. data/app/components/blacklight/icons/university_of_illinois_urbana_champaign_component.rb +0 -25
  344. data/app/components/blacklight/icons/university_of_iowa_component.rb +0 -24
  345. data/app/components/blacklight/icons/university_of_maryland_component.rb +0 -24
  346. data/app/components/blacklight/icons/university_of_michigan_component.rb +0 -24
  347. data/app/components/blacklight/icons/university_of_minnesota_component.rb +0 -24
  348. data/app/components/blacklight/icons/university_of_nebraska_lincoln_component.rb +0 -27
  349. data/app/components/blacklight/icons/university_of_wisconsin_madison_component.rb +0 -24
  350. data/app/components/blacklight/icons/uva_component.rb +0 -23
  351. data/app/components/geoblacklight/icon_facet_item_component.rb +0 -33
  352. data/app/components/geoblacklight/web_services_link_component.html.erb +0 -3
  353. data/bin/vite +0 -29
  354. data/config/initializers/new_gbl_settings_defaults_4.1.yml +0 -104
  355. data/lib/generators/geoblacklight/assets/importmap_generator.rb +0 -70
  356. data/lib/generators/geoblacklight/assets/vite_generator.rb +0 -82
  357. data/lib/generators/geoblacklight/templates/assets/_customizations.scss +0 -23
  358. data/lib/generators/geoblacklight/templates/assets/application.js +0 -17
  359. data/lib/generators/geoblacklight/templates/assets/application.scss +0 -9
  360. data/lib/generators/geoblacklight/templates/assets/geoblacklight.scss +0 -11
  361. data/lib/generators/geoblacklight/templates/base.html.erb +0 -46
  362. data/lib/generators/geoblacklight/templates/vite.config.ts +0 -23
  363. data/lib/generators/geoblacklight/templates/vite.json +0 -16
  364. data/schema/geoblacklight-schema-1.0.json +0 -214
  365. data/solr/conf/xslt/example.xsl +0 -132
  366. data/solr/conf/xslt/example_atom.xsl +0 -67
  367. data/solr/conf/xslt/example_rss.xsl +0 -66
  368. data/solr/conf/xslt/luke.xsl +0 -337
  369. data/spec/components/blacklight/icons/american_geographical_society_library_uwm_libraries_component_spec.rb +0 -15
  370. data/spec/components/blacklight/icons/arizona_component_spec.rb +0 -15
  371. data/spec/components/blacklight/icons/arrow_circle_down_component_spec.rb +0 -15
  372. data/spec/components/blacklight/icons/baruch_cuny_component_spec.rb +0 -15
  373. data/spec/components/blacklight/icons/book_component_spec.rb +0 -15
  374. data/spec/components/blacklight/icons/bookmark_component_spec.rb +0 -15
  375. data/spec/components/blacklight/icons/cd_rom_component_spec.rb +0 -15
  376. data/spec/components/blacklight/icons/child_item_component_spec.rb +0 -15
  377. data/spec/components/blacklight/icons/circle_info_solid_component_spec.rb +0 -15
  378. data/spec/components/blacklight/icons/citation_component_spec.rb +0 -15
  379. data/spec/components/blacklight/icons/collection_component_spec.rb +0 -15
  380. data/spec/components/blacklight/icons/collections_component_spec.rb +0 -15
  381. data/spec/components/blacklight/icons/columbia_component_spec.rb +0 -15
  382. data/spec/components/blacklight/icons/cornell_component_spec.rb +0 -15
  383. data/spec/components/blacklight/icons/datasets_component_spec.rb +0 -15
  384. data/spec/components/blacklight/icons/dvd_rom_component_spec.rb +0 -15
  385. data/spec/components/blacklight/icons/email_component_spec.rb +0 -15
  386. data/spec/components/blacklight/icons/esri_globe_component_spec.rb +0 -15
  387. data/spec/components/blacklight/icons/fire_solid_component_spec.rb +0 -15
  388. data/spec/components/blacklight/icons/george_mason_component_spec.rb +0 -15
  389. data/spec/components/blacklight/icons/globe_component_spec.rb +0 -15
  390. data/spec/components/blacklight/icons/harvard_component_spec.rb +0 -15
  391. data/spec/components/blacklight/icons/home_component_spec.rb +0 -15
  392. data/spec/components/blacklight/icons/iiif_drag_drop_component_spec.rb +0 -15
  393. data/spec/components/blacklight/icons/image_component_spec.rb +0 -15
  394. data/spec/components/blacklight/icons/imagery_component_spec.rb +0 -15
  395. data/spec/components/blacklight/icons/indiana_component_spec.rb +0 -15
  396. data/spec/components/blacklight/icons/leaf_component_spec.rb +0 -15
  397. data/spec/components/blacklight/icons/lewis_clark_component_spec.rb +0 -15
  398. data/spec/components/blacklight/icons/lightbulb_solid_component_spec.rb +0 -15
  399. data/spec/components/blacklight/icons/line_component_spec.rb +0 -15
  400. data/spec/components/blacklight/icons/map_component_spec.rb +0 -15
  401. data/spec/components/blacklight/icons/map_marker_component_spec.rb +0 -15
  402. data/spec/components/blacklight/icons/maps_component_spec.rb +0 -15
  403. data/spec/components/blacklight/icons/massgis_component_spec.rb +0 -15
  404. data/spec/components/blacklight/icons/metadata_component_spec.rb +0 -15
  405. data/spec/components/blacklight/icons/michigan_state_university_component_spec.rb +0 -15
  406. data/spec/components/blacklight/icons/mit_component_spec.rb +0 -15
  407. data/spec/components/blacklight/icons/mixed_component_spec.rb +0 -15
  408. data/spec/components/blacklight/icons/multilinestring_component_spec.rb +0 -15
  409. data/spec/components/blacklight/icons/multipoint_component_spec.rb +0 -15
  410. data/spec/components/blacklight/icons/multipolygon_component_spec.rb +0 -15
  411. data/spec/components/blacklight/icons/northwestern_university_component_spec.rb +0 -15
  412. data/spec/components/blacklight/icons/nyu_component_spec.rb +0 -15
  413. data/spec/components/blacklight/icons/pagelines_brands_component_spec.rb +0 -15
  414. data/spec/components/blacklight/icons/paper_map_component_spec.rb +0 -15
  415. data/spec/components/blacklight/icons/parent_item_component_spec.rb +0 -15
  416. data/spec/components/blacklight/icons/pennsylvania_state_university_component_spec.rb +0 -15
  417. data/spec/components/blacklight/icons/point_component_spec.rb +0 -15
  418. data/spec/components/blacklight/icons/polygon_component_spec.rb +0 -15
  419. data/spec/components/blacklight/icons/polyline_component_spec.rb +0 -15
  420. data/spec/components/blacklight/icons/princeton_component_spec.rb +0 -15
  421. data/spec/components/blacklight/icons/public_component_spec.rb +0 -15
  422. data/spec/components/blacklight/icons/purdue_university_component_spec.rb +0 -15
  423. data/spec/components/blacklight/icons/raster_component_spec.rb +0 -15
  424. data/spec/components/blacklight/icons/restricted_component_spec.rb +0 -15
  425. data/spec/components/blacklight/icons/rutgers_component_spec.rb +0 -15
  426. data/spec/components/blacklight/icons/sms_component_spec.rb +0 -15
  427. data/spec/components/blacklight/icons/stanford_component_spec.rb +0 -15
  428. data/spec/components/blacklight/icons/table_component_spec.rb +0 -15
  429. data/spec/components/blacklight/icons/tags_component_spec.rb +0 -15
  430. data/spec/components/blacklight/icons/texas_component_spec.rb +0 -15
  431. data/spec/components/blacklight/icons/the_ohio_state_university_component_spec.rb +0 -15
  432. data/spec/components/blacklight/icons/triangle_exclamation_solid_component_spec.rb +0 -15
  433. data/spec/components/blacklight/icons/tufts_component_spec.rb +0 -15
  434. data/spec/components/blacklight/icons/ucla_component_spec.rb +0 -15
  435. data/spec/components/blacklight/icons/university_of_california_berkeley_component_spec.rb +0 -15
  436. data/spec/components/blacklight/icons/university_of_chicago_component_spec.rb +0 -15
  437. data/spec/components/blacklight/icons/university_of_colorado_boulder_component_spec.rb +0 -15
  438. data/spec/components/blacklight/icons/university_of_illinois_urbana_champaign_component_spec.rb +0 -15
  439. data/spec/components/blacklight/icons/university_of_iowa_component_spec.rb +0 -15
  440. data/spec/components/blacklight/icons/university_of_maryland_component_spec.rb +0 -15
  441. data/spec/components/blacklight/icons/university_of_michigan_component_spec.rb +0 -15
  442. data/spec/components/blacklight/icons/university_of_minnesota_component_spec.rb +0 -15
  443. data/spec/components/blacklight/icons/university_of_nebraska_lincoln_component_spec.rb +0 -15
  444. data/spec/components/blacklight/icons/university_of_wisconsin_madison_component_spec.rb +0 -15
  445. data/spec/components/blacklight/icons/uva_component_spec.rb +0 -15
  446. data/spec/components/blacklight/icons/web_services_component_spec.rb +0 -15
  447. data/spec/components/blacklight/icons/websites_component_spec.rb +0 -15
  448. data/spec/components/geoblacklight/icon_facet_item_component_spec.rb +0 -18
  449. data/spec/config/initializers/rails_config_spec.rb +0 -16
  450. data/spec/fixtures/solr_documents/public_direct_download.json +0 -62
  451. data/spec/support/backport_test_helpers.rb +0 -47
  452. data/spec/support/view_component_capybara_test_helpers.rb +0 -8
  453. data/test/leaflet/layers.test.js +0 -17
  454. data/vite.config.ts +0 -35
  455. /data/app/assets/images/{blacklight → geoblacklight}/logo.svg +0 -0
@@ -2,55 +2,63 @@ import { Controller } from "@hotwired/stimulus"
2
2
 
3
3
  export default class extends Controller {
4
4
  download(ev) {
5
- ev.preventDefault();
5
+ ev.preventDefault()
6
6
  if (this.downloading) {
7
- return;
7
+ return
8
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...';
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
14
 
15
15
  fetch(url)
16
16
  .then((response) => {
17
17
  if (!response.ok) {
18
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
- });
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
23
  }
24
- return response.json();
24
+ return response.json()
25
25
  })
26
26
  .then((data) => this.complete(data, ev.target))
27
- .catch((error) => this.error(error, ev.target));
27
+ .catch((error) => this.error(error, ev.target))
28
28
  }
29
29
 
30
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]);
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
37
  //target.click();
38
38
  }
39
39
 
40
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]);
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
+ console.log(exception)
46
+
47
+ this.renderMessage(exception.data[0])
46
48
  }
47
49
 
48
50
  renderMessage(message) {
51
+ let flashContainer = document.querySelector("div.flash_messages")
52
+ if (!flashContainer) {
53
+ flashContainer = document.createElement("div")
54
+ flashContainer.className = "flash_messages"
55
+ document.getElementById("document").prepend(flashContainer)
56
+ }
49
57
  Object.entries(message).forEach(([idx, msg]) => {
50
- const flash = document.createElement("div");
51
- flash.className = `alert alert-${msg[0]} alert-dismissible fade show`;
52
- flash.innerHTML = `${msg[1]}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>`;
53
- document.querySelector("div.flash_messages").appendChild(flash);
54
- });
58
+ const flash = document.createElement("div")
59
+ flash.className = `alert alert-${msg[0]} alert-dismissible fade show`
60
+ flash.innerHTML = `${msg[1]}<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>`
61
+ flashContainer.appendChild(flash)
62
+ })
55
63
  }
56
64
  }
@@ -1,17 +1,18 @@
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 Sleep from "geoblacklight/leaflet/controls/sleep";
10
- import { wmsInspection,
1
+ import { Icon, Control } from "leaflet"
2
+ import { FullScreen } from "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 Sleep from "geoblacklight/leaflet/controls/sleep"
10
+ import {
11
+ wmsInspection,
11
12
  tiledMapLayerInspection,
12
13
  featureLayerInspection,
13
- dynamicMapLayerInspection
14
- } from "geoblacklight/leaflet/inspection";
14
+ dynamicMapLayerInspection,
15
+ } from "geoblacklight/leaflet/inspection"
15
16
  import {
16
17
  esriDynamicMapLayer,
17
18
  esriFeatureLayer,
@@ -20,9 +21,10 @@ import {
20
21
  wmsLayer,
21
22
  wmtsLayer,
22
23
  indexMapLayer,
23
- } from "geoblacklight/leaflet/layers";
24
- import { geoJSONToBounds } from "geoblacklight/leaflet/utils";
25
- import { DEFAULT_BOUNDS, DEFAULT_OPACITY, DEFAULT_GEOM_OVERLAY_OPTIONS } from "geoblacklight/leaflet/constants";
24
+ } from "geoblacklight/leaflet/layers"
25
+ import { geoJSONToBounds } from "geoblacklight/leaflet/utils"
26
+ import { DEFAULT_BOUNDS, DEFAULT_OPACITY, DEFAULT_GEOM_OVERLAY_OPTIONS } from "geoblacklight/leaflet/constants"
27
+ import sidebarControl from "geoblacklight/leaflet/controls/sidebar"
26
28
 
27
29
  export default class LeafletViewerController extends Controller {
28
30
  static values = {
@@ -36,185 +38,188 @@ export default class LeafletViewerController extends Controller {
36
38
  page: String,
37
39
  layerId: String,
38
40
  drawInitialBounds: Boolean,
39
- };
41
+ }
40
42
 
41
43
  connect() {
42
44
  // Use leaflet icon images from CDN
43
- Icon.Default.imagePath = "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/";
45
+ Icon.Default.imagePath = "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/"
44
46
 
45
47
  // Set up layers
46
- this.basemap = this.getBasemap();
47
- this.overlay = layerGroup();
48
+ this.basemap = this.getBasemap()
49
+ this.overlay = layerGroup()
48
50
 
49
51
  // Calculate bounds
50
- this.bounds = DEFAULT_BOUNDS;
51
- if (this.hasMapGeomValue) this.bounds = geoJSONToBounds(this.mapGeomValue);
52
+ this.bounds = DEFAULT_BOUNDS
53
+ if (this.hasMapGeomValue) this.bounds = geoJSONToBounds(this.mapGeomValue)
52
54
 
53
55
  // 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()];
56
+ this.loadMap()
61
57
  }
62
58
 
63
59
  // Create the map, add layers, fit the bounds
64
60
  async loadMap() {
65
- if (this.map) return;
61
+ if (this.map) return
66
62
 
67
63
  // Set up the map and fit to bounds
68
- const sleepSettings = this.optionsValue.SLEEP || { 'SLEEP' : false }
69
- this.map = map(this.element, sleepSettings);
70
- if (sleepSettings.SLEEP) this.map.addHandler('SLEEP', Sleep);
64
+ const sleepSettings = this.optionsValue.sleep || { sleep: false }
65
+ this.map = map(this.element, sleepSettings)
66
+ if (sleepSettings.sleep) this.map.addHandler("SLEEP", Sleep)
71
67
 
72
- this.map.addLayer(this.basemap);
73
- this.map.addLayer(this.overlay);
74
- this.fitBounds(this.bounds);
75
- this.map.options.selected_color = this.optionsValue.SELECTED_COLOR || 'blue';
68
+ this.map.addLayer(this.basemap)
69
+ this.map.addLayer(this.overlay)
70
+ this.fitBounds(this.bounds)
71
+ this.map.options.selected_color = this.optionsValue.selected_color || "blue"
76
72
 
77
73
  // If the data is available, add the preview and set up inspection
78
74
  // Otherwise just draw the bounds, if configured to do so
79
75
  if (this.availableValue && this.protocolValue) {
80
- await this.addPreviewOverlay();
81
- this.addInspection();
76
+ await this.addPreviewOverlay()
77
+ this.addInspection()
82
78
  } else if (this.drawInitialBoundsValue && this.bounds) {
83
- this.addBoundsOverlay(this.bounds);
79
+ this.addBoundsOverlay(this.bounds)
84
80
  }
85
81
 
86
82
  // Add configured controls
87
- this.addControls();
83
+ this.addControls()
88
84
 
89
- if (this.protocolValue == "IndexMap"){
85
+ if (this.protocolValue == "IndexMap") {
90
86
  this.fitBounds(this.previewOverlay.getBounds())
91
87
  }
92
88
 
93
89
  // Enable geosearch handler, if available
94
- if (this.map.geosearch) this.map.geosearch.enable();
90
+ if (this.map.geosearch) this.map.geosearch.enable()
95
91
 
96
92
  // Emit an event for other controllers to listen to
97
- this.dispatch("loaded");
93
+ this.dispatch("loaded")
98
94
  }
99
95
 
100
96
  // Set the bounds of the map to an L.LatLngBounds object
101
97
  fitBounds(bounds) {
102
98
  // prevent map from moving when setting bounds, if relevant
103
- if (this.map.geosearch) this.map.geosearch.disable();
104
- this.map.fitBounds(bounds, { animate: false, noMoveStart: true });
105
- this.bounds = bounds;
106
- if (this.map.geosearch) this.map.geosearch.enable();
107
- this.element.dataset.bounds = this.bounds.toBBoxString();
99
+ if (this.map.geosearch) this.map.geosearch.disable()
100
+ this.map.fitBounds(bounds, { animate: false, noMoveStart: true })
101
+ this.bounds = bounds
102
+ if (this.map.geosearch) this.map.geosearch.enable()
103
+ this.element.dataset.bounds = this.bounds.toBBoxString()
108
104
  }
109
105
 
110
106
  // Select the configured basemap to use
111
107
  getBasemap() {
112
- const basemapName = this.basemapValue || "positron";
108
+ const basemapName = this.basemapValue || "positron"
113
109
  return tileLayer(basemaps[basemapName].url, {
114
110
  ...basemaps[basemapName],
115
- detectRetina: this.optionsValue.LAYERS.DETECT_RETINA || false,
116
- });
111
+ detectRetina: this.optionsValue.layers.detect_retina || false,
112
+ })
117
113
  }
118
114
 
119
115
  // Add the configured controls to the map
120
116
  addControls() {
121
117
  // Add any top-level controls (e.g. geosearch) first
122
- const globalControls = this.optionsValue.CONTROLS || {};
118
+ const globalControls = this.optionsValue.controls || {}
123
119
  Object.entries(globalControls).forEach(([controlName, controlOptions]) => {
124
- const control = this.getControl(controlName, controlOptions);
125
- if (control) this.addControl(control);
126
- });
120
+ const control = this.getControl(controlName, controlOptions)
121
+ if (control) this.addControl(control)
122
+ })
127
123
 
128
124
  // Add opacity and fullscreen controls for all layers
129
125
  if (this.hasProtocolValue) {
130
- if (this.availableValue){
131
- const opacityControl = this.getControl("Opacity");
132
- this.addControl(opacityControl);
126
+ if (this.availableValue) {
127
+ const opacityControl = this.getControl("Opacity")
128
+ this.addControl(opacityControl)
133
129
  }
134
- const fullscreenControl = this.getControl("Fullscreen");
135
- this.addControl(fullscreenControl);
130
+ const fullscreenControl = this.getControl("Fullscreen")
131
+ this.addControl(fullscreenControl)
136
132
  }
137
133
  }
138
134
 
139
135
  // Add a pre-configured L.Control instance to the map
140
136
  addControl(control) {
141
- this.map.addControl(control);
137
+ this.map.addControl(control)
142
138
  }
143
139
 
144
140
  // Look up the control name and return the corresponding L.Control instance
145
141
  getControl(controlName, controlOptions) {
146
- if (controlName == "Opacity")
147
- return new LayerOpacityControl(this.previewOverlay);
148
- if (controlName == "Fullscreen")
149
- return new Control.Fullscreen({ position: "topright", ...controlOptions });
142
+ if (controlName == "Opacity") return new LayerOpacityControl(this.previewOverlay)
143
+ if (controlName == "Fullscreen") return new FullScreen({ position: "bottomleft", ...controlOptions })
150
144
  if (controlName == "Geosearch")
151
- return new GeoSearchControl({ baseUrl: this.catalogBaseUrlValue, ...controlOptions });
152
- console.error(`Unsupported control name: "${controlName}"`);
145
+ return new GeoSearchControl({
146
+ baseUrl: this.catalogBaseUrlValue,
147
+ ...controlOptions,
148
+ })
149
+ console.error(`Unsupported control name: "${controlName}"`)
153
150
  }
154
151
 
155
152
  // Add the bounding box to the map
156
153
  addBoundsOverlay(bounds) {
157
- const hasMapGeomValue = Object.keys(this.mapGeomValue).length > 0 && !this.map.geosearch;
158
- var defaultOptions = hasMapGeomValue ? DEFAULT_GEOM_OVERLAY_OPTIONS : {};
159
- const overlayOptions = this.optionsValue.BOUNDSOVERLAY || {};
160
- const options = {...defaultOptions, ...overlayOptions[this.pageValue]}
161
- const boundsOverlay = polygon([
162
- bounds.getSouthWest(),
163
- bounds.getSouthEast(),
164
- bounds.getNorthEast(),
165
- bounds.getNorthWest(),
166
- ], options
167
- );
168
-
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.bounds_overlay || {}
157
+ const options = { ...defaultOptions, ...overlayOptions[this.pageValue] }
158
+ const boundsOverlay = polygon(
159
+ [bounds.getSouthWest(), bounds.getSouthEast(), bounds.getNorthEast(), bounds.getNorthWest()],
160
+ options,
161
+ )
162
+
169
163
  // Render geometry layer if available
170
- if (hasMapGeomValue) this.map.addLayer(L.geoJSON(this.mapGeomValue, overlayOptions[this.pageValue]));
164
+ if (hasMapGeomValue) this.map.addLayer(L.geoJSON(this.mapGeomValue, overlayOptions[this.pageValue]))
171
165
 
172
166
  // Render the bounds overlay
173
- this.boundsOverlay = boundsOverlay;
174
- this.overlay.addLayer(boundsOverlay);
167
+ this.boundsOverlay = boundsOverlay
168
+ this.overlay.addLayer(boundsOverlay)
175
169
  }
176
170
 
177
171
  // Remove the bounding box overlay
178
172
  removeBoundsOverlay() {
179
- if (this.boundsOverlay) this.overlay.removeLayer(this.boundsOverlay);
173
+ if (this.boundsOverlay) this.overlay.removeLayer(this.boundsOverlay)
174
+ }
175
+
176
+ setUpSidebar() {
177
+ const sidebar = document.querySelector("[data-sidebar]")
178
+ if (!sidebar || sidebar.dataset.sidebar != "true") return
179
+ const control = new sidebarControl({
180
+ position: "topright",
181
+ sidebar,
182
+ })
183
+ this.map.addControl(control)
180
184
  }
181
185
 
182
186
  addInspection() {
183
- if (this.protocolValue == "Wms") return wmsInspection(this.map, this.urlValue, this.layerIdValue, this.previewOverlay);
184
- if (this.protocolValue == "FeatureLayer") return featureLayerInspection(this.map, this.previewOverlay);
185
- if (this.protocolValue == "DynamicMapLayer") return dynamicMapLayerInspection(this.map, this.previewOverlay, this.layerIdValue)
187
+ const inspectionProtocols = ["Wms", "FeatureLayer", "DynamicMapLayer", "IndexMap"]
188
+ if (!inspectionProtocols.includes(this.protocolValue)) return
189
+ this.setUpSidebar()
190
+ if (this.protocolValue == "Wms")
191
+ return wmsInspection(this.map, this.urlValue, this.layerIdValue, this.previewOverlay)
192
+ if (this.protocolValue == "FeatureLayer") return featureLayerInspection(this.map, this.previewOverlay)
193
+ if (this.protocolValue == "DynamicMapLayer")
194
+ return dynamicMapLayerInspection(this.map, this.previewOverlay, this.layerIdValue)
186
195
  // TODO: TiledMapLayer is converted but seems busted -- see layers.js. Don't know what to test it with, need a fixture.
187
196
  // if (this.protocolValue == "TiledMapLayer") return tiledMapLayerInspection(this.map, this.previewOverlay);
188
197
  }
189
198
 
190
199
  // Add the actual data to the map as a layer
191
200
  async addPreviewOverlay() {
192
- this.previewOverlay = await this.getPreviewOverlay(
193
- this.protocolValue,
194
- this.urlValue,
195
- {
196
- layerId: this.layerIdValue,
197
- opacity: this.optionsValue.opacity || DEFAULT_OPACITY,
198
- detectRetina: this.optionsValue.LAYERS.DETECT_RETINA || false,
199
- }
200
- );
201
- if (this.previewOverlay) this.overlay.addLayer(this.previewOverlay);
201
+ this.previewOverlay = await this.getPreviewOverlay(this.protocolValue, this.urlValue, {
202
+ layerId: this.layerIdValue,
203
+ opacity: this.optionsValue.opacity || DEFAULT_OPACITY,
204
+ detectRetina: this.optionsValue.layers.detect_retina || false,
205
+ })
206
+ if (this.previewOverlay) this.overlay.addLayer(this.previewOverlay)
202
207
  }
203
208
 
204
209
  // Generate a layer based on the protocol
205
210
  async getPreviewOverlay(protocol, url, options) {
206
- if (protocol == "DynamicMapLayer") return esriDynamicMapLayer(url, options);
207
- if (protocol == "FeatureLayer") return esriFeatureLayer(url, options);
211
+ if (protocol == "DynamicMapLayer") return esriDynamicMapLayer(url, options)
212
+ if (protocol == "FeatureLayer") return esriFeatureLayer(url, options)
208
213
  // imageMapLayer is a built-in method from esri-leaflet
209
- if (protocol == "ImageMapLayer") return imageMapLayer({url, ...options});
210
- if (protocol == "IndexMap") return await indexMapLayer(url, this.optionsValue);
211
- if (protocol == "TiledMapLayer") return await esriTiledMapLayer(url, options);
212
- if (protocol == "Tilejson") return await tileJsonLayer(url, options);
214
+ if (protocol == "ImageMapLayer") return imageMapLayer({ url, ...options })
215
+ if (protocol == "IndexMap") return await indexMapLayer(url, this.optionsValue)
216
+ if (protocol == "TiledMapLayer") return await esriTiledMapLayer(url, options)
217
+ if (protocol == "Tilejson") return await tileJsonLayer(url, options)
213
218
  // tileLayer is a built-in method from leaflet
214
- if (protocol == "Tms") return tileLayer(url, { tms: true, ...options });
215
- if (protocol == "Wms") return wmsLayer(url, options);
216
- if (protocol == "Wmts") return await wmtsLayer(url, options);
217
- if (protocol == "Xyz") return tileLayer(url, options);
218
- console.error(`Unsupported protocol name: "${protocol}"`);
219
+ if (protocol == "Tms") return tileLayer(url, { tms: true, ...options })
220
+ if (protocol == "Wms") return wmsLayer(url, options)
221
+ if (protocol == "Wmts") return await wmtsLayer(url, options)
222
+ if (protocol == "Xyz") return tileLayer(url, options)
223
+ console.error(`Unsupported protocol name: "${protocol}"`)
219
224
  }
220
225
  }
@@ -1,18 +1,18 @@
1
- import { Controller } from "@hotwired/stimulus";
1
+ import { Controller } from "@hotwired/stimulus"
2
2
 
3
3
  export default class OembedViewerController extends Controller {
4
4
  static values = {
5
5
  url: String,
6
- };
6
+ }
7
7
 
8
8
  connect() {
9
9
  fetch(this.urlValue)
10
10
  .then((response) => response.json())
11
11
  .then((data) => {
12
- if (data) this.element.innerHTML = data.html;
12
+ if (data) this.element.innerHTML = data.html
13
13
  })
14
14
  .catch((error) => {
15
- console.error("Error loading oEmbed data:", error);
16
- });
15
+ console.error("Error loading oEmbed data:", error)
16
+ })
17
17
  }
18
18
  }
@@ -1,12 +1,12 @@
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
- import { pmTilesInspection } from "geoblacklight/openlayers/inspection";
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
+ import { pmTilesInspection } from "geoblacklight/openlayers/inspection"
10
10
 
11
11
  export default class OpenlayersViewerController extends Controller {
12
12
  static values = {
@@ -14,16 +14,16 @@ export default class OpenlayersViewerController extends Controller {
14
14
  protocol: String,
15
15
  basemap: String,
16
16
  mapGeom: String,
17
- };
17
+ }
18
18
 
19
19
  async connect() {
20
20
  // Set up layers
21
- this.basemap = this.getBasemap();
22
- this.overlay = this.getPreviewOverlay(this.protocolValue, this.urlValue);
21
+ this.basemap = this.getBasemap()
22
+ this.overlay = this.getPreviewOverlay(this.protocolValue, this.urlValue)
23
23
 
24
- await this.getBounds();
24
+ await this.getBounds()
25
25
  // Load the map
26
- this.loadMap();
26
+ this.loadMap()
27
27
  }
28
28
 
29
29
  // Create the map, add layers, and fit the bounds
@@ -32,38 +32,35 @@ export default class OpenlayersViewerController extends Controller {
32
32
  target: this.element,
33
33
  controls: defaultControls().extend([new FullScreen()]),
34
34
  layers: [this.basemap, this.overlay],
35
- });
36
- this.map.getView().fit(this.extent, this.map.getSize());
35
+ })
36
+ this.map.getView().fit(this.extent, this.map.getSize())
37
37
  this.addInspection()
38
38
  }
39
39
 
40
40
  addInspection() {
41
- if (this.protocolValue == "Pmtiles") return pmTilesInspection(this.map);
41
+ if (this.protocolValue == "Pmtiles") return pmTilesInspection(this.map)
42
42
  }
43
43
 
44
44
  async getBounds() {
45
- if (this.protocolValue == 'Cog') {
46
- const view = await this.overlay.getSource().getView();
47
- this.extent = view.extent;
45
+ if (this.protocolValue == "Cog") {
46
+ const view = await this.overlay.getSource().getView()
47
+ this.extent = view.extent
48
48
  } else {
49
- this.extent = new GeoJSON()
50
- .readFeatures(this.mapGeomValue)[0]
51
- .getGeometry()
52
- .getExtent();
49
+ this.extent = new GeoJSON().readFeatures(this.mapGeomValue)[0].getGeometry().getExtent()
53
50
  }
54
51
  }
55
52
 
56
53
  // Select the configured basemap to use
57
54
  getBasemap() {
58
- const basemap = basemaps[this.basemapValue || "positron"];
59
- const layer = new TileLayer({ source: new XYZ(basemap) });
60
- return layer;
55
+ const basemap = basemaps[this.basemapValue || "positron"]
56
+ const layer = new TileLayer({ source: new XYZ(basemap) })
57
+ return layer
61
58
  }
62
59
 
63
60
  // Generate a layer based on the protocol
64
61
  getPreviewOverlay(protocol, url) {
65
- if (protocol === "Pmtiles") return pmTilesLayer(url);
66
- if (protocol === "Cog") return cogLayer(url);
67
- console.error(`Unsupported protocol name: "${protocol}"`);
62
+ if (protocol === "Pmtiles") return pmTilesLayer(url)
63
+ if (protocol === "Cog") return cogLayer(url)
64
+ console.error(`Unsupported protocol name: "${protocol}"`)
68
65
  }
69
66
  }
@@ -1,50 +1,50 @@
1
- import { Controller } from "@hotwired/stimulus";
2
- import { geoJSONToBounds } from "geoblacklight/leaflet/utils";
3
- import { DEFAULT_BOUNDS } from "geoblacklight/leaflet/constants";
1
+ import { Controller } from "@hotwired/stimulus"
2
+ import { geoJSONToBounds } from "geoblacklight/leaflet/utils"
3
+ import { DEFAULT_BOUNDS } from "geoblacklight/leaflet/constants"
4
4
 
5
5
  export default class SearchResultsController extends Controller {
6
- static targets = ["result"];
7
- static outlets = ["leaflet-viewer"];
6
+ static targets = ["result"]
7
+ static outlets = ["leaflet-viewer"]
8
8
 
9
9
  // Fit the map to the combined bounding box of all search results
10
10
  // If a bounding box query is already active, do not override it
11
11
  fitResultBounds() {
12
- if (new URL(window.location).searchParams.get("bbox")) return;
13
- this.leafletViewerOutlet.fitBounds(this.getMaximalBounds());
12
+ if (new URL(window.location).searchParams.get("bbox")) return
13
+ this.leafletViewerOutlet.fitBounds(this.getMaximalBounds())
14
14
  }
15
15
 
16
16
  // Get the bounding box of a search result from its data attributes
17
17
  getResultBounds(resultElement) {
18
- const geomElement = resultElement.querySelector("[data-geom]");
18
+ const geomElement = resultElement.querySelector("[data-geom]")
19
19
  if (geomElement && geomElement.dataset.geom) {
20
- return geoJSONToBounds(JSON.parse(geomElement.dataset.geom));
20
+ return geoJSONToBounds(JSON.parse(geomElement.dataset.geom))
21
21
  }
22
22
  }
23
23
 
24
24
  // Find the combined bounding box of all search results
25
25
  getMaximalBounds() {
26
- const bounds = this.resultTargets.map(this.getResultBounds);
27
- const nonNullBounds = bounds.filter((b) => b);
26
+ const bounds = this.resultTargets.map(this.getResultBounds)
27
+ const nonNullBounds = bounds.filter((b) => b)
28
28
 
29
29
  if (nonNullBounds.length > 0) {
30
- return nonNullBounds.reduce((max, b) => max.extend(b));
30
+ return nonNullBounds.reduce((max, b) => max.extend(b))
31
31
  }
32
32
 
33
- return DEFAULT_BOUNDS;
33
+ return DEFAULT_BOUNDS
34
34
  }
35
35
 
36
36
  // Preview the selected search result's bounding box on the map
37
37
  previewResultOnMap(event) {
38
- const geomElement = event.target.querySelector("[data-geom]");
38
+ const geomElement = event.target.querySelector("[data-geom]")
39
39
  if (geomElement && geomElement.dataset.geom !== "") {
40
- const geom = JSON.parse(geomElement.dataset.geom);
41
- const bbox = geoJSONToBounds(geom);
42
- this.leafletViewerOutlet.addBoundsOverlay(bbox);
40
+ const geom = JSON.parse(geomElement.dataset.geom)
41
+ const bbox = geoJSONToBounds(geom)
42
+ this.leafletViewerOutlet.addBoundsOverlay(bbox)
43
43
  }
44
44
  }
45
45
 
46
46
  // Remove the previewed bounding box
47
47
  clearPreview() {
48
- this.leafletViewerOutlet.removeBoundsOverlay();
48
+ this.leafletViewerOutlet.removeBoundsOverlay()
49
49
  }
50
50
  }