geoblacklight 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/geoblacklight/geoblacklight.js +5 -58
  3. data/app/assets/javascripts/geoblacklight/modules.js +1 -0
  4. data/app/assets/javascripts/geoblacklight/modules/home.js +3 -2
  5. data/app/assets/javascripts/geoblacklight/modules/item.js +10 -73
  6. data/app/assets/javascripts/geoblacklight/modules/results.js +25 -28
  7. data/app/assets/javascripts/geoblacklight/viewers.js +1 -0
  8. data/app/assets/javascripts/geoblacklight/viewers/iiif.js +25 -0
  9. data/app/assets/javascripts/geoblacklight/viewers/map.js +54 -0
  10. data/app/assets/javascripts/geoblacklight/viewers/viewer.js +14 -0
  11. data/app/assets/javascripts/geoblacklight/viewers/wms.js +73 -0
  12. data/app/assets/stylesheets/geoblacklight/modules/item.css.scss +1 -1
  13. data/app/helpers/geoblacklight_helper.rb +0 -11
  14. data/app/views/catalog/_abstract_metadata.html.erb +8 -0
  15. data/app/views/catalog/_show_default.html.erb +2 -2
  16. data/app/views/catalog/_show_sidebar.html.erb +8 -6
  17. data/app/views/catalog/_upper_metadata.html.erb +11 -10
  18. data/geoblacklight.gemspec +3 -3
  19. data/lib/generators/geoblacklight/templates/geoblacklight.js +3 -1
  20. data/lib/geoblacklight.rb +1 -0
  21. data/lib/geoblacklight/item_viewer.rb +29 -0
  22. data/lib/geoblacklight/references.rb +2 -0
  23. data/lib/geoblacklight/solr_document.rb +7 -1
  24. data/lib/geoblacklight/version.rb +1 -1
  25. data/spec/features/download_layer_spec.rb +1 -1
  26. data/spec/lib/geoblacklight/item_viewer_spec.rb +40 -0
  27. data/spec/lib/geoblacklight/references_spec.rb +26 -0
  28. data/spec/lib/geoblacklight/solr_document_spec.rb +57 -0
  29. data/vendor/assets/javascripts/leaflet-iiif.js +152 -0
  30. data/vendor/assets/javascripts/readmore.min.js +7 -0
  31. metadata +22 -7
  32. data/app/assets/javascripts/geoblacklight/application.js +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 767308fdd3b12467270a409a98f4732062c57878
4
- data.tar.gz: b822a8bc6294c81601963a4db3e7fbeef4434b09
3
+ metadata.gz: 2569474d1cd7946363ce5ba8be7d783145007c9f
4
+ data.tar.gz: dfb2e56fe8bc2302698a2192fd7a7bedac2c442d
5
5
  SHA512:
6
- metadata.gz: a1cc828205ad3c72548ad044d20522e306e01461552beea0b02fdd9313717b03fe724fc933ee808d6fe906bbe44c89f0b83967e697679911379d9b2e77d54b13
7
- data.tar.gz: 27812b3d5d30157ab0c9e2a0e273d5dd5abe111503325edadae9fbc19a5a4d5706a473ad317e4501d5234969b490c3dad00691694177fc8a4745bd880db5aedb
6
+ metadata.gz: 5093d1b9eda7a53ef3b64c5a22f2bf02bdde068e904234471d4c5a2c68c23c934f743d827ac304ff340a8b46a0a6a759b5b6bffcd440ed1def990b6758b1ec13
7
+ data.tar.gz: 02d642f50886e7b86dd96999840f58ba91f787f217403f15e79baf4585b15d3788ccf3b79b30f7509a4673e08beed001d32e3f88ef540c2b4ee2e18fb9b6a80d
@@ -1,3 +1,8 @@
1
+ //= require leaflet
2
+ //= require leaflet-iiif
3
+ //= require native.history
4
+ //= require readmore.min
5
+
1
6
  !function(global) {
2
7
  'use strict';
3
8
 
@@ -16,7 +21,6 @@
16
21
  };
17
22
 
18
23
  var GeoBlacklight = L.Class.extend({
19
-
20
24
  statics: {
21
25
  __version__: '0.0.1',
22
26
 
@@ -30,64 +34,7 @@
30
34
  }, delay);
31
35
  };
32
36
  }
33
- },
34
-
35
- options: {
36
- /**
37
- * Initial bounds of map
38
- * @type {L.LatLngBounds}
39
- */
40
- bbox: [[-85, -180], [85, 180]]
41
- },
42
-
43
- initialize: function(el, options) {
44
- var data = $(el).data(),
45
- basemap, map;
46
-
47
- L.Util.setOptions(this, options);
48
-
49
- basemap = L.tileLayer(
50
- 'https://otile{s}-s.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png', {
51
- attribution: '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, Tiles Courtesy of <a href="http://www.mapquest.com/" target="_blank">MapQuest</a> <img src="//developer.mapquest.com/content/osm/mq_logo.png">',
52
- maxZoom: 18,
53
- worldCopyJump: true,
54
- subdomains: '1234' // see http://developer.mapquest.com/web/products/open/map
55
- }
56
- );
57
-
58
- this.overlay = L.layerGroup();
59
-
60
- map = L.map(el);
61
- this.map = map;
62
- map.addLayer(basemap);
63
- map.addLayer(this.overlay);
64
-
65
- map.fitBounds(this.options.bbox);
66
-
67
- },
68
-
69
- /**
70
- * Add a bounding box overlay to map.
71
- * @param {L.LatLngBounds} bounds Leaflet LatLngBounds
72
- */
73
- addBoundsOverlay: function(bounds) {
74
- if (bounds instanceof L.LatLngBounds) {
75
- this.overlay.addLayer(L.polygon([
76
- bounds.getSouthWest(),
77
- bounds.getSouthEast(),
78
- bounds.getNorthEast(),
79
- bounds.getNorthWest()
80
- ]));
81
- }
82
- },
83
-
84
- /**
85
- * Remove bounding box overlay from map.
86
- */
87
- removeBoundsOverlay: function() {
88
- this.overlay.clearLayers();
89
37
  }
90
-
91
38
  });
92
39
 
93
40
  global.GeoBlacklight = GeoBlacklight;
@@ -0,0 +1 @@
1
+ //= require_tree ./modules
@@ -1,6 +1,7 @@
1
- Blacklight.onLoad(function () {
1
+ Blacklight.onLoad(function() {
2
2
  $('[data-map="home"]').each(function(i, element) {
3
- var geoblacklight = new GeoBlacklight(this),
3
+
4
+ var geoblacklight = new GeoBlacklight.Viewer.Map(this),
4
5
  data = $(this).data();
5
6
  geoblacklight.map.addControl(L.control.geosearch({
6
7
  baseUrl: data.catalogPath,
@@ -1,79 +1,16 @@
1
1
  Blacklight.onLoad(function() {
2
2
  $('[data-map="item"]').each(function(i, element) {
3
- var bbox = L.bboxToBounds($(this).data().mapBbox);
4
- new GeoBlacklight.Item(element, { bbox: bbox });
5
- });
6
- });
7
-
8
- GeoBlacklight.Item = GeoBlacklight.extend({
9
-
10
- initialize: function(element, options) {
11
- GeoBlacklight.prototype.initialize.call(this, element, options);
12
- this.dataAttributes = $(element).data();
13
- this.layer = new L.layerGroup().addTo(this.map);
14
- if (this.dataAttributes.available && this.dataAttributes.wmsUrl !== null) {
15
- this.addPreviewLayer();
16
- this.addOpacityControl();
17
- } else {
18
- this.addBoundsOverlay(L.bboxToBounds(this.dataAttributes.mapBbox));
19
- }
20
- },
21
3
 
22
- addPreviewLayer: function() {
23
- var _this = this;
24
- _this.wmsLayer = L.tileLayer.wms(_this.dataAttributes.wmsUrl, {
25
- layers: _this.dataAttributes.layerId,
26
- format: 'image/png',
27
- transparent: true,
28
- tiled: true,
29
- CRS: 'EPSG:900913',
30
- opacity: 0.75
31
- });
32
- _this.layer.addLayer(_this.wmsLayer);
33
- _this.setupInspection();
34
- },
4
+ // get viewer module from protocol value and capitalize to match class name
5
+ var viewerName = $(element).data().protocol,
6
+ viewer;
7
+ viewerName = viewerName.charAt(0).toUpperCase() + viewerName.substring(1);
35
8
 
36
- addOpacityControl: function() {
37
- var _this = this;
38
- _this.map.addControl(new L.Control.LayerOpacity(_this.layer));
39
- },
40
-
41
- setupInspection: function() {
42
- var _this = this;
43
- _this.map.on('click', function(e) {
44
- spinner = '<span id="attribute-table"><i class="fa fa-spinner fa-spin fa-3x fa-align-center"></i></span>';
45
- $('#attribute-table').replaceWith(spinner);
46
- var wmsoptions = {
47
- URL: _this.dataAttributes.wmsUrl,
48
- LAYERS: _this.dataAttributes.layerId,
49
- BBOX: _this.map.getBounds().toBBoxString(),
50
- WIDTH: $('#map').width(),
51
- HEIGHT: $('#map').height(),
52
- QUERY_LAYERS: _this.dataAttributes.layerId,
53
- X: Math.round(e.containerPoint.x),
54
- Y: Math.round(e.containerPoint.y)
55
- };
56
-
57
- $.ajax({
58
- type: 'POST',
59
- url: '/wms/handle',
60
- data: wmsoptions,
61
- success: function(data) {
62
- if (data.hasOwnProperty('error')) {
63
- $('#attribute-table').html('Could not find that feature');
64
- return;
65
- }
66
- var t = $('<table id="attribute-table" class="table table-hover table-condensed table-responsive table-striped table-bordered"><thead><tr><th>Attribute</th><th>Value</th></tr></thead><tbody>');
67
- $.each(data.values, function(i,val) {
68
- t.append('<tr><td>' + val[0] + '</td><td>' + val[1] + '</tr>');
69
- });
70
- $('#attribute-table').replaceWith(t);
71
- },
72
- fail: function(error) {
73
- console.log(error);
74
- }
75
- });
76
- });
77
- }
9
+ // get new viewer instance and pass in element
10
+ viewer = new window['GeoBlacklight']['Viewer'][viewerName](element);
11
+ });
78
12
 
13
+ $('.truncate-abstract').readmore({
14
+ maxHeight: 60
15
+ });
79
16
  });
@@ -10,14 +10,14 @@ Blacklight.onLoad(function() {
10
10
 
11
11
  $('[data-map="index"]').each(function() {
12
12
  var data = $(this).data(),
13
- opts = { baseUrl: data.catalogPath },
14
- geoblacklight, bbox;
13
+ opts = { baseUrl: data.catalogPath },
14
+ geoblacklight, bbox;
15
15
 
16
- if (typeof data.mapBbox === "string") {
16
+ if (typeof data.mapBbox === 'string') {
17
17
  bbox = L.bboxToBounds(data.mapBbox);
18
18
  } else {
19
19
  $('.document [data-bbox]').each(function() {
20
- if (typeof bbox === "undefined") {
20
+ if (typeof bbox === 'undefined') {
21
21
  bbox = L.bboxToBounds($(this).data().bbox);
22
22
  } else {
23
23
  bbox.extend(L.bboxToBounds($(this).data().bbox));
@@ -34,39 +34,36 @@ Blacklight.onLoad(function() {
34
34
  });
35
35
  }
36
36
 
37
- geoblacklight = new GeoBlacklight(this, { bbox: bbox }).setHoverListeners();
37
+ // instantiate new map
38
+ geoblacklight = new GeoBlacklight.Viewer.Map(this, { bbox: bbox });
39
+
40
+ // set hover listeners on map
41
+ $('#content')
42
+ .on('mouseenter', '#documents [data-layer-id]', function() {
43
+ var bounds = L.bboxToBounds($(this).data('bbox'));
44
+ geoblacklight.addBoundsOverlay(bounds);
45
+ })
46
+ .on('mouseleave', '#documents [data-layer-id]', function() {
47
+ geoblacklight.removeBoundsOverlay();
48
+ });
49
+
50
+ // add geosearch control to map
38
51
  geoblacklight.map.addControl(L.control.geosearch(opts));
39
52
  });
40
53
 
41
54
  function updatePage(url) {
42
55
  $.get(url).done(function(data) {
43
56
  var resp = $.parseHTML(data);
44
- $doc = $(resp);
45
- $("#documents").replaceWith($doc.find("#documents"));
46
- $("#sidebar").replaceWith($doc.find("#sidebar"));
47
- $("#sortAndPerPage").replaceWith($doc.find("#sortAndPerPage"));
48
- if ($("#map").next().length) {
49
- $("#map").next().replaceWith($doc.find("#map").next());
57
+ $doc = $(resp);
58
+ $('#documents').replaceWith($doc.find('#documents'));
59
+ $('#sidebar').replaceWith($doc.find('#sidebar'));
60
+ $('#sortAndPerPage').replaceWith($doc.find('#sortAndPerPage'));
61
+ if ($('#map').next().length) {
62
+ $('#map').next().replaceWith($doc.find('#map').next());
50
63
  } else {
51
- $("#map").after($doc.find("#map").next());
64
+ $('#map').after($doc.find('#map').next());
52
65
  }
53
66
  });
54
67
  }
55
68
 
56
69
  });
57
-
58
- GeoBlacklight.prototype.setHoverListeners = function() {
59
- var _this = this;
60
-
61
- $("#content")
62
- .on("mouseenter", "#documents [data-layer-id]", function() {
63
- var bounds = L.bboxToBounds($(this).data('bbox'));
64
- _this.addBoundsOverlay(bounds);
65
- })
66
- .on("mouseleave", "#documents [data-layer-id]", function() {
67
- _this.removeBoundsOverlay();
68
- });
69
-
70
- return this;
71
-
72
- };
@@ -0,0 +1 @@
1
+ //= require_tree ./viewers
@@ -0,0 +1,25 @@
1
+ //= require geoblacklight/viewers/viewer
2
+
3
+ GeoBlacklight.Viewer.Iiif = GeoBlacklight.Viewer.extend({
4
+ load: function() {
5
+ this.adjustLayout();
6
+
7
+ this.map = L.map(this.element, {
8
+ center: [0, 0],
9
+ crs: L.CRS.Simple,
10
+ zoom: 0
11
+ });
12
+
13
+ this.iiifLayer = L.tileLayer.iiif(this.data.url)
14
+ .addTo(this.map);
15
+ },
16
+
17
+ adjustLayout: function() {
18
+
19
+ // hide attribute table
20
+ $('#table-container').hide();
21
+
22
+ // expand viewer element
23
+ $(this.element).parent().attr('class', 'col-md-12');
24
+ }
25
+ });
@@ -0,0 +1,54 @@
1
+ //= require geoblacklight/viewers/viewer
2
+
3
+ GeoBlacklight.Viewer.Map = GeoBlacklight.Viewer.extend({
4
+
5
+ options: {
6
+ /**
7
+ * Initial bounds of map
8
+ * @type {L.LatLngBounds}
9
+ */
10
+ bbox: [[-85, -180], [85, 180]]
11
+ },
12
+
13
+ basemap: L.tileLayer(
14
+ 'https://otile{s}-s.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png', {
15
+ attribution: '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, Tiles Courtesy of <a href="http://www.mapquest.com/" target="_blank">MapQuest</a> <img src="//developer.mapquest.com/content/osm/mq_logo.png">',
16
+ maxZoom: 18,
17
+ worldCopyJump: true,
18
+ subdomains: '1234' // see http://developer.mapquest.com/web/products/open/map
19
+ }
20
+ ),
21
+
22
+ overlay: L.layerGroup(),
23
+
24
+ load: function() {
25
+ this.map = L.map(this.element).fitBounds(this.options.bbox);
26
+ this.map.addLayer(this.basemap);
27
+ this.map.addLayer(this.overlay);
28
+ if (this.data.map !== 'index') {
29
+ this.addBoundsOverlay(this.options.bbox);
30
+ }
31
+ },
32
+
33
+ /**
34
+ * Add a bounding box overlay to map.
35
+ * @param {L.LatLngBounds} bounds Leaflet LatLngBounds
36
+ */
37
+ addBoundsOverlay: function(bounds) {
38
+ if (bounds instanceof L.LatLngBounds) {
39
+ this.overlay.addLayer(L.polygon([
40
+ bounds.getSouthWest(),
41
+ bounds.getSouthEast(),
42
+ bounds.getNorthEast(),
43
+ bounds.getNorthWest()
44
+ ]));
45
+ }
46
+ },
47
+
48
+ /**
49
+ * Remove bounding box overlay from map.
50
+ */
51
+ removeBoundsOverlay: function() {
52
+ this.overlay.clearLayers();
53
+ }
54
+ });
@@ -0,0 +1,14 @@
1
+ // base viewer
2
+ GeoBlacklight.Viewer = L.Class.extend({
3
+ options: {},
4
+
5
+ initialize: function(el, options) {
6
+ this.element = el;
7
+ this.data = $(el).data();
8
+
9
+ L.Util.setOptions(this, options);
10
+
11
+ // trigger viewer load function
12
+ this.load();
13
+ }
14
+ });
@@ -0,0 +1,73 @@
1
+ //= require geoblacklight/viewers/map
2
+
3
+ GeoBlacklight.Viewer.Wms = GeoBlacklight.Viewer.Map.extend({
4
+
5
+ load: function() {
6
+ this.options.bbox = L.bboxToBounds(this.data.mapBbox);
7
+ this.map = L.map(this.element).fitBounds(this.options.bbox);
8
+ this.map.addLayer(this.basemap);
9
+ this.map.addLayer(this.overlay);
10
+
11
+ if (this.data.available) {
12
+ this.addPreviewLayer();
13
+ this.addOpacityControl();
14
+ } else {
15
+ this.addBoundsOverlay(this.options.bbox);
16
+ }
17
+ },
18
+
19
+ addPreviewLayer: function() {
20
+ var wmsLayer = L.tileLayer.wms(this.data.url, {
21
+ layers: this.data.layerId,
22
+ format: 'image/png',
23
+ transparent: true,
24
+ tiled: true,
25
+ CRS: 'EPSG:900913',
26
+ opacity: 0.75
27
+ });
28
+ this.overlay.addLayer(wmsLayer);
29
+ this.setupInspection();
30
+ },
31
+
32
+ addOpacityControl: function() {
33
+ this.map.addControl(new L.Control.LayerOpacity(this.overlay));
34
+ },
35
+
36
+ setupInspection: function() {
37
+ var _this = this;
38
+ this.map.on('click', function(e) {
39
+ spinner = '<span id="attribute-table"><i class="fa fa-spinner fa-spin fa-3x fa-align-center"></i></span>';
40
+ $('#attribute-table').replaceWith(spinner);
41
+ var wmsoptions = {
42
+ URL: _this.data.url,
43
+ LAYERS: _this.data.layerId,
44
+ BBOX: _this.map.getBounds().toBBoxString(),
45
+ WIDTH: $('#map').width(),
46
+ HEIGHT: $('#map').height(),
47
+ QUERY_LAYERS: _this.data.layerId,
48
+ X: Math.round(e.containerPoint.x),
49
+ Y: Math.round(e.containerPoint.y)
50
+ };
51
+
52
+ $.ajax({
53
+ type: 'POST',
54
+ url: '/wms/handle',
55
+ data: wmsoptions,
56
+ success: function(data) {
57
+ if (data.hasOwnProperty('error')) {
58
+ $('#attribute-table').html('Could not find that feature');
59
+ return;
60
+ }
61
+ var t = $('<table id="attribute-table" class="table table-hover table-condensed table-responsive table-striped table-bordered"><thead><tr><th>Attribute</th><th>Value</th></tr></thead><tbody>');
62
+ $.each(data.values, function(i, val) {
63
+ t.append('<tr><td>' + val[0] + '</td><td>' + val[1] + '</tr>');
64
+ });
65
+ $('#attribute-table').replaceWith(t);
66
+ },
67
+ fail: function(error) {
68
+ console.log(error);
69
+ }
70
+ });
71
+ });
72
+ }
73
+ });
@@ -2,7 +2,7 @@
2
2
  height: 440px;
3
3
  }
4
4
 
5
- [data-map="item"][data-available="true"] {
5
+ [data-viewer="wms"][data-available="true"] {
6
6
  cursor: crosshair;
7
7
  }
8
8
 
@@ -24,17 +24,6 @@ module GeoblacklightHelper
24
24
  document_available? && @document.downloadable?
25
25
  end
26
26
 
27
- def abstract_truncator(abstract)
28
- if (abstract)
29
- if (abstract.length > 150)
30
- html = abstract.slice(0,150) + content_tag(:span, ("..." + link_to("more", "#", :id =>"more-abstract", :data => {no_turbolink: true})).html_safe, :id => "abstract-trunc") + content_tag(:span, abstract.slice(150,abstract.length), :id => "abstract-full", :class => "hidden")
31
- else
32
- html = abstract
33
- end
34
- content_tag(:span, html.html_safe)
35
- end
36
- end
37
-
38
27
  def snippit(text)
39
28
  if (text)
40
29
  if (text.length > 150)
@@ -0,0 +1,8 @@
1
+ <% if @document['dc_description_s'].present? %>
2
+ <dt>Abstract</dt>
3
+ <dd itemprop="description">
4
+ <div class='truncate-abstract'>
5
+ <%= @document['dc_description_s'] %>
6
+ </div>
7
+ </dd>
8
+ <% end %>
@@ -3,8 +3,8 @@
3
3
  <%= render 'upper_metadata', locals: { document: document} %>
4
4
 
5
5
  <div class='row'>
6
- <div class="col-md-8">
7
- <%= content_tag :div, id: 'map', data: { map: 'item', 'catalog-path'=> catalog_index_path , 'map-bbox' => document[:solr_bbox], 'layer-id' => document[:layer_id_s], 'wms-url' => document.wms_url, available: document_available? } do %>
6
+ <div id='viewer-container' class="col-md-8">
7
+ <%= content_tag :div, id: 'map', data: { map: 'item', protocol: document.viewer_protocol, url: document.viewer_endpoint, 'layer-id' => document[:layer_id_s], 'map-bbox' => document[:solr_bbox], 'catalog-path'=> catalog_index_path, available: document_available? } do %>
8
8
  <% end %>
9
9
  </div>
10
10
  <div id='table-container' class='col-md-4'><div id='attribute-table' ></div></div>
@@ -36,12 +36,14 @@
36
36
  <%= link_to("Download #{@document[:dc_format_s]}", document.direct_download[:download], 'contentUrl' => document.direct_download[:download]) %>
37
37
  </li>
38
38
  <% end %>
39
- <li role="presentation" class="dropdown-header">Projected</li>
40
- <% document.download_types.each do |type| %>
41
- <%= content_tag(:li) do %>
42
- <% link_to("Download #{type[0].capitalize}", '', data: { download_path: "#{download_path(document[:layer_slug_s], type: type[0])}" }) %>
43
- <% end %>
44
- <% end %>
39
+ <% if document.download_types.present? %>
40
+ <li role="presentation" class="dropdown-header">Generated</li>
41
+ <% document.download_types.each do |type| %>
42
+ <%= content_tag(:li) do %>
43
+ <% link_to("Download #{type[0].capitalize}", '', data: { download_path: "#{download_path(document[:layer_slug_s], type: type[0])}" }) %>
44
+ <% end %>
45
+ <% end %>
46
+ <% end %>
45
47
  </ul>
46
48
  </div>
47
49
  <% elsif document.restricted? && document.same_institution? %>
@@ -2,26 +2,23 @@
2
2
  <div class="geoblacklight-view-panel">
3
3
 
4
4
  <dl class="dl-horizontal">
5
+ <% unless document['dct_provenance_s'].nil? %>
6
+ <dt>Institution</dt>
7
+ <dd><%= document['dct_provenance_s'] %></dd>
8
+ <% end %>
5
9
  <% unless document['dc_creator_sm'].nil? %>
6
10
  <dt>Author</dt>
7
11
  <dd itemprop="author"><%= document['dc_creator_sm'].join(', ') %>&nbsp;</dd>
8
- <% end %>
12
+ <% end %>
9
13
  <% unless document['dc_publisher_s'].nil? %>
10
14
  <dt>Publisher</dt>
11
15
  <dd itemprop="publisher"><%= document['dc_publisher_s'] %>&nbsp;</dd>
12
- <% end %>
13
- <dt>Year</dt>
14
- <dd itemprop="dateCreated"><%= document['solr_year_i'] %>&nbsp;</dd>
15
- <dt>Abstract</dt>
16
- <dd id="" itemprop="description"><%= abstract_truncator(document['dc_description_s']) %>&nbsp;</dd>
16
+ <% end %>
17
+ <%= render 'abstract_metadata' %>
17
18
  <% unless document['dct_isPartOf_sm'].nil? %>
18
19
  <dt>Collection</dt>
19
20
  <dd itemprop="isPartOf"><%= document['dct_isPartOf_sm'].sort.uniq.join(', ') %>&nbsp;</dd>
20
21
  <% end %>
21
- <% if document['dct_provenance_s'] == 'Stanford' and not document['dc_identifier_s'].nil? %>
22
- <dt>Citation</dt>
23
- <dd itemprop="url"><%= link_to document['dc_identifier_s'], document['dc_identifier_s'] %>&nbsp;</dd>
24
- <% end %>
25
22
  <% unless document['dct_spatial_sm'].nil? %>
26
23
  <dt>Places</dt>
27
24
  <dd itemprop="spatial"><%= render_facet_links('dct_spatial_sm', document['dct_spatial_sm']) %>&nbsp;</dd>
@@ -34,5 +31,9 @@
34
31
  <dt>Years</dt>
35
32
  <dd itemprop="temporal"><%= document['dct_temporal_sm'].sort.uniq.join(', ') %>&nbsp;</dd>
36
33
  <% end %>
34
+ <% if !@document.references.nil? && !@document.references.url.nil? %>
35
+ <dt>More details at</dt>
36
+ <dd itemprop="url"><%= link_to @document.references.url.endpoint %></dd>
37
+ <% end %>
37
38
  </dl>
38
39
  </div>
@@ -6,10 +6,10 @@ require 'geoblacklight/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'geoblacklight'
8
8
  spec.version = Geoblacklight::VERSION
9
- spec.authors = ['Darren Hardy', 'Jack Reed']
10
- spec.email = ['drh@stanford.edu', 'pjreed@stanford.edu']
9
+ spec.authors = ['Mike Graves', 'Darren Hardy', 'Eliot Jordan', 'Jack Reed']
10
+ spec.email = ['mgraves@mit.edu', 'drh@stanford.edu', 'eliotj@princeton.edu', 'pjreed@stanford.edu']
11
11
  spec.summary = 'A discovery platform for geospatial holdings'
12
- spec.description = 'GeoBlacklight started at Stanford and its goal is to provide a world-class discovery platform for geospatial (GIS) holdings. It is an open collaborative project aiming to build off of the successes of the Blacklight Solr-powered discovery interface and the multi-institutional OpenGeoportal federated metadata sharing communities.'
12
+ spec.description = 'GeoBlacklight provides a world-class discovery platform for geospatial (GIS) holdings. It is an open collaborative project aiming to build off of the successes of the Blacklight Solr-powered discovery interface and the multi-institutional OpenGeoportal federated metadata sharing communities.'
13
13
  spec.homepage = 'http://github.com/geoblacklight/geoblacklight'
14
14
  spec.license = 'Apache 2.0'
15
15
 
@@ -1,2 +1,4 @@
1
- //= require geoblacklight/application
1
+ //= require geoblacklight/geoblacklight
2
+ //= require geoblacklight/viewers
3
+ //= require geoblacklight/modules
2
4
  //= require blacklight_range_limit
data/lib/geoblacklight.rb CHANGED
@@ -6,6 +6,7 @@ module Geoblacklight
6
6
  require 'geoblacklight/controller_override'
7
7
  require 'geoblacklight/exceptions'
8
8
  require 'geoblacklight/view_helper_override'
9
+ require 'geoblacklight/item_viewer'
9
10
  require 'geoblacklight/solr_document'
10
11
  require 'geoblacklight/wms_layer'
11
12
  require 'geoblacklight/download'
@@ -0,0 +1,29 @@
1
+ module Geoblacklight
2
+ class ItemViewer
3
+ def initialize(references)
4
+ @references = references
5
+ end
6
+
7
+ def viewer_protocol
8
+ return 'leaflet' if viewer_preference.nil?
9
+ viewer_preference.keys.first.to_s
10
+ end
11
+
12
+ def viewer_endpoint
13
+ return '' if viewer_preference.nil?
14
+ viewer_preference.values.first.to_s
15
+ end
16
+
17
+ def wms
18
+ @references.wms
19
+ end
20
+
21
+ def iiif
22
+ @references.iiif
23
+ end
24
+
25
+ def viewer_preference
26
+ [wms, iiif].compact.map(&:to_hash).first
27
+ end
28
+ end
29
+ end
@@ -47,6 +47,8 @@ module Geoblacklight
47
47
  end
48
48
  when 'GeoTIFF'
49
49
  { geotiff: wms.to_hash } if wms.present?
50
+ when 'ArcGRID'
51
+ { arcgrid: wms.to_hash } if wms.present?
50
52
  end
51
53
  end
52
54
 
@@ -4,6 +4,8 @@ module Geoblacklight
4
4
  extend Blacklight::Solr::Document
5
5
 
6
6
  delegate :download_types, to: :references
7
+ delegate :viewer_protocol, to: :item_viewer
8
+ delegate :viewer_endpoint, to: :item_viewer
7
9
 
8
10
  def available?
9
11
  public? || same_institution?
@@ -18,7 +20,7 @@ module Geoblacklight
18
20
  end
19
21
 
20
22
  def downloadable?
21
- download_types.present? && available?
23
+ (direct_download || download_types.present?) && available?
22
24
  end
23
25
 
24
26
  def download_types
@@ -37,6 +39,10 @@ module Geoblacklight
37
39
  get(:dct_provenance_s).downcase == Settings.INSTITUTION.downcase
38
40
  end
39
41
 
42
+ def item_viewer
43
+ ItemViewer.new(references)
44
+ end
45
+
40
46
  def itemtype
41
47
  "http://schema.org/Dataset"
42
48
  end
@@ -1,3 +1,3 @@
1
1
  module Geoblacklight
2
- VERSION = '0.2.2'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -38,7 +38,7 @@ feature 'Download layer' do
38
38
  expect(page).to have_css 'a', text: 'Download Shapefile'
39
39
  find('button.download-dropdown-toggle').click
40
40
  expect(page).to have_css 'li.dropdown-header', text: 'Original'
41
- expect(page).to have_css 'li.dropdown-header', text: 'Projected'
41
+ expect(page).to have_css 'li.dropdown-header', text: 'Generated'
42
42
  expect(page).to have_css 'li a', text: 'Download Shapefile'
43
43
  expect(page).to have_css 'li a', text: 'Download Kmz'
44
44
  end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geoblacklight::ItemViewer do
4
+ let(:document) { SolrDocument.new(document_attributes) }
5
+ let(:document_attributes) { {} }
6
+ let(:references) { document.references }
7
+ let(:item_viewer) { Geoblacklight::ItemViewer.new(references) }
8
+ describe 'viewer_preference' do
9
+ describe 'for no references' do
10
+ it 'returns nil' do
11
+ expect(item_viewer.viewer_preference).to be_nil
12
+ end
13
+ end
14
+ describe 'for wms reference' do
15
+ let(:document_attributes) {
16
+ {
17
+ dct_references_s: {
18
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://www.example.com/wms',
19
+ 'http://iiif.io/api/image' => 'http://www.example.com/iiif'
20
+ }.to_json
21
+ }
22
+ }
23
+ it 'wms if wms is present' do
24
+ expect(item_viewer.viewer_preference).to eq wms: 'http://www.example.com/wms'
25
+ end
26
+ end
27
+ describe 'for iiif only reference' do
28
+ let(:document_attributes) {
29
+ {
30
+ dct_references_s: {
31
+ 'http://iiif.io/api/image' => 'http://www.example.com/iiif'
32
+ }.to_json
33
+ }
34
+ }
35
+ it 'returns iiif' do
36
+ expect(item_viewer.viewer_preference).to eq iiif: 'http://www.example.com/iiif'
37
+ end
38
+ end
39
+ end
40
+ end
@@ -31,6 +31,17 @@ describe Geoblacklight::References do
31
31
  )
32
32
  )
33
33
  }
34
+ let(:typical_arcgrid) {
35
+ Geoblacklight::References.new(
36
+ SolrDocument.new(
37
+ dc_format_s: 'ArcGRID',
38
+ dct_references_s: {
39
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://hgl.harvard.edu:8080/geoserver/wms',
40
+ 'http://www.opengis.net/def/serviceType/ogc/wfs' => 'http://hgl.harvard.edu:8080/geoserver/wfs'
41
+ }.to_json
42
+ )
43
+ )
44
+ }
34
45
  let(:complex_shapefile) {
35
46
  Geoblacklight::References.new(
36
47
  SolrDocument.new(
@@ -54,6 +65,17 @@ describe Geoblacklight::References do
54
65
  }.to_json
55
66
  )
56
67
  }
68
+ let(:simple_iiif_image) {
69
+ Geoblacklight::References.new(
70
+ SolrDocument.new(
71
+ dc_format_s: 'Raster',
72
+ dct_references_s: {
73
+ 'http://schema.org/url' => 'http://arks.princeton.edu/ark:/88435/02870w62c',
74
+ 'http://iiif.io/api/image' => 'http://libimages.princeton.edu/loris2/pudl0076%2Fmap_pownall%2F00000001.jp2/info.json'
75
+ }.to_json
76
+ )
77
+ )
78
+ }
57
79
  describe 'format' do
58
80
  it 'should return format' do
59
81
  expect(complex_shapefile.format).to eq 'Shapefile'
@@ -111,6 +133,10 @@ describe Geoblacklight::References do
111
133
  expect(typical_ogp_geotiff.downloads_by_format.count).to eq 1
112
134
  expect(typical_ogp_geotiff.downloads_by_format[:geotiff][:wms]).to eq 'http://hgl.harvard.edu:8080/geoserver/wms'
113
135
  end
136
+ it 'returns arcgrid' do
137
+ expect(typical_arcgrid.downloads_by_format.count).to eq 1
138
+ expect(typical_arcgrid.downloads_by_format[:arcgrid][:wms]).to eq 'http://hgl.harvard.edu:8080/geoserver/wms'
139
+ end
114
140
  it 'does not return shapefile if wms and wfs are not present' do
115
141
  expect(no_service_shapefile.downloads_by_format).to be_nil
116
142
  end
@@ -33,6 +33,21 @@ describe Geoblacklight::SolrDocument do
33
33
  end
34
34
  end
35
35
  end
36
+ describe '#downloadable?' do
37
+ describe 'available direct download' do
38
+ let(:document_attributes) {
39
+ {
40
+ dc_rights_s: 'Public',
41
+ dct_references_s: {
42
+ 'http://schema.org/downloadUrl' => 'http://example.com/direct/data.zip'
43
+ }.to_json
44
+ }
45
+ }
46
+ it 'will be downloadable' do
47
+ expect(document.downloadable?).to be_truthy
48
+ end
49
+ end
50
+ end
36
51
  describe '#same_institution?' do
37
52
  describe 'within the same institution' do
38
53
  let(:document_attributes) { { dct_provenance_s: 'STANFORD' } }
@@ -86,6 +101,48 @@ describe Geoblacklight::SolrDocument do
86
101
  expect(document.direct_download).to be_nil
87
102
  end
88
103
  end
104
+ describe 'item_viewer' do
105
+ let(:document_attributes) { {} }
106
+ it 'is a ItemViewer' do
107
+ expect(document.item_viewer).to be_an Geoblacklight::ItemViewer
108
+ end
109
+ end
110
+ describe 'viewer_protocol' do
111
+ describe 'with a wms reference' do
112
+ let(:document_attributes) {
113
+ {
114
+ dct_references_s: {
115
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://www.example.com/wms'
116
+ }.to_json
117
+ }
118
+ }
119
+ it 'returns wms protocol' do
120
+ expect(document.viewer_protocol).to eq 'wms'
121
+ end
122
+ end
123
+ let(:document_attributes) { {} }
124
+ it 'returns leaflet protocol' do
125
+ expect(document.viewer_protocol).to eq 'leaflet'
126
+ end
127
+ end
128
+ describe 'viewer_endpoint' do
129
+ describe 'with a wms reference' do
130
+ let(:document_attributes) {
131
+ {
132
+ dct_references_s: {
133
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://www.example.com/wms'
134
+ }.to_json
135
+ }
136
+ }
137
+ it 'returns wms endpoint' do
138
+ expect(document.viewer_endpoint).to eq 'http://www.example.com/wms'
139
+ end
140
+ end
141
+ let(:document_attributes) { {} }
142
+ it 'returns no endpoint' do
143
+ expect(document.viewer_endpoint).to eq ''
144
+ end
145
+ end
89
146
  describe 'checked_endpoint' do
90
147
  let(:document_attributes) { {} }
91
148
  let(:reference) { Geoblacklight::Reference.new(['http://www.opengis.net/def/serviceType/ogc/wms', 'http://www.example.com/wms']) }
@@ -0,0 +1,152 @@
1
+ /*
2
+ * Leaflet-IIIF 0.0.2
3
+ * IIIF Viewer for Leaflet
4
+ * by Jack Reed, @mejackreed
5
+ */
6
+
7
+ L.TileLayer.Iiif = L.TileLayer.extend({
8
+ options: {
9
+ continuousWorld: true,
10
+ tileSize: 256,
11
+ updateWhenIdle: true
12
+ },
13
+
14
+ initialize: function(url, options) {
15
+ options = L.setOptions(this, options);
16
+ this._infoDeferred = new $.Deferred();
17
+ this._infoUrl = url;
18
+ this._baseUrl = this._templateUrl();
19
+ this._getInfo();
20
+ },
21
+ getTileUrl: function(coords) {
22
+ var _this = this,
23
+ x = coords.x,
24
+ y = (coords.y),
25
+ zoom = _this._map.getZoom(),
26
+ scale = Math.pow(2, _this.maxZoom - zoom),
27
+ tileBaseSize = _this.options.tileSize * scale,
28
+ minx = (x * tileBaseSize),
29
+ miny = (y * tileBaseSize),
30
+ maxx = Math.min(minx + tileBaseSize, _this.x),
31
+ maxy = Math.min(miny + tileBaseSize, _this.y);
32
+
33
+ return L.Util.template(this._baseUrl, L.extend({
34
+ format: 'jpg',
35
+ quality: _this.quality,
36
+ region: [minx, miny, (maxx - minx), (maxy - miny)].join(','),
37
+ rotation: 0,
38
+ size: 'pct:' + (100 / scale)
39
+ }, this.options));
40
+ },
41
+ onAdd: function(map) {
42
+ var _this = this;
43
+
44
+ // Wait for deferred to complete
45
+ $.when(_this._infoDeferred).done(function() {
46
+
47
+ // Try to center the map a bit
48
+ map.setView([-_this.options.tileSize / 2, _this.options.tileSize / 4], 1);
49
+
50
+ // Set maxZoom for map
51
+ map._layersMaxZoom = _this.maxZoom;
52
+
53
+ // Call add TileLayer
54
+ L.TileLayer.prototype.onAdd.call(_this, map);
55
+
56
+ // Reset tile sizes to handle non 256x256 IIIF tiles
57
+ _this.on('tileload', function(tile, url) {
58
+
59
+ var height = tile.tile.naturalHeight,
60
+ width = tile.tile.naturalWidth;
61
+
62
+ // No need to resize if tile is 256 x 256
63
+ if (height === 256 && width === 256) return;
64
+
65
+ tile.tile.style.width = width + 'px';
66
+ tile.tile.style.height = height + 'px';
67
+
68
+ });
69
+ });
70
+ },
71
+ _getInfo: function() {
72
+ var _this = this;
73
+
74
+ // Look for a way to do this without jQuery
75
+ $.getJSON(_this._infoUrl)
76
+ .done(function(data) {
77
+ _this.y = data.height;
78
+ _this.x = data.width;
79
+
80
+ var profile,
81
+ tierSizes = [],
82
+ scale,
83
+ width_,
84
+ height_,
85
+ tilesX_,
86
+ tilesY_;
87
+
88
+ // Set quality based off of IIIF version
89
+ if (data.profile instanceof Array) {
90
+ profile = data.profile[0];
91
+ }else {
92
+ profile = data.profile;
93
+ }
94
+ switch (profile) {
95
+ case 'http://library.stanford.edu/iiif/image-api/compliance.html#level1':
96
+ _this.quality = 100;
97
+ break;
98
+ case 'http://library.stanford.edu/iiif/image-api/1.1/compliance.html':
99
+ _this.quality = 'native';
100
+ break;
101
+ case 'http://iiif.io/api/image/2/level2.json':
102
+ _this.quality = 'default';
103
+ break;
104
+ }
105
+
106
+ ceilLog2 = function(x) {
107
+ return Math.ceil(Math.log(x) / Math.LN2);
108
+ };
109
+
110
+ // Calculates maxZoom for the layer
111
+ _this.maxZoom = Math.max(ceilLog2(_this.x / _this.options.tileSize),
112
+ ceilLog2(_this.y / _this.options.tileSize));
113
+
114
+ for (var i = 0; i <= _this.maxZoom; i++) {
115
+ scale = Math.pow(2, _this.maxZoom - i);
116
+ width_ = Math.ceil(_this.x / scale);
117
+ height_ = Math.ceil(_this.y / scale);
118
+ tilesX_ = Math.ceil(width_ / _this.options.tileSize);
119
+ tilesY_ = Math.ceil(height_ / _this.options.tileSize);
120
+ tierSizes.push([tilesX_, tilesY_]);
121
+ }
122
+ _this._tierSizes = tierSizes;
123
+
124
+ // Resolved Deferred to initiate tilelayer load
125
+ _this._infoDeferred.resolve();
126
+ });
127
+ },
128
+ _infoToBaseUrl: function() {
129
+ return this._infoUrl.replace('info.json', '');
130
+ },
131
+ _templateUrl: function() {
132
+ return this._infoToBaseUrl() + '{region}/{size}/{rotation}/{quality}.{format}';
133
+ },
134
+ _tileShouldBeLoaded: function(coords) {
135
+ var _this = this,
136
+ zoom = _this._map.getZoom(),
137
+ sizes = _this._tierSizes[zoom],
138
+ x = coords.x,
139
+ y = (coords.y);
140
+
141
+ if (!sizes) return false;
142
+ if (x < 0 || sizes[0] <= x || y < 0 || sizes[1] <= y) {
143
+ return false;
144
+ }else {
145
+ return true;
146
+ }
147
+ }
148
+ });
149
+
150
+ L.tileLayer.iiif = function(url, options) {
151
+ return new L.TileLayer.Iiif(url, options);
152
+ };
@@ -0,0 +1,7 @@
1
+ (function(c){function g(b,a){this.element=b;this.options=c.extend({},h,a);c(this.element).data("max-height",this.options.maxHeight);c(this.element).data("height-margin",this.options.heightMargin);delete this.options.maxHeight;if(this.options.embedCSS&&!k){var d=".readmore-js-toggle, .readmore-js-section { "+this.options.sectionCSS+" } .readmore-js-section { overflow: hidden; }",e=document.createElement("style");e.type="text/css";e.styleSheet?e.styleSheet.cssText=d:e.appendChild(document.createTextNode(d));
2
+ document.getElementsByTagName("head")[0].appendChild(e);k=!0}this._defaults=h;this._name=f;this.init()}var f="readmore",h={speed:100,maxHeight:200,heightMargin:16,moreLink:'<a href="#">Read More</a>',lessLink:'<a href="#">Close</a>',embedCSS:!0,sectionCSS:"display: block; width: 100%;",startOpen:!1,expandedClass:"readmore-js-expanded",collapsedClass:"readmore-js-collapsed",beforeToggle:function(){},afterToggle:function(){}},k=!1;g.prototype={init:function(){var b=this;c(this.element).each(function(){var a=
3
+ c(this),d=a.css("max-height").replace(/[^-\d\.]/g,"")>a.data("max-height")?a.css("max-height").replace(/[^-\d\.]/g,""):a.data("max-height"),e=a.data("height-margin");"none"!=a.css("max-height")&&a.css("max-height","none");b.setBoxHeight(a);if(a.outerHeight(!0)<=d+e)return!0;a.addClass("readmore-js-section "+b.options.collapsedClass).data("collapsedHeight",d);a.after(c(b.options.startOpen?b.options.lessLink:b.options.moreLink).on("click",function(c){b.toggleSlider(this,a,c)}).addClass("readmore-js-toggle"));
4
+ b.options.startOpen||a.css({height:d})});c(window).on("resize",function(a){b.resizeBoxes()})},toggleSlider:function(b,a,d){d.preventDefault();var e=this;d=newLink=sectionClass="";var f=!1;d=c(a).data("collapsedHeight");c(a).height()<=d?(d=c(a).data("expandedHeight")+"px",newLink="lessLink",f=!0,sectionClass=e.options.expandedClass):(newLink="moreLink",sectionClass=e.options.collapsedClass);e.options.beforeToggle(b,a,f);c(a).animate({height:d},{duration:e.options.speed,complete:function(){e.options.afterToggle(b,
5
+ a,f);c(b).replaceWith(c(e.options[newLink]).on("click",function(b){e.toggleSlider(this,a,b)}).addClass("readmore-js-toggle"));c(this).removeClass(e.options.collapsedClass+" "+e.options.expandedClass).addClass(sectionClass)}})},setBoxHeight:function(b){var a=b.clone().css({height:"auto",width:b.width(),overflow:"hidden"}).insertAfter(b),c=a.outerHeight(!0);a.remove();b.data("expandedHeight",c)},resizeBoxes:function(){var b=this;c(".readmore-js-section").each(function(){var a=c(this);b.setBoxHeight(a);
6
+ (a.height()>a.data("expandedHeight")||a.hasClass(b.options.expandedClass)&&a.height()<a.data("expandedHeight"))&&a.css("height",a.data("expandedHeight"))})},destroy:function(){var b=this;c(this.element).each(function(){var a=c(this);a.removeClass("readmore-js-section "+b.options.collapsedClass+" "+b.options.expandedClass).css({"max-height":"",height:"auto"}).next(".readmore-js-toggle").remove();a.removeData()})}};c.fn[f]=function(b){var a=arguments;if(void 0===b||"object"===typeof b)return this.each(function(){if(c.data(this,
7
+ "plugin_"+f)){var a=c.data(this,"plugin_"+f);a.destroy.apply(a)}c.data(this,"plugin_"+f,new g(this,b))});if("string"===typeof b&&"_"!==b[0]&&"init"!==b)return this.each(function(){var d=c.data(this,"plugin_"+f);d instanceof g&&"function"===typeof d[b]&&d[b].apply(d,Array.prototype.slice.call(a,1))})}})(jQuery);
metadata CHANGED
@@ -1,15 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoblacklight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Mike Graves
7
8
  - Darren Hardy
9
+ - Eliot Jordan
8
10
  - Jack Reed
9
11
  autorequire:
10
12
  bindir: bin
11
13
  cert_chain: []
12
- date: 2014-12-05 00:00:00.000000000 Z
14
+ date: 2014-12-10 00:00:00.000000000 Z
13
15
  dependencies:
14
16
  - !ruby/object:Gem::Dependency
15
17
  name: blacklight
@@ -235,12 +237,14 @@ dependencies:
235
237
  - - ">="
236
238
  - !ruby/object:Gem::Version
237
239
  version: '0'
238
- description: GeoBlacklight started at Stanford and its goal is to provide a world-class
239
- discovery platform for geospatial (GIS) holdings. It is an open collaborative project
240
- aiming to build off of the successes of the Blacklight Solr-powered discovery interface
241
- and the multi-institutional OpenGeoportal federated metadata sharing communities.
240
+ description: GeoBlacklight provides a world-class discovery platform for geospatial
241
+ (GIS) holdings. It is an open collaborative project aiming to build off of the successes
242
+ of the Blacklight Solr-powered discovery interface and the multi-institutional OpenGeoportal
243
+ federated metadata sharing communities.
242
244
  email:
245
+ - mgraves@mit.edu
243
246
  - drh@stanford.edu
247
+ - eliotj@princeton.edu
244
248
  - pjreed@stanford.edu
245
249
  executables: []
246
250
  extensions: []
@@ -259,8 +263,8 @@ files:
259
263
  - app/assets/fonts/geoblacklight.ttf
260
264
  - app/assets/fonts/geoblacklight.woff
261
265
  - app/assets/images/blacklight/logo.png
262
- - app/assets/javascripts/geoblacklight/application.js
263
266
  - app/assets/javascripts/geoblacklight/geoblacklight.js
267
+ - app/assets/javascripts/geoblacklight/modules.js
264
268
  - app/assets/javascripts/geoblacklight/modules/collapse.js
265
269
  - app/assets/javascripts/geoblacklight/modules/download.js
266
270
  - app/assets/javascripts/geoblacklight/modules/geosearch.js
@@ -268,6 +272,11 @@ files:
268
272
  - app/assets/javascripts/geoblacklight/modules/item.js
269
273
  - app/assets/javascripts/geoblacklight/modules/layer_opacity.js
270
274
  - app/assets/javascripts/geoblacklight/modules/results.js
275
+ - app/assets/javascripts/geoblacklight/viewers.js
276
+ - app/assets/javascripts/geoblacklight/viewers/iiif.js
277
+ - app/assets/javascripts/geoblacklight/viewers/map.js
278
+ - app/assets/javascripts/geoblacklight/viewers/viewer.js
279
+ - app/assets/javascripts/geoblacklight/viewers/wms.js
271
280
  - app/assets/stylesheets/geoblacklight/_geoblacklight.css.scss
272
281
  - app/assets/stylesheets/geoblacklight/_styles.css.scss
273
282
  - app/assets/stylesheets/geoblacklight/application.css.scss
@@ -282,6 +291,7 @@ files:
282
291
  - app/controllers/download_controller.rb
283
292
  - app/controllers/wms_controller.rb
284
293
  - app/helpers/geoblacklight_helper.rb
294
+ - app/views/catalog/_abstract_metadata.html.erb
285
295
  - app/views/catalog/_document_split.html.erb
286
296
  - app/views/catalog/_facet_tag_item.html.erb
287
297
  - app/views/catalog/_facet_tag_layout.html.erb
@@ -313,6 +323,7 @@ files:
313
323
  - lib/geoblacklight/download/shapefile_download.rb
314
324
  - lib/geoblacklight/engine.rb
315
325
  - lib/geoblacklight/exceptions.rb
326
+ - lib/geoblacklight/item_viewer.rb
316
327
  - lib/geoblacklight/reference.rb
317
328
  - lib/geoblacklight/references.rb
318
329
  - lib/geoblacklight/solr_document.rb
@@ -346,6 +357,7 @@ files:
346
357
  - spec/lib/geoblacklight/download/kmz_download_spec.rb
347
358
  - spec/lib/geoblacklight/download/shapefile_download_spec.rb
348
359
  - spec/lib/geoblacklight/download_spec.rb
360
+ - spec/lib/geoblacklight/item_viewer_spec.rb
349
361
  - spec/lib/geoblacklight/references_spec.rb
350
362
  - spec/lib/geoblacklight/solr_document_spec.rb
351
363
  - spec/lib/geoblacklight/view_helper_override_spec.rb
@@ -359,7 +371,9 @@ files:
359
371
  - spec/views/catalog/_document_split.html.erb_spec.rb
360
372
  - spec/views/catalog/_index_split.html.erb_spec.rb
361
373
  - template.rb
374
+ - vendor/assets/javascripts/leaflet-iiif.js
362
375
  - vendor/assets/javascripts/native.history.js
376
+ - vendor/assets/javascripts/readmore.min.js
363
377
  homepage: http://github.com/geoblacklight/geoblacklight
364
378
  licenses:
365
379
  - Apache 2.0
@@ -410,6 +424,7 @@ test_files:
410
424
  - spec/lib/geoblacklight/download/kmz_download_spec.rb
411
425
  - spec/lib/geoblacklight/download/shapefile_download_spec.rb
412
426
  - spec/lib/geoblacklight/download_spec.rb
427
+ - spec/lib/geoblacklight/item_viewer_spec.rb
413
428
  - spec/lib/geoblacklight/references_spec.rb
414
429
  - spec/lib/geoblacklight/solr_document_spec.rb
415
430
  - spec/lib/geoblacklight/view_helper_override_spec.rb
@@ -1,3 +0,0 @@
1
- //= require leaflet
2
- //= require native.history
3
- //= require_tree .