diff options
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report/New.pm | 27 | ||||
-rwxr-xr-x | templates/web/default/around/display_location.html | 8 | ||||
-rw-r--r-- | web/js/map-OpenLayers.js | 44 |
3 files changed, 69 insertions, 10 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index 176f2fb3b..ffbb5a161 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -98,6 +98,33 @@ sub report_new : Path : Args(0) { $c->forward('redirect_or_confirm_creation'); } +sub report_form_ajax : Path('ajax') : Args(0) { + my ( $self, $c ) = @_; + + $c->forward('initialize_report'); + + # work out the location for this report and do some checks + # XXX We don't want to do this here if this actually happens! + return $c->forward('redirect_to_around') + unless $c->forward('determine_location'); + + $c->forward('setup_categories_and_councils'); + + # render templates to get the html + my $category = $c->view('Web')->render( $c, 'report/new/category.html'); + my $councils_text = $c->view('Web')->render( $c, 'report/new/councils_text.html'); + + my $body = JSON->new->utf8(1)->encode( + { + councils_text => $councils_text, + category => $category, + } + ); + + $c->res->content_type('application/json; charset=utf-8'); + $c->res->body($body); +} + =head2 report_import Action to accept report creations from iPhones and other mobile apps. URL is diff --git a/templates/web/default/around/display_location.html b/templates/web/default/around/display_location.html index 395054645..e8e452cf4 100755 --- a/templates/web/default/around/display_location.html +++ b/templates/web/default/around/display_location.html @@ -119,6 +119,14 @@ </div> </div> + +<div style="display:none" id="side-form"> +[% INCLUDE "report/new/fill_in_details_form.html" + js = 1, + report.used_map = 1 +%] +</div> + </form> [% INCLUDE 'footer.html' %] diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js index f8bd9c31e..eb6873ba6 100644 --- a/web/js/map-OpenLayers.js +++ b/web/js/map-OpenLayers.js @@ -79,7 +79,8 @@ function fixmystreet_onload() { }) }; if (fixmystreet.page == 'around') { - pin_layer_options.strategies = [ new OpenLayers.Strategy.BBOX() ]; + fixmystreet.bbox_strategy = new OpenLayers.Strategy.BBOX(); + pin_layer_options.strategies = [ fixmystreet.bbox_strategy ]; pin_layer_options.protocol = new OpenLayers.Protocol.HTTP({ url: '/ajax', params: fixmystreet.all_pins ? { all_pins: 1 } : { }, @@ -92,20 +93,16 @@ function fixmystreet_onload() { fixmystreet.markers.addFeatures( markers ); if (fixmystreet.page == 'around' || fixmystreet.page == 'reports' || fixmystreet.page == 'my') { fixmystreet.markers.events.register( 'featureselected', fixmystreet.markers, function(evt) { - window.location = '/report/' + evt.feature.attributes.id; + if (evt.feature.attributes.id) { + window.location = '/report/' + evt.feature.attributes.id; + } OpenLayers.Event.stop(evt); }); var select = new OpenLayers.Control.SelectFeature( fixmystreet.markers ); fixmystreet.map.addControl( select ); select.activate(); } else if (fixmystreet.page == 'new') { - var drag = new OpenLayers.Control.DragFeature( fixmystreet.markers, { - onComplete: function(feature, e) { - fixmystreet_update_pin( feature.geometry.clone() ); - } - } ); - fixmystreet.map.addControl( drag ); - drag.activate(); + fixmystreet_activate_drag(); } fixmystreet.map.addLayer(fixmystreet.markers); @@ -287,13 +284,29 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { trigger: function(e) { var lonlat = fixmystreet.map.getLonLatFromViewPortPx(e.xy); if (fixmystreet.page == 'new') { + /* Already have a purple pin */ fixmystreet.markers.features[0].move(lonlat); + } else { + var markers = fms_markers_list( [ [ lonlat.lat, lonlat.lon, 'purple' ] ], false ); + fixmystreet.markers.removeAllFeatures(); + fixmystreet.markers.addFeatures( markers ); + fixmystreet_activate_drag(); + fixmystreet.bbox_strategy.deactivate(); } fixmystreet_update_pin(lonlat); if (fixmystreet.page == 'new') { return; } - document.getElementById('mapForm').submit(); + $.getJSON('/report/new/ajax', { + latitude: $('#fixmystreet\\.latitude').val(), + longitude: $('#fixmystreet\\.longitude').val() + }, function(data) { + $('#councils_text').html(data.councils_text); + $('#form_category_row').html(data.category); + }); + $('#side-form').show('slow'); + $('#side').hide('slow'); + fixmystreet.page = 'new'; } }); @@ -307,3 +320,14 @@ function fixmystreet_update_pin(lonlat) { document.getElementById('fixmystreet.latitude').value = lonlat.lat || lonlat.y; document.getElementById('fixmystreet.longitude').value = lonlat.lon || lonlat.x; } + +function fixmystreet_activate_drag() { + var drag = new OpenLayers.Control.DragFeature( fixmystreet.markers, { + onComplete: function(feature, e) { + fixmystreet_update_pin( feature.geometry.clone() ); + } + } ); + fixmystreet.map.addControl( drag ); + drag.activate(); +} + |