Skip to content

Commit 77a3776

Browse files
authored
add search controls for records-based items HTML (#2130)
* add search controls for records-based items HTML
1 parent d5dfb72 commit 77a3776

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

pygeoapi/api/itemtypes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,7 @@ def get_collection_items(
641641
tpl_config = api.get_dataset_templates(dataset)
642642
# For constructing proper URIs to items
643643

644+
content['itemtype'] = p.type
644645
content['items_path'] = uri
645646
content['dataset_path'] = '/'.join(uri.split('/')[:-1])
646647
content['collections_path'] = api.get_collections_url()

pygeoapi/templates/collections/items/index.html

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.css"/>
1717
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.Default.css"/>
1818
<script src="https://unpkg.com/leaflet.markercluster/dist/leaflet.markercluster-src.js"></script>
19+
20+
{% if data['itemtype'] == 'record' %}
21+
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.draw.css"></script>
22+
<script src="https://unpkg.com/[email protected]/dist/leaflet.draw.js"></script>
23+
{% endif %}
1924
{% endblock %}
2025

2126
{% block body %}
@@ -25,6 +30,34 @@ <h1>{% for l in data['links'] if l.rel == 'collection' %} {{ l['title'] }} {% en
2530
</section>
2631
<section id="items">
2732
{% if data['features'] %}
33+
{% if data['itemtype'] == 'record' %}
34+
<div class="row">
35+
<div class="col-sm-12 col-md-6">
36+
<div class="row">
37+
<div class="col-sm-4">
38+
<label for="q">Search</label>
39+
<input name="q" id="q" type="text" class="form-control search-input" placeholder="Search">
40+
</div>
41+
<div class="col-sm-4">
42+
<label for="datetime_begin">Start date</label>
43+
<input name="datetime_begin" id="datetime_begin" type="date" class="form-control" />
44+
</div>
45+
<div class="col-sm-4">
46+
<label for="datetime_end">End date</label>
47+
<input name="datetime_end" id="datetime_end" type="date" class="form-control" />
48+
</div>
49+
</div>
50+
<div class="row">
51+
<div class="col-sm-12">
52+
<input class="form-check-input" onchange="checkSpatialFilter()" type="checkbox" id="spatial_filter_check">
53+
<label class="form-check-label" for="spatial_filter_check">Spatial filter</label>
54+
<button type="button" class="btn btn-primary" onclick="submitForm();">Search</button>
55+
<button type="reset" class="btn btn-secondary">Reset</button>
56+
</div>
57+
</div>
58+
</div>
59+
</div>
60+
{% endif %}
2861
<div class="row">
2962
<div class="col-sm-12 col-md-6">
3063
<div class="row">
@@ -153,6 +186,51 @@ <h1>{% for l in data['links'] if l.rel == 'collection' %} {{ l['title'] }} {% en
153186
{% block extrafoot %}
154187
{% if data['features'] %}
155188
<script>
189+
{% if data['itemtype'] == 'record' %}
190+
191+
document.getElementById("q").addEventListener("keydown", function(event) {
192+
if (event.key === "Enter") {
193+
submitForm();
194+
}
195+
});
196+
197+
function submitForm() {
198+
var query_string = [];
199+
var datetime = [];
200+
201+
var q = document.getElementById('q').value;
202+
var datetime_begin = document.getElementById('datetime_begin').value;
203+
var datetime_end = document.getElementById('datetime_end').value;
204+
205+
if (q) {
206+
query_string.push('q=' + encodeURIComponent(q));
207+
}
208+
if (datetime_begin) {
209+
datetime.push(datetime_begin + 'T00:00:00Z');
210+
} else {
211+
datetime.push('..');
212+
}
213+
if (datetime_end) {
214+
datetime.push(datetime_end + 'T23:59:59Z');
215+
} else {
216+
datetime.push('..');
217+
}
218+
219+
datetime = datetime.join('/');
220+
221+
if (datetime !== '../..') {
222+
query_string.push('datetime=' + encodeURIComponent(datetime));
223+
}
224+
225+
if (map.hasLayer(rectangle)) {
226+
query_string.push('bbox=' + getBbox(rectangle).join(','));
227+
}
228+
229+
if (query_string.length > 0) {
230+
document.location.href = '{{ data['items_path'] }}' + '?' + query_string.join('&');
231+
}
232+
}
233+
{% endif %}
156234
var map = L.map('items-map').setView([{{ 45 }}, {{ -75 }}], 5);
157235
map.addLayer(new L.TileLayer(
158236
'{{ config['server']['map']['url'] }}', {
@@ -178,6 +256,37 @@ <h1>{% for l in data['links'] if l.rel == 'collection' %} {{ l['title'] }} {% en
178256
map.addLayer(markers);
179257

180258
map.fitBounds(items.getBounds());
259+
260+
{% if data['itemtype'] == 'record' %}
261+
function getBbox(rect) {
262+
bounds = rect.getBounds();
263+
264+
return [bounds.getWest(),
265+
bounds.getSouth(),
266+
bounds.getEast(),
267+
bounds.getNorth()];
268+
}
269+
270+
var rectangle;
271+
function setRectangle(bbox) {
272+
if (rectangle) {
273+
rectangle.setBounds(bbox)
274+
} else {
275+
rectangle = L.rectangle(bbox);
276+
rectangle.editing.enable();
277+
rectangle.setStyle({color :'green'});
278+
}
279+
map.addLayer(rectangle);
280+
}
281+
282+
function checkSpatialFilter() {
283+
if (map.hasLayer(rectangle)) {
284+
rectangle.remove();
285+
} else {
286+
setRectangle(map.getBounds().pad(-0.95));
287+
}
288+
}
289+
{% endif %}
181290
</script>
182291
{% endif %}
183292
{% endblock %}

0 commit comments

Comments
 (0)