Redesign map page and add lat/lon/needs_commons URL parameters

- Redesign pin_detail.html to match detail page style: place name heading,
  result card, button group, collapsible API response, element cards with
  left-border highlight, collapsible SPARQL query
- Redesign map.html: compact header, styled prompt, shared CSS for element
  cards and tag keys, loading state on XHR
- Add lat/lon URL params to /map: map centres on coords and auto-loads pin
- Add needs_commons checkbox to map page: toggles needs_commons=false in URL
  and re-fetches the current pin when changed
- Return geojson in /pin/ JSON response so map can render the polygon layer
- Pass needs_commons through to /pin/ route and detail page link

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Edward Betts 2026-04-18 22:18:10 +01:00
parent cd9d8779d3
commit 76437d5240
3 changed files with 204 additions and 68 deletions

View file

@ -2,6 +2,7 @@
"""Reverse geocode: convert lat/lon to Wikidata item & Wikimedia Commons category."""
import inspect
import json
import random
import re
import socket
@ -535,7 +536,8 @@ def reports() -> str:
@app.route("/pin/<lat>/<lon>")
def pin_detail(lat: str, lon: str) -> Response:
"""Details for map pin location."""
reply = lat_lon_to_wikidata(float(lat), float(lon))
needs_commons = request.args.get("needs_commons", "true").lower() != "false"
reply = lat_lon_to_wikidata(float(lat), float(lon), needs_commons)
element = reply["result"].pop("element", None)
geojson = reply["result"].pop("geojson", None)
@ -548,18 +550,22 @@ def pin_detail(lat: str, lon: str) -> Response:
str=str,
element_id=element,
geojson=geojson,
needs_commons=needs_commons,
css=css,
**reply,
)
return jsonify(html=html)
geojson_data = json.loads(geojson) if geojson else None
return jsonify(html=html, geojson=geojson_data)
@app.route("/map")
def map_page() -> str:
"""Map page."""
css = HtmlFormatter().get_style_defs(".highlight")
return render_template("map.html", css=css)
lat = request.args.get("lat", type=float)
lon = request.args.get("lon", type=float)
return render_template("map.html", css=css, init_lat=lat, init_lon=lon)
if __name__ == "__main__":