finish history state logic, implement it in python
This commit is contained in:
parent
620323b808
commit
91bf8b9652
4 changed files with 65 additions and 19 deletions
|
@ -27,8 +27,12 @@ c3nav = {
|
|||
c3nav.init_map();
|
||||
|
||||
$('.locationinput').data('location', null);
|
||||
c3nav.update_state(false, true);
|
||||
c3nav.update_map_state(true);
|
||||
|
||||
var state = JSON.parse($('main').attr('data-state'));
|
||||
history.replaceState(state, window.location.path);
|
||||
c3nav.load_state(state, true);
|
||||
c3nav._push_state(state, true);
|
||||
if (!state.center) c3nav.update_map_state(true);
|
||||
|
||||
c3nav.init_locationinputs();
|
||||
|
||||
|
@ -97,7 +101,7 @@ c3nav = {
|
|||
state = $.extend({}, c3nav.state, state);
|
||||
var old_state = c3nav.state;
|
||||
|
||||
if (c3nav._equal_states(old_state, state)) return;
|
||||
if (!replace && c3nav._equal_states(old_state, state)) return;
|
||||
|
||||
var url;
|
||||
if (state.routing) {
|
||||
|
@ -122,18 +126,20 @@ c3nav = {
|
|||
// console.log('state popped');
|
||||
c3nav.load_state(e.state);
|
||||
},
|
||||
load_state: function (state) {
|
||||
load_state: function (state, nofly) {
|
||||
c3nav._locationinput_set($('#origin-input'), state.origin);
|
||||
c3nav._locationinput_set($('#destination-input'), state.destination);
|
||||
c3nav._sidebar_state_updated(state);
|
||||
if (state.center) {
|
||||
c3nav._levelControl.setLevel(state.level);
|
||||
var center = c3nav.map._limitCenter(L.GeoJSON.coordsToLatLng(state.center), state.zoom, c3nav.map.options.maxBounds);
|
||||
c3nav.map.flyTo(center, state.zoom, {
|
||||
duration: 1
|
||||
})
|
||||
if (nofly) {
|
||||
c3nav.map.setView(center, state.zoom, {animate: false});
|
||||
} else {
|
||||
c3nav.map.flyTo(center, state.zoom, {duration: 1});
|
||||
}
|
||||
}
|
||||
c3nav.state = state;
|
||||
$.extend(c3nav.state, state);
|
||||
},
|
||||
|
||||
// button handlers
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<header>
|
||||
<h1>c3nav</h1>
|
||||
</header>
|
||||
<main class="map">
|
||||
<main class="map" data-state="{{ state }}">
|
||||
<section id="popup-buttons">
|
||||
<button class="button-clear as-location">Show only this location</button>
|
||||
<button class="button-clear as-destination">Route to here</button>
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from c3nav.site.views import main, map_image, map_index, qr_code
|
||||
from c3nav.site.views import map_index
|
||||
|
||||
pos = r'(@(?P<level>\d+),(?P<x>\d+(\.\d+)?),(?P<y>\d+(\.\d+)?),(?P<zoom>\d+(\.\d+)?))?'
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^map/(?P<level>[a-z0-9-_:]+)/(?P<area>[a-z0-9-_:]+).png$', map_image, name='site.level_image'),
|
||||
url(r'^qr/(?P<location>[a-z0-9-_:]+).png$', qr_code, name='site.qr'),
|
||||
url(r'^l/(?P<location>[a-z0-9-_:]+)/$', main, name='site.location'),
|
||||
url(r'^o/(?P<origin>[a-z0-9-_:]+)/$', main, name='site.origin'),
|
||||
url(r'^d/(?P<destination>[a-z0-9-_:]+)/$', main, name='site.destination'),
|
||||
url(r'^r/(?P<origin>[a-z0-9-_:]+)/(?P<destination>[a-z0-9-_:]+)/$', main, name='site.route'),
|
||||
url(r'^$', map_index, name='site.index')
|
||||
url(r'^r/(?P<origin>[a-z0-9-_:]+)?/(?P<destination>[a-z0-9-_:]+)?/%s$' % pos,
|
||||
map_index, name='site.routing', kwargs={'routing': True}),
|
||||
url(r'^l/(?P<destination>[a-z0-9-_:]+)/%s$' % pos, map_index, name='site.location'),
|
||||
url(r'^%s$' % pos, map_index, name='site.index')
|
||||
]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# flake8: noqa
|
||||
import json
|
||||
from datetime import timedelta
|
||||
from typing import Optional
|
||||
|
||||
import qrcode
|
||||
from django.core.files import File
|
||||
|
@ -9,9 +10,11 @@ from django.shortcuts import get_object_or_404, redirect, render
|
|||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from c3nav.mapdata.models import Source
|
||||
from c3nav.mapdata.models import Location, LocationSlug, Source
|
||||
from c3nav.mapdata.models.level import Level
|
||||
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation
|
||||
from c3nav.mapdata.render.base import set_tile_access_cookie
|
||||
from c3nav.mapdata.utils.locations import get_location_by_slug_for_request
|
||||
|
||||
ctype_mapping = {
|
||||
'yes': ('up', 'down'),
|
||||
|
@ -61,12 +64,50 @@ def qr_code(request, location):
|
|||
return response
|
||||
|
||||
|
||||
def map_index(request):
|
||||
def check_location(location: Optional[str], request) -> Optional[SpecificLocation]:
|
||||
if location is None:
|
||||
return None
|
||||
|
||||
location = get_location_by_slug_for_request(location, request)
|
||||
if location is None:
|
||||
return
|
||||
|
||||
if isinstance(location, LocationRedirect):
|
||||
location: Location = location.target
|
||||
if location is None:
|
||||
return None
|
||||
|
||||
if not location.can_search:
|
||||
location = None
|
||||
|
||||
return location
|
||||
|
||||
|
||||
def map_index(request, routing=False, origin=None, destination=None, level=None, x=None, y=None, zoom=None):
|
||||
levels = Level.qs_for_request(request).filter(on_top_of_id__isnull=True)
|
||||
|
||||
origin = check_location(origin, request)
|
||||
destination = check_location(destination, request)
|
||||
|
||||
state = {
|
||||
'routing': routing,
|
||||
'origin': (origin.serialize(detailed=False, simple_geometry=True, geometry=False)
|
||||
if origin else None),
|
||||
'destination': (destination.serialize(detailed=False, simple_geometry=True, geometry=False)
|
||||
if destination else None),
|
||||
'sidebar': bool(routing or destination),
|
||||
}
|
||||
if level is not None:
|
||||
state.update({
|
||||
'level': int(level),
|
||||
'center': (float(x), float(y)),
|
||||
'zoom': float(zoom),
|
||||
})
|
||||
|
||||
ctx = {
|
||||
'bounds': json.dumps(Source.max_bounds(), separators=(',', ':')),
|
||||
'levels': json.dumps(tuple((level.pk, level.short_label) for level in levels), separators=(',', ':')),
|
||||
'state': json.dumps(state),
|
||||
}
|
||||
response = render(request, 'site/map.html', ctx)
|
||||
set_tile_access_cookie(request, response)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue