blacklight_allmaps 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -24
- data/Rakefile +2 -1
- data/app/assets/javascripts/blacklight/allmaps/blacklight-allmaps.esm.js +26776 -0
- data/app/assets/javascripts/blacklight/allmaps/blacklight-allmaps.esm.js.map +1 -0
- data/app/assets/javascripts/blacklight/allmaps/blacklight-allmaps.js +26783 -0
- data/app/assets/javascripts/blacklight/allmaps/blacklight-allmaps.js.map +1 -0
- data/app/assets/stylesheets/blacklight/allmaps/base.scss +9 -0
- data/app/javascript/blacklight/allmaps/index.js +11 -0
- data/app/javascript/blacklight/allmaps/initialize_blacklight_map.js +44 -0
- data/app/javascript/blacklight/allmaps/initialize_geoblacklight_map.js +53 -0
- data/app/javascript/blacklight/allmaps/leaflet_layer_opacity.js +69 -0
- data/app/views/allmaps/show/_blacklight.html.erb +1 -211
- data/app/views/allmaps/show/_geoblacklight.html.erb +1 -45
- data/app/views/catalog/_blacklight_allmaps.html.erb +5 -0
- data/app/views/catalog/_show_allmaps_tabbed_viewer_container.html.erb +53 -0
- data/db/migrate/{20240307155110_create_solr_document_sidecars.rb → 20240307155110_create_solr_document_sidecar_allmaps.rb} +1 -1
- data/lib/blacklight/allmaps/tasks/index.rake +53 -4
- data/lib/blacklight/allmaps/version.rb +10 -1
- data/lib/blacklight/allmaps.rb +1 -0
- data/lib/generators/blacklight/allmaps/config_generator.rb +67 -5
- metadata +20 -13
- data/app/assets/stylesheets/blacklight_allmaps/application.css +0 -15
- data/app/javascripts/map_controller.js +0 -39
- data/app/views/catalog/_show_default_viewer_container.html.erb +0 -52
- data/app/views/catalog/_show_main_content.html.erb +0 -58
@@ -0,0 +1,11 @@
|
|
1
|
+
import L from "leaflet";
|
2
|
+
import "leaflet-fullscreen";
|
3
|
+
import { WarpedMapLayer } from "@allmaps/leaflet"
|
4
|
+
import LayerOpacityControl from "leaflet_layer_opacity";
|
5
|
+
|
6
|
+
|
7
|
+
import { initializeGeoBlacklightMap } from "./initialize_geoblacklight_map";
|
8
|
+
initializeGeoBlacklightMap();
|
9
|
+
|
10
|
+
import { initializeBlacklightMap } from "./initialize_blacklight_map";
|
11
|
+
initializeBlacklightMap();
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// initialize_blacklight_map.js
|
2
|
+
import L from 'leaflet';
|
3
|
+
import 'leaflet-fullscreen';
|
4
|
+
import LayerOpacityControl from 'leaflet_layer_opacity';
|
5
|
+
import { WarpedMapLayer } from '@allmaps/leaflet';
|
6
|
+
|
7
|
+
export function initializeBlacklightMap() {
|
8
|
+
document.addEventListener("DOMContentLoaded", () => {
|
9
|
+
if (document.getElementById("blacklight-allmaps-map") != null) {
|
10
|
+
const element = document.getElementById("blacklight-allmaps-map");
|
11
|
+
const allmaps_id = element.getAttribute("data-allmaps-id");
|
12
|
+
if (!element) return; // Exit if the element doesn't exist
|
13
|
+
|
14
|
+
const map = L.map("blacklight-allmaps-map", {
|
15
|
+
center: [0, 0],
|
16
|
+
zoom: 15,
|
17
|
+
zoomAnimationThreshold: 1
|
18
|
+
});
|
19
|
+
|
20
|
+
// Basemap and Attribution
|
21
|
+
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
22
|
+
attribution: "© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors",
|
23
|
+
maxZoom: 18
|
24
|
+
}).addTo(map);
|
25
|
+
|
26
|
+
// Fullscreen control
|
27
|
+
map.addControl(new L.Control.Fullscreen({
|
28
|
+
position: "topright"
|
29
|
+
}));
|
30
|
+
|
31
|
+
// Annotation URL assumes the ID is passed dynamically to this function
|
32
|
+
const annotationUrl = `https://annotations.allmaps.org/manifests/${allmaps_id}`;
|
33
|
+
const warpedMapLayer = new WarpedMapLayer(annotationUrl).addTo(map);
|
34
|
+
|
35
|
+
// Layer opacity control
|
36
|
+
map.addControl(new LayerOpacityControl(warpedMapLayer));
|
37
|
+
|
38
|
+
map.on("warpedmapadded", () => {
|
39
|
+
map.fitBounds(warpedMapLayer.getBounds());
|
40
|
+
});
|
41
|
+
}
|
42
|
+
});
|
43
|
+
}
|
44
|
+
// app/javascript/blacklight/allmaps/initialize_blacklight_map.js
|
@@ -0,0 +1,53 @@
|
|
1
|
+
// initialize_geoblacklight_map.js
|
2
|
+
import L from 'leaflet';
|
3
|
+
import 'leaflet-fullscreen';
|
4
|
+
import LayerOpacityControl from 'leaflet_layer_opacity';
|
5
|
+
import { WarpedMapLayer } from '@allmaps/leaflet';
|
6
|
+
|
7
|
+
export function initializeGeoBlacklightMap() {
|
8
|
+
document.addEventListener("DOMContentLoaded", () => {
|
9
|
+
if (document.getElementById("geoblacklight-allmaps-map") != null) {
|
10
|
+
const element = document.getElementById("geoblacklight-allmaps-map");
|
11
|
+
const allmaps_id = element.getAttribute("data-allmaps-id");
|
12
|
+
const geoTab = document.getElementById("georeferenced-tab");
|
13
|
+
if (!element) return; // Exit if the element doesn't exist
|
14
|
+
|
15
|
+
const map = L.map("geoblacklight-allmaps-map", {
|
16
|
+
center: [0, 0],
|
17
|
+
zoom: 15,
|
18
|
+
zoomAnimationThreshold: 1
|
19
|
+
});
|
20
|
+
|
21
|
+
// Basemap and Attribution
|
22
|
+
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
23
|
+
attribution: "© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors",
|
24
|
+
maxZoom: 18
|
25
|
+
}).addTo(map);
|
26
|
+
|
27
|
+
// Fullscreen control
|
28
|
+
map.addControl(new L.Control.Fullscreen({
|
29
|
+
position: "topright"
|
30
|
+
}));
|
31
|
+
|
32
|
+
// Annotation URL assumes the ID is passed dynamically to this function
|
33
|
+
const annotationUrl = `https://annotations.allmaps.org/manifests/${allmaps_id}`;
|
34
|
+
const warpedMapLayer = new WarpedMapLayer(annotationUrl).addTo(map);
|
35
|
+
|
36
|
+
// Layer opacity control
|
37
|
+
map.addControl(new LayerOpacityControl(warpedMapLayer));
|
38
|
+
|
39
|
+
// Watch DOM to see active tab and
|
40
|
+
// Resize map to render correctly
|
41
|
+
const observer = new MutationObserver(function() {
|
42
|
+
if (geoTab.style.display !== "none") {
|
43
|
+
map.invalidateSize();
|
44
|
+
warpedMapLayer.addTo(map);
|
45
|
+
map.fitBounds(warpedMapLayer.getBounds());
|
46
|
+
}
|
47
|
+
});
|
48
|
+
|
49
|
+
observer.observe(geoTab, { attributes: true });
|
50
|
+
}
|
51
|
+
});
|
52
|
+
}
|
53
|
+
// app/javascript/blacklight/allmaps/initialize_geoblacklight_map.js
|
@@ -0,0 +1,69 @@
|
|
1
|
+
// leaflet_layer_opacity.js
|
2
|
+
import L from 'leaflet';
|
3
|
+
|
4
|
+
class LayerOpacityControl extends L.Control {
|
5
|
+
initialize(layer) {
|
6
|
+
super.initialize();
|
7
|
+
let options = { position: 'topleft' };
|
8
|
+
|
9
|
+
// Check if the layer is actually a layer group and adjust accordingly
|
10
|
+
if (typeof layer.getLayers !== 'undefined') {
|
11
|
+
options.layer = layer.getLayers()[0];
|
12
|
+
} else {
|
13
|
+
options.layer = layer;
|
14
|
+
}
|
15
|
+
|
16
|
+
L.Util.setOptions(this, options);
|
17
|
+
}
|
18
|
+
|
19
|
+
onAdd(map) {
|
20
|
+
const container = L.DomUtil.create('div', 'opacity-control unselectable');
|
21
|
+
const controlArea = L.DomUtil.create('div', 'opacity-area', container);
|
22
|
+
const handle = L.DomUtil.create('div', 'opacity-handle', container);
|
23
|
+
const handleArrowUp = L.DomUtil.create('div', 'opacity-arrow-up', handle);
|
24
|
+
const handleText = L.DomUtil.create('div', 'opacity-text', handle);
|
25
|
+
const handleArrowDown = L.DomUtil.create('div', 'opacity-arrow-down', handle);
|
26
|
+
const bottom = L.DomUtil.create('div', 'opacity-bottom', container);
|
27
|
+
|
28
|
+
L.DomEvent.stopPropagation(container);
|
29
|
+
L.DomEvent.disableClickPropagation(container);
|
30
|
+
|
31
|
+
this.setListeners(handle, bottom, handleText);
|
32
|
+
handle.style.top = `${handle.offsetTop - 13 + 50}px`;
|
33
|
+
handleText.innerHTML = `${parseInt(this.options.layer.options.opacity * 100, 10)}%`;
|
34
|
+
|
35
|
+
return container;
|
36
|
+
}
|
37
|
+
|
38
|
+
setListeners(handle, bottom, handleText) {
|
39
|
+
let start = false;
|
40
|
+
let startTop;
|
41
|
+
|
42
|
+
L.DomEvent.on(document, 'mousemove', (e) => {
|
43
|
+
if (!start) return;
|
44
|
+
const percentInverse = Math.max(0, Math.min(200, startTop + parseInt(e.clientY, 10) - start)) / 2;
|
45
|
+
handle.style.top = `${(percentInverse * 2) - 13}px`;
|
46
|
+
handleText.innerHTML = `${Math.round((1 - (percentInverse / 100)) * 100)}%`;
|
47
|
+
bottom.style.height = `${Math.max(0, ((100 - percentInverse) * 2) - 13)}px`;
|
48
|
+
bottom.style.top = `${Math.min(200, (percentInverse * 2) + 13)}px`;
|
49
|
+
this.options.layer.setOpacity(1 - (percentInverse / 100));
|
50
|
+
});
|
51
|
+
|
52
|
+
L.DomEvent.on(handle, 'mousedown', (e) => {
|
53
|
+
start = parseInt(e.clientY, 10);
|
54
|
+
startTop = handle.offsetTop - 12;
|
55
|
+
return false;
|
56
|
+
});
|
57
|
+
|
58
|
+
L.DomEvent.on(document, 'mouseup', () => {
|
59
|
+
start = null;
|
60
|
+
});
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
// Extend Leaflet's control factory to include this new control
|
65
|
+
L.Control.layerOpacity = function(layer, options) {
|
66
|
+
return new LayerOpacityControl(layer, options);
|
67
|
+
};
|
68
|
+
|
69
|
+
export default LayerOpacityControl;
|
@@ -1,213 +1,3 @@
|
|
1
1
|
<!-- Georeferenced Map -->
|
2
2
|
<h3 class="h6">Georeferenced Map</h3>
|
3
|
-
<div id="allmaps-map" class="mt-3 mb-3"
|
4
|
-
|
5
|
-
<!-- Leaflet -->
|
6
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.min.css">
|
7
|
-
<script src="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.min.js"></script>
|
8
|
-
|
9
|
-
<!-- Leaflet Fullscreen -->
|
10
|
-
<script src="https://cdn.jsdelivr.net/npm/leaflet-fullscreen@1.0.2/dist/Leaflet.fullscreen.min.js"></script>
|
11
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet-fullscreen@1.0.2/dist/leaflet.fullscreen.min.css">
|
12
|
-
|
13
|
-
<!-- Leaflet Layer Opacity -->
|
14
|
-
<script>
|
15
|
-
// Adopts the Mapbox opacity control into a Leaflet plugin
|
16
|
-
|
17
|
-
!function(global) {
|
18
|
-
'use strict';
|
19
|
-
|
20
|
-
L.Control.LayerOpacity = L.Control.extend({
|
21
|
-
initialize: function(layer) {
|
22
|
-
var options = { position: 'topleft' };
|
23
|
-
|
24
|
-
// check if layer is actually a layer group
|
25
|
-
if (typeof layer.getLayers !== 'undefined') {
|
26
|
-
|
27
|
-
// add first layer from layer group to options
|
28
|
-
options.layer = layer.getLayers()[0];
|
29
|
-
} else {
|
30
|
-
|
31
|
-
// add layer to options
|
32
|
-
options.layer = layer;
|
33
|
-
}
|
34
|
-
|
35
|
-
L.Util.setOptions(this, options);
|
36
|
-
},
|
37
|
-
|
38
|
-
onAdd: function(map) {
|
39
|
-
var container = L.DomUtil.create('div', 'opacity-control unselectable'),
|
40
|
-
controlArea = L.DomUtil.create('div', 'opacity-area', container),
|
41
|
-
handle = L.DomUtil.create('div', 'opacity-handle', container),
|
42
|
-
handleArrowUp = L.DomUtil.create('div', 'opacity-arrow-up', handle),
|
43
|
-
handleText = L.DomUtil.create('div', 'opacity-text', handle),
|
44
|
-
handleArrowDown = L.DomUtil.create('div', 'opacity-arrow-down', handle),
|
45
|
-
bottom = L.DomUtil.create('div', 'opacity-bottom', container);
|
46
|
-
|
47
|
-
L.DomEvent.stopPropagation(container);
|
48
|
-
L.DomEvent.disableClickPropagation(container);
|
49
|
-
|
50
|
-
this.setListeners(handle, bottom, handleText);
|
51
|
-
handle.style.top = handle.offsetTop - 13 + 50 + 'px';
|
52
|
-
handleText.innerHTML = parseInt(this.options.layer.options.opacity * 100) + '%';
|
53
|
-
return container;
|
54
|
-
},
|
55
|
-
|
56
|
-
setListeners: function(handle, bottom, handleText) {
|
57
|
-
var _this = this,
|
58
|
-
start = false,
|
59
|
-
startTop;
|
60
|
-
|
61
|
-
L.DomEvent.on(document, 'mousemove', function(e) {
|
62
|
-
if (!start) return;
|
63
|
-
var percentInverse = Math.max(0, Math.min(200, startTop + parseInt(e.clientY, 10) - start)) / 2;
|
64
|
-
handle.style.top = ((percentInverse * 2) - 13) + 'px';
|
65
|
-
handleText.innerHTML = Math.round((1 - (percentInverse / 100)) * 100) + '%';
|
66
|
-
bottom.style.height = Math.max(0, (((100 - percentInverse) * 2) - 13)) + 'px';
|
67
|
-
bottom.style.top = Math.min(200, (percentInverse * 2) + 13) + 'px';
|
68
|
-
_this.options.layer.setOpacity(1 - (percentInverse / 100));
|
69
|
-
});
|
70
|
-
|
71
|
-
L.DomEvent.on(handle, 'mousedown', function(e) {
|
72
|
-
start = parseInt(e.clientY, 10);
|
73
|
-
startTop = handle.offsetTop - 12;
|
74
|
-
return false;
|
75
|
-
});
|
76
|
-
|
77
|
-
L.DomEvent.on(document, 'mouseup', function(e) {
|
78
|
-
start = null;
|
79
|
-
});
|
80
|
-
}
|
81
|
-
});
|
82
|
-
}(this);
|
83
|
-
</script>
|
84
|
-
<style>
|
85
|
-
.leaflet-control.opacity-control {
|
86
|
-
background-color: #a9acb1;
|
87
|
-
border-radius: 15px;
|
88
|
-
color: black;
|
89
|
-
font: bold 18px 'Lucida Console', Monaco, monospace;
|
90
|
-
display: block;
|
91
|
-
height: 200px;
|
92
|
-
left: 11px;
|
93
|
-
position: relative;
|
94
|
-
top: 15px;
|
95
|
-
width: 5px;
|
96
|
-
|
97
|
-
.opacity-handle {
|
98
|
-
background-color: #fff;
|
99
|
-
border-radius: 4px;
|
100
|
-
border: 1px solid #eee;
|
101
|
-
cursor: ns-resize;
|
102
|
-
font-size: 10px;
|
103
|
-
height: 26px;
|
104
|
-
left: -11px;
|
105
|
-
line-height: 26px;
|
106
|
-
position: absolute;
|
107
|
-
text-align: center;
|
108
|
-
top: 0;
|
109
|
-
width: 26px;
|
110
|
-
@include map-control-shadow;
|
111
|
-
|
112
|
-
&:hover {
|
113
|
-
background-color: #f4f4f4;
|
114
|
-
}
|
115
|
-
}
|
116
|
-
|
117
|
-
.opacity-arrow-up {
|
118
|
-
color: #aaa;
|
119
|
-
position: absolute;
|
120
|
-
top: -11px;
|
121
|
-
text-align: center;
|
122
|
-
width: 100%;
|
123
|
-
|
124
|
-
&:before {
|
125
|
-
content: '=';
|
126
|
-
}
|
127
|
-
}
|
128
|
-
|
129
|
-
.opacity-arrow-down {
|
130
|
-
bottom: -10px;
|
131
|
-
color: #aaa;
|
132
|
-
position: absolute;
|
133
|
-
text-align: center;
|
134
|
-
width: 100%;
|
135
|
-
|
136
|
-
&:before {
|
137
|
-
content: '=';
|
138
|
-
}
|
139
|
-
}
|
140
|
-
|
141
|
-
.opacity-bottom {
|
142
|
-
background-color: #017afd;
|
143
|
-
border-radius: 15px;
|
144
|
-
display: block;
|
145
|
-
height: 137px;
|
146
|
-
left: 0px;
|
147
|
-
position: relative;
|
148
|
-
top: 63px;
|
149
|
-
width: 5px;
|
150
|
-
}
|
151
|
-
|
152
|
-
// Area underneath slider to prevent unintentioned map clicks
|
153
|
-
.opacity-area {
|
154
|
-
padding: 14px;
|
155
|
-
cursor: default;
|
156
|
-
height: 200px;
|
157
|
-
left: -11px;
|
158
|
-
position: absolute;
|
159
|
-
top: 0px;
|
160
|
-
width: 20px;
|
161
|
-
}
|
162
|
-
}
|
163
|
-
|
164
|
-
.opacity-control.unselectable {
|
165
|
-
-webkit-touch-callout: none;
|
166
|
-
-webkit-user-select: none;
|
167
|
-
-khtml-user-select: none;
|
168
|
-
-moz-user-select: none;
|
169
|
-
-ms-user-select: none;
|
170
|
-
user-select: none;
|
171
|
-
}
|
172
|
-
</style>
|
173
|
-
|
174
|
-
<!-- Allmaps -->
|
175
|
-
<script src="https://cdn.jsdelivr.net/npm/@allmaps/leaflet/dist/bundled/allmaps-leaflet-1.9.umd.js"></script>
|
176
|
-
|
177
|
-
<script>
|
178
|
-
document.addEventListener("DOMContentLoaded", () => {
|
179
|
-
const element = document.getElementById("allmaps-map");
|
180
|
-
|
181
|
-
const map = L.map("allmaps-map", {
|
182
|
-
center: [0, 0],
|
183
|
-
zoom: 15,
|
184
|
-
zoomAnimationThreshold: 1
|
185
|
-
});
|
186
|
-
|
187
|
-
// Basemap and Attribution
|
188
|
-
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
189
|
-
attribution: "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors",
|
190
|
-
maxZoom: 18
|
191
|
-
}).addTo(map);
|
192
|
-
|
193
|
-
// Fullscreen control
|
194
|
-
map.addControl(new L.Control.Fullscreen({
|
195
|
-
position: "topright"
|
196
|
-
}));
|
197
|
-
|
198
|
-
const annotationUrl = "https://annotations.allmaps.org/manifests/<%= document.sidecar_allmaps.allmaps_id %>";
|
199
|
-
const warpedMapLayer = new Allmaps.WarpedMapLayer(annotationUrl)
|
200
|
-
.addTo(map);
|
201
|
-
|
202
|
-
// Layer opacity control
|
203
|
-
map.addControl(new L.Control.LayerOpacity(warpedMapLayer));
|
204
|
-
|
205
|
-
map.on(
|
206
|
-
"warpedmapadded",
|
207
|
-
(event) => {
|
208
|
-
map.fitBounds(warpedMapLayer.getBounds());
|
209
|
-
},
|
210
|
-
map
|
211
|
-
);
|
212
|
-
});
|
213
|
-
</script>
|
3
|
+
<div id="blacklight-allmaps-map" data-allmaps-id="<%= document.sidecar_allmaps.allmaps_id %>" class="mt-3 mb-3"></div>
|
@@ -1,47 +1,3 @@
|
|
1
1
|
<!-- Georeferenced Map -->
|
2
2
|
<h3 class="h6">Georeferenced Map</h3>
|
3
|
-
<div id="allmaps-map" data-map-geom="<%= document.geometry.geojson %>"
|
4
|
-
|
5
|
-
<script src="https://cdn.jsdelivr.net/npm/@allmaps/leaflet/dist/bundled/allmaps-leaflet-1.9.umd.js"></script>
|
6
|
-
<script>
|
7
|
-
document.addEventListener("DOMContentLoaded", () => {
|
8
|
-
const element = document.getElementById("allmaps-map");
|
9
|
-
const value = element.getAttribute("data-map-geom");
|
10
|
-
const layer = L.geoJSON();
|
11
|
-
layer.addData(JSON.parse(value));
|
12
|
-
const bounds = layer.getBounds();
|
13
|
-
const annotationUrl = "https://annotations.allmaps.org/manifests/<%= document.sidecar_allmaps.allmaps_id %>";
|
14
|
-
const warpedMapLayer = new Allmaps.WarpedMapLayer(annotationUrl);
|
15
|
-
const geoTab = document.getElementById("georeferenced-tab");
|
16
|
-
const map = L.map("allmaps-map");
|
17
|
-
|
18
|
-
// Basemap and Attribution
|
19
|
-
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
20
|
-
attribution: "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors",
|
21
|
-
maxZoom: 18
|
22
|
-
}).addTo(map);
|
23
|
-
|
24
|
-
// Fullscreen control
|
25
|
-
map.addControl(new L.Control.Fullscreen({
|
26
|
-
position: "topright"
|
27
|
-
}));
|
28
|
-
|
29
|
-
// Layer opacity control
|
30
|
-
map.addControl(new L.Control.LayerOpacity(warpedMapLayer));
|
31
|
-
|
32
|
-
// Leaflet: Multiple maps on the same page is a challenge...
|
33
|
-
// 1. Need to watch the page DOM mutate
|
34
|
-
// 2. When the georeferenced tab is visible, invalidate the map size
|
35
|
-
// 3. Add the WarpedMapLayer to the map
|
36
|
-
// 4. Fit the map to the GeoJSON bounds
|
37
|
-
const observer = new MutationObserver(function(){
|
38
|
-
if(geoTab.style.display !== "none"){
|
39
|
-
map.invalidateSize();
|
40
|
-
warpedMapLayer.addTo(map);
|
41
|
-
map.fitBounds(bounds);
|
42
|
-
}
|
43
|
-
});
|
44
|
-
|
45
|
-
observer.observe(geoTab, { attributes: true });
|
46
|
-
});
|
47
|
-
</script>
|
3
|
+
<div id="geoblacklight-allmaps-map" data-map-geom="<%= document.geometry.geojson %>" data-allmaps-id="<%= document.sidecar_allmaps.allmaps_id %>"></div>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
<% document ||= @document %>
|
2
|
+
<div class='row'>
|
3
|
+
<div id='viewer-container' class="col-md-12">
|
4
|
+
|
5
|
+
<span class="sr-only">Georeferenced: <%= document.sidecar_allmaps.georeferenced? %></span>
|
6
|
+
|
7
|
+
<ul class="nav nav-tabs mt-3" id="myTab" role="tablist">
|
8
|
+
<li class="nav-item" role="presentation">
|
9
|
+
<button class="nav-link active" id="item-viewer" data-toggle="tab" data-target="#item-viewer-tab" type="button" role="tab" aria-controls="home" aria-selected="true">Item Viewer</button>
|
10
|
+
</li>
|
11
|
+
<% if document.sidecar_allmaps.georeferenced? %>
|
12
|
+
<li class="nav-item" role="presentation">
|
13
|
+
<button class="nav-link" id="georeferenced-viewer" data-toggle="tab" data-target="#georeferenced-tab" type="button" role="tab" aria-controls="profile" aria-selected="false">Georeferenced Map</button>
|
14
|
+
</li>
|
15
|
+
<% end %>
|
16
|
+
</ul>
|
17
|
+
|
18
|
+
<div class="tab-content mt-3">
|
19
|
+
<div class="tab-pane active" id="item-viewer-tab" role="tabpanel" aria-labelledby="item-viewer-tab">
|
20
|
+
<div id="viewer-wrapper">
|
21
|
+
<% if show_help_text?('viewer_protocol', document.viewer_protocol) %>
|
22
|
+
<%= render_help_text_entry('viewer_protocol', document.viewer_protocol) %>
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
<% if document.item_viewer.index_map %>
|
26
|
+
<div class="index-map-legend">
|
27
|
+
<div class="index-map-legend-info">
|
28
|
+
<span class="index-map-legend-default"></span>
|
29
|
+
<p><span class="sr-only">Green tile indicates </span>Map held by collection</p>
|
30
|
+
</div>
|
31
|
+
<div class="index-map-legend-info">
|
32
|
+
<span class="index-map-legend-unavailable"></span>
|
33
|
+
<p><span class="sr-only">Yellow tile indicates </span>Map not held by collection</p>
|
34
|
+
</div>
|
35
|
+
<div class="index-map-legend-info">
|
36
|
+
<span class="index-map-legend-selected"></span>
|
37
|
+
<p><span class="sr-only">Blue tile indicates </span>Selected map tile</p>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<% end %>
|
41
|
+
|
42
|
+
<%= viewer_container %>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<% if document.sidecar_allmaps.georeferenced? %>
|
47
|
+
<div class="tab-pane" id="georeferenced-tab" role="tabpanel" aria-labelledby="georeferenced-tab">
|
48
|
+
<%= render partial: 'allmaps/show/geoblacklight', locals: { document: document } %>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
</div>
|
@@ -6,15 +6,14 @@ namespace :blacklight_allmaps do
|
|
6
6
|
namespace :index do
|
7
7
|
desc "Index - add Allmaps fixture data to Blacklight solr"
|
8
8
|
task :bl_fixtures do
|
9
|
-
|
10
|
-
docs = Dir["spec/fixtures/solr_documents/bl_*.json"].map { |f| JSON.parse File.read(f) }.flatten
|
9
|
+
docs = Dir["#{Blacklight::Allmaps.root}/spec/fixtures/solr_documents/blacklight/bl_*.json"].map { |f| JSON.parse File.read(f) }.flatten
|
11
10
|
Blacklight.default_index.connection.add docs
|
12
11
|
Blacklight.default_index.connection.commit
|
13
12
|
end
|
14
13
|
|
15
14
|
desc "Index - add Allmaps fixture data to GeoBlacklight solr"
|
16
15
|
task :gbl_fixtures do
|
17
|
-
docs = Dir["spec/fixtures/solr_documents/gbl_*.json"].map { |f| JSON.parse File.read(f) }.flatten
|
16
|
+
docs = Dir["#{Blacklight::Allmaps.root}/spec/fixtures/solr_documents/geoblacklight/gbl_*.json"].map { |f| JSON.parse File.read(f) }.flatten
|
18
17
|
Blacklight.default_index.connection.add docs
|
19
18
|
Blacklight.default_index.connection.commit
|
20
19
|
end
|
@@ -44,7 +43,7 @@ namespace :blacklight_allmaps do
|
|
44
43
|
response["response"]["docs"].each do |doc|
|
45
44
|
# 2. Determine which documents have georeferenced data
|
46
45
|
solr_document = SolrDocument.find(doc["id"])
|
47
|
-
if solr_document.
|
46
|
+
if solr_document.sidecar_allmaps.present? && solr_document.sidecar_allmaps.annotated?
|
48
47
|
|
49
48
|
# 3. Clean JSON for re-indexing
|
50
49
|
keys_for_deletion = %w[
|
@@ -73,5 +72,55 @@ namespace :blacklight_allmaps do
|
|
73
72
|
end
|
74
73
|
Blacklight.default_index.connection.commit
|
75
74
|
end
|
75
|
+
|
76
|
+
desc "Index - add Allmaps facet data to Blacklight solr"
|
77
|
+
task bl_georeferenced_facet: [:environment] do
|
78
|
+
# Steps
|
79
|
+
# 1. Use cursor to paginate all documents in Solr
|
80
|
+
# 2. Determine which documents have georeferenced data
|
81
|
+
# 3. Clean JSON for re-indexing
|
82
|
+
# 4. Add bl_georeferenced_bsi values
|
83
|
+
# 5. Re-index the georeferenced documents
|
84
|
+
|
85
|
+
# 1. Get all the documents from Solr
|
86
|
+
cursor_mark = "*"
|
87
|
+
loop do
|
88
|
+
response = Blacklight.default_index.connection.get(
|
89
|
+
"select", params: {
|
90
|
+
q: "*:*", # all docs
|
91
|
+
fl: "*", # all fields
|
92
|
+
cursorMark: cursor_mark, # use the cursor mark to handle paging
|
93
|
+
rows: 1000,
|
94
|
+
sort: "id asc" # must sort by id to use the cursor mark
|
95
|
+
}
|
96
|
+
)
|
97
|
+
|
98
|
+
response["response"]["docs"].each do |doc|
|
99
|
+
# 2. Determine which documents have georeferenced data
|
100
|
+
solr_document = SolrDocument.find(doc["id"])
|
101
|
+
if solr_document.sidecar_allmaps.present? && solr_document.sidecar_allmaps.annotated?
|
102
|
+
|
103
|
+
# 3. Clean JSON for re-indexing
|
104
|
+
keys_for_deletion = %w[
|
105
|
+
_version_
|
106
|
+
timestamp
|
107
|
+
]
|
108
|
+
|
109
|
+
cleaned_doc = doc.except!(*keys_for_deletion)
|
110
|
+
|
111
|
+
# 4. Add gbl_georeferenced_b value
|
112
|
+
# @TODO: add allmaps_id?
|
113
|
+
cleaned_doc["bl_georeferenced_bsi"] = true
|
114
|
+
|
115
|
+
# 5. Re-index the georeferenced documents
|
116
|
+
Blacklight.default_index.connection.add cleaned_doc
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
break if response["nextCursorMark"] == cursor_mark # this means the result set is finished
|
121
|
+
cursor_mark = response["nextCursorMark"]
|
122
|
+
end
|
123
|
+
Blacklight.default_index.connection.commit
|
124
|
+
end
|
76
125
|
end
|
77
126
|
end
|
@@ -1,5 +1,14 @@
|
|
1
1
|
module Blacklight
|
2
2
|
module Allmaps
|
3
|
-
VERSION = "0.
|
3
|
+
VERSION = "0.2.0"
|
4
|
+
|
5
|
+
def self.version
|
6
|
+
@version ||= VERSION
|
7
|
+
end
|
8
|
+
|
9
|
+
# returns the full path the the plugin installation
|
10
|
+
def self.root
|
11
|
+
@root ||= File.expand_path(File.dirname(__FILE__, 4))
|
12
|
+
end
|
4
13
|
end
|
5
14
|
end
|